[ms-inline asm] Update for r166433.
authorChad Rosier <mcrosier@apple.com>
Tue, 23 Oct 2012 17:44:40 +0000 (17:44 +0000)
committerChad Rosier <mcrosier@apple.com>
Tue, 23 Oct 2012 17:44:40 +0000 (17:44 +0000)
llvm-svn: 166489

clang/lib/Sema/SemaStmtAsm.cpp
clang/test/CodeGen/ms-inline-asm.c

index f33b87c..3a5f40c 100644 (file)
@@ -513,7 +513,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
   unsigned NumOutputs;
   unsigned NumInputs;
   std::string AsmStringIR;
-  SmallVector<void *, 4> OpDecls;
+  SmallVector<std::pair<void *, bool>, 4> OpDecls;
   SmallVector<std::string, 4> Constraints;
   SmallVector<std::string, 4> Clobbers;
   if (Parser->ParseMSInlineAsm(AsmLoc.getPtrEncoding(), AsmStringIR,
@@ -533,7 +533,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
   ConstraintRefs.resize(NumExprs);
   Exprs.resize(NumExprs);
   for (unsigned i = 0, e = NumExprs; i != e; ++i) {
-    NamedDecl *OpDecl = static_cast<NamedDecl *>(OpDecls[i]);
+    NamedDecl *OpDecl = static_cast<NamedDecl *>(OpDecls[i].first);
     if (!OpDecl)
       return StmtError();
 
@@ -542,7 +542,12 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
                                                  OpDecl);
     if (OpExpr.isInvalid())
       return StmtError();
-    
+
+    // Need offset of variable.
+    if (OpDecls[i].second)
+      OpExpr = BuildUnaryOp(getCurScope(), AsmLoc, clang::UO_AddrOf,
+                            OpExpr.take());
+
     Names[i] = OpDecl->getIdentifier();
     ConstraintRefs[i] = StringRef(Constraints[i]);
     Exprs[i] = OpExpr.take();
index 90d05a4..83cabcc 100644 (file)
@@ -144,4 +144,5 @@ void t15() {
   __asm mov eax, offset var ; eax = address of myvar
 // CHECK: t15
 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
+// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
 }