2012-02-08 7 views

Odpowiedz

3

Użyj gcc's -fdump-tree-all i wyszukaj pliki zrzutu dla "inline".

0

Możesz użyć nm command w systemie Unix/Linux, aby uzyskać listę symboli w pliku binarnym.
Jeśli funkcja nie jest wstawiona, jej nazwa symbolu będzie występować w pliku binarnym.

+5

To nie jest poprawne. Funkcje niestatyczne będą emitowane niezależnie od tego, czy zostały wstawione czy nie. – Mat

+0

@Mat, no. Model inline dla C++ jest prawdopodobnie nieco bardziej skomplikowany, ale dla C (C99 i C11) symbol jest emitowany tylko w jednostce tłumaczeniowej, która żąda "instantiantion" symbolu, tj. Dla C, który ma wbudowaną * definicję * i zewnętrzną deklarację. –

+0

@Als, +1, ale możesz być nieco bardziej precyzyjny. Nazwa symbolu może występować jako niezdefiniowany symbol lub do zdefiniowania symbolu. To, czy definiuje symbol, zależy w dużej mierze od modeli tworzenia instancji, myślę, że mogą one być całkiem różne w różnych implementacjach C++ (moja wiedza na temat C++ tutaj jest nieco zardzewiała) oraz w C. –

0

"inline" NIE jest atrybutem funkcji, funkcja może mieć zarówno charakter inline, jak i non-inlined. gdy wywołujesz funkcję, kompilator decyduje, czy wbudowany, czy nie, jeśli jest wiele połączeń, kompilator może wybrać inną opcję dla innego połączenia. jeśli istnieje co najmniej jedno połączenie bez linii, funkcja pojawi się w tabeli symboli. a jeśli zostanie wyeksportowany, pojawi się również w tabeli symboli.

, więc nie ma możliwości sprawdzenia, czy funkcja jest wbudowana, czy nie, można sprawdzić tylko, czy określone połączenie zostało zainicjowane, czy nie przez inżyniera wstecznego.

+0

Rozumiem, że wbudowane jest "za połączenie", moim pytaniem jest, jak sprawdzić, czy WSZYSTKIE połączenia nie są włączone. –

+1

Po prostu nie odpowiadasz na pytanie. –

5

Dodaj -fdump-ipa-inline do swoich opcji kompilatora.

grep plik yoursourcefile.inline który powstaje obok pliku obiektowego dla „Biorąc pod uwagę inline kandydata”, aby dowiedzieć się wszystkie funkcje, które kompilator uważane inline.

Grep pliku dla "Inlined into", aby znaleźć wszystkie funkcje, które kompilator ostatecznie zrobił w linii.
Grep dla "inline_failed:", jeśli interesuje Cię powód, dla którego kompilator odrzucił kandydata (np. "Połączenie jest mało prawdopodobne, a rozmiar kodu wzrastał").

Powiązane problemy