Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen...
Transcript of Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen...
![Page 1: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/1.jpg)
Extending ClangDoug Gregor
1Wednesday, December 7, 11
![Page 2: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/2.jpg)
A Platform for Tools
• Library-based architecture
• Compatibility with various language standards
• Accurate representation of source code
2Wednesday, December 7, 11
![Page 3: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/3.jpg)
Extension Points
CodeGenSemaParseLex
3Wednesday, December 7, 11
![Page 4: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/4.jpg)
Extension Points
• libclang
• Preprocessor callbacks, AST consumers
• Semantic analysis, static analyzer
• LLVM IR transformation and optimization
• Source-to-source translation
CodeGenSemaParseLex
3Wednesday, December 7, 11
![Page 5: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/5.jpg)
Source ⇔ AST Mapping
4Wednesday, December 7, 11
![Page 6: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/6.jpg)
libclang: Clang C APIstruct List { int Data; struct List *Next;};
5Wednesday, December 7, 11
![Page 7: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/7.jpg)
• Where are all the declarations?
libclang: Clang C APIstruct List { int Data; struct List *Next;};
5Wednesday, December 7, 11
![Page 8: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/8.jpg)
• Where are all the declarations?
• Where are uses of List?
libclang: Clang C APIstruct List { int Data; struct List *Next;};
5Wednesday, December 7, 11
![Page 9: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/9.jpg)
• Where are all the declarations?
• Where are uses of List?
• What is under my cursor?
libclang: Clang C APIstruct List { int Data; struct List *Next;}; Kind: FieldDecl
Name: DataType: intContext: struct List
5Wednesday, December 7, 11
![Page 10: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/10.jpg)
• Where are all the declarations?
• Where are uses of List?
• What is under my cursor?
• What code completions work here?
libclang: Clang C APIstruct List { int Data; struct List *Next;};
sshortsignedstaticstruct <name>
5Wednesday, December 7, 11
![Page 11: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/11.jpg)
• Where are all the declarations?
• Where are uses of List?
• What is under my cursor?
• What code completions work here?
libclang: Clang C API
See 2010 talk “libclang: Thinking Beyond the Compiler”
struct List { int Data; struct List *Next;};
5Wednesday, December 7, 11
![Page 12: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/12.jpg)
Exploring a Program
6Wednesday, December 7, 11
![Page 13: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/13.jpg)
Preprocessor CallbacksCodeGenSemaParseLex
7Wednesday, December 7, 11
![Page 14: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/14.jpg)
Preprocessor CallbacksCodeGenSemaParseLex
7Wednesday, December 7, 11
![Page 15: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/15.jpg)
Preprocessor CallbacksCodeGenSemaParseLex
• Invoked for various preprocessor actions
• Macro definition/expansion
• Entering/leaving a file
• Pragmas, ifdefs
• Customize by overriding callbacks
7Wednesday, December 7, 11
![Page 16: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/16.jpg)
Header Dependenciesclass FindDependencies : public PPCallbacks {public: void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind, FileID PrevFID) { if (Reason != EnterFile) return; if (const FileEntry *FE = SM.getFileEntryForID( SM.getFileID(Loc))) std::cout << “Depends on “ << FE->getName() << “\n”; }};
8Wednesday, December 7, 11
![Page 17: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/17.jpg)
AST ConsumersCodeGenSemaParseLex
9Wednesday, December 7, 11
![Page 18: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/18.jpg)
AST ConsumersCodeGenSemaParseLex
9Wednesday, December 7, 11
![Page 19: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/19.jpg)
AST ConsumersCodeGenSemaParseLex
class FindUnions : public ASTConsumer {public: void HandleTagDeclDefinition(TagDecl *D) { if (D->isUnion()) { std::cout << “Union: “ << D->getNameAsString() << “\n”; } }};
9Wednesday, December 7, 11
![Page 20: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/20.jpg)
RecursiveASTVisitor
• Recursively walk any part of the AST
• Call Visitor.Traverse<NodeType>(Node)
• Customize by overriding visitation methods
• Used heavily within Clang itself
10Wednesday, December 7, 11
![Page 21: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/21.jpg)
Finding Calls
11Wednesday, December 7, 11
![Page 22: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/22.jpg)
Finding Callsclass FindCalls : public RecursiveASTVisitor<FindCalls> {
public: bool VisitCallExpr(CallExpr *Call) { if (FunctionDecl *Callee = Call->getDirectCallee()) std::cout << “Call to “ << Callee->getNameAsString() << “\n”; return true; }};
11Wednesday, December 7, 11
![Page 23: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/23.jpg)
Finding Callsclass FindCalls : public RecursiveASTVisitor<FindCalls> {
public: bool VisitCallExpr(CallExpr *Call) { if (FunctionDecl *Callee = Call->getDirectCallee()) std::cout << “Call to “ << Callee->getNameAsString() << “\n”; return true; }};
11Wednesday, December 7, 11
![Page 24: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/24.jpg)
Warnings & ErrorsCodeGenSemaParseLex
12Wednesday, December 7, 11
![Page 25: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/25.jpg)
Warnings & ErrorsCodeGenSemaParseLex
12Wednesday, December 7, 11
![Page 26: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/26.jpg)
A Terrible Diagnostic
13Wednesday, December 7, 11
![Page 27: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/27.jpg)
A Terrible Diagnostic
typedef int N;N::string str;
13Wednesday, December 7, 11
![Page 28: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/28.jpg)
A Terrible Diagnostic
typedef int N;N::string str;
t.cpp:2:1: error: expected a class or namespaceN::string str;^
13Wednesday, December 7, 11
![Page 29: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/29.jpg)
A Terrible Diagnostic
14Wednesday, December 7, 11
![Page 30: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/30.jpg)
A Terrible Diagnostic
// DiagnosticSemaKinds.tddef err_expected_class_or_namespace : Error<"expected a class or namespace">;
14Wednesday, December 7, 11
![Page 31: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/31.jpg)
A Terrible Diagnostic
// DiagnosticSemaKinds.tddef err_expected_class_or_namespace : Error<"expected a class or namespace">;
// SemaCXXScopeSpec.cppDiag(IdentifierLoc, diag::err_expected_class_or_namespace);
14Wednesday, December 7, 11
![Page 32: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/32.jpg)
Improving Diagnostics
15Wednesday, December 7, 11
![Page 33: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/33.jpg)
Improving Diagnostics
// DiagnosticSemaKinds.tddef err_not_class_or_namespace : Error<"%0 is not a class or namespace">;
15Wednesday, December 7, 11
![Page 34: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/34.jpg)
Improving Diagnostics
// DiagnosticSemaKinds.tddef err_not_class_or_namespace : Error<"%0 is not a class or namespace">;
// SemaCXXScopeSpec.cppif (TypeDecl *TD = Found.getAsSingle<TypeDecl>()) Diag(IdentifierLoc, diag::err_not_class_or_namespace) << Context.getTypeDeclType(TD);
15Wednesday, December 7, 11
![Page 35: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/35.jpg)
Improving Diagnostics
typedef int N;N::string str;
t.cpp:2:1: error: ‘N’ (aka ‘int’) is not a class or namespaceN::string str;^
16Wednesday, December 7, 11
![Page 36: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/36.jpg)
Improving Diagnostics
17Wednesday, December 7, 11
![Page 37: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/37.jpg)
Improving Diagnostics// SemaCXXScopeSpec.cppif (TypeDecl *TD = Found.getAsSingle<TypeDecl>()) { Diag(IdentifierLoc, diag::err_not_class_or_namespace) << Context.getTypeDeclType(TD); Diag(TD->getLocation(), diag::note_declared_at);}
17Wednesday, December 7, 11
![Page 38: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/38.jpg)
Improving Diagnostics
typedef int N;N::string str;
t.cpp:2:1: error: ‘N’ (aka ‘int’) is not a class or namespaceN::string str;^t.cpp:1:13: note: declared heretypedef int N; ^
18Wednesday, December 7, 11
![Page 39: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/39.jpg)
Attributes & LLVM IRCodeGenSemaParseLex
19Wednesday, December 7, 11
![Page 40: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/40.jpg)
Attributes & LLVM IRCodeGenSemaParseLex
19Wednesday, December 7, 11
![Page 41: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/41.jpg)
Feeding Information to IR
“If I could just tell the compiler that some declarations are <adjective>, my new optimization pass would be awesome!”
20Wednesday, December 7, 11
![Page 42: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/42.jpg)
Feeding Information to IR
• Attributes make such experiments easy
• Trivial to parse with few ambiguities
• Easy to introduce into the AST
“If I could just tell the compiler that some declarations are <adjective>, my new optimization pass would be awesome!”
20Wednesday, December 7, 11
![Page 43: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/43.jpg)
The annotate Attribute
• Clang supports the annotate attribute with arbitrary strings:
__attribute__((annotate(“singleton”))) Class *object;
• Annotations are mapped down to LLVM IR annotations
21Wednesday, December 7, 11
![Page 44: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/44.jpg)
Adding Real Attributes
22Wednesday, December 7, 11
![Page 45: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/45.jpg)
Adding Real Attributes// include/clang/Basic/Attr.tddef ReturnsTwice : InheritableAttr { let Spellings = ["returns_twice"];}
22Wednesday, December 7, 11
![Page 46: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/46.jpg)
Adding Real Attributes// include/clang/Basic/Attr.tddef ReturnsTwice : InheritableAttr { let Spellings = ["returns_twice"];}
// lib/Sema/SemaDeclAttr.cppstatic void handleReturnsTwiceAttr(Sema &S, Decl *D, const AttributeList &Attr) { if (!isa<FunctionDecl>(D)) { // diagnose error return; } D->addAttr(::new (S.Context) ReturnsTwiceAttr(...));}
22Wednesday, December 7, 11
![Page 47: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/47.jpg)
Adding Real Attributes
http://clang.llvm.org/docs/InternalsManual.html#AddingAttributes
// include/clang/Basic/Attr.tddef ReturnsTwice : InheritableAttr { let Spellings = ["returns_twice"];}
// lib/Sema/SemaDeclAttr.cppstatic void handleReturnsTwiceAttr(Sema &S, Decl *D, const AttributeList &Attr) { if (!isa<FunctionDecl>(D)) { // diagnose error return; } D->addAttr(::new (S.Context) ReturnsTwiceAttr(...));}
22Wednesday, December 7, 11
![Page 48: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/48.jpg)
Source-to-Source Translation
23Wednesday, December 7, 11
![Page 49: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/49.jpg)
The Rewriter Class
• Rewriter class provides textual rewriting
24Wednesday, December 7, 11
![Page 50: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/50.jpg)
The Rewriter Class
• Rewriter class provides textual rewriting
class Rewriter {public: bool InsertText(SourceLocation Loc, StringRef Text);
bool RemoveText(SourceRange Range); bool ReplaceText(SourceRange Range, StringRef Text);};
24Wednesday, December 7, 11
![Page 51: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/51.jpg)
Help Wanted
25Wednesday, December 7, 11
![Page 52: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/52.jpg)
Plugins
26Wednesday, December 7, 11
![Page 53: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/53.jpg)
Plugins
• Clang allows plugins during normal compilation:
clang -Xclang -load foo.so -Xclang -plugin foo-plugin <command line arguments>
26Wednesday, December 7, 11
![Page 54: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/54.jpg)
Plugins
• Clang allows plugins during normal compilation:
clang -Xclang -load foo.so -Xclang -plugin foo-plugin <command line arguments>
• Numerous problems with plug-in support:
• ASTConsumers aren’t chained in a natural way
• Command-line option parsing is too hard
• Building plugins is too hard
• Documentation is absent
26Wednesday, December 7, 11
![Page 55: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/55.jpg)
One-Off Tools
27Wednesday, December 7, 11
![Page 56: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/56.jpg)
One-Off Tools
• Building one-off tools is possible (but hard):
• CompilerInstance/CompilerInvocation/Action not simple enough
• Missing a “quickstart” tutorial
27Wednesday, December 7, 11
![Page 57: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/57.jpg)
One-Off Tools
• Building one-off tools is possible (but hard):
• CompilerInstance/CompilerInvocation/Action not simple enough
• Missing a “quickstart” tutorial
• Simple source-to-source translation needed
• Tie together traversal, rewriter, verification
27Wednesday, December 7, 11
![Page 58: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/58.jpg)
Summary
28Wednesday, December 7, 11
![Page 59: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/59.jpg)
Summary
• Numerous extension points to Clang
• Picking the best one is important
28Wednesday, December 7, 11
![Page 60: Extending Clang - LLVMllvm.org/devmtg/2011-11/Gregor_ExtendingClang.pdf · Lex Parse Sema CodeGen Wednesday, December 7, 11 3. Source 㱻 AST Mapping Wednesday, December 7, 11 4.](https://reader035.fdocuments.us/reader035/viewer/2022062603/5f6c26d0a49118177635f3d1/html5/thumbnails/60.jpg)
Summary
• Numerous extension points to Clang
• Picking the best one is important
• We need to make extension easier
• Plugins need to be super-easy to write
• “Your first extension” tutorials
• Make source-to-source translation easy
28Wednesday, December 7, 11