Я знаю, как анализировать модуль из изображения битового кода LLVM и как перебирать определения функций.
Теперь я хочу переупорядочить функции, чтобы улучшить локальность между некоторыми функциями, которые измерены, чтобы иметь более близкие отношения друг с другом.
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/CFG.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/raw_ostream.h>
using namespace llvm;
constexpr const char TEST_FILE[] = "some-file";
std::vector<std::string> symbol_order {};
int some_function() {
auto context = LLVMContext{};
SMDiagnostic err;
auto module = parseIRFile(TEST_FILE, err, context);
// get all functions and adjust order according to symbol order
// wrtie back to a valid module bitcode file
}
Это оказывается сложно, потому что мне может потребоваться закрыть функцию и вставить их по порядку, что выходит за рамки моих текущих знаний.
Прежде чем я действительно займусь этим вопросом, у меня есть еще кое-что для беспокойства:
будет ли порядок определений в файле IR эффективно влиять на окончательный результат ELF?
Я сейчас пишу исполняемый файл, работающий непосредственно с IR-файлами; будет ли правильнее написать проход модуля?
обновление
Я вижу, что возможный способ сортировки функции:
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/CFG.h>
#include <llvm/Bitcode/BitcodeWriter.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/raw_ostream.h>
#include <absl/container/flat_hash_map.h>
using namespace llvm;
constexpr const char TEST_FILE[] = "file.bc";
absl::flat_hash_map<std::string, size_t> order;
struct Compare {
bool operator()(const Function& a, const Function& b) {
return order[a.getName().data()] < order[b.getName().data()];
}
};
int main() {
auto context = LLVMContext{};
SMDiagnostic err;
auto module = parseIRFile(TEST_FILE, err, context);
auto& list = module->getFunctionList();
list.sort(Compare());
WriteBitcodeToFile(*module, llvm::outs());
// get all functions and adjust order according to symbol order
// wrtie back to a valid module bitcode file
}
нарушит ли это отношения зависимости ?