2011-06-16 11 views
10

मैं a compiler एक बैकेंड के रूप में LLVM का उपयोग करता है, और मेरे संकलक निम्नलिखित LLVM विधानसभा कोडLLVM विधानसभा: पूर्णांक

@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 
} 

उत्पन्न करता है लिख रहा हूँ रजिस्टर करने के लिए निरंतर आवंटित लेकिन मैं निम्नलिखित त्रुटि मिलती है:

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

दस्तावेज examples like that दिखाता है।

क्या आप जानते हैं कि यह काम करने के लिए कैसे प्राप्त करें? वर्तमान में, मैं बजाय उपयोग कर रहा हूँ:

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

आप नाम के निरंतर मूल्य को क्यों बांधना चाहते हैं? बस 'पूंछ कॉल शून्य @printf (i8 *% 1, i31 1)' में स्थिर स्थान का उपयोग करें। बीटीडब्ल्यू, क्या आप आईआर को एक पाठ के रूप में उत्पन्न कर रहे हैं? किस लिए? –

+2

क्योंकि कोड जनरेटर के लिए यह आसान है। मैं टेक्स्ट आईआर का उपयोग कर रहा हूं क्योंकि मेरे पास उपयोग की जा रही भाषा से सी/सी ++ libs तक आसानी से पहुंच नहीं है। – Mildred

उत्तर

13

LLVMdev चर्चा देखें "How to assign a constant to a register?" के रूप में डंकन रेत से वहाँ ने कहा:

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.

धागा सीधे निरंतर उपयोग करने के लिए एक जोड़े विकल्प उत्पन्न किया:

  • पॉइंटर प्राप्त करने के लिए alloca का उपयोग करें, इसे स्टोर करें, फिर आवश्यकतानुसार मूल्य लोड करें।
  • निरंतर वैश्विक बिंदु बनाएं, फिर आवश्यकतानुसार उस मान को लोड करें।

किसी ने इंगित किया कि alloca दृष्टिकोण अनुकूलन के बाद एक रजिस्टर का उपयोग कर समाप्त हो जाएगा।

भले ही, @ एसके-लॉजिक द्वारा सुझाए गए अनुसार सीधे निरंतर उपयोग का उपयोग सबसे साफ समाधान प्रतीत होता है।

+0

अंत में, मैं यहां एक रजिस्टर के निर्माण से बचने के लिए अपने कोड जेनरेटर के आसपास काम करता हूं। – Mildred

0

% 1 unnamed है। इसके बजाए% name_here का प्रयोग करें।

+0

मेरे लिए काम नहीं कर रहा है – Mildred