summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2015-09-16 15:10:27 +0000
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2015-09-16 15:10:27 +0000
commitf0c95bd2cac0bf8ff80793b5bcb36555e9208c5a (patch)
tree1ababb212db5e8dbe3857f1a9cf0418fd566057c /llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
parent4d48e1e85bf68bde9a56fcc65fb6cfd988e25b6e (diff)
downloadbcm5719-llvm-f0c95bd2cac0bf8ff80793b5bcb36555e9208c5a.tar.gz
bcm5719-llvm-f0c95bd2cac0bf8ff80793b5bcb36555e9208c5a.zip
[sanitizer] Add MSan support for AArch64
This patch adds support for msan on aarch64-linux for both 39 and 42-bit VMA. The support is enabled by defining the SANITIZER_AARCH64_VMA compiler flag to either 39 or 42 at build time for both clang/llvm and compiler-rt. The default VMA is 39 bits. llvm-svn: 247807
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index be8e25505ca..3c0c768c23a 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -120,6 +120,16 @@ using namespace llvm;
#define DEBUG_TYPE "msan"
+// VMA size definition for architecture that support multiple sizes.
+// AArch64 has 3 VMA sizes: 39, 42 and 48.
+#ifndef SANITIZER_AARCH64_VMA
+# define SANITIZER_AARCH64_VMA 39
+#else
+# if SANITIZER_AARCH64_VMA != 39 && SANITIZER_AARCH64_VMA != 42
+# error "invalid SANITIZER_AARCH64_VMA size"
+# endif
+#endif
+
static const unsigned kOriginSize = 4;
static const unsigned kMinOriginAlignment = 4;
static const unsigned kShadowTLSAlignment = 8;
@@ -244,6 +254,21 @@ static const MemoryMapParams Linux_PowerPC64_MemoryMapParams = {
0x1C0000000000, // OriginBase
};
+// aarch64 Linux
+static const MemoryMapParams Linux_AArch64_MemoryMapParams = {
+#if SANITIZER_AARCH64_VMA == 39
+ 0x007C00000000, // AndMask
+ 0x000100000000, // XorMask
+ 0x004000000000, // ShadowBase
+ 0x004300000000, // OriginBase
+#elif SANITIZER_AARCH64_VMA == 42
+ 0x03E000000000, // AndMask
+ 0x001000000000, // XorMask
+ 0x010000000000, // ShadowBase
+ 0x012000000000, // OriginBase
+#endif
+};
+
// i386 FreeBSD
static const MemoryMapParams FreeBSD_I386_MemoryMapParams = {
0x000180000000, // AndMask
@@ -275,6 +300,11 @@ static const PlatformMemoryMapParams Linux_PowerPC_MemoryMapParams = {
&Linux_PowerPC64_MemoryMapParams,
};
+static const PlatformMemoryMapParams Linux_ARM_MemoryMapParams = {
+ NULL,
+ &Linux_AArch64_MemoryMapParams,
+};
+
static const PlatformMemoryMapParams FreeBSD_X86_MemoryMapParams = {
&FreeBSD_I386_MemoryMapParams,
&FreeBSD_X86_64_MemoryMapParams,
@@ -496,6 +526,10 @@ bool MemorySanitizer::doInitialization(Module &M) {
case Triple::ppc64le:
MapParams = Linux_PowerPC_MemoryMapParams.bits64;
break;
+ case Triple::aarch64:
+ case Triple::aarch64_be:
+ MapParams = Linux_ARM_MemoryMapParams.bits64;
+ break;
default:
report_fatal_error("unsupported architecture");
}
OpenPOWER on IntegriCloud