summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binary-writer.cc27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/binary-writer.cc b/src/binary-writer.cc
index bc42543b..00947afa 100644
--- a/src/binary-writer.cc
+++ b/src/binary-writer.cc
@@ -199,9 +199,9 @@ class BinaryWriter {
private:
void WriteHeader(const char* name, int index);
Offset WriteU32Leb128Space(Offset leb_size_guess, const char* desc);
- void WriteFixupU32Leb128Size(Offset offset,
- Offset leb_size_guess,
- const char* desc);
+ Offset WriteFixupU32Leb128Size(Offset offset,
+ Offset leb_size_guess,
+ const char* desc);
void BeginKnownSection(BinarySection section_code, size_t leb_size_guess);
void BeginCustomSection(const char* name, size_t leb_size_guess);
void EndSection();
@@ -274,22 +274,25 @@ Offset BinaryWriter::WriteU32Leb128Space(Offset leb_size_guess,
return result;
}
-void BinaryWriter::WriteFixupU32Leb128Size(Offset offset,
- Offset leb_size_guess,
- const char* desc) {
+Offset BinaryWriter::WriteFixupU32Leb128Size(Offset offset,
+ Offset leb_size_guess,
+ const char* desc) {
if (options_->canonicalize_lebs) {
Offset size = stream_.offset() - offset - leb_size_guess;
Offset leb_size = u32_leb128_length(size);
- if (leb_size != leb_size_guess) {
+ Offset delta = leb_size - leb_size_guess;
+ if (delta != 0) {
Offset src_offset = offset + leb_size_guess;
Offset dst_offset = offset + leb_size;
stream_.MoveData(dst_offset, src_offset, size);
}
write_u32_leb128_at(&stream_, offset, size, desc);
- stream_.AddOffset(leb_size - leb_size_guess);
+ stream_.AddOffset(delta);
+ return delta;
} else {
Offset size = stream_.offset() - offset - MAX_U32_LEB128_BYTES;
write_fixed_u32_leb128_at(&stream_, offset, size, desc);
+ return 0;
}
}
@@ -338,8 +341,12 @@ void BinaryWriter::BeginCustomSection(const char* name, size_t leb_size_guess) {
void BinaryWriter::EndSection() {
assert(last_section_leb_size_guess_ != 0);
- WriteFixupU32Leb128Size(last_section_offset_, last_section_leb_size_guess_,
- "FIXUP section size");
+ Offset delta = WriteFixupU32Leb128Size(
+ last_section_offset_, last_section_leb_size_guess_, "FIXUP section size");
+ if (current_reloc_section_ && delta != 0) {
+ for (Reloc& reloc: current_reloc_section_->relocations)
+ reloc.offset += delta;
+ }
last_section_leb_size_guess_ = 0;
}