From d5bbb07ec806e6fa1e804afd7073987fdacc83e4 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 2 Aug 2009 01:34:32 +0000 Subject: [PATCH] move getDwarfExceptionSection from TAI to TLOF and rename it to getLSDASection() to be more specific. This makes it pretty obvious that the ELF LSDA section is being specified wrong in PIC mode. We're probably getting a lot of startup-time relocations to a readonly page, which is expensive and bad. Someone who cares about ELF C++ should investigate this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77847 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetAsmInfo.h | 7 ------- include/llvm/Target/TargetLoweringObjectFile.h | 8 ++++++-- lib/CodeGen/AsmPrinter/DwarfException.cpp | 9 ++++----- lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 2 -- lib/Target/TargetAsmInfo.cpp | 1 - lib/Target/TargetLoweringObjectFile.cpp | 11 +++++++++++ lib/Target/X86/X86TargetAsmInfo.cpp | 2 -- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 0eff044c45e..5574ad5bc6b 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -371,10 +371,6 @@ namespace llvm { /// const char *DwarfEHFrameSection; // Defaults to ".eh_frame". - /// DwarfExceptionSection - Section directive for Exception table. - /// - const char *DwarfExceptionSection; // Defaults to ".gcc_except_table". - //===--- CBE Asm Translation Table -----------------------------------===// const char *const *AsmTransCBE; // Defaults to empty @@ -637,9 +633,6 @@ namespace llvm { const char *getDwarfEHFrameSection() const { return DwarfEHFrameSection; } - const char *getDwarfExceptionSection() const { - return DwarfExceptionSection; - } const char *const *getAsmCBE() const { return AsmTransCBE; } diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index ec6b6975855..377b9eeae41 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -58,6 +58,10 @@ protected: /// list. const MCSection *StaticDtorSection; + /// LSDASection - If exception handling is supported by the target, this is + /// the section the Language Specific Data Area information is emitted to. + const MCSection *LSDASection; + public: // FIXME: NONPUB. const MCSection *getOrCreateSection(const char *Name, @@ -77,10 +81,10 @@ public: const MCSection *getTextSection() const { return TextSection; } const MCSection *getDataSection() const { return DataSection; } - const MCSection *getStaticCtorSection() const { return StaticCtorSection; } const MCSection *getStaticDtorSection() const { return StaticDtorSection; } - + const MCSection *getLSDASection() const { return LSDASection; } + /// 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 8eb97af0f94..b051f7138ef 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -20,10 +20,11 @@ #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetAsmInfo.h" -#include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetFrameInfo.h" +#include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetRegisterInfo.h" #include "llvm/ADT/StringExtras.h" using namespace llvm; @@ -539,10 +540,8 @@ void DwarfException::EmitExceptionTable() { unsigned SizeAlign = (4 - TotalSize) & 3; // Begin the exception table. - //MCSection *LSDASection = TAI->getLSDASection(); - //Asm->SwitchToSection(LSDASection); - - Asm->SwitchToDataSection(TAI->getDwarfExceptionSection()); + const MCSection *LSDASection = Asm->getObjFileLowering().getLSDASection(); + Asm->SwitchToSection(LSDASection); Asm->EmitAlignment(2, 0, 0, false); O << "GCC_except_table" << SubprogramCount << ":\n"; diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 3c8ab94da5a..2e66cb80646 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -28,7 +28,6 @@ PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM) : DwarfEHFrameSection = ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support"; - DwarfExceptionSection = ".section __DATA,__gcc_except_tab"; GlobalEHDirective = "\t.globl\t"; SupportsWeakOmittedEHFrame = false; } @@ -73,7 +72,6 @@ PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : SupportsExceptionHandling = true; AbsoluteEHSectionOffsets = false; DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits"; - DwarfExceptionSection = "\t.section\t.gcc_except_table,\"a\",@progbits"; } diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 80bb90e0651..e961f2ad74f 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -108,7 +108,6 @@ TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) : TM(tm) { DwarfRangesSection = ".debug_ranges"; DwarfMacroInfoSection = ".debug_macinfo"; DwarfEHFrameSection = ".eh_frame"; - DwarfExceptionSection = ".gcc_except_table"; AsmTransCBE = 0; } diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index a86946da9f1..d04e5c0cd60 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -36,6 +36,7 @@ TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { ReadOnlySection = 0; StaticCtorSection = 0; StaticDtorSection = 0; + LSDASection = 0; } TargetLoweringObjectFile::~TargetLoweringObjectFile() { @@ -302,6 +303,14 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, getOrCreateSection(".ctors", false, SectionKind::getDataRel()); StaticDtorSection = getOrCreateSection(".dtors", false, SectionKind::getDataRel()); + + + // FIXME: We're emitting LSDA info into a readonly section on ELF, even though + // it contains relocatable pointers. In PIC mode, this is probably a big + // runtime hit for C++ apps. Either the contents of the LSDA need to be + // adjusted or this should be a data section. + LSDASection = + getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly()); } @@ -537,6 +546,8 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel()); } + LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false, + SectionKind::getDataRel()); } const MCSection *TargetLoweringObjectFileMachO:: diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index c30f3378b7b..4c9030845a0 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -84,7 +84,6 @@ X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): AbsoluteEHSectionOffsets = false; DwarfEHFrameSection = ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support"; - DwarfExceptionSection = ".section __DATA,__gcc_except_tab"; } unsigned X86DarwinTargetAsmInfo::PreferredEHDataFormat() const { @@ -133,7 +132,6 @@ X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM) : SupportsExceptionHandling = true; AbsoluteEHSectionOffsets = false; DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits"; - DwarfExceptionSection = "\t.section\t.gcc_except_table,\"a\",@progbits"; // On Linux we must declare when we can use a non-executable stack. if (TM.getSubtarget().isLinux())