[cfe-commits] [Patch] CodeWarrior/MS-style inline assembly asm function

Chad Rosier mcrosier at apple.com
Fri Jan 11 14:37:35 PST 2013


Richard,
Upon further consideration, I've decided to no purse this feature after all.  Implementing this as a naked function with an asm block in the function body should suffice is most cases.

__declspec(naked) int foo(int x) {
  __asm {
    // do some assembly magic with x
  }
}

Regardless, thanks for the review/feedback, Richard.

 Chad

On Jan 7, 2013, at 4:32 PM, Chad Rosier <mcrosier at apple.com> wrote:

> Hi Richard,
> 
> On Jan 7, 2013, at 3:02 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> 
>> Hi Chad,
>> 
>> On Mon, Jan 7, 2013 at 12:52 PM, Chad Rosier <mcrosier at apple.com> wrote:
>>> All,
>>> The attached patch add support for CodeWarrior style asm functions.
>>> 
>>> static asm void t1() {
>>> mov eax, 0
>>> }
>>> 
>>> This is a WIP.  The current implementation only works when there is an additional function specifier (e.g., static, const) before the asm keyword.  The parser needs to be enhanced to differentiate between module-level assembly and asm functions.
>>> 
>>> module asm "inline asm here"
>>> 
>>> vs
>>> 
>>> __asm void t2() {
>>> mov eax, 0
>>> }
>> 
>> Can you provide a link to some documentation for this feature?
> 
> The documentation I've been looking at can be located here:
> http://faculty.petra.ac.id/indi/files/
> 
> Then click the "C++ and Assembly Language Reference.pdf" link.
> 
> Unfortunately, I don't think there's a great deal of documentation readily available.  For the most part I was planning on implementing what llvm-gcc supported.  I've also contacted Microsoft to see if they have any documentation; I didn't see any online.
> 
> I'll get back to you once I have more information.  Thanks again for the feedback, Richard.
> 
> Chad
> 
>> I have
>> lots of questions about how it is supposed to work... For instance,
>> can you declare variables in such a function? Can you apply the 'asm'
>> keyword to a declaration that is not the definition? (And if so, is
>> the definition also implicitly 'asm', even if it omits the keyword?)
>> Can an 'asm' function have a function-try-block? If it's a
>> constructor, can it have member initializers? Can it be defaulted or
>> deleted?
>> 
>> 
>> There's lots of this sort of thing in your patch:
>> 
>> -                               bool isStatic,
>> -                               StorageClass SCAsWritten,
>> -                               bool isInline,
>> -                               bool isConstexpr,
>> +                               bool isStatic, StorageClass SCAsWritten,
>> +                               bool isAsm, bool isInline, bool isConstexpr,
>> 
>> Please convert the is* flags on FunctionDecl and friends into an enum
>> first, as a separate commit. Sorry, this really isn't your problem,
>> but this is the proverbial straw that broke the camel's back... This
>> would also remove most of the noise from the patch.
> 
> Will do.
> 
>> 
>> --- include/clang/AST/Decl.h	(revision 171536)
>> +++ include/clang/AST/Decl.h	(working copy)
>> @@ -1470,6 +1470,7 @@
>>  // NOTE: VC++ treats enums as signed, avoid using the StorageClass enum
>>  unsigned SClass : 2;
>>  unsigned SClassAsWritten : 2;
>> +  bool IsAsmSpecified : 1;
>> 
>> You'll need to add serialization code for this flag.
>> 
>> +  /// Set whether the "asm" keyword was specified for this function.
>> +  void setAsmSpecified(bool I) { IsAsmSpecified = I; }
>> 
>> This function is unused, and seems unnecessary.
>> 
> 
> I'll remove it.
> 
>> 
>> --- lib/CodeGen/CodeGenFunction.cpp	(revision 171536)
>> +++ lib/CodeGen/CodeGenFunction.cpp	(working copy)
>> @@ -347,9 +347,21 @@
>>  CurFnInfo = &FnInfo;
>>  assert(CurFn->isDeclaration() && "Function already has body?");
>> 
>> +  // Mark the function as naked and noinline if this is an asm function.
>> +  bool IsAsmFunc = false;
>> +  if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
>> +    for (FunctionDecl::redecl_iterator RI = FD->redecls_begin(),
>> +           RE = FD->redecls_end(); RI != RE; ++RI)
>> +      if (RI->isAsmSpecified()) {
>> +        IsAsmFunc = true;
>> +        Fn->addFnAttr(llvm::Attribute::Naked);
>> +        Fn->addFnAttr(llvm::Attribute::NoInline);
>> +        break;
>> +      }
>> 
>> Should this really be looking for any declaration which is 'asm', or
>> just looking for the definition? Why does 'asm' imply 'noinline'?
>> 
>> 
>> --- lib/Parse/ParseDecl.cpp	(revision 171536)
>> +++ lib/Parse/ParseDecl.cpp	(working copy)
>> @@ -2538,6 +2540,11 @@
>>      break;
>>    }
>> 
>> +    // Microsoft asm support.
>> +    case tok::kw_asm:
>> +      isInvalid = DS.setFunctionSpecAsm(Loc);
>> +      break;
>> 
>> Emit a diagnostic here if the extension is not enabled.
>> 
>> 
>> --- lib/Parse/ParseStmt.cpp	(revision 171536)
>> +++ lib/Parse/ParseStmt.cpp	(working copy)
>> -  StmtResult FnBody(ParseCompoundStatementBody());
>> +  StmtResult FnBody(ParseCompoundStatementBody(/*isStmtExpr*/false,
>> +                                               ParsingAsmFunction));
>> 
>> Instead of wiring a flag through ParseCompoundStatementBody and
>> friends, please implement separate parsing code here. Reusing
>> ParseCompoundStatementBody does not seem worthwhile, since the only
>> shared syntax is apparently the braces.
> 
> _______________________________________________
> 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