mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-04 16:01:46 +00:00
Stub out a new LiveDebugVariables pass.
This analysis is going to run immediately after LiveIntervals. It will stay alive during register allocation and keep track of user variables mentioned in DBG_VALUE instructions. When the register allocator is moving values between registers and the stack, it is very hard to keep track of DBG_VALUE instructions. We usually get it wrong. This analysis maintains a data structure that makes it easy to update DBG_VALUE instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d7b6a989a7
commit
bb7b23f5b7
@ -117,6 +117,7 @@ void initializeLICMPass(PassRegistry&);
|
|||||||
void initializeLazyValueInfoPass(PassRegistry&);
|
void initializeLazyValueInfoPass(PassRegistry&);
|
||||||
void initializeLibCallAliasAnalysisPass(PassRegistry&);
|
void initializeLibCallAliasAnalysisPass(PassRegistry&);
|
||||||
void initializeLintPass(PassRegistry&);
|
void initializeLintPass(PassRegistry&);
|
||||||
|
void initializeLiveDebugVariablesPass(PassRegistry&);
|
||||||
void initializeLiveIntervalsPass(PassRegistry&);
|
void initializeLiveIntervalsPass(PassRegistry&);
|
||||||
void initializeLiveStacksPass(PassRegistry&);
|
void initializeLiveStacksPass(PassRegistry&);
|
||||||
void initializeLiveValuesPass(PassRegistry&);
|
void initializeLiveValuesPass(PassRegistry&);
|
||||||
|
@ -20,6 +20,7 @@ add_llvm_library(LLVMCodeGen
|
|||||||
IntrinsicLowering.cpp
|
IntrinsicLowering.cpp
|
||||||
LLVMTargetMachine.cpp
|
LLVMTargetMachine.cpp
|
||||||
LatencyPriorityQueue.cpp
|
LatencyPriorityQueue.cpp
|
||||||
|
LiveDebugVariables.cpp
|
||||||
LiveInterval.cpp
|
LiveInterval.cpp
|
||||||
LiveIntervalAnalysis.cpp
|
LiveIntervalAnalysis.cpp
|
||||||
LiveIntervalUnion.cpp
|
LiveIntervalUnion.cpp
|
||||||
|
@ -23,6 +23,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
|
|||||||
initializeDeadMachineInstructionElimPass(Registry);
|
initializeDeadMachineInstructionElimPass(Registry);
|
||||||
initializeGCModuleInfoPass(Registry);
|
initializeGCModuleInfoPass(Registry);
|
||||||
initializeIfConverterPass(Registry);
|
initializeIfConverterPass(Registry);
|
||||||
|
initializeLiveDebugVariablesPass(Registry);
|
||||||
initializeLiveIntervalsPass(Registry);
|
initializeLiveIntervalsPass(Registry);
|
||||||
initializeLiveStacksPass(Registry);
|
initializeLiveStacksPass(Registry);
|
||||||
initializeLiveVariablesPass(Registry);
|
initializeLiveVariablesPass(Registry);
|
||||||
|
50
lib/CodeGen/LiveDebugVariables.cpp
Normal file
50
lib/CodeGen/LiveDebugVariables.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
//===- LiveDebugVariables.cpp - Tracking debug info variables -------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file implements the LiveDebugVariables analysis.
|
||||||
|
//
|
||||||
|
// Remove all DBG_VALUE instructions referencing virtual registers and replace
|
||||||
|
// them with a data structure tracking where live user variables are kept - in a
|
||||||
|
// virtual register or in a stack slot.
|
||||||
|
//
|
||||||
|
// Allow the data structure to be updated during register allocation when values
|
||||||
|
// are moved between registers and stack slots. Finally emit new DBG_VALUE
|
||||||
|
// instructions after register allocation is complete.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "LiveDebugVariables.h"
|
||||||
|
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include "llvm/CodeGen/Passes.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
char LiveDebugVariables::ID = 0;
|
||||||
|
|
||||||
|
INITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars",
|
||||||
|
"Debug Variable Analysis", false, false)
|
||||||
|
INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
|
||||||
|
INITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars",
|
||||||
|
"Debug Variable Analysis", false, false)
|
||||||
|
|
||||||
|
void LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
|
AU.addRequiredTransitive<LiveIntervals>();
|
||||||
|
AU.setPreservesAll();
|
||||||
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
|
}
|
||||||
|
|
||||||
|
LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID) {
|
||||||
|
initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {
|
||||||
|
return false;
|
||||||
|
}
|
57
lib/CodeGen/LiveDebugVariables.h
Normal file
57
lib/CodeGen/LiveDebugVariables.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
//===- LiveDebugVariables.h - Tracking debug info variables ----*- c++ -*--===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file provides the interface to the LiveDebugVariables analysis.
|
||||||
|
//
|
||||||
|
// The analysis removes DBG_VALUE instructions for virtual registers and tracks
|
||||||
|
// live user variables in a data structure that can be updated during register
|
||||||
|
// allocation.
|
||||||
|
//
|
||||||
|
// After register allocation new DBG_VALUE instructions are emitted to reflect
|
||||||
|
// the new locations of user variables.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_CODEGEN_LIVEDEBUGVARIABLES_H
|
||||||
|
#define LLVM_CODEGEN_LIVEDEBUGVARIABLES_H
|
||||||
|
|
||||||
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class LiveDebugVariables : public MachineFunctionPass {
|
||||||
|
void *pImpl;
|
||||||
|
public:
|
||||||
|
static char ID; // Pass identification, replacement for typeid
|
||||||
|
|
||||||
|
LiveDebugVariables();
|
||||||
|
|
||||||
|
/// renameRegister - Move any user variables in OldReg to NewReg:SubIdx.
|
||||||
|
/// @param OldReg Old virtual register that is going away.
|
||||||
|
/// @param NewReg New register holding the user variables.
|
||||||
|
/// @param SubIdx If NewReg is a virtual register, SubIdx may indicate a sub-
|
||||||
|
/// register.
|
||||||
|
void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx);
|
||||||
|
|
||||||
|
/// emitDebugValues - Emit new DBG_VALUE instructions reflecting the changes
|
||||||
|
/// that happened during register allocation.
|
||||||
|
void emitDebugValues();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/// runOnMachineFunction - Analyze and remove DBG_VALUE instructions.
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &);
|
||||||
|
|
||||||
|
virtual void getAnalysisUsage(AnalysisUsage &) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace llvm
|
||||||
|
|
||||||
|
#endif // LLVM_CODEGEN_LIVEDEBUGVARIABLES_H
|
Loading…
Reference in New Issue
Block a user