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