mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Summary: This fixes a long standing issue where we would emit many little .text sections and only one .pdata and .xdata section. Now we generate one .pdata / .xdata pair per .text section and associate them correctly. Fixes PR19667. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5181 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217176 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- MCWinEH.h - Windows Unwinding Support --------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_MC_MCWINEH_H
 | |
| #define LLVM_MC_MCWINEH_H
 | |
| 
 | |
| #include <vector>
 | |
| 
 | |
| namespace llvm {
 | |
| class MCContext;
 | |
| class MCSection;
 | |
| class MCStreamer;
 | |
| class MCSymbol;
 | |
| class StringRef;
 | |
| 
 | |
| namespace WinEH {
 | |
| struct Instruction {
 | |
|   const MCSymbol *Label;
 | |
|   const unsigned Offset;
 | |
|   const unsigned Register;
 | |
|   const unsigned Operation;
 | |
| 
 | |
|   Instruction(unsigned Op, MCSymbol *L, unsigned Reg, unsigned Off)
 | |
|     : Label(L), Offset(Off), Register(Reg), Operation(Op) {}
 | |
| };
 | |
| 
 | |
| struct FrameInfo {
 | |
|   const MCSymbol *Begin;
 | |
|   const MCSymbol *End;
 | |
|   const MCSymbol *ExceptionHandler;
 | |
|   const MCSymbol *Function;
 | |
|   const MCSymbol *PrologEnd;
 | |
|   const MCSymbol *Symbol;
 | |
| 
 | |
|   bool HandlesUnwind;
 | |
|   bool HandlesExceptions;
 | |
| 
 | |
|   int LastFrameInst;
 | |
|   const FrameInfo *ChainedParent;
 | |
|   std::vector<Instruction> Instructions;
 | |
| 
 | |
|   FrameInfo()
 | |
|     : Begin(nullptr), End(nullptr), ExceptionHandler(nullptr),
 | |
|       Function(nullptr), PrologEnd(nullptr), Symbol(nullptr),
 | |
|       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
 | |
|       ChainedParent(nullptr), Instructions() {}
 | |
|   FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel)
 | |
|     : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr),
 | |
|       Function(Function), PrologEnd(nullptr), Symbol(nullptr),
 | |
|       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
 | |
|       ChainedParent(nullptr), Instructions() {}
 | |
|   FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel,
 | |
|             const FrameInfo *ChainedParent)
 | |
|     : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr),
 | |
|       Function(Function), PrologEnd(nullptr), Symbol(nullptr),
 | |
|       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
 | |
|       ChainedParent(ChainedParent), Instructions() {}
 | |
| };
 | |
| 
 | |
| class UnwindEmitter {
 | |
| public:
 | |
|   static const MCSection *getPDataSection(const MCSymbol *Function,
 | |
|                                           MCContext &Context);
 | |
|   static const MCSection *getXDataSection(const MCSymbol *Function,
 | |
|                                           MCContext &Context);
 | |
| 
 | |
|   virtual ~UnwindEmitter() { }
 | |
| 
 | |
|   //
 | |
|   // This emits the unwind info sections (.pdata and .xdata in PE/COFF).
 | |
|   //
 | |
|   virtual void Emit(MCStreamer &Streamer) const = 0;
 | |
|   virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0;
 | |
| };
 | |
| }
 | |
| }
 | |
| 
 | |
| #endif
 |