mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Use LLVM verifier in lowering (#5733)
Suggested by zygoloid while looking at #5678 ``` CHECK failure at toolchain/lower/context.cpp:62: !llvm::verifyModule(*llvm_module_, &errs): Verifier errors: Instruction does not dominate all uses! %.loc17_46.1.temp = alloca { i1, i32, i32 }, align 8, !dbg !13 %tuple.elem0.loc17_46.2.tuple.elem = getelementptr inbounds nuw { i1, i32, i32 }, ptr %.loc17_46.1.temp, i32 0, i32 0, !dbg !13 Instruction does not dominate all uses! %.loc17_46.1.temp = alloca { i1, i32, i32 }, align 8, !dbg !13 %tuple.elem1.loc17_46.2.tuple.elem = getelementptr inbounds nuw { i1, i32, i32 }, ptr %.loc17_46.1.temp, i32 0, i32 1, !dbg !13 Instruction does not dominate all uses! %.loc17_46.1.temp = alloca { i1, i32, i32 }, align 8, !dbg !13 %tuple.elem2.loc17_46.2.tuple.elem = getelementptr inbounds nuw { i1, i32, i32 }, ptr %.loc17_46.1.temp, i32 0, i32 2, !dbg !13 ``` Adds a `--llvm-verifier` flag to be able to turn this off easily, particularly for debugging the LLVM IR. The call workaround is due to a verifier requirement `inlinable function call in a function with debug info must have a !dbg location`. It specifically comes up for the `++x` case, with `%1 = call i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %other)`. I think #5397 is in the direction of a fix for that, but #5397 was set aside because it puts the debug info in too many places. Instead, address this by adding a stub location for calls that don't have a good location. I'm deliberately putting this next to the TODO so that it's easier to understand the association. --------- Co-authored-by: Dana Jansens <danakj@orodu.net>
This commit is contained in:
co-authored by
Dana Jansens
parent
fcf445b517
commit
c3b0c2e425
@@ -6,7 +6,9 @@
|
||||
|
||||
#include "common/check.h"
|
||||
#include "common/growing_range.h"
|
||||
#include "common/raw_string_ostream.h"
|
||||
#include "common/vlog.h"
|
||||
#include "llvm/IR/Verifier.h"
|
||||
#include "llvm/Transforms/Utils/ModuleUtils.h"
|
||||
#include "toolchain/lower/file_context.h"
|
||||
#include "toolchain/sem_ir/inst_namer.h"
|
||||
@@ -49,11 +51,17 @@ auto Context::LowerPendingDefinitions() -> void {
|
||||
}
|
||||
}
|
||||
|
||||
auto Context::Finalize() && -> std::unique_ptr<llvm::Module> {
|
||||
auto Context::Finalize(
|
||||
llvm::raw_ostream*
|
||||
llvm_verifier_stream) && -> std::unique_ptr<llvm::Module> {
|
||||
LowerPendingDefinitions();
|
||||
|
||||
file_contexts_.ForEach(
|
||||
[](auto, auto& file_context) { file_context->Finalize(); });
|
||||
|
||||
if (llvm_verifier_stream) {
|
||||
CARBON_CHECK(!llvm::verifyModule(*llvm_module_, llvm_verifier_stream));
|
||||
}
|
||||
return std::move(llvm_module_);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user