mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
56ea569496
Implement `uselistorder` and `uselistorder_bb` assembly directives, which allow the use-list order to be recovered when round-tripping to assembly. This is the bulk of PR20515. llvm-svn: 216025
130 lines
3.9 KiB
C++
130 lines
3.9 KiB
C++
//===-- llvm/IR/AsmWriter.h - Printing LLVM IR as an assembly file - C++ --===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This files defines the interface for the AssemblyWriter class used to print
|
|
// LLVM IR and various helper classes that are used in printing.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_IR_ASMWRITER_H
|
|
#define LLVM_LIB_IR_ASMWRITER_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/SetVector.h"
|
|
#include "llvm/IR/Attributes.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/IR/TypeFinder.h"
|
|
#include "llvm/IR/UseListOrder.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
|
|
namespace llvm {
|
|
|
|
class BasicBlock;
|
|
class Function;
|
|
class GlobalValue;
|
|
class Comdat;
|
|
class Module;
|
|
class NamedMDNode;
|
|
class Value;
|
|
class SlotTracker;
|
|
|
|
/// Create a new SlotTracker for a Module
|
|
SlotTracker *createSlotTracker(const Module *M);
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// TypePrinting Class: Type printing machinery
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
class TypePrinting {
|
|
TypePrinting(const TypePrinting &) LLVM_DELETED_FUNCTION;
|
|
void operator=(const TypePrinting&) LLVM_DELETED_FUNCTION;
|
|
public:
|
|
|
|
/// NamedTypes - The named types that are used by the current module.
|
|
TypeFinder NamedTypes;
|
|
|
|
/// NumberedTypes - The numbered types, along with their value.
|
|
DenseMap<StructType*, unsigned> NumberedTypes;
|
|
|
|
|
|
TypePrinting() {}
|
|
~TypePrinting() {}
|
|
|
|
void incorporateTypes(const Module &M);
|
|
|
|
void print(Type *Ty, raw_ostream &OS);
|
|
|
|
void printStructBody(StructType *Ty, raw_ostream &OS);
|
|
};
|
|
|
|
class AssemblyWriter {
|
|
protected:
|
|
formatted_raw_ostream &Out;
|
|
const Module *TheModule;
|
|
|
|
private:
|
|
std::unique_ptr<SlotTracker> ModuleSlotTracker;
|
|
SlotTracker &Machine;
|
|
TypePrinting TypePrinter;
|
|
AssemblyAnnotationWriter *AnnotationWriter;
|
|
SetVector<const Comdat *> Comdats;
|
|
UseListOrderStack UseListOrders;
|
|
|
|
public:
|
|
/// Construct an AssemblyWriter with an external SlotTracker
|
|
AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
|
|
const Module *M, AssemblyAnnotationWriter *AAW);
|
|
|
|
/// Construct an AssemblyWriter with an internally allocated SlotTracker
|
|
AssemblyWriter(formatted_raw_ostream &o, const Module *M,
|
|
AssemblyAnnotationWriter *AAW);
|
|
|
|
virtual ~AssemblyWriter();
|
|
|
|
void printMDNodeBody(const MDNode *MD);
|
|
void printNamedMDNode(const NamedMDNode *NMD);
|
|
|
|
void printModule(const Module *M);
|
|
|
|
void writeOperand(const Value *Op, bool PrintType);
|
|
void writeParamOperand(const Value *Operand, AttributeSet Attrs,unsigned Idx);
|
|
void writeAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope);
|
|
void writeAtomicCmpXchg(AtomicOrdering SuccessOrdering,
|
|
AtomicOrdering FailureOrdering,
|
|
SynchronizationScope SynchScope);
|
|
|
|
void writeAllMDNodes();
|
|
void writeMDNode(unsigned Slot, const MDNode *Node);
|
|
void writeAllAttributeGroups();
|
|
|
|
void printTypeIdentities();
|
|
void printGlobal(const GlobalVariable *GV);
|
|
void printAlias(const GlobalAlias *GV);
|
|
void printComdat(const Comdat *C);
|
|
void printFunction(const Function *F);
|
|
void printArgument(const Argument *FA, AttributeSet Attrs, unsigned Idx);
|
|
void printBasicBlock(const BasicBlock *BB);
|
|
void printInstructionLine(const Instruction &I);
|
|
void printInstruction(const Instruction &I);
|
|
|
|
void printUseListOrder(const UseListOrder &Order);
|
|
void printUseLists(const Function *F);
|
|
|
|
private:
|
|
void init();
|
|
|
|
// printInfoComment - Print a little comment after the instruction indicating
|
|
// which slot it occupies.
|
|
void printInfoComment(const Value &V);
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|