mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
9d291ed9ad
DISubprogram currently has 10 pointer operands, several of which are often nullptr. This patch reduces the amount of memory allocated by DISubprogram by rearranging the operands such that containing type, template params, and thrown types come last, and are only allocated when they are non-null (or followed by non-null operands). This patch also eliminates the entirely unused DisplayName operand. This saves up to 4 pointer operands per DISubprogram. (I tried measuring the effect on peak memory usage on an LTO link of an X86 llc, but the results were very noisy). This reapplies r301498 with an attempted workaround for g++. Differential Revision: https://reviews.llvm.org/D32560 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301501 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
2.1 KiB
C++
73 lines
2.1 KiB
C++
//===- BreakpointPrinter.cpp - Breakpoint location printer ----------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// \brief Breakpoint location printer.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
#include "BreakpointPrinter.h"
|
|
#include "llvm/ADT/StringSet.h"
|
|
#include "llvm/IR/DebugInfo.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
struct BreakpointPrinter : public ModulePass {
|
|
raw_ostream &Out;
|
|
static char ID;
|
|
|
|
BreakpointPrinter(raw_ostream &out) : ModulePass(ID), Out(out) {}
|
|
|
|
void getContextName(const DIScope *Context, std::string &N) {
|
|
if (auto *NS = dyn_cast<DINamespace>(Context)) {
|
|
if (!NS->getName().empty()) {
|
|
getContextName(NS->getScope(), N);
|
|
N = N + NS->getName().str() + "::";
|
|
}
|
|
} else if (auto *TY = dyn_cast<DIType>(Context)) {
|
|
if (!TY->getName().empty()) {
|
|
getContextName(TY->getScope().resolve(), N);
|
|
N = N + TY->getName().str() + "::";
|
|
}
|
|
}
|
|
}
|
|
|
|
bool runOnModule(Module &M) override {
|
|
StringSet<> Processed;
|
|
if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
|
|
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
|
std::string Name;
|
|
auto *SP = cast_or_null<DISubprogram>(NMD->getOperand(i));
|
|
if (!SP)
|
|
continue;
|
|
getContextName(SP->getScope().resolve(), Name);
|
|
Name = Name + SP->getName().str();
|
|
if (!Name.empty() && Processed.insert(Name).second) {
|
|
Out << Name << "\n";
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesAll();
|
|
}
|
|
};
|
|
|
|
char BreakpointPrinter::ID = 0;
|
|
}
|
|
|
|
ModulePass *llvm::createBreakpointPrinter(raw_ostream &out) {
|
|
return new BreakpointPrinter(out);
|
|
}
|