[LLVMdev] Getting command line options to affect subtarget features

Bill Schmidt wschmidt at linux.vnet.ibm.com
Thu Jan 31 09:23:16 PST 2013


On Thu, 2013-01-31 at 10:17 -0600, Bill Schmidt wrote:
> 
> On Thu, 2013-01-31 at 09:42 -0600, Hal Finkel wrote:
> > ----- Original Message -----
> > > From: "Bill Schmidt" <wschmidt at linux.vnet.ibm.com>
> > > To: llvmdev at cs.uiuc.edu
> > > Sent: Thursday, January 31, 2013 9:26:15 AM
> > > Subject: [LLVMdev] Getting command line options to affect subtarget features
> > > 
> > > The problem I'm trying to solve:  Invoking clang on PowerPC with
> > > -fno-altivec has no effect.
> > > 
> > > From what I've been able to piece together, PPC.td specifies various
> > > CPUs and the processor features available on each.  So for example we
> > > have:
> > > 
> > > def FeatureAltivec   : SubtargetFeature<"altivec","HasAltivec",
> > > "true",
> > >                                         "Enable Altivec
> > >                                         instructions">;
> > > 
> > > def : Processor<"pwr7", G5Itineraries,
> > >                   [DirectivePwr7, FeatureAltivec,
> > >                    FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX,
> > >                    FeatureISEL, Feature64Bit /*, Feature64BitRegs
> > >                    */]>;
> > > 
> > > During compilation the subtarget class (such as PPCSubtarget) is
> > > instantiated with the strings obtained from -mcpu and -mattr.
> > > ParseSubtargetFeatures then uses the -mcpu and -mattr values to
> > > determine which features to use for code generation.
> > > 
> > > What seems problematic is that -mattr is the only way that the static
> > > features of the target processor can be overridden.
> > > 
> > > It seems there must be a way for command-line parameters such as
> > > -fno-altivec to be used to override which processor features are
> > > exploited.  But I can't see immediately how this should work.  I
> > > don't
> > > know whether or how the command line flags from Clang are made
> > > available
> > > to LLVM for inspection.
> > > 
> > > I'm sure there must be an obvious way to do this, but peeking at code
> > > from other targets hasn't enlightened me.  Any advice for how I can
> > > accomplish this?
> > 
> > Off of the top of my head...
> > 
> > Within the current infrastructure, I think that we need to alter the Clang PowerPC toolchain code (Clang::AddPPCTargetArgs in Tools.cpp) to do something like this:
> > 
> > if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, true)) {
> >   CmdArgs.push_back("-backend-option");
> >   CmdArgs.push_back("-mattr=-altivec");
> > }
> 
> Perfect, Hal, thanks!  That makes good sense.  I'll fix this and also
> bring some of the CPU handling more up-to-date (several missing
> processors that ought to be in there).

Well, I spoke too soon.  I tried this and received the following
objection:

~/src/llvm> $LLVM_INSTALL/bin/clang vectest.c -S -O3 -o vectest.s -fno-altivec
clang: Unknown command line argument '-mattr=-altivec'.  Try: 'clang -help'
clang: Did you mean '-mxgot=-altivec'?
~/src/llvm> 

Yet I can do the following:

~/src/llvm> $LLVM_INSTALL/bin/llc -O3 -mattr=-altivec vectest.ll
~/src/llvm> 

The general mechanism seems valid since code like this exists:

  if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
                   false)) {
    CmdArgs.push_back("-backend-option");
    CmdArgs.push_back("-force-align-stack");
  }

But it doesn't like -mattr.  Anyone have thoughts why?

Thanks,
Bill

> 
> Thanks,
> Bill
> 
> > 
> > Why this not done currently I don't know.
> > 
> >  -Hal
> > 
> > > 
> > > Thanks!  I appreciate any help.
> > > 
> > > Bill
> > > 
> > > --
> > > Bill Schmidt, Ph.D.
> > > IBM Advance Toolchain for PowerLinux
> > > IBM Linux Technology Center
> > > wschmidt at us.ibm.com
> > > wschmidt at linux.vnet.ibm.com
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > _______________________________________________
> > > LLVM Developers mailing list
> > > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> > > 
> > 




More information about the llvm-dev mailing list