Commit Graph

63 Commits

Author SHA1 Message Date
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
David Majnemer 188d2b18ee [CodeView] Don't emit debuginfo for imported symbols
Emitting symbol information requires us to have a definition for the
symbol.  A symbol reference is insufficient.

This fixes PR28123.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272738 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-15 00:19:52 +00:00
Benjamin Kramer af18e017d2 Pass DebugLoc and SDLoc by const ref.
This used to be free, copying and moving DebugLocs became expensive
after the metadata rewrite. Passing by reference eliminates a ton of
track/untrack operations. No functionality change intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272512 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-12 15:39:02 +00:00
Reid Kleckner 14f9bce989 [codeview] Skip DIGlobalVariables with no variable
They have probably been discarded during optimization.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272231 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-09 00:29:00 +00:00
Reid Kleckner 3d3aca2d97 [DebugInfo] Add calling convention support for DWARF and CodeView
Summary:
Now DISubroutineType has a 'cc' field which should be a DW_CC_ enum.  If
it is present and non-zero, the backend will emit it as a
DW_AT_calling_convention attribute. On the CodeView side, we translate
it to the appropriate enum for the LF_PROCEDURE record.

I added a new LLVM vendor specific enum to the list of DWARF calling
conventions. DWARF does not appear to attempt to standardize these, so I
assume it's OK to do this until we coordinate with GCC on how to emit
vectorcall convention functions.

Reviewers: dexonsmith, majnemer, aaboud, amccarth

Subscribers: mehdi_amini, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272197 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-08 20:34:29 +00:00
Adrian McCarthy fa4edba0da Generate codeview for array type metadata.
Differential Revision: http://reviews.llvm.org/D21107

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272187 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-08 18:22:59 +00:00
Reid Kleckner d34b1e13f4 Re-land "[codeview] Emit information about global variables"
This reverts commit r271962 and reinstantes r271957.

MSVC's linker doesn't appear to like it if you have an empty symbol
substream, so only open a symbol substream if we're going to emit
something about globals into it.

Makes check-asan pass.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271965 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-07 00:02:03 +00:00
Reid Kleckner 815649892e Revert "[codeview] Emit information about global variables"
This reverts commit r271957, it broke check-asan on Windows.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271962 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-06 23:41:38 +00:00
Reid Kleckner 968f9915ac [codeview] Emit information about global variables
This currently emits everything as S_GDATA32, which isn't right for
things like thread locals, but it's a start.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271957 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-06 23:23:47 +00:00
David Majnemer 180fafda4a [AsmPrinter, CodeView] There are some more ways of getting wchar_t
C++ has a builtin type called wchar_t.  Clang also provides a type
called __wchar_t in C mode.

In C mode, wchar_t can be a typedef to unsigned short.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271793 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-04 15:40:33 +00:00
Reid Kleckner 3dbd3c0fd6 [codeview] Add basic record type translation
This only translates data members for now. Translating overloaded
methods is complicated, so I stopped short of doing that.

Reviewers: aaboud

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271680 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-03 15:58:20 +00:00
David Majnemer d4031aa234 [CodeView] Use None instead of Void if there is no subprogram
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271566 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-02 18:51:24 +00:00