[llvm-commits] [llvm] r66527 - in /llvm/trunk: include/llvm/CodeGen/AsmPrinter.h lib/CodeGen/AsmPrinter/AsmPrinter.cpp test/CodeGen/Generic/inline-asm-special-strings.ll

Chris Lattner sabre at nondot.org
Mon Mar 9 22:37:13 PDT 2009


Author: lattner
Date: Tue Mar 10 00:37:13 2009
New Revision: 66527

URL: http://llvm.org/viewvc/llvm-project?rev=66527&view=rev
Log:
wire up support for emitting "special" values from inline asm
format strings with the standard ${:foo} syntax.

Added:
    llvm/trunk/test/CodeGen/Generic/inline-asm-special-strings.ll
Modified:
    llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=66527&r1=66526&r2=66527&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
+++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Tue Mar 10 00:37:13 2009
@@ -176,7 +176,7 @@
     /// 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

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=66527&r1=66526&r2=66527&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Mar 10 00:37:13 2009
@@ -1185,7 +1185,7 @@
 /// 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 @@
         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;

Added: llvm/trunk/test/CodeGen/Generic/inline-asm-special-strings.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/inline-asm-special-strings.ll?rev=66527&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/Generic/inline-asm-special-strings.ll (added)
+++ llvm/trunk/test/CodeGen/Generic/inline-asm-special-strings.ll Tue Mar 10 00:37:13 2009
@@ -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
+}





More information about the llvm-commits mailing list