Wie nutzt man Clangs AST?

Lesezeit: 2 Minuten

Benutzer-Avatar
bsoundra

Ich möchte den AST von Clang für meinen C-Code verwenden und einige Analysen über den AST durchführen. Einige Hinweise, wo man anfangen soll, wie man Clang’s AST erhält, Tutorials oder irgendetwas in dieser Hinsicht werden eine große Hilfe sein!!!

Ich habe versucht, einige zu finden, und ich habe diese bekommen Verknüpfung die vor 2 Jahren erstellt wurde. Aber aus irgendeinem Grund funktioniert es bei mir nicht. Der Beispielcode im Tutorial gibt mir zu viele Fehler. Ich bin mir also nicht sicher, ob ich den Code richtig baue oder etwas mit dem Tutorial nicht stimmt. Aber ich würde gerne auch von einer anderen Seite aus anfangen.

Beginnen Sie mit dem von Sharth verlinkten Tutorial. Gehen Sie dann Clangs Doxygen durch. Beginnen mit SemaConsumer.

Lesen Sie viel Quellcode. Clang ist ein sich bewegendes Ziel. Wenn Sie Tools schreiben, die auf Clang basieren, müssen Sie erkennen, dass Clang täglich Funktionen hinzufügt und repariert, also sollten Sie darauf vorbereitet sein, viel Code zu lesen!

Sie möchten wahrscheinlich die stabile C-API, die in der libclang-Bibliothek bereitgestellt wird, im Gegensatz zu den instabilen internen C++-APIs, die andere erwähnt haben.

Die derzeit beste Dokumentation für den Anfang sind die Videos/Folien des Vortrags „libclang: Thinking Beyond the Compiler“, die auf der verfügbar sind LLVM Developers Meeting-Website.

Beachten Sie jedoch, dass die Stabilität der API auf Kosten der Vollständigkeit geht. Du wirst es nicht können alles mit dieser API, aber es ist viel einfacher zu verwenden.

Benutzer-Avatar
Tong Zhou

Um die AST zu erhalten sowie Stufen des Frontends kennenzulernen, gibt es im Buch „LLVM Core Libraries“ ein Frontend-Kapitel. Grundsätzlich hat es einen solchen Fluss (im Fall von llvm-4.0.1 und sollte für spätere Versionen ähnlich sein):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

Die letzte Funktion verarbeitet die gesamte Übersetzungseinheit (Decls der obersten Ebene werden an dieser Stelle bereits verarbeitet) und ruft auf EmitBackendOutput um Backend-Sachen zu machen. Diese Funktion ist also ein guter Ort, an dem Sie etwas mit dem vollständigen AST tun können, bevor Sie Backend-Ausgaben ausgeben.

In Bezug auf die Manipulation des AST bietet Clang einige grundlegende Tutorials dazu: http://clang.llvm.org/docs/RAVFrontendAction.html.

Auch anschauen ASTDumper.cpp. Es ist das beste Beispiel für einen Besuch im AST.

Noch ein gutes Tutorial: https://jonasdevlieghere.com/understanding-the-clang-ast/ zeigt Ihnen, wie Sie einen bestimmten Anrufausdruck im AST über drei verschiedene Ansätze finden.

Ich finde diese ASTUnit::LoadFromCompilerInvocation() fn als die einfachste Möglichkeit, den AST zu konstruieren.

Dieser Link kann Ihnen einige Ideen geben http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471

1335340cookie-checkWie nutzt man Clangs AST?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy