Ошибка лягушки: пока не удается скомпилировать встроенную функцию - PullRequest
0 голосов
/ 14 декабря 2018

Я компилирую код ядра linux, который также содержит библиотеки gcc (добавлены отдельно) с помощью clang.Я застрял в следующей ошибке:

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

'__buildin_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 голосов
/ 17 декабря 2018

Код 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, которая поддерживаетэто встроенное, если есть.


После кода лязга сообщение cannot compile this <something> yet печатается функцией ErrorUnsupported в CodeGenModule.cpp:

/// 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.Честно говоря, я еще не до конца понимаю, при каких условиях он выходит из строя (что также зависит от целевой архитектуры).

...