This makes -fno-common the default for all targets because this has performance and code-size benefits and is more language conforming for C code. Additionally, GCC10 also defaults to -fno-common and so we get consistent behaviour with GCC.
With this change, C code that uses tentative definitions as definitions of a variable in multiple translation units will trigger multiple-definition linker errors. Generally, this occurs when the use of the extern keyword is neglected in the declaration of a variable in a header file. In some cases, no specific translation unit provides a definition of the variable. The previous behavior can be restored by specifying -fcommon.
As GCC has switched already, we benefit from applications already being ported and existing documentation how to do this. For example:
cc1 does not check -fcommon: Opts.NoCommon = Args.hasArg(OPT_fno_common);
I think you can flip it to Opts.NoCommon = !Args.hasArg(OPT_fcommon);
and change here to pass -fcommon if Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common, false)