2013-02-18 7 views
5

मैं एक निर्देश की लाइन संख्या (और एक परिवर्तनीय घोषणा - alloca और वैश्विक) भी प्राप्त करना चाहता हूं। निर्देश निर्देशों की एक सरणी में सहेजा गया है।एक निर्देश की llvm लाइन संख्या

Constant* metadata::getLineNumber(Instruction* I){ 
    if (MDNode *N = I->getMetadata("dbg")) { // this if is never executed 
     DILocation Loc(N); 
     unsigned Line = Loc.getLineNumber(); 
     return ConstantInt::get(Type::getInt32Ty(I->getContext()), Line); 
    } // else { 
     // return NULL; } 
} 

और अपने मुख्य में() मेरे पास है:

errs()<<"\nLine number is "<<*metadata::getLineNumber(allocas[p]); 

परिणाम शून्य है, क्योंकि I->getMetadata("dbg") गलत है मैं समारोह है।

क्या एलएलवीएम फ्रेमवर्क को पुनर्निर्माण किए बिना एलएलवीएम में डीबीजी झंडे को सक्षम करने की संभावना है, जैसे लक्ष्य प्रोग्राम को संकलित करते समय या मेरे पास (मैंने उपयोग किया -debug) चलाते समय ध्वज का उपयोग करना?

"-O3 -g" के साथ एक प्रोग्राम को संकलित करना पूर्ण डीबग जानकारी देना चाहिए, लेकिन मेरे पास अभी भी एक ही परिणाम है। मुझे http://llvm.org/docs/SourceLevelDebugging.html से अवगत है, जहां से मैं देख सकता हूं कि मेटाडेटा फ़ील्ड से स्रोत लाइन नंबर लेना काफी आसान है।

पीएस: एलोकास के लिए, ऐसा लगता है कि मुझे DbgInfoPrinter.cpp से findDbgDeclare विधि का उपयोग करना है।

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

उत्तर

6

एलएलवीएम डीबगिंग जानकारी प्रदान करता है यदि आप -g क्लैंग को ध्वज निर्दिष्ट करते हैं। आपको इसे सक्षम/अक्षम करने के लिए एलएलवीएम का पुनर्निर्माण करने की आवश्यकता नहीं है - कोई भी एलएलवीएम करेगा (बाइनरी या बाइनरी पैकेज से पूर्व निर्मित एक सहित)।

समस्या यह हो सकती है कि आप अत्यधिक अनुकूलित कोड (-O3) में डीबग जानकारी रखने का प्रयास कर रहे हैं। यह जरूरी नहीं है, क्योंकि एलएलवीएम ऐसे मामलों में कुछ कोड को आसानी से अनुकूलित करता है और जानकारी डीबग करने के लिए बहुत अधिक अर्थ नहीं है। एलएलवीएम अनुकूलन के दौरान डीबग जानकारी को संरक्षित करने की कोशिश करता है, लेकिन यह एक आसान काम नहीं है।

डीबग जानकारी (-O0 -g) के साथ unoptimized कोड उत्पन्न करके शुरू करें और इसके साथ काम करने के लिए अपने कोड/पास लिखें। फिर अनुकूलित कोड के लिए स्नातक, और यह जांचने की कोशिश करें कि विशेष रूप से क्या खो जाता है। अगर आपको लगता है कि एलएलवीएम बेवकूफ है, तो बग खोलने में संकोच नहीं करें।

कुछ यादृच्छिक टिप्स:

  • बजना (-emit-llvm) से आईआर जनरेट करें और इसे में डिबग मेटाडाटा नोड्स देखते हैं। फिर आप अनुकूलन के साथ opt के माध्यम से चला सकते हैं और देख सकते हैं कि क्या बनी हुई है।
  • -debugllc और अन्य एलएलवीएम उपकरण विकल्प विकल्प में डीबग जानकारी से काफी असंबंधित है।
+0

क्या एलएलवीएम पास से निर्देश की लाइन संख्या को संशोधित करना संभव है? – user

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