解析 LLVM IR 代码(带有调试符号)以将其映射回原始源代码
Parsing LLVM IR code (with debug symbols) to map it back to the original source
我正在考虑构建一个工具来帮助我可视化为我的原始源文件中的每个 instruction/function 生成的 LLVM-IR 代码。
类似于 this 但对于 LLVM-IR。
到目前为止构建此类工具的步骤似乎是:
- 从 LLVM-IR AST 构建器开始。
- 解析生成的红外代码。
- 在插入符位置获取 AST 元素。
- 读取元素作用域、行、列和
文件并在原始源文件上发出信号。
这是处理它的正确方法吗?我是不是太小看它了?
我觉得你的做法很正确。 UI 部分的实现可能会很长,所以我将专注于 llvm 部分。
假设您从包含 LLVM-IR 的输入文件开始。
步骤 1 进程模块:
将文件内容读入字符串。然后从中构建一个模块,并处理它以获取调试信息:
llvm::MemoryBuffer* buf = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(fileContent)).release();
llvm::SMDiagnostic diag;
llvm::Module* module = llvm::parseIR(buf->getMemBufferRef(), diag, *context).release();
llvm::DebugInfoFinder* dif = new llvm::DebugInfoFinder();
dif->processModule(*module);
步骤 2 迭代指令:
完成后,您可以简单地迭代函数、块和指令:
// pseudo code for loops (real code is a bit long)
foreach(llvm::Function f in module.functions)
{
foreach(llvm::BasicBlock b in f.BasicBlockList)
{
foreach(llvm::Instruction inst in b.InstList)
{
llvm::DebugLoc dl = inst.getDebugLoc();
unsigned line = dl->getLine();
// accordingly populate some dictionary between your instructions and source code
}
}
}
步骤 3 更新您的 UI
这是另一个故事...
我正在考虑构建一个工具来帮助我可视化为我的原始源文件中的每个 instruction/function 生成的 LLVM-IR 代码。 类似于 this 但对于 LLVM-IR。
到目前为止构建此类工具的步骤似乎是:
- 从 LLVM-IR AST 构建器开始。
- 解析生成的红外代码。
- 在插入符位置获取 AST 元素。
- 读取元素作用域、行、列和 文件并在原始源文件上发出信号。
这是处理它的正确方法吗?我是不是太小看它了?
我觉得你的做法很正确。 UI 部分的实现可能会很长,所以我将专注于 llvm 部分。
假设您从包含 LLVM-IR 的输入文件开始。
步骤 1 进程模块:
将文件内容读入字符串。然后从中构建一个模块,并处理它以获取调试信息:
llvm::MemoryBuffer* buf = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(fileContent)).release();
llvm::SMDiagnostic diag;
llvm::Module* module = llvm::parseIR(buf->getMemBufferRef(), diag, *context).release();
llvm::DebugInfoFinder* dif = new llvm::DebugInfoFinder();
dif->processModule(*module);
步骤 2 迭代指令:
完成后,您可以简单地迭代函数、块和指令:
// pseudo code for loops (real code is a bit long)
foreach(llvm::Function f in module.functions)
{
foreach(llvm::BasicBlock b in f.BasicBlockList)
{
foreach(llvm::Instruction inst in b.InstList)
{
llvm::DebugLoc dl = inst.getDebugLoc();
unsigned line = dl->getLine();
// accordingly populate some dictionary between your instructions and source code
}
}
}
步骤 3 更新您的 UI
这是另一个故事...