Commit Graph

74 Commits

Author SHA1 Message Date
David Majnemer 18b9b9a1f4 [CodeView] Implement support for bitfields in LLVM
CodeView need to know the offset of the storage allocation for a
bitfield.  Encode this via the "extraData" field in DIDerivedType and
introduced a new flag, DIFlagBitField, to indicate whether or not a
member is a bitfield.

This fixes PR28162.

Differential Revision: http://reviews.llvm.org/D21782

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274200 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-30 03:00:20 +00:00
Nico Weber 96caeda925 Revert r273807 (and r273809, r273810), it caused PR28311
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273815 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-26 15:10:34 +00:00
Amjad Aboud 1c56f09923 Fixed build failure (due to unused variable error) in r273807.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273810 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-26 13:36:23 +00:00
Amjad Aboud 1d63a7ddba Fixed build failure (due to unused variable error) in r273807.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273809 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-26 12:43:33 +00:00
Amjad Aboud 9aed97cfb6 [codeview] Improved array type support.
Added support for:
1. Multi dimension array.
2. Array of structure type, which previously was declared incompletely.
3. Dynamic size array.

Differential Revision: http://reviews.llvm.org/D21526


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273807 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-26 11:44:45 +00:00
Reid Kleckner 20c960971f [codeview] Emit parameter variables in the right order
Clang emits them in reverse order to conform to the ABI, which requires
left-to-right destruction. As a result, the order doesn't fall out
naturally, and we have to sort things out in the backend.

Fixes PR28213

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273696 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-24 17:55:40 +00:00
Reid Kleckner f327997798 [codeview] Emit base class information from DW_TAG_inheritance nodes
There are two remaining issues here:
1. No vbptr information
2. Need to mention indirect virtual bases

Getting indirect virtual bases is just a matter of adding an "indirect"
flag, emitting them in the frontend, and ignoring them when appropriate
for DWARF.

All virtual bases use the same artificial vbptr field, so I think the
vbptr offset will be best represented by an implicit __vbptr$ClassName
member similar to our existing __vptr$ member.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273688 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-24 16:24:24 +00:00
Hans Wennborg b234de31c2 [codeview] Add classes and unions to the Local/Global UDTs lists
Differential Revision: http://reviews.llvm.org/D21655

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273626 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-23 22:57:25 +00:00
Hans Wennborg d9ba941dec [codeview] Emit retained types
Differential Revision: http://reviews.llvm.org/D21630

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273579 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-23 16:33:53 +00:00
Hans Wennborg 10551df9a9 [codeview] Write LF_UDT_SRC_LINE records (PR28251)
Differential Revision: http://reviews.llvm.org/D21621

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273495 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 21:22:13 +00:00
Reid Kleckner 2ec3f6d303 [codeview] Add IntroducingVirtual debug info flag
CodeView needs to know if a virtual method was introduced in the current
class, and base classes may not have complete type information, so we
need to thread this bit through from the frontend.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273453 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 18:31:14 +00:00
Reid Kleckner fefbc8fc7e [codeview] Defer emission of all referenced complete records
This is the motivating example:
  struct B { int b; };
  struct A { B *b; };
  int f(A *p) { return p->b->b; }

Clang emits complete types for both A and B because they are required to
be complete, but our CodeView emission would only emit forward
declarations of A and B. This was a consequence of the fact that the A*
type must reference the forward declaration of A, which doesn't
reference B at all.

We can't eagerly emit complete definitions of A and B when we request
the forward declaration's type index because of recursive types like
linked lists. If we did that, our stack usage could get out of hand, and
it would be possible to lower a type while attempting to lower a type,
and we would need to double check if our type is already present in the
TypeIndexMap after all recursive getTypeIndex calls.

Instead, defer complete type emission until after all type lowering has
completed. This ensures that all referenced complete types are emitted,
and that type lowering is not re-entrant.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273443 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 17:15:28 +00:00
Reid Kleckner 924722175f [codeview] Remove ClassInfoMap
From a design perspective, complete record type emission should not
depend on information from other complete record types.

Currently this map is unused, and needlessly accumulates data throughout
compilation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273431 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 16:06:42 +00:00
Reid Kleckner 41bcea90ec [codeview] Improve names of types in scopes and member function ids
We now include namespace scope info in LF_FUNC_ID records and we emit
LF_MFUNC_ID records for member functions as we should.

Class names are now fully qualified, which is what MSVC does.

Add a little bit of scaffolding to handle ThisAdjustment when it arrives
in DISubprogram.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273358 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 01:32:56 +00:00
Reid Kleckner 1582ea95a9 [codeview] Fix DenseMap pointer invalidation bug
When you have a map holding a unique_ptr, hold a reference to the raw
pointer instead of the unique pointer. The unique_ptr will be moved on
rehash.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273268 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-21 14:56:24 +00:00
Amjad Aboud 5ee364ff3a [codeview] Emit non-virtual method type.
Differential Revision: http://reviews.llvm.org/D21011


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273084 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-18 10:25:07 +00:00
Reid Kleckner 3523a282f6 [codeview] Emit incomplete member pointer types with the unknown model
An incomplete member pointer type will always have a size of zero, so we
don't need an extra flag. Credit to David Majnemer for the idea.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273057 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-17 22:14:39 +00:00
Reid Kleckner a450edf8b9 [codeview] Add DIFlags for pointer to member representations
Summary:
This seems like the least intrusive way to pass this information
through.

Fixes PR28151

Reviewers: majnemer, aprantl, dblaikie

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D21444

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273053 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-17 21:31:33 +00:00
David Majnemer 3891af66b3 [CodeView] Refactor enumerator emission
This addresses Amjad's review comments on D21442.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273010 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-17 16:13:21 +00:00
Reid Kleckner 58ee02e322 [codeview] Make function names more consistent with MSVC
Names in function id records don't include nested name specifiers or
template arguments, but names in the symbol stream include both.

For the symbol stream, instead of having Clang put the fully qualified
name in the subprogram display name, recreate it from the subprogram
scope chain. For the type stream, take the unqualified name and chop of
any template arguments.

This makes it so that CodeView DI metadata is more similar to DWARF DI
metadata.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273009 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-17 16:11:20 +00:00
David Majnemer 5dd02f3333 [CodeView] Implement support for enums
MSVC handles enums differently from structs and classes: a forward
declaration is not emitted unconditionally.  MSVC does not emit an S_UDT
record for the enum.

Differential Revision: http://reviews.llvm.org/D21442

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272960 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-16 21:32:16 +00:00
Zachary Turner e8d381d02c Resubmit "[pdb] Change type visitor pattern to be dynamic."
There was a regression introduced during type stream merging when
visiting a field list record.  This has been fixed in this patch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272929 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-16 18:22:27 +00:00
Zachary Turner 575a9fbcc9 Revert "[pdb] Change type visitor pattern to be dynamic."
This reverts commit fb0dd311e1.

This breaks some llvm-readobj tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272927 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-16 18:09:04 +00:00
Zachary Turner fb0dd311e1 [pdb] Change type visitor pattern to be dynamic.
This allows better catching of compiler errors since we can use
the override keyword to verify that methods are actually
overridden.

Also in this patch I've changed from storing a boolean Error
code everywhere to returning an llvm::Error, to propagate richer
error information up the call stack.

Reviewed By: ruiu, rnk
Differential Revision: http://reviews.llvm.org/D21410

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272926 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-16 18:00:28 +00:00
David Majnemer b372f89f41 [CodeView] Add support for emitting S_UDT for typedefs
Emit a S_UDT record for typedefs.  We still need to do something for
class types.

Differential Revision: http://reviews.llvm.org/D21149

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272813 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-15 18:00:01 +00:00