[llvm] r192864 - Expose install_fatal_error_handler() through the C API.
Kostya Serebryany
kcc at google.com
Tue Oct 22 01:17:04 PDT 2013
Filip,
ping.
On Mon, Oct 21, 2013 at 1:03 PM, Kostya Serebryany <kcc at google.com> wrote:
> This seems to be still unfixed.
>
> --kcc
>
>
> On Thu, Oct 17, 2013 at 11:50 AM, Kai Nacke <kai.nacke at redstar.de> wrote:
>
>> Yes - I see it with clang 3.4 on Linux.
>>
>> Regards
>> Kai
>>
>>
>> On 17.10.2013 09:41, Kostya Serebryany wrote:
>>
>>> This is causing build errors for me:
>>>
>>> /home/kcc/llvm/lib/Support/**ErrorHandling.cpp:110:5: error: cast
>>> between
>>> pointer-to-function and pointer-to-object is an extension
>>> [-Werror,-Wpedantic]
>>> reinterpret_cast<**LLVMFatalErrorHandler>(user_**data);
>>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**~~~~~~~~~~~~~~~~~~~~
>>> /home/kcc/llvm/lib/Support/**ErrorHandling.cpp:116:27: error: cast
>>> between
>>> pointer-to-function and pointer-to-object is an extension
>>> [-Werror,-Wpedantic]
>>> bindingsErrorHandler, reinterpret_cast<void*>(**Handler));
>>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**~~
>>>
>>> Does anyone else see these?
>>>
>>> My build config is:
>>> cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON \
>>> -DCMAKE_C_COMPILER=/home/kcc/**host_clang/bin/clang \
>>> -DCMAKE_CXX_COMPILER=/home/**kcc/host_clang/bin/clang++ \
>>> -DCMAKE_EXPORT_COMPILE_**COMMANDS=ON \
>>> -DLLVM_ENABLE_WERROR=ON
>>>
>>>
>>>
>>>
>>>
>>> On Thu, Oct 17, 2013 at 5:38 AM, Filip Pizlo <fpizlo at apple.com
>>> <mailto:fpizlo at apple.com>> wrote:
>>>
>>> Author: fpizlo
>>> Date: Wed Oct 16 20:38:28 2013
>>> New Revision: 192864
>>>
>>> URL: http://llvm.org/viewvc/llvm-**project?rev=192864&view=rev<http://llvm.org/viewvc/llvm-project?rev=192864&view=rev>
>>> Log:
>>> Expose install_fatal_error_handler() through the C API.
>>>
>>> I expose the API with some caveats:
>>>
>>> - The C++ API involves a traditional void* opaque pointer for the
>>> fatal
>>> error callback. The C API doesn’t do this. I don’t think that the
>>> void*
>>> opaque pointer makes any sense since this is a global callback -
>>> there will
>>> only be one of them. So if you need to pass some data to your
>>> callback,
>>> just put it in a global variable.
>>>
>>> - The bindings will ignore the gen_crash_diag boolean. I ignore it
>>> because
>>> (1) I don’t know what it does, (2) it’s not documented AFAIK, and
>>> (3) I
>>> couldn’t imagine any use for it. I made the gut call that it
>>> probably
>>> wasn’t important enough to expose through the C API.
>>>
>>>
>>> Modified:
>>> llvm/trunk/include/llvm-c/**Core.h
>>> llvm/trunk/lib/Support/**ErrorHandling.cpp
>>>
>>> Modified: llvm/trunk/include/llvm-c/**Core.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/llvm/trunk/include/**
>>> llvm-c/Core.h?rev=192864&r1=**192863&r2=192864&view=diff<http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=192864&r1=192863&r2=192864&view=diff>
>>> ==============================**==============================**
>>> ==================
>>> --- llvm/trunk/include/llvm-c/**Core.h (original)
>>> +++ llvm/trunk/include/llvm-c/**Core.h Wed Oct 16 20:38:28 2013
>>> @@ -416,6 +416,22 @@ void LLVMShutdown();
>>> char *LLVMCreateMessage(const char *Message);
>>> void LLVMDisposeMessage(char *Message);
>>>
>>> +typedef void (*LLVMFatalErrorHandler)(const char *Reason);
>>> +
>>> +/**
>>> + * Install a fatal error handler. By default, if LLVM detects a
>>> fatal error, it
>>> + * will call exit(1). This may not be appropriate in many contexts.
>>> For example,
>>> + * doing exit(1) will bypass many crash reporting/tracing system
>>> tools. This
>>> + * function allows you to install a callback that will be invoked
>>> prior to the
>>> + * call to exit(1).
>>> + */
>>> +void LLVMInstallFatalErrorHandler(**LLVMFatalErrorHandler Handler);
>>> +
>>> +/**
>>> + * Reset the fatal error handler. This resets LLVM's fatal error
>>> handling
>>> + * behavior to the default.
>>> + */
>>> +void LLVMResetFatalErrorHandler(**void);
>>>
>>> /**
>>> * @defgroup LLVMCCoreContext Contexts
>>>
>>> Modified: llvm/trunk/lib/Support/**ErrorHandling.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/llvm/trunk/lib/**
>>> Support/ErrorHandling.cpp?rev=**192864&r1=192863&r2=192864&**view=diff<http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ErrorHandling.cpp?rev=192864&r1=192863&r2=192864&view=diff>
>>> ==============================**==============================**
>>> ==================
>>> --- llvm/trunk/lib/Support/**ErrorHandling.cpp (original)
>>> +++ llvm/trunk/lib/Support/**ErrorHandling.cpp Wed Oct 16 20:38:28
>>> 2013
>>> @@ -20,6 +20,7 @@
>>> #include "llvm/Support/Signals.h"
>>> #include "llvm/Support/Threading.h"
>>> #include "llvm/Support/raw_ostream.h"
>>> +#include "llvm-c/Core.h"
>>> #include <cassert>
>>> #include <cstdlib>
>>>
>>> @@ -102,3 +103,19 @@ void llvm::llvm_unreachable_**internal(con
>>> LLVM_BUILTIN_UNREACHABLE;
>>> #endif
>>> }
>>> +
>>> +static void bindingsErrorHandler(void *user_data, const
>>> std::string& reason,
>>> + bool gen_crash_diag) {
>>> + LLVMFatalErrorHandler handler =
>>> + reinterpret_cast<**LLVMFatalErrorHandler>(user_**data);
>>> + handler(reason.c_str());
>>> +}
>>> +
>>> +void LLVMInstallFatalErrorHandler(**LLVMFatalErrorHandler Handler)
>>> {
>>> + install_fatal_error_handler(
>>> + bindingsErrorHandler, reinterpret_cast<void*>(**Handler));
>>> +}
>>> +
>>> +void LLVMResetFatalErrorHandler() {
>>> + remove_fatal_error_handler();
>>> +}
>>>
>>>
>>> ______________________________**_________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.**edu<llvm-commits at cs.uiuc.edu>
>>> >
>>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>>
>>>
>>>
>>>
>>>
>>> ______________________________**_________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>>
>>>
>> ______________________________**_________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131022/dc09239b/attachment.html>
More information about the llvm-commits
mailing list