Transformación básica de fuente a fuente con Clang

I have successfully build the sample code

Ahora tengo un requisito de que si tengo un código de muestra como el siguiente:

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;
}

El código debe transformarse a

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;
}

Intenté con los siguientes cambios de código:

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

Pero el resultado viene como:

// 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

Por favor, hágame saber cómo puedo lograr el objetivo?

También obtengo resultados como:

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;

¿Cómo puedo detener el procesamiento del código de la misma? Es solo que las declaraciones en el bloque compuesto deberían agregar declaraciones adicionales.

3
No parece que su función VisitStmt devuelva un valor booleano sensible, y sospecho que la visita depende de ese resultado booleano para decidir si debe descender a los subárboles. Solo una suposición.
agregado el autor Ira Baxter, fuente

2 Respuestas

Si miras el código generado, es un desastre ilegal. Una maravilla que el compilador no te grita las orejas ;-)

Claramente LLVM (con su VisitStmt) considera simplemente "{...}" como "declaración compuesta", y el resultado ocurre antes de la declaración en sí. Verifique cuidadosamente cuando se realizan tales acciones intercaladas (sospecho que ya sea justo antes o justo después, no en el medio).

1
agregado

Si entiendo correctamente, y para agregar a @vonbrand, no deberías usar el inicio y fin de la declaración compuesta porque representan el bloque de enunciados. En su lugar, solo debe reemplazar lo anterior con la inserción del texto (instrucciones de impresión) en el cuerpo genérico VisitStmt. Tenga en cuenta que no estoy seguro de lo que está tratando de lograr, ya que no tiene una declaración de impresión inmediatamente después de su declaración if/else. Creo que ayudaría si solo enumerara qué declaraciones desea procesar, y luego tendrá condicionales "isa" en su acuerdo de implementación de visitante con cada caso. De esta manera, en realidad está usando el patrón de visitante correctamente. ¡Espero que ayude!

0
agregado