Re: Читабельный ассемблерный листинг от GCC
От: kov_serg Россия  
Дата: 15.09.21 08:31
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Можно ли от GCC получить ассемблерный листинг, который можно читать без слез? Например, определил шаблонную функцию, инстанциировал ее с разными типами. Смотрю в листинг — там даже с -fverbose-asm для каждого набора типов отображается один и тот же шаблонный заголовок функции, плюс ее покалеченное (mangled) имя, в которое совершенно не хочется вникать. Варианты функции опознаю только по типам в комментариях к ассемблерным операциям, что ни разу не удобно.


  А можно пример что именно не удобно
test.cpp
template<class T> T add(T a,T b) { return a+b; }

template int add(int,int);
template char add(char,char);
template double add(double,double);

build.sh
#!/bin/sh

g++ -O2 -S -masm=intel test.cpp && \
cat test.s | c++filt > test.asm && \
cat test.asm | grep @function

output
    .type    int add<int>(int, int), @function
    .type    char add<char>(char, char), @function
    .type    double add<double>(double, double), @function

test.asm
    .file    "test.cpp"
    .intel_syntax noprefix
    .text
    .section    .text._Z3addIiET_S0_S0_,"axG",@progbits,int add<int>(int, int),comdat
    .p2align 4
    .weak    int add<int>(int, int)
    .type    int add<int>(int, int), @function
int add<int>(int, int):
.LFB1:
    .cfi_startproc
    endbr64
    lea    eax, [rdi+rsi]
    ret
    .cfi_endproc
.LFE1:
    .size    int add<int>(int, int), .-int add<int>(int, int)
    .section    .text._Z3addIcET_S0_S0_,"axG",@progbits,char add<char>(char, char),comdat
    .p2align 4
    .weak    char add<char>(char, char)
    .type    char add<char>(char, char), @function
char add<char>(char, char):
.LFB2:
    .cfi_startproc
    endbr64
    lea    eax, [rsi+rdi]
    ret
    .cfi_endproc
.LFE2:
    .size    char add<char>(char, char), .-char add<char>(char, char)
    .section    .text._Z3addIdET_S0_S0_,"axG",@progbits,double add<double>(double, double),comdat
    .p2align 4
    .weak    double add<double>(double, double)
    .type    double add<double>(double, double), @function
double add<double>(double, double):
.LFB3:
    .cfi_startproc
    endbr64
    addsd    xmm0, xmm1
    ret
    .cfi_endproc
.LFE3:
    .size    double add<double>(double, double), .-double add<double>(double, double)
    .ident    "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
    .section    .note.GNU-stack,"",@progbits
    .section    .note.gnu.property,"a"
    .align 8
    .long     1f - 0f
    .long     4f - 1f
    .long     5
0:
    .string     "GNU"
1:
    .align 8
    .long     0xc0000002
    .long     3f - 2f
2:
    .long     0x3
3:
    .align 8
4:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.