aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-08-02 01:34:32 +0000
committerChris Lattner <sabre@nondot.org>2009-08-02 01:34:32 +0000
commitd5bbb07ec806e6fa1e804afd7073987fdacc83e4 (patch)
treecfc4d2c2187d044c70d23c05086d146dce8ff69e /lib
parent967ce7f5e1239be52386afa0439d2c433809aeeb (diff)
downloadexternal_llvm-d5bbb07ec806e6fa1e804afd7073987fdacc83e4.zip
external_llvm-d5bbb07ec806e6fa1e804afd7073987fdacc83e4.tar.gz
external_llvm-d5bbb07ec806e6fa1e804afd7073987fdacc83e4.tar.bz2
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
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfException.cpp9
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.cpp2
-rw-r--r--lib/Target/TargetAsmInfo.cpp1
-rw-r--r--lib/Target/TargetLoweringObjectFile.cpp11
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp2
5 files changed, 15 insertions, 10 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 8eb97af..b051f71 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 3c8ab94..2e66cb8 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 80bb90e..e961f2a 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 a86946d..d04e5c0 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 c30f337..4c90308 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<X86Subtarget>().isLinux())