[llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp ELFWriter.cpp MachineCodeEmitter.cpp MachineFunction.cpp MachineInstr.cpp
Nate Begeman
natebegeman at mac.com
Sat Apr 22 11:54:07 PDT 2006
Changes in directory llvm/lib/CodeGen:
AsmPrinter.cpp updated: 1.58 -> 1.59
ELFWriter.cpp updated: 1.17 -> 1.18
MachineCodeEmitter.cpp updated: 1.25 -> 1.26
MachineFunction.cpp updated: 1.87 -> 1.88
MachineInstr.cpp updated: 1.110 -> 1.111
---
Log message:
JumpTable support! What this represents is working asm and jit support for
x86 and ppc for 100% dense switch statements when relocations are non-PIC.
This support will be extended and enhanced in the coming days to support
PIC, and less dense forms of jump tables.
---
Diffs of the changes: (+96 -3)
AsmPrinter.cpp | 38 ++++++++++++++++++++++++++++++++++++++
ELFWriter.cpp | 5 ++++-
MachineCodeEmitter.cpp | 14 ++++++++++++--
MachineFunction.cpp | 36 ++++++++++++++++++++++++++++++++++++
MachineInstr.cpp | 6 ++++++
5 files changed, 96 insertions(+), 3 deletions(-)
Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.58 llvm/lib/CodeGen/AsmPrinter.cpp:1.59
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.58 Tue Mar 7 16:00:35 2006
+++ llvm/lib/CodeGen/AsmPrinter.cpp Sat Apr 22 13:53:45 2006
@@ -17,6 +17,7 @@
#include "llvm/Constants.h"
#include "llvm/Module.h"
#include "llvm/CodeGen/MachineConstantPool.h"
+#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/Support/Mangler.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Target/TargetMachine.h"
@@ -46,6 +47,7 @@
AlignmentIsInBytes(true),
SwitchToSectionDirective("\t.section\t"),
ConstantPoolSection("\t.section .rodata\n"),
+ JumpTableSection("\t.section .rodata\n"),
StaticCtorsSection("\t.section .ctors,\"aw\", at progbits"),
StaticDtorsSection("\t.section .dtors,\"aw\", at progbits"),
LCOMMDirective(0),
@@ -127,6 +129,33 @@
}
}
+/// EmitJumpTableInfo - Print assembly representations of the jump tables used
+/// by the current function to the current output stream.
+///
+void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI) {
+ const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
+ if (JT.empty()) return;
+ const TargetData &TD = TM.getTargetData();
+
+ // FIXME: someday we need to handle PIC jump tables
+ assert((TM.getRelocationModel() == Reloc::Static ||
+ TM.getRelocationModel() == Reloc::DynamicNoPIC) &&
+ "Unhandled relocation model emitting jump table information!");
+
+ SwitchSection(JumpTableSection, 0);
+ EmitAlignment(Log2_32(TD.getPointerAlignment()));
+ for (unsigned i = 0, e = JT.size(); i != e; ++i) {
+ O << PrivateGlobalPrefix << "JTI" << getFunctionNumber() << '_' << i
+ << ":\n";
+ const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs;
+ for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
+ O << Data32bitsDirective << ' ';
+ printBasicBlockLabel(JTBBs[ii]);
+ O << '\n';
+ }
+ }
+}
+
/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
/// special global used by LLVM. If so, emit it and return true, otherwise
/// do nothing and return false.
@@ -654,3 +683,12 @@
// Target doesn't support this yet!
return true;
}
+
+/// printBasicBlockLabel - This method prints the label for the specified
+/// MachineBasicBlock
+void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB) const {
+ O << PrivateGlobalPrefix << "LBB"
+ << Mang->getValueName(MBB->getParent()->getFunction())
+ << "_" << MBB->getNumber() << '\t' << CommentString
+ << MBB->getBasicBlock()->getName();
+}
Index: llvm/lib/CodeGen/ELFWriter.cpp
diff -u llvm/lib/CodeGen/ELFWriter.cpp:1.17 llvm/lib/CodeGen/ELFWriter.cpp:1.18
--- llvm/lib/CodeGen/ELFWriter.cpp:1.17 Wed Dec 28 00:29:02 2005
+++ llvm/lib/CodeGen/ELFWriter.cpp Sat Apr 22 13:53:45 2006
@@ -84,7 +84,10 @@
assert(0 && "CP not implementated yet!");
return 0;
}
-
+ virtual uint64_t getJumpTableEntryAddress(unsigned Index) {
+ assert(0 && "JT not implementated yet!");
+ return 0;
+ }
virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) {
assert(0 && "Globals not implemented yet!");
return 0;
Index: llvm/lib/CodeGen/MachineCodeEmitter.cpp
diff -u llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.25 llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.26
--- llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.25 Tue Dec 27 20:44:35 2005
+++ llvm/lib/CodeGen/MachineCodeEmitter.cpp Sat Apr 22 13:53:45 2006
@@ -56,6 +56,7 @@
{ return 0; }
uint64_t getConstantPoolEntryAddress(unsigned Num) { return 0; }
+ uint64_t getJumpTableEntryAddress(unsigned Num) { return 0; }
uint64_t getCurrentPCValue() { return 0; }
uint64_t getCurrentPCOffset() { return 0; }
};
@@ -97,7 +98,14 @@
void emitConstantPool(MachineConstantPool *MCP) {
MCE.emitConstantPool(MCP);
}
-
+ void initJumpTableInfo(MachineJumpTableInfo *MJTI) {
+ MCE.initJumpTableInfo(MJTI);
+ }
+ void emitJumpTableInfo(MachineJumpTableInfo *MJTI,
+ std::map<MachineBasicBlock*,uint64_t> &MBBM) {
+ MCE.emitJumpTableInfo(MJTI, MBBM);
+ }
+
void startFunctionStub(unsigned StubSize) {
MCE.startFunctionStub(StubSize);
}
@@ -146,7 +154,9 @@
uint64_t getConstantPoolEntryAddress(unsigned Num) {
return MCE.getConstantPoolEntryAddress(Num);
}
-
+ uint64_t getJumpTableEntryAddress(unsigned Num) {
+ return MCE.getJumpTableEntryAddress(Num);
+ }
virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment)
{ return MCE.allocateGlobal(size, alignment); }
Index: llvm/lib/CodeGen/MachineFunction.cpp
diff -u llvm/lib/CodeGen/MachineFunction.cpp:1.87 llvm/lib/CodeGen/MachineFunction.cpp:1.88
--- llvm/lib/CodeGen/MachineFunction.cpp:1.87 Mon Apr 3 16:39:03 2006
+++ llvm/lib/CodeGen/MachineFunction.cpp Sat Apr 22 13:53:45 2006
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/SSARegMap.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineConstantPool.h"
+#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetFrameInfo.h"
@@ -113,6 +114,7 @@
MFInfo = 0;
FrameInfo = new MachineFrameInfo();
ConstantPool = new MachineConstantPool(TM.getTargetData());
+ JumpTableInfo = new MachineJumpTableInfo(TM.getTargetData());
BasicBlocks.Parent = this;
}
@@ -122,6 +124,7 @@
delete MFInfo;
delete FrameInfo;
delete ConstantPool;
+ delete JumpTableInfo;
delete[] UsedPhysRegs;
}
@@ -132,6 +135,9 @@
// Print Frame Information
getFrameInfo()->print(*this, OS);
+
+ // Print JumpTable Information
+ getJumpTableInfo()->print(OS);
// Print Constant Pool
getConstantPool()->print(OS);
@@ -334,6 +340,36 @@
//===----------------------------------------------------------------------===//
+// MachineJumpTableInfo implementation
+//===----------------------------------------------------------------------===//
+
+/// getJumpTableIndex - Create a new jump table entry in the jump table info
+/// or return an existing one.
+///
+unsigned MachineJumpTableInfo::getJumpTableIndex(
+ std::vector<MachineBasicBlock*> &DestBBs) {
+ for (unsigned i = 0, e = JumpTables.size(); i != e; ++i)
+ if (JumpTables[i].MBBs == DestBBs)
+ return i;
+
+ JumpTables.push_back(MachineJumpTableEntry(DestBBs));
+ return JumpTables.size()-1;
+}
+
+
+void MachineJumpTableInfo::print(std::ostream &OS) const {
+ // FIXME: this is lame, maybe we could print out the MBB numbers or something
+ // like {1, 2, 4, 5, 3, 0}
+ for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
+ OS << " <jt #" << i << "> has " << JumpTables[i].MBBs.size()
+ << " entries\n";
+ }
+}
+
+void MachineJumpTableInfo::dump() const { print(std::cerr); }
+
+
+//===----------------------------------------------------------------------===//
// MachineConstantPool implementation
//===----------------------------------------------------------------------===//
Index: llvm/lib/CodeGen/MachineInstr.cpp
diff -u llvm/lib/CodeGen/MachineInstr.cpp:1.110 llvm/lib/CodeGen/MachineInstr.cpp:1.111
--- llvm/lib/CodeGen/MachineInstr.cpp:1.110 Thu Apr 20 13:32:41 2006
+++ llvm/lib/CodeGen/MachineInstr.cpp Sat Apr 22 13:53:45 2006
@@ -238,6 +238,9 @@
case MachineOperand::MO_ConstantPoolIndex:
OS << "<cp#" << MO.getConstantPoolIndex() << ">";
break;
+ case MachineOperand::MO_JumpTableIndex:
+ OS << "<jt#" << MO.getJumpTableIndex() << ">";
+ break;
case MachineOperand::MO_GlobalAddress:
OS << "<ga:" << ((Value*)MO.getGlobal())->getName();
if (MO.getOffset()) OS << "+" << MO.getOffset();
@@ -377,6 +380,9 @@
case MachineOperand::MO_ConstantPoolIndex:
OS << "<cp#" << MO.getConstantPoolIndex() << ">";
break;
+ case MachineOperand::MO_JumpTableIndex:
+ OS << "<jt#" << MO.getJumpTableIndex() << ">";
+ break;
case MachineOperand::MO_GlobalAddress:
OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
break;
More information about the llvm-commits
mailing list