3

サンプルコードのビルドに成功しました

以下のようなサンプルコードがある場合、次の要件があります。

int inc(int& p)
{
        p++;
        printf("In inc [%d]\n", p);
        return p;
}
int main()
{
        int i = 0;
        int y,z;
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
        }
        printf("y = [%d] z = [%d]\n", y , z);
        return 0;
}

コードは次のように変換する必要があります

int inc(int& p)
{
        p++;
        printf("%s %d", __FILE__, __LINE__);
        printf("In inc [%d]\n", p);
        printf("%s %d", __FILE__, __LINE__);
        return p;
}

int main()
{
        int i = 0;
        printf("%s %d", __FILE__, __LINE__);
        int y,z;
        printf("%s %d", __FILE__, __LINE__);
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
                printf("%s %d", __FILE__, __LINE__);
        }
        printf("y = [%d] z = [%d]\n", y , z);
        printf("%s %d", __FILE__, __LINE__);
        return 0;
}

次のコード変更を試しました:

bool VisitStmt(Stmt *s) {
    // Only care about If statements.
    if (isa<CompoundStmt>(s)) {
        CompoundStmt *Statement = cast<CompoundStmt>(s);
        TheRewriter.InsertText(Statement->getLocStart(),
                               "printf(\"%s %d\", __FILE__, __LINE__);\n",
                               true, true);
    }

しかし、出力は次のようになります。

// Begin function inc returning int
int inc(int& p)
printf("%s %d", __FILE__, __LINE__);
{
        p++;
        printf("In inc [%d]\n", p);
        return p;
}
// End function inc

// Begin function main returning int
int main()
printf("%s %d", __FILE__, __LINE__);
{
        int i = 0;
        int y,z;
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
        }
        printf("y = [%d] z = [%d]\n", y , z);
        return 0;
}
// End function main

どうすれば目的を達成できるか教えてください。

次のような出力も得られます。

test.cpp:4:26: error: use of undeclared identifier 'p'
        printf("In inc [%d]\n", p);
                                ^
test.cpp:5:9: error: use of undeclared identifier 'p'
        return p;

コードのレンダリングを同じように停止するにはどうすればよいですか? 複合ブロックのステートメントが余分なステートメントを追加する必要があるというだけです。

4

2 に答える 2

1

生成されたコードを見ると、それは違法な混乱です。不思議なことに、コンパイラーはあなたの耳から離れません ;-)

明らかに、LLVM (VisitStmt を使用) は "{...}" だけを "複合ステートメント" と見なし、出力はステートメント自体の前に発生します。そのような散在するアクションがいつ行われるかを注意深く確認してください(途中ではなく、直前または直後のいずれかであると思われます)。

于 2013-01-20T00:33:40.517 に答える
0

私が正しく理解し、@vonbrandに追加する場合、複合ステートメントの開始と終了はステートメントのブロックを表すため、使用しないでください。代わりに、上記を置き換えて、一般的な VisitStmt 本文にテキスト (Print ステートメント) を挿入する必要があります。if/else ステートメントの直後に Print ステートメントがないため、何を達成しようとしているのか不明であることに注意してください。処理したいステートメントをリストアップし、ビジターの実装で「isa」条件をそれぞれのケースに対応させると役立つと思います。そうすれば、実際に訪問者パターンを正しく使用できます。それが役立つことを願っています!

于 2013-02-04T20:04:48.387 に答える