DSL'leri ve C/C++'yi tümleştirmek için bir programlama dili derleyicisi yazıyorum. Bunun için LLVM için birkaç nedenden dolayı karar verdim.LLVM IR için veri türü IR
Ana program var. Bu ana programda, clang tarafından derlenen bitcode dosyalarını yüklerim. Yüklenebilir bitcode dosyası REPL, ayrıştırıcı, linker ve AST ile kısa, fakat eksiksiz bir programlama dili ortamını temsil eder.
Şimdiye kadarki anlayışım, boole veri tiplerinin IR olarak i1 olarak temsil edilmesiydi. -o3 ile kodumu optimize ettim ve (üretilen bitcode dosyasından LLVM-dis ile demontaj) bir boolean aşağıdaki IR kodu için olsun:
%"class.tl::contrib::toy::ToyREPL" = type <{ %"class.tl::contrib::toy::InitLanguage"*, i8, [7 x i8] }>
sınıf ToyREPL olduğunu ve başka bir sınıf InitLanguage kullanıyor. Tuhaf olarak, boole bir i8 ve bir dizi i8 tarafından sunulmuş gibi görünüyor. Gerçekten anlamadım.
Makefile tanımladım. Önce dosyaları derledim. Daha sonra bunları bir bc dosyasına bağlarım, daha sonra optimize edip diğer bazı lib'lerle bağlarım.
@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)
Derleyici bayrakları:
-v -g -emit-llvm -I$(BOOST_INC_DIR) -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
Doktoru bayrakları -std-link-opts
Bağlantı bayrağı -v
olduğunu vardır.
Sınıf ToyREPL ilgili kısmı buradadır:
class ToyREPL {
private:
InitLanguage *initLang;
bool runs = false;
Şimdi benim sorum: benim varsayım yanlış bool i1 için derlenmiş bitcode edilmelidir mı? Ne tür bir derleyici geçişi i1'e derlemeyi düşünmem gerekiyor? Yapılandırma sürecimin bir şekilde yanlış olduğunu düşünüyorsanız bana bildirin. Oluşturma bit kodu dosyası okunabilir ve modülü ve ToyREPL sınıfını bir StructType olarak alabilirim.
Kodla birlikte değiştirilen tırnaklar, insanlar için yazılan şeyleri bilgisayarlara değil, alıntı yapmak için genellikle en iyisidir.;) – Yakk