Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Side by Side Diff: base/allocator/allocator_shim_internals.h

Issue 2748083004: Set noinline attribute on exported shim layer functions. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_ 5 #ifndef BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
6 #define BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_ 6 #define BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
7 7
8 #if defined(__GNUC__) 8 #if defined(__GNUC__)
9 9
10 #include <sys/cdefs.h> // for __THROW 10 #include <sys/cdefs.h> // for __THROW
11 11
12 #ifndef __THROW // Not a glibc system 12 #ifndef __THROW // Not a glibc system
13 #ifdef _NOEXCEPT // LLVM libc++ uses noexcept instead 13 #ifdef _NOEXCEPT // LLVM libc++ uses noexcept instead
14 #define __THROW _NOEXCEPT 14 #define __THROW _NOEXCEPT
15 #else 15 #else
16 #define __THROW 16 #define __THROW
17 #endif // !_NOEXCEPT 17 #endif // !_NOEXCEPT
18 #endif 18 #endif
19 19
20 // Shim layer symbols need to be ALWAYS exported, regardless of component build. 20 // Shim layer symbols need to be ALWAYS exported, regardless of component build.
21 #define SHIM_ALWAYS_EXPORT __attribute__((visibility("default"))) 21 //
22 // If an exported symbol is linked into a DSO, it may be preempted by a
23 // definition in the main executable. If this happens to an allocator symbol, it
24 // will mean that the DSO will use the main executable's allocator. This is
25 // normally relatively harmless -- regular allocations should all use the same
26 // allocator, but if the DSO tries to hook the allocator it will not see any
27 // allocations.
28 //
29 // However, if LLVM LTO is enabled, the compiler may inline the shim layer
30 // symbols into callers. The end result is that allocator calls in DSOs may use
31 // either the main executable's allocator or the DSO's allocator, depending on
32 // whether the call was inlined. This is arguably a bug in LLVM caused by its
33 // somewhat irregular handling of symbol interposition (see llvm.org/PR23501).
34 // To work around the bug we use noinline to prevent the symbols from being
35 // inlined.
36 //
37 // In the long run we probably want to avoid linking the allocator bits into
38 // DSOs altogether. This will save a little space and stop giving DSOs the false
39 // impression that they can hook the allocator.
40 #define SHIM_ALWAYS_EXPORT __attribute__((visibility("default"), noinline))
22 41
23 #endif // __GNUC__ 42 #endif // __GNUC__
24 43
25 #endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_ 44 #endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698