diff options
Diffstat (limited to 'lib/Target/AArch64/AArch64Subtarget.cpp')
-rw-r--r-- | lib/Target/AArch64/AArch64Subtarget.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/Target/AArch64/AArch64Subtarget.cpp b/lib/Target/AArch64/AArch64Subtarget.cpp index 9140bbdb41..53cdf30b96 100644 --- a/lib/Target/AArch64/AArch64Subtarget.cpp +++ b/lib/Target/AArch64/AArch64Subtarget.cpp @@ -25,6 +25,25 @@ using namespace llvm; +enum AlignMode { + DefaultAlign, + StrictAlign, + NoStrictAlign +}; + +static cl::opt<AlignMode> +Align(cl::desc("Load/store alignment support"), + cl::Hidden, cl::init(DefaultAlign), + cl::values( + clEnumValN(DefaultAlign, "aarch64-default-align", + "Generate unaligned accesses only on hardware/OS " + "combinations that are known to support them"), + clEnumValN(StrictAlign, "aarch64-strict-align", + "Disallow all unaligned memory accesses"), + clEnumValN(NoStrictAlign, "aarch64-no-strict-align", + "Allow unaligned memory accesses"), + clEnumValEnd)); + // Pin the vtable to this file. void AArch64Subtarget::anchor() {} @@ -39,6 +58,8 @@ AArch64Subtarget::AArch64Subtarget(StringRef TT, StringRef CPU, StringRef FS, void AArch64Subtarget::initializeSubtargetFeatures(StringRef CPU, StringRef FS) { + AllowsUnalignedMem = false; + if (CPU.empty()) CPUString = "generic"; @@ -52,6 +73,19 @@ void AArch64Subtarget::initializeSubtargetFeatures(StringRef CPU, } ParseSubtargetFeatures(CPU, FullFS); + + switch (Align) { + case DefaultAlign: + // Linux targets support unaligned accesses on AARCH64 + AllowsUnalignedMem = isTargetLinux(); + break; + case StrictAlign: + AllowsUnalignedMem = false; + break; + case NoStrictAlign: + AllowsUnalignedMem = true; + break; + } } bool AArch64Subtarget::GVIsIndirectSymbol(const GlobalValue *GV, |