2017-08-02 8 views
1

Dans LLVM (spécifiquement llvmlite), comment déclarer une variable globale et initialiser son contenu avec le résultat d'une expression arbitraire (runtime)? Je vois que je peux créer un objet GlobalVariable, mais il semble que son argument initializer attend un Constant. Que faire si je dois exécuter du code arbitraire au démarrage/chargement pour déterminer sa valeur? Où va ce code? À qui dois-je ajouter des instructions pour Builder? Est-ce que je déclare une fonction spécialement nommée et/ou j'ajoute des attributs magiques pour qu'elle s'exécute automatiquement quand le module est chargé en mémoire à l'exécution?Comment générer du code pour initialiser des variables globales avec des valeurs non-const dans LLVM?

Répondre

2

Cela dépend entièrement de votre configuration. En C ou C++ avec Visual Studio, les fonctions d'initialisation C et C++ finissent par être placées dans une sous-section de la section .CRT et sont exécutées par la bibliothèque d'exécution standard.

Si vous compilez sans le CRT et avez ces fonctions d'initialisation, ils ne se déclencheront pas car le runtime s'en charge.

Correction édition: Il semble que @llvm.global_ctors existe. Je ne sais pas si elles se déclenchent correctement dans un environnement sans une bibliothèque d'exécution qui aide à exécuter les initialiseurs, mais là vous l'avez.