1 Востаннє редагувалося Kane (16.09.2015 09:54:15)

Тема: Генерація коду із Clang, питання

Доброго дня, панове.
Компілюю за допомогою clang наступний код:

#include <windows.h>

class Test {
public:
    void f(const char*, const char*);
};

void Test::f(const char *a, const char *b) {
    MessageBoxA(0, a, b, 0);
}

int main() {
    Test t;
    t.f("text", "caption");

    ExitProcess(0);
}

воно мені згенерувало наступне:

.text:00401000                 push    0
.text:00401002                 push    dword ptr [esp+0Ch]
.text:00401006                 push    dword ptr [esp+0Ch]
.text:0040100A                 push    0
.text:0040100C                 call    MessageBoxA
.text:00401012                 retn    8
.text:00401015
.text:00401015 ; =============== S U B R O U T I N E =======================================
.text:00401015
.text:00401015                 public start
.text:00401015 start           proc near
.text:00401015                 push    0               ; uType
.text:00401017                 push    offset Caption  ; "caption"
.text:0040101C                 push    offset Text     ; "text"
.text:00401021                 push    0               ; hWnd
.text:00401023                 call    MessageBoxA
.text:00401029                 push    0               ; uExitCode
.text:0040102B                 call    ExitProcess
.text:0040102B start           endp

Що це за шматок починаючи із 00401000 і до 00401012 ? Це наслідок, що він в активній розробці (фронтенд частина), і поки не займається подібними дрібницями (оптимізація)?

2

Re: Генерація коду із Clang, питання

зараз запитаю на конференції clang
а якої версії clang ?

Подякували: Kane1

3

Re: Генерація коду із Clang, питання

reverse2500 написав:

а якої версії clang ?

clang version 3.7.0 (tags/RELEASE_370/final)
Target: i686-pc-windows-msvc
Thread model: posix

4

Re: Генерація коду із Clang, питання

aKor: that's the body of your "Test::f"

от вся відповідь

Подякували: Kane1

5 Востаннє редагувалося Kane (16.09.2015 10:19:40)

Re: Генерація коду із Clang, питання

А чого воно тоді не використовується? Oo Студія, наприклад, це оптимізувала.

call 00401000

6

Re: Генерація коду із Clang, питання

Як завжди: усе просто!!!

/Ob0                   Disable inlining

.text:00401000 sub_401000      proc near               ; CODE XREF: start+Ap
.text:00401000
.text:00401000 lpText          = dword ptr  4
.text:00401000 lpCaption       = dword ptr  8
.text:00401000
.text:00401000                 push    0               ; uType
.text:00401002                 push    [esp+4+lpCaption] ; lpCaption
.text:00401006                 push    [esp+8+lpText]  ; lpText
.text:0040100A                 push    0               ; hWnd
.text:0040100C                 call    MessageBoxA
.text:00401012                 retn    8
.text:00401012 sub_401000      endp
.text:00401012
.text:00401015
.text:00401015 ; =============== S U B R O U T I N E =======================================
.text:00401015
.text:00401015 ; Attributes: noreturn
.text:00401015
.text:00401015                 public start
.text:00401015 start           proc near
.text:00401015                 push    offset Caption  ; "caption"
.text:0040101A                 push    offset Text     ; "text"
.text:0040101F                 call    sub_401000
.text:00401024                 push    0               ; uExitCode
.text:00401026                 call    ExitProcess
.text:00401026 start           endp
Подякували: 0xDADA11C71

7

Re: Генерація коду із Clang, питання

Я не розумію, чому там два рази dword ptr [esp+0Ch] було.
У інлайнових функций тіло теж має бути - на випадок, якщо на них посилаються за адресою. І, до речі, оптимізований код - якраз без зайвого виклику.

Подякували: Kane1

8

Re: Генерація коду із Clang, питання

koala написав:

Я не розумію, чому там два рази dword ptr [esp+0Ch] було.

push Caption
push Text

а потім просто розраховує місцезнаходження на тому ж стеку на фоні зміщення (виникає після чергового push), тобто:

0x0012FF7C + 0xC = Caption
0x0012FF78 + 0xC = Text

0012FF74  /00402008   @.  ; ASCII "text"
0012FF78  |00402000  . @.  ; ASCII "caption"    ; другий push    dword ptr [esp+0Ch]
0012FF7C  |00000000  ....                       ; перший push    dword ptr [esp+0Ch]
0012FF80  \00401024  $@.  ; /RETURN from main.00401000 to main.main_EP+0F
0012FF84  /00402008   @.  ; |Arg1 = ASCII "text"
0012FF88  |00402000  . @.  ; \Arg2 = ASCII "caption"

Регулюється усе ключами. Це, будувалось із /Os.

koala написав:

І, до речі, оптимізований код - якраз без зайвого виклику.

Була бажана оптимізація за розміром коду.

Подякували: 0xDADA11C7, koala, reverse25003

9

Re: Генерація коду із Clang, питання

reverse2500, а що за конференція?
Я якраз почав освоювати цей доволі перспективний інструмент.

10

Re: Генерація коду із Clang, питання

Kane написав:
koala написав:

Я не розумію, чому там два рази dword ptr [esp+0Ch] було.

push Caption
push Text

а потім просто розраховує місцезнаходження на тому ж стеку на фоні зміщення (виникає після чергового push),

От я гальмо...

11

Re: Генерація коду із Clang, питання

а що за конференція?

ну не канал про, аніме, до речі "Хто не патчить той москаль"  :D
IRC: irc.oftc.net
канал: #llvm
http://clang.llvm.org
детально тут, в роздвлв комунікації

Подякували: Kane, 0xDADA11C72