Partage
  • Partager sur Facebook
  • Partager sur Twitter

Je n'arrive pas à appliquer la lto

Sujet résolu
    2 février 2024 à 11:47:03

    Salut tout le monde !

    Voici le code que j'essaie de compiler avec la LTO :

    file1.cpp

    #include "declarations.hpp"
    
    int get_value(int x, int y)
    {
        return add(x, y);
    }

    file2.cpp

    #include "declarations.hpp"
    
    int get_value_2(int x, int y, int z)
    {
        return add(x, add(add(x, y), z));
    }
    
    int main()
    {
        get_value_2(1,2,3);
    }

    impl.cpp

    #include "declarations.hpp"
    
    int add(int lhs, int rhs)
    {
        return lhs + rhs;
    }


    declarations.hpp

    #ifndef DECLARATIONS_HPP
    #define DECLARATIONS_HPP
    
    int add(int lhs, int rhs);
    
    #endif


    J'ai recopié ce code depuis cette vidéo : https://www.youtube.com/watch?v=9nzT1AFprYM

    J'essaie ensuite de compiler ce code en suivant les instructions sur ce blog : https://johnysswlab.com/link-time-optimizations-new-way-to-do-compiler-optimizations/

    g++ -flto -c file1.cpp
    g++ -flto -c file2.cpp
    g++ -flto -c impl.cpp
    g++ -flto file1.o file2.o impl.o -o prog

    Mais lorsque je désassemble le code, je remarque que mon code fait toujours appel à la fonction get_value_2() au lieu de juste renvoyer 7 comme dans la vidéo.

    objdump -d prog
    prog:     format de fichier elf64-x86-64
    
    
    Déassemblage de la section .init :
    
    0000000000001000 <_init>:
        1000:	f3 0f 1e fa          	endbr64 
        1004:	48 83 ec 08          	sub    $0x8,%rsp
        1008:	48 8b 05 d9 2f 00 00 	mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__>
        100f:	48 85 c0             	test   %rax,%rax
        1012:	74 02                	je     1016 <_init+0x16>
        1014:	ff d0                	callq  *%rax
        1016:	48 83 c4 08          	add    $0x8,%rsp
        101a:	c3                   	retq   
    
    Déassemblage de la section .plt :
    
    0000000000001020 <.plt>:
        1020:	ff 35 a2 2f 00 00    	pushq  0x2fa2(%rip)        # 3fc8 <_GLOBAL_OFFSET_TABLE_+0x8>
        1026:	f2 ff 25 a3 2f 00 00 	bnd jmpq *0x2fa3(%rip)        # 3fd0 <_GLOBAL_OFFSET_TABLE_+0x10>
        102d:	0f 1f 00             	nopl   (%rax)
    
    Déassemblage de la section .plt.got :
    
    0000000000001030 <__cxa_finalize@plt>:
        1030:	f3 0f 1e fa          	endbr64 
        1034:	f2 ff 25 bd 2f 00 00 	bnd jmpq *0x2fbd(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
        103b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)
    
    Déassemblage de la section .text :
    
    0000000000001040 <_start>:
        1040:	f3 0f 1e fa          	endbr64 
        1044:	31 ed                	xor    %ebp,%ebp
        1046:	49 89 d1             	mov    %rdx,%r9
        1049:	5e                   	pop    %rsi
        104a:	48 89 e2             	mov    %rsp,%rdx
        104d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
        1051:	50                   	push   %rax
        1052:	54                   	push   %rsp
        1053:	4c 8d 05 e6 01 00 00 	lea    0x1e6(%rip),%r8        # 1240 <__libc_csu_fini>
        105a:	48 8d 0d 6f 01 00 00 	lea    0x16f(%rip),%rcx        # 11d0 <__libc_csu_init>
        1061:	48 8d 3d 26 01 00 00 	lea    0x126(%rip),%rdi        # 118e <main>
        1068:	ff 15 72 2f 00 00    	callq  *0x2f72(%rip)        # 3fe0 <__libc_start_main@GLIBC_2.2.5>
        106e:	f4                   	hlt    
        106f:	90                   	nop
    
    0000000000001070 <deregister_tm_clones>:
        1070:	48 8d 3d 99 2f 00 00 	lea    0x2f99(%rip),%rdi        # 4010 <__TMC_END__>
        1077:	48 8d 05 92 2f 00 00 	lea    0x2f92(%rip),%rax        # 4010 <__TMC_END__>
        107e:	48 39 f8             	cmp    %rdi,%rax
        1081:	74 15                	je     1098 <deregister_tm_clones+0x28>
        1083:	48 8b 05 4e 2f 00 00 	mov    0x2f4e(%rip),%rax        # 3fd8 <_ITM_deregisterTMCloneTable>
        108a:	48 85 c0             	test   %rax,%rax
        108d:	74 09                	je     1098 <deregister_tm_clones+0x28>
        108f:	ff e0                	jmpq   *%rax
        1091:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
        1098:	c3                   	retq   
        1099:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    
    00000000000010a0 <register_tm_clones>:
        10a0:	48 8d 3d 69 2f 00 00 	lea    0x2f69(%rip),%rdi        # 4010 <__TMC_END__>
        10a7:	48 8d 35 62 2f 00 00 	lea    0x2f62(%rip),%rsi        # 4010 <__TMC_END__>
        10ae:	48 29 fe             	sub    %rdi,%rsi
        10b1:	48 89 f0             	mov    %rsi,%rax
        10b4:	48 c1 ee 3f          	shr    $0x3f,%rsi
        10b8:	48 c1 f8 03          	sar    $0x3,%rax
        10bc:	48 01 c6             	add    %rax,%rsi
        10bf:	48 d1 fe             	sar    %rsi
        10c2:	74 14                	je     10d8 <register_tm_clones+0x38>
        10c4:	48 8b 05 25 2f 00 00 	mov    0x2f25(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable>
        10cb:	48 85 c0             	test   %rax,%rax
        10ce:	74 08                	je     10d8 <register_tm_clones+0x38>
        10d0:	ff e0                	jmpq   *%rax
        10d2:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
        10d8:	c3                   	retq   
        10d9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    
    00000000000010e0 <__do_global_dtors_aux>:
        10e0:	f3 0f 1e fa          	endbr64 
        10e4:	80 3d 25 2f 00 00 00 	cmpb   $0x0,0x2f25(%rip)        # 4010 <__TMC_END__>
        10eb:	75 2b                	jne    1118 <__do_global_dtors_aux+0x38>
        10ed:	55                   	push   %rbp
        10ee:	48 83 3d 02 2f 00 00 	cmpq   $0x0,0x2f02(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
        10f5:	00 
        10f6:	48 89 e5             	mov    %rsp,%rbp
        10f9:	74 0c                	je     1107 <__do_global_dtors_aux+0x27>
        10fb:	48 8b 3d 06 2f 00 00 	mov    0x2f06(%rip),%rdi        # 4008 <__dso_handle>
        1102:	e8 29 ff ff ff       	callq  1030 <__cxa_finalize@plt>
        1107:	e8 64 ff ff ff       	callq  1070 <deregister_tm_clones>
        110c:	c6 05 fd 2e 00 00 01 	movb   $0x1,0x2efd(%rip)        # 4010 <__TMC_END__>
        1113:	5d                   	pop    %rbp
        1114:	c3                   	retq   
        1115:	0f 1f 00             	nopl   (%rax)
        1118:	c3                   	retq   
        1119:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    
    0000000000001120 <frame_dummy>:
        1120:	f3 0f 1e fa          	endbr64 
        1124:	e9 77 ff ff ff       	jmpq   10a0 <register_tm_clones>
    
    0000000000001129 <_Z9get_valueii>:
        1129:	f3 0f 1e fa          	endbr64 
        112d:	55                   	push   %rbp
        112e:	48 89 e5             	mov    %rsp,%rbp
        1131:	48 83 ec 10          	sub    $0x10,%rsp
        1135:	89 7d fc             	mov    %edi,-0x4(%rbp)
        1138:	89 75 f8             	mov    %esi,-0x8(%rbp)
        113b:	8b 55 f8             	mov    -0x8(%rbp),%edx
        113e:	8b 45 fc             	mov    -0x4(%rbp),%eax
        1141:	89 d6                	mov    %edx,%esi
        1143:	89 c7                	mov    %eax,%edi
        1145:	e8 67 00 00 00       	callq  11b1 <_Z3addii>
        114a:	c9                   	leaveq 
        114b:	c3                   	retq   
    
    000000000000114c <_Z11get_value_2iii>:
        114c:	f3 0f 1e fa          	endbr64 
        1150:	55                   	push   %rbp
        1151:	48 89 e5             	mov    %rsp,%rbp
        1154:	48 83 ec 10          	sub    $0x10,%rsp
        1158:	89 7d fc             	mov    %edi,-0x4(%rbp)
        115b:	89 75 f8             	mov    %esi,-0x8(%rbp)
        115e:	89 55 f4             	mov    %edx,-0xc(%rbp)
        1161:	8b 55 f8             	mov    -0x8(%rbp),%edx
        1164:	8b 45 fc             	mov    -0x4(%rbp),%eax
        1167:	89 d6                	mov    %edx,%esi
        1169:	89 c7                	mov    %eax,%edi
        116b:	e8 41 00 00 00       	callq  11b1 <_Z3addii>
        1170:	89 c2                	mov    %eax,%edx
        1172:	8b 45 f4             	mov    -0xc(%rbp),%eax
        1175:	89 c6                	mov    %eax,%esi
        1177:	89 d7                	mov    %edx,%edi
        1179:	e8 33 00 00 00       	callq  11b1 <_Z3addii>
        117e:	89 c2                	mov    %eax,%edx
        1180:	8b 45 fc             	mov    -0x4(%rbp),%eax
        1183:	89 d6                	mov    %edx,%esi
        1185:	89 c7                	mov    %eax,%edi
        1187:	e8 25 00 00 00       	callq  11b1 <_Z3addii>
        118c:	c9                   	leaveq 
        118d:	c3                   	retq   
    
    000000000000118e <main>:
        118e:	f3 0f 1e fa          	endbr64 
        1192:	55                   	push   %rbp
        1193:	48 89 e5             	mov    %rsp,%rbp
        1196:	ba 03 00 00 00       	mov    $0x3,%edx
        119b:	be 02 00 00 00       	mov    $0x2,%esi
        11a0:	bf 01 00 00 00       	mov    $0x1,%edi
        11a5:	e8 a2 ff ff ff       	callq  114c <_Z11get_value_2iii>
        11aa:	b8 00 00 00 00       	mov    $0x0,%eax
        11af:	5d                   	pop    %rbp
        11b0:	c3                   	retq   
    
    00000000000011b1 <_Z3addii>:
        11b1:	f3 0f 1e fa          	endbr64 
        11b5:	55                   	push   %rbp
        11b6:	48 89 e5             	mov    %rsp,%rbp
        11b9:	89 7d fc             	mov    %edi,-0x4(%rbp)
        11bc:	89 75 f8             	mov    %esi,-0x8(%rbp)
        11bf:	8b 55 fc             	mov    -0x4(%rbp),%edx
        11c2:	8b 45 f8             	mov    -0x8(%rbp),%eax
        11c5:	01 d0                	add    %edx,%eax
        11c7:	5d                   	pop    %rbp
        11c8:	c3                   	retq   
        11c9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
    
    00000000000011d0 <__libc_csu_init>:
        11d0:	f3 0f 1e fa          	endbr64 
        11d4:	41 57                	push   %r15
        11d6:	4c 8d 3d 13 2c 00 00 	lea    0x2c13(%rip),%r15        # 3df0 <__frame_dummy_init_array_entry>
        11dd:	41 56                	push   %r14
        11df:	49 89 d6             	mov    %rdx,%r14
        11e2:	41 55                	push   %r13
        11e4:	49 89 f5             	mov    %rsi,%r13
        11e7:	41 54                	push   %r12
        11e9:	41 89 fc             	mov    %edi,%r12d
        11ec:	55                   	push   %rbp
        11ed:	48 8d 2d 04 2c 00 00 	lea    0x2c04(%rip),%rbp        # 3df8 <__do_global_dtors_aux_fini_array_entry>
        11f4:	53                   	push   %rbx
        11f5:	4c 29 fd             	sub    %r15,%rbp
        11f8:	48 83 ec 08          	sub    $0x8,%rsp
        11fc:	e8 ff fd ff ff       	callq  1000 <_init>
        1201:	48 c1 fd 03          	sar    $0x3,%rbp
        1205:	74 1f                	je     1226 <__libc_csu_init+0x56>
        1207:	31 db                	xor    %ebx,%ebx
        1209:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
        1210:	4c 89 f2             	mov    %r14,%rdx
        1213:	4c 89 ee             	mov    %r13,%rsi
        1216:	44 89 e7             	mov    %r12d,%edi
        1219:	41 ff 14 df          	callq  *(%r15,%rbx,8)
        121d:	48 83 c3 01          	add    $0x1,%rbx
        1221:	48 39 dd             	cmp    %rbx,%rbp
        1224:	75 ea                	jne    1210 <__libc_csu_init+0x40>
        1226:	48 83 c4 08          	add    $0x8,%rsp
        122a:	5b                   	pop    %rbx
        122b:	5d                   	pop    %rbp
        122c:	41 5c                	pop    %r12
        122e:	41 5d                	pop    %r13
        1230:	41 5e                	pop    %r14
        1232:	41 5f                	pop    %r15
        1234:	c3                   	retq   
        1235:	66 66 2e 0f 1f 84 00 	data16 nopw %cs:0x0(%rax,%rax,1)
        123c:	00 00 00 00 
    
    0000000000001240 <__libc_csu_fini>:
        1240:	f3 0f 1e fa          	endbr64 
        1244:	c3                   	retq   
    
    Déassemblage de la section .fini :
    
    0000000000001248 <_fini>:
        1248:	f3 0f 1e fa          	endbr64 
        124c:	48 83 ec 08          	sub    $0x8,%rsp
        1250:	48 83 c4 08          	add    $0x8,%rsp
        1254:	c3                   	retq   
    

    À noter que j'ai également compilé mon programme avec cette commande pour comparer :

    g++ file1.cpp file2.cpp impl.cpp -o prog2


    Cela produit exactement le même exécutable (d'après ce que j'observe avec le désassembleur en tout cas).

    J'ai également essayé de faire la même expérience avec Compiler Explorer (comme dans la vidéo) avec la même config mais la LTO ne s'applique pas non plus.

    Même constat avec CMake...

    J'ai du mal à comprendre ce qui ne fonctionne pas...

    Quelqu'un pourrait m'aider à trouver où est le problème svp ?

    Merci d'avance !


    -
    Edité par ThomasAirain 2 février 2024 à 11:50:06

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2024 à 15:28:36

      Tu utilise quelle version de gcc ?
      • Partager sur Facebook
      • Partager sur Twitter
        2 février 2024 à 15:34:10

        Question de néophyte: LTO sans optimiser, ça fait sens ? Que se passe-t-il en O3 avec et sans LTO?

        EDIT: Après tests, le -03 change tout. D'ailleurs, pour lever l’inobservable il faudrait que main renvoie le résultat de get_value. Sinon, le programme ne fait rien.

        -
        Edité par lmghs 2 février 2024 à 16:36:27

        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          3 février 2024 à 22:11:16

          Ah oui zut, il n'y a pas de return dans mon main. Je n'avais pas vu. >_<

          J'ai ajouté -O3 avec g++ et ça fonctionne !!! Même chose avec CMake !!

          Merci ! :D

          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2024 à 1:16:07

            ThomasAirain a écrit:

            J'ai ajouté -O3 avec g++ et ça fonctionne !!! Même chose avec CMake !!

            Bonjour,

            Sujet résolu

            Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

            • Partager sur Facebook
            • Partager sur Twitter

            Je n'arrive pas à appliquer la lto

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown