[llvm-dev] Environment variables

David Greene via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 7 11:54:40 PDT 2018


David Blaikie <dblaikie at gmail.com> writes:

> Perhaps it'd make sense to just have one such environment variable
> entry point - perhaps in Clang's driver (& it'd use the environment
> variable as part of constructing the -cc1 command line - thus crash
> reports, etc, would still encode everything needed for reproducing the
> failure). Ensuring that all the options/configuration points are
> exposed at least via -mllvm style cl options (these are cheap to add -
> don't have to be plumbed through all the different layers, etc -
> intended for compiler-engineer tweaking/experiments/investigation).
>
> & that means not having lots of environment variable reading/testing
> all over the codebase, so probably not much need for generic/helper
> utilities

That sounds like a very reasonable approach.  We've done similar things
in the past with other projects.  The code I'm referencing is 30+ years
old, so the same design decisions almost certainly don't apply to much
newer code.

                                 -David

> On Fri, Sep 7, 2018 at 7:59 AM David Greene via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>
>     Sure, but we're not using this with ccache and other such things.
>     We're
>     very specifically using them for debugging purposes. It's very
>     special-case and so we don't expect them to interact well with
>     general
>     tools. They're not meant for day-to-day use.
>     
>     -David
>     
>     Bruce Hoult <brucehoult at sifive.com> writes:
>     
>     > Env vars that change compiler output make it impossible to write
>     tools
>     > such as ccache or distcc. Including the entire env in the hash
>     value
>     > that determines whether ccache has a cache hit (as well as the
>     > compiler command line and the preprocessed source file) would be
>     > ridiculous and would result in very few cache hits.
>     >
>     > On Thu, Sep 6, 2018 at 11:34 AM, Matthias Braun via llvm-dev
>     > <llvm-dev at lists.llvm.org> wrote:
>     >
>     > I can definitely relate to third party Makefiles being a huge
>     pain
>     > to manipulate. And env vars can be an okay tool to help
>     debugging
>     > (see also CCC_OVERRIDE_OPTIONS in clang for example). I also
>     don't
>     > want to dispute that they may be the right solution in some
>     cases.
>     > That said in my opinion we should not make it look like using
>     > environment variables is a good or encouraged thing because
>     there
>     > are downsides:
>     > 
>     > - The bug reproducetion instruction and file bundles that clang
>     > produces when it crashes does not show environment variables,
>     > meaning you possibly cannot reproduce a bug...
>     > - Similarily when producing .ll files, going through jenkins
>     > output, etc. You typically have no good way to see the
>     environment
>     > variables in effect. Even if you do, there are typically
>     hundreds
>     > of them and it may be hard to know which ones affect the
>     compiler.
>     > - env vars only work more reliably if they are sparsly used as
>     > soon as they have interesting/desirable effects you will see
>     > people using them in their makefiles as well, making the whole
>     > thing brittle again because now you have to wonder if someone
>     > overrides, resets, manipulates the env vars in their makefiles
>     > bringing you back to square one where you have to understand and
>     > change complex third party makefiles...
>     > 
>     > - Matthias
>     > 
>     > 
>     > 
>     > > On Sep 6, 2018, at 10:44 AM, David Greene <dag at cray.com>
>     wrote:
>     > > 
>     > > Yes, but in your example getenv is called every time
>     > enableFooBar needs
>     > > to be initialized. What if your code is itself wrapped inside
>     > another
>     > > loop you can't see (for example, the PassManager invoking
>     > passes)?
>     > > 
>     > > Maybe I'm being overly pedantic.
>     > > 
>     > > We use a lot of environment variables in our compiler because
>     > it's
>     > > really super annoying and takes a lot of developer time to
>     have
>     > to
>     > > update customer Makefiles to include the debugging options we
>     > want to
>     > > use to debug customer problems. These are huge customer codes
>     > with
>     > > often many Makefiles which may be generated by custom tools we
>     > don't
>     > > understand at all. :) It's much easier to use the compiler
>     flags
>     > that
>     > > are in the Makefiles and set some environment variables to
>     > override
>     > > things during "make."
>     > > 
>     > > It seems odd that cl::ParseEnvironmentOptions exists but there
>     > is no
>     > > "official" way to get at environment variables.
>     > > 
>     > > If this isn't something the community wants or needs, that's
>     > fine. I
>     > > was just asking if a contribution would be welcomed if we end
>     up
>     > > developing something.
>     > > 
>     > > -David
>     > > 
>     > > Matthias Braun <mbraun at apple.com> writes:
>     > > 
>     > >>> On Sep 6, 2018, at 7:09 AM, David Greene via llvm-dev
>     > <llvm-dev at lists.llvm.org> wrote:
>     > >>> 
>     > >>> Ok, thanks! I'm not dealing with UTF-8 so I don't think
>     > Process::GetEnv
>     > >>> will work. I was looking for something that caches calls to
>     > getenv so
>     > >>> checks could be put into tight(-ish) loops without too much
>     > performance
>     > >>> impact.
>     > >> 
>     > >> Sorry for the snarky answer but we already have that:
>     > >> 
>     > >> // outside of loop
>     > >> bool enableFooBar = getenv("ENABLE_FOO_BAR");
>     > >> while (...) {
>     > >> // it's not getting re-checked every loop iteration:
>     > >> enableFooBar;
>     > >> }
>     > >> 
>     > >> Generally we don't really look at env vars today (I think for
>     > clang
>     > >> you can mostly affect some search paths with them) and IMO it
>     > is a
>     > >> good thing to force being explicit on the command line
>     > instead...
>     > >> 
>     > >> - Matthias
>     > >> 
>     > >>> 
>     > >>> -David
>     > >>> 
>     > >>> Reid Kleckner via llvm-dev <llvm-dev at lists.llvm.org> writes:
>     > >>> 
>     > >>>> llvm::Process::GetEnv looks like it does the right thing.
>     > >>>> 
>     > >>>> I think we added it to deal with Unicode on Windows,
>     though.
>     > We have
>     > >>>> plenty of calls to getenv that are mostly looking for '1', '
>     > 0', or
>     > >>>> variable presence, and they pretty much work.
>     > >>>> 
>     > >>>> On Wed, Sep 5, 2018 at 2:12 PM David Greene via llvm-dev
>     > >>>> <llvm-dev at lists.llvm.org> wrote:
>     > >>>> 
>     > >>>> Is there an LLVM-ish way to handle environment variables?
>     > >>>> Specifically,
>     > >>>> I want to check existence and/or value of an environment
>     > variable
>     > >>>> and
>     > >>>> take appropriate action.
>     > >>>> 
>     > >>>> I was kind of surprised that LLVM doesn't seem to have any
>     > >>>> special/optimized way to deal with environment variables.
>     The
>     > one
>     > >>>> Stackoverflow I found on it suggested using getenv().
>     > >>>> 
>     > >>>> Thanks!
>     > >>>> 
>     > >>>> -David
>     > >>>> _______________________________________________
>     > >>>> LLVM Developers mailing list
>     > >>>> llvm-dev at lists.llvm.org
>     > >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>> 
>     > >>>> _______________________________________________
>     > >>>> LLVM Developers mailing list
>     > >>>> llvm-dev at lists.llvm.org
>     > >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev> _
>     > ______________________________________________
>     > >>> LLVM Developers mailing list
>     > >>> llvm-dev at lists.llvm.org
>     > >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     > 
>     > _______________________________________________
>     > LLVM Developers mailing list
>     > llvm-dev at lists.llvm.org
>     > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     > 
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list