2013-02-15 10 views
8

Robię międzyprocesową analizę przepływu danych z klangiem. Obecnie używam libtooling do parsowania plików źródłowych i wywoływania gościa AST. Pytanie brzmi, w jaki sposób utworzyć pojedyncze AST dla kilku plików .c?AST dla wielu plików źródłowych z clang

Próbowałem użyć klasy ASTImport, ale nie obsługuje ona importu niektórych węzłów AST. Co więcej, robię coś złego, kiedy tworzę i manipuluję CompilerIstance i ulega awarii w destruktorze.

Bardzo podobną opcją była metoda ASTImportAction, ale nie jest dla mnie jasne, które parametry wiersza polecenia należy przekazać do ClangTool w tym przypadku.

Trzecią opcją było stworzenie ASTUnits dla każdego pliku .c i poszukiwanie definicji w każdym z nich nie jest jasne, jak znaleźć korespondencję między typami definiowanymi przez użytkownika, np. dokumentacja. W ASTImport używają funkcji IsStructurallyEquivalent(), ale są deklarowane w anonimowym obszarze nazw, więc mogę skopiować cały ten kod do mojego programu. I znowu obsługuje nie wszystkie węzły AST.

Z Internetu ten link http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html wydaje się najbardziej odpowiedni, ale dla mnie szczegóły techniczne rozwiązania nie są jasne.

Wszelkie sugestie są mile widziane. Wielkie dzięki.

+1

Dlaczego chcesz utworzyć "jeden" AST dla kilku plików? Dlaczego po prostu nie możesz obsłużyć jednego AST dla każdego pliku? –

+1

Chciałbym, żeby ktoś miał na to odpowiedź: \ Próbuję zrobić to samo teraz. –

Odpowiedz

0

Próbowałem zrobić coś podobnego. Nie próbowałem jednak stworzyć jednego AST. Przetwarzałem wiele AST i próbowałem samodzielnie mapować funkcje. Korzystam z mataczy AST, aby uzyskać wywołania funkcji, a następnie sprawdzić je w innych AST.

Używam pliku compile_commands.json do podania listy plików źródłowych. OptionsParser.getCompilations(). GetAllFiles() może pobrać wszystkie pliki źródłowe określone w compile_commands.json.

Kiedy tworzymy clangTool i uruchamiamy frontendAction nad narzędziem za pomocą naszego matchera, wyszukujemy dopasowanie we wszystkich plikach źródłowych.

Może być bardziej optymalny sposób robienia tego. Jeśli niektórzy o tym wiedzą, prosimy o wskazanie.