[llvm] r199338 - [LTO] Add a hook to map LLVM diagnostics into the clients of LTO.
Quentin Colombet
qcolombet at apple.com
Wed Jan 15 16:20:09 PST 2014
I have been able to reproduce the problem.
cmake produces a rule to create LTO.exports linux machine.
Then, when the makefile is executed with -j 8, the rule may be kicked several times resulting in several concurrence write in the same file.
I’ll see if I can produce a makefile command more robust to concurrent access.
In the meantime, the fix should be to remove LTO.exports from the server and launch make without -j once.
-Quentin
On Jan 15, 2014, at 2:39 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> 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
>
> _______________________________________________
> 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/6a549faf/attachment.html>
More information about the llvm-commits
mailing list