Comment puis-je mettre en œuvre un type de données chaîne dans LLVM?
J'ai été à la recherche à LLVM ces derniers temps, et je trouve que c'est très intéressant de l'architecture. Cependant, en regardant à travers le tutoriel et le matériel de référence, je ne peux pas voir les exemples de la façon dont je pourrais mettre en œuvre un chaîne type de données.
Il y a beaucoup de documentation sur des entiers, des réels, et d'autres types de numéro, et même les tableaux, les fonctions et les structures, mais autant que je sache rien sur les chaînes. Je ajouter un nouveau type de données à l'arrière-plan? Est-il possible d'utiliser les types de données intégrés? Aucune information serait appréciée.
Vous devez vous connecter pour publier un commentaire.
Ce qui est une chaîne de caractères? Un tableau de caractères.
Qu'est ce qu'un personnage? Un entier.
Ainsi, alors que je ne suis pas LLVM expert par tous les moyens, je dirais que si, par exemple, que vous vouliez représenter quelque 8-bit jeu de caractères, vous pouvez utiliser un tableau de i8 (8 bits par exemple), ou un pointeur vers i8. Et en effet, si nous avons un simple hello world en C programme:
Et nous le compiler en utilisant llvm-gcc et le vidage de l'généré LLVM assemblée:
Avis la référence pour les options de la fonction a déclaré à la fin du fichier. En C, le met est
Dans LLVM, il est
La correspondance doit être clair.
En aparté, à la génération de LLVM est très détaillé ici parce que j'ai compilé sans optimisations. Si vous activez-les, inutiles que les instructions de disparaître:
malloc
,realloc
etfree
appels pour gérer votre mémoire. Si vous souhaitez utiliser la collecte des ordures sans une tonne de travail, il pourrait être possible de boulon sur le Boehm conservateur GC. (Je ne sais pas, je ne l'ai pas fait.)llvm-gcc
vous obtenez via le gestionnaire de paquets est en faitgcc
+dragonegg
et ignore silencieusement le-emit-llvm
option. L'installation de laclang
paquet et à l'aide declang -S -emit-llvm
au lieu de cela fonctionne bien.[À suivre sur les autres réponses qui expliquent ce que les chaînes sont, voici de mise en œuvre de l'aide]
À l'aide de l'interface C, les appels que vous aurez envie sont quelque chose comme:
Assertion failed: InitVal->getType() == getType()->getElementType() && "Initializer type must match GlobalVariable type", file Globals.cpp, line 168
lors de cette opération. Aucune idée pourquoi?Pensez à la façon d'une chaîne de caractères est représentée en commun des langues:
string
est un objet complexe avec un constructeur, un destructeur, et le constructeur de copie. À l'intérieur, il tient généralement essentiellement une chaîne C.De LLVM nom est très explicite. C'est vraiment "bas niveau". Vous avez à mettre en œuvre des chaînes de la façon dont vous le souhaitez. Il serait idiot de LLVM de forcer quelqu'un à une mise en œuvre spécifique.
À l'aide de l'API C, au lieu d'utiliser
LLVMConstString
, vous pouvez utiliserLLVMBuildGlobalString
. Voici ma mise en œuvre deà l'aide de l'API C:
J'ai créé des chaînes comme:
Générés IR est:
Pour ceux qui utilisent l'API C++ de LLVM, vous pouvez compter sur
IRBuilder
'sCreateGlobalStringPtr
:Ce sera représenté comme
i8*
dans le final de l'IR LLVM.