2012-12-22 28 views
10

kullanıldığında onu bulabilir Clang tarafından ayrıştırılan bir C++ kaynak dosyasında bir tanımlayıcı arıyorum. Kaynak dosyasında (başlık değil) bildirilen beş argümanı alan bir işlevdir. Bir argümanla çağırmayı denediğimde, Clang uygun bir hata verir - fonksiyonun beyanının tam metni bile. Ancak API ile bakmaya çalıştığımda, Clang var olmadığını ısrar ediyor.Clang API aracılığıyla tanımlayıcı bulunamıyor ancak Clang

İlgili kod İşte:

llvm::LLVMContext c; 
clang::CompilerInstance CI; 
llvm::Module m("", c); 
clang::EmitLLVMOnlyAction emit(&c); 
emit.setLinkModule(&m); 

std::string errors; 
llvm::raw_string_ostream error_stream(errors); 
clang::DiagnosticOptions diagopts; 
clang::TextDiagnosticPrinter printer(error_stream, &diagopts); 
llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagids(new clang::DiagnosticIDs); 
clang::DiagnosticsEngine engine(diagids, &diagopts, &printer, false); 
CI.setDiagnostics(&engine); 

clang::TargetOptions target; 
target.Triple = llvm::sys::getDefaultTargetTriple(); 
CI.setTarget(clang::TargetInfo::CreateTargetInfo(engine, &target)); 

CI.getLangOpts().CPlusPlus0x = true; 
CI.getLangOpts().CPlusPlus = true; 

clang::FrontendInputFile f("main.cpp", clang::InputKind::IK_CXX, true); 
emit.BeginSourceFile(CI, f); 

emit.Execute(); 
auto sema = CI.takeSema(); 
auto ast = &CI.getASTContext(); 
CI.resetAndLeakASTContext(); 
emit.EndSourceFile(); 

emit.takeModule(); 
auto identinfo = CI.getPreprocessor().getIdentifierInfo("WriteConsoleW"); 

auto sloc = CI.getSourceManager().getLocForEndOfFile(CI.getSourceManager().translateFile(CI.getFileManager().getFile("main.cpp"))); 
clang::LookupResult lr(*sema, clang::DeclarationName(identinfo), sloc, clang::Sema::LookupNameKind::LookupOrdinaryName); 
auto result = sema->LookupName(lr, sema->TUScope); 

Ben identinfo BOŞ olmadığını doğruladıktan ve sloc bu da değil sıfırdır.

Neden Clang adımı bulamıyor?

Düzenleme: Küresel kapsamda nitelikli ad arama gerçekleştirmeyi başardım. Ne yazık ki, bu niteliksiz isim araması yapmakla tamamen aynı değildir - örneğin, ADL yok. Clang hala bir niteliksiz fonksiyon isminin bulunmadığı konusunda ısrar ediyor.

Düzeltme: Nitelikli sorgulama sahiplik anlambilimine sahip olduğu ve eylemin zaten ihtiyacım olanı yapmadığı için, nitelikli kod, Frontend kütüphanesindeki bağımlılıkları önlemek için benzer ancak yeniden yapılandırılmıştır.

clang::CompilerInstance ci; 
clang::FileSystemOptions fso; 
clang::FileManager fm(fso); 

std::string errors; 
llvm::raw_string_ostream error_stream(errors); 
clang::DiagnosticOptions diagopts; 

llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagids(new clang::DiagnosticIDs); 
clang::DiagnosticsEngine engine(diagids, &diagopts, new clang::TextDiagnosticPrinter(error_stream, &diagopts), false); 

clang::SourceManager sm(engine, fm); 

clang::LangOptions langopts; 
langopts.CPlusPlus = true; 
langopts.CPlusPlus0x = true; 

clang::TargetOptions target; 
target.Triple = llvm::sys::getDefaultTargetTriple(); 
auto targetinfo = clang::TargetInfo::CreateTargetInfo(engine, &target); 

auto headeropts = llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions>(new clang::HeaderSearchOptions()); 
clang::HeaderSearch hs(headeropts, fm, engine, langopts, targetinfo); 

auto x = llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions>(new clang::PreprocessorOptions()); 
clang::Preprocessor p(x, engine, langopts, targetinfo, sm, hs, ci); 

clang::ASTContext astcon(langopts, sm, targetinfo, p.getIdentifierTable(), p.getSelectorTable(), p.getBuiltinInfo(), 1000); 
clang::CodeGenOptions codegenopts; 
clang::CodeGen::CodeGenModule codegen(astcon, codegenopts, m, llvm::DataLayout(&m), engine); 
CodeGenConsumer consumer(&codegen); 
clang::Sema sema(p, astcon, consumer, clang::TranslationUnitKind::TU_Prefix); 

sm.createMainFileID(fm.getFile(filepath)); 
engine.getClient()->BeginSourceFile(langopts, &p); 
clang::ParseAST(sema); 
codegen.Release(); 
engine.getClient()->EndSourceFile(); 
    /* 
for (auto it = astcon.getTranslationUnitDecl()->decls_begin(); it != astcon.getTranslationUnitDecl()->decls_end(); ++it) { 
    if (auto named = llvm::dyn_cast<clang::NamedDecl>(*it)) { 
     std::cout << named->getNameAsString() << "\n"; 
    } 
}*/ 
clang::LookupResult lr(sema, clang::DeclarationName(p.getIdentifierInfo("f")), sm.getLocForEndOfFile(sm.translateFile(fm.getFile(filepath))), clang::Sema::LookupNameKind::LookupOrdinaryName); 
auto result = sema.LookupQualifiedName(lr, astcon.getTranslationUnitDecl()); 
+0

Kaliteli arama ile kod gönderebilir misiniz? – osgx

+0

@osgx: İstendiği gibi tamamlandı. – Puppy

+0

Kodunuzda LLVM + Clang sürümü nedir? – osgx

cevap

5

Görünüşe göre, bu şu anda sadece bozuk olduğu bilinmektedir. LookupName uygulamasını inceledim ve bu durumu ele almıyor.

Şu an için nitelikli arama ile yaşamak zorundayım.

+0

Biraz daha gösterebilir misin? Hangi dava ele alınmıyor? – osgx

+0

Kapsamı geçtiği yer TUScope'dur. – Puppy