diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-10-23 17:44:40 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-10-23 17:44:40 +0000 |
commit | b8097dec8fa62d7d930c7375e1373bf1fbd714bc (patch) | |
tree | 7f13ec82c1ae16f317af068afb33692532711b22 /clang | |
parent | 37e755cee2c84994ffc1f06bb89cb246fe4a1171 (diff) | |
download | bcm5719-llvm-b8097dec8fa62d7d930c7375e1373bf1fbd714bc.tar.gz bcm5719-llvm-b8097dec8fa62d7d930c7375e1373bf1fbd714bc.zip |
[ms-inline asm] Update for r166433.
llvm-svn: 166489
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 11 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm.c | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index f33b87cebcc..3a5f40c74fa 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -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(); diff --git a/clang/test/CodeGen/ms-inline-asm.c b/clang/test/CodeGen/ms-inline-asm.c index 90d05a4e70c..83cabcc6f4f 100644 --- a/clang/test/CodeGen/ms-inline-asm.c +++ b/clang/test/CodeGen/ms-inline-asm.c @@ -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 } |