From 2a3250cd23505f5305f905ea1f5c3caeb4d9e517 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 26 Apr 2007 21:07:05 +0000 Subject: [PATCH] Fix PR1339 and CodeGen/X86/dollar-name.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36495 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ATTAsmPrinter.cpp | 35 ++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index e595750a65b..03a22865e2c 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/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(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)"; -- 2.34.1