Sanitizers libs in Compiler-RT

Hi all,

Can anyone explain me what was the rationale behind putting the sanitizer libraries in compiler-rt?

The sanitizers only work properly in x86_64 and I don’t see anyone even testing to any other platform, while compiler-rt should be a substitute for libgcc on all platforms, at least that’s the goal, and linking the success of the RT library to the success of the sanitizers is a bit of an oversight, IMHO.

I’m spending 99% of the time to make compiler-rt compiler on ARM using CMake by fiddling the sanitizers’ tests, lit config files and CMake scripts, which is a bit annoying…

Long term, would it be possible / desirable to split them into compiler-rt and sanitizer-rt?

cheers,
–renato

I don't know about the specific problems you've faced on ARM, but I'd like to add that these problems also exist on x86, where the sanitizers aren't fully supported on OS X, Windows or even various Linux distributions outside the configuration the authors have.

Moreover the project seems to have a different development and review policy to the rest of LLVM and it's been difficult at times to align that with general interests on the clang side.

That said, let's engage the developers before jumping to conclusions. The sanitizer work happens off in a corner and we tend to only notice it when it gets in our way. If the sanitizers are spun off, it should be done to make those developers work easier, not just ours.

Alp.

Hi Renato,

http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-November/045444.html

Basically, compiler-rt contains the only runtime libraries we ship with
Clang. The sanitizers are runtime libraries shipped with clang (they have
some version dependence), so they went in compiler-rt. Now they are
starting to feel much larger than compiler-rt, so perhaps they should be
split out.

Or we can leave them there and solve your ARM build problems a different
way.

Right, I apologise for my lack of specificity... I do remember that thread,
what I was referring to was exactly what you said.

My premise:

1. I want to make Compiler-RT work on ARM and be a drop-in replacement for
libgcc, to the point where it'll become the standard compiler library for
LLVM in the near future. My bold plans are to have that in 3.5, but I won't
be unhappy if we at least get it working until then.

2. I don't want to have the huge effort right now, to port a library that
was mainly developed by and on x86_64 *just because* I want compiler-rt to
work on ARM.

This can work in several ways:

A. I compile the whole lot, but only grab the compiler-rt library when
packaging.
B. I change the CMalke files to only compiler RT on ARM, or any other
architecture that wants only RT
C. We split the libraries

If the consensus is that the sanitizers are a lot bigger than RT and should
split for that reason, I'm fine with it. If not, I'm also fine with having
a CMake configuration to only build what's needed. I'd be less fine with
compiling everything, testing (or ignoring) everything, because that'll
strain our native bots (that are still dead slow) and will also increase
the signal-to-noise ration on bugs and crashes, but ultimately, I would be
ok with it, as a first approach.

Makes sense?

cheers,
--renato

I don't see any compelling reason to split the sanitizers out today. I
think the sanitizer guys would probably take a patch to CMakeLists.txt to
disable the sanitizer RTLs.

I'm told that ASan supports ARM, but it's maybe not production quality, so
I don't think disabling all sanitizers on non-x86 architectures will work.

I don't see any compelling reason to split the sanitizers out today.

Clear, next.

I think the sanitizer guys would probably take a patch to CMakeLists.txt to

disable the sanitizer RTLs.

Right. I'll first make it build and test, than I'll disable via a flag,
since other people can work in parallel to make it work on ARM.

I'm told that ASan supports ARM, but it's maybe not production quality, so

I don't think disabling all sanitizers on non-x86 architectures will work.

I hear Android folks use it, this is why I want to enable them by default.
Even if the tests don't mean much, at least there's a seed from where they
can pick that up and complete the port.

I'm fine on building them on my own, but buildbots and release builds
should not need to, if it's not suitable.

Thanks, that answers all my questions. I'll proceed with my changes.

--renato

Renato Golin wrote:

I'm told that ASan supports ARM, but it's maybe not production
quality, so I don't think disabling all sanitizers on non-x86
architectures will work.

I hear Android folks use it, this is why I want to enable them by
default. Even if the tests don't mean much, at least there's a seed from
where they can pick that up and complete the port.

We have been using ASan on ARM for last several months and we haven't seen any serious problem in runtime library.
We are using GCC's ASan though.

-Y

Just as a side note, I had some thoughts about the organization of this
stuff a while back that I wanted to replay here.

Fundamentally, I feel like we're in particular getting a few things
conflated. Maybe separating them out helps:

- There is the repository "compiler-rt" that holds all of the runtime
libraries that (if desired) need to be shipped along side the compiler.
They're separated so that they can be omitted when they aren't needed, and
potentially to isolate an unusual desired property: we would really like to
(eventually) build them with the just-built compiler rather than the host
compiler (where possible, clearly this requires the target compiler to be
executable on the host).

- There is the core runtime library. Historically this was called
'compiler-rt' informally, but perhaps better called 'libclang_rt', which
provides the core necessary runtime library facilities to compile C or C++
applications. It's analogous to libgcc but without some of the unwinding
code (as I understand it, there may be details I'm wrong about here or
glossing over, but it's not relevant to the organization of things).

- There are several optional runtime libraries to support specific compiler
/ toolchain features. These include the sanitizers and profiling libraries.

I think all of the libraries here make sense in the same repository because
of the shared concerns of building runtime libraries. For example, it would
be useful to compile them with the just-built-clang when target is
executable on the host, and it would be useful to automatically cross
compile versions of them for as many targets as are possible on the given
host and supported by the host compiler (if used) and the just-built-clang.

However, the organization of the tree is ... very hard to understand.
originally, there was only the one 'libclang_rt' library that had its
generic C99 implementation in 'lib', and architecture-specific assembly
routines when desirable in architecture subdirectories of lib. When we
added new libraries, we put them in subdirectories of lib, making the whole
thing kind of a mess. My suggestion to fix this was to create a "core"
subdirectory of lib to contain the code used for 'libclang_rt'. "core" is a
terrible name, but i've no better. suggestions welcome there. Then we would
have a more sensible organization of the 'lib' tree.

I also think it might be useful to have a single large test tree (much like
with llvm or clang) that has subdirectories for the various tests rather
than test directories under lib/asan/ and friends, but maybe the sanitizer
folks have objections to that. consistency seems a compelling reason here,
but there might be other compelling concerns.

Now, the build system has always been problematic because the build system
for this tree is *hard* and no one who has worked on it has really had the
time to do an extremely thorough job and finish all aspects. It's a huge
project. Right now, the makefile system does a good job of using the
just-built-clang and can do a limited amount of cross-building runtimes for
other targets. But the makefile system of compiler-rt is also terribly,
terribly complex, doesn't follow the conventions of LLVM's makefiles, and
is generally painful to maintain and update, so folks have been reluctant
to flesh out its support for new libraries and other new things.

The CMake system is much cleaner in some respects (a bit less opaque to the
folks trying to maintain it), but CMake makes it much harder to use the
just-built-clang, especially for the C++ runtime code. The consequence is
that we've never finished either the cross-building or
just-built-clang-hosting features that are desirable. Any work toward these
would be really awesome to see, but is a huge pile of work. Finally, when I
was originally doing the CMake build for this I didn't understand what
really needed to be done to build and use the core 'libclang_rt' library,
and so I don't think I got it right. Some folks have sent patches to
improve it, but I suspect it still really needs more work to be a solid
system to use instead of libgcc. So I'm really excited about your emails.
=] Having a more self-contained stack would be a significant improvement.

I think the obvious incremental steps are to disable building any parts of
compiler-rt that don't build cleanly. There should never be a requirement
for you to port an optional runtime library unless you need it. =] I think
having good ports is important, but that should never block progress
getting other thinsg ported and working well.

If it helps to reorganize things, I'm happy to even help there as much as I
can. I agree that the organization isn't great, but I *really* didn't want
to fight the makefile build system to do the reorganization myself, so its
something that has lingered too long.

Sorry for the long ramble, but hopefully this gives you some of tho context.

For some reason, the (generic, language-agnostic) unwind code is in libcxxabi. There was some discussion about moving it into the compiler-rt repository, where it would make sense. No one objected, but I'd rather not move it without a 'yes' from someone who is actually working on the code currently (I'd like to start factoring out the #ifdefs into a cleaner platform / architecture layer).

On FreeBSD, the 'libgcc' that we ship is now mostly code from the compiler-rt repository and it would be nice to have libgcc_s from the same source.

David

Maybe shoot a fresh email and directly CC various folks like howard, doug,
and nick? Seems reasonable to me.

I thought some of it still need libunwind (whichever of the various
versions you like)? It would be good to get a nice, clean implementation of
that functionality (whether based on one with an MIT license if there is
such or not) if we don't already have it.

Chandler,

Thanks for the great overview.

I don't see any compelling reason to split the sanitizers out today.

Clear, next.

Just as a side note, I had some thoughts about the organization of this
stuff a while back that I wanted to replay here.

Fundamentally, I feel like we're in particular getting a few things
conflated. Maybe separating them out helps:

- There is the repository "compiler-rt" that holds all of the runtime
libraries that (if desired) need to be shipped along side the compiler.
They're separated so that they can be omitted when they aren't needed, and
potentially to isolate an unusual desired property: we would really like to
(eventually) build them with the just-built compiler rather than the host
compiler (where possible, clearly this requires the target compiler to be
executable on the host).

- There is the core runtime library. Historically this was called
'compiler-rt' informally, but perhaps better called 'libclang_rt', which
provides the core necessary runtime library facilities to compile C or C++
applications. It's analogous to libgcc but without some of the unwinding
code (as I understand it, there may be details I'm wrong about here or
glossing over, but it's not relevant to the organization of things).

- There are several optional runtime libraries to support specific
compiler / toolchain features. These include the sanitizers and profiling
libraries.

I think all of the libraries here make sense in the same repository
because of the shared concerns of building runtime libraries. For example,
it would be useful to compile them with the just-built-clang when target is
executable on the host, and it would be useful to automatically cross
compile versions of them for as many targets as are possible on the given
host and supported by the host compiler (if used) and the just-built-clang.

However, the organization of the tree is ... very hard to understand.
originally, there was only the one 'libclang_rt' library that had its
generic C99 implementation in 'lib', and architecture-specific assembly
routines when desirable in architecture subdirectories of lib. When we
added new libraries, we put them in subdirectories of lib, making the whole
thing kind of a mess. My suggestion to fix this was to create a "core"
subdirectory of lib to contain the code used for 'libclang_rt'. "core" is a
terrible name, but i've no better. suggestions welcome there. Then we would
have a more sensible organization of the 'lib' tree.

I can't suggest a better name than "core" (maybe, "runtime"?), but would
*love* to put 'libclang_rt' into a separate directory under
/compiler-rt/lib :slight_smile: We should've done it long ago, IMO.

I also think it might be useful to have a single large test tree (much
like with llvm or clang) that has subdirectories for the various tests
rather than test directories under lib/asan/ and friends, but maybe the
sanitizer folks have objections to that. consistency seems a compelling
reason here, but there might be other compelling concerns.

Yes, I don't like the way testing is organized either. Originally it made
sense to put sanitizer lit tests under lib/xsan/, but now we've got a lot
of sanitizers, and a lot of duplicating configuration code. As Renato
mentioned, browsing
through lit configs is a bit painful. I would like to proceed with
re-organizing the tests for sanitizers, unless anyone objects. Kostya?

Now, the build system has always been problematic because the build system
for this tree is *hard* and no one who has worked on it has really had the
time to do an extremely thorough job and finish all aspects. It's a huge
project. Right now, the makefile system does a good job of using the
just-built-clang and can do a limited amount of cross-building runtimes for
other targets. But the makefile system of compiler-rt is also terribly,
terribly complex, doesn't follow the conventions of LLVM's makefiles, and
is generally painful to maintain and update, so folks have been reluctant
to flesh out its support for new libraries and other new things.

Note that it would be really hard to add support for running test suites
into Makefile build system. It's also good for the one-time build only, not
for continuous development - I don't think it respects dependencies
correctly.

The CMake system is much cleaner in some respects (a bit less opaque to
the folks trying to maintain it), but CMake makes it much harder to use the
just-built-clang, especially for the C++ runtime code. The consequence is
that we've never finished either the cross-building or
just-built-clang-hosting features that are desirable.

I once tried to implement a pseudo-build-system for compiler-rt on top of
CMake, so that we use "just-built" Clang instead of a host compiler, but
failed miserably. Maybe I was doing wrong things, but I got the impression
that CMake isn't suited for switching the compiler on the fly :slight_smile:

Any work toward these would be really awesome to see, but is a huge pile
of work. Finally, when I was originally doing the CMake build for this I
didn't understand what really needed to be done to build and use the core
'libclang_rt' library, and so I don't think I got it right. Some folks have
sent patches to improve it, but I suspect it still really needs more work
to be a solid system to use instead of libgcc. So I'm really excited about
your emails. =] Having a more self-contained stack would be a significant
improvement.

I think the obvious incremental steps are to disable building any parts of
compiler-rt that don't build cleanly.

As I mentioned above, currently in CMake build system we try to avoid
building anything if we're not sure we can produce a working and correct
library on the host platform. That is, I still don't see what the problem
is - it's relatively easy to enable building just the compiler-rt library
on ARM and not enable building sanitizers on ARM.

Yes, I don't like the way testing is organized either. Originally it made
sense to put sanitizer lit tests under lib/xsan/, but now we've got a lot
of sanitizers, and a lot of duplicating configuration code. As Renato
mentioned, browsing
through lit configs is a bit painful. I would like to proceed with
re-organizing the tests for sanitizers, unless anyone objects. Kostya?

Any such changes would horrify me, but if you are willing to do them --

great.
Once thing which I'd like to have improved: we currently have several lit
tests in asan or msan or tsan or lsan which really ought to be run for all
of the tools (e.g. tests for interceptors)

--kcc

Hi Alexey,

Thanks for the great overview.

+1
( and +1 for David's comment about moving the unwind stuff into this area)

I don't see any compelling reason to split the sanitizers out today.

Clear, next.

Just as a side note, I had some thoughts about the organization of this stuff a while back that I wanted to replay here.

Fundamentally, I feel like we're in particular getting a few things conflated. Maybe separating them out helps:

- There is the repository "compiler-rt" that holds all of the runtime libraries that (if desired) need to be shipped along side the compiler. They're separated so that they can be omitted when they aren't needed, and potentially to isolate an unusual desired property: we would really like to (eventually) build them with the just-built compiler rather than the host compiler (where possible, clearly this requires the target compiler to be executable on the host).

- There is the core runtime library. Historically this was called 'compiler-rt' informally, but perhaps better called 'libclang_rt', which provides the core necessary runtime library facilities to compile C or C++ applications. It's analogous to libgcc but without some of the unwinding code (as I understand it, there may be details I'm wrong about here or glossing over, but it's not relevant to the organization of things).

- There are several optional runtime libraries to support specific compiler / toolchain features. These include the sanitizers and profiling libraries.

I think all of the libraries here make sense in the same repository because of the shared concerns of building runtime libraries. For example, it would be useful to compile them with the just-built-clang when target is executable on the host, and it would be useful to automatically cross compile versions of them for as many targets as are possible on the given host and supported by the host compiler (if used) and the just-built-clang.

However, the organization of the tree is ... very hard to understand. originally, there was only the one 'libclang_rt' library that had its generic C99 implementation in 'lib', and architecture-specific assembly routines when desirable in architecture subdirectories of lib. When we added new libraries, we put them in subdirectories of lib, making the whole thing kind of a mess. My suggestion to fix this was to create a "core" subdirectory of lib to contain the code used for 'libclang_rt'. "core" is a terrible name, but i've no better. suggestions welcome there. Then we would have a more sensible organization of the 'lib' tree.

I can't suggest a better name than "core" (maybe, "runtime"?), but would *love* to put 'libclang_rt' into a separate directory under /compiler-rt/lib :slight_smile: We should've done it long ago, IMO.

I also think it might be useful to have a single large test tree (much like with llvm or clang) that has subdirectories for the various tests rather than test directories under lib/asan/ and friends, but maybe the sanitizer folks have objections to that. consistency seems a compelling reason here, but there might be other compelling concerns.

Yes, I don't like the way testing is organized either. Originally it made sense to put sanitizer lit tests under lib/xsan/, but now we've got a lot of sanitizers, and a lot of duplicating configuration code. As Renato mentioned, browsing
through lit configs is a bit painful. I would like to proceed with re-organizing the tests for sanitizers, unless anyone objects. Kostya?

Now, the build system has always been problematic because the build system for this tree is *hard* and no one who has worked on it has really had the time to do an extremely thorough job and finish all aspects. It's a huge project. Right now, the makefile system does a good job of using the just-built-clang and can do a limited amount of cross-building runtimes for other targets. But the makefile system of compiler-rt is also terribly, terribly complex, doesn't follow the conventions of LLVM's makefiles, and is generally painful to maintain and update, so folks have been reluctant to flesh out its support for new libraries and other new things.

Note that it would be really hard to add support for running test suites into Makefile build system. It's also good for the one-time build only, not for continuous development - I don't think it respects dependencies correctly.

Please could you expand upon this?
Certainly, one can expect to test the runtime on the host?
likewise, any pointers to where you see wrong dependencies would be appreciated.

At present, config & make appears to build a sensible lib using the just-built compiler [and in the general case, that's the only sensible solution, since the host might not have cross-tools for the set of archs you want to support with llvm/clang]

In some future ideal world, we might cook up a cross-testing environment - of course, it's a given that that would require testers to have access to the target hardware they wanted to test on.

Iain

Hi Alexey,

> Thanks for the great overview.
+1
( and +1 for David's comment about moving the unwind stuff into this area)

>
>
> I don't see any compelling reason to split the sanitizers out today.
>
> Clear, next.
>
> Just as a side note, I had some thoughts about the organization of this
stuff a while back that I wanted to replay here.
>
> Fundamentally, I feel like we're in particular getting a few things
conflated. Maybe separating them out helps:
>
> - There is the repository "compiler-rt" that holds all of the runtime
libraries that (if desired) need to be shipped along side the compiler.
They're separated so that they can be omitted when they aren't needed, and
potentially to isolate an unusual desired property: we would really like to
(eventually) build them with the just-built compiler rather than the host
compiler (where possible, clearly this requires the target compiler to be
executable on the host).
>
> - There is the core runtime library. Historically this was called
'compiler-rt' informally, but perhaps better called 'libclang_rt', which
provides the core necessary runtime library facilities to compile C or C++
applications. It's analogous to libgcc but without some of the unwinding
code (as I understand it, there may be details I'm wrong about here or
glossing over, but it's not relevant to the organization of things).
>
> - There are several optional runtime libraries to support specific
compiler / toolchain features. These include the sanitizers and profiling
libraries.
>
> I think all of the libraries here make sense in the same repository
because of the shared concerns of building runtime libraries. For example,
it would be useful to compile them with the just-built-clang when target is
executable on the host, and it would be useful to automatically cross
compile versions of them for as many targets as are possible on the given
host and supported by the host compiler (if used) and the just-built-clang.
>
> However, the organization of the tree is ... very hard to understand.
originally, there was only the one 'libclang_rt' library that had its
generic C99 implementation in 'lib', and architecture-specific assembly
routines when desirable in architecture subdirectories of lib. When we
added new libraries, we put them in subdirectories of lib, making the whole
thing kind of a mess. My suggestion to fix this was to create a "core"
subdirectory of lib to contain the code used for 'libclang_rt'. "core" is a
terrible name, but i've no better. suggestions welcome there. Then we would
have a more sensible organization of the 'lib' tree.
>
> I can't suggest a better name than "core" (maybe, "runtime"?), but would
*love* to put 'libclang_rt' into a separate directory under
/compiler-rt/lib :slight_smile: We should've done it long ago, IMO.
>
> I also think it might be useful to have a single large test tree (much
like with llvm or clang) that has subdirectories for the various tests
rather than test directories under lib/asan/ and friends, but maybe the
sanitizer folks have objections to that. consistency seems a compelling
reason here, but there might be other compelling concerns.
>
> Yes, I don't like the way testing is organized either. Originally it
made sense to put sanitizer lit tests under lib/xsan/, but now we've got a
lot of sanitizers, and a lot of duplicating configuration code. As Renato
mentioned, browsing
> through lit configs is a bit painful. I would like to proceed with
re-organizing the tests for sanitizers, unless anyone objects. Kostya?
>
>
> Now, the build system has always been problematic because the build
system for this tree is *hard* and no one who has worked on it has really
had the time to do an extremely thorough job and finish all aspects. It's a
huge project. Right now, the makefile system does a good job of using the
just-built-clang and can do a limited amount of cross-building runtimes for
other targets. But the makefile system of compiler-rt is also terribly,
terribly complex, doesn't follow the conventions of LLVM's makefiles, and
is generally painful to maintain and update, so folks have been reluctant
to flesh out its support for new libraries and other new things.
>
> Note that it would be really hard to add support for running test suites
into Makefile build system. It's also good for the one-time build only, not
for continuous development - I don't think it respects dependencies
correctly.

Please could you expand upon this?

Well, LLVM/Clang's configure+make and compiler-rt's make are disjoint -
when you run "make" in Clang build tree, at one point it simply invokes,
the Makefile in compiler-rt directory. But if we want more functionality,
like running the tests, we ought to have a single build system, single set
of "targets" (binaries, libraries, test suites) with dependencies between
them. For example, I want to have "make check-asan" command which I can run
from the root of the LLVM/Clang's build tree. More, if I run "make
check-asan", I need to scan the dependencies of that test suite, and:
1) If ASan runtime has changed, re-build it, and re-run tests.
2) If FileCheck or lit sources have changed, I should re-build them (but
not ASan runtime) and re-run tests.
3) If Clang sources have changed, I should re-build Clang, re-build ASan
runtime (*) and re-run tests.
With CMake we're able to do all that (except for (*), as we build runtimes
with host compiler) at the moment.

Certainly, one can expect to test the runtime on the host?
likewise, any pointers to where you see wrong dependencies would be
appreciated.

IIRC, "make check-all" in configure+make build tree doesn't re-build the
necessary libraries automatically.

At present, config & make appears to build a sensible lib using the
just-built compiler [and in the general case, that's the only sensible
solution, since the host might not have cross-tools for the set of archs
you want to support with llvm/clang]

Yes, that's what configure+make is good at.

As Kostya mentioned, there are many tests in compiler-rt that should
be shared between several sanitizers. This has bitten us more than
once in the past.

Hi Alexey,

Thanks for the great overview.

+1
( and +1 for David's comment about moving the unwind stuff into this area)

I don't see any compelling reason to split the sanitizers out today.

Clear, next.

Just as a side note, I had some thoughts about the organization of this stuff a while back that I wanted to replay here.

Fundamentally, I feel like we're in particular getting a few things conflated. Maybe separating them out helps:

- There is the repository "compiler-rt" that holds all of the runtime libraries that (if desired) need to be shipped along side the compiler. They're separated so that they can be omitted when they aren't needed, and potentially to isolate an unusual desired property: we would really like to (eventually) build them with the just-built compiler rather than the host compiler (where possible, clearly this requires the target compiler to be executable on the host).

- There is the core runtime library. Historically this was called 'compiler-rt' informally, but perhaps better called 'libclang_rt', which provides the core necessary runtime library facilities to compile C or C++ applications. It's analogous to libgcc but without some of the unwinding code (as I understand it, there may be details I'm wrong about here or glossing over, but it's not relevant to the organization of things).

- There are several optional runtime libraries to support specific compiler / toolchain features. These include the sanitizers and profiling libraries.

I think all of the libraries here make sense in the same repository because of the shared concerns of building runtime libraries. For example, it would be useful to compile them with the just-built-clang when target is executable on the host, and it would be useful to automatically cross compile versions of them for as many targets as are possible on the given host and supported by the host compiler (if used) and the just-built-clang.

However, the organization of the tree is ... very hard to understand. originally, there was only the one 'libclang_rt' library that had its generic C99 implementation in 'lib', and architecture-specific assembly routines when desirable in architecture subdirectories of lib. When we added new libraries, we put them in subdirectories of lib, making the whole thing kind of a mess. My suggestion to fix this was to create a "core" subdirectory of lib to contain the code used for 'libclang_rt'. "core" is a terrible name, but i've no better. suggestions welcome there. Then we would have a more sensible organization of the 'lib' tree.

I can't suggest a better name than "core" (maybe, "runtime"?), but would *love* to put 'libclang_rt' into a separate directory under /compiler-rt/lib :slight_smile: We should've done it long ago, IMO.

I also think it might be useful to have a single large test tree (much like with llvm or clang) that has subdirectories for the various tests rather than test directories under lib/asan/ and friends, but maybe the sanitizer folks have objections to that. consistency seems a compelling reason here, but there might be other compelling concerns.

Yes, I don't like the way testing is organized either. Originally it made sense to put sanitizer lit tests under lib/xsan/, but now we've got a lot of sanitizers, and a lot of duplicating configuration code. As Renato mentioned, browsing
through lit configs is a bit painful. I would like to proceed with re-organizing the tests for sanitizers, unless anyone objects. Kostya?

Now, the build system has always been problematic because the build system for this tree is *hard* and no one who has worked on it has really had the time to do an extremely thorough job and finish all aspects. It's a huge project. Right now, the makefile system does a good job of using the just-built-clang and can do a limited amount of cross-building runtimes for other targets. But the makefile system of compiler-rt is also terribly, terribly complex, doesn't follow the conventions of LLVM's makefiles, and is generally painful to maintain and update, so folks have been reluctant to flesh out its support for new libraries and other new things.

Note that it would be really hard to add support for running test suites into Makefile build system. It's also good for the one-time build only, not for continuous development - I don't think it respects dependencies correctly.

Please could you expand upon this?
Certainly, one can expect to test the runtime on the host?
likewise, any pointers to where you see wrong dependencies would be appreciated.

At present, config & make appears to build a sensible lib using the just-built compiler [and in the general case, that's the only sensible solution, since the host might not have cross-tools for the set of archs you want to support with llvm/clang]

In some future ideal world, we might cook up a cross-testing environment - of course, it's a given that that would require testers to have access to the target hardware they wanted to test on.

I'd very much like to have this for Android target.

1) If ASan runtime has changed, re-build it, and re-run tests.
2) If FileCheck or lit sources have changed, I should re-build them (but
not ASan runtime) and re-run tests.
3) If Clang sources have changed, I should re-build Clang, re-build ASan
runtime (*) and re-run tests.

Yeah, this is the major pain I'm having right now, as there isn't a target
that I can make to re-compile the rt dependencies, not even check-all does
that. (I have no idea how it gets compiled in the first place!).

Maybe anyone knows of a way I can force it to re-compile, like removing the
build directory just for the rt or something.

IIRC, "make check-all" in configure+make build tree doesn't re-build the

necessary libraries automatically.

Correct.

--renato

1) If ASan runtime has changed, re-build it, and re-run tests.
2) If FileCheck or lit sources have changed, I should re-build them (but
not ASan runtime) and re-run tests.
3) If Clang sources have changed, I should re-build Clang, re-build ASan
runtime (*) and re-run tests.

Yeah, this is the major pain I'm having right now, as there isn't a target
that I can make to re-compile the rt dependencies, not even check-all does
that. (I have no idea how it gets compiled in the first place!).

Maybe anyone knows of a way I can force it to re-compile, like removing
the build directory just for the rt or something.

In CMake build system you can just run "make compiler-rt".
Not sure how to do this in configure+make w/o "make clean"...

For some reason, when I added the compiler-rt directory (even before my
CMake changes), the Clang tests *required* the Asan libraries in
lib/clang/3.5/linux, which is why I added it in the first place. I think
this is wrong and should be fixed (though I have no idea how) in the Clang
CMake files.

With that fixed, I could just enable the RT libs and worry about the Asan
later. Right now, I can't.

--renato

Make compiler-rt doesn't re-make it on changes. Nor does make check-asan or
check-all.

cheers,
--renato