| OLD | NEW |
| 1 #!/usr/bin/env bash | 1 #!/usr/bin/env bash |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # This script will check out llvm and clang into third_party/llvm and build it. | 6 # This script will check out llvm and clang into third_party/llvm and build it. |
| 7 | 7 |
| 8 # Do NOT CHANGE this if you don't know what you're doing -- see | 8 # Do NOT CHANGE this if you don't know what you're doing -- see |
| 9 # https://code.google.com/p/chromium/wiki/UpdatingClang | 9 # https://code.google.com/p/chromium/wiki/UpdatingClang |
| 10 # Reverting problematic clang rolls is safe, though. | 10 # Reverting problematic clang rolls is safe, though. |
| 11 CLANG_REVISION=230631 | 11 CLANG_REVISION=223108 |
| 12 | |
| 13 # This is incremented when pushing a new build of Clang at the same revision. | |
| 14 CLANG_SUB_REVISION=2 | |
| 15 | |
| 16 PACKAGE_VERSION="${CLANG_REVISION}-${CLANG_SUB_REVISION}" | |
| 17 | 12 |
| 18 THIS_DIR="$(dirname "${0}")" | 13 THIS_DIR="$(dirname "${0}")" |
| 19 LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" | 14 LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
| 20 LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build/Release+Asserts" | 15 LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build/Release+Asserts" |
| 21 COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt" | 16 COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt" |
| 22 LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap" | 17 LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap" |
| 23 LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" | 18 LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" |
| 24 CLANG_DIR="${LLVM_DIR}/tools/clang" | 19 CLANG_DIR="${LLVM_DIR}/tools/clang" |
| 25 COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt" | 20 COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt" |
| 26 LIBCXX_DIR="${LLVM_DIR}/projects/libcxx" | 21 LIBCXX_DIR="${LLVM_DIR}/projects/libcxx" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 --bootstrap) | 81 --bootstrap) |
| 87 bootstrap=yes | 82 bootstrap=yes |
| 88 ;; | 83 ;; |
| 89 --if-needed) | 84 --if-needed) |
| 90 if_needed=yes | 85 if_needed=yes |
| 91 ;; | 86 ;; |
| 92 --force-local-build) | 87 --force-local-build) |
| 93 force_local_build=yes | 88 force_local_build=yes |
| 94 ;; | 89 ;; |
| 95 --print-revision) | 90 --print-revision) |
| 96 echo $PACKAGE_VERSION | 91 echo $CLANG_REVISION |
| 97 exit 0 | 92 exit 0 |
| 98 ;; | 93 ;; |
| 99 --run-tests) | 94 --run-tests) |
| 100 run_tests=yes | 95 run_tests=yes |
| 101 ;; | 96 ;; |
| 102 --without-android) | 97 --without-android) |
| 103 with_android= | 98 with_android= |
| 104 ;; | 99 ;; |
| 105 --without-patches) | 100 --without-patches) |
| 106 with_patches= | 101 with_patches= |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 exit 0 | 186 exit 0 |
| 192 fi | 187 fi |
| 193 fi | 188 fi |
| 194 | 189 |
| 195 | 190 |
| 196 # Check if there's anything to be done, exit early if not. | 191 # Check if there's anything to be done, exit early if not. |
| 197 if [[ -f "${STAMP_FILE}" ]]; then | 192 if [[ -f "${STAMP_FILE}" ]]; then |
| 198 PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}") | 193 PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}") |
| 199 if [[ -z "$force_local_build" ]] && \ | 194 if [[ -z "$force_local_build" ]] && \ |
| 200 [[ "${PREVIOUSLY_BUILT_REVISON}" = \ | 195 [[ "${PREVIOUSLY_BUILT_REVISON}" = \ |
| 201 "${PACKAGE_VERSION}" ]]; then | 196 "${CLANG_AND_PLUGINS_REVISION}" ]]; then |
| 202 echo "Clang already at ${PACKAGE_VERSION}" | 197 echo "Clang already at ${CLANG_AND_PLUGINS_REVISION}" |
| 203 exit 0 | 198 exit 0 |
| 204 fi | 199 fi |
| 205 fi | 200 fi |
| 206 # To always force a new build if someone interrupts their build half way. | 201 # To always force a new build if someone interrupts their build half way. |
| 207 rm -f "${STAMP_FILE}" | 202 rm -f "${STAMP_FILE}" |
| 208 | 203 |
| 209 | 204 |
| 210 if [[ -z "$force_local_build" ]]; then | 205 if [[ -z "$force_local_build" ]]; then |
| 211 # Check if there's a prebuilt binary and if so just fetch that. That's faster, | 206 # Check if there's a prebuilt binary and if so just fetch that. That's faster, |
| 212 # and goma relies on having matching binary hashes on client and server too. | 207 # and goma relies on having matching binary hashes on client and server too. |
| 213 CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang | 208 CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang |
| 214 CDS_FILE="clang-${PACKAGE_VERSION}.tgz" | 209 CDS_FILE="clang-${CLANG_REVISION}.tgz" |
| 215 CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX) | 210 CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX) |
| 216 CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}" | 211 CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}" |
| 217 if [ "${OS}" = "Linux" ]; then | 212 if [ "${OS}" = "Linux" ]; then |
| 218 CDS_FULL_URL="${CDS_URL}/Linux_x64/${CDS_FILE}" | 213 CDS_FULL_URL="${CDS_URL}/Linux_x64/${CDS_FILE}" |
| 219 elif [ "${OS}" = "Darwin" ]; then | 214 elif [ "${OS}" = "Darwin" ]; then |
| 220 CDS_FULL_URL="${CDS_URL}/Mac/${CDS_FILE}" | 215 CDS_FULL_URL="${CDS_URL}/Mac/${CDS_FILE}" |
| 221 fi | 216 fi |
| 222 echo Trying to download prebuilt clang | 217 echo Trying to download prebuilt clang |
| 223 if which curl > /dev/null; then | 218 if which curl > /dev/null; then |
| 224 curl -L --fail "${CDS_FULL_URL}" -o "${CDS_OUTPUT}" || \ | 219 curl -L --fail "${CDS_FULL_URL}" -o "${CDS_OUTPUT}" || \ |
| 225 rm -rf "${CDS_OUT_DIR}" | 220 rm -rf "${CDS_OUT_DIR}" |
| 226 elif which wget > /dev/null; then | 221 elif which wget > /dev/null; then |
| 227 wget "${CDS_FULL_URL}" -O "${CDS_OUTPUT}" || rm -rf "${CDS_OUT_DIR}" | 222 wget "${CDS_FULL_URL}" -O "${CDS_OUTPUT}" || rm -rf "${CDS_OUT_DIR}" |
| 228 else | 223 else |
| 229 echo "Neither curl nor wget found. Please install one of these." | 224 echo "Neither curl nor wget found. Please install one of these." |
| 230 exit 1 | 225 exit 1 |
| 231 fi | 226 fi |
| 232 if [ -f "${CDS_OUTPUT}" ]; then | 227 if [ -f "${CDS_OUTPUT}" ]; then |
| 233 rm -rf "${LLVM_BUILD_DIR}" | 228 rm -rf "${LLVM_BUILD_DIR}" |
| 234 mkdir -p "${LLVM_BUILD_DIR}" | 229 mkdir -p "${LLVM_BUILD_DIR}" |
| 235 tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}" | 230 tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}" |
| 236 echo clang "${PACKAGE_VERSION}" unpacked | 231 echo clang "${CLANG_REVISION}" unpacked |
| 237 echo "${PACKAGE_VERSION}" > "${STAMP_FILE}" | 232 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" |
| 238 rm -rf "${CDS_OUT_DIR}" | 233 rm -rf "${CDS_OUT_DIR}" |
| 239 exit 0 | 234 exit 0 |
| 240 else | 235 else |
| 241 echo Did not find prebuilt clang "${PACKAGE_VERSION}", building | 236 echo Did not find prebuilt clang at r"${CLANG_REVISION}", building |
| 242 fi | 237 fi |
| 243 fi | 238 fi |
| 244 | 239 |
| 245 if [[ -n "${with_android}" ]] && ! [[ -d "${ANDROID_NDK_DIR}" ]]; then | 240 if [[ -n "${with_android}" ]] && ! [[ -d "${ANDROID_NDK_DIR}" ]]; then |
| 246 echo "Android NDK not found at ${ANDROID_NDK_DIR}" | 241 echo "Android NDK not found at ${ANDROID_NDK_DIR}" |
| 247 echo "The Android NDK is needed to build a Clang whose -fsanitize=address" | 242 echo "The Android NDK is needed to build a Clang whose -fsanitize=address" |
| 248 echo "works on Android. See " | 243 echo "works on Android. See " |
| 249 echo "http://code.google.com/p/chromium/wiki/AndroidBuildInstructions for how" | 244 echo "http://code.google.com/p/chromium/wiki/AndroidBuildInstructions for how" |
| 250 echo "to install the NDK, or pass --without-android." | 245 echo "to install the NDK, or pass --without-android." |
| 251 exit 1 | 246 exit 1 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 275 "${CLANG_DIR}/lib/Frontend/InitPreprocessor.cpp" \ | 270 "${CLANG_DIR}/lib/Frontend/InitPreprocessor.cpp" \ |
| 276 "${CLANG_DIR}/test/Frontend/exceptions.c" \ | 271 "${CLANG_DIR}/test/Frontend/exceptions.c" \ |
| 277 "${CLANG_DIR}/test/Preprocessor/predefined-exceptions.m" \ | 272 "${CLANG_DIR}/test/Preprocessor/predefined-exceptions.m" \ |
| 278 "${LLVM_DIR}/test/Bindings/Go/go.test" \ | 273 "${LLVM_DIR}/test/Bindings/Go/go.test" \ |
| 279 "${CLANG_DIR}/lib/Parse/ParseExpr.cpp" \ | 274 "${CLANG_DIR}/lib/Parse/ParseExpr.cpp" \ |
| 280 "${CLANG_DIR}/lib/Parse/ParseTemplate.cpp" \ | 275 "${CLANG_DIR}/lib/Parse/ParseTemplate.cpp" \ |
| 281 "${CLANG_DIR}/lib/Sema/SemaDeclCXX.cpp" \ | 276 "${CLANG_DIR}/lib/Sema/SemaDeclCXX.cpp" \ |
| 282 "${CLANG_DIR}/lib/Sema/SemaExprCXX.cpp" \ | 277 "${CLANG_DIR}/lib/Sema/SemaExprCXX.cpp" \ |
| 283 "${CLANG_DIR}/test/SemaCXX/default2.cpp" \ | 278 "${CLANG_DIR}/test/SemaCXX/default2.cpp" \ |
| 284 "${CLANG_DIR}/test/SemaCXX/typo-correction-delayed.cpp" \ | 279 "${CLANG_DIR}/test/SemaCXX/typo-correction-delayed.cpp" \ |
| 285 "${COMPILER_RT_DIR}/lib/sanitizer_common/sanitizer_stoptheworld_linux_libc
dep.cc" \ | |
| 286 "${COMPILER_RT_DIR}/test/tsan/signal_segv_handler.cc" \ | |
| 287 ; do | 280 ; do |
| 288 if [[ -e "${i}" ]]; then | 281 if [[ -e "${i}" ]]; then |
| 289 rm -f "${i}" # For unversioned files. | 282 rm -f "${i}" # For unversioned files. |
| 290 svn revert "${i}" | 283 svn revert "${i}" |
| 291 fi; | 284 fi; |
| 292 done | 285 done |
| 293 | 286 |
| 294 echo Remove the Clang tools shim dir | 287 echo Remove the Clang tools shim dir |
| 295 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools | 288 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools |
| 296 rm -rfv ${CHROME_TOOLS_SHIM_DIR} | 289 rm -rfv ${CHROME_TOOLS_SHIM_DIR} |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 | 352 |
| 360 -TEST_F(LibclangReparseTest, ReparseWithModule) { | 353 -TEST_F(LibclangReparseTest, ReparseWithModule) { |
| 361 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) { | 354 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) { |
| 362 const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; | 355 const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; |
| 363 const char *HeaderBottom = "\n};\n#endif\n"; | 356 const char *HeaderBottom = "\n};\n#endif\n"; |
| 364 const char *MFile = "#include \"HeaderFile.h\"\nint main() {" | 357 const char *MFile = "#include \"HeaderFile.h\"\nint main() {" |
| 365 EOF | 358 EOF |
| 366 patch -p0 | 359 patch -p0 |
| 367 popd | 360 popd |
| 368 | 361 |
| 362 # Apply r223211: "Revert r222997." |
| 363 pushd "${LLVM_DIR}" |
| 364 cat << 'EOF' | |
| 365 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
| 366 +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
| 367 @@ -921,8 +921,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySan
itizerVisitor> { |
| 368 Value *OriginPtr = |
| 369 getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset); |
| 370 setOrigin(A, EntryIRB.CreateLoad(OriginPtr)); |
| 371 - } else { |
| 372 - setOrigin(A, getCleanOrigin()); |
| 373 } |
| 374 } |
| 375 ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment); |
| 376 @@ -942,13 +940,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemoryS
anitizerVisitor> { |
| 377 /// \brief Get the origin for a value. |
| 378 Value *getOrigin(Value *V) { |
| 379 if (!MS.TrackOrigins) return nullptr; |
| 380 - if (!PropagateShadow) return getCleanOrigin(); |
| 381 - if (isa<Constant>(V)) return getCleanOrigin(); |
| 382 - assert((isa<Instruction>(V) || isa<Argument>(V)) && |
| 383 - "Unexpected value type in getOrigin()"); |
| 384 - Value *Origin = OriginMap[V]; |
| 385 - assert(Origin && "Missing origin"); |
| 386 - return Origin; |
| 387 + if (isa<Instruction>(V) || isa<Argument>(V)) { |
| 388 + Value *Origin = OriginMap[V]; |
| 389 + if (!Origin) { |
| 390 + DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n"); |
| 391 + Origin = getCleanOrigin(); |
| 392 + } |
| 393 + return Origin; |
| 394 + } |
| 395 + return getCleanOrigin(); |
| 396 } |
| 397 |
| 398 /// \brief Get the origin for i-th argument of the instruction I. |
| 399 @@ -1088,7 +1088,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemoryS
anitizerVisitor> { |
| 400 IRB.CreateStore(getCleanShadow(&I), ShadowPtr); |
| 401 |
| 402 setShadow(&I, getCleanShadow(&I)); |
| 403 - setOrigin(&I, getCleanOrigin()); |
| 404 } |
| 405 |
| 406 void visitAtomicRMWInst(AtomicRMWInst &I) { |
| 407 EOF |
| 408 patch -p1 |
| 409 popd |
| 410 |
| 411 # Apply r223219: "Preserve LD_LIBRARY_PATH when using the 'env' command" |
| 412 pushd "${CLANG_DIR}" |
| 413 cat << 'EOF' | |
| 414 --- a/test/Driver/env.c |
| 415 +++ b/test/Driver/env.c |
| 416 @@ -5,12 +5,14 @@ |
| 417 // REQUIRES: shell |
| 418 // |
| 419 // The PATH variable is heavily used when trying to find a linker. |
| 420 -// RUN: env -i LC_ALL=C %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
| 421 +// RUN: env -i LC_ALL=C LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
| 422 +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
| 423 // RUN: --target=i386-unknown-linux \ |
| 424 // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
| 425 // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
| 426 // |
| 427 -// RUN: env -i LC_ALL=C PATH="" %clang -no-canonical-prefixes %s -### -o %t.o 2
>&1 \ |
| 428 +// RUN: env -i LC_ALL=C PATH="" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
| 429 +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
| 430 // RUN: --target=i386-unknown-linux \ |
| 431 // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
| 432 // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
| 433 EOF |
| 434 patch -p1 |
| 435 popd |
| 436 |
| 437 # Revert r220714: "Frontend: Define __EXCEPTIONS if -fexceptions is passed" |
| 438 pushd "${CLANG_DIR}" |
| 439 cat << 'EOF' | |
| 440 --- a/lib/Frontend/InitPreprocessor.cpp |
| 441 +++ b/lib/Frontend/InitPreprocessor.cpp |
| 442 @@ -566,7 +566,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, |
| 443 Builder.defineMacro("__BLOCKS__"); |
| 444 } |
| 445 |
| 446 - if (!LangOpts.MSVCCompat && LangOpts.Exceptions) |
| 447 + if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions) |
| 448 Builder.defineMacro("__EXCEPTIONS"); |
| 449 if (!LangOpts.MSVCCompat && LangOpts.RTTI) |
| 450 Builder.defineMacro("__GXX_RTTI"); |
| 451 diff --git a/test/Frontend/exceptions.c b/test/Frontend/exceptions.c |
| 452 index 981b5b9..4bbaaa3 100644 |
| 453 --- a/test/Frontend/exceptions.c |
| 454 +++ b/test/Frontend/exceptions.c |
| 455 @@ -1,9 +1,6 @@ |
| 456 -// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -DMS_MODE -
verify %s |
| 457 +// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -verify %s |
| 458 // expected-no-diagnostics |
| 459 |
| 460 -// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s |
| 461 -// expected-no-diagnostics |
| 462 - |
| 463 -#if defined(MS_MODE) && defined(__EXCEPTIONS) |
| 464 +#if defined(__EXCEPTIONS) |
| 465 #error __EXCEPTIONS should not be defined. |
| 466 #endif |
| 467 diff --git a/test/Preprocessor/predefined-exceptions.m b/test/Preprocessor/prede
fined-exceptions.m |
| 468 index 0791075..c13f429 100644 |
| 469 --- a/test/Preprocessor/predefined-exceptions.m |
| 470 +++ b/test/Preprocessor/predefined-exceptions.m |
| 471 @@ -1,6 +1,6 @@ |
| 472 // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM %s | Fi
leCheck -check-prefix=CHECK-OBJC-NOCXX %s |
| 473 // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
| 474 -// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1 |
| 475 +// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1 |
| 476 |
| 477 // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions -fcxx-except
ions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s |
| 478 // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
| 479 EOF |
| 480 patch -p1 |
| 481 popd |
| 482 |
| 483 # Apply r223177: "Ensure typos in the default values of template parameters ge
t diagnosed." |
| 484 pushd "${CLANG_DIR}" |
| 485 cat << 'EOF' | |
| 486 --- a/lib/Parse/ParseTemplate.cpp |
| 487 +++ b/lib/Parse/ParseTemplate.cpp |
| 488 @@ -676,7 +676,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsign
ed Position) { |
| 489 GreaterThanIsOperatorScope G(GreaterThanIsOperator, false); |
| 490 EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); |
| 491 |
| 492 - DefaultArg = ParseAssignmentExpression(); |
| 493 + DefaultArg = Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression())
; |
| 494 if (DefaultArg.isInvalid()) |
| 495 SkipUntil(tok::comma, tok::greater, StopAtSemi | StopBeforeMatch); |
| 496 } |
| 497 diff --git a/test/SemaCXX/default2.cpp b/test/SemaCXX/default2.cpp |
| 498 index 1626044..c4d40b4 100644 |
| 499 --- a/test/SemaCXX/default2.cpp |
| 500 +++ b/test/SemaCXX/default2.cpp |
| 501 @@ -122,3 +122,9 @@ class XX { |
| 502 void A(int length = -1 ) { } |
| 503 void B() { A(); } |
| 504 }; |
| 505 + |
| 506 +template <int I = (1 * I)> struct S {}; // expected-error-re {{use of undeclar
ed identifier 'I'{{$}}}} |
| 507 +S<1> s; |
| 508 + |
| 509 +template <int I1 = I2, int I2 = 1> struct T {}; // expected-error-re {{use of
undeclared identifier 'I2'{{$}}}} |
| 510 +T<0, 1> t; |
| 511 diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correc
tion-delayed.cpp |
| 512 index bff1d76..7bf9258 100644 |
| 513 --- a/test/SemaCXX/typo-correction-delayed.cpp |
| 514 +++ b/test/SemaCXX/typo-correction-delayed.cpp |
| 515 @@ -102,3 +102,7 @@ void f(int *i) { |
| 516 __atomic_load(i, i, something_something); // expected-error-re {{use of unde
clared identifier 'something_something'{{$}}}} |
| 517 } |
| 518 } |
| 519 + |
| 520 +const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
| 521 +template <int I = defaultArg> struct S {}; // expected-error {{use of undeclar
ed identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
| 522 +S<1> s; |
| 523 EOF |
| 524 patch -p1 |
| 525 popd |
| 526 |
| 527 # Apply r223209: "Handle delayed corrections in a couple more error paths in P
arsePostfixExpressionSuffix." |
| 528 pushd "${CLANG_DIR}" |
| 529 cat << 'EOF' | |
| 530 --- a/lib/Parse/ParseExpr.cpp |
| 531 +++ b/lib/Parse/ParseExpr.cpp |
| 532 @@ -1390,6 +1390,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
| 533 SourceLocation OpenLoc = ConsumeToken(); |
| 534 |
| 535 if (ParseSimpleExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) { |
| 536 + (void)Actions.CorrectDelayedTyposInExpr(LHS); |
| 537 LHS = ExprError(); |
| 538 } |
| 539 |
| 540 @@ -1440,6 +1441,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
| 541 if (Tok.isNot(tok::r_paren)) { |
| 542 if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall, |
| 543 LHS.get())) { |
| 544 + (void)Actions.CorrectDelayedTyposInExpr(LHS); |
| 545 LHS = ExprError(); |
| 546 } |
| 547 } |
| 548 diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correc
tion-delayed.cpp |
| 549 index 7bf9258..f7ef015 100644 |
| 550 --- a/test/SemaCXX/typo-correction-delayed.cpp |
| 551 +++ b/test/SemaCXX/typo-correction-delayed.cpp |
| 552 @@ -106,3 +106,9 @@ void f(int *i) { |
| 553 const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
| 554 template <int I = defaultArg> struct S {}; // expected-error {{use of undeclar
ed identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
| 555 S<1> s; |
| 556 + |
| 557 +namespace foo {} |
| 558 +void test_paren_suffix() { |
| 559 + foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace
'foo'{{$}}}} \ |
| 560 + // expected-error {{expected expression}} |
| 561 +} |
| 562 EOF |
| 563 patch -p1 |
| 564 popd |
| 565 |
| 566 # Apply r223705: "Handle possible TypoExprs in member initializers." |
| 567 pushd "${CLANG_DIR}" |
| 568 cat << 'EOF' | |
| 569 --- a/lib/Sema/SemaDeclCXX.cpp |
| 570 +++ b/lib/Sema/SemaDeclCXX.cpp |
| 571 @@ -2813,6 +2813,11 @@ Sema::BuildMemInitializer(Decl *ConstructorD, |
| 572 SourceLocation IdLoc, |
| 573 Expr *Init, |
| 574 SourceLocation EllipsisLoc) { |
| 575 + ExprResult Res = CorrectDelayedTyposInExpr(Init); |
| 576 + if (!Res.isUsable()) |
| 577 + return true; |
| 578 + Init = Res.get(); |
| 579 + |
| 580 if (!ConstructorD) |
| 581 return true; |
| 582 |
| 583 diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correc
tion-delayed.cpp |
| 584 index f7ef015..d303b58 100644 |
| 585 --- a/test/SemaCXX/typo-correction-delayed.cpp |
| 586 +++ b/test/SemaCXX/typo-correction-delayed.cpp |
| 587 @@ -112,3 +112,10 @@ void test_paren_suffix() { |
| 588 foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace
'foo'{{$}}}} \ |
| 589 // expected-error {{expected expression}} |
| 590 } |
| 591 + |
| 592 +const int kNum = 10; // expected-note {{'kNum' declared here}} |
| 593 +class SomeClass { |
| 594 + int Kind; |
| 595 +public: |
| 596 + explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared i
dentifier 'kSum'; did you mean 'kNum'?}} |
| 597 +}; |
| 598 EOF |
| 599 patch -p1 |
| 600 popd |
| 601 |
| 602 # Apply r224172: "Typo correction: Ignore temporary binding exprs after overlo
ad resolution" |
| 603 pushd "${CLANG_DIR}" |
| 604 cat << 'EOF' | |
| 605 --- a/lib/Sema/SemaExprCXX.cpp |
| 606 +++ b/lib/Sema/SemaExprCXX.cpp |
| 607 @@ -6105,8 +6105,13 @@ public: |
| 608 auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
| 609 RParenLoc, ExecConfig); |
| 610 if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
| 611 - if (!Result.isInvalid() && Result.get()) |
| 612 - OverloadResolution[OE] = cast<CallExpr>(Result.get())->getCallee(); |
| 613 + if (!Result.isInvalid() && Result.get()) { |
| 614 + Expr *ResultCall = Result.get(); |
| 615 + if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
| 616 + ResultCall = BE->getSubExpr(); |
| 617 + if (auto *CE = dyn_cast<CallExpr>(ResultCall)) |
| 618 + OverloadResolution[OE] = CE->getCallee(); |
| 619 + } |
| 620 } |
| 621 return Result; |
| 622 } |
| 623 diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correc
tion-delayed.cpp |
| 624 index d303b58..d42888f 100644 |
| 625 --- a/test/SemaCXX/typo-correction-delayed.cpp |
| 626 +++ b/test/SemaCXX/typo-correction-delayed.cpp |
| 627 @@ -119,3 +119,23 @@ class SomeClass { |
| 628 public: |
| 629 explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared i
dentifier 'kSum'; did you mean 'kNum'?}} |
| 630 }; |
| 631 + |
| 632 +extern "C" int printf(const char *, ...); |
| 633 + |
| 634 +// There used to be an issue with typo resolution inside overloads. |
| 635 +struct AssertionResult { |
| 636 + ~AssertionResult(); |
| 637 + operator bool(); |
| 638 + int val; |
| 639 +}; |
| 640 +AssertionResult Compare(const char *a, const char *b); |
| 641 +AssertionResult Compare(int a, int b); |
| 642 +int main() { |
| 643 + // expected-note@+1 {{'result' declared here}} |
| 644 + const char *result; |
| 645 + // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean '
result'?}} |
| 646 + if (AssertionResult ar = (Compare("value1", resulta))) |
| 647 + ; |
| 648 + else |
| 649 + printf("ar: %d\n", ar.val); |
| 650 +} |
| 651 EOF |
| 652 patch -p1 |
| 653 popd |
| 654 |
| 655 # Apply r224173: "Implement feedback on r224172 in PR21899" |
| 656 pushd "${CLANG_DIR}" |
| 657 cat << 'EOF' | |
| 658 --- a/lib/Sema/SemaExprCXX.cpp |
| 659 +++ b/lib/Sema/SemaExprCXX.cpp |
| 660 @@ -6105,7 +6105,7 @@ public: |
| 661 auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
| 662 RParenLoc, ExecConfig); |
| 663 if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
| 664 - if (!Result.isInvalid() && Result.get()) { |
| 665 + if (Result.isUsable()) { |
| 666 Expr *ResultCall = Result.get(); |
| 667 if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
| 668 ResultCall = BE->getSubExpr(); |
| 669 diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correc
tion-delayed.cpp |
| 670 index d42888f..7879d29 100644 |
| 671 --- a/test/SemaCXX/typo-correction-delayed.cpp |
| 672 +++ b/test/SemaCXX/typo-correction-delayed.cpp |
| 673 @@ -120,22 +120,13 @@ public: |
| 674 explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared i
dentifier 'kSum'; did you mean 'kNum'?}} |
| 675 }; |
| 676 |
| 677 -extern "C" int printf(const char *, ...); |
| 678 - |
| 679 // There used to be an issue with typo resolution inside overloads. |
| 680 -struct AssertionResult { |
| 681 - ~AssertionResult(); |
| 682 - operator bool(); |
| 683 - int val; |
| 684 -}; |
| 685 -AssertionResult Compare(const char *a, const char *b); |
| 686 -AssertionResult Compare(int a, int b); |
| 687 -int main() { |
| 688 +struct AssertionResult { ~AssertionResult(); }; |
| 689 +AssertionResult Overload(const char *a); |
| 690 +AssertionResult Overload(int a); |
| 691 +void UseOverload() { |
| 692 // expected-note@+1 {{'result' declared here}} |
| 693 const char *result; |
| 694 // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean '
result'?}} |
| 695 - if (AssertionResult ar = (Compare("value1", resulta))) |
| 696 - ; |
| 697 - else |
| 698 - printf("ar: %d\n", ar.val); |
| 699 + Overload(resulta); |
| 700 } |
| 701 EOF |
| 702 patch -p1 |
| 703 popd |
| 704 |
| 369 # This Go bindings test doesn't work after the bootstrap build on Linux. (PR21
552) | 705 # This Go bindings test doesn't work after the bootstrap build on Linux. (PR21
552) |
| 370 pushd "${LLVM_DIR}" | 706 pushd "${LLVM_DIR}" |
| 371 cat << 'EOF' | | 707 cat << 'EOF' | |
| 372 Index: test/Bindings/Go/go.test | 708 Index: test/Bindings/Go/go.test |
| 373 =================================================================== | 709 =================================================================== |
| 374 --- test/Bindings/Go/go.test (revision 223109) | 710 --- test/Bindings/Go/go.test (revision 223109) |
| 375 +++ test/Bindings/Go/go.test (working copy) | 711 +++ test/Bindings/Go/go.test (working copy) |
| 376 @@ -1,3 +1,3 @@ | 712 @@ -1,3 +1,3 @@ |
| 377 -; RUN: llvm-go test llvm.org/llvm/bindings/go/llvm | 713 -; RUN: llvm-go test llvm.org/llvm/bindings/go/llvm |
| 378 +; RUN: true | 714 +; RUN: true |
| 379 | 715 |
| 380 ; REQUIRES: shell | 716 ; REQUIRES: shell |
| 381 EOF | 717 EOF |
| 382 patch -p0 | 718 patch -p0 |
| 383 popd | 719 popd |
| 384 | 720 |
| 385 # Revert r229678. | |
| 386 pushd "${COMPILER_RT_DIR}" | |
| 387 cat << 'EOF' | | |
| 388 --- a/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc | |
| 389 +++ b/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc | |
| 390 @@ -184,9 +184,10 @@ bool ThreadSuspender::SuspendAllThreads() { | |
| 391 // Pointer to the ThreadSuspender instance for use in signal handler. | |
| 392 static ThreadSuspender *thread_suspender_instance = NULL; | |
| 393 | |
| 394 -// Synchronous signals that should not be blocked. | |
| 395 -static const int kSyncSignals[] = { SIGABRT, SIGILL, SIGFPE, SIGSEGV, SIGBUS, | |
| 396 - SIGXCPU, SIGXFSZ }; | |
| 397 +// Signals that should not be blocked (this is used in the parent thread as wel
l | |
| 398 +// as the tracer thread). | |
| 399 +static const int kUnblockedSignals[] = { SIGABRT, SIGILL, SIGFPE, SIGSEGV, | |
| 400 + SIGBUS, SIGXCPU, SIGXFSZ }; | |
| 401 | |
| 402 // Structure for passing arguments into the tracer thread. | |
| 403 struct TracerThreadArgument { | |
| 404 @@ -201,7 +202,7 @@ struct TracerThreadArgument { | |
| 405 static DieCallbackType old_die_callback; | |
| 406 | |
| 407 // Signal handler to wake up suspended threads when the tracer thread dies. | |
| 408 -static void TracerThreadSignalHandler(int signum, void *siginfo, void *) { | |
| 409 +void TracerThreadSignalHandler(int signum, void *siginfo, void *) { | |
| 410 if (thread_suspender_instance != NULL) { | |
| 411 if (signum == SIGABRT) | |
| 412 thread_suspender_instance->KillAllThreads(); | |
| 413 @@ -241,7 +242,6 @@ static int TracerThread(void* argument) { | |
| 414 tracer_thread_argument->mutex.Lock(); | |
| 415 tracer_thread_argument->mutex.Unlock(); | |
| 416 | |
| 417 - old_die_callback = GetDieCallback(); | |
| 418 SetDieCallback(TracerThreadDieCallback); | |
| 419 | |
| 420 ThreadSuspender thread_suspender(internal_getppid()); | |
| 421 @@ -256,14 +256,17 @@ static int TracerThread(void* argument) { | |
| 422 handler_stack.ss_size = kHandlerStackSize; | |
| 423 internal_sigaltstack(&handler_stack, NULL); | |
| 424 | |
| 425 - // Install our handler for synchronous signals. Other signals should be | |
| 426 - // blocked by the mask we inherited from the parent thread. | |
| 427 - for (uptr i = 0; i < ARRAY_SIZE(kSyncSignals); i++) { | |
| 428 - __sanitizer_sigaction act; | |
| 429 - internal_memset(&act, 0, sizeof(act)); | |
| 430 - act.sigaction = TracerThreadSignalHandler; | |
| 431 - act.sa_flags = SA_ONSTACK | SA_SIGINFO; | |
| 432 - internal_sigaction_norestorer(kSyncSignals[i], &act, 0); | |
| 433 + // Install our handler for fatal signals. Other signals should be blocked by | |
| 434 + // the mask we inherited from the caller thread. | |
| 435 + for (uptr signal_index = 0; signal_index < ARRAY_SIZE(kUnblockedSignals); | |
| 436 + signal_index++) { | |
| 437 + __sanitizer_sigaction new_sigaction; | |
| 438 + internal_memset(&new_sigaction, 0, sizeof(new_sigaction)); | |
| 439 + new_sigaction.sigaction = TracerThreadSignalHandler; | |
| 440 + new_sigaction.sa_flags = SA_ONSTACK | SA_SIGINFO; | |
| 441 + internal_sigfillset(&new_sigaction.sa_mask); | |
| 442 + internal_sigaction_norestorer(kUnblockedSignals[signal_index], | |
| 443 + &new_sigaction, NULL); | |
| 444 } | |
| 445 | |
| 446 int exit_code = 0; | |
| 447 @@ -276,11 +279,9 @@ static int TracerThread(void* argument) { | |
| 448 thread_suspender.ResumeAllThreads(); | |
| 449 exit_code = 0; | |
| 450 } | |
| 451 - // Note, this is a bad race. If TracerThreadDieCallback is already started | |
| 452 - // in another thread and observed that thread_suspender_instance != 0, | |
| 453 - // it can call KillAllThreads on the destroyed variable. | |
| 454 - SetDieCallback(old_die_callback); | |
| 455 thread_suspender_instance = NULL; | |
| 456 + handler_stack.ss_flags = SS_DISABLE; | |
| 457 + internal_sigaltstack(&handler_stack, NULL); | |
| 458 return exit_code; | |
| 459 } | |
| 460 | |
| 461 @@ -312,21 +313,53 @@ class ScopedStackSpaceWithGuard { | |
| 462 // into globals. | |
| 463 static __sanitizer_sigset_t blocked_sigset; | |
| 464 static __sanitizer_sigset_t old_sigset; | |
| 465 +static __sanitizer_sigaction old_sigactions | |
| 466 + [ARRAY_SIZE(kUnblockedSignals)]; | |
| 467 | |
| 468 class StopTheWorldScope { | |
| 469 public: | |
| 470 StopTheWorldScope() { | |
| 471 + // Block all signals that can be blocked safely, and install | |
| 472 + // default handlers for the remaining signals. | |
| 473 + // We cannot allow user-defined handlers to run while the ThreadSuspender | |
| 474 + // thread is active, because they could conceivably call some libc function
s | |
| 475 + // which modify errno (which is shared between the two threads). | |
| 476 + internal_sigfillset(&blocked_sigset); | |
| 477 + for (uptr signal_index = 0; signal_index < ARRAY_SIZE(kUnblockedSignals); | |
| 478 + signal_index++) { | |
| 479 + // Remove the signal from the set of blocked signals. | |
| 480 + internal_sigdelset(&blocked_sigset, kUnblockedSignals[signal_index]); | |
| 481 + // Install the default handler. | |
| 482 + __sanitizer_sigaction new_sigaction; | |
| 483 + internal_memset(&new_sigaction, 0, sizeof(new_sigaction)); | |
| 484 + new_sigaction.handler = SIG_DFL; | |
| 485 + internal_sigfillset(&new_sigaction.sa_mask); | |
| 486 + internal_sigaction_norestorer(kUnblockedSignals[signal_index], | |
| 487 + &new_sigaction, &old_sigactions[signal_index]); | |
| 488 + } | |
| 489 + int sigprocmask_status = | |
| 490 + internal_sigprocmask(SIG_BLOCK, &blocked_sigset, &old_sigset); | |
| 491 + CHECK_EQ(sigprocmask_status, 0); // sigprocmask should never fail | |
| 492 // Make this process dumpable. Processes that are not dumpable cannot be | |
| 493 // attached to. | |
| 494 process_was_dumpable_ = internal_prctl(PR_GET_DUMPABLE, 0, 0, 0, 0); | |
| 495 if (!process_was_dumpable_) | |
| 496 internal_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); | |
| 497 + old_die_callback = GetDieCallback(); | |
| 498 } | |
| 499 | |
| 500 ~StopTheWorldScope() { | |
| 501 + SetDieCallback(old_die_callback); | |
| 502 // Restore the dumpable flag. | |
| 503 if (!process_was_dumpable_) | |
| 504 internal_prctl(PR_SET_DUMPABLE, 0, 0, 0, 0); | |
| 505 + // Restore the signal handlers. | |
| 506 + for (uptr signal_index = 0; signal_index < ARRAY_SIZE(kUnblockedSignals); | |
| 507 + signal_index++) { | |
| 508 + internal_sigaction_norestorer(kUnblockedSignals[signal_index], | |
| 509 + &old_sigactions[signal_index], NULL); | |
| 510 + } | |
| 511 + internal_sigprocmask(SIG_SETMASK, &old_sigset, &old_sigset); | |
| 512 } | |
| 513 | |
| 514 private: | |
| 515 @@ -359,36 +392,11 @@ void StopTheWorld(StopTheWorldCallback callback, void *arg
ument) { | |
| 516 // Block the execution of TracerThread until after we have set ptrace | |
| 517 // permissions. | |
| 518 tracer_thread_argument.mutex.Lock(); | |
| 519 - // Signal handling story. | |
| 520 - // We don't want async signals to be delivered to the tracer thread, | |
| 521 - // so we block all async signals before creating the thread. An async signal | |
| 522 - // handler can temporary modify errno, which is shared with this thread. | |
| 523 - // We ought to use pthread_sigmask here, because sigprocmask has undefined | |
| 524 - // behavior in multithreaded programs. However, on linux sigprocmask is | |
| 525 - // equivalent to pthread_sigmask with the exception that pthread_sigmask | |
| 526 - // does not allow to block some signals used internally in pthread | |
| 527 - // implementation. We are fine with blocking them here, we are really not | |
| 528 - // going to pthread_cancel the thread. | |
| 529 - // The tracer thread should not raise any synchronous signals. But in case it | |
| 530 - // does, we setup a special handler for sync signals that properly kills the | |
| 531 - // parent as well. Note: we don't pass CLONE_SIGHAND to clone, so handlers | |
| 532 - // in the tracer thread won't interfere with user program. Double note: if a | |
| 533 - // user does something along the lines of 'kill -11 pid', that can kill the | |
| 534 - // process even if user setup own handler for SEGV. | |
| 535 - // Thing to watch out for: this code should not change behavior of user code | |
| 536 - // in any observable way. In particular it should not override user signal | |
| 537 - // handlers. | |
| 538 - internal_sigfillset(&blocked_sigset); | |
| 539 - for (uptr i = 0; i < ARRAY_SIZE(kSyncSignals); i++) | |
| 540 - internal_sigdelset(&blocked_sigset, kSyncSignals[i]); | |
| 541 - int rv = internal_sigprocmask(SIG_BLOCK, &blocked_sigset, &old_sigset); | |
| 542 - CHECK_EQ(rv, 0); | |
| 543 uptr tracer_pid = internal_clone( | |
| 544 TracerThread, tracer_stack.Bottom(), | |
| 545 CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_UNTRACED, | |
| 546 &tracer_thread_argument, 0 /* parent_tidptr */, 0 /* newtls */, 0 | |
| 547 /* child_tidptr */); | |
| 548 - internal_sigprocmask(SIG_SETMASK, &old_sigset, 0); | |
| 549 int local_errno = 0; | |
| 550 if (internal_iserror(tracer_pid, &local_errno)) { | |
| 551 VReport(1, "Failed spawning a tracer thread (errno %d).\n", local_errno); | |
| 552 diff --git a/compiler-rt/test/tsan/signal_segv_handler.cc b/compiler-rt/test/tsa
n/signal_segv_handler.cc | |
| 553 deleted file mode 100644 | |
| 554 index 2d806ee..0000000 | |
| 555 --- a/test/tsan/signal_segv_handler.cc | |
| 556 +++ /dev/null | |
| 557 @@ -1,39 +0,0 @@ | |
| 558 -// RUN: %clang_tsan -O1 %s -o %t && TSAN_OPTIONS="flush_memory_ms=1 memory_limi
t_mb=1" %run %t 2>&1 | FileCheck %s | |
| 559 - | |
| 560 -// JVM uses SEGV to preempt threads. All threads do a load from a known address | |
| 561 -// periodically. When runtime needs to preempt threads, it unmaps the page. | |
| 562 -// Threads start triggering SEGV one by one. The signal handler blocks | |
| 563 -// threads while runtime does its thing. Then runtime maps the page again | |
| 564 -// and resumes the threads. | |
| 565 -// Previously this pattern conflicted with stop-the-world machinery, | |
| 566 -// because it briefly reset SEGV handler to SIG_DFL. | |
| 567 -// As the consequence JVM just silently died. | |
| 568 - | |
| 569 -// This test sets memory flushing rate to maximum, then does series of | |
| 570 -// "benign" SEGVs that are handled by signal handler, and ensures that | |
| 571 -// the process survive. | |
| 572 - | |
| 573 -#include "test.h" | |
| 574 -#include <signal.h> | |
| 575 -#include <sys/mman.h> | |
| 576 - | |
| 577 -void *guard; | |
| 578 - | |
| 579 -void handler(int signo, siginfo_t *info, void *uctx) { | |
| 580 - mprotect(guard, 4096, PROT_READ | PROT_WRITE); | |
| 581 -} | |
| 582 - | |
| 583 -int main() { | |
| 584 - struct sigaction a; | |
| 585 - a.sa_sigaction = handler; | |
| 586 - a.sa_flags = SA_SIGINFO; | |
| 587 - sigaction(SIGSEGV, &a, 0); | |
| 588 - guard = mmap(0, 4096, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); | |
| 589 - for (int i = 0; i < 1000000; i++) { | |
| 590 - mprotect(guard, 4096, PROT_NONE); | |
| 591 - *(int*)guard = 1; | |
| 592 - } | |
| 593 - fprintf(stderr, "DONE\n"); | |
| 594 -} | |
| 595 - | |
| 596 -// CHECK: DONE | |
| 597 EOF | |
| 598 patch -p1 | |
| 599 popd | |
| 600 | |
| 601 | |
| 602 | |
| 603 | |
| 604 fi | 721 fi |
| 605 | 722 |
| 606 # Echo all commands. | 723 # Echo all commands. |
| 607 set -x | 724 set -x |
| 608 | 725 |
| 609 # Set default values for CC and CXX if they're not set in the environment. | 726 # Set default values for CC and CXX if they're not set in the environment. |
| 610 CC=${CC:-cc} | 727 CC=${CC:-cc} |
| 611 CXX=${CXX:-c++} | 728 CXX=${CXX:-c++} |
| 612 | 729 |
| 613 if [[ -n "${gcc_toolchain}" ]]; then | 730 if [[ -n "${gcc_toolchain}" ]]; then |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 fi | 963 fi |
| 847 | 964 |
| 848 if [[ -n "$run_tests" ]]; then | 965 if [[ -n "$run_tests" ]]; then |
| 849 # Run Chrome tool tests. | 966 # Run Chrome tool tests. |
| 850 ninja -C "${LLVM_BUILD_DIR}" cr-check-all | 967 ninja -C "${LLVM_BUILD_DIR}" cr-check-all |
| 851 # Run the LLVM and Clang tests. | 968 # Run the LLVM and Clang tests. |
| 852 ninja -C "${LLVM_BUILD_DIR}" check-all | 969 ninja -C "${LLVM_BUILD_DIR}" check-all |
| 853 fi | 970 fi |
| 854 | 971 |
| 855 # After everything is done, log success for this revision. | 972 # After everything is done, log success for this revision. |
| 856 echo "${PACKAGE_VERSION}" > "${STAMP_FILE}" | 973 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" |
| OLD | NEW |