1
1
mirror of https://github.com/rui314/mold.git synced 2024-12-26 18:02:30 +03:00

temporary

This commit is contained in:
Rui Ueyama 2020-11-06 08:49:41 +09:00
parent 851415fdc9
commit bed207a4ec
5 changed files with 52 additions and 36 deletions

View File

@ -7,7 +7,7 @@ LLVM_LIBS=$(wildcard llvm-project/build/lib/libLLVM*.a)
CURRENT_DIR=$(shell pwd)
TBB_LIBDIR=$(wildcard $(CURRENT_DIR)/oneTBB/build/linux_intel64_*_release/)
CPPFLAGS=-g $(shell $(LLVM_CONFIG) --cxxflags) -IoneTBB/include -pthread -std=c++17
CPPFLAGS=-g $(shell $(LLVM_CONFIG) --cxxflags) -IoneTBB/include -pthread -std=c++17 -O2
LDFLAGS=$(shell $(LLVM_CONFIG) --ldflags) -L$(TBB_LIBDIR) -Wl,-rpath=$(TBB_LIBDIR) -fuse-ld=lld
LIBS=-pthread -ltbb -lcurses -Wl,--start-group $(LLVM_LIBS) -Wl,--end-group
OBJS=main.o object_file.o input_sections.o output_chunks.o mapfile.o perf.o

View File

@ -24,7 +24,9 @@ void InputSection::copy_to(u8 *buf) {
memcpy(buf, &data[0], data.size());
}
void InputSection::scan_relocations() {
ScanRelResult InputSection::scan_relocations() {
ScanRelResult res;
for (const ELF64LE::Rela &rel : rels) {
Symbol *sym = file->symbols[rel.getSymbol(false)];
if (!sym->file || !sym->file->is_alive)
@ -43,7 +45,7 @@ void InputSection::scan_relocations() {
std::lock_guard lock(sym->mu);
if (!sym->needs_got) {
sym->needs_got = true;
file->num_got++;
res.num_got++;
}
break;
}
@ -51,7 +53,7 @@ void InputSection::scan_relocations() {
std::lock_guard lock(sym->mu);
if (!sym->needs_gottp) {
sym->needs_gottp = true;
file->num_got++;
res.num_got++;
}
break;
}
@ -62,14 +64,15 @@ void InputSection::scan_relocations() {
std::lock_guard lock(sym->mu);
if (!sym->needs_plt) {
sym->needs_plt = true;
file->num_plt++;
file->num_gotplt++;
file->num_relplt++;
res.num_plt++;
res.num_gotplt++;
res.num_relplt++;
}
break;
}
}
}
return res;
}
void InputSection::relocate(u8 *buf) {
@ -146,7 +149,7 @@ void InputSection::relocate(u8 *buf) {
error(toString(this) + ": unknown relocation: " +
std::to_string(rel.getType(false)));
}
static Counter counter("relocs");
counter.inc();
}

34
main.cc
View File

@ -232,26 +232,22 @@ static void set_isec_offsets() {
}
static void scan_rels(ArrayRef<ObjectFile *> files) {
std::atomic_int32_t num_got = 0;
std::atomic_int32_t num_gotplt = 0;
std::atomic_int32_t num_plt = 0;
std::atomic_int32_t num_relplt = 0;
ScanRelResult res =
tbb::parallel_reduce(tbb::blocked_range<int>(0, files.size()),
ScanRelResult(),
[&](const tbb::blocked_range<int> &r, ScanRelResult res) {
for (int i = r.begin(); i != r.end(); i++)
res = res.add(files[i]->scan_relocations());
return res;
},
[](const ScanRelResult &x, const ScanRelResult &y) {
return x.add(y);
});
for_each(files, [&](ObjectFile *file) {
for (InputSection *isec : file->sections)
if (isec)
isec->scan_relocations();
num_got += file->num_got;
num_gotplt += file->num_gotplt;
num_plt += file->num_plt;
num_relplt += file->num_relplt;
});
out::got->shdr.sh_size = num_got * 8;
out::gotplt->shdr.sh_size = num_gotplt * 8;
out::plt->shdr.sh_size = num_plt * 16;
out::relplt->shdr.sh_size = num_relplt * sizeof(ELF64LE::Rela);
out::got->shdr.sh_size = res.num_got * 8;
out::gotplt->shdr.sh_size = res.num_gotplt * 8;
out::plt->shdr.sh_size = res.num_plt * 16;
out::relplt->shdr.sh_size = res.num_relplt * sizeof(ELF64LE::Rela);
}
static void assign_got_offsets(u8 *buf, ArrayRef<ObjectFile *> files) {

27
mold.h
View File

@ -12,6 +12,7 @@
#include "tbb/concurrent_hash_map.h"
#include "tbb/global_control.h"
#include "tbb/parallel_for_each.h"
#include "tbb/parallel_reduce.h"
#include "tbb/spin_mutex.h"
#include "tbb/task_group.h"
@ -193,16 +194,30 @@ inline std::string toString(Symbol sym) {
}
//
// input_chunks.cc
// input_sections.cc
//
struct ScanRelResult {
ScanRelResult add(const ScanRelResult &other) const {
return {num_got + other.num_got,
num_gotplt + other.num_gotplt,
num_plt + other.num_plt,
num_relplt + other.num_relplt};
}
u32 num_got = 0;
u32 num_gotplt = 0;
u32 num_plt = 0;
u32 num_relplt = 0;
};
class InputSection {
public:
InputSection(ObjectFile *file, const ELF64LE::Shdr &shdr, StringRef name);
void copy_to(u8 *buf);
void relocate(u8 *buf);
void scan_relocations();
ScanRelResult scan_relocations();
ObjectFile *file;
OutputSection *output_section;
@ -498,6 +513,7 @@ public:
void hanlde_undefined_weak_symbols();
void eliminate_duplicate_comdat_groups();
void convert_common_symbols();
ScanRelResult scan_relocations();
void fix_sym_addrs();
void compute_symtab();
@ -522,13 +538,6 @@ public:
u64 global_symtab_size = 0;
u64 global_strtab_size = 0;
// Number of .got, .got.plt, .plt and .rel.plt entries
// needed for this file.
i32 num_got = 0;
i32 num_gotplt = 0;
i32 num_plt = 0;
i32 num_relplt = 0;
private:
void initialize_sections();
void initialize_symbols();

View File

@ -401,6 +401,14 @@ void ObjectFile::convert_common_symbols() {
}
}
ScanRelResult ObjectFile::scan_relocations() {
ScanRelResult res;
for (InputSection *isec : sections)
if (isec)
res = res.add(isec->scan_relocations());
return res;
}
void ObjectFile::fix_sym_addrs() {
for (Symbol *sym : symbols) {
if (sym->file != this)