aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-05-07 19:11:09 +0000
committerDuncan Sands <baldrick@free.fr>2008-05-07 19:11:09 +0000
commit671fa97a4b8c560150104329b517efbf2609297c (patch)
treea77bddb86bf7c7577ec7fc1d206bc62080b8dabb /lib
parentfbd15899b3bcc459bea20f5bb2866244eea56d6a (diff)
downloadexternal_llvm-671fa97a4b8c560150104329b517efbf2609297c.zip
external_llvm-671fa97a4b8c560150104329b517efbf2609297c.tar.gz
external_llvm-671fa97a4b8c560150104329b517efbf2609297c.tar.bz2
Output correct exception handling and frame info
on x86-64 linux. This causes no regressions on 32 bit linux and 32 bit ppc. More tests pass on 64 bit ppc with no regressions. I didn't turn on eh on 64 bit linux because the intrinsics needed to compile the eh runtime aren't done yet. But if you turn it on and link with the mainline runtime then eh seems to work fine on x86-64 linux with this patch. Thanks to Dale for testing. The main point of the patch is that if you output that some object is encoded using 4 bytes you had better not output 8 bytes for it: the patch makes everything consistent. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50825 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/DwarfWriter.cpp100
-rw-r--r--lib/Target/TargetAsmInfo.cpp1
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp2
3 files changed, 49 insertions, 54 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 9e806fa..5063d63 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -2796,7 +2796,7 @@ private:
/// shouldEmitFrameModule - Per-module flag to indicate if frame moves
/// should be emitted.
bool shouldEmitMovesModule;
-
+
/// EmitCommonEHFrame - Emit the common eh unwind frame.
///
void EmitCommonEHFrame(const Function *Personality, unsigned Index) {
@@ -2813,7 +2813,7 @@ private:
// Define base labels.
EmitLabel("eh_frame_common", Index);
-
+
// Define the eh frame length.
EmitDifference("eh_frame_common_end", Index,
"eh_frame_common_begin", Index, true);
@@ -2825,50 +2825,49 @@ private:
Asm->EOL("CIE Identifier Tag");
Asm->EmitInt8(DW_CIE_VERSION);
Asm->EOL("CIE Version");
-
+
// The personality presence indicates that language specific information
// will show up in the eh frame.
Asm->EmitString(Personality ? "zPLR" : "zR");
Asm->EOL("CIE Augmentation");
-
+
// Round out reader.
Asm->EmitULEB128Bytes(1);
Asm->EOL("CIE Code Alignment Factor");
Asm->EmitSLEB128Bytes(stackGrowth);
- Asm->EOL("CIE Data Alignment Factor");
+ Asm->EOL("CIE Data Alignment Factor");
Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
- Asm->EOL("CIE RA Column");
-
+ Asm->EOL("CIE Return Address Column");
+
// If there is a personality, we need to indicate the functions location.
if (Personality) {
Asm->EmitULEB128Bytes(7);
Asm->EOL("Augmentation Size");
- if (TAI->getNeedsIndirectEncoding())
+ if (TAI->getNeedsIndirectEncoding()) {
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect);
- else
+ Asm->EOL("Personality (pcrel sdata4 indirect)");
+ } else {
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+ Asm->EOL("Personality (pcrel sdata4)");
+ }
- Asm->EOL("Personality (pcrel sdata4 indirect)");
-
- PrintRelDirective(TAI->getShortenEHDataOn64Bit());
+ PrintRelDirective(true);
O << TAI->getPersonalityPrefix();
Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
O << TAI->getPersonalitySuffix();
- if (!TAI->getShortenEHDataOn64Bit()) {
- O << "-" << TAI->getPCSymbol();
- }
+ O << "-" << TAI->getPCSymbol();
Asm->EOL("Personality");
- Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
- Asm->EOL("LSDA Encoding (pcrel)");
- Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
- Asm->EOL("FDE Encoding (pcrel)");
+ Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+ Asm->EOL("LSDA Encoding (pcrel sdata4)");
+ Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+ Asm->EOL("FDE Encoding (pcrel sdata4)");
} else {
Asm->EmitULEB128Bytes(1);
Asm->EOL("Augmentation Size");
- Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
- Asm->EOL("FDE Encoding (pcrel)");
+ Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+ Asm->EOL("FDE Encoding (pcrel sdata4)");
}
// Indicate locations of general callee saved registers in frame.
@@ -2882,10 +2881,10 @@ private:
Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
0, 0, false);
EmitLabel("eh_frame_common_end", Index);
-
+
Asm->EOL();
}
-
+
/// EmitEHFrame - Emit function exception frame information.
///
void EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
@@ -2940,31 +2939,28 @@ private:
true, true, false);
Asm->EOL("FDE CIE offset");
- EmitReference("eh_func_begin", EHFrameInfo.Number, true);
+ EmitReference("eh_func_begin", EHFrameInfo.Number, true, true);
Asm->EOL("FDE initial location");
EmitDifference("eh_func_end", EHFrameInfo.Number,
- "eh_func_begin", EHFrameInfo.Number);
+ "eh_func_begin", EHFrameInfo.Number, true);
Asm->EOL("FDE address range");
-
+
// If there is a personality and landing pads then point to the language
// specific data area in the exception table.
if (EHFrameInfo.PersonalityIndex) {
- Asm->EmitULEB128Bytes(TAI->getShortenEHDataOn64Bit() ? 8 : 4);
+ Asm->EmitULEB128Bytes(4);
Asm->EOL("Augmentation size");
-
- if (EHFrameInfo.hasLandingPads) {
- EmitReference("exception", EHFrameInfo.Number, true);
- } else if (TD->getPointerSize() == 8) {
- Asm->EmitInt64((int)0);
- } else {
+
+ if (EHFrameInfo.hasLandingPads)
+ EmitReference("exception", EHFrameInfo.Number, true, true);
+ else
Asm->EmitInt32((int)0);
- }
Asm->EOL("Language Specific Data Area");
} else {
Asm->EmitULEB128Bytes(0);
Asm->EOL("Augmentation size");
}
-
+
// Indicate locations of function specific callee saved registers in
// frame.
EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves, true);
@@ -3267,13 +3263,20 @@ private:
}
// Final tallies.
- unsigned SizeSites = CallSites.size() * (sizeof(int32_t) + // Site start.
- sizeof(int32_t) + // Site length.
- sizeof(int32_t)); // Landing pad.
+
+ // Call sites.
+ const unsigned SiteStartSize = sizeof(int32_t); // DW_EH_PE_udata4
+ const unsigned SiteLengthSize = sizeof(int32_t); // DW_EH_PE_udata4
+ const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
+ unsigned SizeSites = CallSites.size() * (SiteStartSize +
+ SiteLengthSize +
+ LandingPadSize);
for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
SizeSites += Asm->SizeULEB128(CallSites[i].Action);
- unsigned SizeTypes = TypeInfos.size() * TD->getPointerSize();
+ // Type infos.
+ const unsigned TypeInfoSize = TD->getPointerSize(); // DW_EH_PE_absptr
+ unsigned SizeTypes = TypeInfos.size() * TypeInfoSize;
unsigned TypeOffset = sizeof(int8_t) + // Call site format
Asm->SizeULEB128(SizeSites) + // Call-site table length
@@ -3323,27 +3326,22 @@ private:
}
EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
- TAI->getShortenEHDataOn64Bit(), true);
+ true, true);
Asm->EOL("Region start");
if (!S.EndLabel) {
EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
- TAI->getShortenEHDataOn64Bit());
+ true);
} else {
- EmitDifference("label", S.EndLabel, BeginTag, BeginNumber,
- TAI->getShortenEHDataOn64Bit());
+ EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);
}
Asm->EOL("Region length");
- if (!S.PadLabel) {
- if (TD->getPointerSize() == sizeof(int32_t) || TAI->getShortenEHDataOn64Bit())
- Asm->EmitInt32(0);
- else
- Asm->EmitInt64(0);
- } else {
+ if (!S.PadLabel)
+ Asm->EmitInt32(0);
+ else
EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
- TAI->getShortenEHDataOn64Bit(), true);
- }
+ true, true);
Asm->EOL("Landing pad");
Asm->EmitULEB128Bytes(S.Action);
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index c2504cc..5fa5abe 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -90,7 +90,6 @@ TargetAsmInfo::TargetAsmInfo() :
DwarfRequiresFrameSection(true),
GlobalEHDirective(0),
SupportsWeakOmittedEHFrame(true),
- ShortenEHDataOn64Bit(false),
DwarfSectionOffsetDirective(0),
DwarfAbbrevSection(".debug_abbrev"),
DwarfInfoSection(".debug_info"),
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 513e8f0..7e90cd9 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -120,8 +120,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
GlobalEHDirective = "\t.globl\t";
SupportsWeakOmittedEHFrame = false;
AbsoluteEHSectionOffsets = false;
- if (Subtarget->is64Bit())
- ShortenEHDataOn64Bit = true;
DwarfEHFrameSection =
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
DwarfExceptionSection = ".section __DATA,__gcc_except_tab";