2017-03-03 8 views
0

Diese Frage bezieht sich auf gcc-Interna. Ich experimentiere mit gcc generischen Bäumen. Bei diesem kleinen Projekt geht es darum, ein hartcodiertes Frontend nur für Bildungszwecke zu erstellen. Ich habe es geschafft, printf extern aufzurufen und konnte eine ausführbare Datei kompilieren, die in der Lage ist, eine Testnachricht zu drucken. Letzteres ist der Beweis, dass ich Argumente für eine Funktion vorbereiten kann. Das Wesen des Problems besteht darin, meine eigene Funktion/Methode aufzurufen und ihre Argumente abzurufen.Abrufen von Funktionsargumenten aus dem GCC-Funktionsstrukturknoten

Dies ist, wo ich den Anruf vorbereiten:

tree testFn; 
    tree testFndeclTypeParam[] = { 
           integer_type_node 
           }; 
    tree testFndeclType = build_varargs_function_type_array(integer_type_node, 1, testFndeclTypeParam); 
    tree testFnDecl = build_fn_decl("testFunc", testFndeclType); 
    DECL_EXTERNAL(testFnDecl) = 1; 
    testFn = build1(ADDR_EXPR, build_pointer_type(testFndeclType), testFnDecl); 
    tree exprTest = build_int_cst_type(integer_type_node, 20); 
    tree testStmt = build_call_array_loc(UNKNOWN_LOCATION, integer_type_node, testFn, 1, testArgs); 
    append_to_statement_list(testStmt, &stackStmtList); 

Ich kann bestätigen, dass die Funktion „TestFunc“ genannt wird, auf jeden Fall.

Nun ist die andere Seite, hier ist die Funktion aufgerufen wird:

// Built type of main "int (int)" 
    tree mainFndeclTypeParam[] = { 
           integer_type_node, // int 
           }; 

    tree mainFndeclType = build_function_type_array(integer_type_node, 1, mainFndeclTypeParam); 
    tree mainFndecl = build_fn_decl("testFunc", mainFndeclType); 
    tree stackStmtList = alloc_stmt_list(); 
    tree parmList = build_decl(UNKNOWN_LOCATION, PARM_DECL, mainFndecl, integer_type_node); 

Ich konnte kein explizites Beispiel finden die zeigt, wie die Argumente abzurufen, aber erwartet, dass es in parmList das Argument Baumknoten zu sein.

+1

Könnten Sie bitte einen minimalen, vollständigen und eigenständigen Quellcode bereitstellen? Der entsprechende Befehl zum Kompilieren/Verknüpfen für die Konsole wäre willkommen. – Scheff

+0

@Scheff ein selbststehendes Beispiel wird dafür zu groß sein, aber danke für die Zahlung von Zinsen. Ich benutze die Befehlszeile "gccsample main.exp testFunc.exp". Die zwei Dateien sind nur Dummies, um den Compiler aufzurufen. – Tanyong

Antwort

0

Hier ist die Lösung für mein Problem für diejenigen, die am GCC-Compiler-Design interessiert sind. Danke Google oder wer immer das Java-Frontend beibehält.

es sein sollte:

tree typelist = TYPE_ARG_TYPES(TREE_TYPE(mainFndecl)); 
tree typeOfList = TREE_VALUE(typelist); 
tree parmList = build_decl(UNKNOWN_LOCATION, PARM_DECL, NULL_TREE, typeOfList); 
tree *ptr = &DECL_ARGUMENTS(mainFndecl); 
*ptr = parmList; 

Das nächste Argument kann durch die Verwendung TREE_CHAIN, wenn überhaupt abgerufen werden.

Verwandte Themen