c++ 如何生成与LLVM相同的cxx方法损坏的名称?

cbeh67ev  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(140)

我有一个iOS项目,在我的项目中我有一个c++方法:

  1. ClassA::getElements(vector<vector<int> >&ovElements) {
  2. // ...
  3. }

我用xcodebuild命令构建了我的项目,从.o文件中,我知道它的混乱名称是__ZN25ClassA18getElementsERNSt3__16vectorINS1_IiNS0_9allocatorIiEEEENS2_IS4_EEEE。其去角名称应为ClassA::getElements(std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >&)
我正在尝试开发一个clang工具来导出所有函数/方法的边界沿着它们的名称从源文件中导出。我可以使用MatchFinder找到所有cxxMethodfunction并得到它们的FunctionDecl,然后我使用下面的方法得到它们的混乱名称:

  1. std::string getMangledName(const FunctionDecl *FD, const MatchFinder::MatchResult &Result) {
  2. auto mangleContext = Result.Context->createMangleContext();
  3. if (!mangleContext->shouldMangleDeclName(FD)) {
  4. return FD->getNameInfo().getName().getAsString();
  5. }
  6. std::string mangledName;
  7. llvm::raw_string_ostream ostream(mangledName);
  8. mangleContext->mangleName(FD, ostream);
  9. ostream.flush();
  10. delete mangleContext;
  11. return mangledName;
  12. }

但是对于这个ClassA::getElements方法,我得到了_ZN25ClassA18getElementsERii,这不是我想要的。在对它进行了分类之后,我发现它的名字是ClassA::getElements(int&)
顺便说一句,我使用的编译数据库是由xcpretty生成的,

  1. xcodebuild ... | xcpretty -r json-compilation-database

我的问题是为什么我得到int&而不是std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >&。如何获得编译器生成的相同的损坏名称?
我遵循了@user17732522的评论,建立了一个只包含Test.hpp的最小项目

  1. #ifndef Test_hpp
  2. #define Test_hpp
  3. #include <stdio.h>
  4. #include <vector>
  5. class ClassA {
  6. public:
  7. void foo(std::vector<std::vector<int> >& ov);
  8. };
  9. #endif /* Test_hpp */

Test.cpp

  1. #include "Test.hpp"
  2. using namespace std;
  3. void ClassA::foo(vector<vector<int> >& ov) {
  4. return;
  5. }

我仍然得到了混乱的名字_ZN6ClassA3fooERi。但我注意到clang有一个错误:

  1. Test.hpp:11:10: fatal error: 'stdio.h' file not found

但是,我可以通过Xcode或xcodebuild命令成功构建它。

lzfw57am

lzfw57am1#

我想出来了!根本原因是在解析我的源文件时,出现致命错误“xxx.h”文件未找到。一旦我手动修复了这个错误,Clang就可以输出正确的结果了。

相关问题