]> granicus.if.org Git - clang/commitdiff
reduce duplication of parsing code between %0 and %x0 and
authorChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 06:38:02 +0000 (06:38 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 06:38:02 +0000 (06:38 +0000)
add support for modifiers on named references, like %c[foo].

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66532 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGStmt.cpp
test/CodeGen/asm.c

index 93c4f5b07d7d202eeb52027563d4fa5197030f90..1aa62e7e0368fa56f0bff4ba7127e2ffd709abe5 100644 (file)
@@ -739,31 +739,27 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
       continue;
     }
     
+    // Handle %x4 and %x[foo] by capturing x as the modifier character.
+    char Modifier = '\0';
+    if (isalpha(EscapedChar)) {
+      Modifier = EscapedChar;
+      EscapedChar = *StrStart++;
+    }
+    
     if (isdigit(EscapedChar)) {
       // %n - Assembler operand n
       char *End;
       unsigned long N = strtoul(StrStart-1, &End, 10);
       assert(End != StrStart-1 && "We know that EscapedChar is a digit!");
-      
-      // FIXME: This should be caught during Sema.
-      assert(N < NumOperands && "Operand number out of range!");
-      
-      Result += '$' + llvm::utostr(N);
       StrStart = End;
-      continue;
-    }
-    
-    if (isalpha(EscapedChar)) {
-      char *End;
-      // Skip the single letter escape and read the number, e.g. "%x4".
-      unsigned long N = strtoul(StrStart, &End, 10);
-      // FIXME: This should be caught during Sema.
-      assert(End != StrStart && "Missing operand!");
+      
       // FIXME: This should be caught during Sema.
       assert(N < NumOperands && "Operand number out of range!");
       
-      Result += "${" + llvm::utostr(N) + ':' + EscapedChar + '}';
-      StrStart = End;
+      if (Modifier == '\0')
+        Result += '$' + llvm::utostr(N);
+      else
+        Result += "${" + llvm::utostr(N) + ':' + Modifier + '}';
       continue;
     }
     
@@ -776,10 +772,13 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
       std::string SymbolicName(StrStart, NameEnd);
       StrStart = NameEnd+1;
       
-      int OperandIndex = S.getNamedOperand(SymbolicName);
-      assert(OperandIndex != -1 && "FIXME: Catch in Sema.");
+      int N = S.getNamedOperand(SymbolicName);
+      assert(N != -1 && "FIXME: Catch in Sema.");
 
-      Result += '$' + llvm::utostr(unsigned(OperandIndex));
+      if (Modifier == '\0')
+        Result += '$' + llvm::utostr(N);
+      else
+        Result += "${" + llvm::utostr(N) + ':' + Modifier + '}';
       continue;
     }
      
index 4e6ff4da90fdbeedaecc5f583dbe8782a941e323..99655f8bb7c438bd58561a16f468fdf0a029c1a0 100644 (file)
@@ -31,4 +31,9 @@ void t6(void) {
 // RUN: grep "T7 NAMED: \$2" %t
 void t7(int a) {
   __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
-}
\ No newline at end of file
+}
+
+// RUN: grep "T8 NAMED MODIFIER: \${0:c}" %t
+void t8() {
+  __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
+}