mirror of
https://github.com/rui314/mold.git
synced 2024-09-22 02:20:51 +03:00
temporary
This commit is contained in:
parent
6eeadec175
commit
e3b5c922f9
@ -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
15
main.cc
@ -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
4
mold.h
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user