【问题标题】:LLVM how to set Attributes::NoUnwind to Function?LLVM 如何将 Attributes::NoUnwind 设置为 Function?
【发布时间】:2013-04-30 14:07:56
【问题描述】:

我认为这是一个非常简单的问题,但我无法解决。很伤心。 所以。当我这样做时

llc.exe -march=cpp test.bc 

我通过这段代码得到了有趣的 test.cpp:

AttrListPtr func__Z2f1i_PAL;
{
 SmallVector<AttributeWithIndex, 4> Attrs;
 AttributeWithIndex PAWI;
 PAWI.Index = 4294967295U; PAWI.Attrs = Attribute::None  | Attribute::NoUnwind;
 Attrs.push_back(PAWI);
 func__Z2f1i_PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
}

但是当我想写像PAWI.Attrs = Attribute::None | Attribute::NoUnwind;这样的字符串时

在我的项目中,我收到错误IntelliSense: no operator "=" matches these operands operand types are: llvm::Attributes = int 我需要做什么? 包括所有必要的标题。 [操作系统 - Windows 7 x64,LLVM - 3.2]

【问题讨论】:

  • 我做了一些研究——这段代码在 LLVM 3.1 上编译得很好,但在 LLVM 3.2 上编译得不好。但是,我不明白为什么。
  • 所以,我使用 LLVM 3.1 继续我的项目。如果有人知道,为什么这段代码是用 LLVM 3.2 中的 llc 编写的,但与操作数类型不匹配 - 请告诉我。谢谢。
  • 您使用的是 LLVM 3.2,还是使用最新的(“主干顶部”)版本?
  • 我在 2013 年 1 月 5 日从llvm.org/releases/download.html#3.2 下载了 LLVM 源代码
  • 如果有人遇到同样的问题 - 我的解决方案(在 LLVM 3.2 中):llvm::AttrBuilder *atbuild = new llvm::AttrBuilder();atbuild-&gt;addAttribute(llvm::Attributes::NoUnwind);llvm::Attributes atrbs = llvm::Attributes::get(context,*atbuild);function-&gt;addAttribute(0,atrbs);

标签: llvm function-attributes


【解决方案1】:

我不知道为什么 cpp 后端会生成这段代码。无论如何,属性处理在 3.2 中已更改(并将在 3.3 中再次更改)。在 3.2 中获取属性的正确方法应该是:

Attributes::get(Context, Attributes::NoUnwind)

(您始终可以在此处传递任何 ArrayRef 作为第二个参数,以使用多个值初始化属性集)。

向函数添加属性的最简单方法是:

Function->addFnAttr(Attributes::NoUnwind)

如果你想要AttributeWithIndex:

AttributeWithIndex::get(Context, ID, Attributes::NoUnwind)
// OR:
AttributeWithIndex::get(ID, Attributes::get(Context, Attributes::NoUnwind))

【讨论】:

  • VS 中出现了一些错误:“IntelliSense:没有重载函数实例”llvm::AttributeWithIndex::get”匹配参数列表参数类型是:(llvm::LLVMContext, int, llvm: :Attributes)" ...最后一个参数只能是 ArrayRef ?
  • @kpdev 我相信function-&gt;addFnAttribute(Attributes::NoUnwind) 是最简单的方法。
  • 哦,是的。 function-&gt;addFnAttr(...) 很简单。谢谢)
  • @kpdev 欢迎您!我已经编辑了我的答案,将这个花絮包含在里面:)
猜你喜欢
  • 2019-04-16
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多