2011-02-27 4 views
22

나는 C 코드에 Clang의 AST를 사용하고 AST에 대한 분석을하고있다. Clang의 AST, 튜토리얼 등을 얻는 방법에 대한 몇 가지 지침은이 점에서 큰 도움이 될 것입니다 !!!Clang의 AST를 사용하는 방법은 무엇입니까?

나는 이것을 찾으려고 노력해왔다. 나는 이것을 2 년 전 만들어진 link이라고한다. 하지만 웬일인지, 그것은 나를 위해 일하지 않고있다. 튜토리얼의 샘플 코드는 나에게 너무 많은 오류를 준다. 따라서 코드를 적절히 작성하거나 튜토리얼에 문제가있는 경우 확실하지 않습니다. 그러나 나는 다른 어떤 페이지에서도 기쁜 마음으로 시작할 것입니다.

답변

14

시작 sharth에 의해 연결된 튜토리얼. 그런 다음 Clang의 Doxygen을 통과합니다. SemaConsumer으로 시작하십시오.

많은 소스 코드를 읽으십시오. Clang은 움직이는 표적입니다. clang을 기반으로하는 툴을 작성하는 경우 clang이 매일 기능을 추가하고 수정한다는 것을 인식해야하므로 많은 코드를 읽을 준비가되어 있어야합니다.

5
+1

코드를 살펴 보았습니다. 이해하기 힘들다는 것을 알고 있습니다. 왜냐하면 아무런 참조가 없기 때문에 구문이나 클래스 이름, 의미, 사용 이유 등이 있기 때문입니다. 링크가 좋은 출발점처럼 보일지라도 각 요소가 의미하는 바에 대한 참조는 기본 사항을 이해하는 데 도움이됩니다. – bsoundra

9

당신은 아마 libclang 라이브러리에서 제공하는 안정적인 C API를 원하는을 제공 할 수 있습니다.

현재 가장 좋은 문서는 LLVM Developers Meeting website에서 사용할 수있는 "libclang : Thinking Beyond the Compiler"의 비디오/슬라이드입니다.

그러나 API의 안정성은 포괄성에 지나지 않습니다. 모든 것을이 API로 처리 할 수는 없지만 사용하기가 훨씬 쉽습니다.

0

AST는 물론 프론트 엔드의 단계를 알기 위해 책 "LLVM core libraries"에 프론트 엔드 장이 있습니다. 기본적으로 이러한 흐름 갖는다 (LLVM-4.0.1의 경우 및 이후 버전해야 유사한)

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

마지막 함수는 전체 번역 단위를 처리하며 (최상위 레벨 선언은이 시점에서 이미 처리됨), EmitBackendOutput을 호출하여 백엔드 작업을 수행합니다. 따라서이 함수는 완전한 AST를 사용하고 백엔드 출력을 출력하기 전에 무언가를 할 수있는 좋은 지점입니다.

AST를 조작하는 방법에 관해서는 clang에 http://clang.llvm.org/docs/RAVFrontendAction.html에 대한 기본 자습서가 있습니다.

ASTDumper.cpp도 확인하십시오. 그것은 AST를 방문하는 가장 좋은 예입니다.

좋은 자습서 : https://jonasdevlieghere.com/understanding-the-clang-ast/은 세 가지 다른 접근 방식을 통해 AST에서 특정 호출 expr을 찾는 방법을 알려줍니다.

관련 문제