clang 将元数据设置为 allocainst
clang set metadata to allocainst
首先我是 clang/llvm 的菜鸟。
但出于某种目的,我正在尝试修改 clang。
每当在 IR 代码中针对具有某些注释的变量发出 Alloca 指令时,我都想添加元数据。
我在 CGDecl.cpp 中注意到这个函数:
CodeGenFunction::AutoVarEmission
CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D)
最后包含漂亮的一行:
if (D.hasAttr<AnnotateAttr>())
EmitVarAnnotations(&D, emission.Address);
这看起来像我需要的条件,所以我将其修改为
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
// set metadata...
}
EmitVarAnnotations(&D, emission.Address);
}
我的问题是此时我不知道如何添加元数据,因为我找不到访问指令的方法
然而,在CGExp.cpp中,我看到了AllocaInstr 的构建位置,但此时我无法访问VarDecl,所以我不知道注解是否在那里。
无论如何我都尝试在这个函数中添加元数据(无条件地):
llvm::AllocaInst *CodeGenFunction::CreateIRTemp(QualType Ty,
const Twine &Name) {
llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertType(Ty), Name);
// FIXME: Should we prefer the preferred type alignment here?
CharUnits Align = getContext().getTypeAlignInChars(Ty);
// how to put it conditionaly on the annotation?
llvm::MDNode* node = getRangeForLoadFromType(Ty);
Alloc->setMetadata("_my_custom_metadata", node);
Alloc->setAlignment(Align.getQuantity());
return Alloc;
}
通过添加 setMetadata 调用。
但是我没有在生成的 IR 中看到附加的元数据。
我用clang -g -S -target i686-pc-win32 -emit-llvm main.cpp -o output.ll
编译
也许我完全错了,但问题是我不掌握 clang 中的代码生成:)
PS: 这是我编译的代码
int main() {
__attribute__ ((annotate("_my_custom_annotation_"))) float a[12];
}
感谢任何帮助!
谢谢
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
// set metadata...
}
EmitVarAnnotations(&D, emission.Address);
}
看来您来对地方了。事实上所有EmitAutoVarAlloca
对不同种类的变量声明都有特殊处理,但在emission.Address
.
中都以"address"(即指令)结尾
所以你要做的是:
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
emission.Address->setMetadata(...); // <--- your MDNode goes here
}
EmitVarAnnotations(&D, emission.Address);
}
但是,我会推荐一个特殊的属性来为指令添加元数据。如果您进一步阅读代码,您会发现 AnnotateAttr
具有特殊含义,您发出的 IR 可能与预期不同。您可以在 Attr.td
文件中添加自定义属性。我建议注释条目的副本。然后您可以按照 AnnotateAttr
通过代码并在正确的位置为您的属性添加代码以使其被 clang 识别和处理。
首先我是 clang/llvm 的菜鸟。
但出于某种目的,我正在尝试修改 clang。
每当在 IR 代码中针对具有某些注释的变量发出 Alloca 指令时,我都想添加元数据。
我在 CGDecl.cpp 中注意到这个函数:
CodeGenFunction::AutoVarEmission
CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D)
最后包含漂亮的一行:
if (D.hasAttr<AnnotateAttr>())
EmitVarAnnotations(&D, emission.Address);
这看起来像我需要的条件,所以我将其修改为
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
// set metadata...
}
EmitVarAnnotations(&D, emission.Address);
}
我的问题是此时我不知道如何添加元数据,因为我找不到访问指令的方法
然而,在CGExp.cpp中,我看到了AllocaInstr 的构建位置,但此时我无法访问VarDecl,所以我不知道注解是否在那里。
无论如何我都尝试在这个函数中添加元数据(无条件地):
llvm::AllocaInst *CodeGenFunction::CreateIRTemp(QualType Ty,
const Twine &Name) {
llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertType(Ty), Name);
// FIXME: Should we prefer the preferred type alignment here?
CharUnits Align = getContext().getTypeAlignInChars(Ty);
// how to put it conditionaly on the annotation?
llvm::MDNode* node = getRangeForLoadFromType(Ty);
Alloc->setMetadata("_my_custom_metadata", node);
Alloc->setAlignment(Align.getQuantity());
return Alloc;
}
通过添加 setMetadata 调用。
但是我没有在生成的 IR 中看到附加的元数据。
我用clang -g -S -target i686-pc-win32 -emit-llvm main.cpp -o output.ll
也许我完全错了,但问题是我不掌握 clang 中的代码生成:)
PS: 这是我编译的代码
int main() {
__attribute__ ((annotate("_my_custom_annotation_"))) float a[12];
}
感谢任何帮助!
谢谢
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
// set metadata...
}
EmitVarAnnotations(&D, emission.Address);
}
看来您来对地方了。事实上所有EmitAutoVarAlloca
对不同种类的变量声明都有特殊处理,但在emission.Address
.
所以你要做的是:
if (D.hasAttr<AnnotateAttr>()) {
AnnotateAttr* attr = D.getAttr<AnnotateAttr>();
if(attr->getAnnotation() == "_my_custom_annotation_") {
emission.Address->setMetadata(...); // <--- your MDNode goes here
}
EmitVarAnnotations(&D, emission.Address);
}
但是,我会推荐一个特殊的属性来为指令添加元数据。如果您进一步阅读代码,您会发现 AnnotateAttr
具有特殊含义,您发出的 IR 可能与预期不同。您可以在 Attr.td
文件中添加自定义属性。我建议注释条目的副本。然后您可以按照 AnnotateAttr
通过代码并在正确的位置为您的属性添加代码以使其被 clang 识别和处理。