как настроить расположение функции в модуле LLVM - PullRequest
0 голосов
/ 30 мая 2020

Я знаю, как анализировать модуль из изображения битового кода 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

}

Это оказывается сложно, потому что мне может потребоваться закрыть функцию и вставить их по порядку, что выходит за рамки моих текущих знаний.

Прежде чем я действительно займусь этим вопросом, у меня есть еще кое-что для беспокойства:

  1. будет ли порядок определений в файле IR эффективно влиять на окончательный результат ELF?

  2. Я сейчас пишу исполняемый файл, работающий непосредственно с 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
}

нарушит ли это отношения зависимости ?

1 Ответ

0 голосов
/ 31 мая 2020

Порядок функций в IR обычно не определяет порядок функций в конечном двоичном файле. Более того, компоновщик может изменять порядок функций по мере необходимости. И обычно работа компоновщика заключается в улучшении локальности функций. В LLD уже есть код для этого.

...