Small jit fixes (#2570)

* Better thunks stripping from jit module.
    * Fixes to jit disassembler
    * Strip comdats from jit module
This commit is contained in:
Ivan Butygin 2018-02-14 17:57:37 +03:00 committed by GitHub
parent 16ecb3e79f
commit bfd412cdf9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 145 additions and 49 deletions

View file

@ -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("");