2016-04-19 9 views
7

Momentan verwende ich i8 *, um void-Zeiger in meinem generierten IR darzustellen, aber das macht es sehr schwierig, beispielsweise void * von char * zu unterscheiden. Gibt es gemeinsame Lösungsansätze? Ich habe ziemlich viel ohne Glück gesucht.Darstellen des void-Zeigertyps in llvm ir

Für jedes andere Paar von Typen kann ich direkt den llvm :: Type * verwenden, um die Typen zu unterscheiden, so dass es eine Menge Komplexität hinzufügt, wenn ich das nicht mehr nur für den Sonderfall von void pointers machen kann.

Eine Idee könnte darin bestehen, eine benannte Struktur mit i8 als void type zu verwenden (z. B.% void = type {i8}) und stattdessen Zeiger zu verwenden, aber clang generierte IR verwendet i8 *, wenn Sie a angeben Leerer Zeigertyp, also bin ich mir nicht sicher, was die Vorteile/Nachteile von jedem sind.

+1

Im Allgemeinen gehören Typen in das Frontend Ihres Compilers. Es ist nur ein Glück, dass das LLVM-Typ-System ähnlich wie Ihres ist, und es ist frei, unter Ihnen zu wechseln (ein Beispiel: [undurchsichtige Zeigertypen] (http://llvm.org/devmtg/2015-10/slides/Blaikie) (OpaquePointerTypes.pdf) kommen). Es sollte nicht notwendig sein, Typen auf LLVM-Ebene zu unterscheiden. –

+0

Wenn Sie von der Quelle starten und Debug-Informationen aktiviert haben, können Sie sie analysieren, um zu wissen, was ein Zeiger wirklich ist (uint *, void *, ...). Wenn Sie Ihr eigenes llvmIR schreiben (oder generieren), sehe ich nicht, warum Sie das brauchen würden ... –

+0

@IsmailBadawi das macht alles Sinn. Vielen Dank. Es scheint, als wäre es an der Zeit, ein vollständigeres Typsystem für meinen Compiler zu schreiben. Übrigens, wenn Sie diese Antwort machen würden, würde ich es akzeptieren. – Lane

Antwort

5

Im Allgemeinen gehören Typen in das Frontend Ihres Compilers. Es ist nur ein Glück, dass das LLVM-System ähnlich wie Ihres ist, und es ist kostenlos, unter Ihnen zu wechseln (ein Beispiel: opaque pointer types kommen). Es sollte nicht notwendig sein, Typen auf der LLVM-Ebene zu unterscheiden - der Versuch, eine 1: 1-Übereinstimmung zwischen Ihrem Typsystem und dem LLVM-Typsystem zu erzwingen, ist wahrscheinlich fehlgeleitet.