]> granicus.if.org Git - clang/commitdiff
If we have mismatched integer tied operands, but the operand
authorChris Lattner <sabre@nondot.org>
Sun, 3 May 2009 07:04:21 +0000 (07:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 3 May 2009 07:04:21 +0000 (07:04 +0000)
number is not mentioned in the asm string, let it past sema.
Right now these are currently rejected by the llvm code generator
but this will be fixed next.

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

lib/Sema/SemaStmt.cpp
test/Sema/asm.c

index 02f6840415c46d08a9eb33444c05946bec44bd9b..d1246d28b6d3f95cd99c8d1a9fa395a478708c24 100644 (file)
@@ -1039,7 +1039,7 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
     if (!Info.hasTiedOperand()) continue;
     
     unsigned TiedTo = Info.getTiedOperand();
-    Expr *OutputExpr     = Exprs[TiedTo];
+    Expr *OutputExpr = Exprs[TiedTo];
     Expr *InputExpr = Exprs[i+NumOutputs];
     QualType InTy = InputExpr->getType();
     QualType OutTy = OutputExpr->getType();
@@ -1055,6 +1055,25 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
       // int*.
       if (Context.getTypeSize(OutTy) == Context.getTypeSize(InTy))
         continue;
+      
+      // If the input and output operands are not mentioned in the asm string,
+      // then we can promote them and the asm string won't notice.  Check this
+      // case now.
+      bool MentionedInput = false;
+      bool MentionedOutput = false;
+      for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {
+        if (!Pieces[i].isOperand()) continue;
+        MentionedInput |= Pieces[i].getOperandNo() == i+NumOutputs;
+        MentionedOutput |= Pieces[i].getOperandNo() == TiedTo;
+      }
+      
+      // If neither the input nor the output was mentioned in the asm string,
+      // and if the output was a register, just extend the shorter one to the
+      // size of the larger one.
+      // TODO: if only the larger one is mentioned, we could also support this.
+      if (!MentionedInput && !MentionedOutput &&
+          OutputConstraintInfos[TiedTo].allowsRegister())
+        continue;
     }
     
     Diag(InputExpr->getLocStart(),
index 602b77388a69210b81024714d4b6f720498cb58e..cc25fd89b0c256ae4842efb04b295bd2a5ce720b 100644 (file)
@@ -73,6 +73,6 @@ void asm_string_tests(int i) {
 // PR4077
 int test7(unsigned long long b) {
   int a;
-  asm volatile("foo " : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}}
+  asm volatile("foo %0 %1" : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}}
   return a;
 }