Commit Graph

3528 Commits

Author SHA1 Message Date
Hans Wennborg 83c76e2427 Merging r276956:
------------------------------------------------------------------------
r276956 | majnemer | 2016-07-27 22:03:22 -0700 (Wed, 27 Jul 2016) | 6 lines

[CodeView] Don't crash on functions without subprograms

A function may have instructions annotated with debug info without
having a subprogram.

This fixes PR28747.
------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_39@277078 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-28 23:15:39 +00:00
Saleem Abdulrasool 1083a5297a CodeGen: avoid emitting unnecessary CFI
Remove unnecessary clutter in assembly output.  When using SjLj EH, the CFI is
not actually used for anything.  Do not emit the CFI needlessly.  The minor test
adjustments are interesting.  The prologue test was just overzealous matcching.
The interesting case is the LSDA change.  It was originally added to ensure that
various compilations did not mangle the name (it explicitly checked the name!).
However, subsequent cleanups made it more reliant on the CFI to find the name.
Parse the generated code flow to generically find the label still.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275614 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-15 21:10:29 +00:00
Reid Kleckner c61d5f4b2c [codeview] Shrink inlined call site line info tables
For a fully inlined call chain like a -> b -> c -> d, we were emitting
line info for 'd' 3 separate times: once for d's actual InlineSite line
table, and twice for 'b' and 'c'. This is particularly inefficient when
all these functions are in different headers, because now we need to
encode the file change. Windbg was coping with our suboptimal output, so
this should not be noticeable from the debugger.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275502 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-14 23:47:15 +00:00
Amjad Aboud dd79b0c35c [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.
4. Array where element type is a typedef, volatile or constant (this should resolve PR28311).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275167 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 12:06:34 +00:00
David Majnemer 01d1f77974 [COFF, Dwarf] Don't emit DW_AT_location for dllimported entities
There exists no relocation which can describe the address of a
dllimported variable: do not try to describe their location.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274986 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-09 20:47:48 +00:00
Matthias Braun 93ad397da1 AsmPrinter: Fix emitKill() not flush()ing a raw_string_ostream
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274951 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-09 00:18:43 +00:00
Duncan P. N. Exon Smith 5de74a6760 AsmPrinter: Avoid implicit iterator conversions in DbgValueHistoryCalculator, NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274911 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-08 19:31:47 +00:00
David Majnemer 3ceb1244c8 [CodeView] Implement support for thread-local variables
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274734 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-07 05:14:21 +00:00
David Majnemer 7bae2669d5 [CodeView] Emit an appropriate symbol kind for globals
We emitted debug info for globals/functions as if they all had external
linkage.  Instead, emit local symbol records when appropriate.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274676 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 21:07:47 +00:00
David Majnemer cc3da7f637 [CodeView] Unions are always sealed
It is impossible to inherit from a union.  We are missing a way to
represent this in IR for classes/structs...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274675 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 21:07:42 +00:00
Adrian McCarthy 0b9a17ffed Retry: "Emit CodeView type records for nested classes."
Now with a corrected test to account for a recently supported properties bit in the debug info of a struct.

Original review: http://reviews.llvm.org/D21939

This reverts commit 970c3fd497a28d25dd69526eb52594a696c37968.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274661 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 19:49:51 +00:00
Adrian McCarthy c233a9a901 Revert "Emit CodeView type records for nested classes."
This reverts commit 256b29322c827a2d94da56468c936596f5509032.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274632 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 15:14:10 +00:00
Adrian McCarthy 76700e4252 Emit CodeView type records for nested classes.
Differential Revision: http://reviews.llvm.org/D21939

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274629 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 14:47:32 +00:00
Reid Kleckner 5efb713f63 [codeview] Set the Nested and Scoped ClassOptions based on the scope chain
These are set on both the declaration record and the definition record.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274410 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 00:11:07 +00:00
David Majnemer 7239fbb65b [CodeView] Include the offset of nested members
Given something like:
  struct S {
    int a;
    struct { int b; };
  };

We would fail to give 'b' offset 4.  Instead, we would give it the
offset it has inside of it's struct.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274400 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:12:48 +00:00
David Majnemer 0c69559ee3 [CodeView] Pretty print anonymous scopes
A namespace without a name should be written out as `anonymous
namespace' while a tag type without a name should be written out as
<unnamed-tag>.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274399 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:12:45 +00:00
Reid Kleckner 613f199109 [codeview] Don't record UDTs for anonymous structs
MSVC makes up names for these anonymous structs, but we don't (yet).
Eventually Clang should use getTypedefNameForAnonDecl() to put some name
in the debug info, and we can update the test case when that happens.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274391 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 22:24:51 +00:00
Reid Kleckner f2d09fcb71 [codeview] Assert that our CV type records are valid
We were asserting that our type records were valid when emitting
assembly, but not when emitting an object file.

I've been seeing lots of LNK1285 errors (corrupt PDB) during incremental
debug self-host builds with the MSVC linker, and hopefully this will
catch some of them earlier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274373 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 18:05:56 +00:00
Eric Christopher 84607f6960 80-column and comment fixups.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274335 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 06:07:31 +00:00
Reid Kleckner bd79db219f [codeview] Add DISubprogram::ThisAdjustment
Summary:
This represents the adjustment applied to the implicit 'this' parameter
in the prologue of a virtual method in the MS C++ ABI. The adjustment is
always zero unless multiple inheritance is involved.

This increases the size of DISubprogram by 8 bytes, unfortunately. The
adjustment really is a signed 32-bit integer. If this size increase is
too much, we could probably win it back by splitting out a subclass with
info specific to virtual methods (virtuality, vindex, thisadjustment,
containingType).

Reviewers: aprantl, dexonsmith

Subscribers: aaboud, amccarth, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274325 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 02:41:21 +00:00
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
Duncan P. N. Exon Smith 567409db69 CodeGen: Use MachineInstr& in TargetInstrInfo, NFC
This is mostly a mechanical change to make TargetInstrInfo API take
MachineInstr& (instead of MachineInstr* or MachineBasicBlock::iterator)
when the argument is expected to be a valid MachineInstr.  This is a
general API improvement.

Although it would be possible to do this one function at a time, that
would demand a quadratic amount of churn since many of these functions
call each other.  Instead I've done everything as a block and just
updated what was necessary.

This is mostly mechanical fixes: adding and removing `*` and `&`
operators.  The only non-mechanical change is to split
ARMBaseInstrInfo::getOperandLatencyImpl out from
ARMBaseInstrInfo::getOperandLatency.  Previously, the latter took a
`MachineInstr*` which it updated to the instruction bundle leader; now,
the latter calls the former either with the same `MachineInstr&` or the
bundle leader.

As a side effect, this removes a bunch of MachineInstr* to
MachineBasicBlock::iterator implicit conversions, a necessary step
toward fixing PR26753.

Note: I updated WebAssembly, Lanai, and AVR (despite being
off-by-default) since it turned out to be easy.  I couldn't run tests
for AVR since llc doesn't link with it turned on.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274189 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-30 00:01:54 +00:00
Rafael Espindola c4cbe67fa8 Use isPositionIndependent in a few more places.
I think this converts all the simple cases that really just care about
the generated code being position independent or not. The remaining
uses are a bit more complicated and are checking things like "is this
a library or executable" or "can this symbol be preempted".

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274055 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-28 20:13:36 +00:00
Rafael Espindola 665d49773d Move isPositionIndependent up to AsmPrinter.
Use it in ppc too.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273877 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-27 14:19:45 +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
Adrian Prantl 72fda70f27 Fix the type signature of DwarfExpression::Add.*Constant to support values >32 bits.
This fixes an embarrassing bug when emitting .debug_loc entries for 64-bit+ constants,
which were previously silently truncated to 32 bits.

<rdar://problem/26843232>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273736 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-24 21:35:09 +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
Peter Collingbourne 277258478e IR: Introduce Module::global_objects().
This is a convenience iterator that allows clients to enumerate the
GlobalObjects within a Module.

Also start using it in a few places where it is obviously the right thing
to use.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273470 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 20:29:42 +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
Etienne Bergeron 8d600b5b39 [StackProtector] Fix computation of GSCookieOffset and EHCookieOffset with SEH4
Summary:
Fix the computation of the offsets present in the scopetable when using the
SEH (__except_handler4).

This patch added an intrinsic to track the position of the allocation on the
stack of the EHGuard. This position is needed when producing the ScopeTable.

```
    struct _EH4_SCOPETABLE {
        DWORD GSCookieOffset;
        DWORD GSCookieXOROffset;
        DWORD EHCookieOffset;
        DWORD EHCookieXOROffset;
        _EH4_SCOPETABLE_RECORD ScopeRecord[1];
    };

    struct _EH4_SCOPETABLE_RECORD {
        DWORD EnclosingLevel;
        long (*FilterFunc)();
            union {
            void (*HandlerAddress)();
            void (*FinallyFunc)();
        };
    };
```

The code to generate the EHCookie is added in `X86WinEHState.cpp`.
Which is adding these instructions when using SEH4.

```
Lfunc_begin0:
# BB#0:                                 # %entry
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ebx
	pushl	%edi
	pushl	%esi
	subl	$28, %esp
	movl	%ebp, %eax                <<-- Loading FramePtr
	movl	%esp, -36(%ebp)
	movl	$-2, -16(%ebp)
	movl	$L__ehtable$use_except_handler4_ssp, %ecx
	xorl	___security_cookie, %ecx
	movl	%ecx, -20(%ebp)
	xorl	___security_cookie, %eax  <<-- XOR FramePtr and Cookie
	movl	%eax, -40(%ebp)           <<-- Storing EHGuard
	leal	-28(%ebp), %eax
	movl	$__except_handler4, -24(%ebp)
	movl	%fs:0, %ecx
	movl	%ecx, -28(%ebp)
	movl	%eax, %fs:0
	movl	$0, -16(%ebp)
	calll	_may_throw_or_crash
LBB1_1:                                 # %cont
	movl	-28(%ebp), %eax
	movl	%eax, %fs:0
	addl	$28, %esp
	popl	%esi
	popl	%edi
	popl	%ebx
	popl	%ebp
	retl

```

And the corresponding offset is computed:
```
Luse_except_handler4_ssp$parent_frame_offset = -36
	.p2align	2
L__ehtable$use_except_handler4_ssp:
	.long	-2                      # GSCookieOffset
	.long	0                       # GSCookieXOROffset
	.long	-40                     # EHCookieOffset    <<----
	.long	0                       # EHCookieXOROffset
	.long	-2                      # ToState
	.long	_catchall_filt          # FilterFunction
	.long	LBB1_2                  # ExceptionHandler

```

Clang is not yet producing function using SEH4, but it's a work in progress.
This patch is a step toward having a valid implementation of SEH4.
Unfortunately, it is not yet fully working. The EH registration block is not
allocated at the right offset on the stack.

Reviewers: rnk, majnemer

Subscribers: llvm-commits, chrisha

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273281 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-21 15:58:55 +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
Joerg Sonnenberger 847e77d817 doesSetDirectiveSuppressesReloc -> doesSetDirectiveSuppressReloc, the
former is grammatically incorrect.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273100 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-18 23:25:37 +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
Benjamin Kramer e5eb673413 Apply another batch of fixes from clang-tidy's performance-unnecessary-value-param.
Contains some manual fixes. No functionality change intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273047 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-17 20:41:14 +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
Sanjoy Das 394afc7ae2 NFC; refactor getFrameIndexReferenceFromSP
Summary:
... into getFrameIndexReferencePreferSP.  This change folds the
fail-then-retry logic into getFrameIndexReferencePreferSP.

There is a non-functional but behaviorial change in WinException --
earlier if `getFrameIndexReferenceFromSP` failed we'd trip an assert,
but now we'll silently use the (wrong) offset from the base pointer.  I
could not write the assert I'd like to write ("FrameReg ==
StackRegister", like I've done in X86FrameLowering) since there is no
easy way to get to the stack register from WinException (happy to be
proven wrong here).  One solution to this is to add a `bool
OnlyStackPointer` parameter to `getFrameIndexReferenceFromSP` that
asserts if it could not satisfy its promise of returning an offset from
a stack pointer, but that seems overkill.

Reviewers: rnk

Subscribers: sanjoy, mcrosier, llvm-commits

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

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