• naur
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    1 month ago

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

    • サぺルOPM
      link
      fedilink
      Polski
      arrow-up
      1
      ·
      1 month ago

      Bo funkcja nie wróci prawidłowo do nadrzędnej?

        • サぺルOPM
          link
          fedilink
          Polski
          arrow-up
          1
          ·
          1 month 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
            link
            fedilink
            Polski
            arrow-up
            1
            ·
            1 month 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.

            • サぺルOPM
              link
              fedilink
              Polski
              arrow-up
              1
              ·
              1 month 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ę.