From 6996f6b9ece7365ed14529237d16f774717c5a0c Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 21 Jan 2014 17:19:44 +0000 Subject: [PATCH] Add -m16 option for using x86-*-*-code16 triple llvm-svn: 199754 --- clang/include/clang/Driver/Options.td | 1 + clang/lib/Driver/Driver.cpp | 19 ++++++++++++++----- clang/test/Driver/x86_m16.c | 4 ++++ 3 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 clang/test/Driver/x86_m16.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6682039e7efc..5e8a3b89e2af 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -951,6 +951,7 @@ def lazy__framework : Separate<["-"], "lazy_framework">, Flags<[LinkerInput]>; def lazy__library : Separate<["-"], "lazy_library">, Flags<[LinkerInput]>; def EL : Flag<["-"], "EL">, Flags<[DriverOption]>; def EB : Flag<["-"], "EB">, Flags<[DriverOption]>; +def m16 : Flag<["-"], "m16">, Group, Flags<[DriverOption, CoreOption]>; def m32 : Flag<["-"], "m32">, Group, Flags<[DriverOption, CoreOption]>; def mqdsp6_compat : Flag<["-"], "mqdsp6-compat">, Group, Flags<[DriverOption,CC1Option]>, HelpText<"Enable hexagon-qdsp6 backward compatibility">; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ad938b8bd821..17e6bfd2ccb6 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1900,13 +1900,22 @@ static llvm::Triple computeTargetTriple(StringRef DefaultTargetTriple, Target.getOS() == llvm::Triple::Minix) return Target; - // Handle pseudo-target flags '-m32' and '-m64'. - if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) { + // Handle pseudo-target flags '-m64', '-m32' and '-m16'. + if (Arg *A = Args.getLastArg(options::OPT_m64, options::OPT_m32, + options::OPT_m16)) { llvm::Triple::ArchType AT; - if (A->getOption().matches(options::OPT_m32)) - AT = Target.get32BitArchVariant().getArch(); - else + if (A->getOption().matches(options::OPT_m64)) AT = Target.get64BitArchVariant().getArch(); + else if (A->getOption().matches(options::OPT_m32)) + AT = Target.get32BitArchVariant().getArch(); + else if (A->getOption().matches(options::OPT_m16)) { + AT = Target.get32BitArchVariant().getArch(); + if (AT == llvm::Triple::x86) + Target.setEnvironment(llvm::Triple::CODE16); + else + AT = llvm::Triple::UnknownArch; + } + if (AT != llvm::Triple::UnknownArch) Target.setArch(AT); } diff --git a/clang/test/Driver/x86_m16.c b/clang/test/Driver/x86_m16.c new file mode 100644 index 000000000000..be15ff53c2f0 --- /dev/null +++ b/clang/test/Driver/x86_m16.c @@ -0,0 +1,4 @@ +// RUN: %clang -target i386 -m16 -### -c %s 2>&1 | FileCheck %s + +// CHECK: Target: i386-{{.*}}-{{.*}}-code16 +