wire up support for emitting "special" values from inline asm

format strings with the standard ${:foo} syntax.

llvm-svn: 66527
This commit is contained in:
Chris Lattner 2009-03-10 05:37:13 +00:00
parent b4947e4378
commit 1522e2498f
3 changed files with 27 additions and 2 deletions

View File

@ -176,7 +176,7 @@ namespace llvm {
/// or other bits of target-specific knowledge into the asmstrings. The
/// syntax used is ${:comment}. Targets can override this to add support
/// for their own strange codes.
virtual void PrintSpecial(const MachineInstr *MI, const char *Code);
virtual void PrintSpecial(const MachineInstr *MI, const char *Code) const;
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
/// instruction, using the specified assembler variant. Targets should

View File

@ -1185,7 +1185,7 @@ void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
/// or other bits of target-specific knowledge into the asmstrings. The
/// syntax used is ${:comment}. Targets can override this to add support
/// for their own strange codes.
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) {
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
if (!strcmp(Code, "private")) {
O << TAI->getPrivateGlobalPrefix();
} else if (!strcmp(Code, "comment")) {
@ -1307,6 +1307,25 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
HasCurlyBraces = true;
}
// If we have ${:foo}, then this is not a real operand reference, it is a
// "magic" string reference, just like in .td files. Arrange to call
// PrintSpecial.
if (HasCurlyBraces && *LastEmitted == ':') {
++LastEmitted;
const char *StrStart = LastEmitted;
const char *StrEnd = strchr(StrStart, '}');
if (StrEnd == 0) {
cerr << "Unterminated ${:foo} operand in inline asm string: '"
<< AsmStr << "'\n";
exit(1);
}
std::string Val(StrStart, StrEnd);
PrintSpecial(MI, Val.c_str());
LastEmitted = StrEnd+1;
break;
}
const char *IDStart = LastEmitted;
char *IDEnd;
errno = 0;

View File

@ -0,0 +1,6 @@
; RUN: llvm-as < %s | llc | grep "foo 0 0"
define void @bar() nounwind {
tail call void asm sideeffect "foo ${:uid} ${:uid}", ""() nounwind
ret void
}