Index: tools/clang/scripts/update.sh |
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh |
index bfd586e470788bd6258c4553869cd845e4c0c98a..e576cace7b7d773d9073977cc67ab81c19d67c5b 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=217949 |
+CLANG_REVISION=218707 |
THIS_DIR="$(dirname "${0}")" |
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
@@ -235,12 +235,19 @@ for i in \ |
"${CLANG_DIR}/unittests/libclang/LibclangTest.cpp" \ |
"${COMPILER_RT_DIR}/lib/asan/asan_rtl.cc" \ |
"${COMPILER_RT_DIR}/test/asan/TestCases/Linux/new_array_cookie_test.cc" \ |
+ "${LLVM_DIR}/test/DebugInfo/gmlt.ll" \ |
+ "${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \ |
+ "${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \ |
; do |
if [[ -e "${i}" ]]; then |
svn revert "${i}" |
fi; |
done |
+echo Remove the Clang tools shim dir |
+CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools |
+rm -rfv ${CHROME_TOOLS_SHIM_DIR} |
+ |
echo Getting LLVM r"${CLANG_REVISION}" in "${LLVM_DIR}" |
if ! svn co --force "${LLVM_REPO_URL}/llvm/trunk@${CLANG_REVISION}" \ |
"${LLVM_DIR}"; then |
@@ -310,6 +317,180 @@ EOF |
patch -p0 |
popd |
+# Apply r218742: test: XFAIL the non-darwin gmlt test on darwin |
+# Back-ported becase the test was renamed. |
+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 |
+EOF |
+patch -p1 |
+popd |
+ |
+# Apply r218921; fixes spill placement compile-time regression. |
+pushd "${LLVM_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) { |
+ } |
+ } |
+ |
++/// \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. |
+ |
+@@ -152,6 +156,7 @@ private: |
+ void releaseMemory() override; |
+ |
+ void activate(unsigned); |
++ void setThreshold(const BlockFrequency &Entry); |
+ }; |
+ |
+ } // end namespace llvm |
+EOF |
+patch -p1 |
+popd |
+ |
+ |
# Echo all commands. |
set -x |
@@ -438,8 +619,6 @@ fi |
# the real directory for the Chromium tools. |
# Note that the shim directory name intentionally has no _ or _. The implicit |
# tool detection logic munges them in a weird way. |
-CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools |
-rm -rfv ${CHROME_TOOLS_SHIM_DIR} |
mkdir -v ${CHROME_TOOLS_SHIM_DIR} |
cat > ${CHROME_TOOLS_SHIM_DIR}/CMakeLists.txt << EOF |
# Since tools/clang isn't actually a subdirectory, use the two argument version |
@@ -546,7 +725,7 @@ if [[ -n "${with_android}" ]]; then |
-DCMAKE_CXX_FLAGS="--target=arm-linux-androideabi --sysroot=${PWD}/../android-toolchain/sysroot -B${PWD}/../android-toolchain" \ |
-DANDROID=1 \ |
"${ABS_COMPILER_RT_DIR}" |
- ninja clang_rt.asan-arm-android |
+ ninja libclang_rt.asan-arm-android.so |
# And copy it into the main build tree. |
cp "$(find -name libclang_rt.asan-arm-android.so)" "${ABS_LLVM_CLANG_LIB_DIR}/lib/linux/" |