2014-10-09 10 views
6

Ho scritto un passaggio per rilevare e stampare l'etichetta dei blocchi di base in una funzione, poiché desidero utilizzare ulteriormente splitBasicBlock(). Ho scritto che in questo modo:llvm: Come ottenere l'etichetta dei blocchi di base

virtual bool runOnModule(Module &M) 
{ 
    for(Module::iterator F = M.begin(), E = M.end(); F!= E; ++F) 
    { 
     errs()<<"Function:"<<F->getName()<<"\n"; 
     //for(Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 
     for (iplist<BasicBlock>::iterator iter = F->getBasicBlockList().begin(); 
        iter != F->getBasicBlockList().end(); 
        iter++) 
     { 
      BasicBlock* currBB = iter; 
      errs() << "BasicBlock: " << currBB->getName() << "\n"; 
     } 
    } 
    return true; 
} 

IR del file è simile al seguente:

; <label>:63          ; preds = %43 
    %64 = load i32* %j, align 4 
    %65 = sext i32 %64 to i64 
    %66 = load i8** %tempdst, align 8 
    %67 = getelementptr inbounds i8* %66, i64 %65 
    store i8 -1, i8* %67, align 1 
    br label %73 

; <label>:68          ; preds = %43 
    %69 = load i32* %j, align 4 
    %70 = sext i32 %69 to i64 
    %71 = load i8** %tempdst, align 8 
    %72 = getelementptr inbounds i8* %71, i64 %70 
    store i8 0, i8* %72, align 1 
    br label %73 

; <label>:73          ; preds = %68, %63 
    br label %74 

Tuttavia, ho ottenuto nulla l'etichetta:

Function:main 
BasicBlock: 
BasicBlock: 
BasicBlock: 

Cosa c'è di sbagliato con questi "senza nome" di base bloccare? Cosa dovrei fare?

risposta

6

I valori in LLVM IR non sono richiesti per avere un nome; e in effetti, quei blocchi di base non hanno nomi, motivo per cui si ottiene una stringa vuota da currBB->getName().

Il motivo per cui hanno i nomi nella stampa IR LLVM è perché quando si stampa nel formato testuale di LLVM IR (come appare nei file .ll), è necessario assegnare loro un nome per renderli referable, quindi la stampante assegna i nomi numerici sequenziali ai blocchi di base (e ad altri valori). Questi nomi numerici vengono creati solo dalla stampante, tuttavia, e in realtà non esistono nel modulo.

+0

Um ... Come dividere una delle Thes blocchi di base? – winter333

+0

@ winter333 se hai un'altra domanda dovresti farla separatamente. – Oak

3

Mentre BasicBlocks possono essere senza nome (come indicato dalla hasName() metodo) si può stampare identificatore BasicBlock unico, usando currBB->printAsOperand(errs(), false) anziché in streaming in errs() il valore di currBB->getName(). Per BasicBlock senza nome questo fornirebbe la rappresentazione di base del blocco numerico, come ad esempio %68.

1

Penso che il comportamento di LLVM ora sia diverso. Io uso simili linee di codice e può ottenere il nome del marchio su LLVM-4,0

for (auto &funct : m) { 
      for (auto &basic_block : funct) { 
      StringRef bbName(basic_block.getName()); 
       errs() << "BasicBlock: " << bbName << "\n"; 
      } 
} 
Problemi correlati