> Date: Fri, 20 Jan 2017 21:41:37 +1000
> From: Patrick Wildt <[email protected]>
> 
> Hi,
> 
> currently our clang for ARM64 creates code thinking it can do unaligned
> access.  Which is kinda true, since our kernel does not enforce strict
> alignment yet.  The Pine64 on the other hand enforces strict alignment
> at least as long as EFI is running.  This means efiboot needs to be
> compiled with strict alignment, while it wouldn't yet matter on kernel
> or userland.
> 
> Still, we probably want to make strict alignment the default and then
> enforce it.  This diff makes clang use strict alignment on OpenBSD if
> it wasn't overridden by any flags.
> 
> ok?

ok kettenis@

Perhaps we should wait upstreaming this for a bit until we're sure it
is viable to enforce strict-alignment though.

> diff --git a/gnu/llvm/tools/clang/lib/Driver/Tools.cpp 
> b/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
> index bc7b9a98bb6..2e88668e866 100644
> --- a/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
> +++ b/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
> @@ -2470,7 +2470,9 @@ getAArch64MicroArchFeaturesFromMcpu(const Driver &D, 
> StringRef Mcpu,
>    return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
>  }
>  
> -static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
> +static void getAArch64TargetFeatures(const Driver &D,
> +                                     const llvm::Triple &Triple,
> +                                     const ArgList &Args,
>                                       std::vector<const char *> &Features) {
>    Arg *A;
>    bool success = true;
> @@ -2512,9 +2514,11 @@ static void getAArch64TargetFeatures(const Driver &D, 
> const ArgList &Args,
>    }
>  
>    if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
> -                               options::OPT_munaligned_access))
> +                               options::OPT_munaligned_access)) {
>      if (A->getOption().matches(options::OPT_mno_unaligned_access))
>        Features.push_back("+strict-align");
> +  } else if (Triple.isOSOpenBSD())
> +    Features.push_back("+strict-align");
>  
>    if (Args.hasArg(options::OPT_ffixed_x18))
>      Features.push_back("+reserve-x18");
> @@ -2600,7 +2604,7 @@ static void getTargetFeatures(const ToolChain &TC, 
> const llvm::Triple &Triple,
>      break;
>    case llvm::Triple::aarch64:
>    case llvm::Triple::aarch64_be:
> -    getAArch64TargetFeatures(D, Args, Features);
> +    getAArch64TargetFeatures(D, Triple, Args, Features);
>      break;
>    case llvm::Triple::x86:
>    case llvm::Triple::x86_64:
> 
> 

Reply via email to