summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2008-12-19 10:55:56 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2008-12-19 10:55:56 +0000
commit770b4b830a96c365bd12b6ea9219c5aee5aa74f4 (patch)
tree99d7c4e3b844919cfa9e0de5e662b661d64e855c /llvm
parent3cde35175c897dad5f9ccd04fe4f22aa17937e95 (diff)
downloadbcm5719-llvm-770b4b830a96c365bd12b6ea9219c5aee5aa74f4.tar.gz
bcm5719-llvm-770b4b830a96c365bd12b6ea9219c5aee5aa74f4.zip
Fix bug 3202.
The EH_frame and .eh symbols are now private, except for darwin9 and earlier. The patch also fixes the definition of PrivateGlobalPrefix on pcc linux. llvm-svn: 61242
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Target/TargetAsmInfo.h6
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp3
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp2
-rw-r--r--llvm/lib/Target/PowerPC/PPCSubtarget.h3
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp11
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h1
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.cpp10
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.h2
-rw-r--r--llvm/test/CodeGen/PowerPC/20081212.ll10
-rw-r--r--llvm/test/CodeGen/X86/20081212.ll12
10 files changed, 56 insertions, 4 deletions
diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h
index 3c71dc8d1d6..d4aadb964bd 100644
--- a/llvm/include/llvm/Target/TargetAsmInfo.h
+++ b/llvm/include/llvm/Target/TargetAsmInfo.h
@@ -646,6 +646,12 @@ namespace llvm {
const char *getPrivateGlobalPrefix() const {
return PrivateGlobalPrefix;
}
+ /// EHGlobalPrefix - Prefix for EH_frame and the .eh symbols.
+ /// This is normally PrivateGlobalPrefix, but some targets want
+ /// these symbols to be visible.
+ virtual const char *getEHGlobalPrefix() const {
+ return PrivateGlobalPrefix;
+ }
const char *getLessPrivateGlobalPrefix() const {
return LessPrivateGlobalPrefix;
}
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index b640a589bad..e3cc3b0a270 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -239,7 +239,8 @@ std::string AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) {
std::string Name = MF->getFunction()->getName();
if (Name.empty())
Name = Mang->getValueName(MF->getFunction());
- return Mang->makeNameProper(Name + ".eh", TAI->getGlobalPrefix());
+ return Mang->makeNameProper(TAI->getEHGlobalPrefix() +
+ Name + ".eh", TAI->getGlobalPrefix());
}
void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
index e41e4cbb6e0..88589d584da 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
@@ -2962,7 +2962,7 @@ private:
// Begin eh frame section.
Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
- O << "EH_frame" << Index << ":\n";
+ O << TAI->getEHGlobalPrefix() << "EH_frame" << Index << ":\n";
EmitLabel("section_eh_frame", Index);
// Define base labels.
diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.h b/llvm/lib/Target/PowerPC/PPCSubtarget.h
index be4c21cd448..bb29d449507 100644
--- a/llvm/lib/Target/PowerPC/PPCSubtarget.h
+++ b/llvm/lib/Target/PowerPC/PPCSubtarget.h
@@ -141,6 +141,9 @@ public:
/// isDarwin - True if this is darwin9 (leopard, 10.5) or above.
bool isDarwin9() const { return DarwinVers >= 9; }
+ /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard.
+ unsigned getDarwinVers() const { return DarwinVers; }
+
bool isMachoABI() const { return isDarwin() || IsPPC64; }
bool isELF32_ABI() const { return !isDarwin() && !IsPPC64; }
diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index 4151064c6a1..c69e591a663 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -89,12 +89,21 @@ PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
return DW_EH_PE_absptr;
}
+const char *
+PPCDarwinTargetAsmInfo::getEHGlobalPrefix() const
+{
+ const PPCSubtarget* Subtarget = &TM.getSubtarget<PPCSubtarget>();
+ if (Subtarget->getDarwinVers() > 9)
+ return PrivateGlobalPrefix;
+ else
+ return "";
+}
PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) :
PPCTargetAsmInfo<ELFTargetAsmInfo>(TM) {
CommentString = "#";
GlobalPrefix = "";
- PrivateGlobalPrefix = "";
+ PrivateGlobalPrefix = ".L";
ConstantPoolSection = "\t.section .rodata.cst4\t";
JumpTableDataSection = ".section .rodata.cst4";
CStringSection = ".rodata.str";
diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h
index a533d5fc60e..edf40c9346c 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h
+++ b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h
@@ -48,6 +48,7 @@ namespace llvm {
explicit PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
+ virtual const char *getEHGlobalPrefix() const;
};
struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo<ELFTargetAsmInfo> {
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
index feff9307be9..e3336509a76 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -138,6 +138,16 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
return DW_EH_PE_absptr;
}
+const char *
+X86DarwinTargetAsmInfo::getEHGlobalPrefix() const
+{
+ const X86Subtarget* Subtarget = &TM.getSubtarget<X86Subtarget>();
+ if (Subtarget->getDarwinVers() > 9)
+ return PrivateGlobalPrefix;
+ else
+ return "";
+}
+
X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM):
X86TargetAsmInfo<ELFTargetAsmInfo>(TM) {
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h
index 806bcd5614a..f89171d3da7 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.h
+++ b/llvm/lib/Target/X86/X86TargetAsmInfo.h
@@ -48,6 +48,7 @@ namespace llvm {
explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
+ virtual const char *getEHGlobalPrefix() const;
};
struct X86ELFTargetAsmInfo : public X86TargetAsmInfo<ELFTargetAsmInfo> {
@@ -72,4 +73,3 @@ namespace llvm {
} // namespace llvm
#endif
-
diff --git a/llvm/test/CodeGen/PowerPC/20081212.ll b/llvm/test/CodeGen/PowerPC/20081212.ll
new file mode 100644
index 00000000000..21218f55f03
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/20081212.ll
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | llc -march=ppc32 -mtriple=powerpc-unknown-linux-gnu | grep ^.L_Z1fv.eh
+; RUN: llvm-as < %s | llc -march=ppc32 -mtriple=powerpc-apple-darwin9 | grep ^__Z1fv.eh
+
+define void @_Z1fv() {
+entry:
+ br label %return
+
+return:
+ ret void
+}
diff --git a/llvm/test/CodeGen/X86/20081212.ll b/llvm/test/CodeGen/X86/20081212.ll
new file mode 100644
index 00000000000..1a5cad94d2a
--- /dev/null
+++ b/llvm/test/CodeGen/X86/20081212.ll
@@ -0,0 +1,12 @@
+; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-unknown-linux-gnu | grep ^.L_Z1fv.eh
+; RUN: llvm-as < %s | llc -march=x86 -mtriple=i686-unknown-linux-gnu | grep ^.L_Z1fv.eh
+; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=-mtriple=x86_64-apple-darwin9 | grep ^__Z1fv.eh
+; RUN: llvm-as < %s | llc -march=x86 -mtriple=-mtriple=i386-apple-darwin9 | grep ^__Z1fv.eh
+
+define void @_Z1fv() {
+entry:
+ br label %return
+
+return:
+ ret void
+}
OpenPOWER on IntegriCloud