2014-10-09 5 views
6

मैंने फ़ंक्शन में मूलभूत लेबल के लेबल का पता लगाने और प्रिंट करने के लिए एक पास लिखा है, क्योंकि मैं आगे splitBasicBlock() का उपयोग करना चाहता हूं। मैं ने लिखा है कि इस तरह:llvm: बेसिक ब्लॉक्स के लेबल को कैसे प्राप्त करें

virtual bool runOnModule(Module &M) 
{ 
    for(Module::iterator F = M.begin(), E = M.end(); F!= E; ++F) 
    { 
     errs()<<"Function:"<<F->getName()<<"\n"; 
     //for(Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 
     for (iplist<BasicBlock>::iterator iter = F->getBasicBlockList().begin(); 
        iter != F->getBasicBlockList().end(); 
        iter++) 
     { 
      BasicBlock* currBB = iter; 
      errs() << "BasicBlock: " << currBB->getName() << "\n"; 
     } 
    } 
    return true; 
} 

आईआर फ़ाइल इस तरह दिखता है:

; <label>:63          ; preds = %43 
    %64 = load i32* %j, align 4 
    %65 = sext i32 %64 to i64 
    %66 = load i8** %tempdst, align 8 
    %67 = getelementptr inbounds i8* %66, i64 %65 
    store i8 -1, i8* %67, align 1 
    br label %73 

; <label>:68          ; preds = %43 
    %69 = load i32* %j, align 4 
    %70 = sext i32 %69 to i64 
    %71 = load i8** %tempdst, align 8 
    %72 = getelementptr inbounds i8* %71, i64 %70 
    store i8 0, i8* %72, align 1 
    br label %73 

; <label>:73          ; preds = %68, %63 
    br label %74 

हालांकि, मैं लेबल के बारे में कुछ भी नहीं मिला:

Function:main 
BasicBlock: 
BasicBlock: 
BasicBlock: 

क्या इन "अनाम" बुनियादी साथ कुछ गड़बड़ है ब्लॉक? मुझे क्या करना चाहिए?

उत्तर

6

एलएलवीएम आईआर में मानों का नाम होना आवश्यक नहीं है; और वास्तव में, उन बुनियादी ब्लॉक में नाम नहीं हैं, यही कारण है कि आपको currBB->getName() से खाली स्ट्रिंग मिलती है।

एलएलवीएम आईआर प्रिंटआउट में उनके नाम होने का कारण यह है कि जब आप एलएलवीएम आईआर (जैसा कि यह .ll फाइलों में दिखाई देता है) के पाठ प्रारूप में प्रिंट करते हैं, तो आपको उन्हें संदर्भ देने के लिए उन्हें एक नाम असाइन करना होगा, इसलिए प्रिंटर अनुक्रमिक संख्यात्मक नाम मूल ब्लॉक (और अन्य मानों) को असाइन करता है। उन संख्यात्मक नाम केवल प्रिंटर द्वारा बनाए जाते हैं, हालांकि, और वास्तव में मॉड्यूल में मौजूद नहीं हैं।

+0

उम पर लेबल के नाम प्राप्त कर सकते हैं ... कैसे हैं एचटीएमएल बुनियादी ब्लॉकों में से एक विभाजित करने के लिए? – winter333

+0

@ winter333 यदि आपके पास कोई अन्य प्रश्न है तो आपको इसे अलग से पूछना चाहिए। – Oak

3

BasicBlocks कोई नाम नहीं है (जैसा कि hasName() विधि द्वारा इंगित) के साथ हो सकता है एक currBB->printAsOperand(errs(), false) का उपयोग कर के बजाय currBB->getName() का मूल्य errs() में स्ट्रीमिंग द्वारा अद्वितीय BasicBlock पहचानकर्ता प्रिंट कर सकते हैं। अज्ञात बेसिकब्लॉक के लिए यह संख्यात्मक मूल ब्लॉक प्रतिनिधित्व प्रदान करेगा, जैसे कि %68

1

मुझे लगता है कि अब एलएलवीएम का व्यवहार अलग है। मैं कोड के समान लाइनों का उपयोग करें और LLVM-4,0

for (auto &funct : m) { 
      for (auto &basic_block : funct) { 
      StringRef bbName(basic_block.getName()); 
       errs() << "BasicBlock: " << bbName << "\n"; 
      } 
} 
संबंधित मुद्दे