Wie finde ich heraus, welche Funktionen NICHT inline waren?

8

Gibt es eine Möglichkeit, eine Liste von Funktionen zu erhalten, die nirgends inline waren? Entweder durch Übergeben einer Option an gcc oder durch Überprüfen der Binärdatei?

BEARBEITEN: Ich weiß, wie man ausdrücklich darum bittet, dass eine Funktion nicht inline ist, indem man das eingebaute Attribut noinline von gcc benutzt.

    
Giovanni Funchal 08.02.2012, 09:10
quelle

4 Antworten

3

Verwende gcc's -fdump-tree-all und suche die Dump-Dateien nach "inline".

    
ams 08.02.2012, 11:41
quelle
5

Fügen Sie den Compileroptionen -fdump-ipa-inline hinzu.

Übergeben Sie die Datei yoursourcefile.inline , die neben der Objektdatei für "Inline-Kandidat berücksichtigen" erstellt wurde, um alle Funktionen zu ermitteln, die der Compiler als inlining-Elemente betrachtete.

Überzeuge die Datei für "Inlined in", um alle Funktionen herauszufinden, die der Compiler schließlich inline erledigt hat.
Grep für "inline_failed:", wenn Sie sich für den Grund interessieren, warum der Compiler einen Kandidaten abgelehnt hat (z. B. "Aufruf ist unwahrscheinlich und Code-Größe würde wachsen").

    
Damon 09.02.2012 10:37
quelle
0

Sie können den Befehl nm unter Unix / Linux verwenden, um eine Liste zu erhalten von Symbolen in einer Binärdatei.
Wenn die Funktion nicht inline ist, ist ihr Symbolname in der Binärdatei vorhanden.

    
Alok Save 08.02.2012 09:12
quelle
0

'inline' ist kein Attribut einer Funktion, eine Funktion kann sowohl inline als auch nicht inline sein. Wenn Sie eine Funktion aufrufen, entscheidet der Compiler, ob er inline ist oder nicht. Wenn es mehrere Aufrufe gibt, kann der Compiler andere Optionen für verschiedene Aufrufe auswählen. Wenn mindestens ein nicht inlinierter Anruf vorhanden ist, wird die Funktion in der Symboltabelle angezeigt. und wenn es exportiert wird, wird es auch in der Symboltabelle erscheinen.

es gibt also keine Möglichkeit zu überprüfen, ob eine Funktion inline ist oder nicht, Sie können nur überprüfen, ob ein bestimmter Anruf inline ist oder nicht, indem Sie Reverse Engineering durchführen.

    
Zang MingJie 08.02.2012 09:26
quelle

Tags und Links