LLVM / Clang Spezialfall für Allokatoren

8

Wenn Sie den folgenden Code in "alloc.c" haben:

%Vor%

(Ich weiß, dass das nicht die bevorzugte Methode ist, um calloc / free zu deklarieren, aber es ist zur Vereinfachung der Ausgabe unten.)

Wenn Sie dann " clang -O3 -S -emit-llvm alloc.c " mit Clang / LLVM 3.3 ausführen, erhalten Sie:

%Vor%

Sie können sehen, dass der Aufruf von calloc insgesamt deaktiviert wurde. Genial. Im Allgemeinen kann ein Compiler jedoch Aufrufe von Funktionen, für die er keine Quelle hat, nicht eliminieren (es kann Nebeneffekte geben). Es scheint also, dass Clang einen speziellen Fallcode für calloc / free hat. Dies wird durch die Tatsache unterstützt, dass, wenn Sie alle Vorkommnisse auf "Calloc" im Code zu "_calloc" schicken, die "Zuweisung" zurückkommt.

Also meine Frage ist, gibt es irgendeine Möglichkeit, Clang / LLVM zu sagen, dass eine bestimmte Funktion eine "Allokation nur" -Funktion ist? Vielleicht könnte ich eine Anmerkung auf die Definition einer meiner eigenen Funktionen setzen, die es LLVM ermöglichen würde, Zuteilungen genauso zu entfernen wie für calloc / malloc.

    
laslowh 13.10.2013, 23:16
quelle

2 Antworten

5
  

Gibt es irgendeine Möglichkeit, Clang / LLVM mitzuteilen, dass eine bestimmte Funktion eine "Nur-Zuordnungs-Funktion" ist?

Nein. Wie Sie richtig gesagt haben, ist es im allgemeinen Fall nur möglich, einen Aufruf zu löschen, wenn der Compiler Zugriff auf seine Implementierung hat * . Die Unterstützung für calloc ist in LLVM fest codiert (siehe LLVM-Klassen "MemoryBuiltins" und "TargetLibraryInfo"). So wurde der Aufruf in Ihrem Beispiel eliminiert.

Es gibt keine Attribute, die dem Compiler signalisieren, dass eine bestimmte Funktion nur versucht, Speicher zuzuordnen.

*: Nun, es ist möglich, dass die Funktion so markiert ist, dass sie absolut keine möglichen Nebenwirkungen hat, aber es gibt derzeit keine Möglichkeit, in LLVM so etwas zu markieren, siehe diese verwandte Diskussion ; und in jedem Fall kann eine Funktion, die Speicher zuweist, durchaus Nebenwirkungen haben.

    
Oak 14.10.2013, 06:27
quelle
-1

Es ist ziemlich offensichtlich in der Header-Datei - es ist das " Attribut ((malloc)) " in der Deklaration von Calloc. Das ganze sagt: "Diese Funktion gibt niemals Ausnahmen aus und gibt einen Zeiger zurück, der mit einem neuen malloc-Aufruf belegt wurde". Dies ermöglicht mehrere Optimierungen:

  1. Der zurückgegebene Zeiger ist garantiert kein Alias ​​eines anderen Zeigers. Wenn Sie zwei Zeiger int * p und int * q haben, dann * p = 1; könnte ändern * q. Wenn p oder q gerade neu mit einer malloc-Funktion zugewiesen wurde, kann das nicht passieren.

  2. Wenn der Compiler den passenden free () -Aufruf findet, kann der Compiler manchmal die Daten auf dem Stack zuweisen und sowohl die malloc- als auch die free-Aufrufe eliminieren.

gnasher729 23.02.2014 21:07
quelle