Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(577)

Side by Side Diff: tools/clang/scripts/update.sh

Issue 785393002: Revert "Roll Clang 218707:223109 (+r223211, +r223219, -r220714)" and follow-ups. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/clang/scripts/repackage.sh ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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=223109 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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 "${COMPILER_RT_DIR}/lib/asan/asan_rtl.cc" \ 236 "${COMPILER_RT_DIR}/lib/asan/asan_rtl.cc" \
237 "${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" \
238 "${LLVM_DIR}/test/DebugInfo/gmlt.ll" \ 238 "${LLVM_DIR}/test/DebugInfo/gmlt.ll" \
239 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \ 239 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp" \
240 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \ 240 "${LLVM_DIR}/lib/CodeGen/SpillPlacement.h" \
241 "${LLVM_DIR}/lib/Transforms/Instrumentation/MemorySanitizer.cpp" \
242 "${CLANG_DIR}/test/Driver/env.c" \
243 "${CLANG_DIR}/lib/Frontend/InitPreprocessor.cpp" \
244 "${CLANG_DIR}/test/Frontend/exceptions.c" \
245 "${CLANG_DIR}/test/Preprocessor/predefined-exceptions.m" \
246 "${LLVM_DIR}/test/Bindings/Go/go.test" \
247 ; do 241 ; do
248 if [[ -e "${i}" ]]; then 242 if [[ -e "${i}" ]]; then
249 rm -f "${i}" # For unversioned files.
250 svn revert "${i}" 243 svn revert "${i}"
251 fi; 244 fi;
252 done 245 done
253 246
254 echo Remove the Clang tools shim dir 247 echo Remove the Clang tools shim dir
255 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools 248 CHROME_TOOLS_SHIM_DIR=${ABS_LLVM_DIR}/tools/chrometools
256 rm -rfv ${CHROME_TOOLS_SHIM_DIR} 249 rm -rfv ${CHROME_TOOLS_SHIM_DIR}
257 250
258 echo Getting LLVM r"${CLANG_REVISION}" in "${LLVM_DIR}" 251 echo Getting LLVM r"${CLANG_REVISION}" in "${LLVM_DIR}"
259 if ! svn co --force "${LLVM_REPO_URL}/llvm/trunk@${CLANG_REVISION}" \ 252 if ! svn co --force "${LLVM_REPO_URL}/llvm/trunk@${CLANG_REVISION}" \
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 310
318 -TEST_F(LibclangReparseTest, ReparseWithModule) { 311 -TEST_F(LibclangReparseTest, ReparseWithModule) {
319 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) { 312 +TEST_F(LibclangReparseTest, DISABLED_ReparseWithModule) {
320 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;";
321 const char *HeaderBottom = "\n};\n#endif\n"; 314 const char *HeaderBottom = "\n};\n#endif\n";
322 const char *MFile = "#include \"HeaderFile.h\"\nint main() {" 315 const char *MFile = "#include \"HeaderFile.h\"\nint main() {"
323 EOF 316 EOF
324 patch -p0 317 patch -p0
325 popd 318 popd
326 319
327 # Apply r223211: "Revert r222997." 320 # Apply r218742: test: XFAIL the non-darwin gmlt test on darwin
321 # Back-ported becase the test was renamed.
328 pushd "${LLVM_DIR}" 322 pushd "${LLVM_DIR}"
329 cat << 'EOF' | 323 cat << 'EOF' |
330 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp 324 --- a/test/DebugInfo/gmlt.ll
331 +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp 325 +++ b/test/DebugInfo/gmlt.ll
332 @@ -921,8 +921,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySan itizerVisitor> { 326 @@ -1,2 +1,5 @@
333 Value *OriginPtr = 327 ; REQUIRES: object-emission
334 getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset); 328 ; RUN: %llc_dwarf -O0 -filetype=obj < %S/Inputs/gmlt.ll | llvm-dwarfdump - | Fi leCheck %S/Inputs/gmlt.ll
335 setOrigin(A, EntryIRB.CreateLoad(OriginPtr)); 329 +
336 - } else { 330 +; There's a darwin specific test in X86/gmlt, so it's okay to XFAIL this here.
337 - setOrigin(A, getCleanOrigin()); 331 +; XFAIL: darwin
338 }
339 }
340 ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment);
341 @@ -942,13 +940,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemoryS anitizerVisitor> {
342 /// \brief Get the origin for a value.
343 Value *getOrigin(Value *V) {
344 if (!MS.TrackOrigins) return nullptr;
345 - if (!PropagateShadow) return getCleanOrigin();
346 - if (isa<Constant>(V)) return getCleanOrigin();
347 - assert((isa<Instruction>(V) || isa<Argument>(V)) &&
348 - "Unexpected value type in getOrigin()");
349 - Value *Origin = OriginMap[V];
350 - assert(Origin && "Missing origin");
351 - return Origin;
352 + if (isa<Instruction>(V) || isa<Argument>(V)) {
353 + Value *Origin = OriginMap[V];
354 + if (!Origin) {
355 + DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n");
356 + Origin = getCleanOrigin();
357 + }
358 + return Origin;
359 + }
360 + return getCleanOrigin();
361 }
362
363 /// \brief Get the origin for i-th argument of the instruction I.
364 @@ -1088,7 +1088,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemoryS anitizerVisitor> {
365 IRB.CreateStore(getCleanShadow(&I), ShadowPtr);
366
367 setShadow(&I, getCleanShadow(&I));
368 - setOrigin(&I, getCleanOrigin());
369 }
370
371 void visitAtomicRMWInst(AtomicRMWInst &I) {
372 EOF 332 EOF
373 patch -p1 333 patch -p1
374 popd 334 popd
375 335
376 # Apply r223219: "Preserve LD_LIBRARY_PATH when using the 'env' command" 336 # Apply r218921; fixes spill placement compile-time regression.
377 pushd "${CLANG_DIR}" 337 pushd "${LLVM_DIR}"
378 cat << 'EOF' | 338 cat << 'EOF' |
379 --- a/test/Driver/env.c 339 --- a/lib/CodeGen/SpillPlacement.cpp
380 +++ b/test/Driver/env.c 340 +++ b/lib/CodeGen/SpillPlacement.cpp
381 @@ -5,12 +5,14 @@ 341 @@ -61,27 +61,6 @@ void SpillPlacement::getAnalysisUsage(AnalysisUsage &AU) cons t {
382 // REQUIRES: shell 342 MachineFunctionPass::getAnalysisUsage(AU);
383 // 343 }
384 // The PATH variable is heavily used when trying to find a linker. 344
385 -// RUN: env -i LC_ALL=C %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ 345 -namespace {
386 +// RUN: env -i LC_ALL=C LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ 346 -static ManagedStatic<BlockFrequency> Threshold;
387 +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ 347 -}
388 // RUN: --target=i386-unknown-linux \ 348 -
389 // RUN: --sysroot=%S/Inputs/basic_linux_tree \ 349 -/// Decision threshold. A node gets the output value 0 if the weighted sum of
390 // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s 350 -/// its inputs falls in the open interval (-Threshold;Threshold).
391 // 351 -static BlockFrequency getThreshold() { return *Threshold; }
392 -// RUN: env -i LC_ALL=C PATH="" %clang -no-canonical-prefixes %s -### -o %t.o 2 >&1 \ 352 -
393 +// RUN: env -i LC_ALL=C PATH="" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ 353 -/// \brief Set the threshold for a given entry frequency.
394 +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ 354 -///
395 // RUN: --target=i386-unknown-linux \ 355 -/// Set the threshold relative to \c Entry. Since the threshold is used as a
396 // RUN: --sysroot=%S/Inputs/basic_linux_tree \ 356 -/// bound on the open interval (-Threshold;Threshold), 1 is the minimum
397 // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s 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 }
413 }
414
415 +/// \brief Set the threshold for a given entry frequency.
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;
477 +
478 public:
479 static char ID; // Pass identification, replacement for typeid.
480
481 @@ -152,6 +156,7 @@ private:
482 void releaseMemory() override;
483
484 void activate(unsigned);
485 + void setThreshold(const BlockFrequency &Entry);
486 };
487
488 } // end namespace llvm
398 EOF 489 EOF
399 patch -p1 490 patch -p1
400 popd 491 popd
401 492
402 # Revert r220714: "Frontend: Define __EXCEPTIONS if -fexceptions is passed"
403 pushd "${CLANG_DIR}"
404 cat << 'EOF' |
405 --- a/lib/Frontend/InitPreprocessor.cpp
406 +++ b/lib/Frontend/InitPreprocessor.cpp
407 @@ -566,7 +566,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
408 Builder.defineMacro("__BLOCKS__");
409 }
410
411 - if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
412 + if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions)
413 Builder.defineMacro("__EXCEPTIONS");
414 if (!LangOpts.MSVCCompat && LangOpts.RTTI)
415 Builder.defineMacro("__GXX_RTTI");
416 diff --git a/test/Frontend/exceptions.c b/test/Frontend/exceptions.c
417 index 981b5b9..4bbaaa3 100644
418 --- a/test/Frontend/exceptions.c
419 +++ b/test/Frontend/exceptions.c
420 @@ -1,9 +1,6 @@
421 -// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -DMS_MODE - verify %s
422 +// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -verify %s
423 // expected-no-diagnostics
424
425 -// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s
426 -// expected-no-diagnostics
427 -
428 -#if defined(MS_MODE) && defined(__EXCEPTIONS)
429 +#if defined(__EXCEPTIONS)
430 #error __EXCEPTIONS should not be defined.
431 #endif
432 diff --git a/test/Preprocessor/predefined-exceptions.m b/test/Preprocessor/prede fined-exceptions.m
433 index 0791075..c13f429 100644
434 --- a/test/Preprocessor/predefined-exceptions.m
435 +++ b/test/Preprocessor/predefined-exceptions.m
436 @@ -1,6 +1,6 @@
437 // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM %s | Fi leCheck -check-prefix=CHECK-OBJC-NOCXX %s
438 // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1
439 -// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1
440 +// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1
441
442 // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions -fcxx-except ions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s
443 // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1
444 EOF
445 patch -p1
446 popd
447 493
448 # This Go bindings test doesn't work after the bootstrap build on Linux. (PR2155 2)
449 pushd "${LLVM_DIR}"
450 cat << 'EOF' |
451 Index: test/Bindings/Go/go.test
452 ===================================================================
453 --- test/Bindings/Go/go.test (revision 223109)
454 +++ test/Bindings/Go/go.test (working copy)
455 @@ -1,3 +1,3 @@
456 -; RUN: llvm-go test llvm.org/llvm/bindings/go/llvm
457 +; RUN: true
458
459 ; REQUIRES: shell
460 EOF
461 patch -p0
462 popd
463
464
465 # Echo all commands. 494 # Echo all commands.
466 set -x 495 set -x
467 496
468 # 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.
469 CC=${CC:-cc} 498 CC=${CC:-cc}
470 CXX=${CXX:-c++} 499 CXX=${CXX:-c++}
471 500
472 if [[ -n "${gcc_toolchain}" ]]; then 501 if [[ -n "${gcc_toolchain}" ]]; then
473 # Use the specified gcc installation for building. 502 # Use the specified gcc installation for building.
474 CC="$gcc_toolchain/bin/gcc" 503 CC="$gcc_toolchain/bin/gcc"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 735
707 if [[ -n "$run_tests" ]]; then 736 if [[ -n "$run_tests" ]]; then
708 # Run Chrome tool tests. 737 # Run Chrome tool tests.
709 ninja -C "${LLVM_BUILD_DIR}" cr-check-all 738 ninja -C "${LLVM_BUILD_DIR}" cr-check-all
710 # Run the LLVM and Clang tests. 739 # Run the LLVM and Clang tests.
711 ninja -C "${LLVM_BUILD_DIR}" check-all 740 ninja -C "${LLVM_BUILD_DIR}" check-all
712 fi 741 fi
713 742
714 # After everything is done, log success for this revision. 743 # After everything is done, log success for this revision.
715 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" 744 echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}"
OLDNEW
« no previous file with comments | « tools/clang/scripts/repackage.sh ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698