11
votes

LLVM - Problème de liaison

J'écris un générateur de code LLVM pour le bois de langue, le compilateur actuel émet un code C. Mon problème est que je dois appeler c fonctions des fichiers LLVM générés, par exemple, le compilateur dispose d'un collecteur de déchets en temps réel et je dois appeler des fonctions pour notifier lorsque de nouveaux objets sont alloués sur le tas. Je n'ai aucune idée de la manière de relier ces fonctions avec mes fichiers LLVM générés.

La génération de code est faite en générant des fichiers .LLL et ensuite les compiler manuellement.

J'essaie d'appeler une fonction externe de LLVM mais je n'ai pas de chance. Dans les exemples, j'ai trouvé uniquement des fonctions standard C telles que "Metts" et "Printf" sont appelées, mais je veux appeler une fonction maison. Je suis coincé.


1 commentaires

Voulez-vous dire que vous essayez d'écrire du code directement dans LLVM IR et que vous ne pouvez pas apporter un appel, ou que vous compilez le code en utilisant LLVM et avoir des problèmes?


3 Réponses :


12
votes

Je suppose que vous écrivez une transformation LLVM et vous souhaitez ajouter des appels aux fonctions externes en code transformé. Si ce n'est pas le cas, modifiez votre question et incluez plus d'informations.

Avant de pouvoir appeler une fonction externe du code LLVM, vous devez insérer une déclaration pour cela. Par exemple: P>

virtual bool runOnModule(Module &m) {
    Constant *log_func = m.getOrInsertFunction("log_func",
                                               Type::VoidTy,
                                               PointerType::getUnqual(Type::Int8Ty),
                                               Type::Int32Ty,
                                               Type::Int32Ty,
                                               NULL);
    ...
}


1 commentaires

C'est exactement ce que j'essayais d'essayer de trouver avec LLVM, merci!



5
votes

Compilez vos fichiers d'assemblage LLVM normalement avec LLVM-comme: xxx pré>

compilez les fichiers de code BitCode à .s Fichiers de langue de montage: P>

gcc *.s runtime.c -o executable


0 commentaires

3
votes

J'interprète votre question comme étant "Comment puis-je implémenter une bibliothèque d'exécution en C ou C ++ pour ma langue qui est compilée à LLVM?"

Une approche est, comme détaillé de Jonathan Tang, pour transformer la sortie de votre compilateur de LLVM IR en BitCode à l'assemblage et avoir Vanilla GCC lier l'assemblage sur la source d'exécution (ou les fichiers d'objet ).

Une autre approche supplémentaire, éventuellement plus flexible consiste à utiliser llvm-gcc pour compiler l'exécution elle-même en bitcode LLVM, puis utilisez llvm-ld pour lier le code de bit. votre compilateur avec le bitcode de votre runtime. Ce code BitCode peut ensuite être ré-optimisé avec opt , reconverti en IR avec llvm-dis , interprété directement avec lli (ce testaure , Seulement fonctionner si LLVM a été construit contre libffi ) ou compilé à l'assemblage avec llc (puis à un binaire natif avec vanille gcc ).


0 commentaires