Clang错误:尚无法编译内置函数

时间:2018-12-14 20:28:29

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

我正在编译Linux内核代码,其中也包含带有clang的gcc库(单独添加)。我陷入以下错误:

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的工作原理时,我在CGBuiltin.cpp文件中的“ EmitBuiltinExpr”函数中找到了对该内置函数的另一种引用。但是无法理解如何使用它来解决我的问题。有什么好的资料可以理解所有这些吗?

1 个答案:

答案 0 :(得分:0)

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版本进行编译。


在c语之后,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中,如果ErrorUnsupported目标挂钩失败,则会扩展内置函数并调用initDwarfEHRegSizeTable

  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中定义。老实说,我还不完全了解它在什么情况下会失败(这也取决于目标体系结构)。