2012-11-13 21 views
5

मैं घंटों की खोज कर रहा हूं और मुझे कुछ भी नहीं मिला जो मेरी मदद कर सकता है। मैं एक प्रोजेक्ट पर काम कर रहा हूं जिसमें फंक्शनपास शामिल है। मैंने एक रनऑनफंक्शन (फंक्शन & एफ) विधि लागू की है और यह ठीक काम कर रहा है।एलएलवीएम निर्देश कैसे डालें?

1) एक दुकान अनुदेश

2) एक बिटवाइज़ और आपरेशन (0000FFFF का उपयोग कर पूर्णांक परिवर्तन एक पूर्णांक

3) करने के लिए दुकान शिक्षा का स्मृति पता कन्वर्ट)

का पता लगाने: मूल रूप से यह करने की जरूरत है

virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock& b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if(StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     PtrToIntInst* ptrToInt = new PtrToIntInst(si->getPointerOperand(), IntegerType::get(si->getContext(), 32), "", si); 
     } 
    } 
    } 
    return true; 
} 
:

4) सूचक

अब तक मैं निम्नलिखित मिल गया है में वापस पूर्णांक कन्वर्ट

मैं अपने जीवन के लिए नहीं समझ सकता कि वास्तव में निर्देश कैसे डालना है, या यहां तक ​​कि एक निर्देश बनाने के लिए एक रास्ता भी ढूंढना है। अगर कोई मुझे सही दिशा में इंगित कर सकता है, तो यह बहुत अच्छा होगा।

अग्रिम धन्यवाद।

उत्तर

4

मैं Programmer's Manual पर एक नज़र डालने की सलाह देता हूं - इसमें मूल बातें का एक सुंदर सभ्य कवरेज है।

विशेष रूप से, a section about creating and inserting new instructions है। सबसे आसान तरीका केवल नए निर्देश के कन्स्ट्रक्टर के लिए अंतिम तर्क के रूप में मौजूदा निर्देश प्रदान करना है, जो उस निर्देश को तुरंत मौजूदा से पहले सम्मिलित करेगा।

वैकल्पिक रूप से, यदि आप अपने अंत में जोड़ना चाहते हैं तो आप संलग्न मूल ब्लॉक को पार कर सकते हैं (लेकिन याद रखें कि आपको टर्मिनेटर की देखभाल करने की आवश्यकता है!)। अंत में, आप संलग्न बुनियादी ब्लॉक पर getInstList() पर कॉल कर सकते हैं, फिर insert या push_back नए निर्देशों को सम्मिलित करने के लिए बस कॉल कर सकते हैं।

एक तरफ के रूप में, आपको सभी ब्लॉक पर फिर से शुरू करने की आवश्यकता नहीं है और फिर प्रत्येक में सभी निर्देशों पर, आप सीधे निर्देशों पर फिर से सक्रिय हो सकते हैं; the section about the instruction iterator in the programmer's manual देखें।

+0

आप एक संलग्न मूल ब्लॉक पास करने के मामले में टर्मिनेटर का ख्याल कैसे रखते हैं? – PatoBeltran

+1

@PatoBeltran निर्देशों को जोड़ना इस तरह से मूल ब्लॉक के सत्यापन को ट्रिगर नहीं करता है, इसलिए आप उन मध्यवर्ती चरणों में एक विकृत मूल ब्लॉक हो सकते हैं। बस अपने पास फ़ंक्शन के साथ समाप्त होने से पहले टर्मिनेटर को अंत में रखना सुनिश्चित करें। – Oak

4
virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock &b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if (StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     IRBuilder Builder(si); 
     Value *StoreAddr = Builder.CreatePtrToInt(si->getPointerOperand(), Builder.getInt32Ty()); 
     Value *Masked = Builder.CreateAnd(StoreAddr, 0xffff); 
     Value *AlignedAddr = Builder.CreateIntToPtr(Masked, si->getPointerOperand()->getType()); 
     // ... 
     } 
    } 
    } 
    return true; 
} 
0

आप एक IRBuilder का उपयोग आसानी से एक और अनुदेश पहले या एक मूल ब्लॉक के अंत में नए निर्देश सम्मिलित करने के लिए कर सकते हैं।

वैकल्पिक रूप से, अगर आप एक दूसरे से के बाद एक निर्देश डालने की आवश्यकता है, तो आप युक्त मूल ब्लॉक में instruction list उपयोग करने की आवश्यकता:

BasicBlock *pb = ...; 
Instruction *pi = ...; 
Instruction *newInst = new Instruction(...); 

pb->getInstList().insertAfter(pi, newInst); 

कोड और समाधान here से लिया।

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