2015-03-21 14 views
5

Sto lavorando a un progetto su in linea asm di LLVM, ma ho incontrato un problema sugli operandi asm. Ad esempio, ho il codice come questo:Come ottenere llmm inline asm tipo operandi?

int a; 
int b; 
asm("nop": "=r"(a), "r"(b), "g"(30)); 

posso ottenere stringa asm "NOP" utilizzando LLVM :: :: InlineAssembly funzione getAsmString(), e ho inoltre possibile ottenere informazioni vincoli "rr IMR" utilizzando LLVM: : InlineAsm :: ParseConstraints funziona e itera il valore restituito. Ma la mia domanda è che non riesco a ottenere informazioni sugli operandi di asm, in particolare il tipo degli operandi di asm (un è un tipo intero, b è un tipo interger, 30 è costante int).

Quindi qualcuno sa che c'è un modo per ottenere informazioni sugli operandi di ASM?

risposta

0

In LLVM, InlineAsm è una sottoclasse di Value, e il valore associato è sempre di tipo puntatore a funzione. Il contenuto di quella funzione inventata è il codice asm stesso.

Quindi, per ottenere i tipi di operandi, lo si analizza proprio come con un puntatore alla funzione. Hai un comodo FunctionType *InlineAsm::getFunctionType() const che fa la metà del lavoro.

Il resto è abbastanza semplice: Type * FunctionType::getReturnType() per ottenere gli argomenti di output e FunctionType::params() o simile per ottenere gli argomenti di input.