mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
0bad578cf3
Looking at the Doxygen-generated documentation for the llvm namespace currently shows all sorts of random comments from different parts of the codebase. These are mostly caused by: - File doc comments that aren't marked with \file, so they're attached to the next declaration, which is usually "namespace llvm {". - Class doc comments placed before the namespace rather than before the class. - Code comments before the namespace that (in my opinion) shouldn't be extracted by doxygen at all. This commit fixes these comments. The generated doxygen documentation now has proper docs for several classes and files, and the docs for the llvm and llvm::detail namespaces are now empty. Reviewed By: thakis, mizvekov Differential Revision: https://reviews.llvm.org/D96736
102 lines
3.1 KiB
C++
102 lines
3.1 KiB
C++
//===-------- EdgeBundles.cpp - Bundles of CFG edges ----------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file provides the implementation of the EdgeBundles analysis.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/EdgeBundles.h"
|
|
#include "llvm/ADT/Twine.h"
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/GraphWriter.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static cl::opt<bool>
|
|
ViewEdgeBundles("view-edge-bundles", cl::Hidden,
|
|
cl::desc("Pop up a window to show edge bundle graphs"));
|
|
|
|
char EdgeBundles::ID = 0;
|
|
|
|
INITIALIZE_PASS(EdgeBundles, "edge-bundles", "Bundle Machine CFG Edges",
|
|
/* cfg = */true, /* is_analysis = */ true)
|
|
|
|
char &llvm::EdgeBundlesID = EdgeBundles::ID;
|
|
|
|
void EdgeBundles::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.setPreservesAll();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
bool EdgeBundles::runOnMachineFunction(MachineFunction &mf) {
|
|
MF = &mf;
|
|
EC.clear();
|
|
EC.grow(2 * MF->getNumBlockIDs());
|
|
|
|
for (const auto &MBB : *MF) {
|
|
unsigned OutE = 2 * MBB.getNumber() + 1;
|
|
// Join the outgoing bundle with the ingoing bundles of all successors.
|
|
for (const MachineBasicBlock *Succ : MBB.successors())
|
|
EC.join(OutE, 2 * Succ->getNumber());
|
|
}
|
|
EC.compress();
|
|
if (ViewEdgeBundles)
|
|
view();
|
|
|
|
// Compute the reverse mapping.
|
|
Blocks.clear();
|
|
Blocks.resize(getNumBundles());
|
|
|
|
for (unsigned i = 0, e = MF->getNumBlockIDs(); i != e; ++i) {
|
|
unsigned b0 = getBundle(i, false);
|
|
unsigned b1 = getBundle(i, true);
|
|
Blocks[b0].push_back(i);
|
|
if (b1 != b0)
|
|
Blocks[b1].push_back(i);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
namespace llvm {
|
|
|
|
/// Specialize WriteGraph, the standard implementation won't work.
|
|
template<>
|
|
raw_ostream &WriteGraph<>(raw_ostream &O, const EdgeBundles &G,
|
|
bool ShortNames,
|
|
const Twine &Title) {
|
|
const MachineFunction *MF = G.getMachineFunction();
|
|
|
|
O << "digraph {\n";
|
|
for (const auto &MBB : *MF) {
|
|
unsigned BB = MBB.getNumber();
|
|
O << "\t\"" << printMBBReference(MBB) << "\" [ shape=box ]\n"
|
|
<< '\t' << G.getBundle(BB, false) << " -> \"" << printMBBReference(MBB)
|
|
<< "\"\n"
|
|
<< "\t\"" << printMBBReference(MBB) << "\" -> " << G.getBundle(BB, true)
|
|
<< '\n';
|
|
for (const MachineBasicBlock *Succ : MBB.successors())
|
|
O << "\t\"" << printMBBReference(MBB) << "\" -> \""
|
|
<< printMBBReference(*Succ) << "\" [ color=lightgray ]\n";
|
|
}
|
|
O << "}\n";
|
|
return O;
|
|
}
|
|
|
|
} // end namespace llvm
|
|
|
|
/// view - Visualize the annotated bipartite CFG with Graphviz.
|
|
void EdgeBundles::view() const {
|
|
ViewGraph(*this, "EdgeBundles");
|
|
}
|