diff options
| author | Dan Gohman <gohman@apple.com> | 2007-04-26 21:07:05 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2007-04-26 21:07:05 +0000 |
| commit | a30eabdd6e829000495df0f6eca50dd61723abb2 (patch) | |
| tree | f8b0275befd89b17771a616b8fa35d32d65e9143 /llvm/lib | |
| parent | c8264ca457817d3cf937e016ee5afdb96796b0a2 (diff) | |
| download | bcm5719-llvm-a30eabdd6e829000495df0f6eca50dd61723abb2.tar.gz bcm5719-llvm-a30eabdd6e829000495df0f6eca50dd61723abb2.zip | |
Fix PR1339 and CodeGen/X86/dollar-name.ll
llvm-svn: 36495
Diffstat (limited to 'llvm/lib')
| -rwxr-xr-x | llvm/lib/Target/X86/X86ATTAsmPrinter.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp b/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp index e595750a65b..03a22865e2c 100755 --- a/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -272,16 +272,24 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, case MachineOperand::MO_GlobalAddress: { bool isCallOp = Modifier && !strcmp(Modifier, "call"); bool isMemOp = Modifier && !strcmp(Modifier, "mem"); + bool needCloseParen = false; GlobalValue *GV = MO.getGlobal(); GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); bool isThreadLocal = GVar && GVar->isThreadLocal(); - if (!isMemOp && !isCallOp) O << '$'; - std::string Name = Mang->getValueName(GV); X86SharedAsmPrinter::decorateName(Name, GV); + if (!isMemOp && !isCallOp) + O << '$'; + else if (Name[0] == '$') { + // The name begins with a dollar-sign. In order to avoid having it look + // like an integer immediate to the assembler, enclose it in parens. + O << '('; + needCloseParen = true; + } + if (printStub(TM, Subtarget)) { // Link-once, External, or Weakly-linked global variables need // non-lazily-resolved stubs @@ -352,6 +360,12 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, GV->hasLinkOnceLinkage()) && TM.getRelocationModel() != Reloc::Static) O << "@GOTPCREL"; + + if (needCloseParen) { + needCloseParen = false; + O << ')'; + } + // Use rip when possible to reduce code size, except when // index or base register are also part of the address. e.g. // foo(%rip)(%rcx,%rax,4) is not legal @@ -359,10 +373,14 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, } } + if (needCloseParen) + O << ')'; + return; } case MachineOperand::MO_ExternalSymbol: { bool isCallOp = Modifier && !strcmp(Modifier, "call"); + bool needCloseParen = false; std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); if (isCallOp && printStub(TM, Subtarget)) { @@ -370,7 +388,15 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; return; } - if (!isCallOp) O << '$'; + if (!isCallOp) + O << '$'; + else if (Name[0] == '$') { + // The name begins with a dollar-sign. In order to avoid having it look + // like an integer immediate to the assembler, enclose it in parens. + O << '('; + needCloseParen = true; + } + O << Name; if (printGOT(TM, Subtarget)) { @@ -391,6 +417,9 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, O << "@PLT"; } + if (needCloseParen) + O << ')'; + if (!isCallOp && Subtarget->isPICStyleRIPRel()) O << "(%rip)"; |

