mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216025 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			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
 |