• naur@tech.pr0n.pl
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    15 days ago

    Zastanawiam się, czemu koleś ustawia w każdej funkcji ramkę stosu, nawet jeśli nie wykonuje na nim żadnych operacji.

        • サぺル@tech.pr0n.plOPM
          link
          fedilink
          Polski
          arrow-up
          1
          ·
          13 days ago

          Moje śledztwo doprowadziło to tego, że to przygotowuje funkcję na odebranie variadic args. Tak wyglądało mi to od początku, kiedy czytałem AAPCS64. Robi to dlatego, że wszystkie te funkcje mają działać jak metody objc. A wywołuje się je za pomocą funkcji objc_msgSend - https://developer.apple.com/documentation/objectivec/objc_msgsend

          Jej pierwszy argument to wskaźnik self, potem jakaś sygnatura metody, a potem argumenty metody jako variadic. Więc pewnie tak jest to przekazywane przez stos.

          そうですか

          • naur@tech.pr0n.pl
            link
            fedilink
            Polski
            arrow-up
            1
            ·
            13 days ago

            Ale nawet w tym hello world widać przekazywanie przez rejestry w wywołaniach objc_msgSend.

            Według AAPCS64:

            [Platform] may elect not to maintain a frame chain and to use the frame pointer register as a general-purpose callee-saved register

            Odnośnie funkcji “variadic”:

            The address of the first stacked argument is defined to be the initial value of SP.

            Nie widzę nigdzie informacji, żeby FR był wymagany w tym przypadku. W X86 na pewno nie trzeba ustawiać EBP dla takich wywołań.
            Sprawdziłem też pod Godboltem z opcją “-fomit-frame-pointer” i prolog/epilog funkcji jest bardzo krótki.

            • サぺル@tech.pr0n.plOPM
              link
              fedilink
              Polski
              arrow-up
              1
              ·
              13 days ago

              Zauważyłem, że kompilator tak robi tylko w -O0. Starałem się na siłę to zrozumieć i rzuciłem jakimiś tezami. Ale może tak napisał, bo gdzieś tak zobaczył/przeczytał. Może tak pisał, żeby nie zapomnieć. Miałem, jeszcze pomysł, że coś to sprawdza. Nikt go nie zapytał. Zostaje jeszcze sprawdzić deasm jakiegoś prawdziwego kodu na tę platformę.