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 识别和处理。