2016-04-19 30 views
7

Attualmente utilizzo i8 * per rappresentare i puntatori del vuoto nel mio IR generato, ma questo rende piuttosto difficile distinguere void * da char *, ad esempio. Esistono approcci comuni per risolvere questo problema? Ho cercato in giro un po 'senza fortuna.Rappresentare il tipo di puntatore vuoto in llvm ir

Per ogni altro paio di tipi sono in grado di utilizzare direttamente llvm :: Tipo * per differenziare i tipi, quindi aggiunge molta complessità se non riesco più a farlo solo per il caso speciale dei puntatori void.

Un'idea potrebbe essere quella di utilizzare una struct denominata contenente i8 come tipo void (ad esempio,% void = type {i8}) e prendere invece i puntatori, ma IR generato da clang utilizza i8 * quando gli si assegna un tipo di puntatore vuoto, quindi non sono sicuro di quali siano i vantaggi/gli svantaggi di ciascuno.

+1

In genere i tipi appartengono al frontend del compilatore. È solo una fortuna che il sistema di tipo LLVM sia simile al tuo, ed è libero di cambiare da sotto di te (un esempio: [tipi di puntatori opachi] (http://llvm.org/devmtg/2015-10/slides/Blaikie -OpaquePointerTypes.pdf) stanno arrivando). Non dovrebbe esserci la necessità di distinguere i tipi a livello di LLVM. –

+0

se si avvia dall'origine e si abilitano le informazioni di debug, è possibile analizzarle per sapere cosa sia realmente un puntatore (uint *, void *, ...). Se scrivi (o generi) il tuo llvmIR, non vedo perché ne hai bisogno ... –

+0

@IsmailBadawi che tutto ha un senso. Grazie. Sembra che sia ora di scrivere un sistema di tipi più completo per il mio compilatore. A proposito, se hai fatto una risposta lo accetterei. – Lane

risposta

5

In genere i tipi appartengono al frontend del compilatore. È solo una fortuna che il sistema di tipo LLVM sia simile al tuo ed è libero di cambiare da sotto di te (un esempio: opaque pointer types sta arrivando). Non dovrebbe esserci la necessità di distinguere i tipi a livello di LLVM: provare a forzare una corrispondenza 1: 1 tra il proprio sistema di tipi e il sistema di tipo LLVM è probabilmente fuorviante.