[cfe-commits] [Patch] CodeWarrior/MS-style inline assembly asm function
Chad Rosier
mcrosier at apple.com
Mon Jan 7 16:32:47 PST 2013
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.
More information about the cfe-commits
mailing list