Skip to content

Commit bf0c47a

Browse files
committed
trace-register: Implements trace register routine
1 parent c1d031b commit bf0c47a

File tree

1 file changed

+60
-5
lines changed

1 file changed

+60
-5
lines changed

lib/Target/X86/X86MCInstLower.cpp

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
#include "llvm/MC/MCSymbol.h"
4545
#include "llvm/MC/MCSymbolELF.h"
4646
#include "llvm/Target/TargetLoweringObjectFile.h"
47-
#include "llvm/Transforms/Utils/Dependency.h"
47+
#include <string>
48+
#include <map>
49+
#include "llvm/Transforms/Utils/InjectFault.h"
4850

4951
using namespace llvm;
5052

@@ -1585,16 +1587,69 @@ void X86AsmPrinter::EmitSEHInstruction(const MachineInstr *MI) {
15851587
}
15861588
}
15871589

1590+
int once = 0;
1591+
static void trace_register(const MachineInstr *MI) {
1592+
if (once != 0)
1593+
return;
1594+
once = 1;
1595+
1596+
if (MI->getNumOperands() == 0 || !MI->getOperand(0).isReg())
1597+
return;
1598+
1599+
std::set<unsigned> dep_regs;
1600+
std::set<const MachineOperand *> result;
1601+
1602+
for (int i = 1, e = MI->getNumOperands(); i < e; i++)
1603+
if (MI->getOperand(i).isReg() && !MI->getOperand(i).isDead()) {
1604+
dep_regs.insert(MI->getOperand(i).getReg());
1605+
result.insert(&MI->getOperand(i));
1606+
}
1607+
1608+
if (dep_regs.size() == 0)
1609+
return;
1610+
1611+
MI = MI->getPrevNode();
1612+
for (; MI != nullptr; MI = MI->getPrevNode()) {
1613+
if (MI->getNumOperands() == 0 || !MI->getOperand(0).isReg())
1614+
continue;
1615+
if (dep_regs.find(MI->getOperand(0).getReg()) == dep_regs.end())
1616+
continue;
1617+
1618+
dep_regs.erase(MI->getOperand(0).getReg());
1619+
1620+
for (int i = 1, e = MI->getNumOperands(); i < e; i++)
1621+
if (MI->getOperand(i).isReg() && !MI->getOperand(i).isDead()) {
1622+
dep_regs.insert(MI->getOperand(i).getReg());
1623+
result.insert(&MI->getOperand(i));
1624+
}
1625+
}
1626+
1627+
for (auto reg : result) {
1628+
reg->print(errs());
1629+
errs() << '\n';
1630+
}
1631+
}
1632+
15881633
void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
15891634
X86MCInstLower MCInstLowering(*MF, *this);
15901635
const X86RegisterInfo *RI =
15911636
MF->getSubtarget<X86Subtarget>().getRegisterInfo();
15921637

15931638
if (MI->getDebugLoc()) {
1594-
DependencyInstrInfoManager *mgr = getInfoManager(MI->getDebugLoc()->getLine());
1595-
mgr->doFolding();
1596-
for (auto DI : *mgr)
1597-
OutStreamer->AddComment(DI->getInfo());
1639+
//DependencyInstrInfoManager *mgr = getInfoManager(MI->getDebugLoc()->getLine());
1640+
//mgr->doFolding();
1641+
1642+
//for (auto DI : *mgr)
1643+
//errs() << MI << "\r\n";
1644+
OutStreamer->AddComment(getInformation(MI->getDebugLoc().getLine()));
1645+
1646+
/*errs() << *MI << '\n';
1647+
for (int i = 0; i < MI->getNumOperands(); i++) {
1648+
errs() << MI->getOperand(i) << '\n';
1649+
errs() << (int)MI->getOperand(i).getType() << '\n';
1650+
errs() << MI->getOperand(i).getReg() << '\n';
1651+
}*/
1652+
trace_register(MI);
15981653
}
15991654

16001655
// Add a comment about EVEX-2-VEX compression for AVX-512 instrs that

0 commit comments

Comments
 (0)