mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
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
This commit is contained in:
parent
fbd15899b3
commit
671fa97a4b
@ -339,10 +339,6 @@ namespace llvm {
|
|||||||
/// handle a weak_definition of constant 0 for an omitted EH frame.
|
/// handle a weak_definition of constant 0 for an omitted EH frame.
|
||||||
bool SupportsWeakOmittedEHFrame; // Defaults to true.
|
bool SupportsWeakOmittedEHFrame; // Defaults to true.
|
||||||
|
|
||||||
/// ShortenEHDataON64Bit - True if target exception table format requires
|
|
||||||
/// 32-bit data in certain places even when targeting 64-bits.
|
|
||||||
bool ShortenEHDataOn64Bit; // Defaults to false.
|
|
||||||
|
|
||||||
/// DwarfSectionOffsetDirective - Special section offset directive.
|
/// DwarfSectionOffsetDirective - Special section offset directive.
|
||||||
const char* DwarfSectionOffsetDirective; // Defaults to NULL
|
const char* DwarfSectionOffsetDirective; // Defaults to NULL
|
||||||
|
|
||||||
@ -635,9 +631,6 @@ namespace llvm {
|
|||||||
bool getSupportsWeakOmittedEHFrame() const {
|
bool getSupportsWeakOmittedEHFrame() const {
|
||||||
return SupportsWeakOmittedEHFrame;
|
return SupportsWeakOmittedEHFrame;
|
||||||
}
|
}
|
||||||
bool getShortenEHDataOn64Bit() const {
|
|
||||||
return ShortenEHDataOn64Bit;
|
|
||||||
}
|
|
||||||
const char *getDwarfSectionOffsetDirective() const {
|
const char *getDwarfSectionOffsetDirective() const {
|
||||||
return DwarfSectionOffsetDirective;
|
return DwarfSectionOffsetDirective;
|
||||||
}
|
}
|
||||||
|
@ -2837,38 +2837,37 @@ private:
|
|||||||
Asm->EmitSLEB128Bytes(stackGrowth);
|
Asm->EmitSLEB128Bytes(stackGrowth);
|
||||||
Asm->EOL("CIE Data Alignment Factor");
|
Asm->EOL("CIE Data Alignment Factor");
|
||||||
Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
|
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 there is a personality, we need to indicate the functions location.
|
||||||
if (Personality) {
|
if (Personality) {
|
||||||
Asm->EmitULEB128Bytes(7);
|
Asm->EmitULEB128Bytes(7);
|
||||||
Asm->EOL("Augmentation Size");
|
Asm->EOL("Augmentation Size");
|
||||||
|
|
||||||
if (TAI->getNeedsIndirectEncoding())
|
if (TAI->getNeedsIndirectEncoding()) {
|
||||||
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect);
|
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect);
|
||||||
else
|
|
||||||
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
|
|
||||||
|
|
||||||
Asm->EOL("Personality (pcrel sdata4 indirect)");
|
Asm->EOL("Personality (pcrel sdata4 indirect)");
|
||||||
|
} else {
|
||||||
|
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
|
||||||
|
Asm->EOL("Personality (pcrel sdata4)");
|
||||||
|
}
|
||||||
|
|
||||||
PrintRelDirective(TAI->getShortenEHDataOn64Bit());
|
PrintRelDirective(true);
|
||||||
O << TAI->getPersonalityPrefix();
|
O << TAI->getPersonalityPrefix();
|
||||||
Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
|
Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
|
||||||
O << TAI->getPersonalitySuffix();
|
O << TAI->getPersonalitySuffix();
|
||||||
if (!TAI->getShortenEHDataOn64Bit()) {
|
|
||||||
O << "-" << TAI->getPCSymbol();
|
O << "-" << TAI->getPCSymbol();
|
||||||
}
|
|
||||||
Asm->EOL("Personality");
|
Asm->EOL("Personality");
|
||||||
|
|
||||||
Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
|
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
|
||||||
Asm->EOL("LSDA Encoding (pcrel)");
|
Asm->EOL("LSDA Encoding (pcrel sdata4)");
|
||||||
Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
|
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
|
||||||
Asm->EOL("FDE Encoding (pcrel)");
|
Asm->EOL("FDE Encoding (pcrel sdata4)");
|
||||||
} else {
|
} else {
|
||||||
Asm->EmitULEB128Bytes(1);
|
Asm->EmitULEB128Bytes(1);
|
||||||
Asm->EOL("Augmentation Size");
|
Asm->EOL("Augmentation Size");
|
||||||
Asm->EmitULEB128Bytes(DW_EH_PE_pcrel);
|
Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
|
||||||
Asm->EOL("FDE Encoding (pcrel)");
|
Asm->EOL("FDE Encoding (pcrel sdata4)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indicate locations of general callee saved registers in frame.
|
// Indicate locations of general callee saved registers in frame.
|
||||||
@ -2940,25 +2939,22 @@ private:
|
|||||||
true, true, false);
|
true, true, false);
|
||||||
Asm->EOL("FDE CIE offset");
|
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");
|
Asm->EOL("FDE initial location");
|
||||||
EmitDifference("eh_func_end", EHFrameInfo.Number,
|
EmitDifference("eh_func_end", EHFrameInfo.Number,
|
||||||
"eh_func_begin", EHFrameInfo.Number);
|
"eh_func_begin", EHFrameInfo.Number, true);
|
||||||
Asm->EOL("FDE address range");
|
Asm->EOL("FDE address range");
|
||||||
|
|
||||||
// If there is a personality and landing pads then point to the language
|
// If there is a personality and landing pads then point to the language
|
||||||
// specific data area in the exception table.
|
// specific data area in the exception table.
|
||||||
if (EHFrameInfo.PersonalityIndex) {
|
if (EHFrameInfo.PersonalityIndex) {
|
||||||
Asm->EmitULEB128Bytes(TAI->getShortenEHDataOn64Bit() ? 8 : 4);
|
Asm->EmitULEB128Bytes(4);
|
||||||
Asm->EOL("Augmentation size");
|
Asm->EOL("Augmentation size");
|
||||||
|
|
||||||
if (EHFrameInfo.hasLandingPads) {
|
if (EHFrameInfo.hasLandingPads)
|
||||||
EmitReference("exception", EHFrameInfo.Number, true);
|
EmitReference("exception", EHFrameInfo.Number, true, true);
|
||||||
} else if (TD->getPointerSize() == 8) {
|
else
|
||||||
Asm->EmitInt64((int)0);
|
|
||||||
} else {
|
|
||||||
Asm->EmitInt32((int)0);
|
Asm->EmitInt32((int)0);
|
||||||
}
|
|
||||||
Asm->EOL("Language Specific Data Area");
|
Asm->EOL("Language Specific Data Area");
|
||||||
} else {
|
} else {
|
||||||
Asm->EmitULEB128Bytes(0);
|
Asm->EmitULEB128Bytes(0);
|
||||||
@ -3267,13 +3263,20 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Final tallies.
|
// Final tallies.
|
||||||
unsigned SizeSites = CallSites.size() * (sizeof(int32_t) + // Site start.
|
|
||||||
sizeof(int32_t) + // Site length.
|
// Call sites.
|
||||||
sizeof(int32_t)); // Landing pad.
|
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)
|
for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
|
||||||
SizeSites += Asm->SizeULEB128(CallSites[i].Action);
|
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
|
unsigned TypeOffset = sizeof(int8_t) + // Call site format
|
||||||
Asm->SizeULEB128(SizeSites) + // Call-site table length
|
Asm->SizeULEB128(SizeSites) + // Call-site table length
|
||||||
@ -3323,27 +3326,22 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
|
EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
|
||||||
TAI->getShortenEHDataOn64Bit(), true);
|
true, true);
|
||||||
Asm->EOL("Region start");
|
Asm->EOL("Region start");
|
||||||
|
|
||||||
if (!S.EndLabel) {
|
if (!S.EndLabel) {
|
||||||
EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
|
EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
|
||||||
TAI->getShortenEHDataOn64Bit());
|
true);
|
||||||
} else {
|
} else {
|
||||||
EmitDifference("label", S.EndLabel, BeginTag, BeginNumber,
|
EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);
|
||||||
TAI->getShortenEHDataOn64Bit());
|
|
||||||
}
|
}
|
||||||
Asm->EOL("Region length");
|
Asm->EOL("Region length");
|
||||||
|
|
||||||
if (!S.PadLabel) {
|
if (!S.PadLabel)
|
||||||
if (TD->getPointerSize() == sizeof(int32_t) || TAI->getShortenEHDataOn64Bit())
|
|
||||||
Asm->EmitInt32(0);
|
Asm->EmitInt32(0);
|
||||||
else
|
else
|
||||||
Asm->EmitInt64(0);
|
|
||||||
} else {
|
|
||||||
EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
|
EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
|
||||||
TAI->getShortenEHDataOn64Bit(), true);
|
true, true);
|
||||||
}
|
|
||||||
Asm->EOL("Landing pad");
|
Asm->EOL("Landing pad");
|
||||||
|
|
||||||
Asm->EmitULEB128Bytes(S.Action);
|
Asm->EmitULEB128Bytes(S.Action);
|
||||||
|
@ -90,7 +90,6 @@ TargetAsmInfo::TargetAsmInfo() :
|
|||||||
DwarfRequiresFrameSection(true),
|
DwarfRequiresFrameSection(true),
|
||||||
GlobalEHDirective(0),
|
GlobalEHDirective(0),
|
||||||
SupportsWeakOmittedEHFrame(true),
|
SupportsWeakOmittedEHFrame(true),
|
||||||
ShortenEHDataOn64Bit(false),
|
|
||||||
DwarfSectionOffsetDirective(0),
|
DwarfSectionOffsetDirective(0),
|
||||||
DwarfAbbrevSection(".debug_abbrev"),
|
DwarfAbbrevSection(".debug_abbrev"),
|
||||||
DwarfInfoSection(".debug_info"),
|
DwarfInfoSection(".debug_info"),
|
||||||
|
@ -120,8 +120,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
|
|||||||
GlobalEHDirective = "\t.globl\t";
|
GlobalEHDirective = "\t.globl\t";
|
||||||
SupportsWeakOmittedEHFrame = false;
|
SupportsWeakOmittedEHFrame = false;
|
||||||
AbsoluteEHSectionOffsets = false;
|
AbsoluteEHSectionOffsets = false;
|
||||||
if (Subtarget->is64Bit())
|
|
||||||
ShortenEHDataOn64Bit = true;
|
|
||||||
DwarfEHFrameSection =
|
DwarfEHFrameSection =
|
||||||
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
|
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
|
||||||
DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
|
DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user