2013-02-15 8 views
8

Sto eseguendo analisi del flusso di dati inter-procedurali con clang. Attualmente sto usando libtooling per analizzare i file sorgente e chiamare i visitatori AST. La domanda è: come posso creare un singolo AST per diversi file .c?AST per più file di origine con clang

Ho provato a utilizzare la classe ASTImport, ma non supporta l'importazione di alcuni nodi AST. Inoltre, sto facendo qualcosa di sbagliato quando creo e manipolo CompilerIstance e si blocca in destructor.

Un'opzione molto simile era ASTImportAction ma non è abbastanza chiaro per me quali parametri della riga di comando devono essere passati al ClangTool in questo caso.

La terza opzione era creare ASTUnits per ogni file .c e cercare le definizioni in ognuno di essi non è chiaro come trovare la corrispondenza tra i tipi definiti dall'utente, ad es. record. In ASTImport usano la funzione IsStructurallyEquivalent() ma è dichiarata in namespace anonimo, quindi posso copiare tutto questo codice nel mio programma. E ancora supporta non tutti i nodi AST.

Da Internet questo collegamento http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html sembra essere il più appropriato ma per me i dettagli tecnici della soluzione non sono chiari.

Qualsiasi suggerimento è benvenuto. Mille grazie.

+1

Perché si desidera produrre "uno" AST per diversi file? Perché non puoi semplicemente gestire un AST per ogni file? –

+1

Vorrei qualcuno avesse una risposta per questo: \ sto cercando di fare la stessa cosa in questo momento. –

risposta

0

Stavo cercando di fare qualcosa di simile. Però non ho provato a creare un singolo AST. Stavo analizzando più AST e cercando di mappare le funzioni da solo. Sto usando i corrispondenti AST per ottenere le chiamate di funzione e quindi controllarle negli altri AST.

Sto utilizzando il file compile_commands.json per fornire l'elenco dei file di origine. OptionsParser.getCompilations(). GetAllFiles() può ottenere tutti i file sorgente specificati in compile_commands.json.

Quando creiamo un clangTool ed eseguiamo un frontendAction sullo strumento con il nostro matcher, cerca la corrispondenza in tutti i file di origine.

Potrebbe esserci un modo più ottimale per farlo. Nel caso in cui qualcuno ne sia a conoscenza, per favore segnalalo.