[cfe-commits] r165752 - in /cfe/trunk: lib/Sema/SemaStmtAsm.cpp test/CodeGen/ms-inline-asm.c

Aaron Ballman aaron at aaronballman.com
Thu Oct 11 15:31:28 PDT 2012


On Thu, Oct 11, 2012 at 6:23 PM, Chad Rosier <mcrosier at apple.com> wrote:
> I was going to put them back in with the implementation that supports them..

Ultimately, I think it's fine either way.  I just worry about them
being put back slightly differently (introducing varied behavior)
instead of expecting the tests to fail while the implementation is
happening.

~Aaron

>
>  Chad
>
> On Oct 11, 2012, at 3:21 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
>
>> This patch mostly makes sense to me, but I'm wondering why the test
>> cases are removed instead of temporarily XFAILed?  Are they simply no
>> longer valid?
>>
>> ~Aaron
>>
>> On Thu, Oct 11, 2012 at 5:44 PM, Chad Rosier <mcrosier at apple.com> wrote:
>>> Author: mcrosier
>>> Date: Thu Oct 11 16:44:41 2012
>>> New Revision: 165752
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=165752&view=rev
>>> Log:
>>> [ms-inline asm] Remove a bunch of parsing code from the front-end, which will be
>>> reimplemented in the AsmParser where it belongs.
>>>
>>> Modified:
>>>    cfe/trunk/lib/Sema/SemaStmtAsm.cpp
>>>    cfe/trunk/test/CodeGen/ms-inline-asm.c
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaStmtAsm.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAsm.cpp?rev=165752&r1=165751&r2=165752&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaStmtAsm.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaStmtAsm.cpp Thu Oct 11 16:44:41 2012
>>> @@ -331,28 +331,6 @@
>>>   return Ret;
>>> }
>>>
>>> -// Check to see if the expression is a substring of the asm operand.
>>> -static StringRef getMSInlineAsmExprName(StringRef Name) {
>>> -  // Strip off the size directives.
>>> -  // E.g., DWORD PTR [V] -> V
>>> -  if (Name.startswith("BYTE") || Name.startswith("byte") ||
>>> -      Name.startswith("WORD") || Name.startswith("word") ||
>>> -      Name.startswith("DWORD") || Name.startswith("dword") ||
>>> -      Name.startswith("QWORD") || Name.startswith("qword") ||
>>> -      Name.startswith("XWORD") || Name.startswith("xword") ||
>>> -      Name.startswith("XMMWORD") || Name.startswith("xmmword") ||
>>> -      Name.startswith("YMMWORD") || Name.startswith("ymmword")) {
>>> -    std::pair< StringRef, StringRef > SplitName = Name.split(' ');
>>> -    assert((SplitName.second.startswith("PTR") ||
>>> -            SplitName.second.startswith("ptr")) &&
>>> -           "Expected PTR/ptr!");
>>> -    SplitName = SplitName.second.split('[');
>>> -    SplitName = SplitName.second.split(']');
>>> -    return SplitName.first;
>>> -  }
>>> -  return Name;
>>> -}
>>> -
>>> // getSpelling - Get the spelling of the AsmTok token.
>>> static StringRef getSpelling(Sema &SemaRef, Token AsmTok) {
>>>   StringRef Asm;
>>> @@ -387,8 +365,7 @@
>>>       return false;
>>>
>>>   for (unsigned i = 1, e = Pieces.size(); i != e; ++i) {
>>> -    StringRef Op = getMSInlineAsmExprName(Pieces[i]);
>>> -    if (!TI.isValidGCCRegisterName(Op))
>>> +    if (!TI.isValidGCCRegisterName(Pieces[i]))
>>>       return false;
>>>   }
>>>   return true;
>>> @@ -604,13 +581,7 @@
>>>       }
>>>
>>>       // Expr/Input or Output.
>>> -      StringRef Name = getMSInlineAsmExprName(Pieces[StrIdx][i]);
>>> -
>>> -      // The expr may be a register.
>>> -      // E.g., DWORD PTR [eax]
>>> -      if (Context.getTargetInfo().isValidGCCRegisterName(Name))
>>> -        continue;
>>> -
>>> +      StringRef Name = Pieces[StrIdx][i];
>>>       if (IdentifierInfo *II = &Context.Idents.get(Name)) {
>>>         CXXScopeSpec SS;
>>>         UnqualifiedId Id;
>>> @@ -669,26 +640,6 @@
>>>         Pieces[StrIdx][j] = OutputExprNames[i];
>>>         break;
>>>       }
>>> -      // Check to see if the expression is a substring of the asm piece.
>>> -      std::pair< StringRef, StringRef > Split =        Pieces[StrIdx][j].split(' ');
>>> -      bool isKeyword = llvm::StringSwitch<bool>(Split.first)
>>> -        .Cases("BYTE", "byte", "WORD", "word", "DWORD", true)
>>> -        .Cases("dword", "QWORD", "qword", "XWORD", "xword", true)
>>> -        .Cases("XMMWORD", "xmmword", "YMMWORD", "ymmword", true)
>>> -        .Default(false);
>>> -      if (isKeyword &&
>>> -          Split.second.find_first_of(OutputExprNames[i]) != StringRef::npos) {
>>> -        // Is is a substring, do the replacement.
>>> -        SmallString<32> Res;
>>> -        llvm::raw_svector_ostream OS(Res);
>>> -        OS << '$' << OpNum;
>>> -        std::string piece = Pieces[StrIdx][j].str();
>>> -        size_t found = piece.find(InputExprNames[i]);
>>> -        piece.replace(found, InputExprNames[i].size(), OS.str());
>>> -        OutputExprNames[i] = piece;
>>> -        Pieces[StrIdx][j] = OutputExprNames[i];
>>> -        break;
>>> -      }
>>>     }
>>>   }
>>>   for (unsigned i = 0, e = InputExprNames.size(); i != e; ++i, ++OpNum) {
>>> @@ -704,26 +655,6 @@
>>>         Pieces[StrIdx][j] = InputExprNames[i];
>>>         break;
>>>       }
>>> -      // Check to see if the expression is a substring of the asm piece.
>>> -      std::pair< StringRef, StringRef > Split =        Pieces[StrIdx][j].split(' ');
>>> -      bool isKeyword = llvm::StringSwitch<bool>(Split.first)
>>> -        .Cases("BYTE", "byte", "WORD", "word", "DWORD", true)
>>> -        .Cases("dword", "QWORD", "qword", "XWORD", "xword", true)
>>> -        .Cases("XMMWORD", "xmmword", "YMMWORD", "ymmword", true)
>>> -        .Default(false);
>>> -      if (isKeyword &&
>>> -          Split.second.find_first_of(InputExprNames[i]) != StringRef::npos) {
>>> -        // It is a substring, do the replacement.
>>> -        SmallString<32> Res;
>>> -        llvm::raw_svector_ostream OS(Res);
>>> -        OS << '$' << OpNum;
>>> -        std::string piece = Pieces[StrIdx][j].str();
>>> -        size_t found = piece.find(InputExprNames[i]);
>>> -        piece.replace(found, InputExprNames[i].size(), OS.str());
>>> -        InputExprNames[i] = piece;
>>> -        Pieces[StrIdx][j] = InputExprNames[i];
>>> -        break;
>>> -      }
>>>     }
>>>   }
>>>
>>>
>>> Modified: cfe/trunk/test/CodeGen/ms-inline-asm.c
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-inline-asm.c?rev=165752&r1=165751&r2=165752&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGen/ms-inline-asm.c (original)
>>> +++ cfe/trunk/test/CodeGen/ms-inline-asm.c Thu Oct 11 16:44:41 2012
>>> @@ -131,31 +131,7 @@
>>> // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
>>> }
>>>
>>> -void t15(void) {
>>> -  __asm mov eax, DWORD PTR [eax]
>>> -// CHECK: t15
>>> -// CHECK: call void asm sideeffect inteldialect "mov eax, DWORD PTR [eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
>>> -}
>>> -
>>> -void t16(unsigned V) {
>>> -  __asm mov eax, DWORD PTR [V]
>>> -// CHECK: t16
>>> -// CHECK: call void asm sideeffect inteldialect "mov eax, DWORD PTR [$0]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
>>> -}
>>> -
>>> -void t17(void) {
>>> -  __asm mov eax, dword ptr [eax]
>>> -// CHECK: t17
>>> -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
>>> -}
>>> -
>>> -void t18(void) {
>>> -  __asm mov dword ptr [eax], eax
>>> -// CHECK: t18
>>> -// CHECK: call void asm sideeffect inteldialect "mov dword ptr [eax], eax", "~{dirflag},~{fpsr},~{flags}"() nounwind
>>> -}
>>> -
>>> -unsigned t19(void) {
>>> +unsigned t15(void) {
>>>   unsigned i = 1, j, l = 1, m;
>>>   __asm {
>>>     mov eax, i
>>> @@ -164,6 +140,6 @@
>>>     mov m, eax
>>>   }
>>>   return j + m;
>>> -// CHECK: t19
>>> +// CHECK: t15
>>> // CHECK: call void asm sideeffect inteldialect "mov eax, $2\0A\09mov $0, eax\0A\09mov eax, $3\0A\09mov $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) nounwind
>>> }
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list