mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-01 23:50:43 +03:00
Small jit fixes (#2570)
* Better thunks stripping from jit module. * Fixes to jit disassembler * Strip comdats from jit module
This commit is contained in:
parent
16ecb3e79f
commit
bfd412cdf9
5 changed files with 145 additions and 49 deletions
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "disassembler.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <llvm/ADT/Triple.h>
|
||||
|
@ -201,14 +202,18 @@ public:
|
|||
};
|
||||
|
||||
void processRelocations(SymTable &symTable,
|
||||
uint64_t offset,
|
||||
const llvm::object::ObjectFile &object,
|
||||
const llvm::object::SectionRef &sec) {
|
||||
for (const auto &reloc : sec.relocations()) {
|
||||
const auto symIt = reloc.getSymbol();
|
||||
if (object.symbol_end() != symIt) {
|
||||
const auto sym = *symIt;
|
||||
symTable.addExternalSymbolRel(reloc.getOffset(),
|
||||
llvm::cantFail(sym.getName()));
|
||||
auto relOffet = reloc.getOffset();
|
||||
if (relOffet >= offset) {
|
||||
symTable.addExternalSymbolRel(relOffet - offset,
|
||||
llvm::cantFail(sym.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -286,6 +291,21 @@ void disassemble(const llvm::TargetMachine &tm,
|
|||
|
||||
asmStreamer->InitSections(false);
|
||||
|
||||
std::unordered_map<uint64_t, std::vector<uint64_t>> sectionsToProcess;
|
||||
for (const auto &symbol : object.symbols()) {
|
||||
const auto secIt = llvm::cantFail(symbol.getSection());
|
||||
if (object.section_end() != secIt) {
|
||||
auto offset = symbol.getValue();
|
||||
sectionsToProcess[secIt->getIndex()].push_back(offset);
|
||||
}
|
||||
}
|
||||
for (auto &sec : sectionsToProcess) {
|
||||
auto &vec = sec.second;
|
||||
std::sort(vec.begin(), vec.end());
|
||||
auto end = std::unique(vec.begin(), vec.end());
|
||||
vec.erase(end, vec.end());
|
||||
}
|
||||
|
||||
for (const auto &symbol : object.symbols()) {
|
||||
const auto name = llvm::cantFail(symbol.getName());
|
||||
const auto secIt = llvm::cantFail(symbol.getSection());
|
||||
|
@ -293,20 +313,32 @@ void disassemble(const llvm::TargetMachine &tm,
|
|||
const auto sec = *secIt;
|
||||
llvm::StringRef data;
|
||||
sec.getContents(data);
|
||||
llvm::ArrayRef<uint8_t> buff(
|
||||
reinterpret_cast<const uint8_t *>(data.data()), data.size());
|
||||
|
||||
if (llvm::object::SymbolRef::ST_Function ==
|
||||
llvm::cantFail(symbol.getType())) {
|
||||
symTable.reset();
|
||||
symTable.addLabel(0, 0, name); // Function start
|
||||
processRelocations(symTable, object, sec);
|
||||
auto offset = symbol.getValue();
|
||||
processRelocations(symTable, offset, object, sec);
|
||||
|
||||
// TODO: something more optimal
|
||||
for (const auto &globalSec : object.sections()) {
|
||||
if (globalSec.getRelocatedSection() == secIt) {
|
||||
processRelocations(symTable, object, globalSec);
|
||||
processRelocations(symTable, offset, object, globalSec);
|
||||
}
|
||||
}
|
||||
auto size = data.size() - offset;
|
||||
auto &ranges = sectionsToProcess[sec.getIndex()];
|
||||
if (!ranges.empty()) {
|
||||
for (std::size_t i = 0; i < ranges.size() - 1; ++i) {
|
||||
if (ranges[i] == offset) {
|
||||
size = std::min(size, ranges[i + 1] - offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
llvm::ArrayRef<uint8_t> buff(
|
||||
reinterpret_cast<const uint8_t *>(data.data() + offset),
|
||||
size);
|
||||
|
||||
printFunction(*disasm, *mcia, buff, symTable, *sti, *asmStreamer);
|
||||
asmStreamer->EmitRawText("");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue