On 23/02/2018 11:39, Jakub Jelinek wrote:
> On Fri, Feb 23, 2018 at 11:27:19AM -0300, Adhemerval Zanella wrote:
>> This patch adds asan support for aarch64 ilp32. It is based on 'official'
>> glibc support branch [1] (which is in turn based on Linux branch [2]).
>>
>> Main changes for libsanitizer is the kernel ABI support for internal
>> syscalls. Different than x32, ILP32 tries to leverage 32-bits syscalls
>> with kernel ABI for 64 bit argument passing (ftruncate for instance)
>> are passed using the new Linux generic way for 32 bits (by splitting
>> high and low in two registers).
>>
>> So instead of adding more adhoc defines to ILP32 this patch extends the
>> SANITIZER_USES_CANONICAL_LINUX_SYSCALLS to represent both 64 bits
>> argument syscalls (value of 1) and 32 bits (value of 2).
>>
>> The shadow offset used is similar to the arm one (29).
>>
>> I did a sanity check on aarch64-linux-gnu and x86_64-linux-gnu without
>> any regressions.
>>
>> PS: I sent this change llvm-commit, but it got stalled because llvm
>> lack aarch64 ilp32 support and noone could confirm no breakage due
>> missing buildbot. Also the idea is not sync it back to libsanitizer.
>
> It will be a nightmare for merges from upstream, but because the upstream is
> so uncooperative probably there is no other way.
What I meant it the idea is to sync it back to libsanitizer, sorry for the
misunderstanding. I can try to push it again for compiler-rt, but it took
a long way to actually get any reply.
>
>> gcc/
>>
>> * gcc/config/aarch64/aarch64.c (aarch64_asan_shadow_offset): Add
>
> No gcc/ prefixes in gcc/ChangeLog.
Right, fixed locally.
>
>> TARGET_ILP32 support.
>>
>> libsanitizer/
>
> Nor libsanitizer/ prefixes in libsaniter/ChangeLog.
>> --- a/libsanitizer/sanitizer_common/sanitizer_internal_defs.h
>> +++ b/libsanitizer/sanitizer_common/sanitizer_internal_defs.h
>> @@ -117,9 +117,9 @@ typedef signed long long sptr; // NOLINT
>> typedef unsigned long uptr; // NOLINT
>> typedef signed long sptr; // NOLINT
>> #endif // defined(_WIN64)
>> -#if defined(__x86_64__)
>> -// Since x32 uses ILP32 data model in 64-bit hardware mode, we must use
>> -// 64-bit pointer to unwind stack frame.
>> +#if defined(__x86_64__) || SANITIZER_AARCH64_ILP32
>> +// Since x32 adn AArch64 ILP32 use ILP32 data model in 64-bit hardware
>> mode,
>
> s/adn/and/
Ack.
>
>> @@ -445,11 +467,7 @@ uptr internal_execve(const char *filename, char *const
>> argv[],
>> // - sanitizer_common.h
>> bool FileExists(const char *filename) {
>>struct stat st;
>> -#if SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
>> - if (internal_syscall(SYSCALL(newfstatat), AT_FDCWD, filename, , 0))
>> -#else
>>if (internal_stat(filename, ))
>> -#endif
>> return false;
>>// Sanity check: filename is a regular file.
>>return S_ISREG(st.st_mode);
>
> I'm uneasy about this hunk, you change behavior not just on aarch64 ilp32,
> but for many other targets too. Please don't.
My understanding it a noop since for SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
internal_stat would be a be a internal_syscall(newfstatat, ...) (also
the internal_* names are exactly to abstract this kind of constructions).
>
> Do you really want it for GCC8? We are in stage4 and this isn't a
> regression...
>
> Jakub
>
I don't have a strong opinion about that, it would to good to have on GCC8,
but I think I can wait.