bfd/ChangeLog
2009-04-21 Kai Tietz <kai.tietz@onevision.com> * coff-x86_64.c (PEI_HEADERS): Protect includes. (bfd_pe_print_pdata): Remove #ifdef PE variation. * pei-x86_64.c (PEI_HEADERS): Define to prevent double include in coff-x86_64.c of headers. (PDATA_ROW_SIZE): New define. (pex_regs[]): New static array. (pex64_get_runtime_function): New static function. (pex64_get_unwind_info): Likewise. (pex64_get_scope_entry): Likewise. (pex64_xdata_print_uwd_codes): Likewise. (pep_get_section_by_rva): Likewise. (pex64_dump_xdata): Likewise. (pex64_bfd_print_pdata): Likewise. (bfd_pe_print_pdata): Define as pex64_bfd_print_pdata. * peXXigen.c (_bfd_pex64_print_pdata): Removed implementation. * libpei.h (_bfd_pex64_print_pdata): Removed declaration. include/ChangeLog 2009-04-21 Kai Tietz <kai.tietz@onevision.com> * coff/pe.h (pex64_runtime_function): New structure. (external_pex64_runtime_function): Likewise. (pex64_unwind_code): Likewise. (external_pex64_unwind_code): Likewise. (pex64_unwind_info): Likewise. (external_pex64_unwind_info): Likewise. (external_pex64_scope): Likewise. (pex64_scope): Likewise. (pex64_scope_entry): Likewise. (external_pex64_scope_entry): Likewise. (PEX64_IS_RUNTIME_FUNCTION_CHAINED): New macro. (PEX64_GET_UNWINDDATA_UNIFIED_RVA): Likewise. (PEX64_UNWCODE_CODE): Likewise. (PEX64_UNWCODE_INFO): Likewise. (UWOP_...): Add defines for unwind code. (UNW_FLAG_...): Add defined for unwind info flags. (PEX64_SCOPE_ENTRY_SIZE): New macro. (PEX64_UWI_VERSION): Likewise. (PEX64_UWI_FLAGS): Likewise. (PEX64_UWI_FRAMEREG): Likewise. (PEX64_UWI_FRAMEOFF): Likewise. (PEX64_UWI_SIZEOF_UWCODE_ARRAY): Likewise. (PEX64_OFFSET_TO_UNWIND_CODE): Likewise. (PEX64_OFFSET_TO_HANDLER_RVA): Likewise. (PEX64_OFFSET_TO_SCOPE_COUNT): Likewise. (PEX64_SCOPE_ENTRY): Likewise.
This commit is contained in:
		| @@ -1,3 +1,32 @@ | ||||
| 2009-04-21  Kai Tietz  <kai.tietz@onevision.com> | ||||
|  | ||||
| 	* coff/pe.h (pex64_runtime_function): New structure. | ||||
| 	(external_pex64_runtime_function): Likewise. | ||||
| 	(pex64_unwind_code): Likewise. | ||||
| 	(external_pex64_unwind_code): Likewise. | ||||
| 	(pex64_unwind_info): Likewise. | ||||
| 	(external_pex64_unwind_info): Likewise. | ||||
| 	(external_pex64_scope): Likewise. | ||||
| 	(pex64_scope): Likewise. | ||||
| 	(pex64_scope_entry):  Likewise. | ||||
| 	(external_pex64_scope_entry): Likewise. | ||||
| 	(PEX64_IS_RUNTIME_FUNCTION_CHAINED): New macro. | ||||
| 	(PEX64_GET_UNWINDDATA_UNIFIED_RVA): Likewise. | ||||
| 	(PEX64_UNWCODE_CODE): Likewise. | ||||
| 	(PEX64_UNWCODE_INFO): Likewise. | ||||
| 	(UWOP_...): Add defines for unwind code. | ||||
| 	(UNW_FLAG_...): Add defined for unwind info flags. | ||||
| 	(PEX64_SCOPE_ENTRY_SIZE): New macro. | ||||
| 	(PEX64_UWI_VERSION): Likewise. | ||||
| 	(PEX64_UWI_FLAGS): Likewise. | ||||
| 	(PEX64_UWI_FRAMEREG): Likewise. | ||||
| 	(PEX64_UWI_FRAMEOFF): Likewise. | ||||
| 	(PEX64_UWI_SIZEOF_UWCODE_ARRAY): Likewise. | ||||
| 	(PEX64_OFFSET_TO_UNWIND_CODE): Likewise. | ||||
| 	(PEX64_OFFSET_TO_HANDLER_RVA): Likewise. | ||||
| 	(PEX64_OFFSET_TO_SCOPE_COUNT): Likewise. | ||||
| 	(PEX64_SCOPE_ENTRY): Likewise. | ||||
|  | ||||
| 2009-04-08  H.J. Lu  <hongjiu.lu@intel.com> | ||||
|  | ||||
| 	* bfdlink.h (bfd_link_info): Add warn_alternate_em. | ||||
|   | ||||
| @@ -358,4 +358,154 @@ typedef struct | ||||
| #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY	2 | ||||
| #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS		3 | ||||
|  | ||||
| /* .pdata/.xdata defines and structures for x64 PE+ for exception handling.  */ | ||||
|  | ||||
| /* .pdata in exception directory.  */ | ||||
|  | ||||
| struct pex64_runtime_function | ||||
| { | ||||
|   bfd_vma rva_BeginAddress; | ||||
|   bfd_vma rva_EndAddress; | ||||
|   bfd_vma rva_UnwindData; | ||||
|   unsigned int isChained : 1; | ||||
| }; | ||||
|  | ||||
| struct external_pex64_runtime_function | ||||
| { | ||||
|   bfd_byte rva_BeginAddress[4]; | ||||
|   bfd_byte rva_EndAddress[4]; | ||||
|   bfd_byte rva_UnwindData[4]; | ||||
| }; | ||||
|  | ||||
| /* If the lowest significant bit is set for rva_UnwindData RVA, it | ||||
|    means that the unified RVA points to another pex64_runtime_function | ||||
|    that this entry shares the unwind_info block with.  */ | ||||
| #define PEX64_IS_RUNTIME_FUNCTION_CHAINED(PTR_RTF) \ | ||||
|   (((PTR_RTF)->rva_UnwindData & 1) != 0) | ||||
| #define PEX64_GET_UNWINDDATA_UNIFIED_RVA(PTR_RTF) \ | ||||
|   ((PTR_RTF)->rva_UnwindData & ~1) | ||||
|  | ||||
| /* The unwind codes.  */ | ||||
| #define UWOP_PUSH_NONVOL      0 | ||||
| #define UWOP_ALLOC_LARGE      1 | ||||
| #define UWOP_ALLOC_SMALL      2 | ||||
| #define UWOP_SET_FPREG	      3 | ||||
| #define UWOP_SAVE_NONVOL      4 | ||||
| #define UWOP_SAVE_NONVOL_FAR  5 | ||||
| #define UWOP_SAVE_XMM	      6 | ||||
| #define UWOP_SAVE_XMM_FAR     7 | ||||
| #define UWOP_SAVE_XMM128      8 | ||||
| #define UWOP_SAVE_XMM128_FAR  9 | ||||
| #define UWOP_PUSH_MACHFRAME   10 | ||||
|  | ||||
| struct pex64_unwind_code | ||||
| { | ||||
|   bfd_vma prologue_offset; | ||||
|   /* Contains Frame offset, or frame allocation size.  */ | ||||
|   bfd_vma frame_addr; | ||||
|   unsigned int uwop_code : 4; | ||||
|   /* xmm, mm, or standard register from 0 - 15.  */ | ||||
|   unsigned int reg : 4; | ||||
|   /* Used for UWOP_PUSH_MACHFRAME to indicate optional errorcode stack | ||||
|      argument.  */ | ||||
|   unsigned int has_errorcode : 1; | ||||
| }; | ||||
|  | ||||
| struct external_pex64_unwind_code | ||||
| { | ||||
|   bfd_byte dta[2]; | ||||
| }; | ||||
|  | ||||
| #define PEX64_UNWCODE_CODE(VAL)	((VAL) & 0xf) | ||||
| #define PEX64_UNWCODE_INFO(VAL) (((VAL) >> 4) & 0xf) | ||||
|  | ||||
| /* The unwind info.  */ | ||||
| #define UNW_FLAG_NHANDLER     0 | ||||
| #define UNW_FLAG_EHANDLER     1 | ||||
| #define UNW_FLAG_UHANDLER     2 | ||||
| #define UNW_FLAG_FHANDLER     3 | ||||
| #define UNW_FLAG_CHAININFO    4 | ||||
|  | ||||
| #define UNW_FLAG_MASK	      0x1f | ||||
|  | ||||
| struct pex64_unwind_info | ||||
| { | ||||
|   bfd_vma SizeOfBlock; | ||||
|   bfd_byte Version; /* Values from 0 up to 7 are possible.  */ | ||||
|   bfd_byte Flags; /* Values from 0 up to 31 are possible.  */ | ||||
|   bfd_vma SizeOfPrologue; | ||||
|   bfd_vma CountOfCodes; /* Amount of pex64_unwind_code elements.  */ | ||||
|   /* 0 = CFA, 1..15 are index of integer registers.  */ | ||||
|   unsigned int FrameRegister : 4; | ||||
|   bfd_vma FrameOffset; | ||||
|   bfd_vma sizeofUnwindCodes; | ||||
|   bfd_byte *rawUnwindCodes; | ||||
|   /* Valid for UNW_FLAG_EHANDLER and UNW_FLAG_UHANDLER.  */ | ||||
|   bfd_vma CountOfScopes; | ||||
|   bfd_byte *rawScopeEntries; | ||||
|   bfd_vma rva_ExceptionHandler; /* UNW_EHANDLER.  */ | ||||
|   bfd_vma rva_TerminationHandler; /* UNW_FLAG_UHANDLER.  */ | ||||
|   bfd_vma rva_FrameHandler; /* UNW_FLAG_FHANDLER.  */ | ||||
|   bfd_vma FrameHandlerArgument; /* UNW_FLAG_FHANDLER.  */ | ||||
|   bfd_vma rva_FunctionEntry; /* UNW_FLAG_CHAININFO.  */ | ||||
| }; | ||||
|  | ||||
| struct external_pex64_unwind_info | ||||
| { | ||||
|   bfd_byte Version_Flags; | ||||
|   bfd_byte SizeOfPrologue; | ||||
|   bfd_byte CountOfCodes; | ||||
|   bfd_byte FrameRegisterOffset; | ||||
|   /* external_pex64_unwind_code array.  */ | ||||
|   /* bfd_byte handler[4];  */ | ||||
|   /* Optional language specific data.  */ | ||||
| }; | ||||
|  | ||||
| struct external_pex64_scope | ||||
| { | ||||
|   bfd_vma Count; | ||||
| }; | ||||
|  | ||||
| struct pex64_scope | ||||
| { | ||||
|   bfd_byte Count[4]; | ||||
| }; | ||||
|  | ||||
| struct pex64_scope_entry | ||||
| { | ||||
|   bfd_vma rva_BeginAddress; | ||||
|   bfd_vma rva_EndAddress; | ||||
|   bfd_vma rva_HandlerAddress; | ||||
|   bfd_vma rva_JumpAddress; | ||||
| }; | ||||
| #define PEX64_SCOPE_ENTRY_SIZE	16 | ||||
|  | ||||
| struct external_pex64_scope_entry | ||||
| { | ||||
|   bfd_byte rva_BeginAddress[4]; | ||||
|   bfd_byte rva_EndAddress[4]; | ||||
|   bfd_byte rva_HandlerAddress[4]; | ||||
|   bfd_byte rva_JumpAddress[4]; | ||||
| }; | ||||
|  | ||||
| #define PEX64_UWI_VERSION(VAL)	((VAL) & 7) | ||||
| #define PEX64_UWI_FLAGS(VAL)	(((VAL) >> 3) & 0x1f) | ||||
| #define PEX64_UWI_FRAMEREG(VAL)	((VAL) & 0xf) | ||||
| #define PEX64_UWI_FRAMEOFF(VAL)	(((VAL) >> 4) & 0xf) | ||||
| #define PEX64_UWI_SIZEOF_UWCODE_ARRAY(VAL) \ | ||||
|   ((((VAL) + 1) & ~1) * 2) | ||||
|  | ||||
| #define PEX64_OFFSET_TO_UNWIND_CODE 0x4 | ||||
|  | ||||
| #define PEX64_OFFSET_TO_HANDLER_RVA (COUNTOFUNWINDCODES) \ | ||||
|   (PEX64_OFFSET_TO_UNWIND_CODE + \ | ||||
|    PEX64_UWI_SIZEOF_UWCODE_ARRAY(COUNTOFUNWINDCODES)) | ||||
|  | ||||
| #define PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) \ | ||||
|   (PEX64_OFFSET_TO_HANDLER_RVA(COUNTOFUNWINDCODES) + 4) | ||||
|  | ||||
| #define PEX64_SCOPE_ENTRY(COUNTOFUNWINDCODES, IDX) \ | ||||
|   (PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) + \ | ||||
|    PEX64_SCOPE_ENTRY_SIZE * (IDX)) | ||||
|  | ||||
| #endif /* _PE_H */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user