Skip to content

Commit f4508c0

Browse files
authored
Merge pull request #70 from isuruf/preprocessor
Use predefined macros from clang preprocessor
2 parents e5ef44d + 96433b6 commit f4508c0

File tree

4 files changed

+75
-20
lines changed

4 files changed

+75
-20
lines changed

include/clang/Basic/MacroBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MacroBuilder {
2727
MacroBuilder(raw_ostream &Output) : Out(Output) {}
2828

2929
/// Append a \#define line for macro of the form "\#define Name Value\n".
30-
void defineMacro(const Twine &Name, const Twine &Value = "1") {
30+
virtual void defineMacro(const Twine &Name, const Twine &Value = "1") {
3131
Out << "#define " << Name << ' ' << Value << '\n';
3232
}
3333

include/clang/Frontend/Utils.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define LLVM_CLANG_FRONTEND_UTILS_H
1616

1717
#include "clang/Basic/Diagnostic.h"
18+
#include "clang/Basic/TargetInfo.h"
1819
#include "clang/Basic/VirtualFileSystem.h"
1920
#include "llvm/ADT/IntrusiveRefCntPtr.h"
2021
#include "llvm/ADT/StringRef.h"
@@ -46,13 +47,14 @@ class HeaderSearch;
4647
class HeaderSearchOptions;
4748
class IdentifierTable;
4849
class LangOptions;
50+
class MacroBuilder;
4951
class PCHContainerReader;
5052
class Preprocessor;
5153
class PreprocessorOptions;
5254
class PreprocessorOutputOptions;
5355
class SourceManager;
5456
class Stmt;
55-
class TargetInfo;
57+
class StringRef;
5658
class FrontendOptions;
5759

5860
/// Apply the header search options to get given HeaderSearch object.
@@ -67,6 +69,17 @@ void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts,
6769
const PCHContainerReader &PCHContainerRdr,
6870
const FrontendOptions &FEOpts);
6971

72+
/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine
73+
/// the width, suffix, and signedness of the given type
74+
void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,
75+
const TargetInfo &TI, MacroBuilder &Builder);
76+
77+
/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
78+
/// named MacroName with the max value for a type with width 'TypeWidth' a
79+
/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
80+
void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
81+
StringRef ValSuffix, bool isSigned, MacroBuilder &Builder);
82+
7083
/// DoPrintPreprocessedInput - Implement -E mode.
7184
void DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream* OS,
7285
const PreprocessorOutputOptions &Opts);

lib/Driver/ToolChains/Flang.cpp

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@
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;
3843
using namespace clang;
3944
using 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+
4159
void 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__");

lib/Frontend/InitPreprocessor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
181181
/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
182182
/// named MacroName with the max value for a type with width 'TypeWidth' a
183183
/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
184-
static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
184+
void clang::DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
185185
StringRef ValSuffix, bool isSigned,
186186
MacroBuilder &Builder) {
187187
llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
@@ -191,7 +191,7 @@ static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
191191

192192
/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine
193193
/// the width, suffix, and signedness of the given type
194-
static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,
194+
void clang::DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,
195195
const TargetInfo &TI, MacroBuilder &Builder) {
196196
DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),
197197
TI.isTypeSigned(Ty), Builder);

0 commit comments

Comments
 (0)