使用 RecursiveASTVisitor 用 LibTooling 重写 C 代码

问题描述 投票:0回答:0

我是 clang 的新手,需要一些帮助来为我正在开发的自定义覆盖工具重写 c 和 c++ 代码。据我了解,我认为我需要链接到 clang 的 libTooling 来制作一个独立的可执行文件来制作类似代码重写器的东西。

LLVM 和 clang 非常庞大,让人不知从何下手。有:

似乎所有人都在做类似的事情。

到目前为止,我重写一些简单代码的最佳方法是遵循旧教程tutorial和这个3部分教程-第1部分.

作为一个简单的例子,我希望能够采用如下一些简单的 C 代码:

#include <stdarg.h>

// example global function
int
foo(int* a, int *b) {
    if (a[0] > 1) {
        b[0] = 2;
    } else if ((a[0] == 1) && (b[0] == 2)) {
        b[0] = 3;
    } else {
        b[1] = -1;
    }

    a[0] = 2;
    switch (a[0]) {
    case 0:
    case 1:
        break;
    case 2:
        break;

    default:
        break;
    }
    return 3;
}

int main(int argc, const char **argv) {
    int a[3] = {0};
    int b[3] = {0};
    return foo(a, b);
}

按照以下几行修改它(使用大写代码插入):

#INCLUDE <CUSTOM_MACROS_AND_INLINES>
#include <stdarg.h>

// example global function
int
foo(int* a, int *b) {
    _BREADCRUMB;
    if (_BREADCRUMB(a[0] > 1)) {
        b[0] = 2;
    } else if (_BREADCRUMB(a[0] == 1) && _BREADCRUMB(b[0] == 2)) {
        b[0] = 3;
    } else {
        b[1] = -1;
        _BREADCRUMB;
        return 1;
    }

    a[0] = 2;
    switch (a[0]) {
    case 0:
        _BREADCRUMB
    case 1:
        _BREADCRUMB
        break;
    case 2:
        _BREADCRUMB
        break;

    default:
        _BREADCRUMB
        break;
    }
    _BREADCRUMB;
    return 3;
}

int main(int argc, const char **argv) {
    _BREADCRUMB;
    int a[3] = {0};
    int b[3] = {0};
    _BREADCRUMB;
    return foo(a, b);
}

使用 RecursiveASTVisitor 技术,我发现很难控制在重写输出中插入文本的位置。特别是尝试在函数的左括号之后插入,这样我就可以将上面的面包屑字符串放入重写的代码中。

clang llvm clang++
© www.soinside.com 2019 - 2024. All rights reserved.