xref: /freebsd/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_getauxval.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric //===-- sanitizer_getauxval.h -----------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // Common getauxval() guards and definitions.
100b57cec5SDimitry Andric // getauxval() is not defined until glibc version 2.16, or until API level 21
110b57cec5SDimitry Andric // for Android.
1268d75effSDimitry Andric // Implement the getauxval() compat function for NetBSD.
130b57cec5SDimitry Andric //
140b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #ifndef SANITIZER_GETAUXVAL_H
170b57cec5SDimitry Andric #define SANITIZER_GETAUXVAL_H
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include "sanitizer_platform.h"
2068d75effSDimitry Andric #include "sanitizer_glibc_version.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #if SANITIZER_LINUX || SANITIZER_FUCHSIA
230b57cec5SDimitry Andric 
24*e8d8bef9SDimitry Andric # if (__GLIBC_PREREQ(2, 16) || (SANITIZER_ANDROID && __ANDROID_API__ >= 21) || \
25*e8d8bef9SDimitry Andric       SANITIZER_FUCHSIA) &&                                                    \
26*e8d8bef9SDimitry Andric      !SANITIZER_GO
270b57cec5SDimitry Andric #  define SANITIZER_USE_GETAUXVAL 1
280b57cec5SDimitry Andric # else
290b57cec5SDimitry Andric #  define SANITIZER_USE_GETAUXVAL 0
300b57cec5SDimitry Andric # endif
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric # if SANITIZER_USE_GETAUXVAL
330b57cec5SDimitry Andric #  include <sys/auxv.h>
340b57cec5SDimitry Andric # else
350b57cec5SDimitry Andric // The weak getauxval definition allows to check for the function at runtime.
360b57cec5SDimitry Andric // This is useful for Android, when compiled at a lower API level yet running
370b57cec5SDimitry Andric // on a more recent platform that offers the function.
3868d75effSDimitry Andric extern "C" SANITIZER_WEAK_ATTRIBUTE unsigned long getauxval(unsigned long type);
390b57cec5SDimitry Andric # endif
400b57cec5SDimitry Andric 
4168d75effSDimitry Andric #elif SANITIZER_NETBSD
4268d75effSDimitry Andric 
4368d75effSDimitry Andric #define SANITIZER_USE_GETAUXVAL 1
4468d75effSDimitry Andric 
4568d75effSDimitry Andric #include <dlfcn.h>
4668d75effSDimitry Andric #include <elf.h>
4768d75effSDimitry Andric 
getauxval(decltype (AuxInfo::a_type)type)4868d75effSDimitry Andric static inline decltype(AuxInfo::a_v) getauxval(decltype(AuxInfo::a_type) type) {
4968d75effSDimitry Andric   for (const AuxInfo *aux = (const AuxInfo *)_dlauxinfo();
5068d75effSDimitry Andric        aux->a_type != AT_NULL; ++aux) {
5168d75effSDimitry Andric     if (type == aux->a_type)
5268d75effSDimitry Andric       return aux->a_v;
5368d75effSDimitry Andric   }
5468d75effSDimitry Andric 
5568d75effSDimitry Andric   return 0;
5668d75effSDimitry Andric }
5768d75effSDimitry Andric 
5868d75effSDimitry Andric #endif
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric #endif // SANITIZER_GETAUXVAL_H
61