-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[hwasan] Move __hwasan_thread_enter/__hwasan_thread_exit out of namespace #72123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…pace Due to a GCC bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25940), GCC doesn't consider extern "C" functions with the same name but different namespace to be the same. As such, the default visibility attribute (on a declaration outside the namespace) doesn't get applied to the definition in the namespace and the symbol is not exported. This came up as an ABI diff when switching between gcc and clang for compiling compiler-rt.
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Nikita Popov (nikic) ChangesDue to a GCC bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25940), GCC doesn't consider extern "C" functions with the same name but different namespace to be the same. As such, the default visibility attribute (on a declaration outside the namespace) doesn't get applied to the definition in the namespace and the symbol is not exported. This came up as an ABI diff when switching between gcc and clang for compiling compiler-rt. Full diff: https://github.com/llvm/llvm-project/pull/72123.diff 1 Files Affected:
diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cpp b/compiler-rt/lib/hwasan/hwasan_linux.cpp
index 6f5e9432974efdb..81226da976d1161 100644
--- a/compiler-rt/lib/hwasan/hwasan_linux.cpp
+++ b/compiler-rt/lib/hwasan/hwasan_linux.cpp
@@ -294,25 +294,6 @@ void InstallAtExitHandler() { atexit(HwasanAtExit); }
// ---------------------- TSD ---------------- {{{1
-extern "C" void __hwasan_thread_enter() {
- hwasanThreadList().CreateCurrentThread()->EnsureRandomStateInited();
-}
-
-extern "C" void __hwasan_thread_exit() {
- Thread *t = GetCurrentThread();
- // Make sure that signal handler can not see a stale current thread pointer.
- atomic_signal_fence(memory_order_seq_cst);
- if (t) {
- // Block async signals on the thread as the handler can be instrumented.
- // After this point instrumented code can't access essential data from TLS
- // and will crash.
- // Bionic already calls __hwasan_thread_exit with blocked signals.
- if (SANITIZER_GLIBC)
- BlockSignals();
- hwasanThreadList().ReleaseThread(t);
- }
-}
-
# if HWASAN_WITH_INTERCEPTORS
static pthread_key_t tsd_key;
static bool tsd_key_inited = false;
@@ -561,4 +542,25 @@ void InstallAtExitCheckLeaks() {
} // namespace __hwasan
+using namespace __hwasan;
+
+extern "C" void __hwasan_thread_enter() {
+ hwasanThreadList().CreateCurrentThread()->EnsureRandomStateInited();
+}
+
+extern "C" void __hwasan_thread_exit() {
+ Thread *t = GetCurrentThread();
+ // Make sure that signal handler can not see a stale current thread pointer.
+ atomic_signal_fence(memory_order_seq_cst);
+ if (t) {
+ // Block async signals on the thread as the handler can be instrumented.
+ // After this point instrumented code can't access essential data from TLS
+ // and will crash.
+ // Bionic already calls __hwasan_thread_exit with blocked signals.
+ if (SANITIZER_GLIBC)
+ BlockSignals();
+ hwasanThreadList().ReleaseThread(t);
+ }
+}
+
#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD
|
@@ -561,4 +542,25 @@ void InstallAtExitCheckLeaks() { | |||
|
|||
} // namespace __hwasan | |||
|
|||
using namespace __hwasan; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this only for hwasanThreadList
and BlockSignals
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe it is also for Thread
and GetCurrentThread()
.
…pace (llvm#72123) Due to a GCC bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25940), GCC doesn't consider extern "C" functions with the same name but different namespace to be the same. As such, the default visibility attribute (on a declaration outside the namespace) doesn't get applied to the definition in the namespace and the symbol is not exported. This came up as an ABI diff when switching between gcc and clang for compiling compiler-rt.
Due to a GCC bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25940), GCC doesn't consider extern "C" functions with the same name but different namespace to be the same. As such, the default visibility attribute (on a declaration outside the namespace) doesn't get applied to the definition in the namespace and the symbol is not exported.
This came up as an ABI diff when switching between gcc and clang for compiling compiler-rt.