Index: include/clang/Basic/LangOptions.def =================================================================== --- include/clang/Basic/LangOptions.def +++ include/clang/Basic/LangOptions.def @@ -164,6 +164,7 @@ COMPATIBLE_LANGOPT(Optimize , 1, 0, "__OPTIMIZE__ predefined macro") COMPATIBLE_LANGOPT(OptimizeSize , 1, 0, "__OPTIMIZE_SIZE__ predefined macro") COMPATIBLE_LANGOPT(Static , 1, 0, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)") +COMPATIBLE_LANGOPT(Unicode , 1, 0, "UNICODE predefined macro") VALUE_LANGOPT(PackStruct , 32, 0, "default struct packing maximum alignment") VALUE_LANGOPT(MaxTypeAlign , 32, 0, Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1927,7 +1927,7 @@ def mconsole : Joined<["-"], "mconsole">, Group, Flags<[DriverOption]>; def mwindows : Joined<["-"], "mwindows">, Group, Flags<[DriverOption]>; def mdll : Joined<["-"], "mdll">, Group, Flags<[DriverOption]>; -def municode : Joined<["-"], "municode">, Group, Flags<[DriverOption]>; +def municode : Joined<["-"], "municode">, Group, Flags<[DriverOption, CC1Option]>; def mthreads : Joined<["-"], "mthreads">, Group, Flags<[DriverOption]>; def mcpu_EQ : Joined<["-"], "mcpu=">, Group; def mmcu_EQ : Joined<["-"], "mmcu=">, Group; Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -109,6 +109,8 @@ } Builder.defineMacro("__MSVCRT__"); Builder.defineMacro("__MINGW32__"); + if (Opts.Unicode) + Builder.defineMacro("UNICODE"); addCygMingDefines(Opts, Builder); } Index: lib/Driver/ToolChains/Clang.cpp =================================================================== --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -3346,6 +3346,9 @@ if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("-static-define"); + if (Args.hasArg(options::OPT_municode)) + CmdArgs.push_back("-municode"); + if (isa(JA)) RenderAnalyzerOptions(Args, CmdArgs, Triple, Input); Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2460,6 +2460,7 @@ Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); Opts.PIE = Args.hasArg(OPT_pic_is_pie); Opts.Static = Args.hasArg(OPT_static_define); + Opts.Unicode = Args.hasArg(OPT_municode); Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple); Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple || Args.hasArg(OPT_fdump_record_layouts); Index: test/Preprocessor/predefined-win-macros.c =================================================================== --- test/Preprocessor/predefined-win-macros.c +++ test/Preprocessor/predefined-win-macros.c @@ -73,12 +73,17 @@ // RUN: %clang_cc1 -triple i686-windows-gnu %s -E -dM -o - \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-X86-MINGW +// CHECK-X86-MINGW-NOT: #define UNICODE 1 // CHECK-X86-MINGW: #define WIN32 1 // CHECK-X86-MINGW-NOT: #define WIN64 1 // CHECK-X86-MINGW: #define WINNT 1 // CHECK-X86-MINGW: #define _WIN32 1 // CHECK-X86-MINGW-NOT: #define _WIN64 1 +// RUN: %clang_cc1 -triple i686-windows-gnu %s -E -dM -o - -municode \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-X86-MINGW-UNICODE +// CHECK-X86-MINGW-UNICODE: #define UNICODE 1 + // RUN: %clang_cc1 -triple thumbv7-windows-gnu %s -E -dM -o - \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-ARM-MINGW