mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
Gold-plugin: Broaden scope of get/release_input_file to scope of Module.
Summary: Move calls to get_input_file and release_input_file out of getModuleForFile(). Otherwise release_input_file may end up unmapping a view of the file while the view is still being used by the Module (on 32-bit hosts). Fix for PR22482. Test Plan: Add test using --no-map-whole-files. Reviewers: rafael, nlewycky Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7539 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228842 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
9
test/tools/gold/no-map-whole-file.ll
Normal file
9
test/tools/gold/no-map-whole-file.ll
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
; RUN: llvm-as -o %t.bc %s
|
||||||
|
; RUN: ld -plugin %llvmshlibdir/LLVMgold.so -plugin-opt=emit-llvm \
|
||||||
|
; RUN: --no-map-whole-files -r -o %t2.bc %t.bc
|
||||||
|
; RUN: llvm-dis < %t2.bc -o - | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: main
|
||||||
|
define i32 @main() {
|
||||||
|
ret i32 0
|
||||||
|
}
|
@ -560,11 +560,9 @@ static void freeSymName(ld_plugin_symbol &Sym) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static std::unique_ptr<Module>
|
static std::unique_ptr<Module>
|
||||||
getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile,
|
getModuleForFile(LLVMContext &Context, claimed_file &F,
|
||||||
|
off_t Filesize, raw_fd_ostream *ApiFile,
|
||||||
StringSet<> &Internalize, StringSet<> &Maybe) {
|
StringSet<> &Internalize, StringSet<> &Maybe) {
|
||||||
ld_plugin_input_file File;
|
|
||||||
if (get_input_file(F.handle, &File) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to get file information");
|
|
||||||
|
|
||||||
if (get_symbols(F.handle, F.syms.size(), &F.syms[0]) != LDPS_OK)
|
if (get_symbols(F.handle, F.syms.size(), &F.syms[0]) != LDPS_OK)
|
||||||
message(LDPL_FATAL, "Failed to get symbol information");
|
message(LDPL_FATAL, "Failed to get symbol information");
|
||||||
@ -573,7 +571,7 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile,
|
|||||||
if (get_view(F.handle, &View) != LDPS_OK)
|
if (get_view(F.handle, &View) != LDPS_OK)
|
||||||
message(LDPL_FATAL, "Failed to get a view of file");
|
message(LDPL_FATAL, "Failed to get a view of file");
|
||||||
|
|
||||||
MemoryBufferRef BufferRef(StringRef((const char *)View, File.filesize), "");
|
MemoryBufferRef BufferRef(StringRef((const char *)View, Filesize), "");
|
||||||
ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr =
|
ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr =
|
||||||
object::IRObjectFile::create(BufferRef, Context);
|
object::IRObjectFile::create(BufferRef, Context);
|
||||||
|
|
||||||
@ -581,9 +579,6 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile,
|
|||||||
message(LDPL_FATAL, "Could not read bitcode from file : %s",
|
message(LDPL_FATAL, "Could not read bitcode from file : %s",
|
||||||
EC.message().c_str());
|
EC.message().c_str());
|
||||||
|
|
||||||
if (release_input_file(F.handle) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to release file information");
|
|
||||||
|
|
||||||
object::IRObjectFile &Obj = **ObjOrErr;
|
object::IRObjectFile &Obj = **ObjOrErr;
|
||||||
|
|
||||||
Module &M = Obj.getModule();
|
Module &M = Obj.getModule();
|
||||||
@ -802,8 +797,12 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) {
|
|||||||
StringSet<> Internalize;
|
StringSet<> Internalize;
|
||||||
StringSet<> Maybe;
|
StringSet<> Maybe;
|
||||||
for (claimed_file &F : Modules) {
|
for (claimed_file &F : Modules) {
|
||||||
|
ld_plugin_input_file File;
|
||||||
|
if (get_input_file(F.handle, &File) != LDPS_OK)
|
||||||
|
message(LDPL_FATAL, "Failed to get file information");
|
||||||
std::unique_ptr<Module> M =
|
std::unique_ptr<Module> M =
|
||||||
getModuleForFile(Context, F, ApiFile, Internalize, Maybe);
|
getModuleForFile(Context, F, File.filesize, ApiFile,
|
||||||
|
Internalize, Maybe);
|
||||||
if (!options::triple.empty())
|
if (!options::triple.empty())
|
||||||
M->setTargetTriple(options::triple.c_str());
|
M->setTargetTriple(options::triple.c_str());
|
||||||
else if (M->getTargetTriple().empty()) {
|
else if (M->getTargetTriple().empty()) {
|
||||||
@ -812,6 +811,8 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) {
|
|||||||
|
|
||||||
if (L.linkInModule(M.get()))
|
if (L.linkInModule(M.get()))
|
||||||
message(LDPL_FATAL, "Failed to link module");
|
message(LDPL_FATAL, "Failed to link module");
|
||||||
|
if (release_input_file(F.handle) != LDPS_OK)
|
||||||
|
message(LDPL_FATAL, "Failed to release file information");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &Name : Internalize) {
|
for (const auto &Name : Internalize) {
|
||||||
|
Reference in New Issue
Block a user