OSDN Git Service

[ms-inline asm] Emit the (new) inline asm Non-Standard Dialect attribute.
authorChad Rosier <mcrosier@apple.com>
Wed, 5 Sep 2012 00:08:17 +0000 (00:08 +0000)
committerChad Rosier <mcrosier@apple.com>
Wed, 5 Sep 2012 00:08:17 +0000 (00:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163181 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LangRef.html
lib/AsmParser/LLParser.cpp
lib/AsmParser/LLToken.h
lib/VMCore/AsmWriter.cpp

index 01acce8..0699857 100644 (file)
@@ -2894,8 +2894,19 @@ call void asm sideeffect "eieio", ""()
 call void asm alignstack "eieio", ""()
 </pre>
 
-<p>If both keywords appear the '<tt>sideeffect</tt>' keyword must come
-   first.</p>
+<p>Inline asms also support using non-standard assembly dialects.  The standard
+   dialect is ATT, which is assumed when the '<tt>nsdialect</tt>' keyword is not
+   present.  When the '<tt>nsdialect</tt>' keyword is present, the dialect is
+   assumed to be Intel.  Currently, ATT and Intel are the only supported
+   dialects.  An example is:</p>
+
+<pre class="doc_code">
+call void asm nsdialect "eieio", ""()
+</pre>
+
+<p>If multiple keywords appear the '<tt>sideeffect</tt>' keyword must come
+   first, the '<tt>alignstack</tt>' keyword second and the
+   '<tt>nsdialect</tt>' keyword last.</p>
 
 <!--
 <p>TODO: The format of the asm and constraints string still need to be
index 271691b..30c5596 100644 (file)
@@ -2069,16 +2069,18 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
 
   case lltok::kw_asm: {
     // ValID ::= 'asm' SideEffect? AlignStack? STRINGCONSTANT ',' STRINGCONSTANT
-    bool HasSideEffect, AlignStack;
+    bool HasSideEffect, AlignStack, NSDialect;
     Lex.Lex();
     if (ParseOptionalToken(lltok::kw_sideeffect, HasSideEffect) ||
         ParseOptionalToken(lltok::kw_alignstack, AlignStack) ||
+        ParseOptionalToken(lltok::kw_nsdialect, NSDialect) ||
         ParseStringConstant(ID.StrVal) ||
         ParseToken(lltok::comma, "expected comma in inline asm expression") ||
         ParseToken(lltok::StringConstant, "expected constraint string"))
       return true;
     ID.StrVal2 = Lex.getStrVal();
-    ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack)<<1);
+    ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack)<<1) |
+      (unsigned(NSDialect)<<2);
     ID.Kind = ValID::t_InlineAsm;
     return false;
   }
@@ -2495,7 +2497,8 @@ bool LLParser::ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V,
       PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
     if (!FTy || !InlineAsm::Verify(FTy, ID.StrVal2))
       return Error(ID.Loc, "invalid type for inline asm constraint string");
-    V = InlineAsm::get(FTy, ID.StrVal, ID.StrVal2, ID.UIntVal&1, ID.UIntVal>>1);
+    V = InlineAsm::get(FTy, ID.StrVal, ID.StrVal2, ID.UIntVal&1,
+                       (ID.UIntVal>>1)&1, (ID.UIntVal>>2)&1);
     return false;
   }
   case ValID::t_MDNode:
index c2683ff..2cea1bb 100644 (file)
@@ -72,6 +72,7 @@ namespace lltok {
     kw_asm,
     kw_sideeffect,
     kw_alignstack,
+    kw_nsdialect,
     kw_gc,
     kw_c,
 
index c09c69b..f937ebd 100644 (file)
@@ -1029,6 +1029,8 @@ static void WriteAsOperandInternal(raw_ostream &Out, const Value *V,
       Out << "sideeffect ";
     if (IA->isAlignStack())
       Out << "alignstack ";
+    if (IA->getDialect() != 0)
+      Out << "nsdialect ";
     Out << '"';
     PrintEscapedString(IA->getAsmString(), Out);
     Out << "\", \"";