From e5cee260ce07f96a8bc8f82905bc319cc33106fe Mon Sep 17 00:00:00 2001 From: Kevin Qin Date: Tue, 6 May 2014 09:51:32 +0000 Subject: [PATCH] [ARM64] Enable alignment control option in front-end for ARM64. This patch is to get "-mno-unaligned-access" and "-munaligned-access" work in front-end for ARM64 target. llvm-svn: 208075 --- clang/include/clang/Driver/Options.td | 6 ++--- clang/lib/Driver/Tools.cpp | 12 ++++++++-- clang/test/Driver/arm-alignment.c | 41 +++++++++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 14 deletions(-) (limited to 'clang') diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 8d2e36866b0..4ab3450332c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1080,11 +1080,11 @@ def mno_rdseed : Flag<["-"], "mno-rdseed">, Group; def mno_sha : Flag<["-"], "mno-sha">, Group; def munaligned_access : Flag<["-"], "munaligned-access">, Group, - HelpText<"Allow memory accesses to be unaligned (ARM only)">; + HelpText<"Allow memory accesses to be unaligned (AArch32/AArch64 only)">; def mno_unaligned_access : Flag<["-"], "mno-unaligned-access">, Group, - HelpText<"Force all memory accesses to be aligned (ARM only)">; + HelpText<"Force all memory accesses to be aligned (AArch32/AArch64 only)">; def mstrict_align : Flag<["-"], "mstrict-align">, Alias, Flags<[CC1Option,HelpHidden]>, - HelpText<"Force all memory accesses to be aligned (ARM only, same as mno-unaligned-access)">; + HelpText<"Force all memory accesses to be aligned (AArch64 only, same as mno-unaligned-access)">; def mno_thumb : Flag<["-"], "mno-thumb">, Group; def mrestrict_it: Flag<["-"], "mrestrict-it">, Group, HelpText<"Disallow generation of deprecated IT blocks for ARMv8. It is on by default for ARMv8 Thumb mode.">; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 247d0d8cfa1..99d15f72b9f 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -3391,10 +3391,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_munaligned_access)) { if (A->getOption().matches(options::OPT_mno_unaligned_access)) { CmdArgs.push_back("-backend-option"); - CmdArgs.push_back("-arm-strict-align"); + if (getToolChain().getTriple().getArch() == llvm::Triple::arm64 || + getToolChain().getTriple().getArch() == llvm::Triple::arm64_be) + CmdArgs.push_back("-arm64-strict-align"); + else + CmdArgs.push_back("-arm-strict-align"); } else { CmdArgs.push_back("-backend-option"); - CmdArgs.push_back("-arm-no-strict-align"); + if (getToolChain().getTriple().getArch() == llvm::Triple::arm64 || + getToolChain().getTriple().getArch() == llvm::Triple::arm64_be) + CmdArgs.push_back("-arm64-no-strict-align"); + else + CmdArgs.push_back("-arm-no-strict-align"); } } } diff --git a/clang/test/Driver/arm-alignment.c b/clang/test/Driver/arm-alignment.c index e3ab276212a..5133db7f79a 100644 --- a/clang/test/Driver/arm-alignment.c +++ b/clang/test/Driver/arm-alignment.c @@ -1,25 +1,48 @@ // RUN: %clang -target arm-none-gnueabi -munaligned-access -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-UNALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM < %t %s // RUN: %clang -target arm-none-gnueabi -mstrict-align -munaligned-access -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-UNALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM < %t %s // RUN: %clang -target arm-none-gnueabi -mno-unaligned-access -munaligned-access -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-UNALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM < %t %s -// CHECK-UNALIGNED: "-backend-option" "-arm-no-strict-align" +// RUN: %clang -target arm64-none-gnueabi -munaligned-access -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM64 < %t %s + +// RUN: %clang -target arm64-none-gnueabi -mstrict-align -munaligned-access -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM64 < %t %s + +// RUN: %clang -target arm64-none-gnueabi -mno-unaligned-access -munaligned-access -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-UNALIGNED-ARM64 < %t %s + +// CHECK-UNALIGNED-ARM: "-backend-option" "-arm-no-strict-align" +// CHECK-UNALIGNED-ARM64: "-backend-option" "-arm64-no-strict-align" // RUN: %clang -target arm-none-gnueabi -mno-unaligned-access -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-ALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM < %t %s // RUN: %clang -target arm-none-gnueabi -mstrict-align -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-ALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM < %t %s // RUN: %clang -target arm-none-gnueabi -munaligned-access -mno-unaligned-access -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-ALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM < %t %s // RUN: %clang -target arm-none-gnueabi -munaligned-access -mstrict-align -### %s 2> %t -// RUN: FileCheck --check-prefix=CHECK-ALIGNED < %t %s +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM < %t %s + +// RUN: %clang -target arm64-none-gnueabi -mno-unaligned-access -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM64 < %t %s + +// RUN: %clang -target arm64-none-gnueabi -mstrict-align -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM64 < %t %s + +// RUN: %clang -target arm64-none-gnueabi -munaligned-access -mno-unaligned-access -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM64 < %t %s + +// RUN: %clang -target arm64-none-gnueabi -munaligned-access -mstrict-align -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-ALIGNED-ARM64 < %t %s -// CHECK-ALIGNED: "-backend-option" "-arm-strict-align" +// CHECK-ALIGNED-ARM: "-backend-option" "-arm-strict-align" +// CHECK-ALIGNED-ARM64: "-backend-option" "-arm64-strict-align" -- cgit v1.2.3