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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top