]> granicus.if.org Git - clang/commitdiff
add plumbing to report diagnostics back through sema for malformed asmstrings.
authorChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 23:41:04 +0000 (23:41 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 23:41:04 +0000 (23:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66598 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Stmt.h
lib/AST/Stmt.cpp
lib/CodeGen/CGStmt.cpp
lib/Sema/SemaStmt.cpp

index 513c5d9556a716571a79af3224d0b1c665951237..d87cee05661f6d362b2242d9d3b6954a1bd9c5de 100644 (file)
@@ -973,8 +973,8 @@ public:
   /// true, otherwise return false.  This handles canonicalization and
   /// translation of strings from GCC syntax to LLVM IR syntax, and handles
   //// flattening of named references like %[foo] to Operand AsmStringPiece's. 
-  bool AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece> &Pieces,
-                        ASTContext &C) const;
+  unsigned AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece> &Pieces,
+                            ASTContext &C, unsigned &DiagOffs) const;
   
   
   //===--- Output operands ---===//
index 5335deba333fe8584d65fba1a792fea6dd4a2ec7..6b583ee577a44439261bd4d13bb21f617fdb1509 100644 (file)
@@ -182,8 +182,8 @@ int AsmStmt::getNamedOperand(const std::string &SymbolicName) const {
 /// AnalyzeAsmString - Analyze the asm string of the current asm, decomposing
 /// it into pieces.  If the asm string is erroneous, emit errors and return
 /// true, otherwise return false.
-bool AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece> &Pieces,
-                               ASTContext &C) const {
+unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece>&Pieces,
+                                   ASTContext &C, unsigned &DiagOffs) const {
   const char *StrStart = getAsmString()->getStrData();
   const char *StrEnd = StrStart + getAsmString()->getByteLength();
   
index 26eb039d53b4f814518a5a9916da091335612fda..fddc547fd345568e1215566e305f424f7ea9be43 100644 (file)
@@ -756,7 +756,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
   // Analyze the asm string to decompose it into its pieces.  We know that Sema
   // has already done this, so it is guaranteed to be successful.
   llvm::SmallVector<AsmStmt::AsmStringPiece, 4> Pieces;
-  S.AnalyzeAsmString(Pieces, getContext());
+  unsigned DiagOffs;
+  S.AnalyzeAsmString(Pieces, getContext(), DiagOffs);
   
   // Assemble the pieces into the final asm string.
   std::string AsmString;
index fcc501c45d1b7f6f470eb4da1a558d1c207fd31a..55f556444dc8388480cfaa72718c3c5b69c9c8b1 100644 (file)
@@ -958,10 +958,24 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
   exprs.release();
   asmString.release();
   clobbers.release();
-  return Owned(new (Context) AsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
-                                     NumInputs, Names, Constraints, Exprs,
-                                     AsmString, NumClobbers,
-                                     Clobbers, RParenLoc));
+  AsmStmt *NS =
+    new (Context) AsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, NumInputs,
+                          Names, Constraints, Exprs, AsmString, NumClobbers,
+                          Clobbers, RParenLoc);
+  // Validate the asm string, ensuring it makes sense given the operands we
+  // have.
+  llvm::SmallVector<AsmStmt::AsmStringPiece, 8> Pieces;
+  unsigned DiagOffs;
+  if (unsigned DiagID = NS->AnalyzeAsmString(Pieces, Context, DiagOffs)) {
+    // FIXME: get offsets in strings working.
+    // StringLiteralParser::getOffsetOfStringByte
+    Diag(AsmString->getLocStart(), DiagID) << AsmString->getSourceRange();
+    DeleteStmt(NS);
+    return StmtError();
+  }
+  
+  
+  return Owned(NS);
 }
 
 Action::OwningStmtResult