2010-12-04 6 views
5

Gibt es ein Werkzeug, wo ich in meinem c-Code verschüttet habe?Tools zum Anzeigen von Verschüttungen in einem c-Code

Ich meine sehen, welche Code-Block möglicherweise ein Register in den Speicher verschieben.

EDIT: was für ein Spill ist:

Im Prozess der Erstellung Ihres Codes an einem gewissen Punkt werden Sie Zuteilung registrieren zu tun haben. Der Compiler wird ein Interferenzdiagramm erstellen ("Variablen" sind Knoten und sie sind verbunden, wenn sie gleichzeitig aktiv sind). Von diesem Punkt an gibt es einen linearen Prozess, der die Graph-Färbung ausführt: Für jede Variable wird ein Register zugewiesen, das nicht mit anderen Variablen interferiert ... Wenn Sie nicht genug Register haben, um den Graphen zu färben, schlägt der Algorithmus und eine Variable (Register) wird verschüttet (in den Speicher verschoben).

Vom Standpunkt der Softwareentwicklung aus gesehen bedeutet dies, dass Sie eine Variable live immer minimieren sollten, damit Sie die Gefahr eines Überlaufs minimieren können.

Wenn Sie Code optimieren möchten, sollten Sie nach solchen Dingen suchen, da ein Überlauf eine zusätzliche Zeit zum Lesen/Schreiben von Speicher bietet. Ich war auf der Suche nach einem Tool oder einem Compiler-Flag, das mir sagen kann, wo es sich befindet, damit ich es optimieren kann.

+4

was ist ein verschütten? –

+1

Werfen Sie einen Blick auf meine Bearbeitung :-) –

+0

danke für die Erklärung! –

Antwort

4

Mir ist kein solches Werkzeug bekannt.

Da Entscheidungen über Überläufe von Compiler zu Compiler und Version des Compilers und sogar von Einstellungen innerhalb einer gegebenen Version eines gegebenen Compilers variieren, müsste jedes Tool eng an einen Compiler gekoppelt sein und würde wahrscheinlich nur einen unterstützen .

Auf der anderen Seite können Sie die generierte Assembly immer selbst betrachten und sehen, ob eine Variable verschüttet wird oder nicht.

+0

Nun, ein Tool, das mit dem Compiler und seiner Assembly-Ausgabe arbeiten könnte, um einen guten Teil des Prozesses zu automatisieren, wäre sicher sehr nett. –

+0

@R. Ja, du hast verstanden. Ich könnte den Assembler-Code sehen, aber ich muss analysieren, um die Variable/den Block des Codes zu finden, der den Überlauf verursacht hat. Ich denke, Verschüttung wird durch zwei Dinge verursacht, Leben von Variablen und die Menge des Registers. Sie könnten eine lange Funktion mit Variablen mit langer Lebensdauer haben, die Sie umgestalten könnten, um weniger zu verschütten. –

+0

@Guillaume Massé: Sie können immer Ihre Funktionen umgestalten, um die Gefahr von Überläufen zu reduzieren ... aber der Optimierer des Compilers wird wahrscheinlich sowieso einen guten Job machen (und falls nicht, einen besseren Compiler bekommen). –

0

Im Allgemeinen entweder zerlegen oder kompilieren zu Assembler anstelle eines Objekts.

Für bestimmte Compiler wie gcc und llvm (wo Sie die Quelle haben und den Compiler leicht neu erstellen können), ändern Sie den Compiler, um eine Art Ausgabe auszugeben, um anzugeben, wie oft es verschütten musste, wie Sie es nennen zur Erinnerung. Wenn Sie die Registerzuordnungsroutine finden, stellen Sie möglicherweise fest, dass der Compiler bereits über eine solche Ausgabe verfügt. Persönlich zerlege ich einfach oder kompiliere zu Assembler.

Ein generisches Assembler-Analyse-Tool ist möglich, aber ist es die Mühe wert? Sie möchten wissen, wo Funktion/Optimierung Grenzen sind. Sie möchten flüchtige Variablen oder Hardware-Register unterscheiden, bei denen das Schreiben in den RAM beabsichtigt war. Sie können nur nach Stack-basierten Schreibvorgängen suchen. Oder suchen Sie nach Fällen, in denen ein Schreibvorgang auf den Stapel erfolgt, bei dem es sich nicht um einen Push handelt, bei dem das Register bei der nächsten Anweisung zerstört wird. Tatsächlich wäre es ziemlich einfach, nach Schreibvorgängen zu einer relativen Adresse eines Stapelzeigers zu suchen, wobei der nächste Befehl das Register zerstört, wobei diese stapelbasierte relative Adresse in einem relativ nahen Ausführungspfad zurückgelesen wird, in dem der Stapelrahmen nicht bereinigt wurde dieser Ausführungspfad. Kenne ich ein solches Werkzeug? Nee.

Verwandte Themen