diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d56029b..1eedaf28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,7 +279,7 @@ target_include_directories(${LIB_CXX_PROJECT_NAME} SYSTEM ) link_directories(${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS}) -llvm_map_components_to_libnames(REQ_LLVM_LIBS support core libdriver passes) +llvm_map_components_to_libnames(REQ_LLVM_LIBS support core libdriver passes x86asmparser x86codegen) target_link_libraries(${LIB_CXX_PROJECT_NAME} ${CLANG_LIBRARIES} ${REQ_LLVM_LIBS}) diff --git a/src/lib_cxx/data/parser/cxx/CxxParser.cpp b/src/lib_cxx/data/parser/cxx/CxxParser.cpp index 7e74864b..9b599885 100644 --- a/src/lib_cxx/data/parser/cxx/CxxParser.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxParser.cpp @@ -1,11 +1,7 @@ #include "data/parser/cxx/CxxParser.h" #include "clang/Tooling/Tooling.h" - -#include "utility/file/FilePath.h" -#include "utility/file/FileRegister.h" -#include "utility/logging/logging.h" -#include "utility/text/TextAccess.h" +#include "llvm/Support/TargetSelect.h" #include "data/indexer/IndexerCommandCxxCdb.h" #include "data/indexer/IndexerCommandCxxEmpty.h" @@ -14,6 +10,11 @@ #include "data/parser/cxx/CxxCompilationDatabaseSingle.h" #include "data/parser/cxx/CxxDiagnosticConsumer.h" +#include "utility/file/FilePath.h" +#include "utility/file/FileRegister.h" +#include "utility/logging/logging.h" +#include "utility/text/TextAccess.h" + namespace { static std::vector getSyntaxOnlyToolArgs(const std::vector &ExtraArgs, llvm::StringRef FileName) @@ -59,6 +60,8 @@ CxxParser::CxxParser(std::shared_ptr client, std::shared_ptr indexerComman runTool(compilationDatabase.get(), indexerCommand->getSourceFilePath()); } -void CxxParser::buildIndex(const std::string& fileName, std::shared_ptr fileContent) +void CxxParser::buildIndex(const std::string& fileName, std::shared_ptr fileContent, std::vector compilerFlags) { std::shared_ptr canonicalFilePathCache = std::make_shared(); std::shared_ptr diagnostics = getDiagnostics(canonicalFilePathCache, false); ASTActionFactory actionFactory(m_client, m_fileRegister, canonicalFilePathCache); - std::vector args = getCommandlineArgumentsEssential(std::vector(1, "-std=c++1z"), std::vector(), std::vector()); + std::vector args = getCommandlineArgumentsEssential(compilerFlags, std::vector(), std::vector()); runToolOnCodeWithArgs( diagnostics.get(), diff --git a/src/lib_cxx/data/parser/cxx/CxxParser.h b/src/lib_cxx/data/parser/cxx/CxxParser.h index 0b9b7ede..c3e14c36 100644 --- a/src/lib_cxx/data/parser/cxx/CxxParser.h +++ b/src/lib_cxx/data/parser/cxx/CxxParser.h @@ -26,7 +26,7 @@ public: void buildIndex(std::shared_ptr indexerCommand); void buildIndex(std::shared_ptr indexerCommand); - void buildIndex(const std::string& fileName, std::shared_ptr fileContent); + void buildIndex(const std::string& fileName, std::shared_ptr fileContent, std::vector compilerFlags = {}); private: void runTool(clang::tooling::CompilationDatabase* compilationDatabase, const FilePath& sourceFilePath); diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 7029b4b9..d777bf51 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -1923,8 +1923,7 @@ public: "};\n" "class B : public A {\n" " int foo();\n" - "};\n", - false + "};\n" ); TS_ASSERT_EQUALS(client->errors.size(), 1); @@ -3829,6 +3828,30 @@ public: )); } + void test_cxx_parser_finds_usage_of_local_variable_in_microsoft_inline_assembly_statement() + { + std::shared_ptr client = parseCode( + "void foo()\n" + "{\n" + " int x = 2;\n" + "__asm\n" + "{\n" + " mov eax, x\n" + " mov x, eax\n" + "}\n" + "}\n", + { "--target=i686-pc-windows-msvc" } + ); + + TS_ASSERT(utility::containsElement( + client->localSymbols, "input.cc<3:6> <6:11 6:11>" + )); + + TS_ASSERT(utility::containsElement( + client->localSymbols, "input.cc<3:6> <7:6 7:6>" + )); + } + void test_cxx_parser_finds_template_argument_of_unresolved_lookup_expression() { std::shared_ptr client = parseCode( @@ -4010,8 +4033,7 @@ public: void test_cxx_parser_catches_error() { std::shared_ptr client = parseCode( - "int a = b;\n", - false + "int a = b;\n" ); TS_ASSERT(utility::containsElement( @@ -4059,12 +4081,12 @@ public: // } private: - std::shared_ptr parseCode(std::string code, bool logErrors = true) + std::shared_ptr parseCode(std::string code, std::vector compilerFlags = {}) { std::shared_ptr fileRegister = std::make_shared(); std::shared_ptr parserClient = std::make_shared(); CxxParser parser(parserClient, fileRegister); - parser.buildIndex("input.cc", TextAccess::createFromString(code)); + parser.buildIndex("input.cc", TextAccess::createFromString(code), utility::concat(compilerFlags, std::vector(1, "-std=c++1z"))); return parserClient; } };