~ubuntu-branches/ubuntu/feisty/clamav/feisty

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/System/Memory.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Kees Cook
  • Date: 2007-02-20 10:33:44 UTC
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: james.westby@ubuntu.com-20070220103344-zgcu2psnx9d98fpa
Tags: upstream-0.90
ImportĀ upstreamĀ versionĀ 0.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//===- Memory.cpp - Memory Handling Support ---------------------*- C++ -*-===//
2
 
//
3
 
//                     The LLVM Compiler Infrastructure
4
 
//
5
 
// This file is distributed under the University of Illinois Open Source
6
 
// License. See LICENSE.TXT for details.
7
 
//
8
 
//===----------------------------------------------------------------------===//
9
 
//
10
 
// This file defines some helpful functions for allocating memory and dealing
11
 
// with memory mapped files
12
 
//
13
 
//===----------------------------------------------------------------------===//
14
 
 
15
 
#include "llvm/System/Memory.h"
16
 
#include "llvm/System/Valgrind.h"
17
 
#include "llvm/Config/config.h"
18
 
 
19
 
namespace llvm {
20
 
using namespace sys;
21
 
}
22
 
 
23
 
// Include the platform-specific parts of this class.
24
 
#ifdef LLVM_ON_UNIX
25
 
#include "Unix/Memory.inc"
26
 
#endif
27
 
#ifdef LLVM_ON_WIN32
28
 
#include "Win32/Memory.inc"
29
 
#endif
30
 
 
31
 
extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
32
 
 
33
 
/// InvalidateInstructionCache - Before the JIT can run a block of code
34
 
/// that has been emitted it must invalidate the instruction cache on some
35
 
/// platforms.
36
 
void llvm::sys::Memory::InvalidateInstructionCache(const void *Addr,
37
 
                                                   size_t Len) {
38
 
  
39
 
// icache invalidation for PPC and ARM.
40
 
#if defined(__APPLE__)
41
 
 
42
 
#  if (defined(__POWERPC__) || defined (__ppc__) || \
43
 
     defined(_POWER) || defined(_ARCH_PPC)) || defined(__arm__)
44
 
  sys_icache_invalidate(Addr, Len);
45
 
#  endif
46
 
 
47
 
#else
48
 
 
49
 
#  if (defined(__POWERPC__) || defined (__ppc__) || \
50
 
       defined(_POWER) || defined(_ARCH_PPC)) && defined(__GNUC__)
51
 
  const size_t LineSize = 32;
52
 
 
53
 
  const intptr_t Mask = ~(LineSize - 1);
54
 
  const intptr_t StartLine = ((intptr_t) Addr) & Mask;
55
 
  const intptr_t EndLine = ((intptr_t) Addr + Len + LineSize - 1) & Mask;
56
 
 
57
 
  for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize)
58
 
    asm volatile("dcbf 0, %0" : : "r"(Line));
59
 
  asm volatile("sync");
60
 
 
61
 
  for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize)
62
 
    asm volatile("icbi 0, %0" : : "r"(Line));
63
 
  asm volatile("isync");
64
 
#  elif defined(__arm__) && defined(__GNUC__)
65
 
  // FIXME: Can we safely always call this for __GNUC__ everywhere?
66
 
  char *Start = (char*) Addr;
67
 
  char *End = Start + Len;
68
 
  __clear_cache(Start, End);
69
 
#  endif
70
 
 
71
 
#endif  // end apple
72
 
 
73
 
  ValgrindDiscardTranslations(Addr, Len);
74
 
}