[cfe-dev] Configuration files
Hal Finkel via cfe-dev
cfe-dev at lists.llvm.org
Thu Mar 16 07:43:01 PDT 2017
On 03/16/2017 08:25 AM, Serge Pavlov wrote:
> 2017-03-16 9:46 GMT+07:00 James Y Knight <jyknight at google.com
> <mailto:jyknight at google.com>>:
>
> I'd really like to at least have a *design* for how this can
> eventually incorporate target-specific options before moving
> forward with adding a --config option, even if the initial commit
> won't implement the full design.
>
> I don't believe hand-wavy "maybe we'll add syntax that looks kinda
> like a comment so older versions will ignore it" is good enough there.
>
To be clear, there is a current design for this. As Serge mentions
below, we handle PREFIX-clang to search for config files based on
PREFIX. PREFIX here is usually a target, but can be other things as well
for local customization. This was specifically intended to work for
cross compiling. That having been said, we may need to extend this...
>
> I'd like to again keep in mind the use-case I mentioned a while
> ago. Approximately every linux distro configures GCC to set their
> default target cpu levels. E.g., Debian seems to set the following:
> - On x86, the default CPU should be i686.
> - But on x86-64, the default CPU isn't changed (aka it's left as
> "x86-64").
> - For ppc32/ppc64, the default CPU should be power7 but tune for
> power8.
> - For ppc64le, the default CPU should be power8.
> - On ARM (hf), armv7-a should be the default cpu, vfpv3-d16 the
> default fpu, and it should default to thumb mode.
> etc...
>
> Note that those defaults are different on different releases of
> the distro.
>
> The way you do this with GCC is via options passed to the
> configure script: --with-arch-32= --with-arch-64= --with-fpu=
> --with-mode= etc. which turn into values used in the
> target-specific OPTION_DEFAULT_SPECS macro. Since GCC only builds
> for one target at a time (or two, if you count 32/64 separately),
> and you're expected to need to build a new gcc any time you want
> to cross-compile, that's sufficient.
>
> Clang is intrinsically a cross-compiler, so gcc's solution isn't
> good enough for clang (nor is clang's current behavior enough).
> So, what's the plan to actually solve this?
>
>
> Initial versions of this proposal defined two kinds of config files:
> - named, which should be explicitly specified by a user by option
> --config or be encoded into executable name as `armv7l-clang`.
> - default, which is loaded always much like `.bashrc` or any similar file.
> These two kinds of config file shared implementation but addressed
> different use cases, which made confusion during discussion. To
> facilitate review process the support of default config files was
> removed from the proposal. The issues you mention should mostly be
> solved by the default config files.
>
> If the default config files were implemented in clang, driver would
> search binary directory for default configuration description. If
> compiler is named as `armv7l-clang`, driver first tries file
> `armv7l.cfg` then `clang.cfg`. If config file is found, options listed
> there are put into the set of driver arguments before any option
> specified in command line.
>
> With this feature a distribution or SDK can supply set of config files
> as a part of clang package and tunes compiler appropriately.
>
>
> 1. There needs to a way to be able to configure the defaults for
> all supported architectures of the platform (either in a single
> config, or in multiple that clang knows how to select).
>
>
> Each supported target can have separate config file.
>
> 2. Those platform defaults should, somehow, avoid interfering with
> the use of clang to cross-compile TO a different platform, and be
> easy to use FROM a different host platform. (find default config
> via sysroot, maybe?)
>
>
> Default config in sysroot could be included by default clang config,
> however driver must know where the sysroot is. We could support a set
> of macros, for instance expand `$TARGET` in config file to target name
> as `armv7l-clang`. This topic is not elaborated yet.
>
> 3. How do we recommend users select a target?
> Do we need to look for the proper defaults when the user specifies
> "--target $TARGET" to clang?
> Or maybe we favor of the "$TARGET-clang" symlink method?
> Or maybe "--target" is a low-level feature not recommended for
> end-users, and we should steer people to using something like
> "-arch", to select a named architecture within the current
> platform configuration, like apple does with darwin-based
> platforms now?
>
>
> To specify a target looks like a more flexible solution.
> "$TARGET-clang" symlink method was already implemented in early
> versions of https://reviews.llvm.org/D24933. It is possible also to
> extend treatment of `--target` so that it acted similar to `--config`.
This seems like a good idea. Depending on how the "Linux distribution"
use case actually works (which might also apply to cross-mounted file
systems across different architectures?), we might also want to also do
the search for the default target, even if none is explicitly provided,
so that a distribution can ship a default set of files and the compiler
will pick up the right one for the current system. James, does this
correspond to what you had in mind?
Thanks again,
Hal
>
> Thanks,
> --Serge
>
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170316/703c0ee0/attachment.html>
More information about the cfe-dev
mailing list