From 2b97576ebb4ab3a73f94389b4eaf39555f4e1923 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 3 Aug 2023 14:52:44 +0200 Subject: [PATCH] HeaderToModel: do not hardcode clang paths --- lib/ImportModelFromC/CMakeLists.txt | 1 + .../ImportModelFromCAnalysis.cpp | 48 +++++++------------ 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/lib/ImportModelFromC/CMakeLists.txt b/lib/ImportModelFromC/CMakeLists.txt index 6a395e190..d651e36ec 100644 --- a/lib/ImportModelFromC/CMakeLists.txt +++ b/lib/ImportModelFromC/CMakeLists.txt @@ -19,6 +19,7 @@ target_link_libraries( revngcModelToHeader clangBasic clangAST + clangDriver clangSerialization clangFrontend clangTooling diff --git a/lib/ImportModelFromC/ImportModelFromCAnalysis.cpp b/lib/ImportModelFromC/ImportModelFromCAnalysis.cpp index 0aaab95d6..b23e531b4 100644 --- a/lib/ImportModelFromC/ImportModelFromCAnalysis.cpp +++ b/lib/ImportModelFromC/ImportModelFromCAnalysis.cpp @@ -13,6 +13,7 @@ #include "llvm/Support/Error.h" #include "llvm/Support/ToolOutputFile.h" +#include "clang/Driver/Driver.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Lex/PreprocessorOptions.h" @@ -26,6 +27,7 @@ #include "revng/Pipeline/Option.h" #include "revng/Pipeline/RegisterAnalysis.h" #include "revng/Pipes/ModelGlobal.h" +#include "revng/Support/PathList.h" #include "revng/Support/YAMLTraits.h" #include "revng/TupleTree/TupleTreeDiff.h" @@ -198,9 +200,8 @@ struct ImportModelFromCAnalysis { } // Find compile flags to be applied to clang. - auto MaybeCompileCFGPath = revng::ResourceFinder.findFile("share/revng-c/" - "compile-flags." - "cfg"); + StringRef CompileFlagsPath = "share/revng-c/compile-flags.cfg"; + auto MaybeCompileCFGPath = revng::ResourceFinder.findFile(CompileFlagsPath); if (not MaybeCompileCFGPath) { return llvm::createStringError(llvm::inconvertibleErrorCode(), "Couldn't find compile-flags.cfg"); @@ -212,36 +213,23 @@ struct ImportModelFromCAnalysis { std::vector Compilation(FromCFGFile); Compilation.push_back("-xc"); - // Find stdbool.h. - auto MaybeStdBoolHeaderPath = findHeaderFile("lib64/llvm/" - "llvm/lib/" - "clang/16/" - "include/" - "stdbool.h"); - if (not MaybeStdBoolHeaderPath) { - return llvm::createStringError(llvm::inconvertibleErrorCode(), - "Couldn't find stdbool.h"); + SmallString<16> CompilerHeadersPath; + { + StringRef LLVMLibrary = getLibrariesFullPath().at("libLLVMSupport"); + using namespace llvm::sys::path; + SmallString<16> ClangPath; + append(ClangPath, parent_path(parent_path(LLVMLibrary))); + append(ClangPath, Twine("bin")); + append(ClangPath, Twine("clang")); + CompilerHeadersPath = clang::driver::Driver::GetResourcesPath(ClangPath); + append(CompilerHeadersPath, Twine("include")); } - Compilation.push_back("-I" + *MaybeStdBoolHeaderPath); - - // Find stdint.h. - auto MaybeStdIntHeaderPath = findHeaderFile("lib64/llvm/" - "llvm/lib/" - "clang/16/" - "include/" - "stdint.h"); - if (not MaybeStdIntHeaderPath) { - return llvm::createStringError(llvm::inconvertibleErrorCode(), - "Couldn't find stdint.h"); - } - Compilation.push_back("-I" + *MaybeStdIntHeaderPath); + Compilation.push_back("-I" + CompilerHeadersPath.str().str()); // Find revng-primitive-types.h and revng-attributes.h. - auto MaybeRevngHeaderPath = findHeaderFile("share/revng-c/" - "include/" - "revng-" - "primitive-" - "types.h"); + const char *PrimitivesHeader = "share/revng-c/include/" + "revng-primitive-types.h"; + auto MaybeRevngHeaderPath = findHeaderFile(PrimitivesHeader); if (not MaybeRevngHeaderPath) { return llvm::createStringError(llvm::inconvertibleErrorCode(), "Couldn't find revng-primitive-types.h");