[lld] r264790 - [LTO] Teach LTO about @llvm.used global.
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 29 16:47:43 PDT 2016
On Tue, Mar 29, 2016 at 2:59 PM, Rui Ueyama <ruiu at google.com> wrote:
> On Tue, Mar 29, 2016 at 2:46 PM, Davide Italiano via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: davide
>> Date: Tue Mar 29 16:46:35 2016
>> New Revision: 264790
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=264790&view=rev
>> Log:
>> [LTO] Teach LTO about @llvm.used global.
>>
>> If a symbol appears in @llvm.used, the linker is forced to treat
>> the symbol as there's a reference to it.
>>
>> Added:
>> lld/trunk/test/ELF/lto/internalize-llvmused.ll
>> Modified:
>> lld/trunk/ELF/LTO.cpp
>>
>> Modified: lld/trunk/ELF/LTO.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=264790&r1=264789&r2=264790&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/LTO.cpp (original)
>> +++ lld/trunk/ELF/LTO.cpp Tue Mar 29 16:46:35 2016
>> @@ -21,6 +21,7 @@
>> #include "llvm/Support/TargetRegistry.h"
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/Transforms/IPO.h"
>> +#include "llvm/Transforms/Utils/ModuleUtils.h"
>> #include "llvm/Transforms/IPO/PassManagerBuilder.h"
>>
>> using namespace llvm;
>> @@ -76,6 +77,10 @@ void BitcodeCompiler::add(BitcodeFile &F
>> unsigned BodyIndex = 0;
>> ArrayRef<SymbolBody *> Bodies = F.getSymbols();
>>
>> + Module &M = Obj->getModule();
>> + SmallPtrSet<GlobalValue *, 8> Used;
>> + collectUsedGlobalVariables(M, Used, /* CompilerUsed */ false);
>
>
> Please add a comment.
>
Does the following look good to you?
diff --git a/ELF/LTO.cpp b/ELF/LTO.cpp
index 63fb6e3..b1d5d60 100644
--- a/ELF/LTO.cpp
+++ b/ELF/LTO.cpp
@@ -78,6 +78,10 @@ void BitcodeCompiler::add(BitcodeFile &F) {
ArrayRef<SymbolBody *> Bodies = F.getSymbols();
Module &M = Obj->getModule();
+
+ // If a symbol appears in @llvm.used, the linker is required
+ // to treat the symbol as there is a reference to the symbol
+ // that it cannot see. Therefore, we can't internalize.
SmallPtrSet<GlobalValue *, 8> Used;
collectUsedGlobalVariables(M, Used, /* CompilerUsed */ false);
--
Davide
"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare
More information about the llvm-commits
mailing list