Issue compiling x86 assembly code with clang

Hey guys,

I am trying to compile x86 assembly code with clang, which gets compiled successfully with -O1 flag but fails with -O0 flag with below-mentioned error:

inline assembly requires more registers than available
“pushl %%ebx \n\t”

The code snippet is something like:

asm (
“pushl %%ebx \n\t”
… // more assembly code

: // No Input

: // 6 output fields

: “%eax”, “%ecx”, “%esi”, “%edi”, “memory” // all these clobbers
);

Does anyone have a clue on how should I debug this issue?

Note: This assembly code works fine with gcc.

Thanks.
Rohit

(most lists to bcc)

Hi Rohit,

Hey guys,

I am trying to compile *x86 assembly code* with clang, which gets compiled
successfully with -O1 flag but fails with -O0 flag with below-mentioned
error:

inline assembly requires more registers than available

Well, keep in mind that there are only six general purpose register on
i386 and %ebx might still be reserved for the GOT in PIC code. Combine
that with the fast register allocator and code generator being somewhat
dumb and I'm not surprised at all, that this is failing. Sorry, though
luck -- it is unlikely to be fixed really.

Note: This assembly code works fine with gcc.

Across all reasonable set of versions and optimization levels? I would
be surprised. GCC has a long history of rejecting dumb cpuid inline
assembler macros. Your best bet is very likely to reduce the clobber
list further to give the compiler some breathing room.

Joerg