r372925 - Fix memory leak in DeclTest.
Author: eugenis Date: Wed Sep 25 15:38:20 2019 New Revision: 372925 URL: http://llvm.org/viewvc/llvm-project?rev=372925=rev Log: Fix memory leak in DeclTest. Fixes a leak introduced in r372903, detected on the ASan bot. http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/35430/steps/check-clang%20asan/logs/stdio Direct leak of 192 byte(s) in 1 object(s) allocated from: #0 0x561d88 in operator new(unsigned long) /b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/asan/asan_new_delete.cc:105 #1 0x1a48779 in clang::ItaniumMangleContext::create(clang::ASTContext&, clang::DiagnosticsEngine&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/AST/ItaniumMangle.cpp:5134:10 #2 0xdff000 in Decl_AsmLabelAttr_Test::TestBody() /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/unittests/AST/DeclTest.cpp:97:23 Modified: cfe/trunk/unittests/AST/DeclTest.cpp Modified: cfe/trunk/unittests/AST/DeclTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/DeclTest.cpp?rev=372925=372924=372925=diff == --- cfe/trunk/unittests/AST/DeclTest.cpp (original) +++ cfe/trunk/unittests/AST/DeclTest.cpp Wed Sep 25 15:38:20 2019 @@ -94,7 +94,8 @@ TEST(Decl, AsmLabelAttr) { // Mangle the decl names. std::string MangleF, MangleG; - MangleContext *MC = ItaniumMangleContext::create(Ctx, Diags); + std::unique_ptr MC( + ItaniumMangleContext::create(Ctx, Diags)); { llvm::raw_string_ostream OS_F(MangleF); llvm::raw_string_ostream OS_G(MangleG); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r366123 - ARM MTE stack sanitizer.
Author: eugenis Date: Mon Jul 15 13:02:23 2019 New Revision: 366123 URL: http://llvm.org/viewvc/llvm-project?rev=366123=rev Log: ARM MTE stack sanitizer. Add "memtag" sanitizer that detects and mitigates stack memory issues using armv8.5 Memory Tagging Extension. It is similar in principle to HWASan, which is a software implementation of the same idea, but there are enough differencies to warrant a new sanitizer type IMHO. It is also expected to have very different performance properties. The new sanitizer does not have a runtime library (it may grow one later, along with a "debugging" mode). Similar to SafeStack and StackProtector, the instrumentation pass (in a follow up change) will be inserted in all cases, but will only affect functions marked with the new sanitize_memtag attribute. Reviewers: pcc, hctim, vitalybuka, ostannard Subscribers: srhines, mehdi_amini, javed.absar, kristof.beyls, hiraditya, cryptoad, steven_wu, dexonsmith, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D64169 Added: cfe/trunk/test/CodeGen/memtag-attr.cpp cfe/trunk/test/Lexer/has_feature_memtag_sanitizer.cpp Modified: cfe/trunk/include/clang/Basic/Features.def cfe/trunk/include/clang/Basic/Sanitizers.def cfe/trunk/lib/CodeGen/CGDeclCXX.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/Linux.cpp cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp Modified: cfe/trunk/include/clang/Basic/Features.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Features.def?rev=366123=366122=366123=diff == --- cfe/trunk/include/clang/Basic/Features.def (original) +++ cfe/trunk/include/clang/Basic/Features.def Mon Jul 15 13:02:23 2019 @@ -42,6 +42,7 @@ FEATURE(address_sanitizer, FEATURE(hwaddress_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress)) +FEATURE(memtag_sanitizer, LangOpts.Sanitize.has(SanitizerKind::MemTag)) FEATURE(xray_instrument, LangOpts.XRayInstrument) FEATURE(undefined_behavior_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined)) Modified: cfe/trunk/include/clang/Basic/Sanitizers.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Sanitizers.def?rev=366123=366122=366123=diff == --- cfe/trunk/include/clang/Basic/Sanitizers.def (original) +++ cfe/trunk/include/clang/Basic/Sanitizers.def Mon Jul 15 13:02:23 2019 @@ -55,6 +55,9 @@ SANITIZER("hwaddress", HWAddress) // Kernel Hardware-assisted AddressSanitizer (KHWASan) SANITIZER("kernel-hwaddress", KernelHWAddress) +// A variant of AddressSanitizer using AArch64 MTE extension. +SANITIZER("memtag", MemTag) + // MemorySanitizer SANITIZER("memory", Memory) Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=366123=366122=366123=diff == --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Mon Jul 15 13:02:23 2019 @@ -369,6 +369,10 @@ llvm::Function *CodeGenModule::CreateGlo !isInSanitizerBlacklist(SanitizerKind::KernelHWAddress, Fn, Loc)) Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress); + if (getLangOpts().Sanitize.has(SanitizerKind::MemTag) && + !isInSanitizerBlacklist(SanitizerKind::MemTag, Fn, Loc)) +Fn->addFnAttr(llvm::Attribute::SanitizeMemTag); + if (getLangOpts().Sanitize.has(SanitizerKind::Thread) && !isInSanitizerBlacklist(SanitizerKind::Thread, Fn, Loc)) Fn->addFnAttr(llvm::Attribute::SanitizeThread); Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=366123=366122=366123=diff == --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon Jul 15 13:02:23 2019 @@ -696,6 +696,8 @@ void CodeGenFunction::StartFunction(Glob Fn->addFnAttr(llvm::Attribute::SanitizeAddress); if (SanOpts.hasOneOf(SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress)) Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress); + if (SanOpts.has(SanitizerKind::MemTag)) +Fn->addFnAttr(llvm::Attribute::SanitizeMemTag); if (SanOpts.has(SanitizerKind::Thread)) Fn->addFnAttr(llvm::Attribute::SanitizeThread); if (SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory)) Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL:
r350363 - Fix check-hwasan with LLVM_BUILD_EXTERNAL_COMPILER_RT=ON
Author: eugenis Date: Thu Jan 3 14:50:45 2019 New Revision: 350363 URL: http://llvm.org/viewvc/llvm-project?rev=350363=rev Log: Fix check-hwasan with LLVM_BUILD_EXTERNAL_COMPILER_RT=ON Add a forwarding target for check-hwasan in clang. Modified: cfe/trunk/runtime/CMakeLists.txt Modified: cfe/trunk/runtime/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/runtime/CMakeLists.txt?rev=350363=350362=350363=diff == --- cfe/trunk/runtime/CMakeLists.txt (original) +++ cfe/trunk/runtime/CMakeLists.txt Thu Jan 3 14:50:45 2019 @@ -126,7 +126,7 @@ if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND E FileCheck count not llvm-nm llvm-objdump llvm-symbolizer) # Add top-level targets for various compiler-rt test suites. -set(COMPILER_RT_TEST_SUITES check-fuzzer check-asan check-asan-dynamic check-dfsan +set(COMPILER_RT_TEST_SUITES check-fuzzer check-asan check-hwasan check-asan-dynamic check-dfsan check-lsan check-msan check-sanitizer check-tsan check-ubsan check-ubsan-minimal check-profile check-cfi check-cfi-and-supported check-safestack) foreach(test_suite ${COMPILER_RT_TEST_SUITES}) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r350361 - [cmake] Fix monorepo + LLVM_BUILD_EXTERNAL_COMPILER_RT=ON.
Author: eugenis Date: Thu Jan 3 14:41:10 2019 New Revision: 350361 URL: http://llvm.org/viewvc/llvm-project?rev=350361=rev Log: [cmake] Fix monorepo + LLVM_BUILD_EXTERNAL_COMPILER_RT=ON. In cmake 3.10.2, if (${VARIABLE_NAME}) seems to always be false no matter what documentation says (or maybe I just failed at reading). Anyway, if (VARIABLE_NAME) seems to do what this code intended. Modified: cfe/trunk/runtime/CMakeLists.txt Modified: cfe/trunk/runtime/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/runtime/CMakeLists.txt?rev=350361=350360=350361=diff == --- cfe/trunk/runtime/CMakeLists.txt (original) +++ cfe/trunk/runtime/CMakeLists.txt Thu Jan 3 14:41:10 2019 @@ -28,7 +28,7 @@ set(COMPILER_RT_SRC_ROOT ${LLVM_MAIN_SRC # variable) as in add_llvm_external_project if(NOT EXISTS ${COMPILER_RT_SRC_ROOT}) # We don't want to set it if LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR is "" - if(${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR}) + if(LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR) set(COMPILER_RT_SRC_ROOT ${LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR}) endif() endif() ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r336716 - Revert r336590 "[libclang] evalute compound statement cursors before trying to evaluate"
Author: eugenis Date: Tue Jul 10 12:49:07 2018 New Revision: 336716 URL: http://llvm.org/viewvc/llvm-project?rev=336716=rev Log: Revert r336590 "[libclang] evalute compound statement cursors before trying to evaluate" New memory leaks in LibclangParseTest_EvaluateChildExpression_Test::TestBody() Modified: cfe/trunk/tools/libclang/CIndex.cpp cfe/trunk/unittests/libclang/LibclangTest.cpp Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=336716=336715=336716=diff == --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Tue Jul 10 12:49:07 2018 @@ -3890,19 +3890,6 @@ static const ExprEvalResult* evaluateExp } CXEvalResult clang_Cursor_Evaluate(CXCursor C) { - if (clang_getCursorKind(C) == CXCursor_CompoundStmt) { -const CompoundStmt *compoundStmt = cast(getCursorStmt(C)); -Expr *expr = nullptr; -for (auto *bodyIterator : compoundStmt->body()) { - if ((expr = dyn_cast(bodyIterator))) { -break; - } -} -if (expr) - return const_cast( - reinterpret_cast(evaluateExpr(expr, C))); - } - const Decl *D = getCursorDecl(C); if (D) { const Expr *expr = nullptr; @@ -3916,6 +3903,19 @@ CXEvalResult clang_Cursor_Evaluate(CXCur evaluateExpr(const_cast(expr), C))); return nullptr; } + + const CompoundStmt *compoundStmt = dyn_cast_or_null(getCursorStmt(C)); + if (compoundStmt) { +Expr *expr = nullptr; +for (auto *bodyIterator : compoundStmt->body()) { + if ((expr = dyn_cast(bodyIterator))) { +break; + } +} +if (expr) + return const_cast( + reinterpret_cast(evaluateExpr(expr, C))); + } return nullptr; } Modified: cfe/trunk/unittests/libclang/LibclangTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/LibclangTest.cpp?rev=336716=336715=336716=diff == --- cfe/trunk/unittests/libclang/LibclangTest.cpp (original) +++ cfe/trunk/unittests/libclang/LibclangTest.cpp Tue Jul 10 12:49:07 2018 @@ -461,47 +461,6 @@ TEST_F(LibclangParseTest, AllSkippedRang clang_disposeSourceRangeList(Ranges); } -TEST_F(LibclangParseTest, EvaluateChildExpression) { - std::string Main = "main.m"; - WriteFile(Main, "#define kFOO @\"foo\"\n" - "void foobar(void) {\n" - " {kFOO;}\n" - "}\n"); - ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, nullptr, - 0, TUFlags); - - CXCursor C = clang_getTranslationUnitCursor(ClangTU); - clang_visitChildren( - C, - [](CXCursor cursor, CXCursor parent, - CXClientData client_data) -> CXChildVisitResult { -if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) { - int numberedStmt = 0; - clang_visitChildren( - cursor, - [](CXCursor cursor, CXCursor parent, - CXClientData client_data) -> CXChildVisitResult { -int = *((int *)client_data); -if (clang_getCursorKind(cursor) == CXCursor_CompoundStmt) { - if (numberedStmt) { -CXEvalResult RE = clang_Cursor_Evaluate(cursor); -EXPECT_NE(RE, nullptr); -EXPECT_EQ(clang_EvalResult_getKind(RE), - CXEval_ObjCStrLiteral); -return CXChildVisit_Break; - } - numberedStmt++; -} -return CXChildVisit_Recurse; - }, - ); - EXPECT_EQ(numberedStmt, 1); -} -return CXChildVisit_Continue; - }, - nullptr); -} - class LibclangReparseTest : public LibclangParseTest { public: void DisplayDiagnostics() { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r336715 - Revert r336591 "[libclang] NFC, simplify clang_Cursor_Evaluate"
Author: eugenis Date: Tue Jul 10 12:48:53 2018 New Revision: 336715 URL: http://llvm.org/viewvc/llvm-project?rev=336715=rev Log: Revert r336591 "[libclang] NFC, simplify clang_Cursor_Evaluate" This change is blocking r336590 which is being reverted due to memory leaks. Modified: cfe/trunk/tools/libclang/CIndex.cpp Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=336715=336714=336715=diff == --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Tue Jul 10 12:48:53 2018 @@ -3889,32 +3889,33 @@ static const ExprEvalResult* evaluateExp return nullptr; } -static const Expr *evaluateDeclExpr(const Decl *D) { - if (!D) -return nullptr; - if (auto *Var = dyn_cast(D)) -return Var->getInit(); - else if (auto *Field = dyn_cast(D)) -return Field->getInClassInitializer(); - return nullptr; -} - -static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) { - assert(CS && "invalid compound statement"); - for (auto *bodyIterator : CS->body()) { -if (const auto *E = dyn_cast(bodyIterator)) - return E; +CXEvalResult clang_Cursor_Evaluate(CXCursor C) { + if (clang_getCursorKind(C) == CXCursor_CompoundStmt) { +const CompoundStmt *compoundStmt = cast(getCursorStmt(C)); +Expr *expr = nullptr; +for (auto *bodyIterator : compoundStmt->body()) { + if ((expr = dyn_cast(bodyIterator))) { +break; + } +} +if (expr) + return const_cast( + reinterpret_cast(evaluateExpr(expr, C))); } - return nullptr; -} -CXEvalResult clang_Cursor_Evaluate(CXCursor C) { - if (const Expr *E = - clang_getCursorKind(C) == CXCursor_CompoundStmt - ? evaluateCompoundStmtExpr(cast(getCursorStmt(C))) - : evaluateDeclExpr(getCursorDecl(C))) -return const_cast( -reinterpret_cast(evaluateExpr(const_cast(E), C))); + const Decl *D = getCursorDecl(C); + if (D) { +const Expr *expr = nullptr; +if (auto *Var = dyn_cast(D)) { + expr = Var->getInit(); +} else if (auto *Field = dyn_cast(D)) { + expr = Field->getInClassInitializer(); +} +if (expr) + return const_cast(reinterpret_cast( + evaluateExpr(const_cast(expr), C))); +return nullptr; + } return nullptr; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r335684 - Revert "[MS] Use mangled names and comdats for string merging with ASan"
Author: eugenis Date: Tue Jun 26 16:10:48 2018 New Revision: 335684 URL: http://llvm.org/viewvc/llvm-project?rev=335684=rev Log: Revert "[MS] Use mangled names and comdats for string merging with ASan" Depends on r334313, which has been reverted in r335681. Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=335684=335683=335684=diff == --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Jun 26 16:10:48 2018 @@ -4155,13 +4155,15 @@ CodeGenModule::GetAddrOfConstantStringFr StringRef GlobalVariableName; llvm::GlobalValue::LinkageTypes LT; - // Mangle the string literal if that's how the ABI merges duplicate strings. - // Don't do it if they are writable, since we don't want writes in one TU to - // affect strings in another. - if (getCXXABI().getMangleContext().shouldMangleStringLiteral(S) && - !LangOpts.WritableStrings) { + // Mangle the string literal if the ABI allows for it. However, we cannot + // do this if we are compiling with ASan or -fwritable-strings because they + // rely on strings having normal linkage. + if (!LangOpts.WritableStrings && + !LangOpts.Sanitize.has(SanitizerKind::Address) && + getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) { llvm::raw_svector_ostream Out(MangledNameBuffer); getCXXABI().getMangleContext().mangleStringLiteral(S, Out); + LT = llvm::GlobalValue::LinkOnceODRLinkage; GlobalVariableName = MangledNameBuffer; } else { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r335305 - Ignore blacklist when generating __cfi_check_fail.
Author: eugenis Date: Thu Jun 21 16:22:37 2018 New Revision: 335305 URL: http://llvm.org/viewvc/llvm-project?rev=335305=rev Log: Ignore blacklist when generating __cfi_check_fail. Summary: Fixes PR37898. Reviewers: pcc, vlad.tsyrklevich Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D48454 Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/test/CodeGen/cfi-check-fail2.c Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=335305=335304=335305=diff == --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Jun 21 16:22:37 2018 @@ -3075,6 +3075,11 @@ void CodeGenFunction::EmitCfiCheckFail() StartFunction(GlobalDecl(), CGM.getContext().VoidTy, F, FI, Args, SourceLocation()); + // This function should not be affected by blacklist. This function does + // not have a source location, but "src:*" would still apply. Revert any + // changes to SanOpts made in StartFunction. + SanOpts = CGM.getLangOpts().Sanitize; + llvm::Value *Data = EmitLoadOfScalar(GetAddrOfLocalVar(), /*Volatile=*/false, CGM.getContext().VoidPtrTy, ArgData.getLocation()); Modified: cfe/trunk/test/CodeGen/cfi-check-fail2.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/cfi-check-fail2.c?rev=335305=335304=335305=diff == --- cfe/trunk/test/CodeGen/cfi-check-fail2.c (original) +++ cfe/trunk/test/CodeGen/cfi-check-fail2.c Thu Jun 21 16:22:37 2018 @@ -3,6 +3,12 @@ // RUN: -fsanitize=cfi-vcall \ // RUN: -emit-llvm -o - %s | FileCheck %s +// Check that blacklist does not affect generated code. +// RUN: echo "src:*" > %t-all.blacklist +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize-cfi-cross-dso \ +// RUN: -fsanitize=cfi-vcall -fsanitize-blacklist=%t-all.blacklist \ +// RUN: -emit-llvm -o - %s | FileCheck %s + void caller(void (*f)()) { f(); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r335193 - ASan docs: no_sanitize("address") works on globals.
Author: eugenis Date: Wed Jun 20 17:16:32 2018 New Revision: 335193 URL: http://llvm.org/viewvc/llvm-project?rev=335193=rev Log: ASan docs: no_sanitize("address") works on globals. Summary: Mention that no_sanitize attribute can be used with globals. Reviewers: alekseyshl Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D48390 Modified: cfe/trunk/docs/AddressSanitizer.rst cfe/trunk/include/clang/Basic/AttrDocs.td Modified: cfe/trunk/docs/AddressSanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/AddressSanitizer.rst?rev=335193=335192=335193=diff == --- cfe/trunk/docs/AddressSanitizer.rst (original) +++ cfe/trunk/docs/AddressSanitizer.rst Wed Jun 20 17:16:32 2018 @@ -197,13 +197,17 @@ this purpose. Disabling Instrumentation with ``__attribute__((no_sanitize("address")))`` -- -Some code should not be instrumented by AddressSanitizer. One may use the -function attribute ``__attribute__((no_sanitize("address")))`` (which has -deprecated synonyms `no_sanitize_address` and `no_address_safety_analysis`) to -disable instrumentation of a particular function. This attribute may not be -supported by other compilers, so we suggest to use it together with +Some code should not be instrumented by AddressSanitizer. One may use +the attribute ``__attribute__((no_sanitize("address")))`` (which has +deprecated synonyms `no_sanitize_address` and +`no_address_safety_analysis`) to disable instrumentation of a +particular function. This attribute may not be supported by other +compilers, so we suggest to use it together with ``__has_feature(address_sanitizer)``. +The same attribute used on a global variable prevents AddressSanitizer +from adding redzones around it and detecting out of bounds accesses. + Suppressing Errors in Recompiled Code (Blacklist) - Modified: cfe/trunk/include/clang/Basic/AttrDocs.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrDocs.td?rev=335193=335192=335193=diff == --- cfe/trunk/include/clang/Basic/AttrDocs.td (original) +++ cfe/trunk/include/clang/Basic/AttrDocs.td Wed Jun 20 17:16:32 2018 @@ -1804,13 +1804,14 @@ This attribute accepts a single paramete def NoSanitizeDocs : Documentation { let Category = DocCatFunction; let Content = [{ -Use the ``no_sanitize`` attribute on a function declaration to specify -that a particular instrumentation or set of instrumentations should not be -applied to that function. The attribute takes a list of string literals, -which have the same meaning as values accepted by the ``-fno-sanitize=`` -flag. For example, ``__attribute__((no_sanitize("address", "thread")))`` -specifies that AddressSanitizer and ThreadSanitizer should not be applied -to the function. +Use the ``no_sanitize`` attribute on a function or a global variable +declaration to specify that a particular instrumentation or set of +instrumentations should not be applied. The attribute takes a list of +string literals, which have the same meaning as values accepted by the +``-fno-sanitize=`` flag. For example, +``__attribute__((no_sanitize("address", "thread")))`` specifies that +AddressSanitizer and ThreadSanitizer should not be applied to the +function or variable. See :ref:`Controlling Code Generation ` for a full list of supported sanitizer flags. @@ -1825,9 +1826,9 @@ def NoSanitizeAddressDocs : Documentatio let Content = [{ .. _langext-address_sanitizer: -Use ``__attribute__((no_sanitize_address))`` on a function declaration to -specify that address safety instrumentation (e.g. AddressSanitizer) should -not be applied to that function. +Use ``__attribute__((no_sanitize_address))`` on a function or a global +variable declaration to specify that address safety instrumentation +(e.g. AddressSanitizer) should not be applied. }]; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r329241 - Enable msan unconditionally on Linux.
Author: eugenis Date: Wed Apr 4 16:48:06 2018 New Revision: 329241 URL: http://llvm.org/viewvc/llvm-project?rev=329241=rev Log: Enable msan unconditionally on Linux. Memory sanitizer compatibility are already done in MemorySanitizer::doInitialization. It verifies whether the necessary offsets exist and bails out if not. For this reason it is no good to duplicate two checks in two projects. This patch removes clang check and postpones msan compatibility validation till MemorySanitizer::doInitialization. Another reason for this patch is to allow using msan with any CPU (given compatible runtime) and custom mapping provided via the arguments added by https://reviews.llvm.org/D44926. Patch by vit9696. Differential Revision: https://reviews.llvm.org/D44927 Modified: cfe/trunk/lib/Driver/ToolChains/Linux.cpp cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/lib/Driver/ToolChains/Linux.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Linux.cpp?rev=329241=329240=329241=diff == --- cfe/trunk/lib/Driver/ToolChains/Linux.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Linux.cpp Wed Apr 4 16:48:06 2018 @@ -884,6 +884,7 @@ SanitizerMask Linux::getSupportedSanitiz Res |= SanitizerKind::Fuzzer; Res |= SanitizerKind::FuzzerNoLink; Res |= SanitizerKind::KernelAddress; + Res |= SanitizerKind::Memory; Res |= SanitizerKind::Vptr; Res |= SanitizerKind::SafeStack; if (IsX86_64 || IsMIPS64 || IsAArch64) @@ -892,8 +893,6 @@ SanitizerMask Linux::getSupportedSanitiz Res |= SanitizerKind::Leak; if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64) Res |= SanitizerKind::Thread; - if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64) -Res |= SanitizerKind::Memory; if (IsX86_64 || IsMIPS64) Res |= SanitizerKind::Efficiency; if (IsX86 || IsX86_64) Modified: cfe/trunk/test/Driver/fsanitize.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=329241=329240=329241=diff == --- cfe/trunk/test/Driver/fsanitize.c (original) +++ cfe/trunk/test/Driver/fsanitize.c Wed Apr 4 16:48:06 2018 @@ -308,9 +308,6 @@ // CHECK-DIAG1: unsupported argument 'zzz' to option 'fsanitize=' // CHECK-DIAG1-NOT: unsupported argument 'zzz' to option 'fsanitize=' -// RUN: %clang -target i686-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MSAN-X86 -// CHECK-MSAN-X86: error: unsupported option '-fsanitize=memory' for target 'i686--linux-gnu' - // RUN: %clang -target x86_64-apple-darwin10 -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MSAN-DARWIN // CHECK-MSAN-DARWIN: unsupported option '-fsanitize=memory' for target 'x86_64-apple-darwin10' ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r327165 - Don't use -pie in relocatable link.
Author: eugenis Date: Fri Mar 9 11:35:16 2018 New Revision: 327165 URL: http://llvm.org/viewvc/llvm-project?rev=327165=rev Log: Don't use -pie in relocatable link. Summary: Android, in particular, got PIE enabled by default in r316606. It resulted in relocatable links passing both -r and -pie to the linker, which is not allowed. Reviewers: srhines Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D44229 Modified: cfe/trunk/lib/Driver/ToolChains/Gnu.cpp cfe/trunk/test/Driver/android-pie.c Modified: cfe/trunk/lib/Driver/ToolChains/Gnu.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Gnu.cpp?rev=327165=327164=327165=diff == --- cfe/trunk/lib/Driver/ToolChains/Gnu.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Gnu.cpp Fri Mar 9 11:35:16 2018 @@ -307,7 +307,8 @@ static const char *getLDMOption(const ll } static bool getPIE(const ArgList , const toolchains::Linux ) { - if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static)) + if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static) || + Args.hasArg(options::OPT_r)) return false; Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie, Modified: cfe/trunk/test/Driver/android-pie.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/android-pie.c?rev=327165=327164=327165=diff == --- cfe/trunk/test/Driver/android-pie.c (original) +++ cfe/trunk/test/Driver/android-pie.c Fri Mar 9 11:35:16 2018 @@ -64,3 +64,20 @@ // RUN: | FileCheck --check-prefix=NO-PIE %s // RUN: %clang %s -### -o %t.o 2>&1 -pie -no-pie --target=arm-linux-androideabi24 \ // RUN: | FileCheck --check-prefix=NO-PIE %s + +// Static/shared/relocatable disable -pie + +// RUN: %clang %s -### --target=aarch64-linux-android -static 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-STATIC +// CHECK-STATIC-NOT: "-pie" +// CHECK-STATIC: -static + +// RUN: %clang %s -### --target=aarch64-linux-android -shared 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-SHARED +// CHECK-SHARED-NOT: "-pie" +// CHECK-SHARED: "-shared" + +// RUN: %clang %s -### --target=aarch64-linux-android -r 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-RELOCATABLE +// CHECK-RELOCATABLE-NOT: "-pie" +// CHECK-RELOCATABLE: "-r" ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r324163 - [hwasan] Add a paragraph on stack instrumentation.
Author: eugenis Date: Fri Feb 2 17:06:21 2018 New Revision: 324163 URL: http://llvm.org/viewvc/llvm-project?rev=324163=rev Log: [hwasan] Add a paragraph on stack instrumentation. Reviewers: kcc Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D42874 Modified: cfe/trunk/docs/HardwareAssistedAddressSanitizerDesign.rst Modified: cfe/trunk/docs/HardwareAssistedAddressSanitizerDesign.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/HardwareAssistedAddressSanitizerDesign.rst?rev=324163=324162=324163=diff == --- cfe/trunk/docs/HardwareAssistedAddressSanitizerDesign.rst (original) +++ cfe/trunk/docs/HardwareAssistedAddressSanitizerDesign.rst Fri Feb 2 17:06:21 2018 @@ -77,11 +77,18 @@ This can be based on any malloc that for Stack - -Special compiler instrumentation is required to align the local variables -by N, tag the memory and the pointers. +Stack frames are instrumented by aligning all non-promotable allocas +by `N` and tagging stack memory in function prologue and epilogue. + +Tags for different allocas in one function are **not** generated +independently; doing that in a function with `M` allocas would require +maintaining `M` live stack pointers, significantly increasing register +pressure. Instead we generate a single base tag value in the prologue, +and build the tag for alloca number `M` as `ReTag(BaseTag, M)`, where +ReTag can be as simple as exclusive-or with constant `M`. + Stack instrumentation is expected to be a major source of overhead, but could be optional. -TODO: details. Globals --- ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r321203 - [hwasan] Implement -fsanitize-recover=hwaddress.
Author: eugenis Date: Wed Dec 20 11:05:44 2017 New Revision: 321203 URL: http://llvm.org/viewvc/llvm-project?rev=321203=rev Log: [hwasan] Implement -fsanitize-recover=hwaddress. Summary: Very similar to AddressSanitizer, with the exception of the error type encoding. Reviewers: kcc, alekseyshl Subscribers: cfe-commits, kubamracek, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D41417 Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=321203=321202=321203=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Wed Dec 20 11:05:44 2017 @@ -239,7 +239,11 @@ static void addKernelAddressSanitizerPas static void addHWAddressSanitizerPasses(const PassManagerBuilder , legacy::PassManagerBase ) { - PM.add(createHWAddressSanitizerPass()); + const PassManagerBuilderWrapper = + static_cast(Builder); + const CodeGenOptions = BuilderWrapper.getCGOpts(); + bool Recover = CGOpts.SanitizeRecover.has(SanitizerKind::HWAddress); + PM.add(createHWAddressSanitizerPass(Recover)); } static void addMemorySanitizerPass(const PassManagerBuilder , ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r320233 - Fix fsanitize-blacklist test on Windows.
Author: eugenis Date: Fri Dec 8 18:15:42 2017 New Revision: 320233 URL: http://llvm.org/viewvc/llvm-project?rev=320233=rev Log: Fix fsanitize-blacklist test on Windows. Broken in r320232. Modified: cfe/trunk/test/Driver/fsanitize-blacklist.c Modified: cfe/trunk/test/Driver/fsanitize-blacklist.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize-blacklist.c?rev=320233=320232=320233=diff == --- cfe/trunk/test/Driver/fsanitize-blacklist.c (original) +++ cfe/trunk/test/Driver/fsanitize-blacklist.c Fri Dec 8 18:15:42 2017 @@ -22,9 +22,9 @@ // Check that the default blacklist is not added as an extra dependency. // RUN: %clang -target x86_64-linux-gnu -fsanitize=address -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-BLACKLIST-ASAN --implicit-check-not=fdepfile-entry -// CHECK-DEFAULT-BLACKLIST-ASAN: -fsanitize-blacklist={{.*}}/asan_blacklist.txt +// CHECK-DEFAULT-BLACKLIST-ASAN: -fsanitize-blacklist={{.*[^w]}}asan_blacklist.txt // RUN: %clang -target aarch64-linux-gnu -fsanitize=hwaddress -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-BLACKLIST-HWASAN --implicit-check-not=fdepfile-entry -// CHECK-DEFAULT-BLACKLIST-HWASAN: -fsanitize-blacklist={{.*}}/hwasan_blacklist.txt +// CHECK-DEFAULT-BLACKLIST-HWASAN: -fsanitize-blacklist={{.*}}hwasan_blacklist.txt // RUN: %clang -target x86_64-linux-gnu -fsanitize=integer -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry // RUN: %clang -target x86_64-linux-gnu -fsanitize=nullability -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r320232 - Hardware-assisted AddressSanitizer (clang part).
Author: eugenis Date: Fri Dec 8 17:32:07 2017 New Revision: 320232 URL: http://llvm.org/viewvc/llvm-project?rev=320232=rev Log: Hardware-assisted AddressSanitizer (clang part). Summary: Driver, frontend and LLVM codegen for HWASan. A clone of ASan, basically. Reviewers: kcc, pcc, alekseyshl Subscribers: srhines, javed.absar, cfe-commits Differential Revision: https://reviews.llvm.org/D40936 Added: cfe/trunk/test/CodeGen/address-safety-attr-kasan-hwasan.cpp cfe/trunk/test/Driver/Inputs/resource_dir/hwasan_blacklist.txt cfe/trunk/test/Driver/Inputs/resource_dir/lib/linux/libclang_rt.hwasan-aarch64.a.syms Modified: cfe/trunk/include/clang/Basic/Sanitizers.def cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/CodeGen/BackendUtil.cpp cfe/trunk/lib/CodeGen/CGDeclCXX.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp cfe/trunk/lib/Driver/ToolChains/Linux.cpp cfe/trunk/lib/Lex/PPMacroExpansion.cpp cfe/trunk/test/Driver/asan.c cfe/trunk/test/Driver/fsanitize-blacklist.c cfe/trunk/test/Driver/fsanitize-coverage.c cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/Driver/sanitize_unwind_tables.c cfe/trunk/test/Driver/sanitizer-ld.c cfe/trunk/test/Lexer/has_feature_address_sanitizer.cpp cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp Modified: cfe/trunk/include/clang/Basic/Sanitizers.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Sanitizers.def?rev=320232=320231=320232=diff == --- cfe/trunk/include/clang/Basic/Sanitizers.def (original) +++ cfe/trunk/include/clang/Basic/Sanitizers.def Fri Dec 8 17:32:07 2017 @@ -44,6 +44,8 @@ SANITIZER("address", Address) // Kernel AddressSanitizer (KASan) SANITIZER("kernel-address", KernelAddress) +SANITIZER("hwaddress", HWAddress) + // MemorySanitizer SANITIZER("memory", Memory) Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=320232=320231=320232=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Fri Dec 8 17:32:07 2017 @@ -55,12 +55,14 @@ class SanitizerArgs { bool needsSharedRt() const { return SharedRuntime; } bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); } + bool needsHwasanRt() const { return Sanitizers.has(SanitizerKind::HWAddress); } bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); } bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); } bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); } bool needsLsanRt() const { return Sanitizers.has(SanitizerKind::Leak) && - !Sanitizers.has(SanitizerKind::Address); + !Sanitizers.has(SanitizerKind::Address) && + !Sanitizers.has(SanitizerKind::HWAddress); } bool needsUbsanRt() const; bool requiresMinimalRuntime() const { return MinimalRuntime; } Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=320232=320231=320232=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Fri Dec 8 17:32:07 2017 @@ -237,6 +237,11 @@ static void addKernelAddressSanitizerPas /*Recover*/true)); } +static void addHWAddressSanitizerPasses(const PassManagerBuilder , +legacy::PassManagerBase ) { + PM.add(createHWAddressSanitizerPass()); +} + static void addMemorySanitizerPass(const PassManagerBuilder , legacy::PassManagerBase ) { const PassManagerBuilderWrapper = @@ -556,6 +561,13 @@ void EmitAssemblyHelper::CreatePasses(le addKernelAddressSanitizerPasses); } + if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) { +PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast, + addHWAddressSanitizerPasses); +PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, + addHWAddressSanitizerPasses); + } + if (LangOpts.Sanitize.has(SanitizerKind::Memory)) { PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast, addMemorySanitizerPass); Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=320232=320231=320232=diff
r316606 - Enable -pie and --enable-new-dtags by default on Android.
Author: eugenis Date: Wed Oct 25 13:39:22 2017 New Revision: 316606 URL: http://llvm.org/viewvc/llvm-project?rev=316606=rev Log: Enable -pie and --enable-new-dtags by default on Android. Summary: Also enable -no-pie on Gnu toolchain (previously available on Darwin only). Non-PIE executables won't even start on recent Android, and DT_RPATH is ignored by the loader. Reviewers: srhines, danalbert Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D38430 Added: cfe/trunk/test/Driver/android-pie.c Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/Gnu.cpp cfe/trunk/lib/Driver/ToolChains/Linux.cpp cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/Driver/linux-ld.c cfe/trunk/test/Driver/pic.c cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=316606=316605=316606=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Wed Oct 25 13:39:22 2017 @@ -622,7 +622,7 @@ SanitizerArgs::SanitizerArgs(const ToolC ImplicitCfiRuntime = TC.getTriple().isAndroid(); if (AllAddedKinds & Address) { -NeedPIE |= TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); +NeedPIE |= TC.getTriple().isOSFuchsia(); if (Arg *A = Args.getLastArg(options::OPT_fsanitize_address_field_padding)) { StringRef S = A->getValue(); Modified: cfe/trunk/lib/Driver/ToolChains/Gnu.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Gnu.cpp?rev=316606=316605=316606=diff == --- cfe/trunk/lib/Driver/ToolChains/Gnu.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Gnu.cpp Wed Oct 25 13:39:22 2017 @@ -282,6 +282,17 @@ static const char *getLDMOption(const ll } } +static bool getPIE(const ArgList , const toolchains::Linux ) { + if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static)) +return false; + + Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie, + options::OPT_nopie); + if (!A) +return ToolChain.isPIEDefault(); + return A->getOption().matches(options::OPT_pie); +} + void tools::gnutools::Linker::ConstructJob(Compilation , const JobAction , const InputInfo , const InputInfoList , @@ -296,9 +307,7 @@ void tools::gnutools::Linker::ConstructJ const llvm::Triple::ArchType Arch = ToolChain.getArch(); const bool isAndroid = ToolChain.getTriple().isAndroid(); const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU(); - const bool IsPIE = - !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) && - (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault()); + const bool IsPIE = getPIE(Args, ToolChain); const bool HasCRTBeginEndFiles = ToolChain.getTriple().hasEnvironment() || (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies); Modified: cfe/trunk/lib/Driver/ToolChains/Linux.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Linux.cpp?rev=316606=316605=316606=diff == --- cfe/trunk/lib/Driver/ToolChains/Linux.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Linux.cpp Wed Oct 25 13:39:22 2017 @@ -248,7 +248,7 @@ Linux::Linux(const Driver , const llvm ExtraOpts.push_back("--build-id"); #endif - if (Distro.IsOpenSUSE()) + if (IsAndroid || Distro.IsOpenSUSE()) ExtraOpts.push_back("--enable-new-dtags"); // The selection of paths to try here is designed to match the patterns which @@ -810,7 +810,10 @@ void Linux::AddIAMCUIncludeArgs(const Ar } } -bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); } +bool Linux::isPIEDefault() const { + return (getTriple().isAndroid() && !getTriple().isAndroidVersionLT(16)) || + getSanitizerArgs().requiresPIE(); +} SanitizerMask Linux::getSupportedSanitizers() const { const bool IsX86 = getTriple().getArch() == llvm::Triple::x86; Added: cfe/trunk/test/Driver/android-pie.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/android-pie.c?rev=316606=auto == --- cfe/trunk/test/Driver/android-pie.c (added) +++ cfe/trunk/test/Driver/android-pie.c Wed Oct 25 13:39:22 2017 @@ -0,0 +1,66 @@ +// NO-PIE-NOT: "-pie" +// PIE: "-pie" + +// RUN: %clang %s -### -o %t.o 2>&1 --target=arm-linux-androideabi \ +// RUN: | FileCheck --check-prefix=NO-PIE %s +// RUN: %clang %s -### -o %t.o 2>&1 --target=arm-linux-android \ +// RUN: | FileCheck --check-prefix=NO-PIE %s +// RUN: %clang %s -###
r315921 - Do not link clang_rt.cfi on Android.
Author: eugenis Date: Mon Oct 16 11:02:57 2017 New Revision: 315921 URL: http://llvm.org/viewvc/llvm-project?rev=315921=rev Log: Do not link clang_rt.cfi on Android. Summary: The OS provides cross-dso CFI support starting with Android O. Trapping mode does not require any runtime at all, and diagnostic mode requires just ubsan-standalone. Reviewers: pcc Subscribers: srhines, cfe-commits Differential Revision: https://reviews.llvm.org/D38908 Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=315921=315920=315921=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Mon Oct 16 11:02:57 2017 @@ -44,6 +44,8 @@ class SanitizerArgs { bool TsanFuncEntryExit = true; bool TsanAtomics = true; bool MinimalRuntime = false; + // True if cross-dso CFI support if provided by the system (i.e. Android). + bool ImplicitCfiRuntime = false; public: /// Parses the sanitizer arguments from an argument list. Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=315921=315920=315921=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Mon Oct 16 11:02:57 2017 @@ -171,19 +171,23 @@ static SanitizerMask parseSanitizeTrapAr } bool SanitizerArgs::needsUbsanRt() const { - return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || - CoverageFeatures) && - !Sanitizers.has(Address) && !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && !Sanitizers.has(DataFlow) && - !Sanitizers.has(Leak) && !CfiCrossDso; + // All of these include ubsan. + if (needsAsanRt() || needsMsanRt() || needsTsanRt() || needsDfsanRt() || + needsLsanRt() || needsCfiDiagRt()) +return false; + + return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || + CoverageFeatures; } bool SanitizerArgs::needsCfiRt() const { - return !(Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso; + return !(Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso && + !ImplicitCfiRuntime; } bool SanitizerArgs::needsCfiDiagRt() const { - return (Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso; + return (Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso && + !ImplicitCfiRuntime; } bool SanitizerArgs::requiresPIE() const { @@ -615,6 +619,8 @@ SanitizerArgs::SanitizerArgs(const ToolC TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia() || TC.getTriple().isOSDarwin()); + ImplicitCfiRuntime = TC.getTriple().isAndroid(); + if (AllAddedKinds & Address) { NeedPIE |= TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); if (Arg *A = Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=315921=315920=315921=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Mon Oct 16 11:02:57 2017 @@ -508,6 +508,24 @@ // CHECK-CFI-CROSS-DSO-DIAG-LINUX: "-whole-archive" "{{[^"]*}}libclang_rt.cfi_diag-x86_64.a" "-no-whole-archive" // CHECK-CFI-CROSS-DSO-DIAG-LINUX: -export-dynamic +// Cross-DSO CFI on Android does not link runtime libraries. +// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso %s -### -o %t.o 2>&1 \ +// RUN: -target aarch64-linux-android -fuse-ld=ld \ +// RUN: --sysroot=%S/Inputs/basic_android_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CFI-CROSS-DSO-ANDROID %s +// CHECK-CFI-CROSS-DSO-ANDROID: "{{.*}}ld{{(.exe)?}}" +// CHECK-CFI-CROSS-DSO-ANDROID-NOT: libclang_rt. + +// Cross-DSO CFI with diagnostics on Android links just the UBSAN runtime. +// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso %s -### -o %t.o 2>&1 \ +// RUN: -fno-sanitize-trap=cfi -fsanitize-recover=cfi \ +// RUN: -target aarch64-linux-android -fuse-ld=ld \ +// RUN: --sysroot=%S/Inputs/basic_android_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CFI-CROSS-DSO-DIAG-ANDROID %s +// CHECK-CFI-CROSS-DSO-DIAG-ANDROID: "{{.*}}ld{{(.exe)?}}" +// CHECK-CFI-CROSS-DSO-DIAG-ANDROID: "{{[^"]*}}libclang_rt.ubsan_standalone-aarch64-android.so" +// CHECK-CFI-CROSS-DSO-DIAG-ANDROID: "-export-dynamic-symbol=__cfi_check" + // RUN: %clangxx -fsanitize=address %s -### -o %t.o 2>&1 \ // RUN: -mmacosx-version-min=10.6 \ // RUN: -target x86_64-apple-darwin13.4.0 -fuse-ld=ld
r315015 - Cleanup and generalize -shared-libasan.
Author: eugenis Date: Thu Oct 5 13:14:00 2017 New Revision: 315015 URL: http://llvm.org/viewvc/llvm-project?rev=315015=rev Log: Cleanup and generalize -shared-libasan. Summary: * Rename -shared-libasan to -shared-libsan, keeping the old name as alias. * Add -static-libsan for targets that default to shared. * Remove an Android special case. It is now possible (but untested) to use static compiler-rt libraries there. * Support libclang_rt.ubsan_standalone as a shared library. Unlike GCC, this change applies -shared-libsan / -static-libsan to all sanitizers. I don't see a point in multiple flags like -shared-libubsan, considering that most sanitizers are not compatible with each other, and each link has basically a single shared/static choice. Reviewers: vitalybuka, kcc, rsmith Subscribers: srhines, cfe-commits Differential Revision: https://reviews.llvm.org/D38525 Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp cfe/trunk/lib/Driver/ToolChains/Fuchsia.cpp cfe/trunk/lib/Driver/ToolChains/MSVC.cpp cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=315015=315014=315015=diff == --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Thu Oct 5 13:14:00 2017 @@ -592,7 +592,9 @@ def fapple_kext : Flag<["-"], "fapple-ke HelpText<"Use Apple's kernel extensions ABI">; def fapple_pragma_pack : Flag<["-"], "fapple-pragma-pack">, Group, Flags<[CC1Option]>, HelpText<"Enable Apple gcc-compatible #pragma pack handling">; -def shared_libasan : Flag<["-"], "shared-libasan">; +def shared_libsan : Flag<["-"], "shared-libsan">; +def static_libsan : Flag<["-"], "static-libsan">; +def : Flag<["-"], "shared-libasan">, Alias; def fasm : Flag<["-"], "fasm">, Group; def fasm_blocks : Flag<["-"], "fasm-blocks">, Group, Flags<[CC1Option]>; Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=315015=315014=315015=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Thu Oct 5 13:14:00 2017 @@ -33,7 +33,7 @@ class SanitizerArgs { bool MsanUseAfterDtor = false; bool CfiCrossDso = false; int AsanFieldPadding = 0; - bool AsanSharedRuntime = false; + bool SharedRuntime = false; bool AsanUseAfterScope = true; bool AsanGlobalsDeadStripping = false; bool LinkCXXRuntimes = false; @@ -49,8 +49,9 @@ class SanitizerArgs { /// Parses the sanitizer arguments from an argument list. SanitizerArgs(const ToolChain , const llvm::opt::ArgList ); + bool needsSharedRt() const { return SharedRuntime; } + bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); } - bool needsSharedAsanRt() const { return AsanSharedRuntime; } bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); } bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); } bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); } Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=315015=315014=315015=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Thu Oct 5 13:14:00 2017 @@ -610,10 +610,11 @@ SanitizerArgs::SanitizerArgs(const ToolC CoverageFeatures |= CoverageFunc; } + SharedRuntime = + Args.hasFlag(options::OPT_shared_libsan, options::OPT_static_libsan, + TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia()); + if (AllAddedKinds & Address) { -AsanSharedRuntime = -Args.hasArg(options::OPT_shared_libasan) || -TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); NeedPIE |= TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); if (Arg *A = Args.getLastArg(options::OPT_fsanitize_address_field_padding)) { Modified: cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp?rev=315015=315014=315015=diff == --- cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp Thu Oct 5 13:14:00 2017 @@ -560,8 +560,20 @@ collectSanitizerRuntimes(const ToolChain SmallVectorImpl ) { const
r312361 - Enable check-ubsan-minimal in standalone compiler-rt build.
Author: eugenis Date: Fri Sep 1 13:37:20 2017 New Revision: 312361 URL: http://llvm.org/viewvc/llvm-project?rev=312361=rev Log: Enable check-ubsan-minimal in standalone compiler-rt build. Modified: cfe/trunk/runtime/CMakeLists.txt Modified: cfe/trunk/runtime/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/runtime/CMakeLists.txt?rev=312361=312360=312361=diff == --- cfe/trunk/runtime/CMakeLists.txt (original) +++ cfe/trunk/runtime/CMakeLists.txt Fri Sep 1 13:37:20 2017 @@ -108,7 +108,7 @@ if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND E USES_TERMINAL) # Add top-level targets that build specific compiler-rt runtimes. - set(COMPILER_RT_RUNTIMES asan builtins dfsan lsan msan profile tsan ubsan) + set(COMPILER_RT_RUNTIMES asan builtins dfsan lsan msan profile tsan ubsan ubsan-minimal) foreach(runtime ${COMPILER_RT_RUNTIMES}) get_ext_project_build_command(build_runtime_cmd ${runtime}) add_custom_target(${runtime} @@ -125,7 +125,7 @@ if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND E # Add top-level targets for various compiler-rt test suites. set(COMPILER_RT_TEST_SUITES check-asan check-asan-dynamic check-dfsan - check-lsan check-msan check-sanitizer check-tsan check-ubsan + check-lsan check-msan check-sanitizer check-tsan check-ubsan check-ubsan-minimal check-profile check-cfi check-cfi-and-supported check-safestack) foreach(test_suite ${COMPILER_RT_TEST_SUITES}) get_ext_project_build_command(run_test_suite ${test_suite}) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r312048 - Restore clang_rt library name on i686-android.
Author: eugenis Date: Tue Aug 29 15:12:31 2017 New Revision: 312048 URL: http://llvm.org/viewvc/llvm-project?rev=312048=rev Log: Restore clang_rt library name on i686-android. Summary: Recent changes canonicalized clang_rt library names to refer to "i386" on all x86 targets. Android historically uses i686. This change adds a special case to keep i686 in all clang_rt libraries when targeting Android. Reviewers: hans, mgorny, beanz Subscribers: srhines, cfe-commits, llvm-commits Differential Revision: https://reviews.llvm.org/D37278 Modified: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=312048=312047=312048=diff == --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Tue Aug 29 15:12:31 2017 @@ -305,6 +305,10 @@ static StringRef getArchNameForCompilerR ? "armhf" : "arm"; + // For historic reasons, Android library is using i686 instead of i386. + if (TC.getArch() == llvm::Triple::x86 && Triple.isAndroid()) +return "i686"; + return llvm::Triple::getArchTypeName(TC.getArch()); } Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=312048=312047=312048=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Tue Aug 29 15:12:31 2017 @@ -133,6 +133,18 @@ // CHECK-ASAN-ANDROID-NOT: "-lpthread" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target i686-linux-android -fuse-ld=ld -fsanitize=address \ +// RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-ANDROID-X86 %s +// +// CHECK-ASAN-ANDROID-X86: "{{(.*[^.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-ASAN-ANDROID-X86-NOT: "-lc" +// CHECK-ASAN-ANDROID-X86: "-pie" +// CHECK-ASAN-ANDROID-X86-NOT: "-lpthread" +// CHECK-ASAN-ANDROID-X86: libclang_rt.asan-i686-android.so" +// CHECK-ASAN-ANDROID-X86-NOT: "-lpthread" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi -fsanitize=address \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: -shared-libasan \ ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r312029 - Minimal runtime for UBSan.
Author: eugenis Date: Tue Aug 29 13:03:51 2017 New Revision: 312029 URL: http://llvm.org/viewvc/llvm-project?rev=312029=rev Log: Minimal runtime for UBSan. Summary: An implementation of ubsan runtime library suitable for use in production. Minimal attack surface. * No stack traces. * Definitely no C++ demangling. * No UBSAN_OPTIONS=log_file=/path (very suid-unfriendly). And no UBSAN_OPTIONS in general. * as simple as possible Minimal CPU and RAM overhead. * Source locations unnecessary in the presence of (split) debug info. * Values and types (as in A+B overflows T) can be reconstructed from register/stack dumps, once you know what type of error you are looking at. * above two items save 3% binary size. When UBSan is used with -ftrap-function=abort, sometimes it is hard to reason about failures. This library replaces abort with a slightly more informative message without much extra overhead. Since ubsan interface in not stable, this code must reside in compiler-rt. Reviewers: pcc, kcc Subscribers: srhines, mgorny, aprantl, krytarowski, llvm-commits Differential Revision: https://reviews.llvm.org/D36810 Added: cfe/trunk/test/CodeGen/unsigned-overflow-minimal.c Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/include/clang/Frontend/CodeGenOptions.def cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=312029=312028=312029=diff == --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Tue Aug 29 13:03:51 2017 @@ -885,6 +885,10 @@ def fsanitize_undefined_trap_on_error : Group; def fno_sanitize_undefined_trap_on_error : Flag<["-"], "fno-sanitize-undefined-trap-on-error">, Group; +def fsanitize_minimal_runtime : Flag<["-"], "fsanitize-minimal-runtime">, +Group; +def fno_sanitize_minimal_runtime : Flag<["-"], "fno-sanitize-minimal-runtime">, +Group; def fsanitize_link_cxx_runtime : Flag<["-"], "fsanitize-link-c++-runtime">, Group; def fsanitize_cfi_cross_dso : Flag<["-"], "fsanitize-cfi-cross-dso">, Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=312029=312028=312029=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Tue Aug 29 13:03:51 2017 @@ -43,6 +43,7 @@ class SanitizerArgs { bool TsanMemoryAccess = true; bool TsanFuncEntryExit = true; bool TsanAtomics = true; + bool MinimalRuntime = false; public: /// Parses the sanitizer arguments from an argument list. @@ -58,6 +59,7 @@ class SanitizerArgs { !Sanitizers.has(SanitizerKind::Address); } bool needsUbsanRt() const; + bool requiresMinimalRuntime() const { return MinimalRuntime; } bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); } bool needsSafeStackRt() const { return SafeStackRuntime; } bool needsCfiRt() const; Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=312029=312028=312029=diff == --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original) +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Tue Aug 29 13:03:51 2017 @@ -152,6 +152,8 @@ CODEGENOPT(SanitizeMemoryTrackOrigins, 2 CODEGENOPT(SanitizeMemoryUseAfterDtor, 1, 0) ///< Enable use-after-delete detection ///< in MemorySanitizer CODEGENOPT(SanitizeCfiCrossDso, 1, 0) ///< Enable cross-dso support in CFI. +CODEGENOPT(SanitizeMinimalRuntime, 1, 0) ///< Use "_minimal" sanitizer runtime for + ///< diagnostics. CODEGENOPT(SanitizeCoverageType, 2, 0) ///< Type of sanitizer coverage ///< instrumentation. CODEGENOPT(SanitizeCoverageIndirectCalls, 1, 0) ///< Enable sanitizer coverage Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=312029=312028=312029=diff == ---
r307341 - Update Cross-DSO CFI documentation.
Author: eugenis Date: Thu Jul 6 17:48:12 2017 New Revision: 307341 URL: http://llvm.org/viewvc/llvm-project?rev=307341=rev Log: Update Cross-DSO CFI documentation. Reviewers: pcc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D35094 Modified: cfe/trunk/docs/ControlFlowIntegrityDesign.rst Modified: cfe/trunk/docs/ControlFlowIntegrityDesign.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ControlFlowIntegrityDesign.rst?rev=307341=307340=307341=diff == --- cfe/trunk/docs/ControlFlowIntegrityDesign.rst (original) +++ cfe/trunk/docs/ControlFlowIntegrityDesign.rst Thu Jul 6 17:48:12 2017 @@ -437,12 +437,17 @@ export this information, every DSO imple .. code-block:: none - void __cfi_check(uint64 CallSiteTypeId, void *TargetAddr) + void __cfi_check(uint64 CallSiteTypeId, void *TargetAddr, void *DiagData) -This function provides external modules with access to CFI checks for the -targets inside this DSO. For each known ``CallSiteTypeId``, this function -performs an ``llvm.type.test`` with the corresponding type identifier. It -aborts if the type is unknown, or if the check fails. +This function provides external modules with access to CFI checks for +the targets inside this DSO. For each known ``CallSiteTypeId``, this +function performs an ``llvm.type.test`` with the corresponding type +identifier. It reports an error if the type is unknown, or if the +check fails. Depending on the values of compiler flags +``-fsanitize-trap`` and ``-fsanitize-recover``, this function may +print an error, abort and/or return to the caller. ``DiagData`` is an +opaque pointer to the diagnostic information about the error, or +``null`` if the caller does not provide this information. The basic implementation is a large switch statement over all values of CallSiteTypeId supported by this DSO, and each case is similar to @@ -452,11 +457,10 @@ CFI Shadow -- To route CFI checks to the target DSO's __cfi_check function, a -mapping from possible virtual / indirect call targets to -the corresponding __cfi_check functions is maintained. This mapping is +mapping from possible virtual / indirect call targets to the +corresponding __cfi_check functions is maintained. This mapping is implemented as a sparse array of 2 bytes for every possible page (4096 -bytes) of memory. The table is kept readonly (FIXME: not yet) most of -the time. +bytes) of memory. The table is kept readonly most of the time. There are 3 types of shadow values: @@ -481,14 +485,24 @@ them. CFI_SlowPath -The slow path check is implemented in compiler-rt library as +The slow path check is implemented in a runtime support library as .. code-block:: none void __cfi_slowpath(uint64 CallSiteTypeId, void *TargetAddr) + void __cfi_slowpath_diag(uint64 CallSiteTypeId, void *TargetAddr, void *DiagData) -This functions loads a shadow value for ``TargetAddr``, finds the -address of __cfi_check as described above and calls that. +These functions loads a shadow value for ``TargetAddr``, finds the +address of ``__cfi_check`` as described above and calls +that. ``DiagData`` is an opaque pointer to diagnostic data which is +passed verbatim to ``__cfi_check``, and ``__cfi_slowpath`` passes +``nullptr`` instead. + +Compiler-RT library contains reference implementations of slowpath +functions, but they have unresolvable issues with correctness and +performance in the handling of dlopen(). It is recommended that +platforms provide their own implementations, usually as part of libc +or libdl. Position-independent executable requirement --- ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r303114 - [asan] One more test for -fsanitize-address-globals-dead-stripping.
Author: eugenis Date: Mon May 15 15:43:48 2017 New Revision: 303114 URL: http://llvm.org/viewvc/llvm-project?rev=303114=rev Log: [asan] One more test for -fsanitize-address-globals-dead-stripping. Added: cfe/trunk/test/CodeGen/asan-no-globals-no-comdat.cpp Added: cfe/trunk/test/CodeGen/asan-no-globals-no-comdat.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/asan-no-globals-no-comdat.cpp?rev=303114=auto == --- cfe/trunk/test/CodeGen/asan-no-globals-no-comdat.cpp (added) +++ cfe/trunk/test/CodeGen/asan-no-globals-no-comdat.cpp Mon May 15 15:43:48 2017 @@ -0,0 +1,11 @@ +// Test that on Linux asan constructor is placed in a comdat iff globals-gc is on. +// Even if there are no globals in the module. + +// RUN: %clang_cc1 -fsanitize=address -fsanitize-address-globals-dead-stripping -emit-llvm -o - -triple x86_64-linux %s | FileCheck %s --check-prefix=WITHOUT-GC +// RUN: %clang_cc1 -fsanitize=address -fsanitize-address-globals-dead-stripping -fdata-sections -emit-llvm -o - -triple x86_64-linux %s | FileCheck %s --check-prefix=WITH-GC +// RUN: %clang_cc1 -fsanitize=address -fsanitize-address-globals-dead-stripping -fno-integrated-as -fdata-sections -emit-llvm -o - -triple x86_64-linux %s | FileCheck %s --check-prefix=WITHOUT-GC +// RUN: %clang_cc1 -fsanitize=address -fsanitize-address-globals-dead-stripping -fno-integrated-as -emit-llvm -o - -triple x86_64-linux %s | FileCheck %s --check-prefix=WITHOUT-GC +// RUN: %clang_cc1 -fsanitize=address -fdata-sections -emit-llvm -o - -triple x86_64-linux %s | FileCheck %s --check-prefix=WITHOUT-GC + +// WITH-GC: define internal void @asan.module_ctor() comdat { +// WITHOUT-GC: define internal void @asan.module_ctor() { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r302594 - Fix clang_cl argument in fsanitize.c driver test.
Author: eugenis Date: Tue May 9 17:28:57 2017 New Revision: 302594 URL: http://llvm.org/viewvc/llvm-project?rev=302594=rev Log: Fix clang_cl argument in fsanitize.c driver test. Modified: cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/test/Driver/fsanitize.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=302594=302593=302594=diff == --- cfe/trunk/test/Driver/fsanitize.c (original) +++ cfe/trunk/test/Driver/fsanitize.c Tue May 9 17:28:57 2017 @@ -128,8 +128,8 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-globals-dead-stripping %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-GLOBALS // RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-ASAN-GLOBALS -// RUN: %clang_cl -target x86_64-windows-msvc -fsanitize=address -fsanitize-address-globals-dead-stripping -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-GLOBALS -// RUN: %clang_cl -target x86_64-windows-msvc -fsanitize=address -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-GLOBALS +// RUN: %clang_cl --target=x86_64-windows-msvc -fsanitize=address -fsanitize-address-globals-dead-stripping -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-GLOBALS +// RUN: %clang_cl --target=x86_64-windows-msvc -fsanitize=address -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-GLOBALS // CHECK-ASAN-GLOBALS: -cc1{{.*}}-fsanitize-address-globals-dead-stripping // CHECK-NO-ASAN-GLOBALS-NOT: -cc1{{.*}}-fsanitize-address-globals-dead-stripping ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r302590 - Remove unnecessary calls to MakeArgString.
Author: eugenis Date: Tue May 9 16:57:39 2017 New Revision: 302590 URL: http://llvm.org/viewvc/llvm-project?rev=302590=rev Log: Remove unnecessary calls to MakeArgString. Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/Arch/Mips.cpp Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=302590=302589=302590=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Tue May 9 16:57:39 2017 @@ -633,7 +633,7 @@ void SanitizerArgs::addArgs(const ToolCh std::make_pair(CoverageNoPrune, "-fsanitize-coverage-no-prune")}; for (auto F : CoverageFlags) { if (CoverageFeatures & F.first) - CmdArgs.push_back(Args.MakeArgString(F.second)); + CmdArgs.push_back(F.second); } if (TC.getTriple().isOSWindows() && needsUbsanRt()) { @@ -686,7 +686,7 @@ void SanitizerArgs::addArgs(const ToolCh llvm::utostr(MsanTrackOrigins))); if (MsanUseAfterDtor) -CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-use-after-dtor")); +CmdArgs.push_back("-fsanitize-memory-use-after-dtor"); // FIXME: Pass these parameters as function attributes, not as -llvm flags. if (!TsanMemoryAccess) { @@ -705,17 +705,17 @@ void SanitizerArgs::addArgs(const ToolCh } if (CfiCrossDso) -CmdArgs.push_back(Args.MakeArgString("-fsanitize-cfi-cross-dso")); +CmdArgs.push_back("-fsanitize-cfi-cross-dso"); if (Stats) -CmdArgs.push_back(Args.MakeArgString("-fsanitize-stats")); +CmdArgs.push_back("-fsanitize-stats"); if (AsanFieldPadding) CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" + llvm::utostr(AsanFieldPadding))); if (AsanUseAfterScope) - CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-use-after-scope")); +CmdArgs.push_back("-fsanitize-address-use-after-scope"); // MSan: Workaround for PR16386. // ASan: This is mainly to help LSan with cases such as @@ -723,7 +723,7 @@ void SanitizerArgs::addArgs(const ToolCh // We can't make this conditional on -fsanitize=leak, as that flag shouldn't // affect compilation. if (Sanitizers.has(Memory) || Sanitizers.has(Address)) -CmdArgs.push_back(Args.MakeArgString("-fno-assume-sane-operator-new")); +CmdArgs.push_back("-fno-assume-sane-operator-new"); // Require -fvisibility= flag on non-Windows when compiling if vptr CFI is // enabled. Modified: cfe/trunk/lib/Driver/ToolChains/Arch/Mips.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Arch/Mips.cpp?rev=302590=302589=302590=diff == --- cfe/trunk/lib/Driver/ToolChains/Arch/Mips.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Arch/Mips.cpp Tue May 9 16:57:39 2017 @@ -282,18 +282,18 @@ void mips::getMIPSTargetFeatures(const D if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, options::OPT_mfp64)) { if (A->getOption().matches(options::OPT_mfp32)) - Features.push_back(Args.MakeArgString("-fp64")); + Features.push_back("-fp64"); else if (A->getOption().matches(options::OPT_mfpxx)) { - Features.push_back(Args.MakeArgString("+fpxx")); - Features.push_back(Args.MakeArgString("+nooddspreg")); + Features.push_back("+fpxx"); + Features.push_back("+nooddspreg"); } else - Features.push_back(Args.MakeArgString("+fp64")); + Features.push_back("+fp64"); } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) { -Features.push_back(Args.MakeArgString("+fpxx")); -Features.push_back(Args.MakeArgString("+nooddspreg")); +Features.push_back("+fpxx"); +Features.push_back("+nooddspreg"); } else if (mips::isFP64ADefault(Triple, CPUName)) { -Features.push_back(Args.MakeArgString("+fp64")); -Features.push_back(Args.MakeArgString("+nooddspreg")); +Features.push_back("+fp64"); +Features.push_back("+nooddspreg"); } AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg, ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r302591 - [asan] A clang flag to enable ELF globals-gc.
Author: eugenis Date: Tue May 9 16:57:43 2017 New Revision: 302591 URL: http://llvm.org/viewvc/llvm-project?rev=302591=rev Log: [asan] A clang flag to enable ELF globals-gc. This feature is subtly broken when the linker is gold 2.26 or earlier. See the following bug for details: https://sourceware.org/bugzilla/show_bug.cgi?id=19002 Since the decision needs to be made at compilation time, we can not test the linker version. The flag is off by default on ELF targets, and on otherwise. Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/include/clang/Frontend/CodeGenOptions.def cfe/trunk/lib/CodeGen/BackendUtil.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/CodeGen/asan-globals-gc.cpp cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=302591=302590=302591=diff == --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Tue May 9 16:57:43 2017 @@ -827,6 +827,9 @@ def fno_sanitize_address_use_after_scope Group, Flags<[CoreOption, DriverOption]>, HelpText<"Disable use-after-scope detection in AddressSanitizer">; +def fsanitize_address_globals_dead_stripping : Flag<["-"], "fsanitize-address-globals-dead-stripping">, +Group, +HelpText<"Enable linker dead stripping of globals in AddressSanitizer">; def fsanitize_recover : Flag<["-"], "fsanitize-recover">, Group; def fno_sanitize_recover : Flag<["-"], "fno-sanitize-recover">, Flags<[CoreOption, DriverOption]>, Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=302591=302590=302591=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Tue May 9 16:57:43 2017 @@ -35,6 +35,7 @@ class SanitizerArgs { int AsanFieldPadding = 0; bool AsanSharedRuntime = false; bool AsanUseAfterScope = true; + bool AsanGlobalsDeadStripping = false; bool LinkCXXRuntimes = false; bool NeedPIE = false; bool Stats = false; Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=302591=302590=302591=diff == --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original) +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Tue May 9 16:57:43 2017 @@ -137,6 +137,8 @@ CODEGENOPT(StructPathTBAA, 1, 0) /// CODEGENOPT(SaveTempLabels, 1, 0) ///< Save temporary labels. CODEGENOPT(SanitizeAddressUseAfterScope , 1, 0) ///< Enable use-after-scope detection ///< in AddressSanitizer +CODEGENOPT(SanitizeAddressGlobalsDeadStripping, 1, 0) ///< Enable linker dead stripping + ///< of globals in AddressSanitizer CODEGENOPT(SanitizeMemoryTrackOrigins, 2, 0) ///< Enable tracking origins in ///< MemorySanitizer CODEGENOPT(SanitizeMemoryUseAfterDtor, 1, 0) ///< Enable use-after-delete detection Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=302591=302590=302591=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Tue May 9 16:57:43 2017 @@ -194,6 +194,8 @@ static void addSanitizerCoveragePass(con // where this is not a factor). Also, on ELF this feature requires an assembler // extension that only works with -integrated-as at the moment. static bool asanUseGlobalsGC(const Triple , const CodeGenOptions ) { + if (!CGOpts.SanitizeAddressGlobalsDeadStripping) +return false; switch (T.getObjectFormat()) { case Triple::MachO: case Triple::COFF: Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=302591=302590=302591=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Tue May 9 16:57:43 2017 @@ -566,6 +566,13 @@ SanitizerArgs::SanitizerArgs(const ToolC
r301374 - [asan] Unconditionally enable GC of globals on COFF.
Author: eugenis Date: Tue Apr 25 19:51:06 2017 New Revision: 301374 URL: http://llvm.org/viewvc/llvm-project?rev=301374=rev Log: [asan] Unconditionally enable GC of globals on COFF. This change restores pre-r301225 behavior, where linker GC compatible global instrumentation was used on COFF targets disregarding -f(no-)data-sections and/or /Gw flags. This instrumentation puts each global in a COMDAT with an ASan descriptor for that global. It effectively enables -fdata-sections, but limits it to ASan-instrumented globals. Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp cfe/trunk/test/CodeGen/asan-globals-gc.cpp Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=301374=301373=301374=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Tue Apr 25 19:51:06 2017 @@ -196,9 +196,8 @@ static void addSanitizerCoveragePass(con static bool asanUseGlobalsGC(const Triple , const CodeGenOptions ) { switch (T.getObjectFormat()) { case Triple::MachO: -return true; case Triple::COFF: -return CGOpts.DataSections; +return true; case Triple::ELF: return CGOpts.DataSections && !CGOpts.DisableIntegratedAS; default: Modified: cfe/trunk/test/CodeGen/asan-globals-gc.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/asan-globals-gc.cpp?rev=301374=301373=301374=diff == --- cfe/trunk/test/CodeGen/asan-globals-gc.cpp (original) +++ cfe/trunk/test/CodeGen/asan-globals-gc.cpp Tue Apr 25 19:51:06 2017 @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - -triple x86_64-windows-msvc %s | FileCheck %s --check-prefix=WITHOUT-GC +// RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - -triple x86_64-windows-msvc %s | FileCheck %s --check-prefix=WITH-GC // RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - -triple x86_64-windows-msvc -fdata-sections %s | FileCheck %s --check-prefix=WITH-GC int global; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r301225 - [asan] Disable ASan global-GC depending on the target and compiler flags.
Author: eugenis Date: Mon Apr 24 14:34:12 2017 New Revision: 301225 URL: http://llvm.org/viewvc/llvm-project?rev=301225=rev Log: [asan] Disable ASan global-GC depending on the target and compiler flags. Added: cfe/trunk/test/CodeGen/asan-globals-gc.cpp Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=301225=301224=301225=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Mon Apr 24 14:34:12 2017 @@ -129,16 +129,20 @@ public: // that we add to the PassManagerBuilder. class PassManagerBuilderWrapper : public PassManagerBuilder { public: - PassManagerBuilderWrapper(const CodeGenOptions , + PassManagerBuilderWrapper(const Triple , +const CodeGenOptions , const LangOptions ) - : PassManagerBuilder(), CGOpts(CGOpts), LangOpts(LangOpts) {} + : PassManagerBuilder(), TargetTriple(TargetTriple), CGOpts(CGOpts), +LangOpts(LangOpts) {} + const Triple () const { return TargetTriple; } const CodeGenOptions () const { return CGOpts; } const LangOptions () const { return LangOpts; } + private: + const Triple const CodeGenOptions const LangOptions }; - } static void addObjCARCAPElimPass(const PassManagerBuilder , PassManagerBase ) { @@ -185,16 +189,36 @@ static void addSanitizerCoveragePass(con PM.add(createSanitizerCoverageModulePass(Opts)); } +// Check if ASan should use GC-friendly instrumentation for globals. +// First of all, there is no point if -fdata-sections is off (expect for MachO, +// where this is not a factor). Also, on ELF this feature requires an assembler +// extension that only works with -integrated-as at the moment. +static bool asanUseGlobalsGC(const Triple , const CodeGenOptions ) { + switch (T.getObjectFormat()) { + case Triple::MachO: +return true; + case Triple::COFF: +return CGOpts.DataSections; + case Triple::ELF: +return CGOpts.DataSections && !CGOpts.DisableIntegratedAS; + default: +return false; + } +} + static void addAddressSanitizerPasses(const PassManagerBuilder , legacy::PassManagerBase ) { const PassManagerBuilderWrapper = static_cast(Builder); + const Triple = BuilderWrapper.getTargetTriple(); const CodeGenOptions = BuilderWrapper.getCGOpts(); bool Recover = CGOpts.SanitizeRecover.has(SanitizerKind::Address); bool UseAfterScope = CGOpts.SanitizeAddressUseAfterScope; + bool UseGlobalsGC = asanUseGlobalsGC(T, CGOpts); PM.add(createAddressSanitizerFunctionPass(/*CompileKernel*/ false, Recover, UseAfterScope)); - PM.add(createAddressSanitizerModulePass(/*CompileKernel*/false, Recover)); + PM.add(createAddressSanitizerModulePass(/*CompileKernel*/ false, Recover, + UseGlobalsGC)); } static void addKernelAddressSanitizerPasses(const PassManagerBuilder , @@ -436,8 +460,6 @@ void EmitAssemblyHelper::CreatePasses(le if (CodeGenOpts.DisableLLVMPasses) return; - PassManagerBuilderWrapper PMBuilder(CodeGenOpts, LangOpts); - // Figure out TargetLibraryInfo. This needs to be added to MPM and FPM // manually (and not via PMBuilder), since some passes (eg. InstrProfiling) // are inserted before PMBuilder ones - they'd get the default-constructed @@ -446,6 +468,8 @@ void EmitAssemblyHelper::CreatePasses(le std::unique_ptr TLII( createTLII(TargetTriple, CodeGenOpts)); + PassManagerBuilderWrapper PMBuilder(TargetTriple, CodeGenOpts, LangOpts); + // At O0 and O1 we only run the always inliner which is more efficient. At // higher optimization levels we run the normal inliner. if (CodeGenOpts.OptimizationLevel <= 1) { Added: cfe/trunk/test/CodeGen/asan-globals-gc.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/asan-globals-gc.cpp?rev=301225=auto == --- cfe/trunk/test/CodeGen/asan-globals-gc.cpp (added) +++ cfe/trunk/test/CodeGen/asan-globals-gc.cpp Mon Apr 24 14:34:12 2017 @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - -triple x86_64-windows-msvc %s | FileCheck %s --check-prefix=WITHOUT-GC +// RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - -triple x86_64-windows-msvc -fdata-sections %s | FileCheck %s --check-prefix=WITH-GC + +int global; + +// WITH-GC-NOT: call void @__asan_register_globals +// WITHOUT-GC: call void @__asan_register_globals ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r299806 - [cfi] Emit __cfi_check stub in the frontend.
Author: eugenis Date: Fri Apr 7 18:00:38 2017 New Revision: 299806 URL: http://llvm.org/viewvc/llvm-project?rev=299806=rev Log: [cfi] Emit __cfi_check stub in the frontend. Previously __cfi_check was created in LTO optimization pipeline, which means LLD has no way of knowing about the existence of this symbol without rescanning the LTO output object. As a result, LLD fails to export __cfi_check, even when given --export-dynamic-symbol flag. Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.h cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/test/CodeGen/cfi-check-fail.c Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=299806=299805=299806=diff == --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Apr 7 18:00:38 2017 @@ -2783,6 +2783,24 @@ void CodeGenFunction::EmitCfiSlowPathChe EmitBlock(Cont); } +// Emit a stub for __cfi_check function so that the linker knows about this +// symbol in LTO mode. +void CodeGenFunction::EmitCfiCheckStub() { + llvm::Module *M = (); + auto = M->getContext(); + llvm::Function *F = llvm::Function::Create( + llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy}, false), + llvm::GlobalValue::WeakAnyLinkage, "__cfi_check", M); + llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx, "entry", F); + // FIXME: consider emitting an intrinsic call like + // call void @llvm.cfi_check(i64 %0, i8* %1, i8* %2) + // which can be lowered in CrossDSOCFI pass to the actual contents of + // __cfi_check. This would allow inlining of __cfi_check calls. + llvm::CallInst::Create( + llvm::Intrinsic::getDeclaration(M, llvm::Intrinsic::trap), "", BB); + llvm::ReturnInst::Create(Ctx, nullptr, BB); +} + // This function is basically a switch over the CFI failure kind, which is // extracted from CFICheckFailData (1st function argument). Each case is either // llvm.trap or a call to one of the two runtime handlers, based on Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=299806=299805=299806=diff == --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Apr 7 18:00:38 2017 @@ -3524,6 +3524,9 @@ public: /// "trap-func-name" if specified. llvm::CallInst *EmitTrapCall(llvm::Intrinsic::ID IntrID); + /// \brief Emit a stub for the cross-DSO CFI check function. + void EmitCfiCheckStub(); + /// \brief Emit a cross-DSO CFI failure handling function. void EmitCfiCheckFail(); Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=299806=299805=299806=diff == --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Apr 7 18:00:38 2017 @@ -406,8 +406,10 @@ void CodeGenModule::Release() { EmitDeferredUnusedCoverageMappings(); if (CoverageMapping) CoverageMapping->emit(); - if (CodeGenOpts.SanitizeCfiCrossDso) + if (CodeGenOpts.SanitizeCfiCrossDso) { CodeGenFunction(*this).EmitCfiCheckFail(); +CodeGenFunction(*this).EmitCfiCheckStub(); + } emitAtAvailableLinkGuard(); emitLLVMUsed(); if (SanStats) Modified: cfe/trunk/test/CodeGen/cfi-check-fail.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/cfi-check-fail.c?rev=299806=299805=299806=diff == --- cfe/trunk/test/CodeGen/cfi-check-fail.c (original) +++ cfe/trunk/test/CodeGen/cfi-check-fail.c Fri Apr 7 18:00:38 2017 @@ -72,3 +72,8 @@ void caller(void (*f)()) { // CHECK: [[CONT5]]: // CHECK: ret void + +// CHECK: define weak void @__cfi_check(i64, i8*, i8*) +// CHECK-NOT: } +// CHECK: call void @llvm.trap() +// CHECK-NEXT: ret void ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r295267 - Add missing regexp quantifiers in a test.
Author: eugenis Date: Wed Feb 15 19:35:23 2017 New Revision: 295267 URL: http://llvm.org/viewvc/llvm-project?rev=295267=rev Log: Add missing regexp quantifiers in a test. Modified: cfe/trunk/test/CodeGen/sanitize-init-order.cpp Modified: cfe/trunk/test/CodeGen/sanitize-init-order.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/sanitize-init-order.cpp?rev=295267=295266=295267=diff == --- cfe/trunk/test/CodeGen/sanitize-init-order.cpp (original) +++ cfe/trunk/test/CodeGen/sanitize-init-order.cpp Wed Feb 15 19:35:23 2017 @@ -36,13 +36,13 @@ const volatile PODWithCtor array[5][5]; // Check that ASan init-order checking ignores structs with trivial default // constructor. -// CHECK: !llvm.asan.globals = !{![[GLOB_1:[0-9]+]], ![[GLOB_2:[0-9]+]], ![[GLOB_3:[0-9]]], ![[GLOB_4:[0-9]]]} +// CHECK: !llvm.asan.globals = !{![[GLOB_1:[0-9]+]], ![[GLOB_2:[0-9]+]], ![[GLOB_3:[0-9]+]], ![[GLOB_4:[0-9]+]] // CHECK: ![[GLOB_1]] = !{%struct.PODStruct* {{.*}}, i1 false, i1 false} // CHECK: ![[GLOB_2]] = !{%struct.PODWithDtor* {{.*}}, i1 false, i1 false} // CHECK: ![[GLOB_3]] = !{%struct.PODWithCtorAndDtor* {{.*}}, i1 true, i1 false} // CHECK: ![[GLOB_4]] = !{{{.*}}class.NS::PODWithCtor{{.*}}, i1 true, i1 false} -// BLACKLIST: !llvm.asan.globals = !{![[GLOB_1:[0-9]+]], ![[GLOB_2:[0-9]+]], ![[GLOB_3:[0-9]]], ![[GLOB_4:[0-9]]]} +// BLACKLIST: !llvm.asan.globals = !{![[GLOB_1:[0-9]+]], ![[GLOB_2:[0-9]+]], ![[GLOB_3:[0-9]+]], ![[GLOB_4:[0-9]+]]} // BLACKLIST: ![[GLOB_1]] = !{%struct.PODStruct* {{.*}}, i1 false, i1 false} // BLACKLIST: ![[GLOB_2]] = !{%struct.PODWithDtor* {{.*}}, i1 false, i1 false} // BLACKLIST: ![[GLOB_3]] = !{%struct.PODWithCtorAndDtor* {{.*}}, i1 false, i1 false} ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r286669 - Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
Author: eugenis Date: Fri Nov 11 17:17:36 2016 New Revision: 286669 URL: http://llvm.org/viewvc/llvm-project?rev=286669=rev Log: Tread TSan LLVM flags to driver: add TSan controlling flags to clang. Summary: New clang flags, all default to true: -f[no-]sanitize-thread-data-races -f[no-]sanitize-thread-stack-traces -f[no-]sanitize-thread-atomics Reviewers: dvyukov, pcc, eugenis Subscribers: pcc, cfe-commits Patch by Alex Shlyapnikov. Differential Revision: https://reviews.llvm.org/D26461 Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=286669=286668=286669=diff == --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Fri Nov 11 17:17:36 2016 @@ -728,6 +728,24 @@ def fsanitize_stats : Flag<["-"], "fsani def fno_sanitize_stats : Flag<["-"], "fno-sanitize-stats">, Group, Flags<[CC1Option]>, HelpText<"Disable sanitizer statistics gathering.">; +def fsanitize_thread_memory_access : Flag<["-"], "fsanitize-thread-memory-access">, + Group, + HelpText<"Enable memory access instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_memory_access : Flag<["-"], "fno-sanitize-thread-memory-access">, +Group, +HelpText<"Disable memory access instrumentation in ThreadSanitizer">; +def fsanitize_thread_func_entry_exit : Flag<["-"], "fsanitize-thread-func-entry-exit">, + Group, + HelpText<"Enable function entry/exit instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_func_entry_exit : Flag<["-"], "fno-sanitize-thread-func-entry-exit">, + Group, + HelpText<"Disable function entry/exit instrumentation in ThreadSanitizer">; +def fsanitize_thread_atomics : Flag<["-"], "fsanitize-thread-atomics">, + Group, + HelpText<"Enable atomic operations instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_atomics : Flag<["-"], "fno-sanitize-thread-atomics">, + Group, + HelpText<"Disable atomic operations instrumentation in ThreadSanitizer">; def fsanitize_undefined_strip_path_components_EQ : Joined<["-"], "fsanitize-undefined-strip-path-components=">, Group, Flags<[CC1Option]>, MetaVarName<"">, HelpText<"Strip (or keep only, if negative) a given number of path components " Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=286669=286668=286669=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Fri Nov 11 17:17:36 2016 @@ -38,6 +38,9 @@ class SanitizerArgs { bool LinkCXXRuntimes = false; bool NeedPIE = false; bool Stats = false; + bool TsanMemoryAccess = true; + bool TsanFuncEntryExit = true; + bool TsanAtomics = true; public: /// Parses the sanitizer arguments from an argument list. Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=286669=286668=286669=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Fri Nov 11 17:17:36 2016 @@ -437,6 +437,18 @@ SanitizerArgs::SanitizerArgs(const ToolC TC.getTriple().getArch() == llvm::Triple::x86_64); } + if (AllAddedKinds & Thread) { +TsanMemoryAccess = Args.hasFlag(options::OPT_fsanitize_thread_memory_access, + options::OPT_fno_sanitize_thread_memory_access, +TsanMemoryAccess); +TsanFuncEntryExit = Args.hasFlag(options::OPT_fsanitize_thread_func_entry_exit, + options::OPT_fno_sanitize_thread_func_entry_exit, + TsanFuncEntryExit); +TsanAtomics = Args.hasFlag(options::OPT_fsanitize_thread_atomics, + options::OPT_fno_sanitize_thread_atomics, + TsanAtomics); + } + if (AllAddedKinds & CFI) { CfiCrossDso =
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
This revision was automatically updated to reflect the committed changes. Closed by commit rL286669: Tread TSan LLVM flags to driver: add TSan controlling flags to clang. (authored by eugenis). Changed prior to commit: https://reviews.llvm.org/D26461?vs=77667=77683#toc Repository: rL LLVM https://reviews.llvm.org/D26461 Files: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/fsanitize.c Index: cfe/trunk/include/clang/Driver/Options.td === --- cfe/trunk/include/clang/Driver/Options.td +++ cfe/trunk/include/clang/Driver/Options.td @@ -728,6 +728,24 @@ def fno_sanitize_stats : Flag<["-"], "fno-sanitize-stats">, Group, Flags<[CC1Option]>, HelpText<"Disable sanitizer statistics gathering.">; +def fsanitize_thread_memory_access : Flag<["-"], "fsanitize-thread-memory-access">, + Group, + HelpText<"Enable memory access instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_memory_access : Flag<["-"], "fno-sanitize-thread-memory-access">, +Group, +HelpText<"Disable memory access instrumentation in ThreadSanitizer">; +def fsanitize_thread_func_entry_exit : Flag<["-"], "fsanitize-thread-func-entry-exit">, + Group, + HelpText<"Enable function entry/exit instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_func_entry_exit : Flag<["-"], "fno-sanitize-thread-func-entry-exit">, + Group, + HelpText<"Disable function entry/exit instrumentation in ThreadSanitizer">; +def fsanitize_thread_atomics : Flag<["-"], "fsanitize-thread-atomics">, + Group, + HelpText<"Enable atomic operations instrumentation in ThreadSanitizer (default)">; +def fno_sanitize_thread_atomics : Flag<["-"], "fno-sanitize-thread-atomics">, + Group, + HelpText<"Disable atomic operations instrumentation in ThreadSanitizer">; def fsanitize_undefined_strip_path_components_EQ : Joined<["-"], "fsanitize-undefined-strip-path-components=">, Group, Flags<[CC1Option]>, MetaVarName<"">, HelpText<"Strip (or keep only, if negative) a given number of path components " Index: cfe/trunk/include/clang/Driver/SanitizerArgs.h === --- cfe/trunk/include/clang/Driver/SanitizerArgs.h +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h @@ -38,6 +38,9 @@ bool LinkCXXRuntimes = false; bool NeedPIE = false; bool Stats = false; + bool TsanMemoryAccess = true; + bool TsanFuncEntryExit = true; + bool TsanAtomics = true; public: /// Parses the sanitizer arguments from an argument list. Index: cfe/trunk/test/Driver/fsanitize.c === --- cfe/trunk/test/Driver/fsanitize.c +++ cfe/trunk/test/Driver/fsanitize.c @@ -278,6 +278,35 @@ // RUN: %clang -target i386-apple-tvossimulator -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-I386-TVOSSIMULATOR // CHECK-TSAN-I386-TVOSSIMULATOR: unsupported option '-fsanitize=thread' for target 'i386-apple-tvossimulator' +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-thread-memory-access %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MEMORY-ACCESS +// CHECK-TSAN-MEMORY-ACCESS-NOT: -cc1{{.*}}tsan-instrument-memory-accesses=0 +// CHECK-TSAN-MEMORY-ACCESS-NOT: -cc1{{.*}}tsan-instrument-memintrinsics=0 +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fno-sanitize-thread-memory-access %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MEMORY-ACCESS-OFF +// CHECK-TSAN-MEMORY-ACCESS-OFF: -cc1{{.*}}tsan-instrument-memory-accesses=0{{.*}}tsan-instrument-memintrinsics=0 +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fno-sanitize-thread-memory-access -fsanitize-thread-memory-access %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MEMORY-ACCESS-BOTH +// CHECK-TSAN-MEMORY-ACCESS-BOTH-NOT: -cc1{{.*}}tsan-instrument-memory-accesses=0 +// CHECK-TSAN-MEMORY-ACCESS-BOTH-NOT: -cc1{{.*}}tsan-instrument-memintrinsics=0 +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-thread-memory-access -fno-sanitize-thread-memory-access %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MEMORY-ACCESS-BOTH-OFF +// CHECK-TSAN-MEMORY-ACCESS-BOTH-OFF: -cc1{{.*}}tsan-instrument-memory-accesses=0{{.*}}tsan-instrument-memintrinsics=0 + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-thread-func-entry-exit %s
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
eugenis accepted this revision. eugenis added a comment. LGTM https://reviews.llvm.org/D26461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
eugenis added inline comments. Comment at: lib/Frontend/CompilerInvocation.cpp:732 Args.hasArg(OPT_fsanitize_coverage_trace_pc_guard); + Opts.SanitizeThreadMemoryAccess = + Args.hasFlag(OPT_fsanitize_thread_memory_access, It looks like lib/Frontend changes are no longer necessary. https://reviews.llvm.org/D26461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r286613 - [cfi] Enable cfi-icall on ARM and AArch64.
Author: eugenis Date: Fri Nov 11 12:49:49 2016 New Revision: 286613 URL: http://llvm.org/viewvc/llvm-project?rev=286613=rev Log: [cfi] Enable cfi-icall on ARM and AArch64. Modified: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=286613=286612=286613=diff == --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Fri Nov 11 12:49:49 2016 @@ -708,6 +708,8 @@ SanitizerMask ToolChain::getSupportedSan CFICastStrict | UnsignedIntegerOverflow | LocalBounds; if (getTriple().getArch() == llvm::Triple::x86 || getTriple().getArch() == llvm::Triple::x86_64 || + getTriple().getArch() == llvm::Triple::arm || + getTriple().getArch() == llvm::Triple::aarch64 || getTriple().getArch() == llvm::Triple::wasm32 || getTriple().getArch() == llvm::Triple::wasm64) Res |= CFIICall; Modified: cfe/trunk/test/Driver/fsanitize.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=286613=286612=286613=diff == --- cfe/trunk/test/Driver/fsanitize.c (original) +++ cfe/trunk/test/Driver/fsanitize.c Fri Nov 11 12:49:49 2016 @@ -328,6 +328,10 @@ // RUN: %clang -target x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi-unrelated-cast -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-UCAST // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-nvcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NVCALL // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-vcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-VCALL +// RUN: %clang -target arm-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target arm-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI // CHECK-CFI: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast,cfi-icall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall // CHECK-CFI-DCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast // CHECK-CFI-UCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-unrelated-cast ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26491: Define __ANDROID_API__ when specified as part of an Android target.
eugenis accepted this revision. eugenis added a reviewer: eugenis. eugenis added a comment. Looks great! https://reviews.llvm.org/D26491 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
eugenis added inline comments. Comment at: lib/Frontend/CompilerInvocation.cpp:735 + OPT_fno_sanitize_thread_data_races, + Opts.SanitizeThreadDataRaces); + Opts.SanitizeThreadStackTraces = alekseyshl wrote: > eugenis wrote: > > It seems common to hardcode the default option value here. > > The same in SanitizerArgs.cpp. > True, but the default value for these flags is already mentioned in more than > one place, why not to try to reduce the complexity? I guess I don't mind either way. https://reviews.llvm.org/D26461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
eugenis added a comment. Oh, and this needs a test. See test/Driver/fsanitize.c (search for -fsanitize-address-use-after-scope as an example). https://reviews.llvm.org/D26461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26461: Tread TSan LLVM flags to driver: add TSan controlling flags to clang.
eugenis added inline comments. Comment at: lib/Frontend/CompilerInvocation.cpp:735 + OPT_fno_sanitize_thread_data_races, + Opts.SanitizeThreadDataRaces); + Opts.SanitizeThreadStackTraces = It seems common to hardcode the default option value here. The same in SanitizerArgs.cpp. https://reviews.llvm.org/D26461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26385: Define __ANDROID_API__ for all Android builds.
eugenis accepted this revision. eugenis added a reviewer: eugenis. eugenis added a comment. LGTM https://reviews.llvm.org/D26385 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26385: Define __ANDROID_API__ for all Android builds.
eugenis added a comment. This is a good change, but I don't think it is the right fix for PR30940. Instead of handling this in the NDK, we should change *::getIRStackGuard to fallback to __stack_chk_guard when targeting an old version. https://reviews.llvm.org/D26385 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r286148 - Use -fsanitize-recover instead of -mllvm -msan-keep-going: clang.
Author: eugenis Date: Mon Nov 7 15:02:11 2016 New Revision: 286148 URL: http://llvm.org/viewvc/llvm-project?rev=286148=rev Log: Use -fsanitize-recover instead of -mllvm -msan-keep-going: clang. Summary: Use -fsanitize-recover instead of -mllvm -msan-keep-going: pass -fsanitize-recover value to msan. Reviewers: eugenis Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D26354 Patch by Aleksey Shlyapnikov. Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=286148=286147=286148=diff == --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Mon Nov 7 15:02:11 2016 @@ -200,7 +200,9 @@ static void addMemorySanitizerPass(const const PassManagerBuilderWrapper = static_cast(Builder); const CodeGenOptions = BuilderWrapper.getCGOpts(); - PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins)); + int TrackOrigins = CGOpts.SanitizeMemoryTrackOrigins; + bool Recover = CGOpts.SanitizeRecover.has(SanitizerKind::Memory); + PM.add(createMemorySanitizerPass(TrackOrigins, Recover)); // MemorySanitizer inserts complex instrumentation that mostly follows // the logic of the original code, but operates on "shadow" values. ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26164: [cfi] Fix missing !type annotation.
eugenis closed this revision. eugenis added a comment. thanks! r285650 Repository: rL LLVM https://reviews.llvm.org/D26164 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r285650 - [cfi] Fix missing !type annotation.
Author: eugenis Date: Mon Oct 31 17:28:10 2016 New Revision: 285650 URL: http://llvm.org/viewvc/llvm-project?rev=285650=rev Log: [cfi] Fix missing !type annotation. CFI (only in the cross-dso mode) fails to set !type annotations when a function is used before it is defined. Added: cfe/trunk/test/CodeGen/cfi-icall-cross-dso2.c Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=285650=285649=285650=diff == --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Oct 31 17:28:10 2016 @@ -929,6 +929,11 @@ void CodeGenModule::SetLLVMFunctionAttri if (F->getAlignment() < 2 && isa(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) +if (auto *FD = dyn_cast(D)) + CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1011,10 +1016,6 @@ void CodeGenModule::CreateFunctionTypeMe // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { -// Don't emit entries for function declarations. In cross-DSO mode these are -// handled with better precision at run time. -if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1087,7 +1088,10 @@ void CodeGenModule::SetFunctionAttribute if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { Added: cfe/trunk/test/CodeGen/cfi-icall-cross-dso2.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/cfi-icall-cross-dso2.c?rev=285650=auto == --- cfe/trunk/test/CodeGen/cfi-icall-cross-dso2.c (added) +++ cfe/trunk/test/CodeGen/cfi-icall-cross-dso2.c Mon Oct 31 17:28:10 2016 @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 -fblocks \ +// RUN: -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +// CHECK: define void @f() {{.*}} !type !{{.*}} !type !{{.*}} +void f(void); +void (*pf)(void) = f; +void f(void) { } + +// Check that we do not crash on non-FunctionDecl definitions. +void (^g)(void) = ^{}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26164: [cfi] Fix missing !type annotation.
eugenis updated this revision to Diff 76489. Repository: rL LLVM https://reviews.llvm.org/D26164 Files: lib/CodeGen/CodeGenModule.cpp test/CodeGen/cfi-icall-cross-dso2.c Index: test/CodeGen/cfi-icall-cross-dso2.c === --- /dev/null +++ test/CodeGen/cfi-icall-cross-dso2.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 -fblocks \ +// RUN: -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +// CHECK: define void @f() {{.*}} !type !{{.*}} !type !{{.*}} +void f(void); +void (*pf)(void) = f; +void f(void) { } + +// Check that we do not crash on non-FunctionDecl definitions. +void (^g)(void) = ^{}; Index: lib/CodeGen/CodeGenModule.cpp === --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -928,6 +928,11 @@ if (F->getAlignment() < 2 && isa(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) +if (auto *FD = dyn_cast(D)) + CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1010,10 +1015,6 @@ // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { -// Don't emit entries for function declarations. In cross-DSO mode these are -// handled with better precision at run time. -if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1086,7 +1087,10 @@ if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { Index: test/CodeGen/cfi-icall-cross-dso2.c === --- /dev/null +++ test/CodeGen/cfi-icall-cross-dso2.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 -fblocks \ +// RUN: -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +// CHECK: define void @f() {{.*}} !type !{{.*}} !type !{{.*}} +void f(void); +void (*pf)(void) = f; +void f(void) { } + +// Check that we do not crash on non-FunctionDecl definitions. +void (^g)(void) = ^{}; Index: lib/CodeGen/CodeGenModule.cpp === --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -928,6 +928,11 @@ if (F->getAlignment() < 2 && isa(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) +if (auto *FD = dyn_cast(D)) + CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1010,10 +1015,6 @@ // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { -// Don't emit entries for function declarations. In cross-DSO mode these are -// handled with better precision at run time. -if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1086,7 +1087,10 @@ if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26164: [cfi] Fix missing !type annotation.
eugenis created this revision. eugenis added a reviewer: pcc. eugenis added a subscriber: cfe-commits. eugenis set the repository for this revision to rL LLVM. CFI (only in the cross-dso mode) fails to set !type annotations when a function is used before it is defined. Repository: rL LLVM https://reviews.llvm.org/D26164 Files: lib/CodeGen/CodeGenModule.cpp test/CodeGen/cfi-icall-cross-dso2.c Index: test/CodeGen/cfi-icall-cross-dso2.c === --- /dev/null +++ test/CodeGen/cfi-icall-cross-dso2.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 \ +// RUN: -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +// CHECK: define void @f() {{.*}} !type !{{.*}} !type !{{.*}} +void f(void); +void (*pf)(void) = f; +void f(void) { } Index: lib/CodeGen/CodeGenModule.cpp === --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -928,6 +928,10 @@ if (F->getAlignment() < 2 && isa(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(dyn_cast(D), F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1010,10 +1014,6 @@ // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { -// Don't emit entries for function declarations. In cross-DSO mode these are -// handled with better precision at run time. -if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1086,7 +1086,10 @@ if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { Index: test/CodeGen/cfi-icall-cross-dso2.c === --- /dev/null +++ test/CodeGen/cfi-icall-cross-dso2.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 \ +// RUN: -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +// CHECK: define void @f() {{.*}} !type !{{.*}} !type !{{.*}} +void f(void); +void (*pf)(void) = f; +void f(void) { } Index: lib/CodeGen/CodeGenModule.cpp === --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -928,6 +928,10 @@ if (F->getAlignment() < 2 && isa(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(dyn_cast(D), F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1010,10 +1014,6 @@ // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { -// Don't emit entries for function declarations. In cross-DSO mode these are -// handled with better precision at run time. -if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1086,7 +1086,10 @@ if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) +CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D25928: [cfi] Enable cfi-icall on ARM and AArch64.
eugenis created this revision. eugenis added a reviewer: pcc. eugenis added a subscriber: cfe-commits. eugenis set the repository for this revision to rL LLVM. Herald added subscribers: srhines, danalbert, tberghammer, rengolin, aemerson. Backend support added in https://reviews.llvm.org/D25927 Repository: rL LLVM https://reviews.llvm.org/D25928 Files: lib/Driver/ToolChain.cpp test/Driver/fsanitize.c Index: test/Driver/fsanitize.c === --- test/Driver/fsanitize.c +++ test/Driver/fsanitize.c @@ -328,6 +328,10 @@ // RUN: %clang -target x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi-unrelated-cast -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-UCAST // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-nvcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NVCALL // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-vcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-VCALL +// RUN: %clang -target arm-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target arm-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI // CHECK-CFI: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast,cfi-icall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall // CHECK-CFI-DCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast // CHECK-CFI-UCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-unrelated-cast Index: lib/Driver/ToolChain.cpp === --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -698,6 +698,8 @@ CFICastStrict | UnsignedIntegerOverflow | LocalBounds; if (getTriple().getArch() == llvm::Triple::x86 || getTriple().getArch() == llvm::Triple::x86_64 || + getTriple().getArch() == llvm::Triple::arm || + getTriple().getArch() == llvm::Triple::aarch64 || getTriple().getArch() == llvm::Triple::wasm32 || getTriple().getArch() == llvm::Triple::wasm64) Res |= CFIICall; Index: test/Driver/fsanitize.c === --- test/Driver/fsanitize.c +++ test/Driver/fsanitize.c @@ -328,6 +328,10 @@ // RUN: %clang -target x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi-unrelated-cast -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-UCAST // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-nvcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NVCALL // RUN: %clang -target x86_64-linux-gnu -flto -fvisibility=hidden -fsanitize=cfi-vcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-VCALL +// RUN: %clang -target arm-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target arm-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -target aarch64-linux-android -fvisibility=hidden -fsanitize=cfi -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI // CHECK-CFI: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast,cfi-icall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall // CHECK-CFI-DCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-derived-cast // CHECK-CFI-UCAST: -emit-llvm-bc{{.*}}-fsanitize=cfi-unrelated-cast Index: lib/Driver/ToolChain.cpp === --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -698,6 +698,8 @@ CFICastStrict | UnsignedIntegerOverflow | LocalBounds; if (getTriple().getArch() == llvm::Triple::x86 || getTriple().getArch() == llvm::Triple::x86_64 || + getTriple().getArch() == llvm::Triple::arm || + getTriple().getArch() == llvm::Triple::aarch64 || getTriple().getArch() == llvm::Triple::wasm32 || getTriple().getArch() == llvm::Triple::wasm64) Res |= CFIICall; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D25453: Add -fno-sanitize-address-use-after-scope flag
eugenis accepted this revision. eugenis added a comment. This revision is now accepted and ready to land. LGTM Comment at: lib/Frontend/CompilerInvocation.cpp:739 + UasArg && + UasArg->getOption().matches(OPT_fsanitize_address_use_after_scope); Opts.SSPBufferSize = Consider doing this the same way as EmitLLVMUseLists above to avoid a function level declaration. Comment at: test/Driver/fsanitize.c:124 +// RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-WITHOUT-USE-AFTER-SCOPE +// CHECK-ASAN-WITHOUT-USE-AFTER-SCOPE-NOT: -cc1{{.*}}address-use-after-scope Check the case -fno-sanitize-address-use-after-scope -fsanitize-address-use-after-scope https://reviews.llvm.org/D25453 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D24693: [CodeGen] Don't emit lifetime intrinsics for some local variables
eugenis added inline comments. Comment at: lib/CodeGen/VarBypassDetector.h:50 @@ +49,3 @@ +public: + void Reset(const Stmt *Body); + rename to smth like StartFunction()? add some API documentation. https://reviews.llvm.org/D24693 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D24642: Use __attribute__((internal_linkage)) when available.
eugenis accepted this revision. eugenis added a comment. This revision is now accepted and ready to land. Looks great. Thank you for seeing it through! https://reviews.llvm.org/D24642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D24048: [Driver] [Darwin] Add sanitizer libraries even if -nodefaultlibs is passed
eugenis added a comment. I would also expect -nodefaultlibs and -nostdlib to remove all standard libraries from the link command line, including the sanitizer ones. I like the idea of -flink-sanitizer-runtime=address, but may be without "address" - the set of sanitizer runtime libraries can be found from -fsanitize=* flags. Alternatively, we could extend (or add something like) -print-libgcc-name to report the set of sanitizer link flags (there may be multiple libraries and possible other flags). https://reviews.llvm.org/D24048 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r280031 - [cfi] Export __cfi_check when linking with -fsanitize-cfi-cross-dso.
Author: eugenis Date: Mon Aug 29 18:42:34 2016 New Revision: 280031 URL: http://llvm.org/viewvc/llvm-project?rev=280031=rev Log: [cfi] Export __cfi_check when linking with -fsanitize-cfi-cross-dso. Multi-DSO CFI model requires every DSO to export a __cfi_check function. Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=280031=280030=280031=diff == --- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Mon Aug 29 18:42:34 2016 @@ -66,6 +66,7 @@ class SanitizerArgs { bool requiresPIE() const; bool needsUnwindTables() const; bool linkCXXRuntimes() const { return LinkCXXRuntimes; } + bool hasCrossDsoCfi() const { return CfiCrossDso; } void addArgs(const ToolChain , const llvm::opt::ArgList , llvm::opt::ArgStringList , types::ID InputType) const; }; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=280031=280030=280031=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Mon Aug 29 18:42:34 2016 @@ -3194,6 +3194,11 @@ static bool addSanitizerRuntimes(const T // to be dynamic to be sure we export sanitizer interface functions. if (AddExportDynamic) CmdArgs.push_back("-export-dynamic"); + + const SanitizerArgs = TC.getSanitizerArgs(); + if (SanArgs.hasCrossDsoCfi() && !AddExportDynamic) +CmdArgs.push_back("-export-dynamic-symbol=__cfi_check"); + return !StaticRuntimes.empty(); } Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=280031=280030=280031=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Mon Aug 29 18:42:34 2016 @@ -365,6 +365,7 @@ // RUN: | FileCheck --check-prefix=CHECK-CFI-CROSS-DSO-LINUX %s // CHECK-CFI-CROSS-DSO-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-CFI-CROSS-DSO-LINUX: "-whole-archive" "{{[^"]*}}libclang_rt.cfi-x86_64.a" "-no-whole-archive" +// CHECK-CFI-CROSS-DSO-LINUX: -export-dynamic // Cross-DSO CFI with diagnostics links just the CFI runtime. // RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso %s -### -o %t.o 2>&1 \ @@ -374,6 +375,7 @@ // RUN: | FileCheck --check-prefix=CHECK-CFI-CROSS-DSO-DIAG-LINUX %s // CHECK-CFI-CROSS-DSO-DIAG-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-CFI-CROSS-DSO-DIAG-LINUX: "-whole-archive" "{{[^"]*}}libclang_rt.cfi_diag-x86_64.a" "-no-whole-archive" +// CHECK-CFI-CROSS-DSO-DIAG-LINUX: -export-dynamic // RUN: %clangxx -fsanitize=address %s -### -o %t.o 2>&1 \ // RUN: -mmacosx-version-min=10.6 \ @@ -452,6 +454,26 @@ // CHECK-SAFESTACK-ANDROID-AARCH64: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-SAFESTACK-ANDROID-AARCH64-NOT: libclang_rt.safestack +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target arm-linux-androideabi -fsanitize=cfi \ +// RUN: --sysroot=%S/Inputs/basic_android_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CFI-ANDROID %s +// +// CHECK-CFI-ANDROID: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-CFI-ANDROID-NOT: libclang_rt.cfi +// CHECK-CFI-ANDROID-NOT: __cfi_check + +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target arm-linux-androideabi -fsanitize=cfi \ +// RUN: -fsanitize-cfi-cross-dso \ +// RUN: --sysroot=%S/Inputs/basic_android_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CROSSDSO-CFI-ANDROID %s +// +// CHECK-CROSSDSO-CFI-ANDROID: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-CROSSDSO-CFI-ANDROID-NOT: libclang_rt.cfi +// CHECK-CROSSDSO-CFI-ANDROID: -export-dynamic-symbol=__cfi_check +// CHECK-CROSSDSO-CFI-ANDROID-NOT: libclang_rt.cfi + // RUN: %clang -fsanitize=undefined %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-scei-ps4 \ // RUN: -shared \ ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r280028 - Fix typo in test.
Author: eugenis Date: Mon Aug 29 18:15:46 2016 New Revision: 280028 URL: http://llvm.org/viewvc/llvm-project?rev=280028=rev Log: Fix typo in test. Modified: cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=280028=280027=280028=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Mon Aug 29 18:15:46 2016 @@ -439,7 +439,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o -shared 2>&1 \ // RUN: -target arm-linux-androideabi -fsanitize=safe-stack \ // RUN: --sysroot=%S/Inputs/basic_android_tree \ -// RUN: | FileCheck --check-prefix=CHECK-SAFESTACK-ANDROID-ARM %s +// RUN: | FileCheck --check-prefix=CHECK-SAFESTACK-SHARED-ANDROID-ARM %s // // CHECK-SAFESTACK-SHARED-ANDROID-ARM: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-SAFESTACK-SHARED-ANDROID-ARM-NOT: libclang_rt.safestack ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21122: CodeGen: Start emitting checked loads when both trapping CFI and -fwhole-program-vtables are enabled.
eugenis accepted this revision. eugenis added a comment. This revision is now accepted and ready to land. LGTM http://reviews.llvm.org/D21122 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis closed this revision. eugenis added a comment. r272717 Repository: rL LLVM http://reviews.llvm.org/D21317 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20561: Warn when taking address of packed member
eugenis added a comment. This timeval thing looks like a legitimate warning to me. I don't think the analysis should go beyond the function boundaries. If a callee expects timeval * as part of its signature it should get a properly aligned timeval *. http://reviews.llvm.org/D20561 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r272856 - Fix sanitizer-ld test.
Author: eugenis Date: Wed Jun 15 18:29:26 2016 New Revision: 272856 URL: http://llvm.org/viewvc/llvm-project?rev=272856=rev Log: Fix sanitizer-ld test. Modified: cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=272856=272855=272856=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Wed Jun 15 18:29:26 2016 @@ -299,7 +299,6 @@ // RUN: | FileCheck --check-prefix=CHECK-ASAN-COV-LINUX %s // CHECK-ASAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-ASAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.asan-x86_64.a" "-no-whole-archive" -// CHECK-ASAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.asan-x86_64.a.syms" // CHECK-ASAN-COV-LINUX-NOT: libclang_rt.ubsan // CHECK-ASAN-COV-LINUX-NOT: "-lstdc++" // CHECK-ASAN-COV-LINUX: "-lpthread" @@ -310,7 +309,6 @@ // RUN: | FileCheck --check-prefix=CHECK-MSAN-COV-LINUX %s // CHECK-MSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-MSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.msan-x86_64.a" "-no-whole-archive" -// CHECK-MSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.msan-x86_64.a.syms" // CHECK-MSAN-COV-LINUX-NOT: libclang_rt.ubsan // CHECK-MSAN-COV-LINUX-NOT: "-lstdc++" // CHECK-MSAN-COV-LINUX: "-lpthread" @@ -321,7 +319,6 @@ // RUN: | FileCheck --check-prefix=CHECK-DFSAN-COV-LINUX %s // CHECK-DFSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-DFSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.dfsan-x86_64.a" "-no-whole-archive" -// CHECK-DFSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.dfsan-x86_64.a.syms" // CHECK-DFSAN-COV-LINUX-NOT: libclang_rt.ubsan // CHECK-DFSAN-COV-LINUX-NOT: "-lstdc++" // CHECK-DFSAN-COV-LINUX: "-lpthread" @@ -332,8 +329,6 @@ // RUN: | FileCheck --check-prefix=CHECK-UBSAN-COV-LINUX %s // CHECK-UBSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-UBSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.ubsan_standalone-x86_64.a" "-no-whole-archive" -// CHECK-UBSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.ubsan_standalone-x86_64.a.syms" -// CHECK-UBSAN-COV-LINUX-NOT: libclang_rt.ubsan // CHECK-UBSAN-COV-LINUX-NOT: "-lstdc++" // CHECK-UBSAN-COV-LINUX: "-lpthread" @@ -343,8 +338,6 @@ // RUN: | FileCheck --check-prefix=CHECK-COV-LINUX %s // CHECK-COV-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.ubsan_standalone-x86_64.a" "-no-whole-archive" -// CHECK-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.ubsan_standalone-x86_64.a.syms" -// CHECK-COV-LINUX-NOT: libclang_rt.ubsan // CHECK-COV-LINUX-NOT: "-lstdc++" // CHECK-COV-LINUX: "-lpthread" ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r272853 - Fix linking of DFSan + coverage.
Author: eugenis Date: Wed Jun 15 18:05:21 2016 New Revision: 272853 URL: http://llvm.org/viewvc/llvm-project?rev=272853=rev Log: Fix linking of DFSan + coverage. Broken in r272717 because of no test coverage. Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/sanitizer-ld.c Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=272853=272852=272853=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Wed Jun 15 18:05:21 2016 @@ -162,7 +162,7 @@ bool SanitizerArgs::needsUbsanRt() const return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || CoverageFeatures) && !Sanitizers.has(Address) && !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && !CfiCrossDso; + !Sanitizers.has(Thread) && !Sanitizers.has(DataFlow) && !CfiCrossDso; } bool SanitizerArgs::needsCfiRt() const { Modified: cfe/trunk/test/Driver/sanitizer-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=272853=272852=272853=diff == --- cfe/trunk/test/Driver/sanitizer-ld.c (original) +++ cfe/trunk/test/Driver/sanitizer-ld.c Wed Jun 15 18:05:21 2016 @@ -293,6 +293,61 @@ // CHECK-LSAN-ASAN-LINUX: libclang_rt.asan-x86_64 // CHECK-LSAN-ASAN-LINUX-NOT: libclang_rt.lsan +// RUN: %clang -fsanitize=address -fsanitize-coverage=func %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-COV-LINUX %s +// CHECK-ASAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" +// CHECK-ASAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.asan-x86_64.a" "-no-whole-archive" +// CHECK-ASAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.asan-x86_64.a.syms" +// CHECK-ASAN-COV-LINUX-NOT: libclang_rt.ubsan +// CHECK-ASAN-COV-LINUX-NOT: "-lstdc++" +// CHECK-ASAN-COV-LINUX: "-lpthread" + +// RUN: %clang -fsanitize=memory -fsanitize-coverage=func %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-MSAN-COV-LINUX %s +// CHECK-MSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" +// CHECK-MSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.msan-x86_64.a" "-no-whole-archive" +// CHECK-MSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.msan-x86_64.a.syms" +// CHECK-MSAN-COV-LINUX-NOT: libclang_rt.ubsan +// CHECK-MSAN-COV-LINUX-NOT: "-lstdc++" +// CHECK-MSAN-COV-LINUX: "-lpthread" + +// RUN: %clang -fsanitize=dataflow -fsanitize-coverage=func %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-DFSAN-COV-LINUX %s +// CHECK-DFSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" +// CHECK-DFSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.dfsan-x86_64.a" "-no-whole-archive" +// CHECK-DFSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.dfsan-x86_64.a.syms" +// CHECK-DFSAN-COV-LINUX-NOT: libclang_rt.ubsan +// CHECK-DFSAN-COV-LINUX-NOT: "-lstdc++" +// CHECK-DFSAN-COV-LINUX: "-lpthread" + +// RUN: %clang -fsanitize=undefined -fsanitize-coverage=func %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-UBSAN-COV-LINUX %s +// CHECK-UBSAN-COV-LINUX: "{{.*}}ld{{(.exe)?}}" +// CHECK-UBSAN-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.ubsan_standalone-x86_64.a" "-no-whole-archive" +// CHECK-UBSAN-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.ubsan_standalone-x86_64.a.syms" +// CHECK-UBSAN-COV-LINUX-NOT: libclang_rt.ubsan +// CHECK-UBSAN-COV-LINUX-NOT: "-lstdc++" +// CHECK-UBSAN-COV-LINUX: "-lpthread" + +// RUN: %clang -fsanitize-coverage=func %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-COV-LINUX %s +// CHECK-COV-LINUX: "{{.*}}ld{{(.exe)?}}" +// CHECK-COV-LINUX: "-whole-archive" "{{.*}}libclang_rt.ubsan_standalone-x86_64.a" "-no-whole-archive" +// CHECK-COV-LINUX: "--dynamic-list={{.*}}libclang_rt.ubsan_standalone-x86_64.a.syms" +// CHECK-COV-LINUX-NOT: libclang_rt.ubsan +// CHECK-COV-LINUX-NOT: "-lstdc++" +// CHECK-COV-LINUX: "-lpthread" + // CFI by itself does not link runtime libraries. // RUN: %clang -fsanitize=cfi %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-unknown-linux \ ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r272735 - Fix sanitizer coverage support in the win32 driver.
Author: eugenis Date: Tue Jun 14 18:21:19 2016 New Revision: 272735 URL: http://llvm.org/viewvc/llvm-project?rev=272735=rev Log: Fix sanitizer coverage support in the win32 driver. --dependent-lib arguments for the sanitizer libraries must be emitted when coverage is enabled w/o any sanitizers. Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=272735=272734=272735=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Tue Jun 14 18:21:19 2016 @@ -622,6 +622,28 @@ void SanitizerArgs::addArgs(const ToolCh CmdArgs.push_back(Args.MakeArgString(F.second)); } + if (TC.getTriple().isOSWindows() && needsUbsanRt()) { +// Instruct the code generator to embed linker directives in the object file +// that cause the required runtime libraries to be linked. +CmdArgs.push_back(Args.MakeArgString( +"--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone"))); +if (types::isCXX(InputType)) + CmdArgs.push_back(Args.MakeArgString( + "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx"))); + } + if (TC.getTriple().isOSWindows() && needsStatsRt()) { +CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + + TC.getCompilerRT(Args, "stats_client"))); + +// The main executable must export the stats runtime. +// FIXME: Only exporting from the main executable (e.g. based on whether the +// translation unit defines main()) would save a little space, but having +// multiple copies of the runtime shouldn't hurt. +CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + + TC.getCompilerRT(Args, "stats"))); +addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register"); + } + if (Sanitizers.empty()) return; CmdArgs.push_back(Args.MakeArgString("-fsanitize=" + toString(Sanitizers))); @@ -673,28 +695,6 @@ void SanitizerArgs::addArgs(const ToolCh if (Sanitizers.has(Memory) || Sanitizers.has(Address)) CmdArgs.push_back(Args.MakeArgString("-fno-assume-sane-operator-new")); - if (TC.getTriple().isOSWindows() && needsUbsanRt()) { -// Instruct the code generator to embed linker directives in the object file -// that cause the required runtime libraries to be linked. -CmdArgs.push_back(Args.MakeArgString( -"--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone"))); -if (types::isCXX(InputType)) - CmdArgs.push_back(Args.MakeArgString( - "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx"))); - } - if (TC.getTriple().isOSWindows() && needsStatsRt()) { -CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + - TC.getCompilerRT(Args, "stats_client"))); - -// The main executable must export the stats runtime. -// FIXME: Only exporting from the main executable (e.g. based on whether the -// translation unit defines main()) would save a little space, but having -// multiple copies of the runtime shouldn't hurt. -CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + - TC.getCompilerRT(Args, "stats"))); -addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register"); - } - // Require -fvisibility= flag on non-Windows when compiling if vptr CFI is // enabled. if (Sanitizers.hasOneOf(CFIClasses) && !TC.getTriple().isOSWindows() && Modified: cfe/trunk/test/Driver/fsanitize.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=272735=272734=272735=diff == --- cfe/trunk/test/Driver/fsanitize.c (original) +++ cfe/trunk/test/Driver/fsanitize.c Tue Jun 14 18:21:19 2016 @@ -20,10 +20,15 @@ // RUN: %clang -target i386-pc-win32 -fsanitize=undefined -x c++ %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN32 --check-prefix=CHECK-UNDEFINED-WIN-CXX // RUN: %clang -target x86_64-pc-win32 -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN64 // RUN: %clang -target x86_64-pc-win32 -fsanitize=undefined -x c++ %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN64 --check-prefix=CHECK-UNDEFINED-WIN-CXX -// CHECK-UNDEFINED-WIN: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|object-size|float-cast-overflow|array-bounds|enum|bool|returns-nonnull-attribute|nonnull-attribute),?){17}"}} -//
r272717 - [sanitizer] Allow sanitize coverage w/o sanitizers.
Author: eugenis Date: Tue Jun 14 16:33:40 2016 New Revision: 272717 URL: http://llvm.org/viewvc/llvm-project?rev=272717=rev Log: [sanitizer] Allow sanitize coverage w/o sanitizers. The reason is that this (a) seems to work just fine and (b) useful when building stuff with sanitizer+coverage, but need to exclude the sanitizer for a particular source file. Modified: cfe/trunk/docs/SanitizerCoverage.rst cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/test/Driver/fsanitize-coverage.c Modified: cfe/trunk/docs/SanitizerCoverage.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/SanitizerCoverage.rst?rev=272717=272716=272717=diff == --- cfe/trunk/docs/SanitizerCoverage.rst (original) +++ cfe/trunk/docs/SanitizerCoverage.rst Tue Jun 14 16:33:40 2016 @@ -16,8 +16,9 @@ How to build and run SanitizerCoverage can be used with :doc:`AddressSanitizer`, -:doc:`LeakSanitizer`, :doc:`MemorySanitizer`, and UndefinedBehaviorSanitizer. -In addition to ``-fsanitize=``, pass one of the following compile-time flags: +:doc:`LeakSanitizer`, :doc:`MemorySanitizer`, +UndefinedBehaviorSanitizer, or without any sanitizer. Pass one of the +following compile-time flags: * ``-fsanitize-coverage=func`` for function-level coverage (very fast). * ``-fsanitize-coverage=bb`` for basic-block-level coverage (may add up to 30% @@ -27,8 +28,9 @@ In addition to ``-fsanitize=``, pass one You may also specify ``-fsanitize-coverage=indirect-calls`` for additional `caller-callee coverage`_. -At run time, pass ``coverage=1`` in ``ASAN_OPTIONS``, ``LSAN_OPTIONS``, -``MSAN_OPTIONS`` or ``UBSAN_OPTIONS``, as appropriate. +At run time, pass ``coverage=1`` in ``ASAN_OPTIONS``, +``LSAN_OPTIONS``, ``MSAN_OPTIONS`` or ``UBSAN_OPTIONS``, as +appropriate. For the standalone coverage mode, use ``UBSAN_OPTIONS``. To get `Coverage counters`_, add ``-fsanitize-coverage=8bit-counters`` to one of the above compile-time flags. At runtime, use Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=272717=272716=272717=diff == --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Tue Jun 14 16:33:40 2016 @@ -159,11 +159,10 @@ static SanitizerMask parseSanitizeTrapAr } bool SanitizerArgs::needsUbsanRt() const { - return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) && - !Sanitizers.has(Address) && - !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && - !CfiCrossDso; + return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || + CoverageFeatures) && + !Sanitizers.has(Address) && !Sanitizers.has(Memory) && + !Sanitizers.has(Thread) && !CfiCrossDso; } bool SanitizerArgs::needsCfiRt() const { @@ -485,10 +484,10 @@ SanitizerArgs::SanitizerArgs(const ToolC continue; } CoverageFeatures |= parseCoverageFeatures(D, Arg); - // If there is trace-pc, allow it w/o any of the sanitizers. - // Otherwise, require that one of the supported sanitizers is present. - if ((CoverageFeatures & CoverageTracePC) || - (AllAddedKinds & SupportsCoverage)) { + + // Disable coverage and not claim the flags if there is at least one + // non-supporting sanitizer. + if (!(AllAddedKinds & ~setGroupBits(SupportsCoverage))) { Arg->claim(); } else { CoverageFeatures = 0; Modified: cfe/trunk/test/Driver/fsanitize-coverage.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize-coverage.c?rev=272717=272716=272717=diff == --- cfe/trunk/test/Driver/fsanitize-coverage.c (original) +++ cfe/trunk/test/Driver/fsanitize-coverage.c Tue Jun 14 16:33:40 2016 @@ -33,7 +33,7 @@ // CHECK-SANITIZE-COVERAGE-5: error: unsupported argument '5' to option 'fsanitize-coverage=' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED -// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-UNUSED: argument unused during compilation: '-fsanitize-coverage=func' // CHECK-SANITIZE-COVERAGE-UNUSED-NOT: -fsanitize-coverage-type=1 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis updated this revision to Diff 60759. eugenis added a comment. + docs Repository: rL LLVM http://reviews.llvm.org/D21317 Files: docs/SanitizerCoverage.rst lib/Driver/SanitizerArgs.cpp test/Driver/fsanitize-coverage.c Index: test/Driver/fsanitize-coverage.c === --- test/Driver/fsanitize-coverage.c +++ test/Driver/fsanitize-coverage.c @@ -33,7 +33,7 @@ // CHECK-SANITIZE-COVERAGE-5: error: unsupported argument '5' to option 'fsanitize-coverage=' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED -// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-UNUSED: argument unused during compilation: '-fsanitize-coverage=func' // CHECK-SANITIZE-COVERAGE-UNUSED-NOT: -fsanitize-coverage-type=1 Index: lib/Driver/SanitizerArgs.cpp === --- lib/Driver/SanitizerArgs.cpp +++ lib/Driver/SanitizerArgs.cpp @@ -159,11 +159,10 @@ } bool SanitizerArgs::needsUbsanRt() const { - return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) && - !Sanitizers.has(Address) && - !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && - !CfiCrossDso; + return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || + CoverageFeatures) && + !Sanitizers.has(Address) && !Sanitizers.has(Memory) && + !Sanitizers.has(Thread) && !CfiCrossDso; } bool SanitizerArgs::needsCfiRt() const { @@ -485,10 +484,10 @@ continue; } CoverageFeatures |= parseCoverageFeatures(D, Arg); - // If there is trace-pc, allow it w/o any of the sanitizers. - // Otherwise, require that one of the supported sanitizers is present. - if ((CoverageFeatures & CoverageTracePC) || - (AllAddedKinds & SupportsCoverage)) { + + // Disable coverage and not claim the flags if there is at least one + // non-supporting sanitizer. + if (!(AllAddedKinds & ~setGroupBits(SupportsCoverage))) { Arg->claim(); } else { CoverageFeatures = 0; Index: docs/SanitizerCoverage.rst === --- docs/SanitizerCoverage.rst +++ docs/SanitizerCoverage.rst @@ -16,8 +16,9 @@ SanitizerCoverage can be used with :doc:`AddressSanitizer`, -:doc:`LeakSanitizer`, :doc:`MemorySanitizer`, and UndefinedBehaviorSanitizer. -In addition to ``-fsanitize=``, pass one of the following compile-time flags: +:doc:`LeakSanitizer`, :doc:`MemorySanitizer`, +UndefinedBehaviorSanitizer, or without any sanitizer. Pass one of the +following compile-time flags: * ``-fsanitize-coverage=func`` for function-level coverage (very fast). * ``-fsanitize-coverage=bb`` for basic-block-level coverage (may add up to 30% @@ -27,8 +28,9 @@ You may also specify ``-fsanitize-coverage=indirect-calls`` for additional `caller-callee coverage`_. -At run time, pass ``coverage=1`` in ``ASAN_OPTIONS``, ``LSAN_OPTIONS``, -``MSAN_OPTIONS`` or ``UBSAN_OPTIONS``, as appropriate. +At run time, pass ``coverage=1`` in ``ASAN_OPTIONS``, +``LSAN_OPTIONS``, ``MSAN_OPTIONS`` or ``UBSAN_OPTIONS``, as +appropriate. For the standalone coverage mode, use ``UBSAN_OPTIONS``. To get `Coverage counters`_, add ``-fsanitize-coverage=8bit-counters`` to one of the above compile-time flags. At runtime, use Index: test/Driver/fsanitize-coverage.c === --- test/Driver/fsanitize-coverage.c +++ test/Driver/fsanitize-coverage.c @@ -33,7 +33,7 @@ // CHECK-SANITIZE-COVERAGE-5: error: unsupported argument '5' to option 'fsanitize-coverage=' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED -// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-UNUSED: argument unused during compilation: '-fsanitize-coverage=func' // CHECK-SANITIZE-COVERAGE-UNUSED-NOT: -fsanitize-coverage-type=1 Index: lib/Driver/SanitizerArgs.cpp === --- lib/Driver/SanitizerArgs.cpp +++ lib/Driver/SanitizerArgs.cpp @@ -159,11 +159,10 @@ } bool SanitizerArgs::needsUbsanRt() const { -
Re: [PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis added a comment. In http://reviews.llvm.org/D21317#457784, @kcc wrote: > Can you at least add a compiler-rt test where we ensure that this flag can > not be used such that it wil compile but fail to link? > > E.g. > > clang -fsanitize-coverage=edge x.c > > should compile *and* link (and run) http://reviews.llvm.org/D21339 Repository: rL LLVM http://reviews.llvm.org/D21317 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis added a comment. ubsan_standalone (that's what the needsUbsanRt change is for). Repository: rL LLVM http://reviews.llvm.org/D21317 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis added a comment. For the context, this is supposed to fix this problem: https://bugs.chromium.org/p/chromium/issues/detail?id=618534 Of course there are other ways of dealing with that that do not require changing the compiler, but this change seems like the right thing to do. The limitation on the standalone use of coverage seems arbitrary. Repository: rL LLVM http://reviews.llvm.org/D21317 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D21317: [sanitizer] Allow sanitize coverage w/o sanitizers.
eugenis created this revision. eugenis added reviewers: pcc, kcc. eugenis added a subscriber: cfe-commits. eugenis set the repository for this revision to rL LLVM. The reason is that this (a) seems to work just fine and (b) is useful when building stuff with sanitizer+coverage, but needing to exclude the sanitizer for a particular source file. Repository: rL LLVM http://reviews.llvm.org/D21317 Files: lib/Driver/SanitizerArgs.cpp test/Driver/fsanitize-coverage.c Index: test/Driver/fsanitize-coverage.c === --- test/Driver/fsanitize-coverage.c +++ test/Driver/fsanitize-coverage.c @@ -33,7 +33,7 @@ // CHECK-SANITIZE-COVERAGE-5: error: unsupported argument '5' to option 'fsanitize-coverage=' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED -// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-UNUSED: argument unused during compilation: '-fsanitize-coverage=func' // CHECK-SANITIZE-COVERAGE-UNUSED-NOT: -fsanitize-coverage-type=1 Index: lib/Driver/SanitizerArgs.cpp === --- lib/Driver/SanitizerArgs.cpp +++ lib/Driver/SanitizerArgs.cpp @@ -159,11 +159,10 @@ } bool SanitizerArgs::needsUbsanRt() const { - return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) && - !Sanitizers.has(Address) && - !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && - !CfiCrossDso; + return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || + CoverageFeatures) && + !Sanitizers.has(Address) && !Sanitizers.has(Memory) && + !Sanitizers.has(Thread) && !CfiCrossDso; } bool SanitizerArgs::needsCfiRt() const { @@ -485,10 +484,10 @@ continue; } CoverageFeatures |= parseCoverageFeatures(D, Arg); - // If there is trace-pc, allow it w/o any of the sanitizers. - // Otherwise, require that one of the supported sanitizers is present. - if ((CoverageFeatures & CoverageTracePC) || - (AllAddedKinds & SupportsCoverage)) { + + // Disable coverage and not claim the flags if there is at least one + // non-supporting sanitizer. + if (!(AllAddedKinds & ~setGroupBits(SupportsCoverage))) { Arg->claim(); } else { CoverageFeatures = 0; Index: test/Driver/fsanitize-coverage.c === --- test/Driver/fsanitize-coverage.c +++ test/Driver/fsanitize-coverage.c @@ -33,7 +33,7 @@ // CHECK-SANITIZE-COVERAGE-5: error: unsupported argument '5' to option 'fsanitize-coverage=' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED -// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-UNUSED +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-UNUSED: argument unused during compilation: '-fsanitize-coverage=func' // CHECK-SANITIZE-COVERAGE-UNUSED-NOT: -fsanitize-coverage-type=1 Index: lib/Driver/SanitizerArgs.cpp === --- lib/Driver/SanitizerArgs.cpp +++ lib/Driver/SanitizerArgs.cpp @@ -159,11 +159,10 @@ } bool SanitizerArgs::needsUbsanRt() const { - return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) && - !Sanitizers.has(Address) && - !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && - !CfiCrossDso; + return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || + CoverageFeatures) && + !Sanitizers.has(Address) && !Sanitizers.has(Memory) && + !Sanitizers.has(Thread) && !CfiCrossDso; } bool SanitizerArgs::needsCfiRt() const { @@ -485,10 +484,10 @@ continue; } CoverageFeatures |= parseCoverageFeatures(D, Arg); - // If there is trace-pc, allow it w/o any of the sanitizers. - // Otherwise, require that one of the supported sanitizers is present. - if ((CoverageFeatures & CoverageTracePC) || - (AllAddedKinds & SupportsCoverage)) { + + // Disable coverage and not claim the flags if there is at least one + // non-supporting sanitizer. + if (!(AllAddedKinds & ~setGroupBits(SupportsCoverage))) { Arg->claim(); } else { CoverageFeatures
Re: [PATCH] D20561: Warn when taking address of packed member
eugenis added a subscriber: eugenis. eugenis added a comment. In http://reviews.llvm.org/D20561#446031, @aaron.ballman wrote: > In http://reviews.llvm.org/D20561#445824, @rogfer01 wrote: > > > I think I wasn't clear with the purpose of the fix-it: there are a few > > cases where getting the address of an unaligned pointer is safe (i.e. false > > positives). > > > > For instance, when I checked Firefox and Chromium there are cases where > > getting the address of an unaligned pointer is fine. For the particular > > case of these two browsers, they both use a library (usrsctp) that > > represents protocol data as packed structs. That library passes addresses > > of packed fields to `memcpy` and `memmove` which is OK. > > > I think this is a false-positive that should be fixed. This patch was committed without fixing the false positive case, why? Could this warning be excluded from -Wall? Repository: rL LLVM http://reviews.llvm.org/D20561 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19854: Define Contiki OS toolchain
eugenis accepted this revision. eugenis added a comment. This revision is now accepted and ready to land. LGTM http://reviews.llvm.org/D19854 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21054: CodeGen: Update Clang to use the new type metadata.
eugenis accepted this revision. eugenis added a reviewer: eugenis. eugenis added a comment. This revision is now accepted and ready to land. LGTM http://reviews.llvm.org/D21054 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19854: Define Contiki OS toolchain
eugenis added a comment. This needs a driver test. http://reviews.llvm.org/D19854 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[libcxx] r267093 - Cleanup: move visibility/linkage attributes to the first declaration.
Author: eugenis Date: Thu Apr 21 20:04:55 2016 New Revision: 267093 URL: http://llvm.org/viewvc/llvm-project?rev=267093=rev Log: Cleanup: move visibility/linkage attributes to the first declaration. http://reviews.llvm.org/D15404 Modified: libcxx/trunk/include/complex libcxx/trunk/include/experimental/any libcxx/trunk/include/experimental/dynarray libcxx/trunk/include/ext/hash_map libcxx/trunk/include/ext/hash_set libcxx/trunk/include/forward_list libcxx/trunk/include/fstream libcxx/trunk/include/list libcxx/trunk/include/queue libcxx/trunk/include/unordered_map libcxx/trunk/include/unordered_set Modified: libcxx/trunk/include/complex URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/complex?rev=267093=267092=267093=diff == --- libcxx/trunk/include/complex (original) +++ libcxx/trunk/include/complex Thu Apr 21 20:04:55 2016 @@ -332,7 +332,9 @@ public: _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) : __re_(__re), __im_(__im) {} +_LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR complex(const complex& __c); +_LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR complex(const complex& __c); _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} @@ -388,7 +390,9 @@ public: _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) : __re_(__re), __im_(__im) {} +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(const complex& __c); +_LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR complex(const complex& __c); _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} @@ -444,7 +448,9 @@ public: _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) : __re_(__re), __im_(__im) {} +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(const complex& __c); +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(const complex& __c); _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} @@ -490,32 +496,32 @@ public: } }; -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_CONSTEXPR complex::complex(const complex& __c) : __re_(__c.real()), __im_(__c.imag()) {} Modified: libcxx/trunk/include/experimental/any URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/any?rev=267093=267092=267093=diff == --- libcxx/trunk/include/experimental/any (original) +++ libcxx/trunk/include/experimental/any Thu Apr 21 20:04:55 2016 @@ -113,10 +113,12 @@ class any; template typename add_pointer::type>::type +_LIBCPP_INLINE_VISIBILITY any_cast(any const *) _NOEXCEPT; template typename add_pointer<_ValueType>::type +_LIBCPP_INLINE_VISIBILITY any_cast(any *) _NOEXCEPT; namespace __any_imp @@ -185,6 +187,7 @@ public: class _ValueType , class = __any_imp::_EnableIfNotAny<_ValueType> > + _LIBCPP_INLINE_VISIBILITY any(_ValueType && __value); _LIBCPP_INLINE_VISIBILITY @@ -212,6 +215,7 @@ public: class _ValueType , class = __any_imp::_EnableIfNotAny<_ValueType> > + _LIBCPP_INLINE_VISIBILITY any & operator=(_ValueType && __rhs); // 6.3.3 any modifiers @@ -221,6 +225,7 @@ public: if (__h) this->__call(_Action::_Destroy); } + _LIBCPP_INLINE_VISIBILITY void swap(any & __rhs) _NOEXCEPT; // 6.3.4 any observers @@ -457,7 +462,6 @@ namespace __any_imp template -_LIBCPP_INLINE_VISIBILITY any::any(_ValueType && __v) : __h(nullptr) { typedef typename decay<_ValueType>::type _Tp; @@ -468,7 +472,6 @@ any::any(_ValueType && __v) : __h(nullpt } template -_LIBCPP_INLINE_VISIBILITY any & any::operator=(_ValueType && __v) { typedef typename decay<_ValueType>::type _Tp; @@ -478,7 +481,7 @@ any & any::operator=(_ValueType && __v) return *this; } -inline _LIBCPP_INLINE_VISIBILITY +inline void any::swap(any & __rhs) _NOEXCEPT { if (__h && __rhs.__h) {
Re: [PATCH] D15404: Cleanup: move visibility/linkage attributes to the first declaration (part 2).
eugenis closed this revision. eugenis added a comment. r267093 Thanks for your help! Repository: rL LLVM http://reviews.llvm.org/D15404 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D15404: Cleanup: move visibility/linkage attributes to the first declaration (part 2).
eugenis added a comment. This change does not affect libc++.so on Linux in any way. Repository: rL LLVM http://reviews.llvm.org/D15404 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D15404: Cleanup: move visibility/linkage attributes to the first declaration (part 2).
eugenis updated this revision to Diff 54562. eugenis added a comment. Updates with Eric's patch from https://gist.github.com/EricWF/487e5b1de2bb320e93fbb3c9c758b013 without the iostream changes. Repository: rL LLVM http://reviews.llvm.org/D15404 Files: include/complex include/experimental/any include/experimental/dynarray include/ext/hash_map include/ext/hash_set include/forward_list include/fstream include/list include/queue include/unordered_map include/unordered_set Index: include/unordered_set === --- include/unordered_set +++ include/unordered_set @@ -404,10 +404,12 @@ size_type __n, const hasher& __hf, const allocator_type& __a) : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {} #endif +_LIBCPP_INLINE_VISIBILITY explicit unordered_set(const allocator_type& __a); unordered_set(const unordered_set& __u); unordered_set(const unordered_set& __u, const allocator_type& __a); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +_LIBCPP_INLINE_VISIBILITY unordered_set(unordered_set&& __u) _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); unordered_set(unordered_set&& __u, const allocator_type& __a); @@ -439,10 +441,12 @@ return *this; } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +_LIBCPP_INLINE_VISIBILITY unordered_set& operator=(unordered_set&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); #endif #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +_LIBCPP_INLINE_VISIBILITY unordered_set& operator=(initializer_list __il); #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS @@ -527,6 +531,7 @@ #endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES template +_LIBCPP_INLINE_VISIBILITY void insert(_InputIterator __first, _InputIterator __last); #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS _LIBCPP_INLINE_VISIBILITY @@ -678,7 +683,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( const allocator_type& __a) : __table_(__a) @@ -715,7 +720,7 @@ #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( unordered_set&& __u) _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) @@ -792,7 +797,7 @@ #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_set<_Value, _Hash, _Pred, _Alloc>& unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) @@ -806,7 +811,7 @@ #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_set<_Value, _Hash, _Pred, _Alloc>& unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=( initializer_list __il) @@ -819,7 +824,7 @@ template template -inline _LIBCPP_INLINE_VISIBILITY +inline void unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, _InputIterator __last) @@ -940,10 +945,12 @@ size_type __n, const hasher& __hf, const allocator_type& __a) : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {} #endif +_LIBCPP_INLINE_VISIBILITY explicit unordered_multiset(const allocator_type& __a); unordered_multiset(const unordered_multiset& __u); unordered_multiset(const unordered_multiset& __u, const allocator_type& __a); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +_LIBCPP_INLINE_VISIBILITY unordered_multiset(unordered_multiset&& __u) _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); unordered_multiset(unordered_multiset&& __u, const allocator_type& __a); @@ -973,6 +980,7 @@ return *this; } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +_LIBCPP_INLINE_VISIBILITY unordered_multiset& operator=(unordered_multiset&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); #endif @@ -1029,6 +1037,7 @@ {return __table_.__insert_multi(__p, _VSTD::move(__x));} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES template +_LIBCPP_INLINE_VISIBILITY void insert(_InputIterator __first, _InputIterator __last); #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS _LIBCPP_INLINE_VISIBILITY @@ -1181,7 +1190,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( const allocator_type& __a) : __table_(__a) @@ -1218,7 +1227,7 @@ #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template -inline _LIBCPP_INLINE_VISIBILITY +inline unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( unordered_multiset&& __u)
Re: [PATCH] D19170: [safestack] Link SafeStack runtime only when not using separate stack segment
eugenis accepted this revision. eugenis added a comment. This revision is now accepted and ready to land. LGTM http://reviews.llvm.org/D19170 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19170: [safestack] Link SafeStack runtime only when not using separate stack segment
eugenis added a comment. In http://reviews.llvm.org/D19170#402939, @mlemay-intel wrote: > In http://reviews.llvm.org/D19170#402861, @eugenis wrote: > > > Test, please. > > > Do you know of any examples of the sort of test that you would like to see > for a feature like this? test/Driver/sanitizer-ld.c http://reviews.llvm.org/D19170 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19170: [safestack] Link SafeStack runtime only when not using separate stack segment
eugenis added a comment. Test, please. Where is this runtime support implemented? Some platform's libc, or an external library? http://reviews.llvm.org/D19170 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r266095 - Stricter checks in the stack-protector codegen test.
Author: eugenis Date: Tue Apr 12 12:51:59 2016 New Revision: 266095 URL: http://llvm.org/viewvc/llvm-project?rev=266095=rev Log: Stricter checks in the stack-protector codegen test. Modified: cfe/trunk/test/CodeGen/stack-protector.c Modified: cfe/trunk/test/CodeGen/stack-protector.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/stack-protector.c?rev=266095=266094=266095=diff == --- cfe/trunk/test/CodeGen/stack-protector.c (original) +++ cfe/trunk/test/CodeGen/stack-protector.c Tue Apr 12 12:51:59 2016 @@ -23,13 +23,13 @@ void test1(const char *msg) { } // NOSSP-NOT: attributes #[[A]] = {{.*}} ssp -// SSP: attributes #[[A]] = {{.*}} ssp +// SSP: attributes #[[A]] = {{.*}} ssp{{ }} // SSPSTRONG: attributes #[[A]] = {{.*}} sspstrong // SSPREQ: attributes #[[A]] = {{.*}} sspreq // SAFESTACK-NOSSP: attributes #[[A]] = {{.*}} safestack // SAFESTACK-NOSSP-NOT: ssp -// SAFESTACK-SSP: attributes #[[A]] = {{.*}} safestack ssp +// SAFESTACK-SSP: attributes #[[A]] = {{.*}} safestack ssp{{ }} // SAFESTACK-SSPSTRONG: attributes #[[A]] = {{.*}} safestack sspstrong // SAFESTACK-SSPREQ: attributes #[[A]] = {{.*}} safestack sspreq ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r266005 - Allow simultaneous safestack and stackprotector attributes.
Author: eugenis Date: Mon Apr 11 17:27:55 2016 New Revision: 266005 URL: http://llvm.org/viewvc/llvm-project?rev=266005=rev Log: Allow simultaneous safestack and stackprotector attributes. This is the clang part of http://reviews.llvm.org/D18846. SafeStack instrumentation pass adds stack protector canaries if both attributes are present on a function. StackProtector pass will step back if the function has a safestack attribute. Modified: cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/CodeGen/stack-protector.c cfe/trunk/test/Driver/fsanitize.c Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=266005=266004=266005=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Mon Apr 11 17:27:55 2016 @@ -4878,15 +4878,10 @@ void Clang::ConstructJob(Compilation , // -stack-protector=0 is default. unsigned StackProtectorLevel = 0; - if (getToolChain().getSanitizerArgs().needsSafeStackRt()) { -Args.ClaimAllArgs(options::OPT_fno_stack_protector); -Args.ClaimAllArgs(options::OPT_fstack_protector_all); -Args.ClaimAllArgs(options::OPT_fstack_protector_strong); -Args.ClaimAllArgs(options::OPT_fstack_protector); - } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, - options::OPT_fstack_protector_all, - options::OPT_fstack_protector_strong, - options::OPT_fstack_protector)) { + if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, + options::OPT_fstack_protector_all, + options::OPT_fstack_protector_strong, + options::OPT_fstack_protector)) { if (A->getOption().matches(options::OPT_fstack_protector)) { StackProtectorLevel = std::max( LangOptions::SSPOn, Modified: cfe/trunk/test/CodeGen/stack-protector.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/stack-protector.c?rev=266005=266004=266005=diff == --- cfe/trunk/test/CodeGen/stack-protector.c (original) +++ cfe/trunk/test/CodeGen/stack-protector.c Mon Apr 11 17:27:55 2016 @@ -1,13 +1,13 @@ -// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 0 | FileCheck -check-prefix=NOSSP %s -// NOSSP: define {{.*}}void @test1(i8* %msg) #0 { -// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 1 | FileCheck -check-prefix=WITHSSP %s -// WITHSSP: define {{.*}}void @test1(i8* %msg) #0 { -// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 2 | FileCheck -check-prefix=SSPSTRONG %s -// SSPSTRONG: define {{.*}}void @test1(i8* %msg) #0 { -// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 3 | FileCheck -check-prefix=SSPREQ %s -// SSPREQ: define {{.*}}void @test1(i8* %msg) #0 { -// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack | FileCheck -check-prefix=SAFESTACK %s -// SAFESTACK: define {{.*}}void @test1(i8* %msg) #0 { +// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 0 | FileCheck -check-prefix=DEF -check-prefix=NOSSP %s +// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 1 | FileCheck -check-prefix=DEF -check-prefix=SSP %s +// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 2 | FileCheck -check-prefix=DEF -check-prefix=SSPSTRONG %s +// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 3 | FileCheck -check-prefix=DEF -check-prefix=SSPREQ %s + +// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-NOSSP %s +// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 0 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-NOSSP %s +// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 1 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSP %s +// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 2 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSPSTRONG %s +// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 3 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSPREQ %s typedef __SIZE_TYPE__ size_t; @@ -15,18 +15,21 @@ int printf(const char * _Format, ...); size_t strlen(const char *s); char *strcpy(char *s1, const char *s2); +// DEF: define {{.*}}void @test1(i8* %msg) #[[A:.*]] { void test1(const char *msg) { char a[strlen(msg) + 1]; strcpy(a, msg); printf("%s\n", a); } -// NOSSP: attributes #{{.*}} = { nounwind{{.*}} } - -// WITHSSP: attributes #{{.*}} = { nounwind ssp{{.*}} } - -// SSPSTRONG: attributes #{{.*}} = { nounwind sspstrong{{.*}} } - -// SSPREQ: attributes #{{.*}} = { nounwind sspreq{{.*}} } - -// SAFESTACK: attributes #{{.*}} = { nounwind safestack{{.*}} } +// NOSSP-NOT: attributes #[[A]] =
Re: [PATCH] D18635: Rework interface for bitset-using features to use a notion of class scope.
eugenis added inline comments. Comment at: docs/ClassScope.rst:23 @@ +22,3 @@ + + - ``-fdefault-class-scope=attrs`` indicates that the compiler will infer + class scope based on platform-specific attributes that control the class's Maybe call it "default"? Attrs sounds too specific. Basically this setting lets clang figure out scope based on the source code. Comment at: docs/ClassScope.rst:28 @@ +27,3 @@ + or the ``-fvisibility=hidden -fvisibility-inlines-hidden`` flags) + receive global scope, and all others receive linkage-unit scope. When + targeting Windows, classes with the ``__declspec(dllexport)`` or hidden visibility = linkage-unit scope, not global scope. Comment at: docs/ControlFlowIntegrity.rst:271 @@ +270,3 @@ +linkage-unit scope. With this flag enabled, the compiler will emit cross-DSO +CFI checks for all classes, except for those which appear in the CFI blacklist +or which use a ``no_sanitize`` attribute. Do we emit a fast non-cross-DSO check for classes with linkage-unit scope? http://reviews.llvm.org/D18635 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis added a comment. r263578, finally Repository: rL LLVM http://reviews.llvm.org/D17360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r263578 - [cfi] Don't emit checks for disabled CFI kinds.
Author: eugenis Date: Tue Mar 15 15:19:29 2016 New Revision: 263578 URL: http://llvm.org/viewvc/llvm-project?rev=263578=rev Log: [cfi] Don't emit checks for disabled CFI kinds. In the cross-DSO CFI mode clang emits __cfi_check_fail that handles errors triggered from other modules with targets in the current module. With this change, __cfi_check_fail will handle errors for CFI kinds that are not enabled in the current module as if they have the trapping behaviour (-fsanitize-trap=...). This fixes a bug where some combinations of -fsanitize* flags may result in a link failure due to a missing sanitizer runtime library for the diagnostic calls in __cfi_check_fail. Added: cfe/trunk/test/CodeGen/cfi-check-fail2.c - copied, changed from r263574, cfe/trunk/test/CodeGen/cfi-check-fail.c Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/test/CodeGen/cfi-check-fail.c Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=263578=263577=263578=diff == --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Mar 15 15:19:29 2016 @@ -2479,16 +2479,12 @@ void CodeGenFunction::EmitCheck( assert(JointCond); CheckRecoverableKind RecoverKind = getRecoverableKind(Checked[0].second); - // In cross-DSO CFI mode this code is used to generate __cfi_check_fail, which - // includes all checks, even those that are not in SanOpts. - assert(CGM.getCodeGenOpts().SanitizeCfiCrossDso || - SanOpts.has(Checked[0].second)); + assert(SanOpts.has(Checked[0].second)); #ifndef NDEBUG for (int i = 1, n = Checked.size(); i < n; ++i) { assert(RecoverKind == getRecoverableKind(Checked[i].second) && "All recoverable kinds in a single check must be same!"); -assert(CGM.getCodeGenOpts().SanitizeCfiCrossDso || - SanOpts.has(Checked[i].second)); +assert(SanOpts.has(Checked[i].second)); } #endif @@ -2670,8 +2666,11 @@ void CodeGenFunction::EmitCfiCheckFail() SanitizerMask Mask = CheckKindMaskPair.second; llvm::Value *Cond = Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty, Kind)); -EmitCheck(std::make_pair(Cond, Mask), "cfi_check_fail", {}, - {Data, Addr, ValidVtable}); +if (CGM.getLangOpts().Sanitize.has(Mask)) + EmitCheck(std::make_pair(Cond, Mask), "cfi_check_fail", {}, +{Data, Addr, ValidVtable}); +else + EmitTrapCheck(Cond); } FinishFunction(); Modified: cfe/trunk/test/CodeGen/cfi-check-fail.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/cfi-check-fail.c?rev=263578=263577=263578=diff == --- cfe/trunk/test/CodeGen/cfi-check-fail.c (original) +++ cfe/trunk/test/CodeGen/cfi-check-fail.c Tue Mar 15 15:19:29 2016 @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize-cfi-cross-dso \ +// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \ // RUN: -fsanitize-trap=cfi-icall,cfi-nvcall -fsanitize-recover=cfi-vcall,cfi-unrelated-cast \ // RUN: -emit-llvm -o - %s | FileCheck %s Copied: cfe/trunk/test/CodeGen/cfi-check-fail2.c (from r263574, cfe/trunk/test/CodeGen/cfi-check-fail.c) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/cfi-check-fail2.c?p2=cfe/trunk/test/CodeGen/cfi-check-fail2.c=cfe/trunk/test/CodeGen/cfi-check-fail.c=263574=263578=263578=diff == --- cfe/trunk/test/CodeGen/cfi-check-fail.c (original) +++ cfe/trunk/test/CodeGen/cfi-check-fail2.c Tue Mar 15 15:19:29 2016 @@ -1,5 +1,6 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ -// RUN: -fsanitize-trap=cfi-icall,cfi-nvcall -fsanitize-recover=cfi-vcall,cfi-unrelated-cast \ +// __cfi_check_fail codegen when not all CFI checkers are enabled. +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize-cfi-cross-dso \ +// RUN: -fsanitize=cfi-vcall \ // RUN: -emit-llvm -o - %s | FileCheck %s void caller(void (*f)()) { @@ -30,8 +31,8 @@ void caller(void (*f)()) { // CHECK: [[HANDLE0]]: // CHECK: %[[DATA0:.*]] = ptrtoint i8* %[[DATA]] to i64, // CHECK: %[[ADDR0:.*]] = ptrtoint i8* %[[ADDR]] to i64, -// CHECK: call void @__ubsan_handle_cfi_check_fail(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]]) -// CHECK: br label %[[CONT1]] +// CHECK: call void @__ubsan_handle_cfi_check_fail_abort(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]]) +// CHECK: unreachable // CHECK: [[CONT1]]: // CHECK: %[[NOT_1:.*]] = icmp ne i8 %[[KIND]], 1 @@ -43,23 +44,19 @@ void caller(void (*f)()) { // CHECK:
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis added a comment. No, this is not committed. I've run dcommit in the wrong checkout and landed http://reviews.llvm.org/D17900 instead. Repository: rL LLVM http://reviews.llvm.org/D17360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D18107: Disable CFI checks in std::addressof.
eugenis closed this revision. eugenis added a comment. r263310 Thanks! Repository: rL LLVM http://reviews.llvm.org/D18107 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[libcxx] r263310 - Disable CFI checks in std::addressof.
Author: eugenis Date: Fri Mar 11 17:50:57 2016 New Revision: 263310 URL: http://llvm.org/viewvc/llvm-project?rev=263310=rev Log: Disable CFI checks in std::addressof. std::addressof may be used on a storage of an object before the start of its lifetime (see std::allocate_shared for example). CFI flags the C-style cast as invalid in that case. Modified: libcxx/trunk/include/type_traits Modified: libcxx/trunk/include/type_traits URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=263310=263309=263310=diff == --- libcxx/trunk/include/type_traits (original) +++ libcxx/trunk/include/type_traits Fri Mar 11 17:50:57 2016 @@ -399,7 +399,7 @@ template us // addressof template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY _Tp* addressof(_Tp& __x) _NOEXCEPT { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D18107: Disable CFI checks in std::addressof.
eugenis created this revision. eugenis added a reviewer: EricWF. eugenis added a subscriber: cfe-commits. eugenis set the repository for this revision to rL LLVM. std::addressof may be used on a storage of an object before the start of its lifetime (see std::allocate_shared for example). CFI flags the C-style cast as invalid in that case. Repository: rL LLVM http://reviews.llvm.org/D18107 Files: include/type_traits Index: include/type_traits === --- include/type_traits +++ include/type_traits @@ -399,7 +399,7 @@ // addressof template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY _Tp* addressof(_Tp& __x) _NOEXCEPT { Index: include/type_traits === --- include/type_traits +++ include/type_traits @@ -399,7 +399,7 @@ // addressof template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY _Tp* addressof(_Tp& __x) _NOEXCEPT { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D16538: [cc1as] Add MCTargetOptions argument to createAsmBackend
eugenis added inline comments. Comment at: tools/driver/cc1as_main.cpp:413-416 @@ -412,6 +414,6 @@ // FIXME: init MCTargetOptions from sanitizer flags here. MCTargetOptions Options; std::unique_ptr TAP( TheTarget->createMCAsmParser(*STI, *Parser, *MCII, Options)); if (!TAP) dsanders wrote: > @eugenis: Do you know what needs to be done for this FIXME? I think this is about allowing -fsanitize=address as a cc1as flag to enable asan instrumentation in standalone assembly files. Currently it is only supported in inline assembly. http://reviews.llvm.org/D16538 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis closed this revision. eugenis added a comment. r263180, thanks for the review! Repository: rL LLVM http://reviews.llvm.org/D17360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis added a comment. ping Repository: rL LLVM http://reviews.llvm.org/D17360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis updated the summary for this revision. eugenis updated this revision to Diff 49115. eugenis added a comment. OK, done. Please take another look. This is inferior to the original patch in terms of functionality, but the implementation is a lot simpler. Repository: rL LLVM http://reviews.llvm.org/D17360 Files: lib/CodeGen/CGExpr.cpp test/CodeGen/cfi-check-fail.c test/CodeGen/cfi-check-fail2.c Index: test/CodeGen/cfi-check-fail2.c === --- /dev/null +++ test/CodeGen/cfi-check-fail2.c @@ -0,0 +1,70 @@ +// __cfi_check_fail codegen when not all CFI checkers are enabled. +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize-cfi-cross-dso \ +// RUN: -fsanitize=cfi-vcall \ +// RUN: -emit-llvm -o - %s | FileCheck %s + +void caller(void (*f)()) { + f(); +} + +// CHECK: define weak_odr hidden void @__cfi_check_fail(i8*, i8*) { +// CHECK: store i8* %0, i8** %[[ALLOCA0:.*]], align 8 +// CHECK: store i8* %1, i8** %[[ALLOCA1:.*]], align 8 +// CHECK: %[[DATA:.*]] = load i8*, i8** %[[ALLOCA0]], align 8 +// CHECK: %[[ADDR:.*]] = load i8*, i8** %[[ALLOCA1]], align 8 +// CHECK: %[[ICMP_NOT_NULL:.*]] = icmp ne i8* %[[DATA]], null +// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]], + +// CHECK: [[TRAP]]: +// CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable + +// CHECK: [[CONT0]]: +// CHECK: %[[A:.*]] = bitcast i8* %[[DATA]] to { i8, { i8*, i32, i32 }, i8* }* +// CHECK: %[[KINDPTR:.*]] = getelementptr {{.*}} %[[A]], i32 0, i32 0 +// CHECK: %[[KIND:.*]] = load i8, i8* %[[KINDPTR]], align 4 +// CHECK: %[[VTVALID0:.*]] = call i1 @llvm.bitset.test(i8* %[[ADDR]], metadata !"all-vtables") +// CHECK: %[[VTVALID:.*]] = zext i1 %[[VTVALID0]] to i64 +// CHECK: %[[NOT_0:.*]] = icmp ne i8 %[[KIND]], 0 +// CHECK: br i1 %[[NOT_0]], label %[[CONT1:.*]], label %[[HANDLE0:.*]], !prof + +// CHECK: [[HANDLE0]]: +// CHECK: %[[DATA0:.*]] = ptrtoint i8* %[[DATA]] to i64, +// CHECK: %[[ADDR0:.*]] = ptrtoint i8* %[[ADDR]] to i64, +// CHECK: call void @__ubsan_handle_cfi_check_fail_abort(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]]) +// CHECK: unreachable + +// CHECK: [[CONT1]]: +// CHECK: %[[NOT_1:.*]] = icmp ne i8 %[[KIND]], 1 +// CHECK: br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !nosanitize + +// CHECK: [[HANDLE1]]: +// CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable + +// CHECK: [[CONT2]]: +// CHECK: %[[NOT_2:.*]] = icmp ne i8 %[[KIND]], 2 +// CHECK: br i1 %[[NOT_2]], label %[[CONT3:.*]], label %[[HANDLE2:.*]], !nosanitize + +// CHECK: [[HANDLE2]]: +// CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable + +// CHECK: [[CONT3]]: +// CHECK: %[[NOT_3:.*]] = icmp ne i8 %[[KIND]], 3 +// CHECK: br i1 %[[NOT_3]], label %[[CONT4:.*]], label %[[HANDLE3:.*]], !nosanitize + +// CHECK: [[HANDLE3]]: +// CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable + +// CHECK: [[CONT4]]: +// CHECK: %[[NOT_4:.*]] = icmp ne i8 %[[KIND]], 4 +// CHECK: br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !nosanitize + +// CHECK: [[HANDLE4]]: +// CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable + +// CHECK: [[CONT5]]: +// CHECK: ret void Index: test/CodeGen/cfi-check-fail.c === --- test/CodeGen/cfi-check-fail.c +++ test/CodeGen/cfi-check-fail.c @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize=cfi-icall -fsanitize-cfi-cross-dso \ +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O0 -fsanitize-cfi-cross-dso \ +// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \ // RUN: -fsanitize-trap=cfi-icall,cfi-nvcall -fsanitize-recover=cfi-vcall,cfi-unrelated-cast \ // RUN: -emit-llvm -o - %s | FileCheck %s Index: lib/CodeGen/CGExpr.cpp === --- lib/CodeGen/CGExpr.cpp +++ lib/CodeGen/CGExpr.cpp @@ -2483,14 +2483,12 @@ CheckRecoverableKind RecoverKind = getRecoverableKind(Checked[0].second); // In cross-DSO CFI mode this code is used to generate __cfi_check_fail, which // includes all checks, even those that are not in SanOpts. - assert(CGM.getCodeGenOpts().SanitizeCfiCrossDso || - SanOpts.has(Checked[0].second)); + assert(SanOpts.has(Checked[0].second)); #ifndef NDEBUG for (int i = 1, n = Checked.size(); i < n; ++i) { assert(RecoverKind == getRecoverableKind(Checked[i].second) && "All recoverable kinds in a single check must be same!"); -assert(CGM.getCodeGenOpts().SanitizeCfiCrossDso || - SanOpts.has(Checked[i].second)); +assert(SanOpts.has(Checked[i].second)); } #endif @@ -2672,8 +2670,11 @@ SanitizerMask Mask = CheckKindMaskPair.second; llvm::Value *Cond = Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty,
Re: [PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis added a comment. This lets us support the following case: module A checks vcalls and casts, with diagnostics module B checks vcalls but not casts (but it still has bitsets for vtables), with diagnostics then a cast check from module A with a target in module B should print diagnostics instead of trapping It's definitely not critical functionality, but could be nice to have, especially as it does not cost us anything. And yes, CodeGenModule::NeedAllVtablesBitSet needs to be fixed for this work. WDYT? Repository: rL LLVM http://reviews.llvm.org/D17360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D17360: [cfi] Fix handling of sanitize trap/recover flags in the cross-DSO CFI mode.
eugenis created this revision. eugenis added reviewers: pcc, krasin. eugenis added a subscriber: cfe-commits. eugenis set the repository for this revision to rL LLVM. In the cross-DSO CFI mode a module may be asked to handle any type of CFI error, even if the module itself is not checked for that type of error. Therefore, trap/recover flags should be preserved all CFI checkers and not just for the ones that are enabled. This fixes a linker error caused by the missing cfi_diag runtime library with certain combinations of CFI flags (see the new test case). Repository: rL LLVM http://reviews.llvm.org/D17360 Files: lib/Driver/SanitizerArgs.cpp test/Driver/fsanitize.c Index: test/Driver/fsanitize.c === --- test/Driver/fsanitize.c +++ test/Driver/fsanitize.c @@ -272,6 +272,21 @@ // CHECK-CFI-NO-CROSS-DSO: -emit-llvm-bc // CHECK-CFI-NO-CROSS-DSO-NOT: -fsanitize-cfi-cross-dso +// In the non-cross-dso CFI mode, -fsanitize-trap only appears for enabled CFI checkers. +// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi-vcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-VCALL-TRAP +// CHECK-CFI-VCALL-TRAP: "-fsanitize=cfi-vcall" "-fsanitize-trap=cfi-vcall" + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi-vcall -fno-sanitize-trap=cfi-vcall -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-VCALL-NO-TRAP +// CHECK-CFI-VCALL-NO-TRAP: "-fsanitize=cfi-vcall" +// CHECK-CFI-VCALL-NO-TRAP-NOT: -fsanitize-trap= + +// In the cross-dso CFI mode, -fsanitize-trap appears for all CFI checkers. +// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi-vcall -fsanitize-cfi-cross-dso -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-CROSS-DSO-VCALL-TRAP +// CHECK-CFI-CROSS-DSO-VCALL-TRAP: "-fsanitize=cfi-vcall" "-fsanitize-trap=cfi-derived-cast,cfi-icall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi-vcall -fno-sanitize-trap=cfi-vcall -fsanitize-cfi-cross-dso -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-CROSS-DSO-VCALL-NO-TRAP +// CHECK-CFI-CROSS-DSO-VCALL-NO-TRAP: "-fsanitize=cfi-vcall" "-fsanitize-trap=cfi-derived-cast,cfi-icall,cfi-unrelated-cast,cfi-nvcall" + // RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -fsanitize-stats -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-STATS // CHECK-CFI-STATS: -fsanitize-stats Index: lib/Driver/SanitizerArgs.cpp === --- lib/Driver/SanitizerArgs.cpp +++ lib/Driver/SanitizerArgs.cpp @@ -166,11 +166,11 @@ } bool SanitizerArgs::needsCfiRt() const { - return !(Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso; + return !(CFI & ~TrapSanitizers.Mask) && CfiCrossDso; } bool SanitizerArgs::needsCfiDiagRt() const { - return (Sanitizers.Mask & CFI & ~TrapSanitizers.Mask) && CfiCrossDso; + return (CFI & ~TrapSanitizers.Mask) && CfiCrossDso; } bool SanitizerArgs::requiresPIE() const { @@ -361,10 +361,27 @@ << DeprecatedReplacement; } } - RecoverableKinds &= Kinds; - RecoverableKinds &= ~Unrecoverable; - TrappingKinds &= Kinds; + if (AllAddedKinds & CFI) { +CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso, + options::OPT_fno_sanitize_cfi_cross_dso, false); +// Without PIE, external function address may resolve to a PLT record, which +// can not be verified by the target module. +NeedPIE |= CfiCrossDso; + } + + // In the cross-DSO CFI mode a module may be asked to handle any type of CFI + // error, even if the module itself is not checked for that type of error. + // Therefore, trap/recover flags should be preserved all CFI checkers. + if (CfiCrossDso) { +TrappingKinds &= (Kinds | CFI); +RecoverableKinds &= (Kinds | CFI); + } else { +TrappingKinds &= Kinds; +RecoverableKinds &= Kinds; + } + + RecoverableKinds &= ~Unrecoverable; // Setup blacklist files. // Add default blacklist from resource directory. @@ -424,14 +441,6 @@ TC.getTriple().getArch() == llvm::Triple::x86_64); } - if (AllAddedKinds & CFI) { -CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso, - options::OPT_fno_sanitize_cfi_cross_dso, false); -// Without PIE, external function address may resolve to a PLT record, which -// can not be verified by the target module. -NeedPIE |= CfiCrossDso; - } - Stats = Args.hasFlag(options::OPT_fsanitize_stats, options::OPT_fno_sanitize_stats, false); Index: test/Driver/fsanitize.c === --- test/Driver/fsanitize.c +++ test/Driver/fsanitize.c @@ -272,6 +272,21 @@ // CHECK-CFI-NO-CROSS-DSO: -emit-llvm-bc // CHECK-CFI-NO-CROSS-DSO-NOT: -fsanitize-cfi-cross-dso +// In the
[libcxx] r260441 - Fix invalid casts in .
Author: eugenis Date: Wed Feb 10 15:53:28 2016 New Revision: 260441 URL: http://llvm.org/viewvc/llvm-project?rev=260441=rev Log: Fix invalid casts in . static_cast of a pointer to object before the start of the object's lifetime has undefined behavior. This code triggers CFI warnings. This change replaces C-style casts with reinterpret_cast, which is fine per the standard, add applies an attribute to silence CFI (which barks on reinterpret_cast, too). Modified: libcxx/trunk/include/__config libcxx/trunk/include/functional Modified: libcxx/trunk/include/__config URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=260441=260440=260441=diff == --- libcxx/trunk/include/__config (original) +++ libcxx/trunk/include/__config Wed Feb 10 15:53:28 2016 @@ -180,6 +180,12 @@ # endif #endif // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN) +#if __has_attribute(__no_sanitize__) +#define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi"))) +#else +#define _LIBCPP_NO_CFI +#endif + #ifdef _WIN32 // only really useful for a DLL Modified: libcxx/trunk/include/functional URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/functional?rev=260441=260440=260441=diff == --- libcxx/trunk/include/functional (original) +++ libcxx/trunk/include/functional Wed Feb 10 15:53:28 2016 @@ -1564,6 +1564,10 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp typename aligned_storage<3*sizeof(void*)>::type __buf_; __base* __f_; +_LIBCPP_NO_CFI static __base *__as_base(void *p) { + return reinterpret_cast<__base*>(p); +} + template ::value && __invokable<_Fp&, _ArgTypes...>::value> struct __callable; @@ -1660,9 +1664,9 @@ function<_Rp(_ArgTypes...)>::function(co { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (const __base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1676,9 +1680,9 @@ function<_Rp(_ArgTypes...)>::function(al { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (const __base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1690,9 +1694,9 @@ function<_Rp(_ArgTypes...)>::function(fu { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1709,9 +1713,9 @@ function<_Rp(_ArgTypes...)>::function(al { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1736,8 +1740,7 @@ function<_Rp(_ArgTypes...)>::function(_F typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f)); } else { @@ -1766,8 +1769,7 @@ function<_Rp(_ArgTypes...)>::function(al if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a)); } else { @@ -1791,16 +1793,16 @@ template function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if ((void *)__f_ == &__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); __f_ = 0; if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1815,7 +1817,7 @@ template function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if ((void *)__f_ == &__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1840,7 +1842,7 @@ function<_Rp(_ArgTypes...)>::operator=(_
Re: [PATCH] D16738: Fix invalid casts in .
eugenis closed this revision. eugenis added a comment. Thanks for the review! Committed as r260441. Repository: rL LLVM http://reviews.llvm.org/D16738 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D16738: Fix invalid casts in .
eugenis added a comment. In http://reviews.llvm.org/D16738#345696, @EricWF wrote: > I prefer using the `(void*)` casts when possible. In particular when doing > the pointer comparisons. Could you change those back to `void*` casts then > use the `__as_base` function for the rest? done Repository: rL LLVM http://reviews.llvm.org/D16738 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D16738: Fix invalid casts in .
eugenis updated this revision to Diff 47271. Repository: rL LLVM http://reviews.llvm.org/D16738 Files: include/__config include/functional Index: include/functional === --- include/functional +++ include/functional @@ -1564,6 +1564,10 @@ typename aligned_storage<3*sizeof(void*)>::type __buf_; __base* __f_; +_LIBCPP_NO_CFI static __base *__as_base(void *p) { + return reinterpret_cast<__base*>(p); +} + template ::value && __invokable<_Fp&, _ArgTypes...>::value> struct __callable; @@ -1660,9 +1664,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (const __base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1676,9 +1680,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (const __base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1690,9 +1694,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1709,9 +1713,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1736,8 +1740,7 @@ typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f)); } else { @@ -1766,8 +1769,7 @@ if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a)); } else { @@ -1791,16 +1793,16 @@ function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if ((void *)__f_ == &__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); __f_ = 0; if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1815,7 +1817,7 @@ function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if ((void *)__f_ == &__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1840,7 +1842,7 @@ template function<_Rp(_ArgTypes...)>::~function() { -if (__f_ == (__base*)&__buf_) +if ((void *)__f_ == &__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1850,34 +1852,34 @@ void function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT { -if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) +if ((void *)__f_ == &__buf_ && (void *)__f.__f_ == &__f.__buf_) { typename aligned_storage::type __tempbuf; -__base* __t = (__base*)&__tempbuf; +__base* __t = __as_base(&__tempbuf); __f_->__clone(__t); __f_->destroy(); __f_ = 0; -__f.__f_->__clone((__base*)&__buf_); +__f.__f_->__clone(__as_base(&__buf_)); __f.__f_->destroy(); __f.__f_ = 0; -__f_ = (__base*)&__buf_; -__t->__clone((__base*)&__f.__buf_); +__f_ = __as_base(&__buf_); +__t->__clone(__as_base(&__f.__buf_)); __t->destroy(); -__f.__f_ = (__base*)&__f.__buf_; +__f.__f_ = __as_base(&__f.__buf_); } -else if (__f_ == (__base*)&__buf_) +else if ((void *)__f_ == &__buf_) { -__f_->__clone((__base*)&__f.__buf_); +__f_->__clone(__as_base(&__f.__buf_)); __f_->destroy(); __f_ = __f.__f_; -__f.__f_ = (__base*)&__f.__buf_; +__f.__f_ = __as_base(&__f.__buf_); } -else if (__f.__f_ == (__base*)&__f.__buf_) +else if ((void *)__f.__f_ == &__f.__buf_) { -
Re: [PATCH] D16823: [cfi] Safe handling of unaddressable vtable pointers (clang).
eugenis closed this revision. eugenis added a comment. http://llvm.org/viewvc/llvm-project?rev=259716=rev Repository: rL LLVM http://reviews.llvm.org/D16823 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r259716 - [cfi] Safe handling of unaddressable vtable pointers (clang).
Author: eugenis Date: Wed Feb 3 16:18:55 2016 New Revision: 259716 URL: http://llvm.org/viewvc/llvm-project?rev=259716=rev Log: [cfi] Safe handling of unaddressable vtable pointers (clang). Avoid crashing when printing diagnostics for vtable-related CFI errors. In diagnostic mode, the frontend does an additional check of the vtable pointer against the set of all known vtable addresses and lets the runtime handler know if it is safe to inspect the vtable. http://reviews.llvm.org/D16823 Modified: cfe/trunk/lib/CodeGen/CGClass.cpp cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/CodeGenModule.h cfe/trunk/test/CodeGen/cfi-check-fail.c cfe/trunk/test/CodeGenCXX/cfi-cast.cpp cfe/trunk/test/CodeGenCXX/cfi-vcall.cpp Modified: cfe/trunk/lib/CodeGen/CGClass.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=259716=259715=259716=diff == --- cfe/trunk/lib/CodeGen/CGClass.cpp (original) +++ cfe/trunk/lib/CodeGen/CGClass.cpp Wed Feb 3 16:18:55 2016 @@ -2607,10 +2607,22 @@ void CodeGenFunction::EmitVTablePtrCheck auto TypeId = CGM.CreateCfiIdForTypeMetadata(MD); if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && TypeId) { EmitCfiSlowPathCheck(M, BitSetTest, TypeId, CastedVTable, StaticData); - } else { -EmitCheck(std::make_pair(BitSetTest, M), "cfi_check_fail", StaticData, - CastedVTable); +return; } + + if (CGM.getCodeGenOpts().SanitizeTrap.has(M)) { +EmitTrapCheck(BitSetTest); +return; + } + + llvm::Value *AllVtables = llvm::MetadataAsValue::get( + CGM.getLLVMContext(), + llvm::MDString::get(CGM.getLLVMContext(), "all-vtables")); + llvm::Value *ValidVtable = + Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::bitset_test), + {CastedVTable, AllVtables}); + EmitCheck(std::make_pair(BitSetTest, M), "cfi_check_fail", StaticData, +{CastedVTable, ValidVtable}); } // FIXME: Ideally Expr::IgnoreParenNoopCasts should do this, but it doesn't do Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=259716=259715=259716=diff == --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Feb 3 16:18:55 2016 @@ -2636,6 +2636,14 @@ void CodeGenFunction::EmitCfiCheckFail() Address CheckKindAddr(V, getIntAlign()); llvm::Value *CheckKind = Builder.CreateLoad(CheckKindAddr); + llvm::Value *AllVtables = llvm::MetadataAsValue::get( + CGM.getLLVMContext(), + llvm::MDString::get(CGM.getLLVMContext(), "all-vtables")); + llvm::Value *ValidVtable = Builder.CreateZExt( + Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::bitset_test), + {Addr, AllVtables}), + IntPtrTy); + const std::pairCheckKinds[] = { {CFITCK_VCall, SanitizerKind::CFIVCall}, {CFITCK_NVCall, SanitizerKind::CFINVCall}, @@ -2649,7 +2657,8 @@ void CodeGenFunction::EmitCfiCheckFail() SanitizerMask Mask = CheckKindMaskPair.second; llvm::Value *Cond = Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty, Kind)); -EmitCheck(std::make_pair(Cond, Mask), "cfi_check_fail", {}, {Data, Addr}); +EmitCheck(std::make_pair(Cond, Mask), "cfi_check_fail", {}, + {Data, Addr, ValidVtable}); } FinishFunction(); @@ -3970,7 +3979,8 @@ RValue CodeGenFunction::EmitCall(QualTyp CastedCallee, StaticData); } else { EmitCheck(std::make_pair(BitSetTest, SanitizerKind::CFIICall), -"cfi_check_fail", StaticData, CastedCallee); +"cfi_check_fail", StaticData, +{CastedCallee, llvm::UndefValue::get(IntPtrTy)}); } } Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=259716=259715=259716=diff == --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Feb 3 16:18:55 2016 @@ -4021,6 +4021,20 @@ llvm::Metadata *CodeGenModule::CreateMet return InternalId; } +/// Returns whether this module needs the "all-vtables" bitset. +bool CodeGenModule::NeedAllVtablesBitSet() const { + // Returns true if at least one of vtable-based CFI checkers is enabled and + // is not in the trapping mode. + return ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) && + !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFIVCall)) || + (LangOpts.Sanitize.has(SanitizerKind::CFINVCall) && + !CodeGenOpts.SanitizeTrap.has(SanitizerKind::CFINVCall)) || +
Re: [PATCH] D16738: Fix invalid casts in .
eugenis updated this revision to Diff 46857. eugenis added a comment. How about this? Repository: rL LLVM http://reviews.llvm.org/D16738 Files: include/__config include/functional Index: include/functional === --- include/functional +++ include/functional @@ -1564,6 +1564,10 @@ typename aligned_storage<3*sizeof(void*)>::type __buf_; __base* __f_; +_LIBCPP_NO_CFI static __base *__as_base(void *p) { + return reinterpret_cast<__base*>(p); +} + template ::value && __invokable<_Fp&, _ArgTypes...>::value> struct __callable; @@ -1662,7 +1666,7 @@ __f_ = 0; else if (__f.__f_ == (const __base*)&__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1678,7 +1682,7 @@ __f_ = 0; else if (__f.__f_ == (const __base*)&__f.__buf_) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1690,9 +1694,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if (__f.__f_ == __as_base(&__f.__buf_)) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1709,9 +1713,9 @@ { if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if (__f.__f_ == __as_base(&__f.__buf_)) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1736,8 +1740,7 @@ typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f)); } else { @@ -1766,8 +1769,7 @@ if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value) { -__f_ = (__base*)&__buf_; -::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a)); +__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a)); } else { @@ -1791,16 +1793,16 @@ function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if (__f_ == __as_base(&__buf_)) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); __f_ = 0; if (__f.__f_ == 0) __f_ = 0; -else if (__f.__f_ == (__base*)&__f.__buf_) +else if (__f.__f_ == __as_base(&__f.__buf_)) { -__f_ = (__base*)&__buf_; +__f_ = __as_base(&__buf_); __f.__f_->__clone(__f_); } else @@ -1815,7 +1817,7 @@ function<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT { -if (__f_ == (__base*)&__buf_) +if (__f_ == __as_base(&__buf_)) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1840,7 +1842,7 @@ template function<_Rp(_ArgTypes...)>::~function() { -if (__f_ == (__base*)&__buf_) +if (__f_ == __as_base(&__buf_)) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1850,34 +1852,34 @@ void function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT { -if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) +if (__f_ == __as_base(&__buf_) && __f.__f_ == __as_base(&__f.__buf_)) { typename aligned_storage::type __tempbuf; -__base* __t = (__base*)&__tempbuf; +__base* __t = __as_base(&__tempbuf); __f_->__clone(__t); __f_->destroy(); __f_ = 0; -__f.__f_->__clone((__base*)&__buf_); +__f.__f_->__clone(__as_base(&__buf_)); __f.__f_->destroy(); __f.__f_ = 0; -__f_ = (__base*)&__buf_; -__t->__clone((__base*)&__f.__buf_); +__f_ = __as_base(&__buf_); +__t->__clone(__as_base(&__f.__buf_)); __t->destroy(); -__f.__f_ = (__base*)&__f.__buf_; +__f.__f_ = __as_base(&__f.__buf_); } -else if (__f_ == (__base*)&__buf_) +else if (__f_ == __as_base(&__buf_)) { -__f_->__clone((__base*)&__f.__buf_); +__f_->__clone(__as_base(&__f.__buf_)); __f_->destroy(); __f_ = __f.__f_; -__f.__f_ = (__base*)&__f.__buf_; +__f.__f_ = __as_base(&__f.__buf_); } -else if (__f.__f_ == (__base*)&__f.__buf_) +else if (__f.__f_ == __as_base(&__f.__buf_)) { -__f.__f_->__clone((__base*)&__buf_); +__f.__f_->__clone(__as_base(&__buf_));
Re: [PATCH] D16823: [cfi] Safe handling of unaddressable vtable pointers (clang).
eugenis added inline comments. Comment at: lib/CodeGen/CGClass.cpp:2608 @@ -2607,3 +2607,3 @@ auto TypeId = CGM.CreateCfiIdForTypeMetadata(MD); if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && TypeId) { EmitCfiSlowPathCheck(M, BitSetTest, TypeId, CastedVTable, StaticData); samsonov wrote: > Can we rewrite this as if-elseif-else block now? even better, with 2 early returns. Repository: rL LLVM http://reviews.llvm.org/D16823 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D16823: [cfi] Safe handling of unaddressable vtable pointers (clang).
eugenis updated this revision to Diff 46807. Repository: rL LLVM http://reviews.llvm.org/D16823 Files: lib/CodeGen/CGClass.cpp lib/CodeGen/CGExpr.cpp lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h test/CodeGen/cfi-check-fail.c test/CodeGenCXX/cfi-cast.cpp test/CodeGenCXX/cfi-vcall.cpp Index: test/CodeGenCXX/cfi-vcall.cpp === --- test/CodeGenCXX/cfi-vcall.cpp +++ test/CodeGenCXX/cfi-vcall.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=NDIAG %s -// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=DIAG --check-prefix=DIAG-ABORT %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=ITANIUM-NDIAG --check-prefix=NDIAG %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s // RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s // RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=MS --check-prefix=NDIAG %s @@ -55,23 +55,25 @@ // DIAG: @[[SRC:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}cfi-vcall.cpp\00", align 1 // DIAG: @[[TYPE:.*]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" } -// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { i8, { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }* } { i8 0, { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+21]], i32 3 }, { i16, i16, [4 x i8] }* @[[TYPE]] } +// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { i8, { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }* } { i8 0, { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+23]], i32 3 }, { i16, i16, [4 x i8] }* @[[TYPE]] } // ITANIUM: define void @_Z2afP1A // MS: define void @"\01?af@@YAXPEAUA@@@Z" void af(A *a) { // ITANIUM: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"_ZTS1A") // MS: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"?AUA@@") + // DIAG-NEXT: [[VTVALID0:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT]], metadata !"all-vtables") // CHECK-NEXT: br i1 [[P]], label %[[CONTBB:[^ ,]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-NEXT: {{^$}} // CHECK: [[TRAPBB]] // NDIAG-NEXT: call void @llvm.trap() // NDIAG-NEXT: unreachable // DIAG-NEXT: [[VTINT:%[^ ]*]] = ptrtoint i8* [[VT]] to i64 - // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]]) + // DIAG-NEXT: [[VTVALID:%[^ ]*]] = zext i1 [[VTVALID0]] to i64 + // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) // DIAG-ABORT-NEXT: unreachable - // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]]) + // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) // DIAG-RECOVER-NEXT: br label %[[CONTBB]] // CHECK: [[CONTBB]] @@ -157,32 +159,47 @@ } -// Check for the expected number of elements (9 or 15 respectively). -// MS: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){8}]]} -// ITANIUM: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]} +// Check for the expected number of elements (15 or 23 respectively). +// MS-NDIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){9}]]} +// MS-DIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){15}]]} +// ITANIUM-NDIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]} +// ITANIUM-DIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){23}]]} // ITANIUM-DAG: !{!"_ZTS1A", [3 x i8*]* @_ZTV1A, i64 16} +// ITANIUM-DIAG-DAG: !{!"all-vtables", [3 x i8*]* @_ZTV1A, i64 16} // ITANIUM-DAG: !{!"_ZTS1A", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} +// ITANIUM-DIAG-DAG: !{!"all-vtables", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} // ITANIUM-DAG: !{!"_ZTS1B", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} // ITANIUM-DAG: !{!"_ZTS1A", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64} +// ITANIUM-DIAG-DAG: !{!"all-vtables", [9 x i8*]*