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.
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
@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