Ich schreibe einen Programmiersprachencompiler, um DSLs und C/C++ zu integrieren. Dafür habe ich mich aus verschiedenen Gründen für LLVM entschieden.Datentyp für Bool in LLVM IR
Es gibt ein Hauptprogramm. In diesem Hauptprogramm lade ich Bitcode-Dateien, die von clang kompiliert wurden. Die ladbare Bitcodedatei stellt eine kurze, aber vollständige Programmiersprachenumgebung mit REPL, Parser, Linker und AST dar.
Mein bisheriges Verständnis war, dass boolesche Datentypen in IR als i1 dargestellt werden. Ich habe meinen Code mit O3 optimiert und ich für einen boolean IR-Code folgenden (durch mit llvm-dis aus der erzeugten Bitcode Datei Demontage):
%"class.tl::contrib::toy::ToyREPL" = type <{ %"class.tl::contrib::toy::InitLanguage"*, i8, [7 x i8] }>
Die Klasse ist ToyREPL und es wird mit einer anderen Klasse InitLanguage. Seltsamerweise scheint der Boolesche Wert von einem i8 und einem Array von i8 dargestellt zu werden. Ich verstehe es nicht wirklich.
Ich habe ein Makefile definiert. Zuerst kompiliere ich die Dateien. Danach verknüpfe ich sie mit einer bc-Datei, optimiere sie und verlinke sie mit anderen libs.
@cd $(BIN)/$(TARGET)/$(2); $(LINK) -o $(1).$(BITCODE_EXT) $(3)
@cd $(BIN)/$(TARGET)/$(2); $(OPT) -O3 $(1).$(BITCODE_EXT) -o $(1).$(OPT_NAME).$(BITCODE_EXT) $(OPTIMIZER_FLAGS)
@$(LINK) -o $(BIN)/$(TARGET)/$(2)/$(1).$(BITCODE_EXT) $(BIN)/$(TARGET)/$(2)/$(1).$(OPT_NAME).bc $(LINK_OPTION) $(4)
Compiler-Flags sind:
-v -g -emit-llvm -I$(BOOST_INC_DIR) -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
Optimizer Flags sind -std-link-opts
Link-Flagge -v
ist.
Der relevante Teil der Klasse ToyREPL ist hier:
class ToyREPL {
private:
InitLanguage *initLang;
bool runs = false;
Nun meine Frage: Ist meine Annahme falsch Bool sollte i1 zusammengestellt Bitcode werden? Welche Art von Compiler-Switch muss ich berücksichtigen, um nach i1 zu kompilieren? Lass es mich wissen, wenn du denkst, dass mein Build-Prozess in irgendeiner Weise falsch ist. Die Generate-Bitcode-Datei ist lesbar und ich kann das Modul und die Klasse ToyREPL als StructType abrufen.
Ersetzte Anführungszeichen mit Code - Anführungszeichen sind in der Regel am besten, wenn Dinge zitiert werden, die für Menschen gedacht sind, nicht für Computer.;) – Yakk