[lld] 4e9277e - [ELF] --wrap: don't unnecessarily expose __real_

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 20:09:47 PDT 2020


Author: Fangrui Song
Date: 2020-09-30T20:09:25-07:00
New Revision: 4e9277eda1874ead60f2c9d7cdb558fd19b32076

URL: https://github.com/llvm/llvm-project/commit/4e9277eda1874ead60f2c9d7cdb558fd19b32076
DIFF: https://github.com/llvm/llvm-project/commit/4e9277eda1874ead60f2c9d7cdb558fd19b32076.diff

LOG: [ELF] --wrap: don't unnecessarily expose __real_

The routing rules are:

sym -> __wrap_sym
__real_sym -> sym

__wrap_sym and sym are routing targets, so they need to be exposed to the symbol
table. __real_sym is not and can be eliminated if not used by regular object.

Added: 
    

Modified: 
    lld/ELF/Driver.cpp
    lld/test/ELF/lto/wrap-1.ll

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 5e80385837ce..fa39628a2143 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1867,7 +1867,7 @@ static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList &args) {
     if (!sym)
       continue;
 
-    Symbol *real = addUndefined(saver.save("__real_" + name));
+    Symbol *real = addUnusedUndefined(saver.save("__real_" + name));
     Symbol *wrap = addUnusedUndefined(saver.save("__wrap_" + name));
     v.push_back({sym, real, wrap});
 

diff  --git a/lld/test/ELF/lto/wrap-1.ll b/lld/test/ELF/lto/wrap-1.ll
index 5ff46274d087..5355df222425 100644
--- a/lld/test/ELF/lto/wrap-1.ll
+++ b/lld/test/ELF/lto/wrap-1.ll
@@ -17,11 +17,12 @@
 ; CHECK-NEXT: Binding: Global
 ; CHECK-NEXT: Type: Function
 
-; Make sure that the 'r' (linker redefined) bit is set for bar and __wrap_bar
-; in the resolutions file.
-; RESOLS: ,bar,xr
-; RESOLS: ,__wrap_bar,plx
-; RESOLS: ,__real_bar,plxr
+; Make sure that the 'r' (linker redefined) bit is set for bar and __real_bar
+; in the resolutions file. The calls to bar and __real_bar will be routed to
+; __wrap_bar and bar, respectively. So they cannot be inlined.
+; RESOLS: ,bar,xr{{$}}
+; RESOLS: ,__wrap_bar,plx{{$}}
+; RESOLS: ,__real_bar,plr{{$}}
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"


        


More information about the llvm-commits mailing list