This splits the DXILResourceAnalysis pass into TypeAnalysis and BindingAnalysis passes. The type analysis pass is made immutable and populated lazily so that it can be used earlier in the pipeline without needing to carefully maintain the invariants of the binding analysis. Fixes #118400
110 lines
4.3 KiB
C++
110 lines
4.3 KiB
C++
//===-- Analysis.cpp ------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm-c/Analysis.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/IR/Verifier.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/PassRegistry.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <cstring>
|
|
|
|
using namespace llvm;
|
|
|
|
/// initializeAnalysis - Initialize all passes linked into the Analysis library.
|
|
void llvm::initializeAnalysis(PassRegistry &Registry) {
|
|
initializeBasicAAWrapperPassPass(Registry);
|
|
initializeBlockFrequencyInfoWrapperPassPass(Registry);
|
|
initializeBranchProbabilityInfoWrapperPassPass(Registry);
|
|
initializeCallGraphWrapperPassPass(Registry);
|
|
initializeCallGraphDOTPrinterPass(Registry);
|
|
initializeCallGraphViewerPass(Registry);
|
|
initializeCycleInfoWrapperPassPass(Registry);
|
|
initializeDXILResourceBindingWrapperPassPass(Registry);
|
|
initializeDXILResourceTypeWrapperPassPass(Registry);
|
|
initializeDependenceAnalysisWrapperPassPass(Registry);
|
|
initializeDominanceFrontierWrapperPassPass(Registry);
|
|
initializeDomViewerWrapperPassPass(Registry);
|
|
initializeDomPrinterWrapperPassPass(Registry);
|
|
initializeDomOnlyViewerWrapperPassPass(Registry);
|
|
initializePostDomViewerWrapperPassPass(Registry);
|
|
initializeDomOnlyPrinterWrapperPassPass(Registry);
|
|
initializePostDomPrinterWrapperPassPass(Registry);
|
|
initializePostDomOnlyViewerWrapperPassPass(Registry);
|
|
initializePostDomOnlyPrinterWrapperPassPass(Registry);
|
|
initializeAAResultsWrapperPassPass(Registry);
|
|
initializeGlobalsAAWrapperPassPass(Registry);
|
|
initializeIVUsersWrapperPassPass(Registry);
|
|
initializeIRSimilarityIdentifierWrapperPassPass(Registry);
|
|
initializeLazyBranchProbabilityInfoPassPass(Registry);
|
|
initializeLazyBlockFrequencyInfoPassPass(Registry);
|
|
initializeLazyValueInfoWrapperPassPass(Registry);
|
|
initializeLoopInfoWrapperPassPass(Registry);
|
|
initializeMemoryDependenceWrapperPassPass(Registry);
|
|
initializeModuleSummaryIndexWrapperPassPass(Registry);
|
|
initializeOptimizationRemarkEmitterWrapperPassPass(Registry);
|
|
initializePhiValuesWrapperPassPass(Registry);
|
|
initializePostDominatorTreeWrapperPassPass(Registry);
|
|
initializeRegionInfoPassPass(Registry);
|
|
initializeRegionViewerPass(Registry);
|
|
initializeRegionPrinterPass(Registry);
|
|
initializeRegionOnlyViewerPass(Registry);
|
|
initializeRegionOnlyPrinterPass(Registry);
|
|
initializeSCEVAAWrapperPassPass(Registry);
|
|
initializeScalarEvolutionWrapperPassPass(Registry);
|
|
initializeStackSafetyGlobalInfoWrapperPassPass(Registry);
|
|
initializeStackSafetyInfoWrapperPassPass(Registry);
|
|
initializeTargetTransformInfoWrapperPassPass(Registry);
|
|
initializeTypeBasedAAWrapperPassPass(Registry);
|
|
initializeScopedNoAliasAAWrapperPassPass(Registry);
|
|
initializeLCSSAVerificationPassPass(Registry);
|
|
initializeMemorySSAWrapperPassPass(Registry);
|
|
}
|
|
|
|
LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,
|
|
char **OutMessages) {
|
|
raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : nullptr;
|
|
std::string Messages;
|
|
raw_string_ostream MsgsOS(Messages);
|
|
|
|
LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS);
|
|
|
|
// Duplicate the output to stderr.
|
|
if (DebugOS && OutMessages)
|
|
*DebugOS << MsgsOS.str();
|
|
|
|
if (Action == LLVMAbortProcessAction && Result)
|
|
report_fatal_error("Broken module found, compilation aborted!");
|
|
|
|
if (OutMessages)
|
|
*OutMessages = strdup(MsgsOS.str().c_str());
|
|
|
|
return Result;
|
|
}
|
|
|
|
LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) {
|
|
LLVMBool Result = verifyFunction(
|
|
*unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs()
|
|
: nullptr);
|
|
|
|
if (Action == LLVMAbortProcessAction && Result)
|
|
report_fatal_error("Broken function found, compilation aborted!");
|
|
|
|
return Result;
|
|
}
|
|
|
|
void LLVMViewFunctionCFG(LLVMValueRef Fn) {
|
|
Function *F = unwrap<Function>(Fn);
|
|
F->viewCFG();
|
|
}
|
|
|
|
void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) {
|
|
Function *F = unwrap<Function>(Fn);
|
|
F->viewCFGOnly();
|
|
}
|