2012-03-22 6 views
7

मैं सरणी घोषणाओं का पता लगाने और स्थिर आकार के सरणी के लिए प्रतीक मान तालिका बनाने का प्रयास कर रहा हूं। इसमें एक नाम-सरणी आकार जोड़ना होगा। मेरे पास कई प्रश्न हैं:एलएलवीएम निर्देश परिवर्तनीय नाम और पैरामीटर

1)% a = alloca [200 x i8] जैसे निर्देश दिए गए, 16 संरेखित करें, मैं सरणी का नाम "ए" कैसे निकाल सकता हूं। । जब मैं प्रिंट v किसी को भी पता है कि ऐसा क्यों है

if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){ 
    PointerType *p = allocInst->getType(); 
    if(p->getElementType()->isArrayTy()){ 
      Value* v = allocInst->getOperand(0); 
      errs() << *v ; 
    } 
}      

मुझे पैदावार "i32 1":

2) मैं सरणी आकार लेकिन इस कोड के रूप में "200" को निकालने के लिए कोशिश कर रहा हूँ? मुझे नहीं लगता था कि इस पते को छोड़कर इसके बारे में 32 बिट कुछ भी था।

+0

ठीक है तो मुझे पता चला कि आकार कैसे प्राप्त करें: ऐरे टाइप टाइप * ए = कास्ट (पी-> getElementType()); a-> getNumElements() – Realn0whereman

+3

ठीक है ... इसलिए ... मैं पता लगा कि कैसे भी नाम पाने के लिए ... allocInst-> getName() क्यों कि बस stackoverflow पर पोस्टिंग मुझे उत्तरों को तेज़ी से खोजने में मदद करता है ...: पी – Realn0whereman

+6

यदि आप टिप्पणियों के बजाय, इस जानकारी वाले उत्तर को पोस्ट करते हैं तो यह सबसे अच्छा है। इस तरह सवाल को उत्तर के रूप में ठीक से चिह्नित किया जाएगा। – Oak

उत्तर

2

कुछ जवाब टिप्पणियों में हैं, लेकिन यहां एक और पूर्ण स्पष्टीकरण है।

आवंटन में आकार के दो स्रोत हैं: आवंटित प्रकार का आकार और आवंटित किए गए उस प्रकार के तत्वों की संख्या। यदि आप स्पष्ट रूप से कोई संख्या निर्दिष्ट नहीं करते हैं, तो आपको एकल तत्व आवंटित करने का निहित डिफ़ॉल्ट मिलता है। यह i32 1 मान है जो आप ऑपरेंड # 0 से बाहर निकलते हैं। यदि आवंटित प्रकार एक सरणी प्रकार है (dyn_cast<...> का उपयोग इसके लिए परीक्षण करने के लिए करें, cast<...> जोर देगा), तो आपको उस आकार के लिए भी खाते की आवश्यकता होगी।

एलएलवीएम में, ऑप्टिमाइज़र उस आकार के साथ एक एकल सरणी के आवंटन निर्देश में एक से अधिक स्थिर आकार के साथ ऑलोकै निर्देशों को कैननिकलाइज करता है। तो आप अक्सर एक आवंटन के रूप में alloca आकार देखते हैं।

इस के लिए अधिक अनुकूल एपीआई के रूप में अच्छी तरह से कर रहे हैं: http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

विशेष रूप से, AllocaInst::getArraySize() आप घटक (आमतौर पर 1) की संख्या मिलेगा और AllocaInst::getAllocatedType() आप आवंटित तत्व के प्रकार (कभी कभी एक सरणी) मिल जाएगा ।

अंत में, नाम का उपयोग करने के बारे में एक नोट: एलएलवीएम कोई निर्देशों के नामों के बारे में गारंटी नहीं देता है। अनुकूलक के विभिन्न हिस्सों नामों को नष्ट कर देंगे या उन्हें बदल देंगे। बस उत्पादन कोड के लिए उनका उपयोग करके सावधान रहें क्योंकि जब वे दूर जाते हैं तो आपको आश्चर्य हो सकता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^