From 1d05cb47a94bb5639b690519c6027447791e06f7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 17 Nov 2005 18:55:48 +0000 Subject: [PATCH] add an option to generate completely non-pic code, corresponding to what gcc -static produces on PPC. This is used for building kexts and other things. With this, materializing the address of a global looks like: lis r2, ha16(L_H$non_lazy_ptr) la r3, lo16(L_H$non_lazy_ptr)(r2) we're still emitting stubs for functions, which is wrong. That is next. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24399 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPC.h | 1 + lib/Target/PowerPC/PPCISelLowering.cpp | 12 ++++++++++-- lib/Target/PowerPC/PPCSubtarget.cpp | 6 ++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/Target/PowerPC/PPC.h b/lib/Target/PowerPC/PPC.h index d19e57a3ba0..1f40a54b67f 100644 --- a/lib/Target/PowerPC/PPC.h +++ b/lib/Target/PowerPC/PPC.h @@ -33,6 +33,7 @@ FunctionPass *createDarwinAsmPrinter(std::ostream &OS, TargetMachine &TM); FunctionPass *createAIXAsmPrinter(std::ostream &OS, TargetMachine &TM); extern bool PICEnabled; +extern bool PPCGenerateStaticCode; extern PPCTargetEnum PPCTarget; } // end namespace llvm; diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 6ea688d020e..6f798c38ed8 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -333,12 +333,20 @@ SDOperand PPCTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { return DAG.getNode(ISD::BUILD_PAIR, MVT::i64, OutLo, OutHi); } case ISD::GlobalAddress: { - // Only lower GlobalAddress on Darwin. - if (!getTargetMachine().getSubtarget().isDarwin()) break; GlobalValue *GV = cast(Op)->getGlobal(); SDOperand GA = DAG.getTargetGlobalAddress(GV, MVT::i32); SDOperand Zero = DAG.getConstant(0, MVT::i32); + + if (PPCGenerateStaticCode) { + // Generate non-pic code that has direct accesses to globals. To do this + // the address of the global is just (hi(&g)+lo(&g)). + SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, GA, Zero); + SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, GA, Zero); + return DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + } + // Only lower GlobalAddress on Darwin. + if (!getTargetMachine().getSubtarget().isDarwin()) break; SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, GA, Zero); if (PICEnabled) { // With PIC, the first instruction is actually "GR+hi(&G)". diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index 442017d8cd2..f43c18d7dfa 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -19,6 +19,7 @@ using namespace llvm; PPCTargetEnum llvm::PPCTarget = TargetDefault; +bool llvm::PPCGenerateStaticCode = false; namespace llvm { cl::opt @@ -29,6 +30,11 @@ namespace llvm { " Enable Darwin codegen"), clEnumValEnd), cl::location(PPCTarget), cl::init(TargetDefault)); + + cl::opt + PPCStaticCode("ppc-static", + cl::desc("PowerPC: generate completely non-pic code"), + cl::location(PPCGenerateStaticCode)); } #if defined(__APPLE__) -- 2.34.1