[llvm-commits] CVS: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp
Dan Gohman
djg at cray.com
Thu Apr 26 14:07:23 PDT 2007
Changes in directory llvm/lib/Target/X86:
X86ATTAsmPrinter.cpp updated: 1.102 -> 1.103
---
Log message:
Fix PR1339: http://llvm.org/PR1339 and CodeGen/X86/dollar-name.ll
---
Diffs of the changes: (+32 -3)
X86ATTAsmPrinter.cpp | 35 ++++++++++++++++++++++++++++++++---
1 files changed, 32 insertions(+), 3 deletions(-)
Index: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp
diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.102 llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.103
--- llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.102 Sun Apr 22 17:50:52 2007
+++ llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Thu Apr 26 16:07:05 2007
@@ -272,16 +272,24 @@
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 @@
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 @@
}
}
+ 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 @@
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 @@
O << "@PLT";
}
+ if (needCloseParen)
+ O << ')';
+
if (!isCallOp && Subtarget->isPICStyleRIPRel())
O << "(%rip)";
More information about the llvm-commits
mailing list