2016-11-22 9 views
2

일부 C++ 코드를 구문 분석하기 위해 Clang을 사용하고 있습니다. 내가 만나는 모든 FunctionDecl에 대해 이름과 맹 글링 된 이름을 인쇄하고 싶습니다.Clang에서 NamedDecl의 이름을 변경하는 방법은 무엇입니까?

bool VisitFunctionDecl(FunctionDecl* f) { 

    auto declName = f->getNameInfo().getName(); 
    auto functionName = declName.getAsString(); 

    std::cout << functionName << std::endl; 

    return true; 
} 

가 어떻게 또한 변환 된 이름을 인쇄 할 수 있습니다

RecursiveASTVisitor이를 추가하여 비교적 쉽게 함수 이름을 인쇄 할 수 있습니까?


작동 코드는 내가 세바스찬의 포인터를 다음 후 생산 : 그것은 ABI에 의존하기 때문에

const auto getMangledName = [&](FunctionDecl* decl) { 

    auto mangleContext = context.createMangleContext(); 

    if (!mangleContext->shouldMangleDeclName(decl)) { 
    return decl->getNameInfo().getName().getAsString(); 
    } 

    std::string mangledName; 
    llvm::raw_string_ostream ostream(mangledName); 

    mangleContext->mangleName(decl, ostream); 

    ostream.flush(); 

    delete mangleContext; 

    return mangledName; 
}; 

답변

4

혼용 된 이름의 AST의 일부가 아닙니다. 맹 글링 된 이름을 얻으려면 적절한 clang::MangleContext 하위 클래스 (clang/AST/Mangle.h)를 만들어야합니다. 현재 Visual Studio와 호환되는 mangling에는 MicrosoftMangleContext, 일반적인 C++ ABI mangling에는 ItaniumMangleContext이 있습니다.

가장 간단한 버전의 경우 mangleName을 호출하여 이름을 mangle하려는 NamedDecl과 맹 글링 된 이름이 기록 된 raw_ostream을 전달합니다. . 자신의 맹 글링은 자신들이 무엇인지 기능에 의존하기 때문에 람다 같은 더 복잡한 것들에 대한

, 당신은 또한, 적절한 지점에서 startNewFunction를 호출 할 수 있습니다 또한

+0

을, 작은 세부 사항을 많이 여기 저기있다 : 여러 생성자와 소멸자의 변형, 가상 메서드의 썽크. clang :: index :: CodegenNameGenerator는 여기서 참조로 사용될 수 있습니다. –