summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/Targets.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-20 16:06:38 +0000
committerChris Lattner <sabre@nondot.org>2009-03-20 16:06:38 +0000
commit1e1c0b9fd329144f34b056b8c50a90db949cd1bc (patch)
treecc84378786f51b74141a84dfcb5792151242622c /clang/lib/Basic/Targets.cpp
parente81cc832f6640fe04f0fb9aac3d432571b1644f0 (diff)
downloadbcm5719-llvm-1e1c0b9fd329144f34b056b8c50a90db949cd1bc.tar.gz
bcm5719-llvm-1e1c0b9fd329144f34b056b8c50a90db949cd1bc.zip
refactor some code, fixing a problem discovered by the dragonfly bsd people, where
clang was defining "i386" even when in non-gnu mode. llvm-svn: 67378
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r--clang/lib/Basic/Targets.cpp50
1 files changed, 31 insertions, 19 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 979b5fe21b3..903fa8a19ee 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -19,6 +19,7 @@
#include "clang/Basic/LangOptions.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/SmallString.h"
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -35,6 +36,29 @@ static void Define(std::vector<char> &Buf, const char *Macro,
Buf.push_back('\n');
}
+/// DefineStd - Define a macro name and standard variants. For example if
+/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
+/// when in GNU mode.
+static void DefineStd(std::vector<char> &Buf, const char *MacroName,
+ const LangOptions &Opts) {
+ assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
+
+ // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
+ // in the user's namespace.
+ if (Opts.GNUMode)
+ Define(Buf, MacroName);
+
+ // Define __unix.
+ llvm::SmallString<20> TmpStr;
+ TmpStr = "__";
+ TmpStr += MacroName;
+ Define(Buf, TmpStr.c_str());
+
+ // Define __unix__.
+ TmpStr += "__";
+ Define(Buf, TmpStr.c_str());
+}
+
//===----------------------------------------------------------------------===//
// Defines specific to certain operating systems.
//===----------------------------------------------------------------------===//
@@ -58,7 +82,7 @@ static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit,
Define(Defs, "__FreeBSD__", release);
Define(Defs, "__FreeBSD_cc_version", version);
Define(Defs, "__KPRINTF_ATTRIBUTE__");
- Define(Defs, "unix");
+ DefineStd(Defs, "unix", Opts);
Define(Defs, "__ELF__", "1");
if (is64Bit) {
Define(Defs, "__LP64__");
@@ -73,19 +97,13 @@ static void getDragonFlyDefines(const LangOptions &Opts,
Define(Defs, "__ELF__");
Define(Defs, "__KPRINTF_ATTRIBUTE__");
Define(Defs, "__tune_i386__");
- Define(Defs, "unix");
- Define(Defs, "__unix");
- Define(Defs, "__unix__");
+ DefineStd(Defs, "unix", Opts);
}
static void getLinuxDefines(const LangOptions &Opts, std::vector<char> &Defs) {
// Linux defines; list based off of gcc output
- Define(Defs, "__unix__");
- Define(Defs, "__unix");
- Define(Defs, "unix");
- Define(Defs, "__linux__");
- Define(Defs, "__linux");
- Define(Defs, "linux");
+ DefineStd(Defs, "unix", Opts);
+ DefineStd(Defs, "linux", Opts);
Define(Defs, "__gnu_linux__");
Define(Defs, "__ELF__", "1");
}
@@ -517,9 +535,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Define(Defs, "__x86_64__");
Define(Defs, "__SSE3__");
} else {
- Define(Defs, "__i386__");
- Define(Defs, "__i386");
- Define(Defs, "i386");
+ DefineStd(Defs, "i386", Opts);
}
// Target properties.
@@ -715,13 +731,9 @@ public:
std::vector<char> &Defines) const {
X86_32TargetInfo::getTargetDefines(Opts, Defines);
// This list is based off of the the list of things MingW defines
- Define(Defines, "__WIN32__");
- Define(Defines, "__WIN32");
Define(Defines, "_WIN32");
- Define(Defines, "WIN32");
- Define(Defines, "__WINNT__");
- Define(Defines, "__WINNT");
- Define(Defines, "WINNT");
+ DefineStd(Defines, "WIN32", Opts);
+ DefineStd(Defines, "WINNT", Opts);
Define(Defines, "_X86_");
Define(Defines, "__MSVCRT__");
}
OpenPOWER on IntegriCloud