Check that the clobber registers are valid.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44311 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaStmt.cpp b/Sema/SemaStmt.cpp
index d99356e..7f5d038 100644
--- a/Sema/SemaStmt.cpp
+++ b/Sema/SemaStmt.cpp
@@ -16,8 +16,10 @@
 #include "clang/AST/Expr.h"
 #include "clang/AST/Stmt.h"
 #include "clang/Parse/Scope.h"
+#include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/LangOptions.h"
+#include "llvm/ADT/SmallString.h"
 using namespace clang;
 
 Sema::StmtResult Sema::ActOnExprStmt(ExprTy *expr) {
@@ -691,6 +693,25 @@
     }
   }
   
+  // Check that the clobbers are valid.
+  for (unsigned i = 0; i < NumClobbers; i++) {
+    StringLiteral *Literal = cast<StringLiteral>((Expr *)Clobbers[i]);
+    assert(!Literal->isWide() && "Clobber strings should not be wide!");
+    
+    llvm::SmallString<16> Clobber(Literal->getStrData(), 
+                                  Literal->getStrData() + 
+                                  Literal->getByteLength());
+    
+    if (!Context.Target.isValidGCCRegisterName(Clobber.c_str())) {
+      Diag(Literal->getLocStart(),
+           diag::err_unknown_register_name_in_asm,
+           Clobber.c_str());
+      
+      // FIXME: We currently leak memory here.
+      return true;
+    }
+  }
+  
   return new AsmStmt(AsmLoc,
                      IsVolatile,
                      NumOutputs,