1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-22 02:20:51 +03:00

temporary

This commit is contained in:
Rui Ueyama 2021-01-09 15:43:28 +09:00
parent 6eeadec175
commit e3b5c922f9
4 changed files with 32 additions and 32 deletions

View File

@ -405,7 +405,8 @@ MergeableSection::MergeableSection(InputSection *isec, std::string_view data)
data = data.substr(end + 1);
StringPiece *piece = parent.map.insert(substr, StringPiece(substr));
pieces.push_back({piece, offset});
pieces.push_back(piece);
piece_offsets.push_back(offset);
offset += substr.size();
}

15
main.cc
View File

@ -190,10 +190,10 @@ static void handle_mergeable_strings() {
// Resolve mergeable string pieces
tbb::parallel_for_each(out::objs, [](ObjectFile *file) {
for (MergeableSection *m : file->mergeable_sections) {
for (StringPieceRef &ref : m->pieces) {
MergeableSection *cur = ref.piece->isec;
for (StringPiece *piece : m->pieces) {
MergeableSection *cur = piece->isec;
while (!cur || cur->file->priority > m->file->priority)
if (ref.piece->isec.compare_exchange_weak(cur, m))
if (piece->isec.compare_exchange_weak(cur, m))
break;
}
}
@ -203,11 +203,10 @@ static void handle_mergeable_strings() {
tbb::parallel_for_each(out::objs, [](ObjectFile *file) {
for (MergeableSection *m : file->mergeable_sections) {
u32 offset = 0;
for (StringPieceRef &ref : m->pieces) {
StringPiece &piece = *ref.piece;
if (piece.isec == m && piece.output_offset == -1) {
ref.piece->output_offset = offset;
offset += ref.piece->size;
for (StringPiece *piece : m->pieces) {
if (piece->isec == m && piece->output_offset == -1) {
piece->output_offset = offset;
offset += piece->size;
}
}
m->size = offset;

4
mold.h
View File

@ -188,7 +188,6 @@ struct StringPiece {
struct StringPieceRef {
StringPiece *piece = nullptr;
u32 input_offset = 0;
i32 addend = 0;
};
@ -317,7 +316,8 @@ public:
MergeableSection(InputSection *isec, std::string_view contents);
MergedSection &parent;
std::vector<StringPieceRef> pieces;
std::vector<StringPiece *> pieces;
std::vector<u32> piece_offsets;
u32 size = 0;
};

View File

@ -258,21 +258,21 @@ void ObjectFile::initialize_symbols() {
}
}
static const StringPieceRef *
binary_search(std::span<StringPieceRef> pieces, u32 offset) {
if (offset < pieces[0].input_offset)
return nullptr;
static int binary_search(std::span<u32> span, u32 offset) {
if (offset < span[0])
return -1;
while (pieces.size() > 1) {
u32 mid = pieces.size() / 2;
const StringPieceRef &ref = pieces[mid];
if (offset < ref.input_offset)
pieces = pieces.subspan(0, mid);
else
pieces = pieces.subspan(mid);
int ret = 0;
while (span.size() > 1) {
u32 mid = span.size() / 2;
if (offset < span[mid]) {
span = span.subspan(0, mid);
} else {
span = span.subspan(mid);
ret += mid;
}
}
return &pieces[0];
return ret;
}
static bool is_mergeable(const ElfShdr &shdr) {
@ -321,12 +321,12 @@ void ObjectFile::initialize_mergeable_sections() {
continue;
u32 offset = esym.st_value + rel.r_addend;
const StringPieceRef *ref = binary_search(m->pieces, offset);
if (!ref)
int idx = binary_search(m->piece_offsets, offset);
if (idx == -1)
Error() << *this << ": bad relocation at " << rel.r_sym;
isec->rel_pieces.push_back(
{.piece = ref->piece, .addend = (i32)(offset - ref->input_offset)});
{m->pieces[idx], (i32)(offset - m->piece_offsets[idx])});
isec->has_rel_piece[i] = true;
}
}
@ -342,15 +342,15 @@ void ObjectFile::initialize_mergeable_sections() {
if (!m)
continue;
const StringPieceRef *ref = binary_search(m->pieces, esym.st_value);
if (!ref)
int idx = binary_search(m->piece_offsets, esym.st_value);
if (idx == -1)
Error() << *this << ": bad symbol value";
if (i < first_global) {
local_symbols[i].piece_ref = *ref;
local_symbols[i].piece_ref.piece = m->pieces[idx];
} else {
sym_pieces[i - first_global].piece = ref->piece;
sym_pieces[i - first_global].addend = esym.st_value - ref->input_offset;
sym_pieces[i - first_global].piece = m->pieces[idx];
sym_pieces[i - first_global].addend = esym.st_value - m->piece_offsets[idx];
}
}