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的主要内容,如果未能解决你的问题,请参考以下文章

将元标记关键字显示为数据库中的 JSON 数据似乎不起作用

将元数据库连接到 Sql Server

将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)

查询优化:将元数据连接到值列表表

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

使用 sql 查询将元数据库中的预配置时间戳从 utc 格式转换为 ist