represent indirect operands explicitly in inline asm strings.
authorChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2007 01:02:58 +0000 (01:02 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2007 01:02:58 +0000 (01:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36522 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/InlineAsm.h
lib/VMCore/InlineAsm.cpp

index 1ba791c472ed043ab3b95d4839bb8ae5894735f2..20c184ac2e7106e227bcd6c24902df8d3f0d62c1 100644 (file)
@@ -85,10 +85,6 @@ public:
     /// read.  This is only ever set for an output operand.
     bool isEarlyClobber; 
     
-    /// isIndirectOutput - If this is true for an output constraint, the address
-    /// to store the output result is passed as an operand to the call.
-    bool isIndirectOutput;
-    
     /// hasMatchingInput - This is set to true for an output constraint iff
     /// there is an input constraint that is required to match it (e.g. "0").
     bool hasMatchingInput;
@@ -97,11 +93,17 @@ public:
     /// with the next operand.
     bool isCommutative;
     
+    /// isIndirect - True if this operand is an indirect operand.  This means
+    /// that the address of the source or destination is present in the call
+    /// instruction, instead of it being returned or passed in explicitly.  This
+    /// is represented with a '*' in the asm string.
+    bool isIndirect;
+    
     /// Code - The constraint code, either the register name (in braces) or the
     /// constraint letter/number.
     std::vector<std::string> Codes;
     
-    /// Parse - Analyze the specified string (e.g. "==&{eax}") and fill in the
+    /// Parse - Analyze the specified string (e.g. "=*&{eax}") and fill in the
     /// fields in this structure.  If the constraint string is not understood,
     /// return true, otherwise return false.
     bool Parse(const std::string &Str, 
index 5f05137459899aa22a47d50dfa3358896ecdacfb..ca4ecad058c058ffea5fb897230cb5801800040c 100644 (file)
@@ -55,21 +55,22 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str,
   // Initialize
   Type = isInput;
   isEarlyClobber = false;
-  isIndirectOutput = false;
   hasMatchingInput = false;
   isCommutative = false;
+  isIndirect = false;
   
-  // Parse the prefix.
+  // Parse prefixes.
   if (*I == '~') {
     Type = isClobber;
     ++I;
   } else if (*I == '=') {
     ++I;
     Type = isOutput;
-    if (I != E && *I == '=') {
-      isIndirectOutput = true;
-      ++I;
-    }
+  }
+  
+  if (*I == '*') {
+    isIndirect = true;
+    ++I;
   }
   
   if (I == E) return true;  // Just a prefix, like "==" or "~".
@@ -184,12 +185,12 @@ bool InlineAsm::Verify(const FunctionType *Ty, const std::string &ConstStr) {
   for (unsigned i = 0, e = Constraints.size(); i != e; ++i) {
     switch (Constraints[i].Type) {
     case InlineAsm::isOutput:
-      if (!Constraints[i].isIndirectOutput) {
+      if (!Constraints[i].isIndirect) {
         if (NumInputs || NumClobbers) return false;  // outputs come first.
         ++NumOutputs;
         break;
       }
-      // FALLTHROUGH for IndirectOutputs.
+      // FALLTHROUGH for Indirect Outputs.
     case InlineAsm::isInput:
       if (NumClobbers) return false;               // inputs before clobbers.
       ++NumInputs;