2010-10-15 7 views
7

मैंने सी ++ कोड के इस स्निपेट को संकलित करने का प्रयास किया:मैं एक llvm आईआर कोड फ़ाइल में सभी स्मृति आवंटन कैसे प्राप्त करूं?

void FuncTest() { 
    int* a = new int; 
    int* b = new int[2]; 
} 

का उपयोग करना:

clang test.cpp -S -emit-llvm -o - > test.llvm 

और इसे प्राप्त किया:

define void @_Z8FuncTestv() { 
entry: 
    %a = alloca i32*, align 4 
    %b = alloca i32*, align 4 
    %call = call noalias i8* @_Znwj(i32 4) 
    %0 = bitcast i8* %call to i32* 
    store i32* %0, i32** %a, align 4 
    %call1 = call noalias i8* @_Znaj(i32 8) 
    %1 = bitcast i8* %call1 to i32* 
    store i32* %1, i32** %b, align 4 
    ret void 
} 

declare noalias i8* @_Znwj(i32) 
declare noalias i8* @_Znaj(i32) 

मुझे अब क्या सोच रहा है: _Znwj कहां है और _Znaj प्रतीकों से आते हैं? क्या वे सिर्फ यादृच्छिक रूप से असाइन किए गए हैं या क्या इसके लिए कोई व्यवस्था है? मैं यह बताने में सक्षम होना चाहता हूं कि लाइनें:

%call = call noalias i8* @_Znwj(i32 4) 

और

%call1 = call noalias i8* @_Znaj(i32 8) 

स्मृति आवंटन निष्पादित करें। लेकिन यह आशाजनक नहीं लग रहा है।

यहां कुछ llvm विशेषज्ञ हैं जिनके पास कोई विचार है?

+0

मैं यह जोड़ सकता हूं कि अगर यह पता लगाने का कोई तरीका है (जहां मेमोरी आवंटन हैं) एक क्लैंग/एलएलवीएम टूलचैन पास के भीतर से यह ठीक होगा, तो कृपया मुझे बताएं कि कैसे। – thehan

उत्तर

5

आप ऑपरेटर के सी ++ उलझन वाले नाम को देख रहे हैं। abi::__cxa_demangle का उपयोग करके प्रतीक को विचलित करें, या उलझन वाले प्रतीकों की एक तालिका बनाएं। नए/डिलीट ऑपरेटर ओवरलोड हो सकते हैं ताकि प्रतीक स्थिर न हों। Demangling सबसे सुरक्षित विकल्प हो सकता है।

 
define void @FuncTest()() { 
entry: 
    %a = alloca i32*, align 4 
    %b = alloca i32*, align 4 
    %call = call noalias i8* @operator new(unsigned int)(i32 4) 
    %0 = bitcast i8* %call to i32* 
    store i32* %0, i32** %a, align 4 
    %call1 = call noalias i8* @operator new[](unsigned int)(i32 8) 
    %1 = bitcast i8* %call1 to i32* 
    store i32* %1, i32** %b, align 4 
    ret void 
} 

declare noalias i8* @operator new(unsigned int)(i32) 
declare noalias i8* @operator new[](unsigned int)(i32) 
0

आप देख सकते हैं एक समारोह isAllocationFn के माध्यम से स्मृति का आवंटन किया गया है, तो:

इस समारोह C++ filt, जो बारी में abi::__cxa_demangle का उपयोग करता है के माध्यम से पहुंचाया है। ऐसा लगता है यह मेरे लिए काम का होगा।

स्रोत: http://llvm.org/docs/doxygen/html/namespacellvm.html#a455d82c49557ac1d6c8da8e8d86a94b5

पीडी: मैं शीर्षक है, जो है क्या मुझे यहाँ लाया पर सवाल जवाब कर रहा हूँ।

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