|
78 | 78 | #include "llvm/IR/GlobalValue.h" |
79 | 79 | #include "llvm/IR/GlobalVariable.h" |
80 | 80 | #include "llvm/IR/Instruction.h" |
| 81 | +#include "llvm/IR/Instructions.h" |
81 | 82 | #include "llvm/IR/Mangler.h" |
82 | 83 | #include "llvm/IR/Metadata.h" |
83 | 84 | #include "llvm/IR/Module.h" |
@@ -1733,6 +1734,14 @@ void AsmPrinter::emitCallGraphSection(const MachineFunction &MF, |
1733 | 1734 | } |
1734 | 1735 | FuncInfo.CallSiteLabels.clear(); |
1735 | 1736 |
|
| 1737 | + const auto &DirectCallSiteLabels = FuncInfo.DirectCallSiteLabels; |
| 1738 | + OutStreamer->emitInt64(DirectCallSiteLabels.size()); |
| 1739 | + for (const auto &[CallSiteAddrLabel, CalleeSymbol] : DirectCallSiteLabels) { |
| 1740 | + OutStreamer->emitSymbolValue(CallSiteAddrLabel, TM.getProgramPointerSize()); |
| 1741 | + OutStreamer->emitSymbolValue(CalleeSymbol, TM.getProgramPointerSize()); |
| 1742 | + } |
| 1743 | + FuncInfo.DirectCallSiteLabels.clear(); |
| 1744 | + |
1736 | 1745 | OutStreamer->popSection(); |
1737 | 1746 | } |
1738 | 1747 |
|
@@ -1872,9 +1881,28 @@ void AsmPrinter::emitIndirectCalleeLabels( |
1872 | 1881 | const MachineInstr &MI) { |
1873 | 1882 | // Only indirect calls have type identifiers set. |
1874 | 1883 | const auto &CallSiteInfo = CallSitesInfoMap.find(&MI); |
1875 | | - if (CallSiteInfo == CallSitesInfoMap.end()) |
| 1884 | + |
| 1885 | + // Handle direct callsite info |
| 1886 | + if (CallSiteInfo == CallSitesInfoMap.end()) { |
| 1887 | + const MachineOperand &CalleeOperand = MI.getOperand(0); |
| 1888 | + MCSymbol *CalleeSymbol = nullptr; |
| 1889 | + switch (CalleeOperand.getType()) { |
| 1890 | + case llvm::MachineOperand::MO_GlobalAddress: |
| 1891 | + CalleeSymbol = getSymbol(CalleeOperand.getGlobal()); |
| 1892 | + break; |
| 1893 | + case llvm::MachineOperand::MO_ExternalSymbol: |
| 1894 | + CalleeSymbol = GetExternalSymbolSymbol(CalleeOperand.getSymbolName()); |
| 1895 | + break; |
| 1896 | + default: |
| 1897 | + llvm_unreachable("Expect only direct call instructions to be handled."); |
| 1898 | + } |
| 1899 | + MCSymbol *S = MF->getContext().createTempSymbol(); |
| 1900 | + OutStreamer->emitLabel(S); |
| 1901 | + FuncInfo.DirectCallSiteLabels.emplace_back(S, CalleeSymbol); |
1876 | 1902 | return; |
| 1903 | + } |
1877 | 1904 |
|
| 1905 | + // Handle indirect callsite info. |
1878 | 1906 | for (ConstantInt *CalleeTypeId : CallSiteInfo->second.CalleeTypeIds) { |
1879 | 1907 | MCSymbol *S = MF->getContext().createTempSymbol(); |
1880 | 1908 | OutStreamer->emitLabel(S); |
@@ -2064,8 +2092,13 @@ void AsmPrinter::emitFunctionBody() { |
2064 | 2092 | break; |
2065 | 2093 | } |
2066 | 2094 |
|
2067 | | - if (TM.Options.EmitCallGraphSection && MI.isCall()) |
| 2095 | + if (TM.Options.EmitCallGraphSection && MI.isCall()) { |
| 2096 | + llvm::outs() << "Dump MI for calls \n"; |
| 2097 | + MI.dump(); |
| 2098 | + llvm::outs() << "CallSitesInfoMap.size() " << CallSitesInfoMap.size() |
| 2099 | + << "\n"; |
2068 | 2100 | emitIndirectCalleeLabels(FuncInfo, CallSitesInfoMap, MI); |
| 2101 | + } |
2069 | 2102 |
|
2070 | 2103 | // If there is a post-instruction symbol, emit a label for it here. |
2071 | 2104 | if (MCSymbol *S = MI.getPostInstrSymbol()) |
|
0 commit comments