Index: cfe/trunk/include/clang/Driver/CC1Options.td =================================================================== --- cfe/trunk/include/clang/Driver/CC1Options.td +++ cfe/trunk/include/clang/Driver/CC1Options.td @@ -743,4 +743,6 @@ def dwarf_debug_producer : Separate<["-"], "dwarf-debug-producer">, HelpText<"The string to embed in the Dwarf debug AT_producer record.">; +def defsym : Separate<["-"], "defsym">, + HelpText<"Define a value for a symbol">; } // let Flags = [CC1AsOption] Index: cfe/trunk/lib/Driver/Tools.cpp =================================================================== --- cfe/trunk/lib/Driver/Tools.cpp +++ cfe/trunk/lib/Driver/Tools.cpp @@ -3115,6 +3115,9 @@ } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") || Value.startswith("-mhwdiv") || Value.startswith("-march")) { // Do nothing, we'll validate it later. + } else if (Value == "-defsym") { + CmdArgs.push_back(Value.data()); + TakeNextArg = true; } else { D.Diag(diag::err_drv_unsupported_option_argument) << A->getOption().getName() << Value; Index: cfe/trunk/test/Driver/defsym.s =================================================================== --- cfe/trunk/test/Driver/defsym.s +++ cfe/trunk/test/Driver/defsym.s @@ -0,0 +1,22 @@ +// RUN: %clang -### -c -integrated-as %s \ +// RUN: -Wa,-defsym,abc=5 -Wa,-defsym,xyz=0xa \ +// RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM1 + +// RUN: %clang -### -c -no-integrated-as %s \ +// RUN: -Wa,-defsym,abc=5 -Wa,-defsym,xyz=0xa \ +// RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM1 + +// CHECK-DEFSYM1: "-defsym" +// CHECK-DEFSYM1: "abc=5" +// CHECK-DEFSYM1: "-defsym" +// CHECK-DEFSYM1: "xyz=0xa" + +// RUN: not %clang -c -integrated-as %s \ +// RUN: -Wa,-defsym,abc= \ +// RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM-ERR1 +// CHECK-DEFSYM-ERR1: error: defsym must be of the form: sym=value: abc= + +// RUN: not %clang -c -integrated-as %s \ +// RUN: -Wa,-defsym,abc=1a2b3c \ +// RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM-ERR2 +// CHECK-DEFSYM-ERR2: error: Value is not an integer: 1a2b3c Index: cfe/trunk/tools/driver/cc1as_main.cpp =================================================================== --- cfe/trunk/tools/driver/cc1as_main.cpp +++ cfe/trunk/tools/driver/cc1as_main.cpp @@ -77,6 +77,9 @@ /// be a list of strings starting with '+' or '-'. std::vector Features; + /// The list of symbol definitions. + std::vector SymbolDefs; + /// @} /// @name Language Options /// @{ @@ -252,6 +255,7 @@ Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic"); Opts.IncrementalLinkerCompatible = Args.hasArg(OPT_mincremental_linker_compatible); + Opts.SymbolDefs = Args.getAllArgValues(OPT_defsym); return Success; } @@ -420,6 +424,14 @@ if (!TAP) Failed = Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; + // Set values for symbols, if any. + for (auto &S : Opts.SymbolDefs) { + if (Ctx.setSymbolValue(Parser->getStreamer(), S)) { + Failed = true; + break; + } + } + if (!Failed) { Parser->setTargetParser(*TAP.get()); Failed = Parser->Run(Opts.NoInitialTextSection);