• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2012 the V8 project authors. All rights reserved.
2  // Use of this source code is governed by a BSD-style license that can be
3  // found in the LICENSE file.
4  
5  // CPU specific code for x64 independent of OS goes here.
6  
7  #if defined(__GNUC__) && !defined(__MINGW64__)
8  #include "src/third_party/valgrind/valgrind.h"
9  #endif
10  
11  #include "src/v8.h"
12  
13  #if V8_TARGET_ARCH_X64
14  
15  #include "src/assembler.h"
16  #include "src/macro-assembler.h"
17  
18  namespace v8 {
19  namespace internal {
20  
FlushICache(void * start,size_t size)21  void CpuFeatures::FlushICache(void* start, size_t size) {
22    // No need to flush the instruction cache on Intel. On Intel instruction
23    // cache flushing is only necessary when multiple cores running the same
24    // code simultaneously. V8 (and JavaScript) is single threaded and when code
25    // is patched on an intel CPU the core performing the patching will have its
26    // own instruction cache updated automatically.
27  
28    // If flushing of the instruction cache becomes necessary Windows has the
29    // API function FlushInstructionCache.
30  
31    // By default, valgrind only checks the stack for writes that might need to
32    // invalidate already cached translated code.  This leads to random
33    // instability when code patches or moves are sometimes unnoticed.  One
34    // solution is to run valgrind with --smc-check=all, but this comes at a big
35    // performance cost.  We can notify valgrind to invalidate its cache.
36  #ifdef VALGRIND_DISCARD_TRANSLATIONS
37    unsigned res = VALGRIND_DISCARD_TRANSLATIONS(start, size);
38    USE(res);
39  #endif
40  }
41  
42  } }  // namespace v8::internal
43  
44  #endif  // V8_TARGET_ARCH_X64
45