[llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp

Eric Christopher echristo at apple.com
Sun Nov 28 21:41:47 PST 2010


On Nov 27, 2010, at 4:31 PM, Mikhail Glushenkov wrote:

> Author: foldr
> Date: Sat Nov 27 18:31:13 2010
> New Revision: 120230
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=120230&view=rev
> Log:
> llvmc: First stab at better -march handling.
> 

I'm not particularly happy with this direction at the moment. Ideally I
think that if we want to support the full set of gcc command line options
(in particular the abomination that is the arm version) we'll need to
explicitly factor the backends to support them instead of trying to translate
each march option (which is, tbh, what we really support at the moment)
into a set of mattr flags. We would then need, at least a:

a) target processor compiled for
b) target cpu family compiled for (arm only afaik)
c) target processor tuned for

in order to support -march, -mcpu, and -mtune (in that order).

In particular the implementation that you have here won't work for any
other processor that I know of at the moment.

-eric

> Modified:
>    llvm/trunk/tools/llvmc/src/Base.td.in
>    llvm/trunk/tools/llvmc/src/Hooks.cpp
> 
> Modified: llvm/trunk/tools/llvmc/src/Base.td.in
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/src/Base.td.in?rev=120230&r1=120229&r2=120230&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvmc/src/Base.td.in (original)
> +++ llvm/trunk/tools/llvmc/src/Base.td.in Sat Nov 27 18:31:13 2010
> @@ -46,8 +46,8 @@
>     (help "Choose linker (possible values: gcc, g++)")),
>  (parameter_option "mtune",
>     (help "Target a specific CPU type"), (forward_not_split)),
> - (parameter_option "march",
> -    (help "Architecture to generate code for"), (forward_not_split)),
> + (parameter_list_option "march",
> +    (help "Generate code for the specified machine type")),
>  (parameter_option "mcpu",
>     (help "A deprecated synonym for -mtune"), (hidden), (forward_not_split)),
>  (switch_option "mfix-and-continue",
> @@ -295,7 +295,8 @@
>           (switch_on "fPIC"), (append_cmd "-relocation-model=pic"),
>           (switch_on "mdynamic-no-pic"),
>                      (append_cmd "-relocation-model=dynamic-no-pic"),
> -          (not_empty "march"), (forward "march"),
> +          (not_empty "march"), (forward_transformed_value
> +                                "march", "ConvertMArchToMAttr"),
>           (not_empty "mcpu"), (forward "mcpu"),
>           (and (not_empty "mtune"), (empty "mcpu")),
>                      (forward_as "mtune", "-mcpu"),
> 
> Modified: llvm/trunk/tools/llvmc/src/Hooks.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/src/Hooks.cpp?rev=120230&r1=120229&r2=120230&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvmc/src/Hooks.cpp (original)
> +++ llvm/trunk/tools/llvmc/src/Hooks.cpp Sat Nov 27 18:31:13 2010
> @@ -1,14 +1,20 @@
> +#include "llvm/ADT/StringMap.h"
> +
> #include <string>
> #include <vector>
> 
> namespace hooks {
> typedef std::vector<std::string> StrVec;
> +typedef llvm::StringMap<const char*> ArgMap;
> 
> -/// ConvertToMAttr - Convert -m* and -mno-* to -mattr=+*,-*
> -std::string ConvertToMAttr(const StrVec& Opts) {
> +/// ConvertToMAttrImpl - Common implementation of ConvertMArchToMAttr and
> +/// ConvertToMAttr. The optional Args parameter contains information about how
> +/// to transform special-cased values (for example, '-march=armv6' must be
> +/// forwarded as '-mattr=+v6').
> +std::string ConvertToMAttrImpl(const StrVec& Opts, const ArgMap* Args = 0) {
>   std::string out("-mattr=");
> -
>   bool firstIter = true;
> +
>   for (StrVec::const_iterator B = Opts.begin(), E = Opts.end(); B!=E; ++B) {
>     const std::string& Arg = *B;
> 
> @@ -17,10 +23,23 @@
>     else
>       out += ",";
> 
> +    // Check if the argument is a special case.
> +    if (Args != 0) {
> +      ArgMap::const_iterator I = Args->find(Arg);
> +
> +      if (I != Args->end()) {
> +        out += '+';
> +        out += I->getValue();
> +        continue;
> +      }
> +    }
> +
> +    // Convert 'no-foo' to '-foo'.
>     if (Arg.find("no-") == 0 && Arg[3] != 0) {
>       out += '-';
>       out += Arg.c_str() + 3;
>     }
> +    // Convert 'foo' to '+foo'.
>     else {
>       out += '+';
>       out += Arg;
> @@ -30,4 +49,36 @@
>   return out;
> }
> 
> +// Values needed to be special-cased by ConvertMArchToMAttr.
> +const char* MArchMapKeys[] = { "armv6" };
> +const char* MArchMapValues[] = { "v6" };
> +const unsigned NumMArchMapKeys = sizeof(MArchMapKeys) / sizeof(const char*);
> +
> +void InitializeMArchMap(ArgMap& Args) {
> +  for (unsigned i = 0; i < NumMArchMapKeys; ++i) {
> +    // Explicit cast to StringRef here is necessary to pick up the right
> +    // overload.
> +    Args.GetOrCreateValue(llvm::StringRef(MArchMapKeys[i]), MArchMapValues[i]);
> +  }
> +}
> +
> +/// ConvertMArchToMAttr - Try to convert -march from the gcc dialect to
> +/// something llc can understand.
> +std::string ConvertMArchToMAttr(const StrVec& Opts) {
> +  static ArgMap MArchMap(NumMArchMapKeys);
> +  static bool MArchMapInitialized = false;
> +
> +  if (!MArchMapInitialized) {
> +    InitializeMArchMap(MArchMap);
> +    MArchMapInitialized = true;
> +  }
> +
> +  return ConvertToMAttrImpl(Opts, &MArchMap);
> +}
> +
> +/// ConvertToMAttr - Convert '-mfoo' and '-mno-bar' to '-mattr=+foo,-bar'.
> +std::string ConvertToMAttr(const StrVec& Opts) {
> +  return ConvertToMAttrImpl(Opts);
> +}
> +
> }
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list