2010-10-15 37 views
7

J'ai essayé de compiler cet extrait de code C:Comment trouver toutes les allocations de mémoire dans un fichier de code llvm ir?

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

utilisant:

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

Et obtenu ceci:

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) 

Ce que je me demande est maintenant: où le _Znwj et _Znaj viennent-ils? Sont-ils attribués au hasard ou y a-t-il un système? Je voudrais pouvoir dire que les lignes:

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

et

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

effectuer des allocations de mémoire. Mais ça n'a pas l'air si prometteur.

Un expert en informatique qui a une idée?

+0

Je pourrais ajouter que s'il y a un moyen de le savoir (où les allocations de mémoire sont) à partir d'une chaîne d'outils clang/llvm, ce serait bien aussi, s'il vous plaît dites-moi comment. – thehan

Répondre

5

Vous voyez le nom C++ tronqué de l'opérateur. Démangez le symbole en utilisant abi::__cxa_demangle ou créez une table de symboles mutilés. Les opérateurs nouveaux/supprimés peuvent être surchargés de sorte que les symboles ne sont pas constants. Le démanglement peut être l'option la plus sûre.

C'est la fonction d'ambiance à C++ filt, qui utilise à son tour abi::__cxa_demangle:

 
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)