2013-08-17 4 views
1

Je vais avoir le problème suivant quand je lance mon programme:Erreur: X86CodeEmitter LLVM

pseudo instructions should be removed before code emission 
UNREACHABLE executed at /home/leonor/llvm/llvm/lib/Target/X86/X86CodeEmitter.cpp:1164! 
Stack dump: 
0. Running pass 'X86 Machine Code Emitter' on function '@main' 
./build/Release+Asserts/bin/llvm-dis: Bitcode stream must be at least 16 bytes in length 

Mon programme prend en entrée un fichier .BC et charge le fichier et l'affiche. Mon doute est: Pourquoi cette erreur se produit uniquement lorsque le programme C contient des instructions conditionnelles (si, pour ..). Comment résoudre??

Mon code:

int main(int argc, char **argv) { 

    InitializeNativeTarget(); 
    LLVMContext &Context = getGlobalContext(); 
    std::string Err; 
    const std::string InputFile = "teste_f1.bc"; 
    OwningPtr<MemoryBuffer> result; 
    error_code ec = MemoryBuffer::getFile(InputFile, result); 
    MemoryBuffer *buffer = result.take(); 
    Module * Mod = ParseBitcodeFile(buffer, Context); 

    ExecutionEngine* EE = 0; 
    EngineBuilder builder(Mod); 
    builder.setErrorStr(&Err); 
    builder.setEngineKind(EngineKind::JIT); 
    EE = builder.create(); 

    Function * func = Mod->getFunction("main"); 
    std::vector <std::string> params; 
    params.push_back(Mod->getModuleIdentifier()); 

    EE->runStaticConstructorsDestructors(false); 
    int Result = EE->runFunctionAsMain(func, params, NULL); 
    EE->runStaticConstructorsDestructors(true); 

    WriteBitcodeToFile(Mod, outs()); 

    delete Mod; 
    return 0; 

} 
+0

« Mon programme prend en entrée un fichier .BC et charge le fichier et l'affiche » - bien, ce n'est pas ce que le code fait. Le code charge un fichier .bc, * exécute la fonction 'main' à l'intérieur *, puis restitue le contenu du fichier .bc (qui est binaire) à la sortie. Et le problème se produit pendant l'exécution (ou plus exactement, la compilation JIT). En passant, si vous suivez ceci avec 'llvm-dis', vous pouvez simplement appeler' print' ou 'dump' sur le module pour obtenir la représentation textuelle. – Oak

Répondre

0

Il est parce que le code contenant des instructions conditionnelles (si, par etc), se traduit par un IR qui contient phi nœuds. Vous pouvez supprimer les noeuds phi en utilisant reg2mem pass. La commande serait:

opt -reg2mem -o output.bc input.bc 
+0

La passe 'reg2mem' ** ajoute ** les nœuds phi, elle ne les supprime pas (en remplaçant les charges et les stocke avec phis). Aussi je ne vois pas pourquoi la présence de noeuds phi devrait faire que l'émetteur de code x86 ne fonctionne pas ... – Oak

+0

@Oak 'reg2mem' ne ** pas ** ajouter des noeuds phi, jetez un oeil sur les liens suivants de la mailing llvm listes. Si vous n'êtes toujours pas convaincu, essayez-le sur un morceau de code. Comment pensez-vous qu'une machine va exécuter le noeud phi dans l'assemblage? Pourquoi l'émetteur de code émettra-t-il des nœuds phi si la machine ne peut pas exécuter les nœuds phi? Liens: http://llvm.1065342.n5.nabble.com/PHI-nodes-td2116.html et https://groups.google.com/forum/#!topic/llvm-dev/UMaYSqdT014 – shrm

+0

mon erreur; J'ai lu 'reg2mem' comme' mem2reg' :) Mais je ne comprends toujours pas la partie sur les nœuds phi et le code d'émission. LLVM IR n'est en effet pas un assemblage x86, d'où l'abaissement et la sélection des instructions, qui devraient prendre en charge les nœuds phi. – Oak