[llvm] r199338 - [LTO] Add a hook to map LLVM diagnostics into the clients of LTO.
Quentin Colombet
qcolombet at apple.com
Wed Jan 15 14:39:56 PST 2014
One of the buildbot failed with this commit:
The Buildbot has detected a new failure on builder sanitizer-x86_64-linux while building llvm.
Full details are available at:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/5539
Buildbot URL: http://lab.llvm.org:8011/
Buildslave for this Build: sanitizer-buildbot1
Build Reason: scheduler
Build Source Stamp: [branch trunk] 199338
Blamelist: qcolombet
BUILD FAILED: failed annotate failed build 64-bit llvm using clang
sincerely,
-The Buildbot
The error is:
Linking CXX shared library ../../lib/libLTO.so
/usr/bin/ld:/home/dtoolsbot/build/sanitizer-x86_64-linux/build/llvm_build64/tools/lto/LTO.exports:41: syntax error in VERSION script
clang-3.5: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [lib/libLTO.so] Error 1
make[1]: *** [tools/lto/CMakeFiles/LTO.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[100%] Built target llvm-lto
I am looking into it.
-Quentin
On Jan 15, 2014, at 2:04 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> Author: qcolombet
> Date: Wed Jan 15 16:04:35 2014
> New Revision: 199338
>
> URL: http://llvm.org/viewvc/llvm-project?rev=199338&view=rev
> Log:
> [LTO] Add a hook to map LLVM diagnostics into the clients of LTO.
>
> Add a hook in the C API of LTO so that clients of the code generator can set
> their own handler for the LLVM diagnostics.
> The handler is defined like this:
> typedef void (*lto_diagnostic_handler_t)(lto_codegen_diagnostic_severity_t
> severity, const char *diag, void *ctxt)
> - severity says how bad this is.
> - diag is a string that contains the diagnostic message.
> - ctxt is the registered context for this handler.
>
> This hook is more general than the lto_get_error_message, since this function
> keeps only the latest message and can only be queried when something went wrong
> (no warning for instance).
>
> <rdar://problem/15517596>
>
> Modified:
> llvm/trunk/include/llvm-c/lto.h
> llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
> llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> llvm/trunk/tools/lto/lto.cpp
> llvm/trunk/tools/lto/lto.exports
>
> Modified: llvm/trunk/include/llvm-c/lto.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=199338&r1=199337&r2=199338&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm-c/lto.h (original)
> +++ llvm/trunk/include/llvm-c/lto.h Wed Jan 15 16:04:35 2014
> @@ -40,7 +40,7 @@ typedef bool lto_bool_t;
> * @{
> */
>
> -#define LTO_API_VERSION 6
> +#define LTO_API_VERSION 7
>
> typedef enum {
> LTO_SYMBOL_ALIGNMENT_MASK = 0x0000001F, /* log2 of alignment */
> @@ -204,6 +204,33 @@ lto_module_get_symbol_name(lto_module_t
> extern lto_symbol_attributes
> lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index);
>
> +/**
> + * Diagnostic severity.
> + */
> +typedef enum {
> + LTO_DS_ERROR,
> + LTO_DS_WARNING,
> + LTO_DS_NOTE
> +} lto_codegen_diagnostic_severity_t;
> +
> +/**
> + * Diagnostic handler type.
> + * \p severity defines the severity.
> + * \p diag is the actual diagnostic.
> + * The diagnostic is not prefixed by any of severity keyword, e.g., 'error: '.
> + * \p ctxt is used to pass the context set with the diagnostic handler.
> + */
> +typedef void (*lto_diagnostic_handler_t)(
> + lto_codegen_diagnostic_severity_t severity, const char *diag, void *ctxt);
> +
> +/**
> + * Set a diagnostic handler and the related context (void *).
> + * This is more general than lto_get_error_message, as the diagnostic handler
> + * can be called at anytime within lto.
> + */
> +extern void lto_codegen_set_diagnostic_handler(lto_code_gen_t,
> + lto_diagnostic_handler_t,
> + void *);
>
> /**
> * Instantiates a code generator.
>
> Modified: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=199338&r1=199337&r2=199338&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h (original)
> +++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h Wed Jan 15 16:04:35 2014
> @@ -46,6 +46,7 @@
>
> namespace llvm {
> class LLVMContext;
> + class DiagnosticInfo;
> class GlobalValue;
> class Mangler;
> class MemoryBuffer;
> @@ -115,6 +116,8 @@ struct LTOCodeGenerator {
> bool disableGVNLoadPRE,
> std::string &errMsg);
>
> + void setDiagnosticHandler(lto_diagnostic_handler_t, void *);
> +
> bool shouldInternalize() const {
> return InternalizeStrategy != LTO_INTERNALIZE_NONE;
> }
> @@ -139,6 +142,10 @@ private:
> llvm::Mangler &Mangler);
> bool determineTarget(std::string &errMsg);
>
> + static void DiagnosticHandler(const llvm::DiagnosticInfo &DI, void *Context);
> +
> + void DiagnosticHandler2(const llvm::DiagnosticInfo &DI);
> +
> typedef llvm::StringMap<uint8_t> StringSet;
>
> llvm::LLVMContext &Context;
> @@ -155,6 +162,8 @@ private:
> std::string MCpu;
> std::string NativeObjectPath;
> llvm::TargetOptions Options;
> + lto_diagnostic_handler_t DiagHandler;
> + void *DiagContext;
> };
>
> #endif // LTO_CODE_GENERATOR_H
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=199338&r1=199337&r2=199338&view=diff
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Wed Jan 15 16:04:35 2014
> @@ -21,6 +21,8 @@
> #include "llvm/IR/Constants.h"
> #include "llvm/IR/DataLayout.h"
> #include "llvm/IR/DerivedTypes.h"
> +#include "llvm/IR/DiagnosticInfo.h"
> +#include "llvm/IR/DiagnosticPrinter.h"
> #include "llvm/IR/LLVMContext.h"
> #include "llvm/IR/Mangler.h"
> #include "llvm/IR/Module.h"
> @@ -37,6 +39,7 @@
> #include "llvm/Support/FormattedStream.h"
> #include "llvm/Support/Host.h"
> #include "llvm/Support/MemoryBuffer.h"
> +#include "llvm/Support/raw_ostream.h"
> #include "llvm/Support/Signals.h"
> #include "llvm/Support/TargetRegistry.h"
> #include "llvm/Support/TargetSelect.h"
> @@ -63,7 +66,8 @@ LTOCodeGenerator::LTOCodeGenerator()
> : Context(getGlobalContext()), Linker(new Module("ld-temp.o", Context)),
> TargetMach(NULL), EmitDwarfDebugInfo(false), ScopeRestrictionsDone(false),
> CodeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC),
> - InternalizeStrategy(LTO_INTERNALIZE_FULL), NativeObjectFile(NULL) {
> + InternalizeStrategy(LTO_INTERNALIZE_FULL), NativeObjectFile(NULL),
> + DiagHandler(NULL), DiagContext(NULL) {
> initializeLTOPasses();
> }
>
> @@ -536,3 +540,47 @@ void LTOCodeGenerator::parseCodeGenDebug
> cl::ParseCommandLineOptions(CodegenOptions.size(),
> const_cast<char **>(&CodegenOptions[0]));
> }
> +
> +void LTOCodeGenerator::DiagnosticHandler(const DiagnosticInfo &DI,
> + void *Context) {
> + ((LTOCodeGenerator *)Context)->DiagnosticHandler2(DI);
> +}
> +
> +void LTOCodeGenerator::DiagnosticHandler2(const DiagnosticInfo &DI) {
> + // Map the LLVM internal diagnostic severity to the LTO diagnostic severity.
> + lto_codegen_diagnostic_severity_t Severity;
> + switch (DI.getSeverity()) {
> + case DS_Error:
> + Severity = LTO_DS_ERROR;
> + break;
> + case DS_Warning:
> + Severity = LTO_DS_WARNING;
> + break;
> + case DS_Note:
> + Severity = LTO_DS_NOTE;
> + break;
> + }
> + // Create the string that will be reported to the external diagnostic handler.
> + std::string MsgStorage;
> + raw_string_ostream Stream(MsgStorage);
> + DiagnosticPrinterRawOStream DP(Stream);
> + DI.print(DP);
> + Stream.flush();
> +
> + // If this method has been called it means someone has set up an external
> + // diagnostic handler. Assert on that.
> + assert(DiagHandler && "Invalid diagnostic handler");
> + (*DiagHandler)(Severity, MsgStorage.c_str(), DiagContext);
> +}
> +
> +void
> +LTOCodeGenerator::setDiagnosticHandler(lto_diagnostic_handler_t DiagHandler,
> + void *Ctxt) {
> + this->DiagHandler = DiagHandler;
> + this->DiagContext = Ctxt;
> + if (!DiagHandler)
> + return Context.setDiagnosticHandler(NULL, NULL);
> + // Register the LTOCodeGenerator stub in the LLVMContext to forward the
> + // diagnostic to the external DiagHandler.
> + Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this);
> +}
>
> Modified: llvm/trunk/tools/lto/lto.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=199338&r1=199337&r2=199338&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.cpp (original)
> +++ llvm/trunk/tools/lto/lto.cpp Wed Jan 15 16:04:35 2014
> @@ -193,6 +193,13 @@ lto_symbol_attributes lto_module_get_sym
> return mod->getSymbolAttributes(index);
> }
>
> +/// Set a diagnostic handler.
> +void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,
> + lto_diagnostic_handler_t diag_handler,
> + void *ctxt) {
> + cg->setDiagnosticHandler(diag_handler, ctxt);
> +}
> +
> /// lto_codegen_create - Instantiates a code generator. Returns NULL if there
> /// is an error.
> lto_code_gen_t lto_codegen_create(void) {
>
> Modified: llvm/trunk/tools/lto/lto.exports
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.exports?rev=199338&r1=199337&r2=199338&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.exports (original)
> +++ llvm/trunk/tools/lto/lto.exports Wed Jan 15 16:04:35 2014
> @@ -15,6 +15,7 @@ lto_module_is_object_file_for_target
> lto_module_is_object_file_in_memory
> lto_module_is_object_file_in_memory_for_target
> lto_module_dispose
> +lto_codegen_set_diagnostic_handler
> lto_codegen_add_module
> lto_codegen_add_must_preserve_symbol
> lto_codegen_compile
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> 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/20140115/b9573996/attachment.html>
More information about the llvm-commits
mailing list