2011-06-16 34 views
10
Ben bir arka uç olarak LLVM kullanır ve benim derleyici aşağıdaki LLVM derleme kod

LLVM derleme:

@0 = private constant [25 x i8] c"Hello World to %dntegers\00" 

declare void @printf (i8*, i32) 

define void @main() { 
    %1 = getelementptr [25 x i8]* @0, i32 0, i32 0 
    %2 = 1 
    tail call void @printf(i8* %1, i32 %2) 
    ret void 
} 

üretir a compiler yazıyorum

kayıt tamsayı sabit atamak Ama aşağıdaki hatayı alıyorum:

c.ll:8:8: error: expected instruction opcode 
    %2 = 1 
    ^

Belgeler, examples like that'u gösterir.

Bunu nasıl çalıştırılacağını biliyor musunuz? Şu anda, bunun yerine kullanıyorum:

%2 = add i32 0, 1 ; FIXME 
+2

Neden bir ada sahip sabit bir değer bağlamak istersiniz? Sadece sabitini, 'tail call void @printf (i8 *% 1, i31 1) 'deki gibi kullanın. Btw., IR'yi bir metin olarak mı üretiyorsunuz? Ne için? –

+2

Bu kod üreticisi için daha basit olduğundan. Metin IR kullanıyorum çünkü kullandığım dilden C/C++ libs'e kolay erişimim yok. – Mildred

cevap

13

LLVMdev tartışma bakın "How to assign a constant to a register?" olarak Duncan Sands oraya dikkat çekti:

let me say that in general doing this is pointless. Due to SSA form, if %x is set to 5 you can't set it to something else later. Thus everywhere that you use %x you might as well just directly use 5 there instead. A common situation is that you have a register %x, and due to performing optimizations you discover that in fact %x will always have the value 5. You can use RAUW (aka the replaceAllUsesWith method) to replace %x with 5 everywhere.

iplik doğrudan sabit kullanmanın birkaç alternatifleri üretmek vermedi:

  • alloca işaretçiyi işaretleyin, saklayın, ardından değeri gerektiği gibi yükleyin.
  • Sabit için global bir işaret oluşturun, ardından bu değeri gerektiği gibi yükleyin.

Birisi alloca yaklaşım optimizasyon sonra kaydının kullanılmasıyla sona erecek dikkat çekti.

Her şeye rağmen, sabiti doğrudan @ SK-mantığı tarafından önerilen şekilde kullanmak en temiz çözüm gibi görünüyor.

+0

Son olarak, burada bir kayıt oluşturulmasını önlemek için kod üretecim etrafında çalışıyorum. – Mildred

0

% 1, unnamed'dir. Bunun yerine% name_here kullanın.

+0

benim için çalışmıyor gibi görünüyor – Mildred