2013-02-11 9 views
7

में अप्रत्यक्ष है यदि कोई फ़ंक्शन कॉल प्रत्यक्ष है, तो आप निम्न कोड के माध्यम से फ़ंक्शन प्रकार प्राप्त कर सकते हैं।कॉलइन्स्ट से फ़ंक्शनटाइप कैसे प्राप्त करें जब कॉल एलएलवीएम

Function * fun = callInst->getCalledFunction(); 
Function * funType = fun->getFunctionType(); 

हालांकि, अगर कॉल अप्रत्यक्ष है, वह है, एक समारोह सूचक के माध्यम से, getCalledFunction रिटर्न नल। तो मेरा सवाल यह है कि फ़ंक्शन पॉइंटर के माध्यम से फ़ंक्शन को कॉल करते समय फ़ंक्शन प्रकार कैसे प्राप्त करें।

उत्तर

9

तो जैसे एक अप्रत्यक्ष कॉल से टाइप करने के लिए, getCalledFunction के बजाय getCalledValue उपयोग करते हैं,:

Type* t = callInst->getCalledValue()->getType(); 

है कि आप सूचक कॉल अनुदेश के लिए पारित के प्रकार मिलेगा; वास्तविक फ़ंक्शन प्रकार प्राप्त करने के लिए,

FunctionType* ft = cast<FunctionType>(cast<PointerType>(t)->getElementType()); 
+0

इस तरह के एक अच्छे उत्तर के लिए धन्यवाद। मुझे लगता है, टाइप * फंक्शन पॉइंटर को शून्य * पॉइंटर कास्टिंग करने के लिए पर्याप्त होगा, क्योंकि मुझे लगता है कि उस उद्देश्य के लिए बिटकास्टइन्स्ट का उपयोग करने की आवश्यकता है, और वह कक्षा टाइप * को इसके पैरामीटर के रूप में लेती है। – MetallicPriest

+1

@ मेटालिक प्रीस्ट हां, 'टी' को कास्टिंग करना आपको मनमाने ढंग से पॉइंटर के साथ करने की ज़रूरत है ताकि इसे आपके 'कॉलइस्ट' के अनुरूप बनाया जा सके। मुझे लगता है कि आपका मतलब 'i8 *' है, हालांकि, 'void *' नहीं है, जो कानूनी एलएलवीएम प्रकार नहीं है। – Oak

+1

मैं अप्रत्यक्ष कॉल के फ़ंक्शन का नाम प्राप्त करने का प्रयास कर रहा हूं: 'वैल्यू * वी = सीआई-> getCalledValue(); मान * sv = v-> स्ट्रिप पॉइंटरकास्ट(); StringRef fname = sv-> getName(); ' लेकिन वास्तव में काम नहीं करता है। कोई विचार? – eternalStudent

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