2012-02-17 8 views
6

He estado usando LLVM y estaba confundido sobre cómo usar un pase diferente ya presente de mi propio pase? Precisamente, mi programa necesita el cálculo de Dominance Frontier para cualquier instrucción dada. LLVM ya tiene la clase de función Dominancia que se implementa como un pase de función. ¿Cómo puedo invocarlo/hacer uso de él en mi Pase de módulo?¿Cómo uso un pase de función existente de mi pase LLVM?

+0

¿Ha revisado los documentos? Porque la última vez que revisé, la respuesta estaba allí: http://llvm.org/docs/WritingAnLLVMPass.html – Fanael

+0

Agregue 'AU.addRequired ();' a su método pass 'getAnalysisUsage (AnalysisUsage & AU) '. – osgx

+0

La documentación es realmente oscura y tuve problemas reales para descifrarla. Un ejemplo hubiera ayudado. – Sharad

Respuesta

3

ADVERTENCIA: no tengo mucha experiencia y la respuesta puede ser incorrecta o desactualizada. (Que se basa en gran medida en fuentes llvm obsoletos: version 1.3.)

Añadir un include:

#include "llvm/Analysis/DominanceFrontier.h" 

Si su pase si función de paso, añadir a su clase el método (si no se aplica):

virtual void getAnalysisUsage(AnalysisUsage &AU) const { } 

Y poner esto en él:

AU.addRequired<DominanceFrontier>(); 

Entonces, en tu clase runOnFunction método:

DominanceFrontier *DF = &getAnalysis<DominanceFrontier>(); 

Después de ello se puede utilizar:

BasicBlock *BB = /* some BB */; 
    DominanceFrontier::iterator DFI = DF->find(BB); 
+0

Gracias. Voy a intentar esto. – Sharad

+0

Gracias. Funciona. Solo necesitaba cambiar el tipo de iterador. – Sharad