Remove oat_patches from the DWARF writer.
We no longer use them.
Test: test-art-host-gtest-dwarf_test
Change-Id: Ie018d2314f028584edb398b6310a7284a0ec2069
diff --git a/compiler/cfi_test.h b/compiler/cfi_test.h
index bc816da..2fc81c9 100644
--- a/compiler/cfi_test.h
+++ b/compiler/cfi_test.h
@@ -51,14 +51,11 @@
dwarf::WriteCIE(is64bit, dwarf::Reg(8), initial_opcodes, &debug_frame_data_);
std::vector<uintptr_t> debug_frame_patches;
dwarf::WriteFDE(is64bit,
- /* section_address= */ 0,
- /* cie_address= */ 0,
+ /* cie_pointer= */ 0,
/* code_address= */ 0,
actual_asm.size(),
actual_cfi,
- /* buffer_address= */ 0,
- &debug_frame_data_,
- &debug_frame_patches);
+ &debug_frame_data_);
ReformatCfi(Objdump(false, "-W"), &lines);
// Pretty-print assembly.
const uint8_t* asm_base = actual_asm.data();
diff --git a/compiler/debug/dwarf/dwarf_test.cc b/compiler/debug/dwarf/dwarf_test.cc
index 52717c3..212fd63 100644
--- a/compiler/debug/dwarf/dwarf_test.cc
+++ b/compiler/debug/dwarf/dwarf_test.cc
@@ -121,19 +121,13 @@
DebugFrameOpCodeWriter<> initial_opcodes;
WriteCIE(is64bit, Reg(is64bit ? 16 : 8), initial_opcodes, &debug_frame_data_);
- std::vector<uintptr_t> debug_frame_patches;
- std::vector<uintptr_t> expected_patches = { 28 };
WriteFDE(is64bit,
- 0,
- 0,
+ /* cie_pointer= */ 0,
0x01000000,
0x01000000,
ArrayRef<const uint8_t>(*opcodes.data()),
- 0,
- &debug_frame_data_,
- &debug_frame_patches);
+ &debug_frame_data_);
- EXPECT_EQ(expected_patches, debug_frame_patches);
CheckObjdumpOutput(is64bit, "-W");
}
@@ -142,20 +136,14 @@
DebugFrameOpCodeWriter<> initial_opcodes;
WriteCIE(is64bit, Reg(16), initial_opcodes, &debug_frame_data_);
DebugFrameOpCodeWriter<> opcodes;
- std::vector<uintptr_t> debug_frame_patches;
- std::vector<uintptr_t> expected_patches = { 32 };
WriteFDE(is64bit,
- 0,
- 0,
+ /* cie_pointer= */ 0,
0x0100000000000000,
0x0200000000000000,
ArrayRef<const uint8_t>(*opcodes.data()),
- 0,
- &debug_frame_data_,
- &debug_frame_patches);
+ &debug_frame_data_);
DW_CHECK("FDE cie=00000000 pc=100000000000000..300000000000000");
- EXPECT_EQ(expected_patches, debug_frame_patches);
CheckObjdumpOutput(is64bit, "-W");
}
@@ -186,16 +174,12 @@
DW_CHECK_NEXT("DW_CFA_offset: r15 (r15)");
DebugFrameOpCodeWriter<> initial_opcodes;
WriteCIE(is64bit, Reg(16), initial_opcodes, &debug_frame_data_);
- std::vector<uintptr_t> debug_frame_patches;
WriteFDE(is64bit,
- 0,
- 0,
+ /* cie_pointer= */ 0,
0x0100000000000000,
0x0200000000000000,
ArrayRef<const uint8_t>(*opcodes.data()),
- 0,
- &debug_frame_data_,
- &debug_frame_patches);
+ &debug_frame_data_);
CheckObjdumpOutput(is64bit, "-W");
}
@@ -250,12 +234,8 @@
DW_CHECK_NEXT("Entry\tDir\tTime\tSize\tName");
DW_CHECK_NEXT("1\t0\t1000\t2000\tfile.c");
- std::vector<uintptr_t> debug_line_patches;
- std::vector<uintptr_t> expected_patches = { 87 };
- WriteDebugLineTable(include_directories, files, opcodes,
- 0, &debug_line_data_, &debug_line_patches);
+ WriteDebugLineTable(include_directories, files, opcodes, &debug_line_data_);
- EXPECT_EQ(expected_patches, debug_line_patches);
CheckObjdumpOutput(is64bit, "-W");
}
@@ -290,9 +270,7 @@
std::vector<std::string> directories;
std::vector<FileEntry> files = { { "file.c", 0, 1000, 2000 } };
- std::vector<uintptr_t> debug_line_patches;
- WriteDebugLineTable(directories, files, opcodes,
- 0, &debug_line_data_, &debug_line_patches);
+ WriteDebugLineTable(directories, files, opcodes, &debug_line_data_);
CheckObjdumpOutput(is64bit, "-W -WL");
}
@@ -346,12 +324,8 @@
DW_CHECK_NEXT("DW_AT_high_pc DW_FORM_addr");
DW_CHECK("3 DW_TAG_compile_unit [no children]");
- std::vector<uintptr_t> debug_info_patches;
- std::vector<uintptr_t> expected_patches = { 16, 20, 29, 33, 42, 46 };
- dwarf::WriteDebugInfoCU(/* debug_abbrev_offset= */ 0, info,
- 0, &debug_info_data_, &debug_info_patches);
+ dwarf::WriteDebugInfoCU(/* debug_abbrev_offset= */ 0, info, &debug_info_data_);
- EXPECT_EQ(expected_patches, debug_info_patches);
CheckObjdumpOutput(is64bit, "-W");
}
diff --git a/compiler/debug/dwarf/headers.h b/compiler/debug/dwarf/headers.h
index 119bfe9..869a2c2 100644
--- a/compiler/debug/dwarf/headers.h
+++ b/compiler/debug/dwarf/headers.h
@@ -67,26 +67,16 @@
// Write frame description entry (FDE) to .debug_frame or .eh_frame section.
inline
void WriteFDE(bool is64bit,
- uint64_t section_address, // Absolute address of the section.
- uint64_t cie_address, // Absolute address of last CIE.
+ uint64_t cie_pointer, // Offset of relevant CIE in debug_frame setcion.
uint64_t code_address,
uint64_t code_size,
const ArrayRef<const uint8_t>& opcodes,
- uint64_t buffer_address, // Address of buffer in linked application.
- std::vector<uint8_t>* buffer,
- std::vector<uintptr_t>* patch_locations) {
- CHECK_GE(cie_address, section_address);
- CHECK_GE(buffer_address, section_address);
-
+ /*inout*/ std::vector<uint8_t>* buffer) {
Writer<> writer(buffer);
size_t fde_header_start = writer.data()->size();
writer.PushUint32(0); // Length placeholder.
- uint32_t cie_pointer = cie_address - section_address;
writer.PushUint32(cie_pointer);
// Relocate code_address if it has absolute value.
- if (patch_locations != nullptr) {
- patch_locations->push_back(buffer_address + buffer->size() - section_address);
- }
if (is64bit) {
writer.PushUint64(code_address);
writer.PushUint64(code_size);
@@ -128,9 +118,7 @@
template<typename Vector>
void WriteDebugInfoCU(uint32_t debug_abbrev_offset,
const DebugInfoEntryWriter<Vector>& entries,
- size_t debug_info_offset, // offset from start of .debug_info.
- std::vector<uint8_t>* debug_info,
- std::vector<uintptr_t>* debug_info_patches) {
+ std::vector<uint8_t>* debug_info) {
static_assert(std::is_same<typename Vector::value_type, uint8_t>::value, "Invalid value type");
Writer<> writer(debug_info);
@@ -143,10 +131,6 @@
DCHECK_EQ(entries_offset, DebugInfoEntryWriter<Vector>::kCompilationUnitHeaderSize);
writer.PushData(entries.data());
writer.UpdateUint32(start, writer.data()->size() - start - 4);
- // Copy patch locations and make them relative to .debug_info section.
- for (uintptr_t patch_location : entries.GetPatchLocations()) {
- debug_info_patches->push_back(debug_info_offset + entries_offset + patch_location);
- }
}
struct FileEntry {
@@ -161,9 +145,7 @@
void WriteDebugLineTable(const std::vector<std::string>& include_directories,
const std::vector<FileEntry>& files,
const DebugLineOpCodeWriter<Vector>& opcodes,
- size_t debug_line_offset, // offset from start of .debug_line.
- std::vector<uint8_t>* debug_line,
- std::vector<uintptr_t>* debug_line_patches) {
+ std::vector<uint8_t>* debug_line) {
static_assert(std::is_same<typename Vector::value_type, uint8_t>::value, "Invalid value type");
Writer<> writer(debug_line);
@@ -194,13 +176,8 @@
}
writer.PushUint8(0); // Terminate file list.
writer.UpdateUint32(header_length_pos, writer.data()->size() - header_length_pos - 4);
- size_t opcodes_offset = writer.data()->size();
writer.PushData(opcodes.data());
writer.UpdateUint32(header_start, writer.data()->size() - header_start - 4);
- // Copy patch locations and make them relative to .debug_line section.
- for (uintptr_t patch_location : opcodes.GetPatchLocations()) {
- debug_line_patches->push_back(debug_line_offset + opcodes_offset + patch_location);
- }
}
} // namespace dwarf
diff --git a/compiler/debug/elf_debug_frame_writer.h b/compiler/debug/elf_debug_frame_writer.h
index a6bbea4..c5fa647 100644
--- a/compiler/debug/elf_debug_frame_writer.h
+++ b/compiler/debug/elf_debug_frame_writer.h
@@ -169,8 +169,7 @@
template<typename ElfTypes>
void WriteCFISection(linker::ElfBuilder<ElfTypes>* builder,
- const ArrayRef<const MethodDebugInfo>& method_infos,
- bool write_oat_patches) {
+ const ArrayRef<const MethodDebugInfo>& method_infos) {
typedef typename ElfTypes::Addr Elf_Addr;
// The methods can be written in any order.
@@ -197,11 +196,8 @@
});
std::vector<uint32_t> binary_search_table;
- std::vector<uintptr_t> patch_locations;
if (kWriteDebugFrameHdr) {
binary_search_table.reserve(2 * sorted_method_infos.size());
- } else {
- patch_locations.reserve(sorted_method_infos.size());
}
// Write .debug_frame section.
@@ -209,11 +205,9 @@
{
cfi_section->Start();
const bool is64bit = Is64BitInstructionSet(builder->GetIsa());
- Elf_Addr buffer_address = 0;
std::vector<uint8_t> buffer; // Small temporary buffer.
WriteCIE(builder->GetIsa(), &buffer);
cfi_section->WriteFully(buffer.data(), buffer.size());
- buffer_address += buffer.size();
buffer.clear();
for (const MethodDebugInfo* mi : sorted_method_infos) {
DCHECK(!mi->deduped);
@@ -222,19 +216,15 @@
(mi->is_code_address_text_relative ? builder->GetText()->GetAddress() : 0);
if (kWriteDebugFrameHdr) {
binary_search_table.push_back(dchecked_integral_cast<uint32_t>(code_address));
- binary_search_table.push_back(dchecked_integral_cast<uint32_t>(buffer_address));
+ binary_search_table.push_back(cfi_section->GetPosition());
}
dwarf::WriteFDE(is64bit,
- 0,
- 0,
+ /* cie_pointer= */ 0,
code_address,
mi->code_size,
mi->cfi,
- buffer_address,
- &buffer,
- &patch_locations);
+ &buffer);
cfi_section->WriteFully(buffer.data(), buffer.size());
- buffer_address += buffer.size();
buffer.clear();
}
cfi_section->End();
@@ -254,11 +244,6 @@
header_section->WriteFully(header_buffer.data(), header_buffer.size());
header_section->WriteFully(binary_search_table.data(), binary_search_table.size());
header_section->End();
- } else {
- if (write_oat_patches) {
- builder->WritePatches(".debug_frame.oat_patches",
- ArrayRef<const uintptr_t>(patch_locations));
- }
}
}
diff --git a/compiler/debug/elf_debug_info_writer.h b/compiler/debug/elf_debug_info_writer.h
index a63f241..05a4a3e 100644
--- a/compiler/debug/elf_debug_info_writer.h
+++ b/compiler/debug/elf_debug_info_writer.h
@@ -68,12 +68,8 @@
builder_->GetDebugInfo()->Start();
}
- void End(bool write_oat_patches) {
+ void End() {
builder_->GetDebugInfo()->End();
- if (write_oat_patches) {
- builder_->WritePatches(".debug_info.oat_patches",
- ArrayRef<const uintptr_t>(debug_info_patches_));
- }
builder_->WriteSection(".debug_abbrev", &debug_abbrev_buffer_);
if (!debug_loc_.empty()) {
builder_->WriteSection(".debug_loc", &debug_loc_);
@@ -85,7 +81,6 @@
private:
linker::ElfBuilder<ElfTypes>* builder_;
- std::vector<uintptr_t> debug_info_patches_;
std::vector<uint8_t> debug_abbrev_buffer_;
dwarf::DebugAbbrevWriter<> debug_abbrev_;
std::vector<uint8_t> debug_loc_;
@@ -281,10 +276,9 @@
CHECK_EQ(info_.Depth(), 0);
std::vector<uint8_t> buffer;
buffer.reserve(info_.data()->size() + KB);
- const size_t offset = owner_->builder_->GetDebugInfo()->GetPosition();
// All compilation units share single table which is at the start of .debug_abbrev.
const size_t debug_abbrev_offset = 0;
- WriteDebugInfoCU(debug_abbrev_offset, info_, offset, &buffer, &owner_->debug_info_patches_);
+ WriteDebugInfoCU(debug_abbrev_offset, info_, &buffer);
owner_->builder_->GetDebugInfo()->WriteFully(buffer.data(), buffer.size());
}
@@ -446,10 +440,9 @@
CHECK_EQ(info_.Depth(), 0);
std::vector<uint8_t> buffer;
buffer.reserve(info_.data()->size() + KB);
- const size_t offset = owner_->builder_->GetDebugInfo()->GetPosition();
// All compilation units share single table which is at the start of .debug_abbrev.
const size_t debug_abbrev_offset = 0;
- WriteDebugInfoCU(debug_abbrev_offset, info_, offset, &buffer, &owner_->debug_info_patches_);
+ WriteDebugInfoCU(debug_abbrev_offset, info_, &buffer);
owner_->builder_->GetDebugInfo()->WriteFully(buffer.data(), buffer.size());
}
diff --git a/compiler/debug/elf_debug_line_writer.h b/compiler/debug/elf_debug_line_writer.h
index 0a13a92..f95912a 100644
--- a/compiler/debug/elf_debug_line_writer.h
+++ b/compiler/debug/elf_debug_line_writer.h
@@ -263,23 +263,17 @@
}
std::vector<uint8_t> buffer;
buffer.reserve(opcodes.data()->size() + KB);
- size_t offset = builder_->GetDebugLine()->GetPosition();
- WriteDebugLineTable(directories, files, opcodes, offset, &buffer, &debug_line_patches_);
+ WriteDebugLineTable(directories, files, opcodes, &buffer);
builder_->GetDebugLine()->WriteFully(buffer.data(), buffer.size());
return buffer.size();
}
- void End(bool write_oat_patches) {
+ void End() {
builder_->GetDebugLine()->End();
- if (write_oat_patches) {
- builder_->WritePatches(".debug_line.oat_patches",
- ArrayRef<const uintptr_t>(debug_line_patches_));
- }
}
private:
linker::ElfBuilder<ElfTypes>* builder_;
- std::vector<uintptr_t> debug_line_patches_;
};
} // namespace debug
diff --git a/compiler/debug/elf_debug_writer.cc b/compiler/debug/elf_debug_writer.cc
index 68c4e15..78c02b6 100644
--- a/compiler/debug/elf_debug_writer.cc
+++ b/compiler/debug/elf_debug_writer.cc
@@ -44,13 +44,12 @@
template <typename ElfTypes>
void WriteDebugInfo(linker::ElfBuilder<ElfTypes>* builder,
- const DebugInfo& debug_info,
- bool write_oat_patches) {
+ const DebugInfo& debug_info) {
// Write .strtab and .symtab.
WriteDebugSymbols(builder, /* mini-debug-info= */ false, debug_info);
// Write .debug_frame.
- WriteCFISection(builder, debug_info.compiled_methods, write_oat_patches);
+ WriteCFISection(builder, debug_info.compiled_methods);
// Group the methods into compilation units based on class.
std::unordered_map<const dex::ClassDef*, ElfCompilationUnit> class_to_compilation_unit;
@@ -95,7 +94,7 @@
for (auto& compilation_unit : compilation_units) {
line_writer.WriteCompilationUnit(compilation_unit);
}
- line_writer.End(write_oat_patches);
+ line_writer.End();
}
// Write .debug_info section.
@@ -106,7 +105,7 @@
ElfCompilationUnitWriter<ElfTypes> cu_writer(&info_writer);
cu_writer.Write(compilation_unit);
}
- info_writer.End(write_oat_patches);
+ info_writer.End();
}
}
@@ -136,7 +135,7 @@
WriteDebugSymbols(builder.get(), /* mini-debug-info= */ true, debug_info);
}
if (!debug_info.compiled_methods.empty()) {
- WriteCFISection(builder.get(), debug_info.compiled_methods, /* write_oat_patches= */ false);
+ WriteCFISection(builder.get(), debug_info.compiled_methods);
}
builder->End();
CHECK(builder->Good());
@@ -195,9 +194,9 @@
// The compression is great help for multiple methods but it is not worth it for a
// single method due to the overheads so skip the compression here for performance.
WriteDebugSymbols(builder.get(), /* mini-debug-info= */ true, debug_info);
- WriteCFISection(builder.get(), debug_info.compiled_methods, /* write_oat_patches= */ false);
+ WriteCFISection(builder.get(), debug_info.compiled_methods);
} else {
- WriteDebugInfo(builder.get(), debug_info, /* write_oat_patches= */ false);
+ WriteDebugInfo(builder.get(), debug_info);
}
builder->End();
CHECK(builder->Good());
@@ -284,14 +283,11 @@
return;
}
dwarf::WriteFDE(is64bit,
- /*section_address=*/ 0,
- /*cie_address=*/ 0,
+ /* cie_pointer= */ 0,
addr,
size,
opcodes,
- debug_frame_buffer.size(),
- &debug_frame_buffer,
- /*patch_locations=*/ nullptr);
+ &debug_frame_buffer);
});
}
strtab->End();
@@ -360,7 +356,7 @@
info_writer.Start();
ElfCompilationUnitWriter<ElfTypes> cu_writer(&info_writer);
cu_writer.Write(types);
- info_writer.End(/* write_oat_patches= */ false);
+ info_writer.End();
builder->End();
CHECK(builder->Good());
@@ -370,12 +366,10 @@
// Explicit instantiations
template void WriteDebugInfo<ElfTypes32>(
linker::ElfBuilder<ElfTypes32>* builder,
- const DebugInfo& debug_info,
- bool write_oat_patches);
+ const DebugInfo& debug_info);
template void WriteDebugInfo<ElfTypes64>(
linker::ElfBuilder<ElfTypes64>* builder,
- const DebugInfo& debug_info,
- bool write_oat_patches);
+ const DebugInfo& debug_info);
} // namespace debug
} // namespace art
diff --git a/compiler/debug/elf_debug_writer.h b/compiler/debug/elf_debug_writer.h
index d5aa9cd..3cc38a2 100644
--- a/compiler/debug/elf_debug_writer.h
+++ b/compiler/debug/elf_debug_writer.h
@@ -37,8 +37,7 @@
template <typename ElfTypes>
void WriteDebugInfo(
linker::ElfBuilder<ElfTypes>* builder,
- const DebugInfo& debug_info,
- bool write_oat_patches);
+ const DebugInfo& debug_info);
std::vector<uint8_t> MakeMiniDebugInfo(
InstructionSet isa,
diff --git a/compiler/linker/elf_builder.h b/compiler/linker/elf_builder.h
index 54e07fc..33e1866 100644
--- a/compiler/linker/elf_builder.h
+++ b/compiler/linker/elf_builder.h
@@ -51,14 +51,10 @@
// .strtab - Names for .symtab.
// .symtab - Debug symbols.
// .debug_frame - Unwind information (CFI).
-// .debug_frame.oat_patches - Addresses for relocation.
// .debug_info - Debug information.
-// .debug_info.oat_patches - Addresses for relocation.
// .debug_abbrev - Decoding information for .debug_info.
// .debug_str - Strings for .debug_info.
// .debug_line - Line number tables.
-// .debug_line.oat_patches - Addresses for relocation.
-// .text.oat_patches - Addresses for relocation.
// .shstrtab - Names of ELF sections.
// Elf_Shdr[] - Section headers.
//
@@ -575,29 +571,6 @@
Section* GetDebugInfo() { return &debug_info_; }
Section* GetDebugLine() { return &debug_line_; }
- // Encode patch locations as LEB128 list of deltas between consecutive addresses.
- // (exposed publicly for tests)
- static void EncodeOatPatches(const ArrayRef<const uintptr_t>& locations,
- std::vector<uint8_t>* buffer) {
- buffer->reserve(buffer->size() + locations.size() * 2); // guess 2 bytes per ULEB128.
- uintptr_t address = 0; // relative to start of section.
- for (uintptr_t location : locations) {
- DCHECK_GE(location, address) << "Patch locations are not in sorted order";
- EncodeUnsignedLeb128(buffer, dchecked_integral_cast<uint32_t>(location - address));
- address = location;
- }
- }
-
- void WritePatches(const char* name, const ArrayRef<const uintptr_t>& patch_locations) {
- std::vector<uint8_t> buffer;
- EncodeOatPatches(patch_locations, &buffer);
- std::unique_ptr<Section> s(new Section(this, name, SHT_OAT_PATCH, 0, nullptr, 0, 1, 0));
- s->Start();
- s->WriteFully(buffer.data(), buffer.size());
- s->End();
- other_sections_.push_back(std::move(s));
- }
-
void WriteSection(const char* name, const std::vector<uint8_t>* buffer) {
std::unique_ptr<Section> s(new Section(this, name, SHT_PROGBITS, 0, nullptr, 0, 1, 0));
s->Start();