2011-12-04 5 views
10

किसी मौजूदा एएसटी से आईआर का निर्माण करते समय, मेरे एएसटी में कुछ स्ट्रिंग मान होते हैं (संकलन समय पर वे std::string से बनाए जाते हैं) और मैं उन्हें अभिव्यक्ति के हिस्से के रूप में उपयोग करने के लिए llvm::Value के रूप में सुरक्षित रूप से सेट करना चाहता हूं।एलएलवीएम स्ट्रिंग वैल्यू ऑब्जेक्ट्स: मैं एक मूल्य से स्ट्रिंग को कैसे प्राप्त कर सकता हूं?

इस मामले में, मुझे रन-टाइम पर स्ट्रिंग को बांधने की आवश्यकता नहीं है, क्योंकि स्ट्रिंग मान केवल संकलन-समय पर चर, फ़ंक्शन या कक्षाओं के रूप में सामान को हल करने के लिए हैं (भाषा मूल निवासी का समर्थन नहीं करती है स्ट्रिंग प्रकार)।

क्या llvm::Value और के रूप में मेरे स्ट्रिंग सामग्री रखने के लिए सबसे अच्छा तरीका अभी भी संकलन के बाद के चरणों (जब घोंसले भाव निर्माण कर रहे हैं) पर इसे पुनः प्राप्त करने में सक्षम हो?

अधिक वस्तुतः, अगर मैं सेट के साथ llvm::Value:

llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str()); 

कैसे मैं सुरक्षित रूप से स्ट्रिंग मान प्राप्त करते हैं? llvm::ConstantArray तार लपेटने के लिए उपयुक्त तरीका है?

उत्तर

5

हां, कॉन्स्टेंटएरे वह है जो आपको यहां उपयोग करना चाहिए। मूल्य को पुनः प्राप्त करने के लिए बाद में केवल ConstantArray :: getAsCString() का उपयोग करें। यदि आपके पास दावे चालू हैं, तो यह ज़ोर देगा कि कुछ गलत हो जाएगा (उदाहरण के लिए आप सरणी w/o शून्य टर्मिनेटर से स्ट्रिंग को पकड़ने का प्रयास करेंगे)।

3

सी कोड char *x = "asdf"; पर http://llvm.org/demo/ चल देता है:

@.str = private unnamed_addr constant [5 x i8] c"asdf\00" 
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8 

मूल रूप से, एक स्ट्रिंग का पता प्राप्त करने के लिए, आप एक वैश्विक यह युक्त निर्माण करने के लिए है। यदि आप यह समझने में परेशानी करते हैं कि इसे कैसे करना है, तो आप C12+ API कॉल आउटपुट के लिए http://llvm.org/demo/ स्विच कर सकते हैं।