Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -277,4 +277,6 @@ InGroup; def err_drv_unsupported_linker : Error<"unsupported value '%0' for -linker option">; +def err_drv_defsym_invalid_format : Error<"defsym must be of the form: sym=value: %0">; +def err_drv_defsym_invalid_symval : Error<"Value is not an integer: %0">; } Index: test/Driver/defsym.s =================================================================== --- test/Driver/defsym.s +++ test/Driver/defsym.s @@ -17,6 +17,11 @@ // CHECK-DEFSYM-ERR1: error: defsym must be of the form: sym=value: abc= // RUN: not %clang -c -integrated-as -o /dev/null %s \ -// RUN: -Wa,-defsym,abc=1a2b3c \ +// RUN: -Wa,-defsym,=123 \ // RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM-ERR2 -// CHECK-DEFSYM-ERR2: error: Value is not an integer: 1a2b3c +// CHECK-DEFSYM-ERR2: error: defsym must be of the form: sym=value: =123 + +// RUN: not %clang -c -integrated-as -o /dev/null %s \ +// RUN: -Wa,-defsym,abc=1a2b3c \ +// RUN: 2>&1 | FileCheck %s --check-prefix=CHECK-DEFSYM-ERR3 +// CHECK-DEFSYM-ERR3: error: Value is not an integer: 1a2b3c Index: tools/driver/cc1as_main.cpp =================================================================== --- tools/driver/cc1as_main.cpp +++ tools/driver/cc1as_main.cpp @@ -426,10 +426,23 @@ // Set values for symbols, if any. for (auto &S : Opts.SymbolDefs) { - if (Ctx.setSymbolValue(Parser->getStreamer(), S)) { + auto Pair = StringRef(S).split('='); + auto Sym = Pair.first; + auto Val = Pair.second; + + if (Sym.empty() || Val.empty()) { + Diags.Report(diag::err_drv_defsym_invalid_format) << S; Failed = true; break; } + int64_t Value; + if (Val.getAsInteger(0, Value)) { + Diags.Report(diag::err_drv_defsym_invalid_symval) << Val; + Failed = true; + break; + } + + Ctx.setSymbolValue(Parser->getStreamer(), Sym, Value); } if (!Failed) {