summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-07-29 20:03:00 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-07-29 20:03:00 +0000
commitfc85067f30fdac5e0ba195441fcc7aaa38343f32 (patch)
treea3b321916db52c50cca21046de4996152544b65e
parentcf9a8133687a4c4b562e32f300ee65bd6b30d1bf (diff)
downloadbcm5719-llvm-fc85067f30fdac5e0ba195441fcc7aaa38343f32.tar.gz
bcm5719-llvm-fc85067f30fdac5e0ba195441fcc7aaa38343f32.zip
MC: account for the return column in the CIE key
If the return column is different, we cannot coalesce the CIE across the FDEs. Add that to the key calculation. This ensures that we emit a separate CIE. llvm-svn: 309492
-rw-r--r--llvm/lib/MC/MCDwarf.cpp19
-rw-r--r--llvm/test/Assembler/return-column.s15
2 files changed, 25 insertions, 9 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index a038e0aa951..41ff9e14c82 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -1465,24 +1465,26 @@ namespace {
struct CIEKey {
static const CIEKey getEmptyKey() {
- return CIEKey(nullptr, 0, -1, false, false);
+ return CIEKey(nullptr, 0, -1, false, false, static_cast<unsigned>(INT_MAX));
}
static const CIEKey getTombstoneKey() {
- return CIEKey(nullptr, -1, 0, false, false);
+ return CIEKey(nullptr, -1, 0, false, false, static_cast<unsigned>(INT_MAX));
}
CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
- unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple)
+ unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple,
+ unsigned RAReg)
: Personality(Personality), PersonalityEncoding(PersonalityEncoding),
LsdaEncoding(LsdaEncoding), IsSignalFrame(IsSignalFrame),
- IsSimple(IsSimple) {}
+ IsSimple(IsSimple), RAReg(RAReg) {}
const MCSymbol *Personality;
unsigned PersonalityEncoding;
unsigned LsdaEncoding;
bool IsSignalFrame;
bool IsSimple;
+ unsigned RAReg;
};
} // end anonymous namespace
@@ -1496,7 +1498,7 @@ template <> struct DenseMapInfo<CIEKey> {
static unsigned getHashValue(const CIEKey &Key) {
return static_cast<unsigned>(
hash_combine(Key.Personality, Key.PersonalityEncoding, Key.LsdaEncoding,
- Key.IsSignalFrame, Key.IsSimple));
+ Key.IsSignalFrame, Key.IsSimple, Key.RAReg));
}
static bool isEqual(const CIEKey &LHS, const CIEKey &RHS) {
@@ -1504,7 +1506,8 @@ template <> struct DenseMapInfo<CIEKey> {
LHS.PersonalityEncoding == RHS.PersonalityEncoding &&
LHS.LsdaEncoding == RHS.LsdaEncoding &&
LHS.IsSignalFrame == RHS.IsSignalFrame &&
- LHS.IsSimple == RHS.IsSimple;
+ LHS.IsSimple == RHS.IsSimple &&
+ LHS.RAReg == RHS.RAReg;
}
};
@@ -1561,8 +1564,8 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
// of by the compact unwind encoding.
continue;
- CIEKey Key(Frame.Personality, Frame.PersonalityEncoding,
- Frame.LsdaEncoding, Frame.IsSignalFrame, Frame.IsSimple);
+ CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, Frame.LsdaEncoding,
+ Frame.IsSignalFrame, Frame.IsSimple, Frame.RAReg);
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
if (!CIEStart)
CIEStart = &Emitter.EmitCIE(
diff --git a/llvm/test/Assembler/return-column.s b/llvm/test/Assembler/return-column.s
index 53db7510aac..a0c66bd9b2c 100644
--- a/llvm/test/Assembler/return-column.s
+++ b/llvm/test/Assembler/return-column.s
@@ -4,15 +4,28 @@
.text
-proc:
+ .section .text.f,"ax",@progbits
+ .global f
+ .type f,@function
+f:
.cfi_startproc
.cfi_return_column 0
.cfi_endproc
+ .section .text.g,"ax",@progbits
+ .global g
+ .type g,@function
+g:
+ .cfi_startproc
+ .cfi_return_column 65
+ .cfi_endproc
+
+// CHECK-ASM-ROUNDTRIP-LABEL: f:
// CHECK-ASM-ROUNDTRIP: .cfi_startproc
// CHECK-ASM-ROUNDTRIP-NEXT: .cfi_return_column 0
// CHECK-ASM-ROUNDTRIP: .cfi_endproc
// CHECK-EH_FRAME: Contents of section .eh_frame:
// CHECK-EH_FRAME: 0000 14000000 00000000 017a5200 017c0001 .........zR..|..
+// CHECK-EH_FRAME: 0030 00000000 017a5200 017c4101 1b0c0404 .....zR..|A.....
OpenPOWER on IntegriCloud