#define LLVM_ANALYSIS_TARGETLIBRARYINFO_H
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
namespace llvm {
- class Triple;
+class PreservedAnalyses;
namespace LibFunc {
enum Func {
public:
TargetLibraryInfo();
explicit TargetLibraryInfo(const Triple &T);
- explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
+
+ // Provide value semantics.
+ TargetLibraryInfo(const TargetLibraryInfo &TLI);
+ TargetLibraryInfo(TargetLibraryInfo &&TLI);
+ TargetLibraryInfo &operator=(const TargetLibraryInfo &TLI);
+ TargetLibraryInfo &operator=(TargetLibraryInfo &&TLI);
/// \brief Searches for a particular function name.
///
///
/// This can be used for options like -fno-builtin.
void disableAllFunctions();
+
+ /// \brief Handle invalidation from the pass manager.
+ ///
+ /// If we try to invalidate this info, just return false. It cannot become
+ /// invalid even if the module changes.
+ bool invalidate(Module &, const PreservedAnalyses &) { return false; }
+};
+
+/// \brief Analysis pass providing the \c TargetLibraryInfo.
+///
+/// Note that this pass's result cannot be invalidated, it is immutable for the
+/// life of the module.
+class TargetLibraryAnalysis {
+public:
+ typedef TargetLibraryInfo Result;
+
+ /// \brief Opaque, unique identifier for this analysis pass.
+ static void *ID() { return (void *)&PassID; }
+
+ /// \brief Default construct the library analysis.
+ ///
+ /// This will use the module's triple to construct the library info for that
+ /// module.
+ TargetLibraryAnalysis() {}
+
+ /// \brief Construct a library analysis with preset info.
+ ///
+ /// This will directly copy the preset info into the result without
+ /// consulting the module's triple.
+ TargetLibraryAnalysis(TargetLibraryInfo PresetInfo)
+ : PresetInfo(std::move(PresetInfo)) {}
+
+ // Value semantics. We spell out the constructors for MSVC.
+ TargetLibraryAnalysis(const TargetLibraryAnalysis &Arg)
+ : PresetInfo(Arg.PresetInfo) {}
+ TargetLibraryAnalysis(TargetLibraryAnalysis &&Arg)
+ : PresetInfo(std::move(Arg.PresetInfo)) {}
+ TargetLibraryAnalysis &operator=(const TargetLibraryAnalysis &RHS) {
+ PresetInfo = RHS.PresetInfo;
+ return *this;
+ }
+ TargetLibraryAnalysis &operator=(TargetLibraryAnalysis &&RHS) {
+ PresetInfo = std::move(RHS.PresetInfo);
+ return *this;
+ }
+
+ TargetLibraryInfo run(Module &M) {
+ if (PresetInfo)
+ return *PresetInfo;
+
+ return TargetLibraryInfo(Triple(M.getTargetTriple()));
+ }
+
+ /// \brief Provide access to a name for this pass for debugging purposes.
+ static StringRef name() { return "TargetLibraryAnalysis"; }
+
+private:
+ static char PassID;
+
+ Optional<TargetLibraryInfo> PresetInfo;
};
class TargetLibraryInfoWrapperPass : public ImmutablePass {
initialize(*this, T, StandardNames);
}
-TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI) {
+TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
+ : CustomNames(TLI.CustomNames) {
memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
+}
+
+TargetLibraryInfo::TargetLibraryInfo(TargetLibraryInfo &&TLI)
+ : CustomNames(std::move(TLI.CustomNames)) {
+ std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
+ AvailableArray);
+}
+
+TargetLibraryInfo &TargetLibraryInfo::operator=(const TargetLibraryInfo &TLI) {
CustomNames = TLI.CustomNames;
+ memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
+ return *this;
+}
+
+TargetLibraryInfo &TargetLibraryInfo::operator=(TargetLibraryInfo &&TLI) {
+ CustomNames = std::move(TLI.CustomNames);
+ std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
+ AvailableArray);
+ return *this;
}
namespace {
initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
}
+char TargetLibraryAnalysis::PassID;
+
// Register the basic pass.
INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
"Target Library Information", false, true)
; CHECK-INVALIDATE-ALL-CG-NOT: Running analysis: NoOpModuleAnalysis
; CHECK-INVALIDATE-ALL-CG: Finished pass manager
+; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \
+; RUN: -passes='require<targetlibinfo>,invalidate<all>,require<targetlibinfo>' \
+; RUN: | FileCheck %s --check-prefix=CHECK-TLI
+; CHECK-TLI: Starting pass manager
+; CHECK-TLI: Running pass: RequireAnalysisPass
+; CHECK-TLI: Running analysis: TargetLibraryAnalysis
+; CHECK-TLI: Running pass: InvalidateAllAnalysesPass
+; CHECK-TLI-NOT: Invalidating analysis: TargetLibraryAnalysis
+; CHECK-TLI: Running pass: RequireAnalysisPass
+; CHECK-TLI-NOT: Running analysis: TargetLibraryAnalysis
+; CHECK-TLI: Finished pass manager
+
define void @foo() {
ret void
}