From 282d675b28783254b06f2fbb2f96d3b41e273c6a Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Thu, 24 Jan 2013 20:24:34 +0000 Subject: [PATCH] [ms-inline asm] Add an error when trying to compile MS-style inline assembly for an unsupported architecture. rdar://13063988 llvm-svn: 173364 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaStmtAsm.cpp | 11 +++++++++-- clang/test/Sema/ms-inline-asm-invalid-arch.c | 5 +++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 clang/test/Sema/ms-inline-asm-invalid-arch.c diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b9d0c98..74f9b48 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -5241,6 +5241,8 @@ let CategoryName = "Inline Assembly Issue" in { "invalid use of a cast in a inline asm context requiring an l-value: " "remove the cast or build with -fheinous-gnu-extensions">; def err_inline_ms_asm_parsing : Error<"%0">; + def err_msasm_unsupported_arch : Error< + "Unsupported architecture '%0' for MS-style inline assembly">; def warn_asm_label_on_auto_decl : Warning< "ignored asm label '%0' on automatic variable">; diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index 4646ef7..5624a54 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -580,8 +580,15 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, SmallVector Exprs; SmallVector ClobberRefs; + llvm::Triple TheTriple = Context.getTargetInfo().getTriple(); + llvm::Triple::ArchType ArchTy = TheTriple.getArch(); + bool UnsupportedArch = ArchTy != llvm::Triple::x86 && + ArchTy != llvm::Triple::x86_64; + if (UnsupportedArch) + Diag(AsmLoc, diag::err_msasm_unsupported_arch) << TheTriple.getArchName(); + // Empty asm statements don't need to instantiate the AsmParser, etc. - if (AsmToks.empty()) { + if (UnsupportedArch || AsmToks.empty()) { StringRef EmptyAsmStr; MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, /*IsSimple*/ true, @@ -598,7 +605,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, // Get the target specific parser. std::string Error; - const std::string &TT = Context.getTargetInfo().getTriple().getTriple(); + const std::string &TT = TheTriple.getTriple(); const llvm::Target *TheTarget(llvm::TargetRegistry::lookupTarget(TT, Error)); OwningPtr MAI(TheTarget->createMCAsmInfo(TT)); diff --git a/clang/test/Sema/ms-inline-asm-invalid-arch.c b/clang/test/Sema/ms-inline-asm-invalid-arch.c new file mode 100644 index 0000000..0870fcb --- /dev/null +++ b/clang/test/Sema/ms-inline-asm-invalid-arch.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 %s -triple powerpc64-unknown-linux-gnu -fasm-blocks -verify -fsyntax-only + +void f() { + __asm nop // expected-error {{Unsupported architecture 'powerpc64' for MS-style inline assembly}} +} -- 2.7.4