[cfe-dev] What clang should do when memory is exhausted?
Abramo Bagnara
abramo.bagnara at gmail.com
Mon Mar 19 06:27:29 PDT 2012
Il 19/03/2012 14:08, Matthieu Monrocq ha scritto:
>
>
> Le 18 mars 2012 18:52, Abramo Bagnara <abramo.bagnara at gmail.com
> <mailto:abramo.bagnara at gmail.com>> a écrit :
>
> Il 18/03/2012 18:26, Matthieu Monrocq ha scritto:
> >
> >
> > Le 18 mars 2012 12:51, Abramo Bagnara <abramo.bagnara at gmail.com
> <mailto:abramo.bagnara at gmail.com>
> > <mailto:abramo.bagnara at gmail.com
> <mailto:abramo.bagnara at gmail.com>>> a écrit :
> >
> > In
> http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions I read
> > that exceptions are not used by design in clang code base.
> >
> > Despite this in source there are a lot of unguarded call to new
> > operator, does this means that when memory is lacking the compiler
> > executable is meant to fail in arbitrary way?
> >
> > Here below you can see a typescript showing a simulated example:
> >
> > $ ( ulimit -v 66000 ; clang -cc1 -ast-dump bzip2.c )
> > 0 _clang 0x000000000247ad66
> > 1 _clang 0x000000000247ab62
> > 2 libc.so.6 0x00007f1c0974e420
> > 3 _clang 0x0000000000b9e33c
> > 4 _clang 0x00000000019cb626
> > clang::SrcMgr::ContentCache::getBuffer(clang::DiagnosticsEngine&,
> > clang::SourceManager const&, clang::SourceLocation, bool*)
> const + 398
> > 5 _clang 0x000000000198d748
> > 6 _clang 0x000000000198bc01
> > clang::Preprocessor::EnterSourceFile(clang::FileID,
> > clang::DirectoryLookup const*, clang::SourceLocation) + 291
> > 7 _clang 0x00000000019a4e42
> > clang::Preprocessor::EnterMainSourceFile() + 166
> > 8 _clang 0x0000000000f14da0 clang::ParseAST(clang::Sema&,
> bool)
> > + 271
> > 9 _clang 0x0000000000bf3abd
> > clang::ASTFrontendAction::ExecuteAction() + 265
> > 10 _clang 0x0000000000bf3713
> clang::FrontendAction::Execute() + 245
> > 11 _clang 0x0000000000bcd9ff
> > clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> + 673
> > 12 _clang 0x0000000000ba17c8
> > clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 957
> > 13 _clang 0x0000000000b9074c cc1_main(char const**, char
> const**,
> > char const*, void*) + 999
> > 14 _clang 0x0000000000b9cd8b main + 496
> > 15 libc.so.6 0x00007f1c0973930d __libc_start_main + 237
> > 16 _clang 0x0000000000b8f9c9
> > Stack dump:
> > 0. Program arguments: clang -cc1 -ast-dump bzip2.c
> > 1. <eof> parser at end of file
> >
> > A quick grep of the LLVM and Clang source code shows that the
> "operator
> > new" is often overloaded for the base types of the hierarchies, so
> most
> > of the new calls in the source are not calls to the global "operator
> > new" provided by the compiler implementation but instead redirect to
> > specialized versions. For example, look into ASTContext.h.
> >
> > I recall a comment of Doug saying that the custom "operator new" never
> > return 0, so checking is not necessary. It seems that most calls
> end up
> > into llvm/Support/Allocator.h and there only seem to be some
> asserts there.
>
> I've personally verified (in another debug session) that llvm:DenseMap
> uses global operator new and it is not the only.
>
> Furtherly clang uses std::string, std::vector, std::set, etc.
>
> Do you think that the intention is to never use global operator new?
>
>
> No, I don't, though I would have expected the usage to be less pervasive :)
>
> I suppose your earlier diagnostic was right then, and that an out of
> memory condition is just supposed to fail badly. It is a rare condition
> anyway nowadays and there is not much one can do apart from stopping.
Stopping is fine, but I think that an arbitrary failure is rather rough
and might make debugging very unfriendly.
I'd add that a compiler belong to class of applications that might need
an arbitrary large amount of memory, so the problem is not a theoretical
one...
More information about the cfe-dev
mailing list