diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2007-01-30 20:37:08 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2007-01-30 20:37:08 +0000 |
| commit | c60e76d139a96cc8bb7454929172cdb992e16971 (patch) | |
| tree | fe8d8431e2477af5a3c4ab2b2ead8b931904071a /lib/Target/ARM/ARMAsmPrinter.cpp | |
| parent | 5cbf985dcbc89fba3208e7baf8b6f488b06d3ec9 (diff) | |
- Fix codegen for pc relative constant (e.g. JT) in thumb mode:
.set PCRELV0, (LJTI1_0_0-(LPCRELL0+4))
LPCRELL0:
add r1, pc, #PCRELV0
This is not legal since add r1, pc, #c requires the constant be a multiple of 4.
Do the following instead:
.set PCRELV0, (LJTI1_0_0-(LPCRELL0+4))
LPCRELL0:
mov r1, #PCRELV0
add r1, pc
- In thumb mode, it's not possible to use .set generate a pc relative stub
address. The stub is ARM code which is in a different section from the thumb
code. Load the value from a constpool instead.
- Some asm printing clean up.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33664 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMAsmPrinter.cpp')
| -rw-r--r-- | lib/Target/ARM/ARMAsmPrinter.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index dee4640d2e..e61b5a2764 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -122,10 +122,15 @@ namespace { ARMConstantPoolValue *ACPV = (ARMConstantPoolValue*)MCPV; GlobalValue *GV = ACPV->getGV(); - std::string Name = Mang->getValueName(GV); + std::string Name = GV ? Mang->getValueName(GV) : TAI->getGlobalPrefix(); + if (!GV) + Name += ACPV->getSymbol(); if (ACPV->isNonLazyPointer()) { GVNonLazyPtrs.insert(Name); O << TAI->getPrivateGlobalPrefix() << Name << "$non_lazy_ptr"; + } else if (ACPV->isStub()) { + FnStubs.insert(Name); + O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; } else O << Name; if (ACPV->getPCAdjustment() != 0) @@ -136,7 +141,7 @@ namespace { // If the constant pool value is a extern weak symbol, remember to emit // the weak reference. - if (GV->hasExternalWeakLinkage()) + if (GV && GV->hasExternalWeakLinkage()) ExtWeakSymbols.insert(GV); } @@ -680,18 +685,29 @@ bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) { ++EmittedInsts; - if (MI->getOpcode() == ARM::CONSTPOOL_ENTRY) { + int Opc = MI->getOpcode(); + switch (Opc) { + case ARM::CONSTPOOL_ENTRY: if (!InCPMode && AFI->isThumbFunction()) { EmitAlignment(2); InCPMode = true; } - } else { + break; + default: { if (InCPMode && AFI->isThumbFunction()) { EmitAlignment(1); InCPMode = false; } - O << "\t"; - } + switch (Opc) { + case ARM::PICADD: + case ARM::PICLD: + case ARM::tPICADD: + break; + default: + O << "\t"; + break; + } + }} // Call the autogenerated instruction printer routines. printInstruction(MI); |
