diff options
Diffstat (limited to 'tools/llvmc')
-rw-r--r-- | tools/llvmc/src/Hooks.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/tools/llvmc/src/Hooks.cpp b/tools/llvmc/src/Hooks.cpp index bcf4a53..5aa250e 100644 --- a/tools/llvmc/src/Hooks.cpp +++ b/tools/llvmc/src/Hooks.cpp @@ -10,19 +10,19 @@ namespace hooks { // See http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 inline unsigned NextHighestPowerOf2 (unsigned i) { + --i; i |= i >> 1; i |= i >> 2; i |= i >> 4; i |= i >> 8; i |= i >> 16; - i++; + ++i; return i; } typedef std::vector<std::string> StrVec; typedef llvm::StringMap<const char*> ArgMap; - /// AddPlusOrMinus - Convert 'no-foo' to '-foo' and 'foo' to '+foo'. void AddPlusOrMinus (const std::string& Arg, std::string& out) { if (Arg.find("no-") == 0 && Arg[3] != 0) { @@ -78,14 +78,22 @@ std::string ConvertMArchToMAttr(const StrVec& Opts) { std::string mcpu("-mcpu="); bool mattrTouched = false; bool mcpuTouched = false; - bool firstIter = true; for (StrVec::const_iterator B = Opts.begin(), E = Opts.end(); B!=E; ++B) { const std::string& Arg = *B; - if (firstIter) - firstIter = false; - else + // Check if the argument should be forwarded to -mcpu instead of -mattr. + { + ArgMap::const_iterator I = MArchMCpuMap.find(Arg); + + if (I != MArchMCpuMap.end()) { + mcpuTouched = true; + mcpu += I->getValue(); + continue; + } + } + + if (mattrTouched) mattr += ","; // Check if the argument is a special case. @@ -93,23 +101,13 @@ std::string ConvertMArchToMAttr(const StrVec& Opts) { ArgMap::const_iterator I = MArchMap.find(Arg); if (I != MArchMap.end()) { + mattrTouched = true; mattr += '+'; mattr += I->getValue(); continue; } } - // Check if the argument should be forwarded to -mcpu instead of -mattr. - { - ArgMap::const_iterator I = MArchMCpuMap.find(Arg); - - if (I != MArchMCpuMap.end()) { - mcpuTouched = true; - mcpu += I->getValue(); - continue; - } - } - AddPlusOrMinus(Arg, mattr); } |