2016-03-22 14 views
2

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.

+0

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

cevap

2

seni doğru anladıysam, sorunuzun temelde - neden C++ sınıfı

class ToyREPL { 
    bool runs = false; 
    ... 
}; 

type <{ i8, [7 x i8], ... }> içine Clang Derleyen edildi? the smallest C++ type takes one byte of memory ve bit alanları kullanın sürece, ayrıca yapılar alanlara geçerli olduğu - Clang bir boolean alan için i1 üzerinde i8 seçtim

her şeyden Yani ilk

, basittir. Ayrıca bkz. this related question about why a whole byte is used for booleans. LLVM'nin kendisi, boolean değerleri için i1 kullanır, ancak kabaca platformdan bağımsız olduğu için - indirme aşamasında bunlar tekrar bütün baytlar haline gelebilir.

[7 x i8]'a gelince, bu türdeki her nesnenin 64-bit hizalı olduğundan ve belleğini başka herhangi bir nesneyle paylaşmadığından yapılan dolgu, 64 bit sistemde çok makul bir yaklaşımdır. Alternatif olarak, aşağıdaki bir yapısal alan varsa, alanın 64-bit hizalanmış olduğundan emin olmak için dolgu takılmış olabilir. Daha fazla bilgi edinmek isterseniz, The Wikipedia article on alignment and paddingThe Wikipedia article on alignment and padding

The Wikipedia article on alignment and padding yararlı bir başlangıç ​​noktasıdır.
+0

Bu açık cevap gibi görünüyor ... ama LLVM'nin tarafında bir istisna var mı, yoksa C++'ın belirtildiği yolun büyük bir kısmı mı? – VermillionAzure

+0

Teşekkürler. Paddle'lar 64 bit makinem olduğu için mantıklı. Fakat bu, bir tamsayı değeri ile bir boolean arasında asla fark edemediğim anlamına gelir, eğer elimde bit kodu varsa, öyle değil mi? – repl

+0

@VermillionAzure Bu, C++'dan, bildiğim kadarıyla, C++ yolundan ve performans nedenlerinden dolayı geliyor. Örneğin, başka bir dil, booleanlar için yer tasarrufu sağlamak için i1'i görevlendirebilir - ancak daha sonra indirme aşaması, yalnızca ite adresleme yapan bir makineye "i1" yerleştirmek ve depolamak için korkutucu şeyler yapabilir. – Oak