diff --git a/gen/cl_options.cpp b/gen/cl_options.cpp index 561b2a1f..06bfffe6 100644 --- a/gen/cl_options.cpp +++ b/gen/cl_options.cpp @@ -205,8 +205,7 @@ cl::opt moduleDepsFile("deps", cl::value_desc("filename")); -cl::opt > mArch("march", +cl::opt mArch("march", cl::desc("Architecture to generate code for:")); cl::opt m32bits("m32", diff --git a/gen/cl_options.h b/gen/cl_options.h index 0350ad2e..5db72e82 100644 --- a/gen/cl_options.h +++ b/gen/cl_options.h @@ -6,8 +6,6 @@ #include #include -#include "llvm/Support/RegistryParser.h" -#include "llvm/Target/TargetMachineRegistry.h" #include "llvm/Support/CommandLine.h" namespace opts { @@ -37,8 +35,7 @@ namespace opts { extern cl::list versions; extern cl::opt moduleDepsFile; - extern cl::opt > mArch; + extern cl::opt mArch; extern cl::opt m32bits; extern cl::opt m64bits; extern cl::opt mCPU; diff --git a/gen/main.cpp b/gen/main.cpp index 63c291e6..7420613c 100644 --- a/gen/main.cpp +++ b/gen/main.cpp @@ -12,7 +12,7 @@ #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetSelect.h" #include @@ -397,7 +397,7 @@ int main(int argc, char** argv) // check -m32/64 sanity if (m32bits && m64bits) error("cannot use both -m32 and -m64 options"); - else if ((m32bits || m64bits) && (mArch != 0 || !mTargetTriple.empty())) + else if ((m32bits || m64bits) && (!mArch.empty() || !mTargetTriple.empty())) error("-m32 and -m64 switches cannot be used together with -march and -mtriple switches"); if (global.errors) fatal(); @@ -415,7 +415,7 @@ int main(int argc, char** argv) // did the user override the target triple? if (mTargetTriple.empty()) { - if (mArch != 0) + if (!mArch.empty()) { error("you must specify a target triple as well with -mtriple when using the -march option"); fatal(); @@ -437,9 +437,9 @@ int main(int argc, char** argv) LDC_TARGETS #undef LLVM_TARGET - const llvm::Target *theTarget; + const llvm::Target *theTarget = NULL; // Check whether the user has explicitly specified an architecture to compile for. - if (mArch == 0) + if (mArch.empty()) { std::string Err; theTarget = llvm::TargetRegistry::getClosestStaticTargetForModule(mod, Err); @@ -451,7 +451,21 @@ LDC_TARGETS } else { - theTarget = &mArch->TheTarget; + for (llvm::TargetRegistry::iterator it = llvm::TargetRegistry::begin(), + ie = llvm::TargetRegistry::end(); it != ie; ++it) + { + if (mArch == it->getName()) + { + theTarget = &*it; + break; + } + } + + if (!theTarget) + { + error("invalid target '%s'", mArch.c_str()); + fatal(); + } } // Package up features to be passed to target/subtarget