diff options
| author | Eric Christopher <echristo@apple.com> | 2011-06-28 18:20:53 +0000 |
|---|---|---|
| committer | Eric Christopher <echristo@apple.com> | 2011-06-28 18:20:53 +0000 |
| commit | fd9a5f4f66447e04c439bd7b22224ee3bbb2acce (patch) | |
| tree | d450c3af091cd33ce9e60f7f1a52080bb8bfd558 | |
| parent | b26d578b417aa94eba4ddbd2e23865f9a9ae6f4e (diff) | |
| download | bcm5719-llvm-fd9a5f4f66447e04c439bd7b22224ee3bbb2acce.tar.gz bcm5719-llvm-fd9a5f4f66447e04c439bd7b22224ee3bbb2acce.zip | |
Split out logic for valid clobbers and valid inline asm registers.
Fixes rdar://9281377
llvm-svn: 134016
| -rw-r--r-- | clang/include/clang/Basic/TargetInfo.h | 5 | ||||
| -rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGStmt.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 3 | ||||
| -rw-r--r-- | clang/test/Sema/asm.c | 4 |
5 files changed, 19 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index a1625bfc9e8..4559cf2f64b 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -303,6 +303,11 @@ public: /// __builtin_va_list, which is target-specific. virtual const char *getVAListDeclaration() const = 0; + /// isValidClobber - Returns whether the passed in string is + /// a valid clobber in an inline asm statement. This is used by + /// Sema. + bool isValidClobber(llvm::StringRef Name) const; + /// isValidGCCRegisterName - Returns whether the passed in string /// is a valid register name according to GCC. This is used by Sema for /// inline asm statements. diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 2d4c4a97916..30a9bdb3177 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -181,6 +181,14 @@ static llvm::StringRef removeGCCRegisterPrefix(llvm::StringRef Name) { return Name; } +/// isValidClobber - Returns whether the passed in string is +/// a valid clobber in an inline asm statement. This is used by +/// Sema. +bool TargetInfo::isValidClobber(llvm::StringRef Name) const { + return (isValidGCCRegisterName(Name) || + Name == "memory" || Name == "cc"); +} + /// isValidGCCRegisterName - Returns whether the passed in string /// is a valid register name according to GCC. This is used by Sema for /// inline asm statements. @@ -194,9 +202,6 @@ bool TargetInfo::isValidGCCRegisterName(llvm::StringRef Name) const { // Get rid of any register prefix. Name = removeGCCRegisterPrefix(Name); - if (Name == "memory" || Name == "cc") - return true; - getGCCRegNames(Names, NumNames); // If we have a number it maps to an entry in the register name array. diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index f5bd56efb25..5d5ab2f97aa 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -1558,6 +1558,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { for (unsigned i = 0, e = S.getNumClobbers(); i != e; i++) { llvm::StringRef Clobber = S.getClobber(i)->getString(); + if (Clobber != "memory" && Clobber != "cc") Clobber = Target.getNormalizedGCCRegisterName(Clobber); if (i != 0 || NumConstraints != 0) diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 0ba4f99abce..75124c19084 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -1990,7 +1990,7 @@ StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, bool IsSimple, llvm::StringRef Clobber = Literal->getString(); - if (!Context.Target.isValidGCCRegisterName(Clobber)) + if (!Context.Target.isValidClobber(Clobber)) return StmtError(Diag(Literal->getLocStart(), diag::err_asm_unknown_register_name) << Clobber); } @@ -2350,4 +2350,3 @@ Sema::ActOnSEHFinallyBlock(SourceLocation Loc, assert(Block); return Owned(SEHFinallyStmt::Create(Context,Loc,Block)); } - diff --git a/clang/test/Sema/asm.c b/clang/test/Sema/asm.c index d8161c819b9..a3313cad2b4 100644 --- a/clang/test/Sema/asm.c +++ b/clang/test/Sema/asm.c @@ -113,3 +113,7 @@ void test11(void) { _Bool b; asm volatile ("movb %%gs:%P2,%b0" : "=q"(b) : "0"(0), "i"(5L)); } + +void test12(void) { + register int cc __asm ("cc"); // expected-error{{unknown register name 'cc' in asm}} +} |

