mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
Emit the LLVM<->DWARF register mapping as a sorted table and use binary search to do the lookup.
This also avoids emitting the information twice, which led to code bloat. On i386-linux-Release+Asserts with all targets built this change shaves a whopping 1.3 MB off clang. The number is probably exaggerated by recent inliner changes but the methods were already enormous with the old inline cost computation. The DWARF reg -> LLVM reg mapping doesn't seem to have holes in it, so it could be a simple lookup table. I didn't implement that optimization yet to avoid potentially changing functionality. There is still some duplication both in tablegen and the generated code that should be cleaned up eventually. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153837 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -127,6 +127,16 @@ struct MCRegisterDesc {
|
||||
class MCRegisterInfo {
|
||||
public:
|
||||
typedef const MCRegisterClass *regclass_iterator;
|
||||
|
||||
/// DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be
|
||||
/// performed with a binary search.
|
||||
struct DwarfLLVMRegPair {
|
||||
unsigned FromReg;
|
||||
unsigned ToReg;
|
||||
|
||||
bool operator==(unsigned Reg) const { return FromReg == Reg; }
|
||||
bool operator<(unsigned Reg) const { return FromReg < Reg; }
|
||||
};
|
||||
private:
|
||||
const MCRegisterDesc *Desc; // Pointer to the descriptor array
|
||||
unsigned NumRegs; // Number of entries in the array
|
||||
@@ -137,10 +147,15 @@ private:
|
||||
const uint16_t *SubRegIndices; // Pointer to the subreg lookup
|
||||
// array.
|
||||
unsigned NumSubRegIndices; // Number of subreg indices.
|
||||
DenseMap<unsigned, int> L2DwarfRegs; // LLVM to Dwarf regs mapping
|
||||
DenseMap<unsigned, int> EHL2DwarfRegs; // LLVM to Dwarf regs mapping EH
|
||||
DenseMap<unsigned, unsigned> Dwarf2LRegs; // Dwarf to LLVM regs mapping
|
||||
DenseMap<unsigned, unsigned> EHDwarf2LRegs; // Dwarf to LLVM regs mapping EH
|
||||
|
||||
unsigned L2DwarfRegsSize;
|
||||
unsigned EHL2DwarfRegsSize;
|
||||
unsigned Dwarf2LRegsSize;
|
||||
unsigned EHDwarf2LRegsSize;
|
||||
const DwarfLLVMRegPair *L2DwarfRegs; // LLVM to Dwarf regs mapping
|
||||
const DwarfLLVMRegPair *EHL2DwarfRegs; // LLVM to Dwarf regs mapping EH
|
||||
const DwarfLLVMRegPair *Dwarf2LRegs; // Dwarf to LLVM regs mapping
|
||||
const DwarfLLVMRegPair *EHDwarf2LRegs; // Dwarf to LLVM regs mapping EH
|
||||
DenseMap<unsigned, int> L2SEHRegs; // LLVM to SEH regs mapping
|
||||
|
||||
public:
|
||||
@@ -161,24 +176,32 @@ public:
|
||||
NumSubRegIndices = NumIndices;
|
||||
}
|
||||
|
||||
/// mapLLVMRegToDwarfReg - Used to initialize LLVM register to Dwarf
|
||||
/// mapLLVMRegsToDwarfRegs - Used to initialize LLVM register to Dwarf
|
||||
/// register number mapping. Called by TableGen auto-generated routines.
|
||||
/// *DO NOT USE*.
|
||||
void mapLLVMRegToDwarfReg(unsigned LLVMReg, int DwarfReg, bool isEH) {
|
||||
if (isEH)
|
||||
EHL2DwarfRegs[LLVMReg] = DwarfReg;
|
||||
else
|
||||
L2DwarfRegs[LLVMReg] = DwarfReg;
|
||||
void mapLLVMRegsToDwarfRegs(const DwarfLLVMRegPair *Map, unsigned Size,
|
||||
bool isEH) {
|
||||
if (isEH) {
|
||||
EHL2DwarfRegs = Map;
|
||||
EHL2DwarfRegsSize = Size;
|
||||
} else {
|
||||
L2DwarfRegs = Map;
|
||||
L2DwarfRegsSize = Size;
|
||||
}
|
||||
}
|
||||
|
||||
/// mapDwarfRegToLLVMReg - Used to initialize Dwarf register to LLVM
|
||||
/// mapDwarfRegsToLLVMRegs - Used to initialize Dwarf register to LLVM
|
||||
/// register number mapping. Called by TableGen auto-generated routines.
|
||||
/// *DO NOT USE*.
|
||||
void mapDwarfRegToLLVMReg(unsigned DwarfReg, unsigned LLVMReg, bool isEH) {
|
||||
if (isEH)
|
||||
EHDwarf2LRegs[DwarfReg] = LLVMReg;
|
||||
else
|
||||
Dwarf2LRegs[DwarfReg] = LLVMReg;
|
||||
void mapDwarfRegsToLLVMRegs(const DwarfLLVMRegPair *Map, unsigned Size,
|
||||
bool isEH) {
|
||||
if (isEH) {
|
||||
EHDwarf2LRegs = Map;
|
||||
EHDwarf2LRegsSize = Size;
|
||||
} else {
|
||||
Dwarf2LRegs = Map;
|
||||
Dwarf2LRegsSize = Size;
|
||||
}
|
||||
}
|
||||
|
||||
/// mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register
|
||||
@@ -289,21 +312,24 @@ public:
|
||||
/// parameter allows targets to use different numberings for EH info and
|
||||
/// debugging info.
|
||||
int getDwarfRegNum(unsigned RegNum, bool isEH) const {
|
||||
const DenseMap<unsigned, int> &M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
|
||||
const DenseMap<unsigned, int>::const_iterator I = M.find(RegNum);
|
||||
if (I == M.end()) return -1;
|
||||
return I->second;
|
||||
const DwarfLLVMRegPair *M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
|
||||
unsigned Size = isEH ? EHL2DwarfRegsSize : L2DwarfRegsSize;
|
||||
|
||||
const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, RegNum);
|
||||
if (I == M+Size || I->FromReg != RegNum)
|
||||
return -1;
|
||||
return I->ToReg;
|
||||
}
|
||||
|
||||
/// getLLVMRegNum - Map a dwarf register back to a target register.
|
||||
///
|
||||
int getLLVMRegNum(unsigned RegNum, bool isEH) const {
|
||||
const DenseMap<unsigned, unsigned> &M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
|
||||
const DenseMap<unsigned, unsigned>::const_iterator I = M.find(RegNum);
|
||||
if (I == M.end()) {
|
||||
llvm_unreachable("Invalid RegNum");
|
||||
}
|
||||
return I->second;
|
||||
const DwarfLLVMRegPair *M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
|
||||
unsigned Size = isEH ? EHDwarf2LRegsSize : Dwarf2LRegsSize;
|
||||
|
||||
const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, RegNum);
|
||||
assert(I != M+Size && I->FromReg == RegNum && "Invalid RegNum");
|
||||
return I->ToReg;
|
||||
}
|
||||
|
||||
/// getSEHRegNum - Map a target register to an equivalent SEH register
|
||||
|
||||
Reference in New Issue
Block a user