J'ai le morceau de code suivant :
int main(int argc, char *argv[])
{
int a = 2;
int b = 5;
int soma = a + b;
//...}
Le bitcode llvm résultant est :
define i32 @main(i32 %argc, i8** %argv) #0 {
entrée :
...
% a = allouer i32, aligner 4
% b = allouer i32, aligner 4
% soma = allouer i32, aligner 4
...
appel vide @ llvm.dbg.declare (métadonnées ! {i32* % a}, métadonnées ! 15), ! dbg ! 16
magasin i32 2, i32* % a, aligner 4, ! dbg ! 16
appel vide @ llvm.dbg.declare (métadonnées ! {i32* % b}, métadonnées ! 17), ! dbg ! 18
magasin i32 5, i32* % b, aligner 4, ! dbg ! 18
appel vide @ llvm.dbg.declare (métadonnées ! {i32* % soma}, métadonnées ! 19), ! dbg ! 20
% 0 = charge i32* % a, aligner 4, ! dbg ! 20
% 1 = charge i32* % b, aligner 4, ! dbg ! 20
% add = ajouter nsw i32 % 0, % 1, ! dbg ! 20
magasin i32 % add, i32* % soma, aligner 4, ! dbg ! 20
...
! 1 = métadonnées ! {i32 0}
! 2 = métadonnées ! {métadonnées ! 3}
...
! 15 = métadonnées ! {i32 786688, métadonnées ! 3, métadonnées !"a", métadonnées ! 4, i32 6, métadonnées ! 7, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [ligne 6]
! 16 = métadonnées ! {i32 6, i32 0, métadonnées ! 3, nul}
! 17 = métadonnées ! {i32 786688, métadonnées ! 3, métadonnées !"b", métadonnées ! 4, i32 7, métadonnées ! 7, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [ligne 7]
! 18 = métadonnées ! {i32 7, i32 0, métadonnées ! 3, nul}
! 19 = métadonnées ! {i32 786688, métadonnées ! 3, métadonnées !"soma", métadonnées ! 4, i32 8, métadonnées ! 7, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [soma] [ligne 8]
! 20 = métadonnées ! {i32 8, i32 0, métadonnées ! 3, nul}
À partir du bitcode, j'ai besoin d'obtenir le texte suivant :
a = 2
b = 5
soma = a + b
Ma question est comment extraire l'information dont j'ai besoin à partir des métadonnées (dgb) ?? En ce moment, je n'ai que le nom des instructions I-> getName ()
et le nom des opérandes avec valueOp Value * = I-> getOperand (i); valueOp-> getName (). Str ();
Les métadonnées sont très étendues. Comment puis-je obtenir cette information à partir des métadonnées ?