Hinzufügen eines Passes zu gcc?

8

Hat jemand gcc einen Pass hinzugefügt? oder nicht wirklich ein Pass, aber eine Option hinzufügen, um einige böse Dinge zu tun ... :-) ...

Ich habe immer noch das selbe Problem beim Aufruf einer Funktion, kurz bevor ich von einem anderen zurückkomme ... also würde ich es gerne untersuchen, indem ich etwas in gcc implementiere ...

Prost.

BEARBEITEN : Das Hinzufügen eines Durchlaufs zu einem Compiler bedeutet, dass der Baum erneut besucht wird, um einige Optimierungen oder eine Analyse durchzuführen. Ich möchte das Verhalten von __cyg_profile_func_exit emulieren, aber nur für einige Funktionen und kann auf den ursprünglichen Rückgabewert zugreifen.

Also werde ich versuchen, meine Frage zu verbessern. Ich möchte wirklich grundlegendes AOSD-ähnliches Verhalten nachahmen. AOSD- oder Aspect-orientierte Programmierung ermöglicht das Hinzufügen von übergreifenden Bedenken (Debugging ist ein Querschnittsthema).

%Vor%

Ich würde gerne sagen können, ich möchte die dbg-Funktion auslösen, nachdem die Funktion foo ausgeführt wurde. Das Problem besteht darin, dem Compiler mitzuteilen, den Steuerungsfluss zu ändern und dbg auszuführen. dbg sollte zwischen return und foo (argc) ...

ausgeführt werden

Das ist wirklich wie __cyg_profile_function_exit, aber nur in einigen Fällen (und das Problem in __cyg_profile_function_exit ist, dass Sie den zurückgegebenen Wert nicht einfach sehen und ändern können).

    
LB40 08.04.2009, 20:17
quelle

6 Antworten

4

Wenn du immer noch daran interessiert bist, einen GCC-Pass hinzuzufügen, kannst du das GCC-Wiki-Material dazu lesen:

Laurynas Biveinis 23.04.2009, 19:54
quelle
3

Nur zur zukünftigen Bezugnahme: Die nächsten Versionen von gcc (4.4.0+) bieten Unterstützung für Plugins , die speziell dafür gedacht sind Anwendungsfälle wie das Hinzufügen von Optimierungsdurchläufen für den Compiler, ohne dass der gesamte Compiler gestartet werden muss.

  

6. Mai 2009: GCC kann jetzt mit einem generischen Plugin-Framework auf Host-Plattformen erweitert werden, die dynamisch ladbare Objekte unterstützen.   (Siehe gcc.gnu.org )

    
none 19.05.2009 11:58
quelle
1

Um Ihre Frage zu beantworten: gcc ist eine ziemlich populäre Compiler-Plattform, um Compiler-Forschung zu betreiben, also ja, ich bin mir sicher, dass es jemand getan hat.

Allerdings glaube ich nicht, dass das an einem Wochenende gemacht wurde. Das Einbinden in die Codegenerierung von gcc ist nicht etwas, was Sie am Wochenende tun würden. (Ich bin mir nicht sicher, was Ihr Umfang ist und wie viel Zeit Sie investieren wollen.) Wenn Sie wirklich gcc hacken wollen, um das zu tun, was Sie wollen, wollen Sie sicherlich damit beginnen, es auf einem der gcc zu diskutieren Mailinglisten .

Tipps: Gehen Sie nicht davon aus, dass die Leute Ihre anderen Fragen gelesen haben. Wenn Sie auf eine Frage verweisen möchten, fügen Sie bitte einen Link hinzu, wenn Sie möchten, dass andere Personen sie finden.

    
JesperE 08.04.2009 20:33
quelle
1

Müssen Sie GCC verwenden? LLVM sieht so aus, als würde es funktionieren. Es ist in C ++ geschrieben, und es ist sehr einfach, einen Pass zu schreiben .

    
Zifre 09.04.2009 14:10
quelle
1

Es ist eine interessante Frage. Ich werde die Konzepte um die Frage herum ansprechen, anstatt die Frage direkt zu beantworten, denn, ich weiß nicht viel über die gcc-Interna.

Sie haben wahrscheinlich bereits eine Manipulation des Quellcodes auf höherer Ebene erforscht, um das zu erreichen, was Sie erreichen möchten. eine Art von

%Vor%

eingefügt mit einem Makro auf der Funktion "foo", vielleicht. Wenn Sie jedoch nach einem Compiler-Hack suchen, möchten Sie wahrscheinlich die Quelle nicht ändern.

Es gibt einige gcc-Erweiterungen, die hier besprochen werden das klingt ein bisschen wie du gehst. Wenn gcc alles hat, was Sie wollen, wird es wahrscheinlich in der C-Sprache dokumentiert. Erweiterungen Bereich der Dokumentation. Ich konnte nichts finden, was genauso klang wie das, was du beschrieben hast, aber vielleicht verstehst du am besten, wie du es findest, da du vielleicht am besten verstehst, was du suchst.

Ein gdb-Skript würde ziemlich gut Debug-Ausgaben ausgeben, aber es hört sich so an, als hättest du größere Pläne als einfach printfs zu machen. Es scheint, dass Sie die Logik in den Code einfügen.

Was mich an einige dynamische Linker-Tricks erinnert, auf die ich in letzter Zeit gestoßen bin. Bibliothek Einfügen könnte Code um Funktionsaufrufe einfügen, ohne die ursprüngliche Quelle zu beeinträchtigen. Das Beispiel, das ich gefunden habe, war auf Solaris, aber es gibt wahrscheinlich ein Analogon auf anderen Plattformen.

Ich bin gerade auf die Option -table-functions gestoßen. hier

-Filter-Funktionen

Generieren Sie Instrumentierungsaufrufe zum Eingeben und Beenden von Funktionen. Gleich nach der Funktion   Eingabe und kurz vor dem Beenden der Funktion werden die folgenden Profilfunktionen aufgerufen   mit der Adresse der aktuellen Funktion und ihrer Aufrufstelle. (Auf manchen Plattformen   __builtin_return_address funktioniert nicht über die aktuelle Funktion hinaus, also die Call-Site   Informationen stehen den Profiling-Funktionen möglicherweise nicht zur Verfügung.)

%Vor%

Aber ich denke, das funktioniert nicht, weil Sie den Rückgabewert der Profiling-Funktionen nicht ändern können.

    
veefu 09.04.2009 13:59
quelle
0

Die GCC, die GNU Compiler Collection, ist eine große Suite, und ich glaube nicht, dass das Hacken des Quellcodes Ihre Antwort ist, um Probleme in einer einzigen Anwendung zu finden.

Es sieht so aus, als ob Sie mehr nach Debugging- oder Profiling-Tools wie gdb und seinen verschiedenen Funktionen suchen Front-Ends (xgdb, ddd) und und gprof . Speicher / Begrenzt die Überprüfung von Tools wie Elektrozaun, memcheck von glibc, valgrind und mudflap könnte helfen, wenn es sich um ein Speicher- oder Zeigerproblem handelt. Das Aktivieren von Compiler-Flags für Warnungen und neuere C-Standards könnte nützlich sein -std=c99 -Wall -pedantic .

Ich kann nicht verstehen, was Sie mit

meinen
  

Ich habe immer noch das gleiche Problem   eine Funktion kurz zuvor aufrufen   von einem anderen zurückkehren.

Ich bin mir also nicht sicher, wonach Sie suchen. Können Sie ein Trivial- oder Pseudocode-Beispiel angeben?

i.e.

%Vor%     
mctylr 08.04.2009 22:55
quelle

Tags und Links