diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-07-16 14:16:05 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-07-16 14:16:05 +0000 |
commit | 6fe326c713c25e33e7e3ea3d1202ba19a19090c5 (patch) | |
tree | e8b7e30b19761f001bf7ef80cf05472f74948967 /lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp | |
parent | 48e8b3cc5841f0652430aa9f0ce3eb9fa09bdcda (diff) | |
download | llvm-6fe326c713c25e33e7e3ea3d1202ba19a19090c5.tar.gz llvm-6fe326c713c25e33e7e3ea3d1202ba19a19090c5.tar.bz2 llvm-6fe326c713c25e33e7e3ea3d1202ba19a19090c5.tar.xz |
Implement 'large' PIC model
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76006 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp')
-rw-r--r-- | lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp b/lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp index 1a911dbc1d..af3ce1780d 100644 --- a/lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp +++ b/lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp @@ -50,6 +50,7 @@ namespace { void printOperand(const MachineInstr *MI, int OpNum, const char* Modifier = 0); + void printPCRelImmOperand(const MachineInstr *MI, int OpNum); void printRIAddrOperand(const MachineInstr *MI, int OpNum, const char* Modifier = 0); void printRRIAddrOperand(const MachineInstr *MI, int OpNum, @@ -186,6 +187,40 @@ void SystemZAsmPrinter::printMachineInstruction(const MachineInstr *MI) { assert(0 && "Should not happen"); } +void SystemZAsmPrinter::printPCRelImmOperand(const MachineInstr *MI, int OpNum) { + const MachineOperand &MO = MI->getOperand(OpNum); + switch (MO.getType()) { + case MachineOperand::MO_GlobalAddress: { + const GlobalValue *GV = MO.getGlobal(); + std::string Name = Mang->getValueName(GV); + + O << Name; + + // Assemble calls via PLT for externally visible symbols if PIC. + if (TM.getRelocationModel() == Reloc::PIC_ && + !GV->hasHiddenVisibility() && !GV->hasProtectedVisibility() && + !GV->hasLocalLinkage()) + O << "@PLT"; + + printOffset(MO.getOffset()); + return; + } + case MachineOperand::MO_ExternalSymbol: { + std::string Name(TAI->getGlobalPrefix()); + Name += MO.getSymbolName(); + O << Name; + + if (TM.getRelocationModel() == Reloc::PIC_) + O << "@PLT"; + + return; + } + default: + assert(0 && "Not implemented yet!"); + } +} + + void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, const char* Modifier) { const MachineOperand &MO = MI->getOperand(OpNum); @@ -219,23 +254,31 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, return; case MachineOperand::MO_GlobalAddress: { const GlobalValue *GV = MO.getGlobal(); - std::string Name = Mang->getValueName(GV); - assert(MO.getOffset() == 0 && "No offsets allowed!"); O << Name; - - return; + break; } case MachineOperand::MO_ExternalSymbol: { std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); O << Name; - return; + break; } default: assert(0 && "Not implemented yet!"); } + + switch (MO.getTargetFlags()) { + default: + assert(0 && "Unknown target flag on GV operand"); + case SystemZII::MO_NO_FLAG: + break; + case SystemZII::MO_GOTENT: O << "@GOTENT"; break; + case SystemZII::MO_PLT: O << "@PLT"; break; + } + + printOffset(MO.getOffset()); } void SystemZAsmPrinter::printRIAddrOperand(const MachineInstr *MI, int OpNum, |