[PATCH] Added new functionality to LLVM C API to use DiagnosticInfo to handle errors
Eric Christopher
echristo at gmail.com
Fri Apr 4 10:59:11 PDT 2014
I'd very much prefer not to expose the severity for now. This is a
fairly well thought out, but very new interface and we guarantee
stability of the C interface so we'd be locking the current severity
interface down.
I'm not, honestly, a huge fan of opening this up to the C API in
general - is there a good reason to do so?
-eric
On Fri, Apr 4, 2014 at 10:39 AM, Quentin Colombet <qcolombet at apple.com> wrote:
> Hi Darren,
>
> This LGTM with two comments:
> - LLVMPrintDiagInfoToString should state that the string has to be freed
> (see inline comment).
> - Should we provide an API to expose the severity as well? What would do the
> users of LLVMPrintDiagInfoToString if we do not?
>
> Note that I'm not super familiar with the C API, so you may want to wait for
> another review.
>
> Thanks,
> -Quentin
>
> On Apr 2, 2014, at 8:32 PM, Tom Stellard <tom at stellard.net> wrote:
>
> From: Darren Powell <darren.powell at amd.com>
>
> ---
> include/llvm-c/Core.h | 20 ++++++++++++++++++++
> include/llvm/IR/DiagnosticInfo.h | 3 +++
> lib/IR/Core.cpp | 20 ++++++++++++++++++++
> 3 files changed, 43 insertions(+)
>
> diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h
> index 50c5e3a..17367ff 100644
> --- a/include/llvm-c/Core.h
> +++ b/include/llvm-c/Core.h
> @@ -124,6 +124,12 @@ typedef struct LLVMOpaquePassRegistry
> *LLVMPassRegistryRef;
> * @see llvm::Use */
> typedef struct LLVMOpaqueUse *LLVMUseRef;
>
> +
> +/**
> + * @see llvm::DiagnosticInfo
> + */
> +typedef struct LLVMOpaqueDiagnosticInfo *LLVMDiagnosticInfoRef;
> +
> typedef enum {
> LLVMZExtAttribute = 1<<0,
> LLVMSExtAttribute = 1<<1,
> @@ -453,6 +459,8 @@ void LLVMEnablePrettyStackTrace(void);
> * @{
> */
>
> +typedef void (*LLVMDiagnosticHandler)(LLVMDiagnosticInfoRef, void *);
> +
> /**
> * Create a new context.
> *
> @@ -467,6 +475,13 @@ LLVMContextRef LLVMContextCreate(void);
> LLVMContextRef LLVMGetGlobalContext(void);
>
> /**
> + * Set the diagnostic handler for this context.
> + */
> +void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
> + LLVMDiagnosticHandler Handler,
> + void *DiagnosticContext);
> +
> +/**
> * Destroy a context instance.
> *
> * This should be called for every call to LLVMContextCreate() or memory
> @@ -474,6 +489,11 @@ LLVMContextRef LLVMGetGlobalContext(void);
> */
> void LLVMContextDispose(LLVMContextRef C);
>
> +/**
> + * Extract string description from DiagnosticInfo.
>
>
> Add a comment here saying that the string should be freed using
> LLVMDisposeMessage.
>
> + */
> +char *LLVMPrintDiagInfoToString(LLVMDiagnosticInfoRef DI);
> +
> unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
> unsigned SLen);
> unsigned LLVMGetMDKindID(const char* Name, unsigned SLen);
> diff --git a/include/llvm/IR/DiagnosticInfo.h
> b/include/llvm/IR/DiagnosticInfo.h
> index de2a9d8..5fd6636 100644
> --- a/include/llvm/IR/DiagnosticInfo.h
> +++ b/include/llvm/IR/DiagnosticInfo.h
> @@ -193,6 +193,9 @@ public:
> }
> };
>
> +// Create wrappers for C Binding types (see CBindingWrapping.h).
> +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DiagnosticInfo, LLVMDiagnosticInfoRef)
> +
> } // End namespace llvm
>
> #endif
> diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
> index 4f3d8b1..e3b70c7 100644
> --- a/lib/IR/Core.cpp
> +++ b/lib/IR/Core.cpp
> @@ -17,6 +17,8 @@
> #include "llvm/IR/Attributes.h"
> #include "llvm/IR/CallSite.h"
> #include "llvm/IR/Constants.h"
> +#include "llvm/IR/DiagnosticInfo.h"
> +#include "llvm/IR/DiagnosticPrinter.h"
> #include "llvm/IR/DerivedTypes.h"
> #include "llvm/IR/GlobalAlias.h"
> #include "llvm/IR/GlobalVariable.h"
> @@ -76,6 +78,14 @@ LLVMContextRef LLVMGetGlobalContext() {
> return wrap(&getGlobalContext());
> }
>
> +void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
> + LLVMDiagnosticHandler Handler,
> + void *DiagnosticContext) {
> + unwrap(C)->setDiagnosticHandler(
> + LLVM_EXTENSION
> reinterpret_cast<LLVMContext::DiagnosticHandlerTy>(Handler),
> + DiagnosticContext);
> +}
> +
> void LLVMContextDispose(LLVMContextRef C) {
> delete unwrap(C);
> }
> @@ -89,6 +99,16 @@ unsigned LLVMGetMDKindID(const char* Name, unsigned SLen)
> {
> return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
> }
>
> +char *LLVMPrintDiagInfoToString(LLVMDiagnosticInfoRef DI) {
> + std::string MsgStorage;
> + raw_string_ostream Stream(MsgStorage);
> + DiagnosticPrinterRawOStream DP(Stream);
> +
> + unwrap(DI)->print(DP);
> + Stream.flush();
> +
> + return strdup(MsgStorage.c_str());
> +}
>
> /*===-- Operations on modules
> ---------------------------------------------===*/
>
> --
> 1.8.3.2
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> 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
>
More information about the llvm-commits
mailing list