[PATCH] D34753: [Support] - Add bad alloc error handler for handling allocation malfunctions

Klaus Kretzschmar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 28 07:53:51 PDT 2017


kkretzsch created this revision.

We would like to introduce a new type of llvm error handler for handling bad alloc fault situations. 
LLVM already provides a fatal error handler for serious non-recoverable error situations which by 
default writes some error information to stderr and calls exit(1) at the end (functions are marked as 
'noreturn').

For long running processes (e.g. a server application), exiting the process is not an acceptable option,  
especially not when the system is in a temporary resource bottleneck with a good chance to recover from 
this fault situation. In such a situation you would rather throw an exception to stop the current 
compilation and try to overcome the resource bottleneck. The user should be aware of the problem of throwing
an exception in bad alloc situations, e.g. you must not do any allocations in the unwind chain. This is especially 
true when adding exceptions in existing unfamiliar code (as already stated in the comment of the current fatal error 
handler)

So the new handler can also be used to distinguish from general fatal error situations where recovering is no option.
It should be used in cases where a clean unwind after the allocation is guaranteed.

This patch contains:

- A report_bad_alloc function which calls a user defined bad alloc error handler. If no user handler is registered the report_fatal_error function is called. This function is not marked as 'noreturn'.
- A install/restore_bad_alloc_error_handler to install/restore the bad alloc handler.
- An example (in Mutex.cpp) where the report_bad_alloc function is called in case of a malloc returns a nullptr.

If this patch gets accepted we would create similar patches to fix corresponding malloc/calloc usages in the llvm code.

Patch by Klaus Kretzschmar


https://reviews.llvm.org/D34753

Files:
  include/llvm/Support/ErrorHandling.h
  lib/Support/ErrorHandling.cpp
  lib/Support/Mutex.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34753.104418.patch
Type: text/x-patch
Size: 4812 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170628/a54b4c9a/attachment.bin>


More information about the llvm-commits mailing list