summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Driver/Driver.cpp6
-rw-r--r--clang/lib/Driver/HostInfo.cpp15
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 2c324010dac..40c6e500636 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -445,9 +445,11 @@ void Driver::BuildActions(const ArgList &Args, ActionList &Actions) const {
Ty = types::TY_C;
} else {
// Otherwise lookup by extension, and fallback to ObjectType
- // if not found.
+ // if not found. We use a host hook here because Darwin at
+ // least has its own idea of what .s is.
if (const char *Ext = strrchr(Value, '.'))
- Ty = types::lookupTypeForExtension(Ext + 1);
+ Ty = Host->lookupTypeForExtension(Ext + 1);
+
if (Ty == types::TY_INVALID)
Ty = types::TY_Object;
}
diff --git a/clang/lib/Driver/HostInfo.cpp b/clang/lib/Driver/HostInfo.cpp
index 39a688a4f5c..8c24a3c707b 100644
--- a/clang/lib/Driver/HostInfo.cpp
+++ b/clang/lib/Driver/HostInfo.cpp
@@ -57,6 +57,17 @@ public:
virtual bool useDriverDriver() const;
+ virtual types::ID lookupTypeForExtension(const char *Ext) const {
+ types::ID Ty = types::lookupTypeForExtension(Ext);
+
+ // Darwin always preprocesses assembly files (unless -x is used
+ // explicitly).
+ if (Ty == types::TY_PP_Asm)
+ return types::TY_Asm;
+
+ return Ty;
+ }
+
virtual ToolChain *getToolChain(const ArgList &Args,
const char *ArchName) const;
};
@@ -173,6 +184,10 @@ public:
virtual bool useDriverDriver() const;
+ virtual types::ID lookupTypeForExtension(const char *Ext) const {
+ return types::lookupTypeForExtension(Ext);
+ }
+
virtual ToolChain *getToolChain(const ArgList &Args,
const char *ArchName) const;
};
OpenPOWER on IntegriCloud