[libclang] get actual specified calling convention from source

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[libclang] get actual specified calling convention from source

David Blaikie via cfe-dev

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

 


_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev