diff --git a/clang/Driver/Targets.cpp b/clang/Driver/Targets.cpp index dbc0f7af09a5..07e0d620afd8 100644 --- a/clang/Driver/Targets.cpp +++ b/clang/Driver/Targets.cpp @@ -18,8 +18,6 @@ #include "clang/Basic/TargetInfo.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/CommandLine.h" -#include -#include using namespace clang; @@ -688,17 +686,8 @@ static TargetInfoImpl *CreateTarget(const std::string& T) { else if (T.find("bogusW16W16-") == 0) // For testing portability. return new LinuxTargetInfo(T); } - else { - // Make a copy of the triple that is all lowercase. - std::string T_lower(T); - std::transform(T_lower.begin(), T_lower.end(), - T_lower.begin(), (int(*)(int)) std::tolower); - if (T_lower.find("linux") != std::string::npos && IsX86(T)) - return new LinuxTargetInfo(T); - } - - assert (false && "Unknown target!"); + return NULL; } /// CreateTargetInfo - Return the set of target info objects as specified by @@ -709,11 +698,25 @@ TargetInfo *clang::CreateTargetInfo(const std::vector& triples, assert (!triples.empty() && "No target triple."); // Create the primary target and target info. - TargetInfo *TI = new TargetInfo(CreateTarget(triples[0]), &Diags); + TargetInfoImpl* PrimaryTarget = CreateTarget(triples[0]); + + if (!PrimaryTarget) + return NULL; + + TargetInfo *TI = new TargetInfo(PrimaryTarget, &Diags); // Add all secondary targets. - for (unsigned i = 1, e = triples.size(); i != e; ++i) + for (unsigned i = 1, e = triples.size(); i != e; ++i) { + TargetInfoImpl* SecondaryTarget = CreateTarget(triples[i]); + + if (!SecondaryTarget) { + fprintf (stderr, "Warning: secondary target '%s' unrecognized.\n", + triples[i].c_str()); + continue; + } + TI->AddSecondaryTarget(CreateTarget(triples[i])); + } return TI; } diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 139febeda1c8..0b04038b05ac 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -424,8 +424,14 @@ static void CreateTargetTriples(std::vector& triples) { // Initialize base triple. If a -triple option has been specified, use // that triple. Otherwise, default to the host triple. - if (TargetTriple.getValue().empty()) - base_triple = LLVM_HOSTTRIPLE; + if (TargetTriple.getValue().empty()) { + // HACK: For non-darwin systems, we don't have any real target support + // yet. For these systems, set the target to darwin. + if (!strstr("darwin",LLVM_HOSTTRIPLE)) + base_triple = "i386-apple-darwin"; + else + base_triple = LLVM_HOSTTRIPLE; + } else base_triple = TargetTriple.getValue(); @@ -991,12 +997,13 @@ int main(int argc, char **argv) { std::vector triples; CreateTargetTriples(triples); Target = CreateTargetInfo(triples,Diags); - } - if (Target == 0) { - fprintf(stderr, - "Sorry, don't know what target this is, please use -arch.\n"); - exit(1); + if (Target == 0) { + fprintf(stderr, "Sorry, I don't know what target this is: %s\n", + triples[0].c_str()); + fprintf(stderr, "Please use -triple or -arch.\n"); + exit(1); + } } // Process the -I options and set them in the HeaderInfo.