Cyclic module dependency [Re: [llvm] r357201 - Temporarily revert "SafepointIRVerifier port to new Pass Manager"]
Fedor Sergeev via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 30 07:49:32 PDT 2019
On 3/30/19 5:46 PM, Fedor Sergeev wrote:
>
>
> On 3/29/19 11:29 PM, Adrian Prantl wrote:
>> When you compile with -fmodules without local submodule visibility
>> (which is a configuration we support in LLVM), including any header
>> from one top-level module will implicitly also import all headers in
>> that module, even ones that are not explicitly #included in the
>> source file. So any cyclic header dependency between any two headers
>> in two modules will be a problem, even if the two headers don't
>> directly include each other.
> Well, the *theory* of cyclic dependencies is well understood here :)
> However, the practical implications of that are absolutely unclear.
>
> The answer to this question would be nice to have:
> "Why Verifier.h does not cause a similar build issue?"
>
> I can only guess that it is due to the following line in
> module.modulemap:
> module IR_Verifier { header "IR/Verifier.h" export * }
>
> Thus I assume that to fix our build failure I should add
> IR/SafepointIRVerifier.h there.
>
> Since this is a generic issue that can lead to rather unexpected
> revert of practically any change,
> it would be cool if we had it being explicitly mentioned in docs along
> with the answer for these
> two questions:
>
> How to determine which header belongs to which module, and thus
> which includes are "prohibited"?
> What is a recommended way of breaking the cyclic dependency?
Having a pointer to docs on syntax and semantics of module.modulemap
would also be very helpful.
regards,
Fedor.
>
> If they are already answered in docs then, please, give me a pointer.
> "modules" is rather overloaded term in LLVM, so searching for module
> does not really help.
>
> regards,
> Fedor.
>
>> -- adrian
>>
>>> On Mar 29, 2019, at 6:12 AM, Fedor Sergeev <fedor.sergeev at azul.com>
>>> wrote:
>>>
>>> Adrian, (or anybody else who could help)
>>>
>>> this seemingly innocent port of SafepointIRVerifier caused a build
>>> failure in "modular" buildbot.
>>> I'm able to reproduce the failure but I have absolutely no clue on
>>> whats going on.
>>>
>>> Why SafepointIRVerifier.h gets included into compilations of, say,
>>> IR/BasicBlock.cpp or IR/AsmWriter.cpp?
>>>
>>> Also, SafepointIRVerifier.h was doing pretty much the same as
>>> Verifier.h does
>>> (i.e. includes PassManager.h to get PassInfoMixin template definition).
>>>
>>> Why Verifier.h does not cause a similar build issue?
>>>
>>> Could you, please, explain/help with this problem?
>>>
>>> regards,
>>> Fedor.
>>>
>>> On 3/28/19 9:34 PM, Adrian Prantl via llvm-commits wrote:
>>>> Author: adrian
>>>> Date: Thu Mar 28 11:34:34 2019
>>>> New Revision: 357201
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=357201&view=rev
>>>> Log:
>>>> Temporarily revert "SafepointIRVerifier port to new Pass Manager"
>>>> to unbreak the modular bots and its follow-up commit.
>>>>
>>>> This reverts commit https://reviews.llvm.org/D59825
>>>> because it introduced a
>>>>
>>>> fatal error: cyclic dependency in module 'LLVM_intrinsic_gen':
>>>> LLVM_intrinsic_gen -> LLVM_IR -> LLVM_intrinsic_gen
>>>>
>>>> Modified:
>>>> llvm/trunk/include/llvm/IR/SafepointIRVerifier.h
>>>> llvm/trunk/lib/IR/SafepointIRVerifier.cpp
>>>> llvm/trunk/lib/Passes/PassBuilder.cpp
>>>> llvm/trunk/lib/Passes/PassRegistry.def
>>>>
>>>> Modified: llvm/trunk/include/llvm/IR/SafepointIRVerifier.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/SafepointIRVerifier.h?rev=357201&r1=357200&r2=357201&view=diff
>>>> ==============================================================================
>>>>
>>>> --- llvm/trunk/include/llvm/IR/SafepointIRVerifier.h (original)
>>>> +++ llvm/trunk/include/llvm/IR/SafepointIRVerifier.h Thu Mar 28
>>>> 11:34:34 2019
>>>> @@ -18,8 +18,6 @@
>>>> #ifndef LLVM_IR_SAFEPOINT_IR_VERIFIER
>>>> #define LLVM_IR_SAFEPOINT_IR_VERIFIER
>>>> -#include "llvm/IR/PassManager.h"
>>>> -
>>>> namespace llvm {
>>>> class Function;
>>>> @@ -31,16 +29,6 @@ void verifySafepointIR(Function &F);
>>>> /// Create an instance of the safepoint verifier pass which can
>>>> be added to
>>>> /// a pass pipeline to check for relocation bugs.
>>>> FunctionPass *createSafepointIRVerifierPass();
>>>> -
>>>> -/// Create an instance of the safepoint verifier pass which can be
>>>> added to
>>>> -/// a pass pipeline to check for relocation bugs.
>>>> -class SafepointIRVerifierPass : public
>>>> PassInfoMixin<SafepointIRVerifierPass> {
>>>> -
>>>> -public:
>>>> - explicit SafepointIRVerifierPass() {}
>>>> -
>>>> - PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
>>>> -};
>>>> }
>>>> #endif // LLVM_IR_SAFEPOINT_IR_VERIFIER
>>>>
>>>> Modified: llvm/trunk/lib/IR/SafepointIRVerifier.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/SafepointIRVerifier.cpp?rev=357201&r1=357200&r2=357201&view=diff
>>>> ==============================================================================
>>>>
>>>> --- llvm/trunk/lib/IR/SafepointIRVerifier.cpp (original)
>>>> +++ llvm/trunk/lib/IR/SafepointIRVerifier.cpp Thu Mar 28 11:34:34 2019
>>>> @@ -197,17 +197,6 @@ protected:
>>>> static void Verify(const Function &F, const DominatorTree &DT,
>>>> const CFGDeadness &CD);
>>>> -namespace llvm {
>>>> -PreservedAnalyses SafepointIRVerifierPass::run(Function &F,
>>>> - FunctionAnalysisManager &AM) {
>>>> - const auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
>>>> - CFGDeadness CD;
>>>> - CD.processFunction(F, DT);
>>>> - Verify(F, DT, CD);
>>>> - return PreservedAnalyses::all();
>>>> -}
>>>> -}
>>>> -
>>>> namespace {
>>>> struct SafepointIRVerifier : public FunctionPass {
>>>>
>>>> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=357201&r1=357200&r2=357201&view=diff
>>>> ==============================================================================
>>>>
>>>> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
>>>> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Thu Mar 28 11:34:34 2019
>>>> @@ -56,7 +56,6 @@
>>>> #include "llvm/IR/Dominators.h"
>>>> #include "llvm/IR/IRPrintingPasses.h"
>>>> #include "llvm/IR/PassManager.h"
>>>> -#include "llvm/IR/SafepointIRVerifier.h"
>>>> #include "llvm/IR/Verifier.h"
>>>> #include "llvm/Support/Debug.h"
>>>> #include "llvm/Support/FormatVariadic.h"
>>>>
>>>> Modified: llvm/trunk/lib/Passes/PassRegistry.def
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=357201&r1=357200&r2=357201&view=diff
>>>> ==============================================================================
>>>>
>>>> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
>>>> +++ llvm/trunk/lib/Passes/PassRegistry.def Thu Mar 28 11:34:34 2019
>>>> @@ -231,7 +231,6 @@ FUNCTION_PASS("verify<domtree>", Dominat
>>>> FUNCTION_PASS("verify<loops>", LoopVerifierPass())
>>>> FUNCTION_PASS("verify<memoryssa>", MemorySSAVerifierPass())
>>>> FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass())
>>>> -FUNCTION_PASS("verify<safepoint-ir>", SafepointIRVerifierPass())
>>>> FUNCTION_PASS("view-cfg", CFGViewerPass())
>>>> FUNCTION_PASS("view-cfg-only", CFGOnlyViewerPass())
>>>> FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list