Like in NASM and C.
Simply preprocessing it with cpp does not work since I want to define a macro like:
.macro ASSERT_FAIL
    mov __LINE__, %eax
    call assert_fail
.endmacro
which expands the __LINE__ whenever ASSERT_FAIL is used so I can see where the failure happened. So __LINE__ must be expanded after ASSERT_FAIL.
I would also like to put that macro in a separate file and include it with .include.
I have been able to achieve exactly that with NASM:
%macro ASSERT_FAIL 0
    mov eax, __LINE__
    call assert_fail
%endmacro
Is there any alternative besides using cpp's #include and #define instead of .macro and .include? The manual does say that there are little built-in pre-processing power in gas. It makes me wonder why .macro and .include exist at all if they are so limited.
EDIT: I have examined the kernel and glibc. glibc does not have a single .include and very few .macro. The kernel has no .include, but uses a mixture of both .macro and #define, with a tendency of leaving .macro for multi-line macros as it is more readable.
                        
As mentioned by
@RossRidge, the best solution I could find so far was to use cpp and use:This also requires any macro that use this to use CPP and not
.macro, and#includeand not.include. So the best thing to do is to use onlycppfor macros everywhere.If you use the standard
.S(uppercase) extension,gcc4.8 automatically runscppby default, which is convenient.But if your use case is a bit different, make sure to explore other GCC features. For example, I was also considering using
__LINE__to generate unique local labels, but then I found the numeric local relative labels which were a much better option.