[cfe-dev] [libclang] get actual specified calling convention from source

jagannatharjun via cfe-dev cfe-dev at lists.llvm.org
Mon Jan 14 10:07:25 PST 2019


I am trying to extract the function declaration from the function definition, for this, I need the actual specified function calling convention from the original function definition, current I am using something like this:
 string Convert(const CXString& s)
{
    string result = clang_getCString(s);
    clang_disposeString(s);
    return result;
}

void print_function_prototype(CXCursor cursor) {
  auto type = clang_getCursorType(cursor);

  auto function_name = Convert(clang_getCursorSpelling(cursor));
  auto return_type = Convert(clang_getTypeSpelling(clang_getResultType(type)));
  auto calling_convention = std::to_string(clang_getFunctionTypeCallingConv(type));

  std::cout << return_type << " " << calling_convention << " " << function_name
            << "(";

  int num_args = clang_Cursor_getNumArguments(cursor);
  for (int i = 0; i < num_args; ++i) {
    auto arg_cursor = clang_Cursor_getArgument(cursor, i);
    auto arg_name = Convert(clang_getCursorSpelling(arg_cursor));
    auto arg_data_type =
        Convert(clang_getTypeSpelling(clang_getArgType(type, i)));
    std::cout << (i > 0 ? "," : "") << arg_data_type << " " << arg_name;
  }

  std::cout << ");\n";
}

int main() {
CXIndex index = clang_createIndex(0, 0);
  const char *CompilerArgs[] = {"-IE:/Cpp/Projects/Headers", "-fms-extensions",
                                "-fms-compatibility"};
  auto CompilerArgsCount = sizeof(CompilerArgs) / sizeof(CompilerArgs[0]);
  CXTranslationUnit unit = clang_parseTranslationUnit(
      index, "test.cpp", CompilerArgs,
      CompilerArgsCount, nullptr, 0, CXTranslationUnit_None);
  if (unit == nullptr) {
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }

  CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
      cursor,
      [](CXCursor c, CXCursor parent, CXClientData client_data) {
        if (clang_Location_isFromMainFile(clang_getCursorLocation(c)))
          if (clang_getCursorKind(c) == CXCursorKind::CXCursor_FunctionDecl) {
            print_function_prototype(c);
          }
        return CXChildVisit_Recurse;
      },
      nullptr);

  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
}
now calling convention like __stdcall will be ignored on x64(clang_getFunctionTypeCallingConv(type) == 1), but I want to get it irrespective of architecture.


Sent from Mail for Windows 10

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190114/f8a22c2f/attachment-0001.html>


More information about the cfe-dev mailing list