Obtenez une déclaration de fonction à partir d'un autre module LLVM ::
Question
Dans mon application, j'ai 2 modules LLVM - celui d'exécution (qui contient void foo(int * a)
Définition de fonction) et exécutable (que je crée en utilisant l'API LLVM C ++).
Dans mon module exécutable, je crée int main(int argc, char ** argv)
et je veux mettre llvm::CallInst
dans son corps, qui appellerait foo()
Fonction du module d'exécution.
Voici mon code:
Function * fooF = Function::Create(runtimeModule->getFunction("foo")->getFunctionType(),
GlobalValue::WeakAnyLinkage, "foo", execModule);
Après cela, je lie deux modules ensemble:
Linker linker("blabla", execModule, false);
linker.LinkInFile("/path/to/runtime.bc", false);
execModule = linker.releaseModule();
Cela compile OK, cependant lorsque j'exécute Verifier Pass sur le module lié que j'obtiens:
Global is external, but doesn't have external or dllimport or weak linkage!
void (%i32*)* @foo
invalid linkage type for function declaration
void (%i32*)* @foo
Il convient de mentionner que tous les globaux du module d'exécution sont internalisés à l'aide de la passe internalisée. Après avoir lié, mais avant d'exécuter Verifier, je dirige le passage de l'élimination globale morte parmi d'autres optimisations. Et quand je fais dump()
Sur le module résultant, je vois, que @foo
qui provient du module d'exécution est également supprimé, bien qu'il soit utilisé par main()
. Il semble que llvm pense que @foo
Définition dans l'exécution et @foo
La déclaration exécutable n'est pas liée.
J'ai essayé de jouer avec des types de liaison - pas de chance.
Alors, quelle est la bonne façon de créer un appel à la fonction à partir d'un autre module?
La solution
OK, je l'ai corrigé, mais je ne comprends toujours pas quel était le problème. Lors de la construction de mon module Bitcode Runtime, j'ai appliqué une transformation internalisante dessus. J'ai donc essayé de le faire au moment de l'exécution après avoir lié et cela m'a aidé.
Ah, et j'ai utilisé GlobalValue::WeakAnyLinkage
.