mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-01 20:52:14 +00:00
Make __start_sec __end_sec handling more precise.
With this we only ask LTO to keep a C named section if there is a __start_ or __end symbol. This is not as strict as lld's --gc-sections, but is as good as we can get without having a far more detailed ir summary. llvm-svn: 309232
This commit is contained in:
parent
268f89d540
commit
4b075bb218
@ -11,6 +11,7 @@
|
||||
#include "Config.h"
|
||||
#include "Error.h"
|
||||
#include "InputFiles.h"
|
||||
#include "SymbolTable.h"
|
||||
#include "Symbols.h"
|
||||
#include "lld/Core/TargetOptionsCommandFlags.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
@ -107,7 +108,14 @@ static std::unique_ptr<lto::LTO> createLTO() {
|
||||
Config->LTOPartitions);
|
||||
}
|
||||
|
||||
BitcodeCompiler::BitcodeCompiler() : LTOObj(createLTO()) {}
|
||||
BitcodeCompiler::BitcodeCompiler() : LTOObj(createLTO()) {
|
||||
for (Symbol *Sym : Symtab->getSymbols()) {
|
||||
StringRef Name = Sym->body()->getName();
|
||||
for (StringRef Prefix : {"__start_", "__stop_"})
|
||||
if (Name.startswith(Prefix))
|
||||
UsedStartStop.insert(Name.substr(Prefix.size()));
|
||||
}
|
||||
}
|
||||
|
||||
BitcodeCompiler::~BitcodeCompiler() = default;
|
||||
|
||||
@ -138,7 +146,7 @@ void BitcodeCompiler::add(BitcodeFile &F) {
|
||||
|
||||
R.VisibleToRegularObj = Sym->IsUsedInRegularObj ||
|
||||
(R.Prevailing && Sym->includeInDynsym()) ||
|
||||
isValidCIdentifier(ObjSym.getSectionName());
|
||||
UsedStartStop.count(ObjSym.getSectionName());
|
||||
if (R.Prevailing)
|
||||
undefine(Sym);
|
||||
R.LinkerRedefined = Config->RenamedSymbols.count(Sym);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#define LLD_ELF_LTO_H
|
||||
|
||||
#include "lld/Core/LLVM.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
@ -50,6 +51,7 @@ private:
|
||||
std::unique_ptr<llvm::lto::LTO> LTOObj;
|
||||
std::vector<SmallString<0>> Buff;
|
||||
std::vector<std::unique_ptr<MemoryBuffer>> Files;
|
||||
llvm::DenseSet<StringRef> UsedStartStop;
|
||||
};
|
||||
} // namespace elf
|
||||
} // namespace lld
|
||||
|
@ -7,5 +7,21 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@foo = hidden global i32 42, section "foo_section"
|
||||
@bar = hidden global i32 42, section "bar_section"
|
||||
@zed = hidden global i32 42, section "zed_section"
|
||||
|
||||
; CHECK: foo_section PROGBITS
|
||||
@__start_foo_section = external global i32
|
||||
@__stop_bar_section = external global i32
|
||||
|
||||
define i32* @use1() {
|
||||
ret i32* @__start_foo_section
|
||||
}
|
||||
|
||||
define i32* @use2() {
|
||||
ret i32* @__stop_bar_section
|
||||
}
|
||||
|
||||
; CHECK-NOT: zed_section
|
||||
; CHECK: foo_section PROGBITS
|
||||
; CHECK-NEXT: bar_section PROGBITS
|
||||
; CHECK-NOT: zed_section
|
||||
|
Loading…
x
Reference in New Issue
Block a user