2015-05-28 5 views
7

Il progetto LLVM non distingue tra numeri interi con e senza segno, come descritto here. Esistono situazioni in cui è necessario sapere se una particolare variabile deve essere interpretata come firmata o come non firmata, ad esempio quando è estesa di dimensioni o quando viene utilizzata in una divisione. La mia soluzione a questo è di mantenere un tipo di informazione separata per ogni variabile che descrive se si tratta di un intero o di un tipo cardinale.Come distinguere firmato e intero senza segno LLVM

Tuttavia, mi chiedo, non c'è un modo per "attributo" un tipo in LLVM quel modo? Stavo cercando una sorta di "dati utente" che potrebbero essere aggiunti a un tipo ma sembra non esserci nulla. Ciò dovrebbe accadere in qualche modo quando il tipo viene creato poiché i tipi uguali vengono generati una sola volta in LLVM.

La mia domanda quindi è:

C'è un modo per monitorare se una variabile intera deve essere interpretata come con o senza segno all'interno dell'infrastruttura LLVM, o è l'unico modo infatti per mantenere informazioni separate come faccio io?

Grazie

+4

Se state scrivendo un compilatore, si tratta in genere informazioni che desideri mantenere se stessi nel frontend, indipendentemente dalla LLVM. –

risposta

4

Prima di tutto, si deve essere sicuri che è necessario l'inserimento di tipo più meta-dati dal Clang già maniglie firmato operazioni di interi in modo appropriato per esempio utilizzando sdiv e srem piuttosto che udev e urem.

Inoltre, è possibile utilizzare che per realizzare un certo tipo, l'inferenza leggero in base a come le variabili sono accessibili in IR. Si noti che un'operazione come add non ha bisogno di informazioni di signdness poiché si basa sulla rappresentazione a due complementi.

caso contrario, penso che il modo migliore per farlo è quello di modificare il front-end (Clang) per aggiungere qualche nano personalizzato informazioni di debug. Ecco un link che potrebbe iniziare.

UPDATE: Se il vostro obiettivo è quello di implementare statico-analisi direttamente sul LLVM IR. Questo documento può offrire una discussione approfondita.

Navas, J.A., Schachte, P., Søndergaard, H., Stuckey, P.J .: signedness-agnostico analisi programma: numeri interi dei limiti precisi per codice di basso livello. In: Jhala, R., Igarashi, A. (a cura di) APLAS 2012. LNCS, vol. 7705, pp. 115-130. Springer, Heidelberg (2012)

+1

Grazie, sto scrivendo il mio frontent, però, non per C sia così non sto usando Clang, ma controllerà l'idea circa i metadati, non ho prestato molta attenzione ad esso fino ad ora, ma sarà leggere su di esso per verificare se posso usarlo in questo modo –