From: Chris Lattner Date: Sun, 2 Aug 2009 06:52:36 +0000 (+0000) Subject: convert EHFrameSection to be managed by TLOF instead of TAI. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=35039ac24163e99cfab161620a9fb41f944a63d5;p=oota-llvm.git convert EHFrameSection to be managed by TLOF instead of TAI. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77888 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 377b9eeae41..b4d9b59035f 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -62,6 +62,11 @@ protected: /// the section the Language Specific Data Area information is emitted to. const MCSection *LSDASection; + /// EHFrameSection - If exception handling is supported by the target, this is + /// the section the EH Frame is emitted to. + const MCSection *EHFrameSection; + + public: // FIXME: NONPUB. const MCSection *getOrCreateSection(const char *Name, @@ -84,7 +89,8 @@ public: const MCSection *getStaticCtorSection() const { return StaticCtorSection; } const MCSection *getStaticDtorSection() const { return StaticDtorSection; } const MCSection *getLSDASection() const { return LSDASection; } - + const MCSection *getEHFrameSection() const { return EHFrameSection; } + /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively /// decide not to emit the UsedDirective for some symbols in llvm.used. /// FIXME: REMOVE this (rdar://7071300) diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp index aa52d87f278..fec1ad75573 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -56,7 +56,7 @@ void DwarfException::EmitCommonEHFrame(const Function *Personality, TD->getPointerSize() : -TD->getPointerSize(); // Begin eh frame section. - Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection()); + Asm->SwitchToSection(Asm->getObjFileLowering().getEHFrameSection()); if (TAI->is_EHSymbolPrivate()) O << TAI->getPrivateGlobalPrefix(); @@ -150,7 +150,7 @@ void DwarfException::EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) { const Function *TheFunc = EHFrameInfo.function; - Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection()); + Asm->SwitchToSection(Asm->getObjFileLowering().getEHFrameSection()); // Externally visible entry into the functions eh frame info. If the // corresponding function is static, this should not be externally visible. diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 0696a901635..e8b1824c3ed 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -26,8 +26,6 @@ PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM) : UsedDirective = "\t.no_dead_strip\t"; SupportsExceptionHandling = true; - DwarfEHFrameSection = - ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support"; GlobalEHDirective = "\t.globl\t"; SupportsWeakOmittedEHFrame = false; } @@ -64,7 +62,6 @@ PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : if (!TM.getSubtargetImpl()->isPPC64()) SupportsExceptionHandling = true; AbsoluteEHSectionOffsets = false; - DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits"; } diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index a4143ce11cd..7da3715d266 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -96,7 +96,6 @@ TargetAsmInfo::TargetAsmInfo() { DwarfARangesSection = ".debug_aranges"; DwarfRangesSection = ".debug_ranges"; DwarfMacroInfoSection = ".debug_macinfo"; - DwarfEHFrameSection = ".eh_frame"; AsmTransCBE = 0; } diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index d04e5c0cd60..38ae71e67d6 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -37,6 +37,7 @@ TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { StaticCtorSection = 0; StaticDtorSection = 0; LSDASection = 0; + EHFrameSection = 0; } TargetLoweringObjectFile::~TargetLoweringObjectFile() { @@ -311,6 +312,8 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, // adjusted or this should be a data section. LSDASection = getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly()); + EHFrameSection = + getOrCreateSection(".eh_frame", false, SectionKind::getDataRel()); } @@ -548,6 +551,9 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false, SectionKind::getDataRel()); + EHFrameSection = + getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms" + "+live_support", false, SectionKind::getReadOnly()); } const MCSection *TargetLoweringObjectFileMachO:: diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index a8eaf5cf64e..24136ba3119 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -82,8 +82,6 @@ X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): GlobalEHDirective = "\t.globl\t"; SupportsWeakOmittedEHFrame = false; AbsoluteEHSectionOffsets = false; - DwarfEHFrameSection = - ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support"; } X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM) : @@ -115,7 +113,6 @@ X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM) : // Exceptions handling SupportsExceptionHandling = true; AbsoluteEHSectionOffsets = false; - DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits"; // On Linux we must declare when we can use a non-executable stack. if (TM.getSubtarget().isLinux())