llvm-project/llvm/include/llvm/CodeGen/MachineCycleAnalysis.h
Sameer Sahasrabuddhe d3718f1e4f [LLVM] remove extern template declarations of GenericCycleInfo
Having an extern template declaration prevents implicit instantiation of
templates, which causes linker errors when building with shared libraries. For
example, the sources in libAnalysis do not contain any explicit instantiation of
the CycleInfo, which is a specialization of GenericCycleInfo. Thus, any calls to
functions defined in the body of GenericCycleInfo produce undefined references.
The absence of any extern template declaration allows a local instance of these
functions to be created.
2023-08-01 18:52:45 +05:30

52 lines
1.7 KiB
C++

//===- MachineCycleAnalysis.h - Cycle Info for Machine IR -------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file defines the MachineCycleInfo class, which is a thin wrapper over
// the Machine IR instance of GenericCycleInfo.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_MACHINECYCLEANALYSIS_H
#define LLVM_CODEGEN_MACHINECYCLEANALYSIS_H
#include "llvm/ADT/GenericCycleInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineSSAContext.h"
namespace llvm {
using MachineCycleInfo = GenericCycleInfo<MachineSSAContext>;
using MachineCycle = MachineCycleInfo::CycleT;
/// Legacy analysis pass which computes a \ref MachineCycleInfo.
class MachineCycleInfoWrapperPass : public MachineFunctionPass {
MachineFunction *F = nullptr;
MachineCycleInfo CI;
public:
static char ID;
MachineCycleInfoWrapperPass();
MachineCycleInfo &getCycleInfo() { return CI; }
const MachineCycleInfo &getCycleInfo() const { return CI; }
bool runOnMachineFunction(MachineFunction &F) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
void releaseMemory() override;
void print(raw_ostream &OS, const Module *M = nullptr) const override;
};
// TODO: add this function to GenericCycle template after implementing IR
// version.
bool isCycleInvariant(const MachineCycle *Cycle, MachineInstr &I);
} // end namespace llvm
#endif // LLVM_CODEGEN_MACHINECYCLEANALYSIS_H