【问题标题】:Clang error: Cannot compile builtin function yetClang 错误:还不能编译内置函数
【发布时间】:2018-12-14 20:28:28
【问题描述】:

我正在用 clang 编译还包含 gcc 库(单独添加)的 linux 内核代码。我遇到以下错误:

gcc/unwind-dw2.c:1336:3: error: cannot compile this __builtin_init_dwarf_reg_size_table yet 

'__builtin_init_dwarf_reg_size_table' 是 gcc 中的内置函数。我在网上找不到足够的材料来解决这个错误。但是我在 clang 中找到了对这个函数的引用:

BUILTIN(__builtin_init_dwarf_reg_size_table, "vv*", "n")

在 prebuilt_include/clang/include/clang/Basic/Builtins.def 位置。但我不明白它的目的是什么。

任何有关错误的提示都会非常有帮助。

编辑:在环顾四周以了解 clang 的工作原理时,我在函数“EmitBuiltinExpr”的 CGBuiltin.cpp 文件中找到了对此内置函数的另一个引用。但无法理解如何使用它来解决我的问题。有什么好的资料可以理解这一切吗?

【问题讨论】:

  • 这可能是一个clang错误。你能用不同的 clang/gcc 版本编译 unwind-dw2.c 吗?
  • 是的,gcc 4.9 正在编译。
  • 你能告诉这个错误“还不能编译”是什么意思吗?而如果是clang bug,如何确认并报告?
  • 抱歉,@Shashank shekhar Dubey 回复延迟。该错误似乎表明您的目标不支持内置函数 - 请参阅我的答案了解更多详细信息

标签: gcc linux-kernel clang clang++ llvm-clang


【解决方案1】:

Clang 代码表明,错误 cannot compile this <something> yet 表示 <something> 是 Clang 在目标架构上不支持的构造。

在这种情况下,init_dwarf_reg_size_table 是一个 GCC 内置函数,并非所有 Clang 目标都完全支持它。检查 GCC 的 builtins.def 可以确认 init_dwarf_reg_size_table 是 GCC 扩展。

作为一种解决方法,您可能必须改为使用 GCC 编译,或者使用支持此内置函数的更新的 clang 版本(如果有)。


遵循 clang 代码,cannot compile this <something> yet 消息由 CodeGenModule.cpp 中的 ErrorUnsupported 函数打印:

/// ErrorUnsupported - Print out an error that codegen doesn't support the
/// specified stmt yet.
void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
                                               "cannot compile this %0 yet");
  std::string Msg = Type;
  getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
    << Msg << S->getSourceRange();
}

CGBuiltin.cpp 中,如果initDwarfEHRegSizeTable 目标钩子失败,则扩展内置函数并调用ErrorUnsupported

  case Builtin::BI__builtin_init_dwarf_reg_size_table: {
    Value *Address = EmitScalarExpr(E->getArg(0));
    if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address))
      CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table");
    return RValue::get(llvm::UndefValue::get(ConvertType(E->getType())));
  }

initDwarfEHRegSizeTableTargetInfo.cpp 中定义。老实说,我还没有完全理解它在什么情况下会失败(这也取决于目标架构)。

【讨论】:

  • 非常感谢,@valiano,如果需要,我会尝试了解并报告 clang 的问题。
猜你喜欢
  • 1970-01-01
  • 2017-06-28
  • 2014-10-01
  • 2020-06-17
  • 2013-08-20
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多