]> granicus.if.org Git - clang/commitdiff
[ms-inline asm] Perform symbol table lookup on variables. The idea is to use
authorChad Rosier <mcrosier@apple.com>
Thu, 16 Aug 2012 19:52:25 +0000 (19:52 +0000)
committerChad Rosier <mcrosier@apple.com>
Thu, 16 Aug 2012 19:52:25 +0000 (19:52 +0000)
this information to determine valid MC operands.  This will also be used for
semantic analysis.

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

lib/Sema/SemaStmt.cpp

index 5bd5c8a96b25bd113a3bc8c62e06f1169f807c61..49d1cae03ae9fbdd3821428b334511b6516c8c66 100644 (file)
@@ -2824,7 +2824,8 @@ static void patchMSAsmStrings(Sema &SemaRef, bool &IsSimple,
       break;
     }
     case tok::identifier: {
-      StringRef Name = AsmToks[i].getIdentifierInfo()->getName();
+      IdentifierInfo *II = AsmToks[i].getIdentifierInfo();
+      StringRef Name = II->getName();
 
       // Valid register?
       if (TI.isValidGCCRegisterName(Name)) {
@@ -2841,16 +2842,37 @@ static void patchMSAsmStrings(Sema &SemaRef, bool &IsSimple,
         break;
       }
 
-      // Not a register, so this must be a variable, function or label
-      // reference.  Track these as they are either an Input or an Output.
-      // Unfortunately, we don't know which is which until after we feed
-      // the patched asms to the AsmParser.
-      AsmNames[NumAsmStrings].set(i);
+      // Lookup the identifier.
+      // TODO: Someone with more experience with clang should verify this the
+      // proper way of doing a symbol lookup.
+      DeclarationName DeclName(II);
+      Scope *CurScope = SemaRef.getCurScope();
+      LookupResult R(SemaRef, DeclName, AsmLoc, Sema::LookupOrdinaryName);
+      if (!SemaRef.LookupName(R, CurScope, false/*AllowBuiltinCreation*/))
+        break;
 
-      // TODO: Lookup the identifier and patch appropriately.
+      assert (R.isSingleResult() && "Expected a single result?!");
+      NamedDecl *Decl = R.getFoundDecl();
+      switch (Decl->getKind()) {
+      default:
+        assert(0 && "Unknown decl kind.");
+        break;
+      case Decl::Var: {
+      case Decl::ParmVar:
+        AsmNames[NumAsmStrings].set(i);
+
+        VarDecl *Var = cast<VarDecl>(Decl);
+        QualType Ty = Var->getType();
+        (void)Ty; // Avoid warning.
+        // TODO: Patch identifier with valid operand.  One potential idea is to
+        // probe the backend with type information to guess the possible
+        // operand.
+        break;
+      }
+      }
       break;
     }
-    } // AsmToks[i].getKind()
+    }
   }
 
   // Emit the final (and possibly only) asm string.