]> granicus.if.org Git - clang/commitdiff
Change TargetInfo::validateInputConstraint to take begin/end name iterators instead...
authorAnders Carlsson <andersca@mac.com>
Sat, 17 Jan 2009 23:36:15 +0000 (23:36 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 17 Jan 2009 23:36:15 +0000 (23:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62433 91177308-0d34-0410-b5e6-96231b3b80d8

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

index a8eed16a6b35d8b4942094f8546e01e4700b8320..c46ae775c83ae594f6d9bbe70ba8f8f5a7749e24 100644 (file)
@@ -944,6 +944,16 @@ public:
   const_outputs_iterator begin_outputs() const { return &Exprs[0]; }
   const_outputs_iterator end_outputs() const { return &Exprs[0] + NumOutputs; }
   
+  // Input name iterator.
+  
+  const std::string *begin_output_names() const {
+    return &Names[0];
+  }
+  
+  const std::string *end_output_names() const {
+    return &Names[0] + NumOutputs;
+  }
+  
   // Child iterators  
   
   virtual child_iterator child_begin();
index a9a71367bce11dee4bc0eb64edfc321a92771827..ce7f7daeb9c308b308e01b42fe1d24558c4fed86 100644 (file)
@@ -198,8 +198,10 @@ public:
   // a constraint is valid and provides information about it.
   // FIXME: These should return a real error instead of just true/false.
   bool validateOutputConstraint(const char *Name, ConstraintInfo &Info) const;
-  bool validateInputConstraint (const char *Name, unsigned NumOutputs,
-                                ConstraintInfo &info) const;
+  bool validateInputConstraint(const char *Name, 
+                               const std::string *OutputNamesBegin,
+                               const std::string *OutputNamesEnd,
+                               ConstraintInfo &info) const;
 
   virtual std::string convertConstraint(const char Constraint) const {
     return std::string(1, Constraint);
index 05004b73053683298f8618ba70d6489ae4cc1ff1..89bc8b4c8f9db2a644b5a19410e51eb08fea4a95 100644 (file)
@@ -188,7 +188,8 @@ bool TargetInfo::validateOutputConstraint(const char *Name,
 }
 
 bool TargetInfo::validateInputConstraint(const char *Name,
-                                         unsigned NumOutputs,
+                                         const std::string *OutputNamesBegin,
+                                         const std::string *OutputNamesEnd,
                                          ConstraintInfo &info) const {
   info = CI_None;
 
@@ -197,8 +198,9 @@ bool TargetInfo::validateInputConstraint(const char *Name,
     default:
       // Check if we have a matching constraint
       if (*Name >= '0' && *Name <= '9') {
+        unsigned NumOutputs = OutputNamesEnd - OutputNamesBegin;
         unsigned i = *Name - '0';
-        
+  
         // Check if matching constraint is out of bounds.
         if (i >= NumOutputs)
           return false;
index edccbe41bfd5f2b4e247ea1e6015bc7336cb8237..d86c3f4389110ed609fdd1b6e7518aa9acf91598 100644 (file)
@@ -977,7 +977,9 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
     
     TargetInfo::ConstraintInfo Info;
     bool result = Target.validateInputConstraint(InputConstraint.c_str(),
-                                                 NumConstraints, Info);
+                                                 S.begin_output_names(),
+                                                 S.end_output_names(),
+                                                 Info);
     assert(result && "Failed to parse input constraint"); result=result;
     
     if (i != 0 || S.getNumOutputs() > 0)
index 7a41f4d976a840083860f3f28f052f6631caf514..cb467d41d8b46e80d32d80be79d87dc941009f1c 100644 (file)
@@ -897,7 +897,8 @@ Sema::StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
     
     TargetInfo::ConstraintInfo info;
     if (!Context.Target.validateInputConstraint(InputConstraint.c_str(),
-                                                NumOutputs, info)) {
+                                                &Names[0],
+                                                &Names[0] + NumOutputs, info)) {
       // FIXME: We currently leak memory here.
       return Diag(Literal->getLocStart(),
                   diag::err_asm_invalid_input_constraint) << InputConstraint;