Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Clang Useful Building Useful Tools With LLVM and Clang For Fun and Profit Peter Goldsborough Cppnow 05-20-2017

Download as pdf or txt
Download as pdf or txt
You are on page 1of 62

.

/clang-talk

Peter Goldsborough May 20, 2017


Peter Goldsborough clang-useful 2
Background

Peter Goldsborough clang-useful 3


Background

TUFaceBloomGoogleStartupMIT

Peter Goldsborough clang-useful 4


LLVM

Peter Goldsborough clang-useful 5


LLVM
Low

Peter Goldsborough clang-useful 6


LLVM
Low Level

Peter Goldsborough clang-useful 7


LLVM
Low Level Virtual

Peter Goldsborough clang-useful 8


LLVM
Low Level Virtual Machine

Peter Goldsborough clang-useful 9


LLVM
Low Level Virtual Machine

Peter Goldsborough clang-useful 10


LLVM
Low Level Virtual Machine

lldb opt lld lljvm

Peter Goldsborough clang-useful 11


LLVM
Low Level Virtual Machine

Peter Goldsborough clang-useful 12


Compilers

Peter Goldsborough clang-useful 13


Compilers

Frontend

Peter Goldsborough clang-useful 14


Compilers

Frontend Optimizer

Peter Goldsborough clang-useful 15


Compilers

Frontend Optimizer Backend

Peter Goldsborough clang-useful 16


Compilers

C++

Go Optimizer Backend

Rust

Peter Goldsborough clang-useful 17


Compilers

C++ x86

Go Optimizer ARM

Rust RISC-V

Peter Goldsborough clang-useful 18


LLVM

Frontend Optimizer Backend

Peter Goldsborough clang-useful 19


LLVM

Lexer

Optimizer Backend

Parser

Frontend
.c,.h

Peter Goldsborough clang-useful 20


LLVM

Lexer

Backend

Parser

Frontend Optimizer
.c,.h .ll,.bc

Peter Goldsborough clang-useful 21


LLVM

licm loop-unroll
Lexer

Backend

Parser
constprop inline

Frontend Optimizer
.c,.h .ll,.bc

Peter Goldsborough clang-useful 22


LLVM

licm loop-unroll
Lexer CodeGen

MD
Parser
constprop inline Optimizer

Frontend Optimizer Backend


.c,.h .ll,.bc .o,.S

Peter Goldsborough clang-useful 23


LLVM

licm loop-unroll
Lexer CodeGen

MD
Parser
constprop inline Optimizer

Frontend Optimizer Backend


.c,.h .ll,.bc .o,.S

Peter Goldsborough clang-useful 24


clang

template<typename C>
struct L {
char a();
void n(int) const;
bool g;
};

Peter Goldsborough clang-useful 25


Clang: Lexer

template < typename C > struct ...

Peter Goldsborough clang-useful 26


Clang: Lexer

template < typename C > struct ...

less greater
keyword keyword keyword
identifier

Peter Goldsborough clang-useful 27


Clang: Parser

Peter Goldsborough clang-useful 28


Clang: Parser

void n ( int arg = 42 ) const ;

Peter Goldsborough clang-useful 29


Clang: Parser

void n ( int arg = 42 ) const ;

CXXMethodDecl

Peter Goldsborough clang-useful 30


Clang: Parser

void n ( int arg = 42 ) const ;

CXXMethodDecl

ReturnType ParmVarDecl isConst

Peter Goldsborough clang-useful 31


Clang: Parser

void n ( int arg = 42 ) const ;

CXXMethodDecl

ReturnType ParmVarDecl isConst

DefaultArg QualType Identifier

Peter Goldsborough clang-useful 32


Clang: Parser

void n ( int arg = 42 ) const ;

CXXMethodDecl

ReturnType ParmVarDecl isConst

DefaultArg QualType Identifier

Type

Peter Goldsborough clang-useful 33


Clang: Parser

void n ( int arg = 42 ) const ;

CXXRecordDecl

CXXMethodDecl

ReturnType ParmVarDecl isConst

DefaultArg QualType Identifier

Type

Peter Goldsborough clang-useful 34


Clang: Parser

void n ( int arg = 42 ) const ;

TranslationUnitDecl

CXXRecordDecl

CXXMethodDecl

ReturnType ParmVarDecl isConst

DefaultArg QualType Identifier

Type

Peter Goldsborough clang-useful 35


Clang: Parser

void n ( int arg = 42 ) const ;

TranslationUnitDecl

CXXRecordDecl

CXXMethodDecl

ReturnType ParmVarDecl isConst

DefaultArg QualType Identifier


.
. .
.
. .
Type
.
.
.

Peter Goldsborough clang-useful 36


Clang: IR Generation

Peter Goldsborough clang-useful 37


Clang: IR Generation

AST

Peter Goldsborough clang-useful 38


Clang: IR Generation

; Function Attrs: nounwind ssp


define i32 @_Z1fi(i32) #0 {
%2 = alloca i32, align 4
store i32 %0, i32* %2, align 4
%3 = load i32, i32* %2, align 4
ret i32 %3
}

AST

Peter Goldsborough clang-useful 39


Clang: AST

Peter Goldsborough clang-useful 40


Clang: AST

if (0xc > l) {
const char* a = "ng";
}

Peter Goldsborough clang-useful 41


Clang: AST

if (0xc > l) {
const char* a = "ng";
}

Stmt

Peter Goldsborough clang-useful 42


Clang: AST

if (0xc > l) {
const char* a = "ng";
}

Stmt Decl

Peter Goldsborough clang-useful 43


Clang: AST

if (0xc > l) {
const char* a = "ng";
}

Stmt Decl Expr

Peter Goldsborough clang-useful 44


Clang: AST

if (0xc > l) {
const char* a = "ng";
}

Stmt Decl Expr Type

Peter Goldsborough clang-useful 45


Peter Goldsborough clang-useful 46
Clang Tooling

Peter Goldsborough clang-useful 47


Clang Tooling

libClang

Peter Goldsborough clang-useful 48


Clang Tooling: libClang

#include <stdio.h>
#include <clang-c/Index.h>

CXChildVisitResult
visit(CXCursor cursor, CXCursor, CXClientData data) {
const CXSourceLocation location = clang_getCursorLocation(cursor);
if (!clang_Location_isFromMainFile(location)) {
return CXChildVisit_Continue;
}

const CXString spelling = clang_getCursorSpelling(cursor);


printf("%s", clang_getCString(spelling));
clang_disposeString(spelling);

return CXChildVisit_Recurse;
}

Peter Goldsborough clang-useful 49


Clang Tooling: libClang (Python)

Peter Goldsborough clang-useful 50


Clang Tooling: libClang (Python)

import clang.cindex as clang

def walk(cursor):
print(cursor.spelling)
for child in cursor.get_children():
walk(child)

Peter Goldsborough clang-useful 51


Clang Tooling

libTooling

Peter Goldsborough clang-useful 52


Clang Tooling: libTooling

Peter Goldsborough clang-useful 53


Clang Tooling: libTooling

Clang Tidy
./clang-tidy -checks="*,my-check" file.cpp

Peter Goldsborough clang-useful 54


Clang Tooling: libTooling

Clang Tidy
./clang-tidy -checks="*,my-check" file.cpp

Clang Plugin
./clang++ -Xclang load -Xclang my-check.so \
-Xclang -add-plugin -Xclang my-check file.cpp

Peter Goldsborough clang-useful 55


Clang Tooling: libTooling

Clang Tidy
./clang-tidy -checks="*,my-check" file.cpp

Clang Plugin
./clang++ -Xclang load -Xclang my-check.so \
-Xclang -add-plugin -Xclang my-check file.cpp

Clang Tool
./my-check file.cpp

Peter Goldsborough clang-useful 56


Peter Goldsborough clang-useful 57
clangd
I Language server providing ”clang-as-a-service”
I Background process that editors can interact with to obtain
I Code Completion
I Linting
I Indexing
I Formatting
I Experimental WIP: Help needed!

Peter Goldsborough clang-useful 58


How do I continue?

Peter Goldsborough clang-useful 59


Resources

I eli.thegreenplace.net
I clang.llvm.org/docs/InternalsManual.html
I llvm.org/docs/ProgrammersManual.html
I goldsborough.me & github.com/goldsborough
I Source Code!

Peter Goldsborough clang-useful 60


Resources

I eli.thegreenplace.net
I clang.llvm.org/docs/InternalsManual.html
I llvm.org/docs/ProgrammersManual.html
I goldsborough.me & github.com/goldsborough
I Source Code!

github.com/peter-can-talk/cppnow-2017

Peter Goldsborough clang-useful 61


Q&A

Peter Goldsborough clang-useful 62

You might also like