Index: tools/clang/scripts/update.sh |
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh |
index ad534adb9c50acdccaa2aa58cc5bd6e09fe04b2d..b585440238b105018bda05007ac5d4bbefa7f584 100755 |
--- a/tools/clang/scripts/update.sh |
+++ b/tools/clang/scripts/update.sh |
@@ -8,7 +8,7 @@ |
# Do NOT CHANGE this if you don't know what you're doing -- see |
# https://code.google.com/p/chromium/wiki/UpdatingClang |
# Reverting problematic clang rolls is safe, though. |
-CLANG_REVISION=218707 |
+CLANG_REVISION=223109 |
THIS_DIR="$(dirname "${0}")" |
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
@@ -238,8 +238,15 @@ for i in \ |
"${LLVM_DIR}/test/DebugInfo/gmlt.ll" \ |
"${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \ |
"${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \ |
+ "${LLVM_DIR}/lib/Transforms/Instrumentation/MemorySanitizer.cpp" \ |
+ "${CLANG_DIR}/test/Driver/env.c" \ |
+ "${CLANG_DIR}/lib/Frontend/InitPreprocessor.cpp" \ |
+ "${CLANG_DIR}/test/Frontend/exceptions.c" \ |
+ "${CLANG_DIR}/test/Preprocessor/predefined-exceptions.m" \ |
+ "${LLVM_DIR}/test/Bindings/Go/go.test" \ |
; do |
if [[ -e "${i}" ]]; then |
+ rm -f "${i}" # For unversioned files. |
svn revert "${i}" |
fi; |
done |
@@ -317,179 +324,143 @@ EOF |
patch -p0 |
popd |
-# Apply r218742: test: XFAIL the non-darwin gmlt test on darwin |
-# Back-ported becase the test was renamed. |
+# Apply r223211: "Revert r222997." |
pushd "${LLVM_DIR}" |
cat << 'EOF' | |
---- a/test/DebugInfo/gmlt.ll |
-+++ b/test/DebugInfo/gmlt.ll |
-@@ -1,2 +1,5 @@ |
- ; REQUIRES: object-emission |
- ; RUN: %llc_dwarf -O0 -filetype=obj < %S/Inputs/gmlt.ll | llvm-dwarfdump - | FileCheck %S/Inputs/gmlt.ll |
-+ |
-+; There's a darwin specific test in X86/gmlt, so it's okay to XFAIL this here. |
-+; XFAIL: darwin |
+--- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
++++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
+@@ -921,8 +921,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
+ Value *OriginPtr = |
+ getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset); |
+ setOrigin(A, EntryIRB.CreateLoad(OriginPtr)); |
+- } else { |
+- setOrigin(A, getCleanOrigin()); |
+ } |
+ } |
+ ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment); |
+@@ -942,13 +940,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
+ /// \brief Get the origin for a value. |
+ Value *getOrigin(Value *V) { |
+ if (!MS.TrackOrigins) return nullptr; |
+- if (!PropagateShadow) return getCleanOrigin(); |
+- if (isa<Constant>(V)) return getCleanOrigin(); |
+- assert((isa<Instruction>(V) || isa<Argument>(V)) && |
+- "Unexpected value type in getOrigin()"); |
+- Value *Origin = OriginMap[V]; |
+- assert(Origin && "Missing origin"); |
+- return Origin; |
++ if (isa<Instruction>(V) || isa<Argument>(V)) { |
++ Value *Origin = OriginMap[V]; |
++ if (!Origin) { |
++ DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n"); |
++ Origin = getCleanOrigin(); |
++ } |
++ return Origin; |
++ } |
++ return getCleanOrigin(); |
+ } |
+ |
+ /// \brief Get the origin for i-th argument of the instruction I. |
+@@ -1088,7 +1088,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
+ IRB.CreateStore(getCleanShadow(&I), ShadowPtr); |
+ |
+ setShadow(&I, getCleanShadow(&I)); |
+- setOrigin(&I, getCleanOrigin()); |
+ } |
+ |
+ void visitAtomicRMWInst(AtomicRMWInst &I) { |
EOF |
patch -p1 |
popd |
-# Apply r218921; fixes spill placement compile-time regression. |
-pushd "${LLVM_DIR}" |
+# Apply r223219: "Preserve LD_LIBRARY_PATH when using the 'env' command" |
+pushd "${CLANG_DIR}" |
cat << 'EOF' | |
---- a/lib/CodeGen/SpillPlacement.cpp |
-+++ b/lib/CodeGen/SpillPlacement.cpp |
-@@ -61,27 +61,6 @@ void SpillPlacement::getAnalysisUsage(AnalysisUsage &AU) const { |
- MachineFunctionPass::getAnalysisUsage(AU); |
- } |
- |
--namespace { |
--static ManagedStatic<BlockFrequency> Threshold; |
--} |
-- |
--/// Decision threshold. A node gets the output value 0 if the weighted sum of |
--/// its inputs falls in the open interval (-Threshold;Threshold). |
--static BlockFrequency getThreshold() { return *Threshold; } |
-- |
--/// \brief Set the threshold for a given entry frequency. |
--/// |
--/// Set the threshold relative to \c Entry. Since the threshold is used as a |
--/// bound on the open interval (-Threshold;Threshold), 1 is the minimum |
--/// threshold. |
--static void setThreshold(const BlockFrequency &Entry) { |
-- // Apparently 2 is a good threshold when Entry==2^14, but we need to scale |
-- // it. Divide by 2^13, rounding as appropriate. |
-- uint64_t Freq = Entry.getFrequency(); |
-- uint64_t Scaled = (Freq >> 13) + bool(Freq & (1 << 12)); |
-- *Threshold = std::max(UINT64_C(1), Scaled); |
--} |
-- |
- /// Node - Each edge bundle corresponds to a Hopfield node. |
- /// |
- /// The node contains precomputed frequency data that only depends on the CFG, |
-@@ -127,9 +106,9 @@ struct SpillPlacement::Node { |
- |
- /// clear - Reset per-query data, but preserve frequencies that only depend on |
- // the CFG. |
-- void clear() { |
-+ void clear(const BlockFrequency &Threshold) { |
- BiasN = BiasP = Value = 0; |
-- SumLinkWeights = getThreshold(); |
-+ SumLinkWeights = Threshold; |
- Links.clear(); |
- } |
- |
-@@ -167,7 +146,7 @@ struct SpillPlacement::Node { |
- |
- /// update - Recompute Value from Bias and Links. Return true when node |
- /// preference changes. |
-- bool update(const Node nodes[]) { |
-+ bool update(const Node nodes[], const BlockFrequency &Threshold) { |
- // Compute the weighted sum of inputs. |
- BlockFrequency SumN = BiasN; |
- BlockFrequency SumP = BiasP; |
-@@ -187,9 +166,9 @@ struct SpillPlacement::Node { |
- // 2. It helps tame rounding errors when the links nominally sum to 0. |
- // |
- bool Before = preferReg(); |
-- if (SumN >= SumP + getThreshold()) |
-+ if (SumN >= SumP + Threshold) |
- Value = -1; |
-- else if (SumP >= SumN + getThreshold()) |
-+ else if (SumP >= SumN + Threshold) |
- Value = 1; |
- else |
- Value = 0; |
-@@ -228,7 +207,7 @@ void SpillPlacement::activate(unsigned n) { |
- if (ActiveNodes->test(n)) |
- return; |
- ActiveNodes->set(n); |
-- nodes[n].clear(); |
-+ nodes[n].clear(Threshold); |
- |
- // Very large bundles usually come from big switches, indirect branches, |
- // landing pads, or loops with many 'continue' statements. It is difficult to |
-@@ -245,6 +224,18 @@ void SpillPlacement::activate(unsigned n) { |
+--- a/test/Driver/env.c |
++++ b/test/Driver/env.c |
+@@ -5,12 +5,14 @@ |
+ // REQUIRES: shell |
+ // |
+ // The PATH variable is heavily used when trying to find a linker. |
+-// RUN: env -i LC_ALL=C %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
++// RUN: env -i LC_ALL=C LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
++// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
+ // RUN: --target=i386-unknown-linux \ |
+ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
+ // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
+ // |
+-// RUN: env -i LC_ALL=C PATH="" %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
++// RUN: env -i LC_ALL=C PATH="" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
++// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
+ // RUN: --target=i386-unknown-linux \ |
+ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
+ // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
+EOF |
+patch -p1 |
+popd |
+ |
+# Revert r220714: "Frontend: Define __EXCEPTIONS if -fexceptions is passed" |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Frontend/InitPreprocessor.cpp |
++++ b/lib/Frontend/InitPreprocessor.cpp |
+@@ -566,7 +566,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, |
+ Builder.defineMacro("__BLOCKS__"); |
} |
- } |
- |
-+/// \brief Set the threshold for a given entry frequency. |
-+/// |
-+/// Set the threshold relative to \c Entry. Since the threshold is used as a |
-+/// bound on the open interval (-Threshold;Threshold), 1 is the minimum |
-+/// threshold. |
-+void SpillPlacement::setThreshold(const BlockFrequency &Entry) { |
-+ // Apparently 2 is a good threshold when Entry==2^14, but we need to scale |
-+ // it. Divide by 2^13, rounding as appropriate. |
-+ uint64_t Freq = Entry.getFrequency(); |
-+ uint64_t Scaled = (Freq >> 13) + bool(Freq & (1 << 12)); |
-+ Threshold = std::max(UINT64_C(1), Scaled); |
-+} |
- |
- /// addConstraints - Compute node biases and weights from a set of constraints. |
- /// Set a bit in NodeMask for each active node. |
-@@ -311,7 +302,7 @@ bool SpillPlacement::scanActiveBundles() { |
- Linked.clear(); |
- RecentPositive.clear(); |
- for (int n = ActiveNodes->find_first(); n>=0; n = ActiveNodes->find_next(n)) { |
-- nodes[n].update(nodes); |
-+ nodes[n].update(nodes, Threshold); |
- // A node that must spill, or a node without any links is not going to |
- // change its value ever again, so exclude it from iterations. |
- if (nodes[n].mustSpill()) |
-@@ -331,7 +322,7 @@ void SpillPlacement::iterate() { |
- // First update the recently positive nodes. They have likely received new |
- // negative bias that will turn them off. |
- while (!RecentPositive.empty()) |
-- nodes[RecentPositive.pop_back_val()].update(nodes); |
-+ nodes[RecentPositive.pop_back_val()].update(nodes, Threshold); |
- |
- if (Linked.empty()) |
- return; |
-@@ -350,7 +341,7 @@ void SpillPlacement::iterate() { |
- iteration == 0 ? Linked.rbegin() : std::next(Linked.rbegin()), |
- E = Linked.rend(); I != E; ++I) { |
- unsigned n = *I; |
-- if (nodes[n].update(nodes)) { |
-+ if (nodes[n].update(nodes, Threshold)) { |
- Changed = true; |
- if (nodes[n].preferReg()) |
- RecentPositive.push_back(n); |
-@@ -364,7 +355,7 @@ void SpillPlacement::iterate() { |
- for (SmallVectorImpl<unsigned>::const_iterator I = |
- std::next(Linked.begin()), E = Linked.end(); I != E; ++I) { |
- unsigned n = *I; |
-- if (nodes[n].update(nodes)) { |
-+ if (nodes[n].update(nodes, Threshold)) { |
- Changed = true; |
- if (nodes[n].preferReg()) |
- RecentPositive.push_back(n); |
-diff --git a/lib/CodeGen/SpillPlacement.h b/lib/CodeGen/SpillPlacement.h |
-index 03cf5cd..622361e 100644 |
---- a/lib/CodeGen/SpillPlacement.h |
-+++ b/lib/CodeGen/SpillPlacement.h |
-@@ -62,6 +62,10 @@ class SpillPlacement : public MachineFunctionPass { |
- // Block frequencies are computed once. Indexed by block number. |
- SmallVector<BlockFrequency, 8> BlockFrequencies; |
-+ /// Decision threshold. A node gets the output value 0 if the weighted sum of |
-+ /// its inputs falls in the open interval (-Threshold;Threshold). |
-+ BlockFrequency Threshold; |
-+ |
- public: |
- static char ID; // Pass identification, replacement for typeid. |
+- if (!LangOpts.MSVCCompat && LangOpts.Exceptions) |
++ if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions) |
+ Builder.defineMacro("__EXCEPTIONS"); |
+ if (!LangOpts.MSVCCompat && LangOpts.RTTI) |
+ Builder.defineMacro("__GXX_RTTI"); |
+diff --git a/test/Frontend/exceptions.c b/test/Frontend/exceptions.c |
+index 981b5b9..4bbaaa3 100644 |
+--- a/test/Frontend/exceptions.c |
++++ b/test/Frontend/exceptions.c |
+@@ -1,9 +1,6 @@ |
+-// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -DMS_MODE -verify %s |
++// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -verify %s |
+ // expected-no-diagnostics |
-@@ -152,6 +156,7 @@ private: |
- void releaseMemory() override; |
- |
- void activate(unsigned); |
-+ void setThreshold(const BlockFrequency &Entry); |
- }; |
+-// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s |
+-// expected-no-diagnostics |
+- |
+-#if defined(MS_MODE) && defined(__EXCEPTIONS) |
++#if defined(__EXCEPTIONS) |
+ #error __EXCEPTIONS should not be defined. |
+ #endif |
+diff --git a/test/Preprocessor/predefined-exceptions.m b/test/Preprocessor/predefined-exceptions.m |
+index 0791075..c13f429 100644 |
+--- a/test/Preprocessor/predefined-exceptions.m |
++++ b/test/Preprocessor/predefined-exceptions.m |
+@@ -1,6 +1,6 @@ |
+ // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-NOCXX %s |
+ // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
+-// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1 |
++// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1 |
- } // end namespace llvm |
+ // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions -fcxx-exceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s |
+ // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
EOF |
patch -p1 |
popd |
+# This Go bindings test doesn't work after the bootstrap build on Linux. (PR21552) |
+pushd "${LLVM_DIR}" |
+cat << 'EOF' | |
+Index: test/Bindings/Go/go.test |
+=================================================================== |
+--- test/Bindings/Go/go.test (revision 223109) |
++++ test/Bindings/Go/go.test (working copy) |
+@@ -1,3 +1,3 @@ |
+-; RUN: llvm-go test llvm.org/llvm/bindings/go/llvm |
++; RUN: true |
+ |
+ ; REQUIRES: shell |
+EOF |
+patch -p0 |
+popd |
+ |
# Echo all commands. |
set -x |