1212#include " InputInfo.h"
1313#include " clang/Basic/CharInfo.h"
1414#include " clang/Basic/LangOptions.h"
15+ #include " clang/Basic/MacroBuilder.h"
1516#include " clang/Basic/ObjCRuntime.h"
17+ #include " clang/Basic/TargetInfo.h"
18+ #include " clang/Basic/TargetOptions.h"
1619#include " clang/Basic/Version.h"
1720#include " clang/Config/config.h"
1821#include " clang/Driver/DriverDiagnostic.h"
1922#include " clang/Driver/Options.h"
2023#include " clang/Driver/SanitizerArgs.h"
2124#include " clang/Driver/XRayArgs.h"
25+ #include " clang/Frontend/CompilerInstance.h"
26+ #include " clang/Frontend/Utils.h"
2227#include " llvm/ADT/StringExtras.h"
2328#include " llvm/Option/ArgList.h"
2429#include " llvm/Support/CodeGen.h"
@@ -38,6 +43,19 @@ using namespace clang::driver::tools;
3843using namespace clang ;
3944using namespace llvm ::opt;
4045
46+ class FlangMacroBuilder : public MacroBuilder {
47+ ArgStringList &CmdArgs;
48+ const ArgList &DriverArgs;
49+ public:
50+ FlangMacroBuilder (ArgStringList &UpperCmdArgs, const ArgList &DriverArgs, llvm::raw_string_ostream &Output)
51+ : MacroBuilder(Output), CmdArgs(UpperCmdArgs), DriverArgs(DriverArgs) {
52+ }
53+ virtual void defineMacro (const Twine &Name, const Twine &Value = " 1" ) {
54+ CmdArgs.push_back (" -def" );
55+ CmdArgs.push_back (DriverArgs.MakeArgString (Name + Twine (' =' ) + Value));
56+ }
57+ };
58+
4159void FlangFrontend::ConstructJob (Compilation &C, const JobAction &JA,
4260 const InputInfo &Output, const InputInfoList &Inputs,
4361 const ArgList &Args, const char *LinkingOutput) const {
@@ -608,27 +626,51 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
608626 // Add system include arguments.
609627 getToolChain ().AddFlangSystemIncludeArgs (Args, UpperCmdArgs);
610628
611- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" unix" );
612- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __unix" );
613- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __unix__" );
614- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" linux" );
615- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __linux" );
616- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __linux__" );
617- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __NO_MATH_INLINES" );
618- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __LP64__" );
619- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __LONG_MAX__=9223372036854775807L" );
620- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __SIZE_TYPE__=unsigned long int" );
621- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __PTRDIFF_TYPE__=long int" );
629+ // Use clang's predefined macros
630+ DiagnosticsEngine DE (new DiagnosticIDs (), new DiagnosticOptions, new IgnoringDiagConsumer ());
631+ std::shared_ptr<clang::TargetOptions> TO = std::make_shared<clang::TargetOptions>();
632+ TO->Triple = getToolChain ().getEffectiveTriple ().getTriple ();
633+ std::shared_ptr<TargetInfo> TI (clang::TargetInfo::CreateTargetInfo (DE, TO));
634+ std::string PredefineBuffer;
635+ llvm::raw_string_ostream Predefines (PredefineBuffer);
636+ FlangMacroBuilder Builder (UpperCmdArgs, Args, Predefines);
637+
638+ LangOptions LO;
639+ VersionTuple VT = getToolChain ().computeMSVCVersion (&getToolChain ().getDriver (), Args);
640+ if (!VT.empty ()) {
641+ // Set the MSCompatibility version. Subminor version has 5 decimal digits.
642+ // Minor and major versions have 2 decimal digits each.
643+ LO.MSCompatibilityVersion = VT.getMajor () * 10000000 +
644+ VT.getMinor ().getValueOr (0 ) * 100000 +
645+ VT.getSubminor ().getValueOr (0 );
646+ }
647+
648+ // Define Target specific macros like __linux__
649+ TI->getTargetDefines (LO, Builder);
650+
651+ Builder.defineMacro (" __SIZE_TYPE__" , TargetInfo::getTypeName (TI->getSizeType ()));
652+ Builder.defineMacro (" __PTRDIFF_TYPE__" , TargetInfo::getTypeName (TI->getPtrDiffType (0 )));
653+
654+ if (TI->getPointerWidth (0 ) == 64 && TI->getLongWidth () == 64
655+ && TI->getIntWidth () == 32 ) {
656+ Builder.defineMacro (" _LP64" );
657+ Builder.defineMacro (" __LP64__" );
658+ }
659+
660+ if (TI->getPointerWidth (0 ) == 32 && TI->getLongWidth () == 32
661+ && TI->getIntWidth () == 32 ) {
662+ Builder.defineMacro (" _ILP32" );
663+ Builder.defineMacro (" __ILP32__" );
664+ }
665+
666+ DefineTypeSize (" __LONG_MAX__" , TargetInfo::SignedLong, *TI, Builder);
667+
668+ // Add additional predefined macros
622669 switch (getToolChain ().getEffectiveTriple ().getArch ()) {
623670 case llvm::Triple::aarch64:
624- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __aarch64" );
625- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __aarch64__" );
626- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __ARM_ARCH=8" );
627671 UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __ARM_ARCH__=8" );
628672 break ;
629673 case llvm::Triple::x86_64:
630- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __x86_64" );
631- UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __x86_64__" );
632674 UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __amd_64__amd64__" );
633675 UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __k8" );
634676 UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __k8__" );
0 commit comments