[PATCH] [inline-asm] Fix scope of assembly macros

Jim Grosbach grosbach at apple.com
Tue Jan 27 10:44:52 PST 2015


> On Jan 27, 2015, at 10:14 AM, Sergey Dmitrouk <sdmitrouk at accesssoftek.com> wrote:
> 
> On Thu, Jan 22, 2015 at 04:38:06PM -0800, Reid Kleckner wrote:
>>   To me the bug is not that macros aren't carried over into the next asm
>>   blob, it's that they are carried over if you use -no-integrated-as and are
>>   not carried if you don't. That inconsistency is the bug.
> 
> Initially I though that it's something related to the patch, while it
> seems to be already existing inconsistency and the patch just moves it
> from asm directive level to function level.
> 
>>   One way to fix the inconsistency would be to have LLVM's AsmPrinter
>>   explicitly undef macros to prevent asm blobs from escaping macros.
> 
> Not sure if such behaviour is much better, it basically turns internal
> LLVM inconsistency into "intensional" incompatibility with other compilers.
> If macros are expanded beforehand and there is only one macros context per
> module, everything should be fine with one more condition: functions in
> the list module functions should be in top down order.

There is no ordering guarantee.

> 
>>   This is surprising to me. Typically we know the target up front, at least
>>   well enough to pick between the ARM or X86 asm parsers, if not all the
>>   subtarget features.
> 
> It failed during LTO tests in which one of object files doesn't specify
> target triple, which is fine for LTO as it merges all modules before
> processing them, but bad for expanding macros.
> 
>>   Nice! I guess one issue is that if you have code like this bad things
>>   happen:
>>   asm (".macro a ...")
>>   void f() {
>>      asm ("use macro a");
>>   }
>>   asm (".undef a ...")
> 
> You mean that it won't even compile because it's equivalent to the piece
> below when processed by LLVM?
> 
>    asm (".macro a ..."
>         "\n"
>         ".undef a ...");
>    void f() {
>       asm ("use macro a");
>    }
> 
> This behaviour is quite stable and a limitation of module level assembly
> implementation in LLVM.  It doesn't seem like a big deal comparing to that
> order of object files on command line for LTO linking defines order in
> which module level assembly is combined, which can yield quite
> unpredictable results.
> 
>>   Roundtripping through bitcode also kills use-list order unless you
>>   explicitly ask to retain it. The constant folding issue just sounds like a
>>   bug.
> 
> AsmReader just uses ConstExpr to create binary operations and ConstExpr
> always folds everything it can during instruction construction.  Might
> be considered to be a bug, although it's harmless in most cases.
> 
> -- 
> Sergey





More information about the llvm-commits mailing list