Hi Everyone, We took a bug report on some line assembly code (https://github.com/weidai11/cryptopp/issues/72). I have two questions at the end on Clang, Apple and ILP32.
The code performs the following: asm volatile ( // save ebx in case -fPIC is being used // TODO: this might need an early clobber on EDI. # if BOOL_X32 || BOOL_X64 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" # else "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" # endif : "=a" (output[0]), "=D" (output[1]), "=c" (output[2]), "=d" (output[3]) : "a" (input), "c" (0) ); BOOL_X32 is set when __ILP32__ is defined. BOOL_X86 is defined when __i386__ (and friends) is defined. BOOL_X64 is defined when __x86_64__ (and friends) is defined. We set the conditions based on " System V Application Binary Interface, AMD64 (With LP64 and ILP32 Programming Models)", http://sites.google.com/site/x32abi/documents/abi.pdf. The compiler error is: $ make cpu.o clang++ -DNDEBUG -g2 -O2 -arch i386 -fPIC -march=native -pipe -c cpu.cpp cpu.cpp:104:4: error: register %rbx is only available in 64-bit mode "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" ^ <inline asm>:1:8: note: instantiated into assembly here pushq %rbx; cpuid; mov %ebx, %edi; popq %rbx ^~~~~ cpu.cpp:104:4: error: register %rbx is only available in 64-bit mode "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" ^ <inline asm>:1:42: note: instantiated into assembly here pushq %rbx; cpuid; mov %ebx, %edi; popq %rbx ^~~~ 2 errors generated. It appears Clang sets ILP32 related defines when using -arch i386: $ clang++ -arch i386 -dM -E - < /dev/null | egrep -i "(86|64|ilp)" #define _ILP32 1 #define __ILP32__ 1 ... #define __i386 1 #define __i386__ 1 #define i386 1 As far as I know, when using ILP32, we must interact with the stack using 64-bit values. My first question is, is _ILP32_ and _i386_ supposed to be defined together? According to the docs I found, its not an expected/legal configuration. _ILP32_ and _x86_64_ is an expected/legal configuration. My second question is, how should I work around this? Should I special case Clang on Apple and attempt to push a 32-bit value? Or should I do something else? Thanks in advance. _______________________________________________ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users