clang 将元数据设置为 allocainst
Posted
技术标签:
【中文标题】clang 将元数据设置为 allocainst【英文标题】:clang set metadata to allocainst 【发布时间】:2015-02-11 14:52:20 【问题描述】:首先我是 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];
感谢任何帮助!
谢谢
【问题讨论】:
【参考方案1】: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
文件中添加自定义属性。我建议一份 Annotate 条目的副本。然后您可以通过代码跟踪AnnotateAttr
,并在正确的位置为您的属性添加代码,以使其被clang识别和处理。
【讨论】:
@Michael Haidl,我尝试了相同的代码,它抱怨:clang::CodeGen::Address'没有名为'setMetadata'的成员。你知道如何解决这个问题吗?提前致谢! @ignorer emit.Address 已从llvm::Instruction*
更改为 clang::CodeGen::Address
。 Address 现在是 llvm::Value*
的包装器,您必须将其强制转换为指令(使用 nullptr 检查进行 dyn_cast 以确保您有指令)。在说明中,您可以致电setMetadata
,如答案所示。
@MichaelHaidl 如果我们没有“地址”并且我们想在“EmitVarDecl”上添加此代码怎么办?我找不到附加新“元数据”的位置。以上是关于clang 将元数据设置为 allocainst的主要内容,如果未能解决你的问题,请参考以下文章
将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)