aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp25
-rw-r--r--lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h5
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp2
-rw-r--r--lib/Target/X86/X86TargetObjectFile.cpp31
-rw-r--r--lib/Target/X86/X86TargetObjectFile.h11
-rw-r--r--test/CodeGen/X86/personality.ll7
6 files changed, 51 insertions, 30 deletions
diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
index 6365bc0f95..26d4793412 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
@@ -879,7 +879,7 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
O << "\t.size\t" << name << ", " << Size << '\n';
}
-bool X86ATTAsmPrinter::doFinalization(Module &M) {
+void X86ATTAsmPrinter::EmitEndOfAsmFile(Module &M) {
if (Subtarget->isTargetDarwin()) {
// All darwin targets use mach-o.
TargetLoweringObjectFileMachO &TLOFMacho =
@@ -888,26 +888,6 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
MachineModuleInfoMachO &MMIMacho =
MMI->getObjFileInfo<MachineModuleInfoMachO>();
- // Add the (possibly multiple) personalities to the set of global value
- // stubs. Only referenced functions get into the Personalities list.
- if (!Subtarget->is64Bit()) {
- const std::vector<Function*> &Personalities = MMI->getPersonalities();
- for (unsigned i = 0, e = Personalities.size(); i != e; ++i) {
- if (Personalities[i] == 0)
- continue;
-
- SmallString<128> Name;
- Mang->getNameWithPrefix(Name, Personalities[i], true /*private label*/);
- Name += "$non_lazy_ptr";
- MCSymbol *NLPName = OutContext.GetOrCreateSymbol(Name.str());
-
- const MCSymbol *&StubName = MMIMacho.getGVStubEntry(NLPName);
- Name.clear();
- Mang->getNameWithPrefix(Name, Personalities[i], false);
- StubName = OutContext.GetOrCreateSymbol(Name.str());
- }
- }
-
// Output stubs for dynamically-linked functions.
MachineModuleInfoMachO::SymbolListTy Stubs;
@@ -1010,8 +990,5 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
O << "\t.ascii \" -export:" << i->getKeyData() << "\"\n";
}
}
-
- // Do common shutdown.
- return AsmPrinter::doFinalization(M);
}
diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
index 78e3d7de62..7ede60be10 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
+++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
@@ -58,8 +58,9 @@ class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
AsmPrinter::getAnalysisUsage(AU);
}
- bool doFinalization(Module &M);
-
+
+ virtual void EmitEndOfAsmFile(Module &M);
+
void printInstructionThroughMCStreamer(const MachineInstr *MI);
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 6154d2641c..16f737d912 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -65,7 +65,7 @@ static TargetLoweringObjectFile *createTLOF(X86TargetMachine &TM) {
case X86Subtarget::isDarwin:
if (TM.getSubtarget<X86Subtarget>().is64Bit())
return new X8664_MachoTargetObjectFile();
- return new TargetLoweringObjectFileMachO();
+ return new X8632_MachoTargetObjectFile();
case X86Subtarget::isELF:
return new TargetLoweringObjectFileELF();
case X86Subtarget::isMingw:
diff --git a/lib/Target/X86/X86TargetObjectFile.cpp b/lib/Target/X86/X86TargetObjectFile.cpp
index 4b4cc457ae..d39b3c4324 100644
--- a/lib/Target/X86/X86TargetObjectFile.cpp
+++ b/lib/Target/X86/X86TargetObjectFile.cpp
@@ -10,9 +10,40 @@
#include "X86TargetObjectFile.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Mangler.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/CodeGen/MachineModuleInfoImpls.h"
using namespace llvm;
+const MCExpr *X8632_MachoTargetObjectFile::
+getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
+ MachineModuleInfo *MMI,
+ bool &IsIndirect, bool &IsPCRel) const {
+ // The mach-o version of this method defaults to returning a stub reference.
+ IsIndirect = true;
+ IsPCRel = false;
+
+
+ MachineModuleInfoMachO &MachOMMI =
+ MMI->getObjFileInfo<MachineModuleInfoMachO>();
+
+ SmallString<128> Name;
+ Mang->getNameWithPrefix(Name, GV, true);
+ Name += "$non_lazy_ptr";
+
+ // Add information about the stub reference to MachOMMI so that the stub gets
+ // emitted by the asmprinter.
+ MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
+ const MCSymbol *&StubSym = MachOMMI.getGVStubEntry(Sym);
+ if (StubSym == 0) {
+ Name.clear();
+ Mang->getNameWithPrefix(Name, GV, false);
+ StubSym = getContext().GetOrCreateSymbol(Name.str());
+ }
+
+ return MCSymbolRefExpr::Create(Sym, getContext());
+}
+
const MCExpr *X8664_MachoTargetObjectFile::
getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
MachineModuleInfo *MMI,
diff --git a/lib/Target/X86/X86TargetObjectFile.h b/lib/Target/X86/X86TargetObjectFile.h
index bee32a5739..377a93bb71 100644
--- a/lib/Target/X86/X86TargetObjectFile.h
+++ b/lib/Target/X86/X86TargetObjectFile.h
@@ -14,6 +14,17 @@
namespace llvm {
+ /// X8632_MachoTargetObjectFile - This TLOF implementation is used for
+ /// Darwin/x86-32.
+ class X8632_MachoTargetObjectFile : public TargetLoweringObjectFileMachO {
+ public:
+
+ virtual const MCExpr *
+ getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
+ MachineModuleInfo *MMI,
+ bool &IsIndirect, bool &IsPCRel) const;
+ };
+
/// X8664_MachoTargetObjectFile - This TLOF implementation is used for
/// Darwin/x86-64.
class X8664_MachoTargetObjectFile : public TargetLoweringObjectFileMachO {
diff --git a/test/CodeGen/X86/personality.ll b/test/CodeGen/X86/personality.ll
index a4d72a722d..5acf04cc06 100644
--- a/test/CodeGen/X86/personality.ll
+++ b/test/CodeGen/X86/personality.ll
@@ -41,9 +41,10 @@ declare void @__cxa_end_catch()
; X64: Leh_frame_common_begin:
; X64: .long ___gxx_personality_v0@GOTPCREL+4
+; X32: Leh_frame_common_begin:
+; X32: .long L___gxx_personality_v0$non_lazy_ptr-
+; ....
+
; X32: .section __IMPORT,__pointers,non_lazy_symbol_pointers
; X32: L___gxx_personality_v0$non_lazy_ptr:
; X32: .indirect_symbol ___gxx_personality_v0
-; ....
-; X32: Leh_frame_common_begin:
-; X32: .long L___gxx_personality_v0$non_lazy_ptr- \ No newline at end of file