Commands cheatsheet
1 Handling PassManager
Con il comando opt si può alterare il comportamento del pass manager di default, specificando manualmente quali sono i passi da svolgere. Si possono caricare dei passi custom in formato .so. Ecco delle direttive da usare all'interno del makefile per generare il file ".so".
OPTIMIZER := libTestPass.so OBJs := $(subst .cpp,.o,$(wildcard lib/*.cpp)) LLVM_VERSION ?= 14 CXXFLAGS := $(shell llvm-config-$(LLVM_VERSION) --cxxflags) -fPIC all: $(OPTIMIZER) $(OPTIMIZER): $(OBJs) $(CXX) -dylib -shared $^ -o $@
Ovviamente nel makefile di ogni tutorial, ci si ricordi di cambiare il nome dell'optimizer all'inizio del makefile.
1.1 Tutorial 01
.PHONY: clean clean: $(RM) $(OPTIMIZER) $(OBJs) load: opt -load-pass-plugin=./libTestPass.so -passes=test-pass $(file) -disable-output
In questo caso per eseguire il passo è necessario dare in pasto al make anche il file su cui eseguire l'ottimizzazione:
make clean all load file=test/Loop.bc
1.2 Tutorial 02
.PHONY: clean setup clean: $(RM) $(OPTIMIZER) $(OBJs) setup: opt -load-pass-plugin=./libLocalOpts.so -passes=algebraic $(firstrepr) -o $(bcfile) llvm-dis $(bcfile) -o $(optrepr) .PHONY: auto auto: make clean all setup firstrepr=./testTransform/Foo.ll bcfile=./testTransform/FooOpt.bc optrepr=./testTransform/FooOpt.ll
In questo altro esempio viene gestito tutto a livello di Makefile, basta lanciare
make auto
1.3 Tutorial 03
.PHONY: clean clean: $(RM) $(OPTIMIZER) $(OBJs) run: opt -enable-new-pm=0 -load ./libLoopInvariantCodeMotion.so -loop-walk test/Loop.ll -o test/Loop.bc llvm-dis test/Loop.bc -o test/OptLoop.ll
In questo caso basta usare
make clean all run
1.4 Tutorial 04
Nella fase di setup viene prodotto il file intermedio e viene ottimizzato usando il passo mem2reg, che converte tutte le operazioni che accedono alla memoria in operazioni che lavorano soltanto con registri (per semplicità e ragioni didattiche). Viene poi disassemblato il file binario per avere l'input del nostro passo di loop fusion, il quale viene chiamato normalmente tramite opt.
.PHONY: clean clean: $(RM) $(OPTIMIZER) $(OBJs) *.ll *.bc setup: clang -O0 -Xclang -disable-O0-optnone -emit-llvm -c Loop.c opt -passes=mem2reg Loop.bc -o Loop.opt.bc llvm-dis Loop.opt.bc -o Loop.opt.ll pass: opt -load-pass-plugin=./libLocalOpts.so -passes=transform ./Loop.opt.ll -o ./Realout.bc llvm-dis ./Realout.bc -o ./Realout.ll
In questo caso, si usa:
make clean all setup pass
2 OMP
Comando per compilare un file c, linkando la libreria openmp e produrre un file intermedio (dopo la procedura di lowering).
gcc -fopenmp -fdump-tree-omplower example.c