| 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=220284 | 11 CLANG_REVISION=218707 |
| 12 | 12 |
| 13 THIS_DIR="$(dirname "${0}")" | 13 THIS_DIR="$(dirname "${0}")" |
| 14 LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" | 14 LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
| 15 LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build/Release+Asserts" | 15 LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build/Release+Asserts" |
| 16 COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt" | 16 COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt" |
| 17 LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap" | 17 LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap" |
| 18 LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" | 18 LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" |
| 19 CLANG_DIR="${LLVM_DIR}/tools/clang" | 19 CLANG_DIR="${LLVM_DIR}/tools/clang" |
| 20 COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt" | 20 COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt" |
| 21 LIBCXX_DIR="${LLVM_DIR}/projects/libcxx" | 21 LIBCXX_DIR="${LLVM_DIR}/projects/libcxx" |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 fi | 226 fi |
| 227 if ! which ninja > /dev/null; then | 227 if ! which ninja > /dev/null; then |
| 228 echo "ninja needed to build clang, please install" | 228 echo "ninja needed to build clang, please install" |
| 229 exit 1 | 229 exit 1 |
| 230 fi | 230 fi |
| 231 | 231 |
| 232 echo Reverting previously patched files | 232 echo Reverting previously patched files |
| 233 for i in \ | 233 for i in \ |
| 234 "${CLANG_DIR}/test/Index/crash-recovery-modules.m" \ | 234 "${CLANG_DIR}/test/Index/crash-recovery-modules.m" \ |
| 235 "${CLANG_DIR}/unittests/libclang/LibclangTest.cpp" \ | 235 "${CLANG_DIR}/unittests/libclang/LibclangTest.cpp" \ |
| 236 "${LLVM_DIR}/include/llvm/IR/IRBuilder.h" \ | |
| 237 "${LLVM_DIR}/include/llvm/IR/InstrTypes.h" \ | |
| 238 "${LLVM_DIR}/lib/Analysis/Loads.cpp" \ | |
| 239 "${LLVM_DIR}/lib/IR/Instructions.cpp" \ | |
| 240 "${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp" \ | |
| 241 "${LLVM_DIR}/lib/Transforms/Scalar/JumpThreading.cpp" \ | |
| 242 "${LLVM_DIR}/test/Transforms/InstCombine/select.ll" \ | |
| 243 "${LLVM_DIR}/test/Bindings/Go/go.test" \ | |
| 244 "${COMPILER_RT_DIR}/lib/asan/asan_rtl.cc" \ | 236 "${COMPILER_RT_DIR}/lib/asan/asan_rtl.cc" \ |
| 245 "${COMPILER_RT_DIR}/test/asan/TestCases/Linux/new_array_cookie_test.cc" \ | 237 "${COMPILER_RT_DIR}/test/asan/TestCases/Linux/new_array_cookie_test.cc" \ |
| 246 "${LLVM_DIR}/test/DebugInfo/gmlt.ll" \ | 238 "${LLVM_DIR}/test/DebugInfo/gmlt.ll" \ |
| 247 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \ | 239 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \ |
| 248 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \ | 240 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \ |
| 249 "${CLANG_DIR}/lib/Basic/SanitizerBlacklist.cpp" \ | |
| 250 "${CLANG_DIR}/test/CodeGen/address-safety-attr.cpp" \ | |
| 251 ; do | 241 ; do |
| 252 if [[ -e "${i}" ]]; then | 242 if [[ -e "${i}" ]]; then |
| 253 svn revert "${i}" | 243 svn revert "${i}" |
| 254 fi; | 244 fi; |
| 255 done | 245 done |
| 256 | 246 |
| 257 echo Remove the Clang tools shim dir | 247 echo Remove the Clang tools shim dir |
| 258 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools | 248 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools |
| 259 rm -rfv ${CHROME_TOOLS_SHIM_DIR} | 249 rm -rfv ${CHROME_TOOLS_SHIM_DIR} |
| 260 | 250 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 | 310 |
| 321 -TEST_F(LibclangReparseTest, ReparseWithModule) { | 311 -TEST_F(LibclangReparseTest, ReparseWithModule) { |
| 322 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) { | 312 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) { |
| 323 const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; | 313 const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; |
| 324 const char *HeaderBottom = "\n};\n#endif\n"; | 314 const char *HeaderBottom = "\n};\n#endif\n"; |
| 325 const char *MFile = "#include \"HeaderFile.h\"\nint main() {" | 315 const char *MFile = "#include \"HeaderFile.h\"\nint main() {" |
| 326 EOF | 316 EOF |
| 327 patch -p0 | 317 patch -p0 |
| 328 popd | 318 popd |
| 329 | 319 |
| 330 # This Go bindings test doesn't work after the bootstrap build on Linux. (PR2155
2) | 320 # Apply r218742: test: XFAIL the non-darwin gmlt test on darwin |
| 321 # Back-ported becase the test was renamed. |
| 331 pushd "${LLVM_DIR}" | 322 pushd "${LLVM_DIR}" |
| 332 cat << 'EOF' | | 323 cat << 'EOF' | |
| 333 Index: test/Bindings/Go/go.test | 324 --- a/test/DebugInfo/gmlt.ll |
| 334 =================================================================== | 325 +++ b/test/DebugInfo/gmlt.ll |
| 335 --- test/Bindings/Go/go.test (revision 220284) | 326 @@ -1,2 +1,5 @@ |
| 336 +++ test/Bindings/Go/go.test (working copy) | 327 ; REQUIRES: object-emission |
| 337 @@ -1,8 +1,9 @@ | 328 ; RUN: %llc_dwarf -O0 -filetype=obj < %S/Inputs/gmlt.ll | llvm-dwarfdump - | Fi
leCheck %S/Inputs/gmlt.ll |
| 338 -; RUN: cd %S/../../../bindings/go/llvm && \ | 329 + |
| 339 -; RUN: env CGO_CPPFLAGS="$(llvm-config --cppflags)" \ | 330 +; There's a darwin specific test in X86/gmlt, so it's okay to XFAIL this here. |
| 340 -; RUN: CGO_CXXFLAGS=-std=c++11 \ | 331 +; XFAIL: darwin |
| 341 -; RUN: CGO_LDFLAGS="$(llvm-config --ldflags --libs --system-libs \ | |
| 342 -; RUN: $(../build.sh --print-components)) $CGO_L
DFLAGS" \ | |
| 343 -; RUN: %go test -tags byollvm . | |
| 344 +; X: cd %S/../../../bindings/go/llvm && \ | |
| 345 +; X: env CGO_CPPFLAGS="$(llvm-config --cppflags)" \ | |
| 346 +; X: CGO_CXXFLAGS=-std=c++11 \ | |
| 347 +; X: CGO_LDFLAGS="$(llvm-config --ldflags --libs --system-libs \ | |
| 348 +; X: $(../build.sh --print-components)) $CGO_LDF
LAGS" \ | |
| 349 +; X: %go test -tags byollvm . | |
| 350 +; RUN: true | |
| 351 | |
| 352 ; REQUIRES: shell | |
| 353 EOF | |
| 354 patch -p0 | |
| 355 popd | |
| 356 | |
| 357 # Apply 220340: Revert "Teach the load analysis to allow finding available value
s which require" (r220277) | |
| 358 pushd "${LLVM_DIR}" | |
| 359 cat << 'EOF' | | |
| 360 --- a/include/llvm/IR/IRBuilder.h | |
| 361 +++ b/include/llvm/IR/IRBuilder.h | |
| 362 @@ -1246,18 +1246,6 @@ public: | |
| 363 return Insert(Folder.CreateIntCast(VC, DestTy, isSigned), Name); | |
| 364 return Insert(CastInst::CreateIntegerCast(V, DestTy, isSigned), Name); | |
| 365 } | |
| 366 - | |
| 367 - Value *CreateBitOrPointerCast(Value *V, Type *DestTy, | |
| 368 - const Twine &Name = "") { | |
| 369 - if (V->getType() == DestTy) | |
| 370 - return V; | |
| 371 - if (V->getType()->isPointerTy() && DestTy->isIntegerTy()) | |
| 372 - return CreatePtrToInt(V, DestTy, Name); | |
| 373 - if (V->getType()->isIntegerTy() && DestTy->isPointerTy()) | |
| 374 - return CreateIntToPtr(V, DestTy, Name); | |
| 375 - | |
| 376 - return CreateBitCast(V, DestTy, Name); | |
| 377 - } | |
| 378 private: | |
| 379 // \brief Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a | |
| 380 // compile time error, instead of converting the string to bool for the | |
| 381 diff --git a/include/llvm/IR/InstrTypes.h b/include/llvm/IR/InstrTypes.h | |
| 382 index 1186857..7e98fe1 100644 | |
| 383 --- a/include/llvm/IR/InstrTypes.h | |
| 384 +++ b/include/llvm/IR/InstrTypes.h | |
| 385 @@ -490,19 +490,6 @@ public: | |
| 386 Instruction *InsertBefore = 0 ///< Place to insert the instruction | |
| 387 ); | |
| 388 | |
| 389 - /// @brief Create a BitCast, a PtrToInt, or an IntToPTr cast instruction. | |
| 390 - /// | |
| 391 - /// If the value is a pointer type and the destination an integer type, | |
| 392 - /// creates a PtrToInt cast. If the value is an integer type and the | |
| 393 - /// destination a pointer type, creates an IntToPtr cast. Otherwise, creates | |
| 394 - /// a bitcast. | |
| 395 - static CastInst *CreateBitOrPointerCast( | |
| 396 - Value *S, ///< The pointer value to be casted (operand 0) | |
| 397 - Type *Ty, ///< The type to which cast should be made | |
| 398 - const Twine &Name = "", ///< Name for the instruction | |
| 399 - Instruction *InsertBefore = 0 ///< Place to insert the instruction | |
| 400 - ); | |
| 401 - | |
| 402 /// @brief Create a ZExt, BitCast, or Trunc for int -> int casts. | |
| 403 static CastInst *CreateIntegerCast( | |
| 404 Value *S, ///< The pointer value to be casted (operand 0) | |
| 405 @@ -565,17 +552,6 @@ public: | |
| 406 Type *DestTy ///< The Type to which the value should be cast. | |
| 407 ); | |
| 408 | |
| 409 - /// @brief Check whether a bitcast, inttoptr, or ptrtoint cast between these | |
| 410 - /// types is valid and a no-op. | |
| 411 - /// | |
| 412 - /// This ensures that any pointer<->integer cast has enough bits in the | |
| 413 - /// integer and any other cast is a bitcast. | |
| 414 - static bool isBitOrNoopPointerCastable( | |
| 415 - Type *SrcTy, ///< The Type from which the value should be cast. | |
| 416 - Type *DestTy, ///< The Type to which the value should be cast. | |
| 417 - const DataLayout *Layout = 0 ///< Optional DataLayout. | |
| 418 - ); | |
| 419 - | |
| 420 /// Returns the opcode necessary to cast Val into Ty using usual casting | |
| 421 /// rules. | |
| 422 /// @brief Infer the opcode for cast operand and type | |
| 423 diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp | |
| 424 index 5042eb9..bb0d60e 100644 | |
| 425 --- a/lib/Analysis/Loads.cpp | |
| 426 +++ b/lib/Analysis/Loads.cpp | |
| 427 @@ -176,13 +176,8 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBloc
k *ScanBB, | |
| 428 | |
| 429 Type *AccessTy = cast<PointerType>(Ptr->getType())->getElementType(); | |
| 430 | |
| 431 - // Try to get the DataLayout for this module. This may be null, in which case | |
| 432 - // the optimizations will be limited. | |
| 433 - const DataLayout *DL = ScanBB->getDataLayout(); | |
| 434 - | |
| 435 - // Try to get the store size for the type. | |
| 436 - uint64_t AccessSize = DL ? DL->getTypeStoreSize(AccessTy) | |
| 437 - : AA ? AA->getTypeStoreSize(AccessTy) : 0; | |
| 438 + // If we're using alias analysis to disambiguate get the size of *Ptr. | |
| 439 + uint64_t AccessSize = AA ? AA->getTypeStoreSize(AccessTy) : 0; | |
| 440 | |
| 441 Value *StrippedPtr = Ptr->stripPointerCasts(); | |
| 442 | |
| 443 @@ -207,7 +202,7 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock
*ScanBB, | |
| 444 if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) | |
| 445 if (AreEquivalentAddressValues( | |
| 446 LI->getPointerOperand()->stripPointerCasts(), StrippedPtr) && | |
| 447 - CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy, DL)) { | |
| 448 + CastInst::isBitCastable(LI->getType(), AccessTy)) { | |
| 449 if (AATags) | |
| 450 LI->getAAMetadata(*AATags); | |
| 451 return LI; | |
| 452 @@ -219,8 +214,7 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock
*ScanBB, | |
| 453 // (This is true even if the store is volatile or atomic, although | |
| 454 // those cases are unlikely.) | |
| 455 if (AreEquivalentAddressValues(StorePtr, StrippedPtr) && | |
| 456 - CastInst::isBitOrNoopPointerCastable(SI->getValueOperand()->getType()
, | |
| 457 - AccessTy, DL)) { | |
| 458 + CastInst::isBitCastable(SI->getValueOperand()->getType(), AccessTy))
{ | |
| 459 if (AATags) | |
| 460 SI->getAAMetadata(*AATags); | |
| 461 return SI->getOperand(0); | |
| 462 diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp | |
| 463 index 9da0eb4..1497aa8 100644 | |
| 464 --- a/lib/IR/Instructions.cpp | |
| 465 +++ b/lib/IR/Instructions.cpp | |
| 466 @@ -2559,17 +2559,6 @@ CastInst *CastInst::CreatePointerBitCastOrAddrSpaceCast( | |
| 467 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore); | |
| 468 } | |
| 469 | |
| 470 -CastInst *CastInst::CreateBitOrPointerCast(Value *S, Type *Ty, | |
| 471 - const Twine &Name, | |
| 472 - Instruction *InsertBefore) { | |
| 473 - if (S->getType()->isPointerTy() && Ty->isIntegerTy()) | |
| 474 - return Create(Instruction::PtrToInt, S, Ty, Name, InsertBefore); | |
| 475 - if (S->getType()->isIntegerTy() && Ty->isPointerTy()) | |
| 476 - return Create(Instruction::IntToPtr, S, Ty, Name, InsertBefore); | |
| 477 - | |
| 478 - return Create(Instruction::BitCast, S, Ty, Name, InsertBefore); | |
| 479 -} | |
| 480 - | |
| 481 CastInst *CastInst::CreateIntegerCast(Value *C, Type *Ty, | |
| 482 bool isSigned, const Twine &Name, | |
| 483 Instruction *InsertBefore) { | |
| 484 @@ -2727,18 +2716,6 @@ bool CastInst::isBitCastable(Type *SrcTy, Type *DestTy) { | |
| 485 return true; | |
| 486 } | |
| 487 | |
| 488 -bool CastInst::isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, | |
| 489 - const DataLayout *DL) { | |
| 490 - if (auto *PtrTy = dyn_cast<PointerType>(SrcTy)) | |
| 491 - if (auto *IntTy = dyn_cast<IntegerType>(DestTy)) | |
| 492 - return DL && IntTy->getBitWidth() >= DL->getPointerTypeSizeInBits(PtrTy); | |
| 493 - if (auto *PtrTy = dyn_cast<PointerType>(DestTy)) | |
| 494 - if (auto *IntTy = dyn_cast<IntegerType>(SrcTy)) | |
| 495 - return DL && IntTy->getBitWidth() >= DL->getPointerTypeSizeInBits(PtrTy); | |
| 496 - | |
| 497 - return isBitCastable(SrcTy, DestTy); | |
| 498 -} | |
| 499 - | |
| 500 // Provide a way to get a "cast" where the cast opcode is inferred from the | |
| 501 // types and size of the operand. This, basically, is a parallel of the | |
| 502 // logic in the castIsValid function below. This axiom should hold: | |
| 503 diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Tra
nsforms/InstCombine/InstCombineLoadStoreAlloca.cpp | |
| 504 index c0df914..f3ac44c 100644 | |
| 505 --- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | |
| 506 +++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | |
| 507 @@ -418,8 +418,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { | |
| 508 BasicBlock::iterator BBI = &LI; | |
| 509 if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,6)
) | |
| 510 return ReplaceInstUsesWith( | |
| 511 - LI, Builder->CreateBitOrPointerCast(AvailableVal, LI.getType(), | |
| 512 - LI.getName() + ".cast")); | |
| 513 + LI, Builder->CreateBitCast(AvailableVal, LI.getType())); | |
| 514 | |
| 515 // load(gep null, ...) -> unreachable | |
| 516 if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) { | |
| 517 diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/Jum
pThreading.cpp | |
| 518 index c37a4c9..25a8b0c 100644 | |
| 519 --- a/lib/Transforms/Scalar/JumpThreading.cpp | |
| 520 +++ b/lib/Transforms/Scalar/JumpThreading.cpp | |
| 521 @@ -902,8 +902,8 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst
*LI) { | |
| 522 // only happen in dead loops. | |
| 523 if (AvailableVal == LI) AvailableVal = UndefValue::get(LI->getType()); | |
| 524 if (AvailableVal->getType() != LI->getType()) | |
| 525 - AvailableVal = | |
| 526 - CastInst::CreateBitOrPointerCast(AvailableVal, LI->getType(), "", LI)
; | |
| 527 + AvailableVal = CastInst::Create(CastInst::BitCast, AvailableVal, | |
| 528 + LI->getType(), "", LI); | |
| 529 LI->replaceAllUsesWith(AvailableVal); | |
| 530 LI->eraseFromParent(); | |
| 531 return true; | |
| 532 @@ -1040,8 +1040,8 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadIns
t *LI) { | |
| 533 // predecessor use the same bitcast. | |
| 534 Value *&PredV = I->second; | |
| 535 if (PredV->getType() != LI->getType()) | |
| 536 - PredV = CastInst::CreateBitOrPointerCast(PredV, LI->getType(), "", | |
| 537 - P->getTerminator()); | |
| 538 + PredV = CastInst::Create(CastInst::BitCast, PredV, LI->getType(), "", | |
| 539 + P->getTerminator()); | |
| 540 | |
| 541 PN->addIncoming(PredV, I->first); | |
| 542 } | |
| 543 diff --git a/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine
/select.ll | |
| 544 index 9c8286b..6cf9f0f 100644 | |
| 545 --- a/test/Transforms/InstCombine/select.ll | |
| 546 +++ b/test/Transforms/InstCombine/select.ll | |
| 547 @@ -1256,7 +1256,7 @@ define i32 @test76(i1 %flag, i32* %x) { | |
| 548 ret i32 %v | |
| 549 } | |
| 550 | |
| 551 -declare void @scribble_on_i32(i32*) | |
| 552 +declare void @scribble_on_memory(i32*) | |
| 553 | |
| 554 define i32 @test77(i1 %flag, i32* %x) { | |
| 555 ; The load here must not be speculated around the select. One side of the | |
| 556 @@ -1264,13 +1264,13 @@ define i32 @test77(i1 %flag, i32* %x) { | |
| 557 ; load does. | |
| 558 ; CHECK-LABEL: @test77( | |
| 559 ; CHECK: %[[A:.*]] = alloca i32, align 1 | |
| 560 -; CHECK: call void @scribble_on_i32(i32* %[[A]]) | |
| 561 +; CHECK: call void @scribble_on_memory(i32* %[[A]]) | |
| 562 ; CHECK: store i32 0, i32* %x | |
| 563 ; CHECK: %[[P:.*]] = select i1 %flag, i32* %[[A]], i32* %x | |
| 564 ; CHECK: load i32* %[[P]] | |
| 565 | |
| 566 %under_aligned = alloca i32, align 1 | |
| 567 - call void @scribble_on_i32(i32* %under_aligned) | |
| 568 + call void @scribble_on_memory(i32* %under_aligned) | |
| 569 store i32 0, i32* %x | |
| 570 %p = select i1 %flag, i32* %under_aligned, i32* %x | |
| 571 %v = load i32* %p | |
| 572 @@ -1327,8 +1327,8 @@ define i32 @test80(i1 %flag) { | |
| 573 entry: | |
| 574 %x = alloca i32 | |
| 575 %y = alloca i32 | |
| 576 - call void @scribble_on_i32(i32* %x) | |
| 577 - call void @scribble_on_i32(i32* %y) | |
| 578 + call void @scribble_on_memory(i32* %x) | |
| 579 + call void @scribble_on_memory(i32* %y) | |
| 580 %tmp = load i32* %x | |
| 581 store i32 %tmp, i32* %y | |
| 582 %p = select i1 %flag, i32* %x, i32* %y | |
| 583 @@ -1351,8 +1351,8 @@ entry: | |
| 584 %y = alloca i32 | |
| 585 %x1 = bitcast float* %x to i32* | |
| 586 %y1 = bitcast i32* %y to float* | |
| 587 - call void @scribble_on_i32(i32* %x1) | |
| 588 - call void @scribble_on_i32(i32* %y) | |
| 589 + call void @scribble_on_memory(i32* %x1) | |
| 590 + call void @scribble_on_memory(i32* %y) | |
| 591 %tmp = load i32* %x1 | |
| 592 store i32 %tmp, i32* %y | |
| 593 %p = select i1 %flag, float* %x, float* %y1 | |
| 594 @@ -1377,63 +1377,11 @@ entry: | |
| 595 %y = alloca i32 | |
| 596 %x1 = bitcast float* %x to i32* | |
| 597 %y1 = bitcast i32* %y to float* | |
| 598 - call void @scribble_on_i32(i32* %x1) | |
| 599 - call void @scribble_on_i32(i32* %y) | |
| 600 + call void @scribble_on_memory(i32* %x1) | |
| 601 + call void @scribble_on_memory(i32* %y) | |
| 602 %tmp = load float* %x | |
| 603 store float %tmp, float* %y1 | |
| 604 %p = select i1 %flag, i32* %x1, i32* %y | |
| 605 %v = load i32* %p | |
| 606 ret i32 %v | |
| 607 } | |
| 608 - | |
| 609 -declare void @scribble_on_i64(i64*) | |
| 610 - | |
| 611 -define i8* @test83(i1 %flag) { | |
| 612 -; Test that we can speculate the load around the select even though they use | |
| 613 -; differently typed pointers and requires inttoptr casts. | |
| 614 -; CHECK-LABEL: @test83( | |
| 615 -; CHECK: %[[X:.*]] = alloca i8* | |
| 616 -; CHECK-NEXT: %[[Y:.*]] = alloca i8* | |
| 617 -; CHECK: %[[V:.*]] = load i64* %[[X]] | |
| 618 -; CHECK-NEXT: %[[C1:.*]] = inttoptr i64 %[[V]] to i8* | |
| 619 -; CHECK-NEXT: store i8* %[[C1]], i8** %[[Y]] | |
| 620 -; CHECK-NEXT: %[[C2:.*]] = inttoptr i64 %[[V]] to i8* | |
| 621 -; CHECK-NEXT: %[[S:.*]] = select i1 %flag, i8* %[[C2]], i8* %[[C1]] | |
| 622 -; CHECK-NEXT: ret i8* %[[S]] | |
| 623 -entry: | |
| 624 - %x = alloca i8* | |
| 625 - %y = alloca i64 | |
| 626 - %x1 = bitcast i8** %x to i64* | |
| 627 - %y1 = bitcast i64* %y to i8** | |
| 628 - call void @scribble_on_i64(i64* %x1) | |
| 629 - call void @scribble_on_i64(i64* %y) | |
| 630 - %tmp = load i64* %x1 | |
| 631 - store i64 %tmp, i64* %y | |
| 632 - %p = select i1 %flag, i8** %x, i8** %y1 | |
| 633 - %v = load i8** %p | |
| 634 - ret i8* %v | |
| 635 -} | |
| 636 - | |
| 637 -define i64 @test84(i1 %flag) { | |
| 638 -; Test that we can speculate the load around the select even though they use | |
| 639 -; differently typed pointers and requires a ptrtoint cast. | |
| 640 -; CHECK-LABEL: @test84( | |
| 641 -; CHECK: %[[X:.*]] = alloca i8* | |
| 642 -; CHECK-NEXT: %[[Y:.*]] = alloca i8* | |
| 643 -; CHECK: %[[V:.*]] = load i8** %[[X]] | |
| 644 -; CHECK-NEXT: store i8* %[[V]], i8** %[[Y]] | |
| 645 -; CHECK-NEXT: %[[C:.*]] = ptrtoint i8* %[[V]] to i64 | |
| 646 -; CHECK-NEXT: ret i64 %[[C]] | |
| 647 -entry: | |
| 648 - %x = alloca i8* | |
| 649 - %y = alloca i64 | |
| 650 - %x1 = bitcast i8** %x to i64* | |
| 651 - %y1 = bitcast i64* %y to i8** | |
| 652 - call void @scribble_on_i64(i64* %x1) | |
| 653 - call void @scribble_on_i64(i64* %y) | |
| 654 - %tmp = load i8** %x | |
| 655 - store i8* %tmp, i8** %y1 | |
| 656 - %p = select i1 %flag, i64* %x1, i64* %y | |
| 657 - %v = load i64* %p | |
| 658 - ret i64 %v | |
| 659 -} | |
| 660 EOF | 332 EOF |
| 661 patch -p1 | 333 patch -p1 |
| 662 popd | 334 popd |
| 663 | 335 |
| 664 | 336 # Apply r218921; fixes spill placement compile-time regression. |
| 665 # Apply 220403: SanitizerBlacklist: Use spelling location for blacklisting purpo
ses. | 337 pushd "${LLVM_DIR}" |
| 666 pushd "${CLANG_DIR}" | |
| 667 cat << 'EOF' | | 338 cat << 'EOF' | |
| 668 --- a/lib/Basic/SanitizerBlacklist.cpp | 339 --- a/lib/CodeGen/SpillPlacement.cpp |
| 669 +++ b/lib/Basic/SanitizerBlacklist.cpp | 340 +++ b/lib/CodeGen/SpillPlacement.cpp |
| 670 @@ -40,6 +40,7 @@ bool SanitizerBlacklist::isBlacklistedFile(StringRef FileName, | 341 @@ -61,27 +61,6 @@ void SpillPlacement::getAnalysisUsage(AnalysisUsage &AU) cons
t { |
| 342 MachineFunctionPass::getAnalysisUsage(AU); |
| 343 } |
| 671 | 344 |
| 672 bool SanitizerBlacklist::isBlacklistedLocation(SourceLocation Loc, | 345 -namespace { |
| 673 StringRef Category) const { | 346 -static ManagedStatic<BlockFrequency> Threshold; |
| 674 - return !Loc.isInvalid() && isBlacklistedFile(SM.getFilename(Loc), Category); | 347 -} |
| 675 + return !Loc.isInvalid() && | 348 - |
| 676 + isBlacklistedFile(SM.getFilename(SM.getSpellingLoc(Loc)), Category); | 349 -/// Decision threshold. A node gets the output value 0 if the weighted sum of |
| 350 -/// its inputs falls in the open interval (-Threshold;Threshold). |
| 351 -static BlockFrequency getThreshold() { return *Threshold; } |
| 352 - |
| 353 -/// \brief Set the threshold for a given entry frequency. |
| 354 -/// |
| 355 -/// Set the threshold relative to \c Entry. Since the threshold is used as a |
| 356 -/// bound on the open interval (-Threshold;Threshold), 1 is the minimum |
| 357 -/// threshold. |
| 358 -static void setThreshold(const BlockFrequency &Entry) { |
| 359 - // Apparently 2 is a good threshold when Entry==2^14, but we need to scale |
| 360 - // it. Divide by 2^13, rounding as appropriate. |
| 361 - uint64_t Freq = Entry.getFrequency(); |
| 362 - uint64_t Scaled = (Freq >> 13) + bool(Freq & (1 << 12)); |
| 363 - *Threshold = std::max(UINT64_C(1), Scaled); |
| 364 -} |
| 365 - |
| 366 /// Node - Each edge bundle corresponds to a Hopfield node. |
| 367 /// |
| 368 /// The node contains precomputed frequency data that only depends on the CFG, |
| 369 @@ -127,9 +106,9 @@ struct SpillPlacement::Node { |
| 370 |
| 371 /// clear - Reset per-query data, but preserve frequencies that only depend o
n |
| 372 // the CFG. |
| 373 - void clear() { |
| 374 + void clear(const BlockFrequency &Threshold) { |
| 375 BiasN = BiasP = Value = 0; |
| 376 - SumLinkWeights = getThreshold(); |
| 377 + SumLinkWeights = Threshold; |
| 378 Links.clear(); |
| 379 } |
| 380 |
| 381 @@ -167,7 +146,7 @@ struct SpillPlacement::Node { |
| 382 |
| 383 /// update - Recompute Value from Bias and Links. Return true when node |
| 384 /// preference changes. |
| 385 - bool update(const Node nodes[]) { |
| 386 + bool update(const Node nodes[], const BlockFrequency &Threshold) { |
| 387 // Compute the weighted sum of inputs. |
| 388 BlockFrequency SumN = BiasN; |
| 389 BlockFrequency SumP = BiasP; |
| 390 @@ -187,9 +166,9 @@ struct SpillPlacement::Node { |
| 391 // 2. It helps tame rounding errors when the links nominally sum to 0. |
| 392 // |
| 393 bool Before = preferReg(); |
| 394 - if (SumN >= SumP + getThreshold()) |
| 395 + if (SumN >= SumP + Threshold) |
| 396 Value = -1; |
| 397 - else if (SumP >= SumN + getThreshold()) |
| 398 + else if (SumP >= SumN + Threshold) |
| 399 Value = 1; |
| 400 else |
| 401 Value = 0; |
| 402 @@ -228,7 +207,7 @@ void SpillPlacement::activate(unsigned n) { |
| 403 if (ActiveNodes->test(n)) |
| 404 return; |
| 405 ActiveNodes->set(n); |
| 406 - nodes[n].clear(); |
| 407 + nodes[n].clear(Threshold); |
| 408 |
| 409 // Very large bundles usually come from big switches, indirect branches, |
| 410 // landing pads, or loops with many 'continue' statements. It is difficult to |
| 411 @@ -245,6 +224,18 @@ void SpillPlacement::activate(unsigned n) { |
| 412 } |
| 677 } | 413 } |
| 678 | |
| 679 --- a/test/CodeGen/address-safety-attr.cpp | |
| 680 +++ b/test/CodeGen/address-safety-attr.cpp | |
| 681 @@ -64,6 +64,15 @@ int AddressSafetyOk(int *a) { return *a; } | |
| 682 // ASAN: BlacklistedFunction{{.*}}) [[WITH]] | |
| 683 int BlacklistedFunction(int *a) { return *a; } | |
| 684 | 414 |
| 685 +#define GENERATE_FUNC(name) \ | 415 +/// \brief Set the threshold for a given entry frequency. |
| 686 + int name(int *a) { return *a; } | 416 +/// |
| 417 +/// Set the threshold relative to \c Entry. Since the threshold is used as a |
| 418 +/// bound on the open interval (-Threshold;Threshold), 1 is the minimum |
| 419 +/// threshold. |
| 420 +void SpillPlacement::setThreshold(const BlockFrequency &Entry) { |
| 421 + // Apparently 2 is a good threshold when Entry==2^14, but we need to scale |
| 422 + // it. Divide by 2^13, rounding as appropriate. |
| 423 + uint64_t Freq = Entry.getFrequency(); |
| 424 + uint64_t Scaled = (Freq >> 13) + bool(Freq & (1 << 12)); |
| 425 + Threshold = std::max(UINT64_C(1), Scaled); |
| 426 +} |
| 427 |
| 428 /// addConstraints - Compute node biases and weights from a set of constraints. |
| 429 /// Set a bit in NodeMask for each active node. |
| 430 @@ -311,7 +302,7 @@ bool SpillPlacement::scanActiveBundles() { |
| 431 Linked.clear(); |
| 432 RecentPositive.clear(); |
| 433 for (int n = ActiveNodes->find_first(); n>=0; n = ActiveNodes->find_next(n))
{ |
| 434 - nodes[n].update(nodes); |
| 435 + nodes[n].update(nodes, Threshold); |
| 436 // A node that must spill, or a node without any links is not going to |
| 437 // change its value ever again, so exclude it from iterations. |
| 438 if (nodes[n].mustSpill()) |
| 439 @@ -331,7 +322,7 @@ void SpillPlacement::iterate() { |
| 440 // First update the recently positive nodes. They have likely received new |
| 441 // negative bias that will turn them off. |
| 442 while (!RecentPositive.empty()) |
| 443 - nodes[RecentPositive.pop_back_val()].update(nodes); |
| 444 + nodes[RecentPositive.pop_back_val()].update(nodes, Threshold); |
| 445 |
| 446 if (Linked.empty()) |
| 447 return; |
| 448 @@ -350,7 +341,7 @@ void SpillPlacement::iterate() { |
| 449 iteration == 0 ? Linked.rbegin() : std::next(Linked.rbegin()), |
| 450 E = Linked.rend(); I != E; ++I) { |
| 451 unsigned n = *I; |
| 452 - if (nodes[n].update(nodes)) { |
| 453 + if (nodes[n].update(nodes, Threshold)) { |
| 454 Changed = true; |
| 455 if (nodes[n].preferReg()) |
| 456 RecentPositive.push_back(n); |
| 457 @@ -364,7 +355,7 @@ void SpillPlacement::iterate() { |
| 458 for (SmallVectorImpl<unsigned>::const_iterator I = |
| 459 std::next(Linked.begin()), E = Linked.end(); I != E; ++I) { |
| 460 unsigned n = *I; |
| 461 - if (nodes[n].update(nodes)) { |
| 462 + if (nodes[n].update(nodes, Threshold)) { |
| 463 Changed = true; |
| 464 if (nodes[n].preferReg()) |
| 465 RecentPositive.push_back(n); |
| 466 diff --git a/lib/CodeGen/SpillPlacement.h b/lib/CodeGen/SpillPlacement.h |
| 467 index 03cf5cd..622361e 100644 |
| 468 --- a/lib/CodeGen/SpillPlacement.h |
| 469 +++ b/lib/CodeGen/SpillPlacement.h |
| 470 @@ -62,6 +62,10 @@ class SpillPlacement : public MachineFunctionPass { |
| 471 // Block frequencies are computed once. Indexed by block number. |
| 472 SmallVector<BlockFrequency, 8> BlockFrequencies; |
| 473 |
| 474 + /// Decision threshold. A node gets the output value 0 if the weighted sum of |
| 475 + /// its inputs falls in the open interval (-Threshold;Threshold). |
| 476 + BlockFrequency Threshold; |
| 687 + | 477 + |
| 688 +// WITHOUT: GeneratedFunction{{.*}}) [[NOATTR]] | 478 public: |
| 689 +// BLFILE: GeneratedFunction{{.*}}) [[NOATTR]] | 479 static char ID; // Pass identification, replacement for typeid. |
| 690 +// BLFUNC: GeneratedFunction{{.*}}) [[WITH]] | 480 |
| 691 +// ASAN: GeneratedFunction{{.*}}) [[WITH]] | 481 @@ -152,6 +156,7 @@ private: |
| 692 +GENERATE_FUNC(GeneratedFunction) | 482 void releaseMemory() override; |
| 693 + | 483 |
| 694 // WITHOUT: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] | 484 void activate(unsigned); |
| 695 // BLFILE: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] | 485 + void setThreshold(const BlockFrequency &Entry); |
| 696 // BLFUNC: TemplateAddressSafetyOk{{.*}}) [[WITH]] | 486 }; |
| 487 |
| 488 } // end namespace llvm |
| 697 EOF | 489 EOF |
| 698 patch -p1 | 490 patch -p1 |
| 699 popd | 491 popd |
| 700 | |
| 701 # Apply 220407: Fixup for r220403: Use getFileLoc() instead of getSpellingLoc()
in SanitizerBlacklist. | |
| 702 pushd "${CLANG_DIR}" | |
| 703 cat << 'EOF' | | |
| 704 --- a/lib/Basic/SanitizerBlacklist.cpp | |
| 705 +++ b/lib/Basic/SanitizerBlacklist.cpp | |
| 706 @@ -41,6 +41,6 @@ bool SanitizerBlacklist::isBlacklistedFile(StringRef FileName, | |
| 707 bool SanitizerBlacklist::isBlacklistedLocation(SourceLocation Loc, | |
| 708 StringRef Category) const { | |
| 709 return !Loc.isInvalid() && | |
| 710 - isBlacklistedFile(SM.getFilename(SM.getSpellingLoc(Loc)), Category); | |
| 711 + isBlacklistedFile(SM.getFilename(SM.getFileLoc(Loc)), Category); | |
| 712 } | |
| 713 | |
| 714 diff --git a/test/CodeGen/address-safety-attr.cpp b/test/CodeGen/address-safety-
attr.cpp | |
| 715 index 0d585c7..031d013 100644 | |
| 716 --- a/test/CodeGen/address-safety-attr.cpp | |
| 717 +++ b/test/CodeGen/address-safety-attr.cpp | |
| 718 @@ -66,13 +66,19 @@ int BlacklistedFunction(int *a) { return *a; } | |
| 719 | |
| 720 #define GENERATE_FUNC(name) \ | |
| 721 int name(int *a) { return *a; } | |
| 722 - | |
| 723 // WITHOUT: GeneratedFunction{{.*}}) [[NOATTR]] | |
| 724 // BLFILE: GeneratedFunction{{.*}}) [[NOATTR]] | |
| 725 // BLFUNC: GeneratedFunction{{.*}}) [[WITH]] | |
| 726 // ASAN: GeneratedFunction{{.*}}) [[WITH]] | |
| 727 GENERATE_FUNC(GeneratedFunction) | |
| 728 | |
| 729 +#define GENERATE_NAME(name) name##_generated | |
| 730 +// WITHOUT: Function_generated{{.*}}) [[NOATTR]] | |
| 731 +// BLFILE: Function_generated{{.*}}) [[NOATTR]] | |
| 732 +// BLFUNC: Function_generated{{.*}}) [[WITH]] | |
| 733 +// ASAN: Function_generated{{.*}}) [[WITH]] | |
| 734 +int GENERATE_NAME(Function)(int *a) { return *a; } | |
| 735 + | |
| 736 // WITHOUT: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] | |
| 737 // BLFILE: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] | |
| 738 // BLFUNC: TemplateAddressSafetyOk{{.*}}) [[WITH]] | |
| 739 EOF | |
| 740 patch -p1 | |
| 741 popd | |
| 742 | 492 |
| 743 | 493 |
| 744 # Echo all commands. | 494 # Echo all commands. |
| 745 set -x | 495 set -x |
| 746 | 496 |
| 747 # Set default values for CC and CXX if they're not set in the environment. | 497 # Set default values for CC and CXX if they're not set in the environment. |
| 748 CC=${CC:-cc} | 498 CC=${CC:-cc} |
| 749 CXX=${CXX:-c++} | 499 CXX=${CXX:-c++} |
| 750 | 500 |
| 751 if [[ -n "${gcc_toolchain}" ]]; then | 501 if [[ -n "${gcc_toolchain}" ]]; then |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 fi | 697 fi |
| 948 | 698 |
| 949 popd | 699 popd |
| 950 | 700 |
| 951 if [[ -n "${with_android}" ]]; then | 701 if [[ -n "${with_android}" ]]; then |
| 952 # Make a standalone Android toolchain. | 702 # Make a standalone Android toolchain. |
| 953 ${ANDROID_NDK_DIR}/build/tools/make-standalone-toolchain.sh \ | 703 ${ANDROID_NDK_DIR}/build/tools/make-standalone-toolchain.sh \ |
| 954 --platform=android-14 \ | 704 --platform=android-14 \ |
| 955 --install-dir="${LLVM_BUILD_DIR}/android-toolchain" \ | 705 --install-dir="${LLVM_BUILD_DIR}/android-toolchain" \ |
| 956 --system=linux-x86_64 \ | 706 --system=linux-x86_64 \ |
| 957 --stl=stlport \ | 707 --stl=stlport |
| 958 --toolchain=arm-linux-androideabi-4.8 \ | |
| 959 | 708 |
| 960 # Android NDK r9d copies a broken unwind.h into the toolchain, see | 709 # Android NDK r9d copies a broken unwind.h into the toolchain, see |
| 961 # http://crbug.com/357890 | 710 # http://crbug.com/357890 |
| 962 rm -v "${LLVM_BUILD_DIR}"/android-toolchain/include/c++/*/unwind.h | 711 rm -v "${LLVM_BUILD_DIR}"/android-toolchain/include/c++/*/unwind.h |
| 963 | 712 |
| 964 # Build ASan runtime for Android in a separate build tree. | 713 # Build ASan runtime for Android in a separate build tree. |
| 965 mkdir -p ${LLVM_BUILD_DIR}/android | 714 mkdir -p ${LLVM_BUILD_DIR}/android |
| 966 pushd ${LLVM_BUILD_DIR}/android | 715 pushd ${LLVM_BUILD_DIR}/android |
| 967 rm -fv CMakeCache.txt | 716 rm -fv CMakeCache.txt |
| 968 MACOSX_DEPLOYMENT_TARGET=${deployment_target} cmake -GNinja \ | 717 MACOSX_DEPLOYMENT_TARGET=${deployment_target} cmake -GNinja \ |
| (...skipping 16 matching lines...) Expand all Loading... |
| 985 | 734 |
| 986 if [[ -n "$run_tests" ]]; then | 735 if [[ -n "$run_tests" ]]; then |
| 987 # Run Chrome tool tests. | 736 # Run Chrome tool tests. |
| 988 ninja -C "${LLVM_BUILD_DIR}" cr-check-all | 737 ninja -C "${LLVM_BUILD_DIR}" cr-check-all |
| 989 # Run the LLVM and Clang tests. | 738 # Run the LLVM and Clang tests. |
| 990 ninja -C "${LLVM_BUILD_DIR}" check-all | 739 ninja -C "${LLVM_BUILD_DIR}" check-all |
| 991 fi | 740 fi |
| 992 | 741 |
| 993 # After everything is done, log success for this revision. | 742 # After everything is done, log success for this revision. |
| 994 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" | 743 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" |
| OLD | NEW |