1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[CodeGen] emit CG profile for COFF object file

Differential Revision: https://reviews.llvm.org/D87811
This commit is contained in:
Zequan Wu 2020-09-29 11:58:37 -07:00
parent 51ad2660a8
commit 1b632f5114
3 changed files with 107 additions and 10 deletions

View File

@ -143,6 +143,7 @@ public:
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
mutable unsigned NextUniqueID = 0;
const TargetMachine *TM = nullptr;
public:
~TargetLoweringObjectFileCOFF() override = default;

View File

@ -1599,18 +1599,62 @@ void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer &Streamer,
StringRef Section;
GetObjCImageInfo(M, Version, Flags, Section);
if (Section.empty())
return;
if (!Section.empty()) {
auto &C = getContext();
auto *S = C.getCOFFSection(Section,
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
COFF::IMAGE_SCN_MEM_READ,
SectionKind::getReadOnly());
Streamer.SwitchSection(S);
Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
Streamer.emitInt32(Version);
Streamer.emitInt32(Flags);
Streamer.AddBlankLine();
}
auto &C = getContext();
auto *S = C.getCOFFSection(
Section, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
SectionKind::getReadOnly());
Streamer.SwitchSection(S);
Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
Streamer.emitInt32(Version);
Streamer.emitInt32(Flags);
Streamer.AddBlankLine();
SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
M.getModuleFlagsMetadata(ModuleFlags);
MDNode *CFGProfile = nullptr;
for (const auto &MFE : ModuleFlags) {
StringRef Key = MFE.Key->getString();
if (Key == "CG Profile") {
CFGProfile = cast<MDNode>(MFE.Val);
break;
}
}
if (!CFGProfile)
return;
auto GetSym = [this](const MDOperand &MDO) -> MCSymbol * {
if (!MDO)
return nullptr;
auto V = cast<ValueAsMetadata>(MDO);
const Function *F = cast<Function>(V->getValue());
if (F->hasDLLImportStorageClass())
return nullptr;
return TM->getSymbol(F);
};
for (const auto &Edge : CFGProfile->operands()) {
MDNode *E = cast<MDNode>(Edge);
const MCSymbol *From = GetSym(E->getOperand(0));
const MCSymbol *To = GetSym(E->getOperand(1));
// Skip null functions. This can happen if functions are dead stripped after
// the CGProfile pass has been run.
if (!From || !To)
continue;
uint64_t Count = cast<ConstantAsMetadata>(E->getOperand(2))
->getValue()
->getUniqueInteger()
.getZExtValue();
Streamer.emitCGProfileEntry(
MCSymbolRefExpr::create(From, MCSymbolRefExpr::VK_None, C),
MCSymbolRefExpr::create(To, MCSymbolRefExpr::VK_None, C), Count);
}
}
void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
@ -1675,6 +1719,7 @@ void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
TargetLoweringObjectFile::Initialize(Ctx, TM);
this->TM = &TM;
const Triple &T = TM.getTargetTriple();
if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
StaticCtorSection =

51
test/MC/COFF/cgprofile.ll Normal file
View File

@ -0,0 +1,51 @@
; RUN: llc -filetype=asm %s -o - -mtriple x86_64-pc-windows-msvc | FileCheck %s
; RUN: llc -filetype=obj %s -o %t -mtriple x86_64-pc-windows-msvc
; RUN: llvm-readobj --cg-profile %t | FileCheck %s --check-prefix=OBJ
declare void @b()
define void @a() {
call void @b()
ret void
}
define void @freq(i1 %cond) {
br i1 %cond, label %A, label %B
A:
call void @a();
ret void
B:
call void @b();
ret void
}
!llvm.module.flags = !{!0}
!0 = !{i32 5, !"CG Profile", !1}
!1 = !{!2, !3, !4, !5}
!2 = !{void ()* @a, void ()* @b, i64 32}
!3 = !{void (i1)* @freq, void ()* @a, i64 11}
!4 = !{void (i1)* @freq, void ()* @b, i64 20}
!5 = !{void (i1)* @freq, null, i64 20}
; CHECK: .cg_profile a, b, 32
; CHECK: .cg_profile freq, a, 11
; CHECK: .cg_profile freq, b, 20
; OBJ: CGProfile [
; OBJ: CGProfileEntry {
; OBJ: From: a
; OBJ: To: b
; OBJ: Weight: 32
; OBJ: }
; OBJ: CGProfileEntry {
; OBJ: From: freq
; OBJ: To: a
; OBJ: Weight: 11
; OBJ: }
; OBJ: CGProfileEntry {
; OBJ: From: freq
; OBJ: To: b
; OBJ: Weight: 20
; OBJ: }
; OBJ:]