From 081e13e6f146d1685bdcb1ec1c82752f4c6d264d Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 7 Oct 2014 00:47:21 +0300 Subject: [PATCH] Add more recognized architectures Aliases can now resolve to multiple parts, so words like x86_64 or win32 can do the right thing. The pc type was changed to x86, because that more accurately describes the processor archetype. --- source/architecture.cpp | 102 +++++++++++++++++++++++++--------------- source/architecture.h | 2 +- source/gnucompiler.cpp | 21 ++++++++- 3 files changed, 86 insertions(+), 39 deletions(-) diff --git a/source/architecture.cpp b/source/architecture.cpp index 847711e..a943498 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -14,7 +14,7 @@ namespace { const char *types[] = { - "pc", + "x86", "arm", "ppc", 0 @@ -22,19 +22,23 @@ const char *types[] = const char *cpus[] = { - "i386", "pc", - "i486", "pc", - "pentium", "pc", - "pentiumpro", "pc", - "pentium2", "pc", - "pentium3", "pc", - "pentium4", "pc", - "core2", "pc", - "k6", "pc", - "athlon", "pc", - "athlonxp", "pc", - "athlon64", "pc", + "i386", "x86", + "i486", "x86", + "pentium", "x86", + "pentiumpro", "x86", + "pentium2", "x86", + "pentium3", "x86", + "pentium4", "x86", + "core2", "x86", + "nehalem", "x86", + "k6", "x86", + "athlon", "x86", + "athlonxp", "x86", + "athlon64", "x86", "armv5", "arm", + "armv6", "arm", + "armv7", "arm", + "armv7a", "arm", 0 }; @@ -50,12 +54,17 @@ const char *systems[] = const char *aliases[] = { - "x86", "pc", - "i586", "pentium", - "i686", "pentiumpro", - "x86_64", "athlon64", - "win32", "windows", + "pc", "x86", + "x86_64", "x86-64", + "amd64", "x86-64", + "i586", "pentium", + "i686", "pentiumpro", + "corei7", "nehalem", + "win32", "windows-32", + "win64", "windows-64", "power macintosh", "ppc", + "armeabi", "arm", + "v7a", "armv7a", 0 }; @@ -134,65 +143,84 @@ bool Architecture::match_name(const string &pattern) const { bool negate = (pattern[0]=='!'); vector parts = split(pattern.substr(negate), "-"); + resolve_aliases(parts); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - string part = resolve_alias(*i); - if((part=="32" && bits==32) || (part=="64" && bits==64)) + if((*i=="32" && bits==32) || (*i=="64" && bits==64)) ; - else if(part!=type && part!=cpu && part!=system) + else if(*i!=type && *i!=cpu && *i!=system) return negate; } return !negate; } -string Architecture::resolve_alias(const string &part) const +void Architecture::resolve_aliases(vector &parts) { - for(unsigned j=0; aliases[j]; j+=2) - if(part==aliases[j]) - return aliases[j+1]; + for(unsigned i=0; i rparts = split(replace, "-"); + parts[i] = rparts[0]; + parts.insert(parts.begin()+i+1, rparts.begin()+1, rparts.end()); + i += rparts.size()-1; + } + else + parts[i] = replace; + } + } } void Architecture::parse_specification(const string &spec) { vector parts = split(spec, "-"); + resolve_aliases(parts); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - string part = resolve_alias(*i); - bool ok = false; for(unsigned j=0; (!ok && types[j]); ++j) - if(part==types[j]) + if(*i==types[j]) { - if(!type.empty() && part!=type) + if(!type.empty() && *i!=type) throw invalid_argument("Conflicting type specification"); - type = part; + type = *i; ok = true; } for(unsigned j=0; (!ok && cpus[j]); j+=2) - if(part==cpus[j]) + if(*i==cpus[j]) { if(type.empty()) type = cpus[j+1]; else if(cpus[j+1]!=type) throw invalid_argument("Conflicting CPU specification"); - cpu = part; + cpu = *i; ok = true; } for(unsigned j=0; (!ok && systems[j]); ++j) - if(part==systems[j]) + if(*i==systems[j]) { - system = part; + system = *i; ok = true; } - if(!ok && (part=="32" || part=="64")) + if(!ok && (*i=="32" || *i=="64")) { - bits = lexical_cast(part); + bits = lexical_cast(*i); ok = true; } diff --git a/source/architecture.h b/source/architecture.h index cec397f..d84173e 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -54,7 +54,7 @@ public: const PatternList &get_executable_patterns() const { return executable_patterns; } private: - std::string resolve_alias(const std::string &) const; + static void resolve_aliases(std::vector &); void parse_specification(const std::string &); }; diff --git a/source/gnucompiler.cpp b/source/gnucompiler.cpp index 0517228..6daa99d 100644 --- a/source/gnucompiler.cpp +++ b/source/gnucompiler.cpp @@ -15,6 +15,17 @@ using namespace std; using namespace Msp; +namespace { + +const char *cpus[] = +{ + "athlonxp", "athlon-xp", + "armv7a", "armv7-a", + 0 +}; + +} + GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t, const FS::Path &sysroot): Tool(b, a, t) { @@ -165,9 +176,17 @@ Task *GnuCompiler::run(const Target &target) const if(architecture->is_native() && architecture->get_bits()!=native_arch.get_bits()) argv.push_back(format("-m%d", architecture->get_bits())); - const string &cpu = architecture->get_cpu(); + string cpu = architecture->get_cpu(); if(!cpu.empty()) + { + for(unsigned i=0; cpus[i]; i+=2) + if(cpu==cpus[i]) + { + cpu = cpus[i+1]; + break; + } argv.push_back("-march="+cpu); + } FS::Path obj_path = object.get_path(); FS::Path src_path = object.get_source().get_path(); -- 2.43.0