diff options
Diffstat (limited to 'clang/lib/Frontend/InitPreprocessor.cpp')
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index e576fc0..0519255 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1099,6 +1099,44 @@ static void InitializePredefinedMacros(const TargetInfo &TI, TI.getTargetDefines(LangOpts, Builder); } +/// Initialize macros based on AuxTargetInfo. +static void InitializePredefinedAuxMacros(const TargetInfo &AuxTI, + const LangOptions &LangOpts, + MacroBuilder &Builder) { + auto AuxTriple = AuxTI.getTriple(); + + // Define basic target macros needed by at least bits/wordsize.h and + // bits/mathinline.h + switch (AuxTriple.getArch()) { + case llvm::Triple::x86_64: + Builder.defineMacro("__x86_64__"); + break; + case llvm::Triple::ppc64: + case llvm::Triple::ppc64le: + Builder.defineMacro("__powerpc64__"); + break; + default: + break; + } + + // libc++ needs to find out the object file format and threading API. + if (AuxTriple.getOS() == llvm::Triple::Linux) { + Builder.defineMacro("__ELF__"); + Builder.defineMacro("__linux__"); + // Used in features.h. If this is omitted, math.h doesn't declare float + // versions of the functions in bits/mathcalls.h. + if (LangOpts.CPlusPlus) + Builder.defineMacro("_GNU_SOURCE"); + } else if (AuxTriple.isOSDarwin()) { + Builder.defineMacro("__APPLE__"); + Builder.defineMacro("__MACH__"); + } else if (AuxTriple.isOSWindows()) { + Builder.defineMacro("_WIN32"); + if (AuxTriple.isWindowsGNUEnvironment()) + Builder.defineMacro("__MINGW32__"); + } +} + /// InitializePreprocessor - Initialize the preprocessor getting it and the /// environment ready to process a single file. This returns true on error. /// @@ -1120,13 +1158,9 @@ void clang::InitializePreprocessor( // Install things like __POWERPC__, __GNUC__, etc into the macro table. if (InitOpts.UsePredefines) { - // FIXME: This will create multiple definitions for most of the predefined - // macros. This is not the right way to handle this. - if ((LangOpts.CUDA || LangOpts.OpenMPIsDevice) && PP.getAuxTargetInfo()) - InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts, - Builder); - InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, Builder); + if ((LangOpts.CUDA || LangOpts.OpenMPIsDevice) && PP.getAuxTargetInfo()) + InitializePredefinedAuxMacros(*PP.getAuxTargetInfo(), LangOpts, Builder); // Install definitions to make Objective-C++ ARC work well with various // C++ Standard Library implementations. |