|
29 | 29 | #include "llvm/ValueSymbolTable.h"
|
30 | 30 | #include "llvm/TypeSymbolTable.h"
|
31 | 31 | #include "llvm/Support/Compiler.h"
|
| 32 | +#include "llvm/ADT/SmallPtrSet.h" |
32 | 33 | using namespace llvm;
|
33 | 34 |
|
34 | 35 | namespace {
|
@@ -100,13 +101,34 @@ bool StripSymbols::runOnModule(Module &M) {
|
100 | 101 | // If we're not just stripping debug info, strip all symbols from the
|
101 | 102 | // functions and the names from any internal globals.
|
102 | 103 | if (!OnlyDebugInfo) {
|
| 104 | + SmallPtrSet<const Constant *, 8> llvmUsedValues; |
| 105 | + Value *LLVMUsed = M.getValueSymbolTable().lookup("llvm.used"); |
| 106 | + if (LLVMUsed) { |
| 107 | + // Collect values that are preserved as per explicit request. |
| 108 | + // llvm.used is used to list these values. |
| 109 | + if (GlobalVariable *GV = dyn_cast<GlobalVariable>(LLVMUsed)) { |
| 110 | + if (ConstantArray *InitList = |
| 111 | + dyn_cast<ConstantArray>(GV->getInitializer())) { |
| 112 | + for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { |
| 113 | + if (ConstantExpr *CE = |
| 114 | + dyn_cast<ConstantExpr>(InitList->getOperand(i))) |
| 115 | + if (CE->isCast()) |
| 116 | + llvmUsedValues.insert(CE->getOperand(0)); |
| 117 | + } |
| 118 | + } |
| 119 | + } |
| 120 | + } |
| 121 | + |
103 | 122 | for (Module::global_iterator I = M.global_begin(), E = M.global_end();
|
104 |
| - I != E; ++I) |
105 |
| - if (I->hasInternalLinkage()) |
| 123 | + I != E; ++I) { |
| 124 | + if (I->hasInternalLinkage() && llvmUsedValues.count(I) == 0) |
106 | 125 | I->setName(""); // Internal symbols can't participate in linkage
|
| 126 | + else if (I->getName() == "llvm.used") { |
| 127 | + } |
| 128 | + } |
107 | 129 |
|
108 | 130 | for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
109 |
| - if (I->hasInternalLinkage()) |
| 131 | + if (I->hasInternalLinkage() && llvmUsedValues.count(I) == 0) |
110 | 132 | I->setName(""); // Internal symbols can't participate in linkage
|
111 | 133 | StripSymtab(I->getValueSymbolTable());
|
112 | 134 | }
|
|
0 commit comments