From 90242caca2074dab5a9b76e5bc36d9fafd2179a7 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Tue, 22 Sep 2020 13:45:22 -0700 Subject: [PATCH] Revert "[CodeGen] emit CG profile for COFF object file" This reverts commit 91aed9bf975f1e4346cc8f4bdefc98436386ced2, it is causing link errors. --- .../llvm/CodeGen/TargetLoweringObjectFileImpl.h | 1 + .../include/llvm/Target/TargetLoweringObjectFile.h | 5 -- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 66 +++++++++++++++++----- llvm/lib/Target/TargetLoweringObjectFile.cpp | 46 --------------- llvm/test/MC/COFF/cgprofile.ll | 51 ----------------- 5 files changed, 53 insertions(+), 116 deletions(-) delete mode 100644 llvm/test/MC/COFF/cgprofile.ll diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h index 4f3e1dd..57cead3 100644 --- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -35,6 +35,7 @@ class TargetLoweringObjectFileELF : public TargetLoweringObjectFile { protected: MCSymbolRefExpr::VariantKind PLTRelativeVariantKind = MCSymbolRefExpr::VK_None; + const TargetMachine *TM = nullptr; public: TargetLoweringObjectFileELF() = default; diff --git a/llvm/include/llvm/Target/TargetLoweringObjectFile.h b/llvm/include/llvm/Target/TargetLoweringObjectFile.h index 0c8f683..793e45c 100644 --- a/llvm/include/llvm/Target/TargetLoweringObjectFile.h +++ b/llvm/include/llvm/Target/TargetLoweringObjectFile.h @@ -61,8 +61,6 @@ protected: /// This section contains the static destructor pointer list. MCSection *StaticDtorSection = nullptr; - const TargetMachine *TM = nullptr; - public: TargetLoweringObjectFile() = default; TargetLoweringObjectFile(const TargetLoweringObjectFile &) = delete; @@ -83,9 +81,6 @@ public: /// Emit the module-level metadata that the platform cares about. virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const {} - /// Emit Call Graph Profile metadata. - virtual void emitCGProfile(MCStreamer &Streamer, Module &M) const; - /// Get the module-level metadata that the platform cares about. virtual void getModuleMetadata(Module &M) {} diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 0c43ec8..83014da 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -107,6 +107,7 @@ static void GetObjCImageInfo(Module &M, unsigned &Version, unsigned &Flags, void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, const TargetMachine &TgtM) { TargetLoweringObjectFile::Initialize(Ctx, TgtM); + TM = &TgtM; CodeModel::Model CM = TgtM.getCodeModel(); InitializeELF(TgtM.Options.UseInitArray); @@ -323,7 +324,46 @@ void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer, Streamer.AddBlankLine(); } - emitCGProfile(Streamer, M); + SmallVector ModuleFlags; + M.getModuleFlagsMetadata(ModuleFlags); + + MDNode *CFGProfile = nullptr; + + for (const auto &MFE : ModuleFlags) { + StringRef Key = MFE.Key->getString(); + if (Key == "CG Profile") { + CFGProfile = cast(MFE.Val); + break; + } + } + + if (!CFGProfile) + return; + + auto GetSym = [this](const MDOperand &MDO) -> MCSymbol * { + if (!MDO) + return nullptr; + auto V = cast(MDO); + const Function *F = cast(V->getValue()); + return TM->getSymbol(F); + }; + + for (const auto &Edge : CFGProfile->operands()) { + MDNode *E = cast(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(E->getOperand(2)) + ->getValue() + ->getUniqueInteger() + .getZExtValue(); + Streamer.emitCGProfileEntry( + MCSymbolRefExpr::create(From, MCSymbolRefExpr::VK_None, C), + MCSymbolRefExpr::create(To, MCSymbolRefExpr::VK_None, C), Count); + } } MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol( @@ -1558,20 +1598,18 @@ void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer &Streamer, StringRef Section; GetObjCImageInfo(M, Version, Flags, Section); - 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(); - } + if (Section.empty()) + return; - emitCGProfile(Streamer, M); + 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(); } void TargetLoweringObjectFileCOFF::emitLinkerDirectives( diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp index 0e45c70..eea0aee 100644 --- a/llvm/lib/Target/TargetLoweringObjectFile.cpp +++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp @@ -49,8 +49,6 @@ void TargetLoweringObjectFile::Initialize(MCContext &ctx, // Reset various EH DWARF encodings. PersonalityEncoding = LSDAEncoding = TTypeEncoding = dwarf::DW_EH_PE_absptr; CallSiteEncoding = dwarf::DW_EH_PE_uleb128; - - this->TM = &TM; } TargetLoweringObjectFile::~TargetLoweringObjectFile() { @@ -138,50 +136,6 @@ void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer, const MCSymbol *Sym) const { } -void TargetLoweringObjectFile::emitCGProfile(MCStreamer &Streamer, - Module &M) const { - MCContext &C = getContext(); - SmallVector ModuleFlags; - M.getModuleFlagsMetadata(ModuleFlags); - - MDNode *CFGProfile = nullptr; - - for (const auto &MFE : ModuleFlags) { - StringRef Key = MFE.Key->getString(); - if (Key == "CG Profile") { - CFGProfile = cast(MFE.Val); - break; - } - } - - if (!CFGProfile) - return; - - auto GetSym = [this](const MDOperand &MDO) -> MCSymbol * { - if (!MDO) - return nullptr; - auto *V = cast(MDO); - const Function *F = cast(V->getValue()); - return TM->getSymbol(F); - }; - - for (const auto &Edge : CFGProfile->operands()) { - MDNode *E = cast(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(E->getOperand(2)) - ->getValue() - ->getUniqueInteger() - .getZExtValue(); - Streamer.emitCGProfileEntry( - MCSymbolRefExpr::create(From, MCSymbolRefExpr::VK_None, C), - MCSymbolRefExpr::create(To, MCSymbolRefExpr::VK_None, C), Count); - } -} /// getKindForGlobal - This is a top-level target-independent classifier for /// a global object. Given a global variable and information from the TM, this diff --git a/llvm/test/MC/COFF/cgprofile.ll b/llvm/test/MC/COFF/cgprofile.ll deleted file mode 100644 index 0156aed..0000000 --- a/llvm/test/MC/COFF/cgprofile.ll +++ /dev/null @@ -1,51 +0,0 @@ -; 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:] -- 2.7.4