MaskRay added a comment. In D148827#4424237 <https://reviews.llvm.org/D148827#4424237>, @uabelho wrote:
> Hi, > > A question: it seems like this messes with alignment on functions? > So with input program al.c: > > __attribute__((aligned(64))) > void alignedfn(void) { > __asm("nop"); > } > void alignedfn2(void) { > __asm("nop"); > } > int main(void){} > > if we compile with -fsanitize=function we get: > > -> clang al.c -o al.o -c -fsanitize=function > -> nm al.o > 0000000000000008 T alignedfn > 0000000000000018 T alignedfn2 > 0000000000000028 T main > > So alignedfn and alignedfn2 doesn't seem to be aligned as we said. > Without -fsanitize=function: > > -> clang al.c -o al.o -c > -> nm al.o > 0000000000000000 T alignedfn > 0000000000000010 T alignedfn2 > 0000000000000020 T main > > I guess the data put before the functions get aligned but not the functions > themselves. Should I write a ticket about this? When `__attribute__((aligned(...)))` is used with an instrumentation that places extra bytes before the function label, I think it is unclear what the desired behavior should be. This applies to many instructions including `-fsanitize=kcfi`, `-fsanitize=function`, and `-fpatchable-function-entry=N,M` (M>0). It's unclear whether this attribute applies to the first byte of the function or the first intended instruction. For example, with `-fpatchable-function-entry=2,2`, we can make `st_value(foo)%64=2`. gcc -c -fpatchable-function-entry=2,2 -xc =(printf '__attribute__((aligned(64))) void foo() {}') -o a.o clang -c -fpatchable-function-entry=2,2 -xc =(printf '__attribute__((aligned(64))) void foo() {}') -o a.o I acknowledge that https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html says "The aligned attribute specifies a minimum alignment for the first instruction of the function, measured in bytes.", but I think the GCC documentation doesn't consider these instructions. I consider Clang's behavior working as intended. (Other angles: with PPC64 ELFv2, the local entry, the target destination of a function call, is not aligned by `__attribute__((aligned(...)))`. `__attribute__((aligned(...)))` is usually for performance reasons and has different tradeoff with `-fsanitize=function`.) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D148827/new/ https://reviews.llvm.org/D148827 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits