我正在编译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”函数中找到了对该内置函数的另一种引用。但是无法理解如何使用它来解决我的问题。有什么好的资料可以理解所有这些吗?
答案 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())));
}
initDwarfEHRegSizeTable
在TargetInfo.cpp
中定义。老实说,我还不完全了解它在什么情况下会失败(这也取决于目标体系结构)。