From d674b4e87d76609994ffc82aae6b2eb37e8b02db Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 9 Jun 2008 09:52:31 +0000 Subject: [PATCH] add support for PIC on linux x86-64 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52139 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ATTAsmPrinter.cpp | 28 ++++++++++++++++------------ test/CodeGen/X86/x86-64-pic-1.ll | 11 +++++++++++ test/CodeGen/X86/x86-64-pic-10.ll | 13 +++++++++++++ test/CodeGen/X86/x86-64-pic-11.ll | 9 +++++++++ test/CodeGen/X86/x86-64-pic-2.ll | 12 ++++++++++++ test/CodeGen/X86/x86-64-pic-3.ll | 15 +++++++++++++++ test/CodeGen/X86/x86-64-pic-4.ll | 11 +++++++++++ test/CodeGen/X86/x86-64-pic-5.ll | 12 ++++++++++++ test/CodeGen/X86/x86-64-pic-6.ll | 12 ++++++++++++ test/CodeGen/X86/x86-64-pic-7.ll | 10 ++++++++++ test/CodeGen/X86/x86-64-pic-8.ll | 11 +++++++++++ test/CodeGen/X86/x86-64-pic-9.ll | 14 ++++++++++++++ 12 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 test/CodeGen/X86/x86-64-pic-1.ll create mode 100644 test/CodeGen/X86/x86-64-pic-10.ll create mode 100644 test/CodeGen/X86/x86-64-pic-11.ll create mode 100644 test/CodeGen/X86/x86-64-pic-2.ll create mode 100644 test/CodeGen/X86/x86-64-pic-3.ll create mode 100644 test/CodeGen/X86/x86-64-pic-4.ll create mode 100644 test/CodeGen/X86/x86-64-pic-5.ll create mode 100644 test/CodeGen/X86/x86-64-pic-6.ll create mode 100644 test/CodeGen/X86/x86-64-pic-7.ll create mode 100644 test/CodeGen/X86/x86-64-pic-8.ll create mode 100644 test/CodeGen/X86/x86-64-pic-9.ll diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index eacab47e13a..60f8502557f 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -197,11 +197,16 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { return false; } -static inline bool printGOT(TargetMachine &TM, const X86Subtarget* ST) { +static inline bool shouldPrintGOT(TargetMachine &TM, const X86Subtarget* ST) { return ST->isPICStyleGOT() && TM.getRelocationModel() == Reloc::PIC_; } -static inline bool printStub(TargetMachine &TM, const X86Subtarget* ST) { +static inline bool shouldPrintPLT(TargetMachine &TM, const X86Subtarget* ST) { + return ST->isTargetELF() && TM.getRelocationModel() == Reloc::PIC_ && + (ST->isPICStyleRIPRel() || ST->isPICStyleGOT()); +} + +static inline bool shouldPrintStub(TargetMachine &TM, const X86Subtarget* ST) { return ST->isPICStyleStub() && TM.getRelocationModel() != Reloc::Static; } @@ -304,7 +309,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, needCloseParen = true; } - if (printStub(TM, Subtarget)) { + if (shouldPrintStub(TM, Subtarget)) { // Link-once, declaration, or Weakly-linked global variables need // non-lazily-resolved stubs if (GV->isDeclaration() || @@ -333,11 +338,11 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, } O << Name; - if (isCallOp && isa(GV)) { - if (printGOT(TM, Subtarget)) { - // Assemble call via PLT for non-local symbols - if (!(GV->hasHiddenVisibility() || GV->hasProtectedVisibility()) || - GV->isDeclaration()) + if (isCallOp) { + if (shouldPrintPLT(TM, Subtarget)) { + // Assemble call via PLT for externally visible symbols + if (!GV->hasHiddenVisibility() && !GV->hasProtectedVisibility() && + !GV->hasInternalLinkage()) O << "@PLT"; } if (Subtarget->isTargetCygMing() && GV->isDeclaration()) @@ -364,7 +369,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, else O << "@NTPOFF"; // local exec TLS model } else if (isMemOp) { - if (printGOT(TM, Subtarget)) { + if (shouldPrintGOT(TM, Subtarget)) { if (Subtarget->GVRequiresExtraLoad(GV, TM, false)) O << "@GOT"; else @@ -396,7 +401,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, bool needCloseParen = false; std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); - if (isCallOp && printStub(TM, Subtarget)) { + if (isCallOp && shouldPrintStub(TM, Subtarget)) { FnStubs.insert(Name); printSuffixedName(Name, "$stub"); return; @@ -412,7 +417,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, O << Name; - if (printGOT(TM, Subtarget)) { + if (shouldPrintPLT(TM, Subtarget)) { std::string GOTName(TAI->getGlobalPrefix()); GOTName+="_GLOBAL_OFFSET_TABLE_"; if (Name == GOTName) @@ -646,4 +651,3 @@ void X86ATTAsmPrinter::printMachineInstruction(const MachineInstr *MI) { // Include the auto-generated portion of the assembly writer. #include "X86GenAsmWriter.inc" - diff --git a/test/CodeGen/X86/x86-64-pic-1.ll b/test/CodeGen/X86/x86-64-pic-1.ll new file mode 100644 index 00000000000..f5303c6ad2d --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-1.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {call f@PLT} %t1 + +define void @g() { +entry: + call void @f( ) + ret void +} + +declare void @f() diff --git a/test/CodeGen/X86/x86-64-pic-10.ll b/test/CodeGen/X86/x86-64-pic-10.ll new file mode 100644 index 00000000000..bc0d0c09f4d --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-10.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {call g@PLT} %t1 + +@g = alias weak i32 ()* @f + +define void @g() { +entry: + %tmp31 = call i32 @g() + ret void +} + +declare extern_weak i32 @f() diff --git a/test/CodeGen/X86/x86-64-pic-11.ll b/test/CodeGen/X86/x86-64-pic-11.ll new file mode 100644 index 00000000000..f7e0def2d06 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-11.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {call __fixunsxfti@PLT} %t1 + +define i128 @f(x86_fp80 %a) { +entry: + %tmp78 = fptoui x86_fp80 %a to i128 + ret i128 %tmp78 +} diff --git a/test/CodeGen/X86/x86-64-pic-2.ll b/test/CodeGen/X86/x86-64-pic-2.ll new file mode 100644 index 00000000000..39aecbadc48 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-2.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {call f} %t1 +; RUN: not grep {call f@PLT} %t1 + +define void @g() { +entry: + call void @f( ) + ret void +} + +declare hidden void @f() diff --git a/test/CodeGen/X86/x86-64-pic-3.ll b/test/CodeGen/X86/x86-64-pic-3.ll new file mode 100644 index 00000000000..0f5f4b706ab --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-3.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {call f} %t1 +; RUN: not grep {call f@PLT} %t1 + +define void @g() { +entry: + call void @f( ) + ret void +} + +define internal void @f() { +entry: + ret void +} diff --git a/test/CodeGen/X86/x86-64-pic-4.ll b/test/CodeGen/X86/x86-64-pic-4.ll new file mode 100644 index 00000000000..f8dfa927828 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-4.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {movq a@GOTPCREL(%rip),} %t1 + +@a = global i32 0 + +define i32 @get_a() { +entry: + %tmp1 = load i32* @a, align 4 + ret i32 %tmp1 +} diff --git a/test/CodeGen/X86/x86-64-pic-5.ll b/test/CodeGen/X86/x86-64-pic-5.ll new file mode 100644 index 00000000000..694755da538 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-5.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {movl a(%rip),} %t1 +; RUN: not grep GOTPCREL %t1 + +@a = hidden global i32 0 + +define i32 @get_a() { +entry: + %tmp1 = load i32* @a, align 4 + ret i32 %tmp1 +} diff --git a/test/CodeGen/X86/x86-64-pic-6.ll b/test/CodeGen/X86/x86-64-pic-6.ll new file mode 100644 index 00000000000..b8a91f10ea1 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-6.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {movl a(%rip),} %t1 +; RUN: not grep GOTPCREL %t1 + +@a = internal global i32 0 + +define i32 @get_a() { +entry: + %tmp1 = load i32* @a, align 4 + ret i32 %tmp1 +} diff --git a/test/CodeGen/X86/x86-64-pic-7.ll b/test/CodeGen/X86/x86-64-pic-7.ll new file mode 100644 index 00000000000..63397907716 --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-7.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {movq f@GOTPCREL(%rip),} %t1 + +define void ()* @g() { +entry: + ret void ()* @f +} + +declare void @f() diff --git a/test/CodeGen/X86/x86-64-pic-8.ll b/test/CodeGen/X86/x86-64-pic-8.ll new file mode 100644 index 00000000000..369e0cf365a --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-8.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {leaq f(%rip),} %t1 +; RUN: not grep GOTPCREL %t1 + +define void ()* @g() { +entry: + ret void ()* @f +} + +declare hidden void @f() diff --git a/test/CodeGen/X86/x86-64-pic-9.ll b/test/CodeGen/X86/x86-64-pic-9.ll new file mode 100644 index 00000000000..eacfcc11d0a --- /dev/null +++ b/test/CodeGen/X86/x86-64-pic-9.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | \ +; RUN: llc -mtriple=x86_64-pc-linux -relocation-model=pic -o %t1 -f +; RUN: grep {leaq f(%rip),} %t1 +; RUN: not grep GOTPCREL %t1 + +define void ()* @g() { +entry: + ret void ()* @f +} + +define internal void @f() { +entry: + ret void +} -- 2.34.1