From 1a93184e2d9beb24b0b9a7c24d5e7c7b51d8ee10 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 19 Dec 2008 10:55:56 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61242 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetAsmInfo.h | 6 ++++++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 3 ++- lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 2 +- lib/Target/PowerPC/PPCSubtarget.h | 3 +++ lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 11 ++++++++++- lib/Target/PowerPC/PPCTargetAsmInfo.h | 1 + lib/Target/X86/X86TargetAsmInfo.cpp | 10 ++++++++++ lib/Target/X86/X86TargetAsmInfo.h | 2 +- test/CodeGen/PowerPC/20081212.ll | 10 ++++++++++ test/CodeGen/X86/20081212.ll | 12 ++++++++++++ 10 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/PowerPC/20081212.ll create mode 100644 test/CodeGen/X86/20081212.ll diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 3c71dc8d1d6..d4aadb964bd 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/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/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index b640a589bad..e3cc3b0a270 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/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/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index e41e4cbb6e0..88589d584da 100644 --- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/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/lib/Target/PowerPC/PPCSubtarget.h b/lib/Target/PowerPC/PPCSubtarget.h index be4c21cd448..bb29d449507 100644 --- a/lib/Target/PowerPC/PPCSubtarget.h +++ b/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/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 4151064c6a1..c69e591a663 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/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(); + if (Subtarget->getDarwinVers() > 9) + return PrivateGlobalPrefix; + else + return ""; +} PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : PPCTargetAsmInfo(TM) { CommentString = "#"; GlobalPrefix = ""; - PrivateGlobalPrefix = ""; + PrivateGlobalPrefix = ".L"; ConstantPoolSection = "\t.section .rodata.cst4\t"; JumpTableDataSection = ".section .rodata.cst4"; CStringSection = ".rodata.str"; diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.h b/lib/Target/PowerPC/PPCTargetAsmInfo.h index a533d5fc60e..edf40c9346c 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.h +++ b/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 { diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index feff9307be9..e3336509a76 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/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(); + if (Subtarget->getDarwinVers() > 9) + return PrivateGlobalPrefix; + else + return ""; +} + X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM): X86TargetAsmInfo(TM) { diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h index 806bcd5614a..f89171d3da7 100644 --- a/lib/Target/X86/X86TargetAsmInfo.h +++ b/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 { @@ -72,4 +73,3 @@ namespace llvm { } // namespace llvm #endif - diff --git a/test/CodeGen/PowerPC/20081212.ll b/test/CodeGen/PowerPC/20081212.ll new file mode 100644 index 00000000000..21218f55f03 --- /dev/null +++ b/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/test/CodeGen/X86/20081212.ll b/test/CodeGen/X86/20081212.ll new file mode 100644 index 00000000000..1a5cad94d2a --- /dev/null +++ b/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 +} -- 2.11.0