[llvm] r234185 - For llvm-objdump added support for printing Objc2 32-bit runtime meta data

Kevin Enderby enderby at apple.com
Mon Apr 6 10:47:03 PDT 2015


Author: enderby
Date: Mon Apr  6 12:47:03 2015
New Revision: 234185

URL: http://llvm.org/viewvc/llvm-project?rev=234185&view=rev
Log:
For llvm-objdump added support for printing Objc2 32-bit runtime meta data
with the existing -objc-meta-data and -macho options for Mach-O files.

Added:
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.exe.macho-i386   (with props)
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.obj.macho-i386   (with props)
Modified:
    llvm/trunk/test/tools/llvm-objdump/X86/macho-objc-meta-data.test
    llvm/trunk/tools/llvm-objdump/MachODump.cpp

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.exe.macho-i386
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.exe.macho-i386?rev=234185&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.exe.macho-i386
------------------------------------------------------------------------------
    svn:executable = *

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.exe.macho-i386
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.obj.macho-i386
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.obj.macho-i386?rev=234185&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.obj.macho-i386
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: llvm/trunk/test/tools/llvm-objdump/X86/macho-objc-meta-data.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/macho-objc-meta-data.test?rev=234185&r1=234184&r2=234185&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/macho-objc-meta-data.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/X86/macho-objc-meta-data.test Mon Apr  6 12:47:03 2015
@@ -1,5 +1,7 @@
 # RUN: llvm-objdump -m -objc-meta-data %p/Inputs/Objc2.64bit.exe.macho-x86_64 | FileCheck %s -check-prefix=OBJC2_64BIT_EXE
 # RUN: llvm-objdump -m -objc-meta-data %p/Inputs/Objc2.64bit.obj.macho-x86_64 | FileCheck %s -check-prefix=OBJC2_64BIT_OBJ
+# RUN: llvm-objdump -m -objc-meta-data %p/Inputs/Objc2.32bit.exe.macho-i386 | FileCheck %s -check-prefix=OBJC2_32BIT_EXE
+# RUN: llvm-objdump -m -objc-meta-data %p/Inputs/Objc2.32bit.obj.macho-i386 | FileCheck %s -check-prefix=OBJC2_32BIT_OBJ
 
 OBJC2_64BIT_EXE: Contents of (__DATA,__objc_classlist) section
 OBJC2_64BIT_EXE: 0000000100002028 0x1000029f0
@@ -204,3 +206,411 @@ OBJC2_64BIT_OBJ: 0000000000001aa8 0x1a50
 OBJC2_64BIT_OBJ: Contents of (__DATA,__objc_imageinfo) section
 OBJC2_64BIT_OBJ:   version 0
 OBJC2_64BIT_OBJ:     flags 0x0
+
+OBJC2_32BIT_EXE: Objective-C segment
+OBJC2_32BIT_EXE: Contents of (__DATA,__objc_classlist) section
+OBJC2_32BIT_EXE: 00006068 0x6a84
+OBJC2_32BIT_EXE:            isa 0x6a70
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x66e0 (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x184 RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 4
+OBJC2_32BIT_EXE:              instanceSize 8
+OBJC2_32BIT_EXE:                ivarLayout 0x52c2
+OBJC2_32BIT_EXE:                 layout map: 0x01 
+OBJC2_32BIT_EXE:                      name 0x5279 AppDelegate
+OBJC2_32BIT_EXE:               baseMethods 0x6614 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		   entsize 12
+OBJC2_32BIT_EXE: 		     count 10
+OBJC2_32BIT_EXE: 		      name 0x454c application:didFinishLaunchingWithOptions:
+OBJC2_32BIT_EXE: 		     types 0x562b c16 at 0:4 at 8@12
+OBJC2_32BIT_EXE: 		       imp 0x23c0
+OBJC2_32BIT_EXE: 		      name 0x4593 applicationWillResignActive:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x25f0
+OBJC2_32BIT_EXE: 		      name 0x4a6a applicationDidEnterBackground:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x2640
+OBJC2_32BIT_EXE: 		      name 0x4a89 applicationWillEnterForeground:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x2690
+OBJC2_32BIT_EXE: 		      name 0x4577 applicationDidBecomeActive:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x26e0
+OBJC2_32BIT_EXE: 		      name 0x463e applicationWillTerminate:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x2730
+OBJC2_32BIT_EXE: 		      name 0x42da splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
+OBJC2_32BIT_EXE: 		     types 0x5351 c20 at 0:4 at 8@12 at 16
+OBJC2_32BIT_EXE: 		       imp 0x2780
+OBJC2_32BIT_EXE: 		      name 0x4e21 .cxx_destruct
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x2a70
+OBJC2_32BIT_EXE: 		      name 0x40fc window
+OBJC2_32BIT_EXE: 		     types 0x5c80 @8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x2a00
+OBJC2_32BIT_EXE: 		      name 0x4d1a setWindow:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x2a30
+OBJC2_32BIT_EXE:             baseProtocols 0x65dc
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 		      list[0] 0x6ae8 (struct protocol_t *)
+OBJC2_32BIT_EXE: 			      isa 0x0
+OBJC2_32BIT_EXE: 			     name 0x5285 UISplitViewControllerDelegate
+OBJC2_32BIT_EXE: 			protocols 0x0
+OBJC2_32BIT_EXE: 		  instanceMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		     classMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 	  optionalInstanceMethods 0x6088
+OBJC2_32BIT_EXE: 	     optionalClassMethods 0x0
+OBJC2_32BIT_EXE: 	       instanceProperties 0x0
+OBJC2_32BIT_EXE: 		      list[1] 0x6b40 (struct protocol_t *)
+OBJC2_32BIT_EXE: 			      isa 0x0
+OBJC2_32BIT_EXE: 			     name 0x52a3 UIApplicationDelegate
+OBJC2_32BIT_EXE: 			protocols 0x62e8
+OBJC2_32BIT_EXE: 		  instanceMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		     classMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 	  optionalInstanceMethods 0x62f4
+OBJC2_32BIT_EXE: 	     optionalClassMethods 0x0
+OBJC2_32BIT_EXE: 	       instanceProperties 0x6518
+OBJC2_32BIT_EXE:                     ivars 0x6694
+OBJC2_32BIT_EXE:                     entsize 20
+OBJC2_32BIT_EXE:                       count 1
+OBJC2_32BIT_EXE: 			   offset 0x6a5c 4
+OBJC2_32BIT_EXE: 			     name 0x4e2f _window
+OBJC2_32BIT_EXE: 			     type 0x5d4b @"UIWindow"
+OBJC2_32BIT_EXE: 			alignment 2
+OBJC2_32BIT_EXE: 			     size 4
+OBJC2_32BIT_EXE:            weakIvarLayout 0x0
+OBJC2_32BIT_EXE:            baseProperties 0x66b0
+OBJC2_32BIT_EXE:                     entsize 8
+OBJC2_32BIT_EXE:                       count 5
+OBJC2_32BIT_EXE: 			     name 0x5df3 window
+OBJC2_32BIT_EXE: 			attributes 0x5e0b T@"UIWindow",&,N,V_window
+OBJC2_32BIT_EXE: 			     name 0x5dab hash
+OBJC2_32BIT_EXE: 			attributes 0x5db0 TI,R
+OBJC2_32BIT_EXE: 			     name 0x5db5 superclass
+OBJC2_32BIT_EXE: 			attributes 0x5dc0 T#,R
+OBJC2_32BIT_EXE: 			     name 0x5dc5 description
+OBJC2_32BIT_EXE: 			attributes 0x5dd1 T@"NSString",R,C
+OBJC2_32BIT_EXE: 			     name 0x5de2 debugDescription
+OBJC2_32BIT_EXE: 			attributes 0x5dd1 T@"NSString",R,C
+OBJC2_32BIT_EXE: Meta Class
+OBJC2_32BIT_EXE:            isa 0x0
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x65ec (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x185 RO_META RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 20
+OBJC2_32BIT_EXE:              instanceSize 20
+OBJC2_32BIT_EXE:                ivarLayout 0x0
+OBJC2_32BIT_EXE:                      name 0x5279 AppDelegate
+OBJC2_32BIT_EXE:               baseMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE:             baseProtocols 0x65dc
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 		      list[0] 0x6ae8 (struct protocol_t *)
+OBJC2_32BIT_EXE: 			      isa 0x0
+OBJC2_32BIT_EXE: 			     name 0x5285 UISplitViewControllerDelegate
+OBJC2_32BIT_EXE: 			protocols 0x0
+OBJC2_32BIT_EXE: 		  instanceMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		     classMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 	  optionalInstanceMethods 0x6088
+OBJC2_32BIT_EXE: 	     optionalClassMethods 0x0
+OBJC2_32BIT_EXE: 	       instanceProperties 0x0
+OBJC2_32BIT_EXE: 		      list[1] 0x6b40 (struct protocol_t *)
+OBJC2_32BIT_EXE: 			      isa 0x0
+OBJC2_32BIT_EXE: 			     name 0x52a3 UIApplicationDelegate
+OBJC2_32BIT_EXE: 			protocols 0x62e8
+OBJC2_32BIT_EXE: 		  instanceMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		     classMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE: 	  optionalInstanceMethods 0x62f4
+OBJC2_32BIT_EXE: 	     optionalClassMethods 0x0
+OBJC2_32BIT_EXE: 	       instanceProperties 0x6518
+OBJC2_32BIT_EXE:                     ivars 0x0
+OBJC2_32BIT_EXE:            weakIvarLayout 0x0
+OBJC2_32BIT_EXE:            baseProperties 0x0
+OBJC2_32BIT_EXE: 0000606c 0x6a98
+OBJC2_32BIT_EXE:            isa 0x6aac
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x6838 (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x184 RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 4
+OBJC2_32BIT_EXE:              instanceSize 12
+OBJC2_32BIT_EXE:                ivarLayout 0x52d9
+OBJC2_32BIT_EXE:                 layout map: 0x02 
+OBJC2_32BIT_EXE:                      name 0x52c4 MasterViewController
+OBJC2_32BIT_EXE:               baseMethods 0x6730 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		   entsize 12
+OBJC2_32BIT_EXE: 		     count 15
+OBJC2_32BIT_EXE: 		      name 0x4e37 awakeFromNib
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x2ab0
+OBJC2_32BIT_EXE: 		      name 0x4ea2 viewDidLoad
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x2c20
+OBJC2_32BIT_EXE: 		      name 0x4f43 didReceiveMemoryWarning
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x2e80
+OBJC2_32BIT_EXE: 		      name 0x4ec3 insertNewObject:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x2ed0
+OBJC2_32BIT_EXE: 		      name 0x5119 prepareForSegue:sender:
+OBJC2_32BIT_EXE: 		     types 0x57b1 v16 at 0:4 at 8@12
+OBJC2_32BIT_EXE: 		       imp 0x3160
+OBJC2_32BIT_EXE: 		      name 0x5131 numberOfSectionsInTableView:
+OBJC2_32BIT_EXE: 		     types 0x5326 i12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x34c0
+OBJC2_32BIT_EXE: 		      name 0x514e tableView:numberOfRowsInSection:
+OBJC2_32BIT_EXE: 		     types 0x5d57 i16 at 0:4 at 8i12
+OBJC2_32BIT_EXE: 		       imp 0x3520
+OBJC2_32BIT_EXE: 		      name 0x516f tableView:cellForRowAtIndexPath:
+OBJC2_32BIT_EXE: 		     types 0x5422 @16 at 0:4 at 8@12
+OBJC2_32BIT_EXE: 		       imp 0x35e0
+OBJC2_32BIT_EXE: 		      name 0x5190 tableView:canEditRowAtIndexPath:
+OBJC2_32BIT_EXE: 		     types 0x562b c16 at 0:4 at 8@12
+OBJC2_32BIT_EXE: 		       imp 0x37e0
+OBJC2_32BIT_EXE: 		      name 0x51b1 tableView:commitEditingStyle:forRowAtIndexPath:
+OBJC2_32BIT_EXE: 		     types 0x5d64 v20 at 0:4 at 8i12@16
+OBJC2_32BIT_EXE: 		       imp 0x3880
+OBJC2_32BIT_EXE: 		      name 0x4e21 .cxx_destruct
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3b40
+OBJC2_32BIT_EXE: 		      name 0x51e1 detailViewController
+OBJC2_32BIT_EXE: 		     types 0x5c80 @8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3a30
+OBJC2_32BIT_EXE: 		      name 0x4f2a setDetailViewController:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x3a60
+OBJC2_32BIT_EXE: 		      name 0x4f5b objects
+OBJC2_32BIT_EXE: 		     types 0x5c80 @8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3aa0
+OBJC2_32BIT_EXE: 		      name 0x4f68 setObjects:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x3af0
+OBJC2_32BIT_EXE:             baseProtocols 0x0
+OBJC2_32BIT_EXE:                     ivars 0x67ec
+OBJC2_32BIT_EXE:                     entsize 20
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 			   offset 0x6a60 4
+OBJC2_32BIT_EXE: 			     name 0x51f6 _detailViewController
+OBJC2_32BIT_EXE: 			     type 0x5d74 @"DetailViewController"
+OBJC2_32BIT_EXE: 			alignment 2
+OBJC2_32BIT_EXE: 			     size 4
+OBJC2_32BIT_EXE: 			   offset 0x6a64 8
+OBJC2_32BIT_EXE: 			     name 0x520c _objects
+OBJC2_32BIT_EXE: 			     type 0x5d8c @"NSMutableArray"
+OBJC2_32BIT_EXE: 			alignment 2
+OBJC2_32BIT_EXE: 			     size 4
+OBJC2_32BIT_EXE:            weakIvarLayout 0x0
+OBJC2_32BIT_EXE:            baseProperties 0x6820
+OBJC2_32BIT_EXE:                     entsize 8
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 			     name 0x5e35 detailViewController
+OBJC2_32BIT_EXE: 			attributes 0x5e4a T@"DetailViewController",&,N,V_detailViewController
+OBJC2_32BIT_EXE: 			     name 0x5e7e objects
+OBJC2_32BIT_EXE: 			attributes 0x5e86 T@"NSMutableArray",&,V_objects
+OBJC2_32BIT_EXE: Meta Class
+OBJC2_32BIT_EXE:            isa 0x0
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x6708 (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x185 RO_META RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 20
+OBJC2_32BIT_EXE:              instanceSize 20
+OBJC2_32BIT_EXE:                ivarLayout 0x0
+OBJC2_32BIT_EXE:                      name 0x52c4 MasterViewController
+OBJC2_32BIT_EXE:               baseMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE:             baseProtocols 0x0
+OBJC2_32BIT_EXE:                     ivars 0x0
+OBJC2_32BIT_EXE:            weakIvarLayout 0x0
+OBJC2_32BIT_EXE:            baseProperties 0x0
+OBJC2_32BIT_EXE: 00006070 0x6ac0
+OBJC2_32BIT_EXE:            isa 0x6ad4
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x6938 (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x184 RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 4
+OBJC2_32BIT_EXE:              instanceSize 12
+OBJC2_32BIT_EXE:                ivarLayout 0x52f0
+OBJC2_32BIT_EXE:                 layout map: 0x01 0x10 
+OBJC2_32BIT_EXE:                      name 0x52db DetailViewController
+OBJC2_32BIT_EXE:               baseMethods 0x6888 (struct method_list_t *)
+OBJC2_32BIT_EXE: 		   entsize 12
+OBJC2_32BIT_EXE: 		     count 8
+OBJC2_32BIT_EXE: 		      name 0x5061 setDetailItem:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x3c70
+OBJC2_32BIT_EXE: 		      name 0x5215 configureView
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3d20
+OBJC2_32BIT_EXE: 		      name 0x4ea2 viewDidLoad
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3e20
+OBJC2_32BIT_EXE: 		      name 0x4f43 didReceiveMemoryWarning
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3e80
+OBJC2_32BIT_EXE: 		      name 0x4e21 .cxx_destruct
+OBJC2_32BIT_EXE: 		     types 0x5d44 v8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3f90
+OBJC2_32BIT_EXE: 		      name 0x41a0 detailItem
+OBJC2_32BIT_EXE: 		     types 0x5c80 @8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3ed0
+OBJC2_32BIT_EXE: 		      name 0x5223 detailDescriptionLabel
+OBJC2_32BIT_EXE: 		     types 0x5c80 @8 at 0:4
+OBJC2_32BIT_EXE: 		       imp 0x3f00
+OBJC2_32BIT_EXE: 		      name 0x523a setDetailDescriptionLabel:
+OBJC2_32BIT_EXE: 		     types 0x5608 v12 at 0:4 at 8
+OBJC2_32BIT_EXE: 		       imp 0x3f40
+OBJC2_32BIT_EXE:             baseProtocols 0x0
+OBJC2_32BIT_EXE:                     ivars 0x68f0
+OBJC2_32BIT_EXE:                     entsize 20
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 			   offset 0x6a68 4
+OBJC2_32BIT_EXE: 			     name 0x5255 _detailItem
+OBJC2_32BIT_EXE: 			     type 0x5d9e @
+OBJC2_32BIT_EXE: 			alignment 2
+OBJC2_32BIT_EXE: 			     size 4
+OBJC2_32BIT_EXE: 			   offset 0x6a6c 8
+OBJC2_32BIT_EXE: 			     name 0x5261 _detailDescriptionLabel
+OBJC2_32BIT_EXE: 			     type 0x5da0 @"UILabel"
+OBJC2_32BIT_EXE: 			alignment 2
+OBJC2_32BIT_EXE: 			     size 4
+OBJC2_32BIT_EXE:            weakIvarLayout 0x52f3
+OBJC2_32BIT_EXE:                 layout map: 0x11 
+OBJC2_32BIT_EXE:            baseProperties 0x6920
+OBJC2_32BIT_EXE:                     entsize 8
+OBJC2_32BIT_EXE:                       count 2
+OBJC2_32BIT_EXE: 			     name 0x5ea5 detailItem
+OBJC2_32BIT_EXE: 			attributes 0x5eb0 T@,&,N,V_detailItem
+OBJC2_32BIT_EXE: 			     name 0x5ec4 detailDescriptionLabel
+OBJC2_32BIT_EXE: 			attributes 0x5edb T@"UILabel",W,N,V_detailDescriptionLabel
+OBJC2_32BIT_EXE: Meta Class
+OBJC2_32BIT_EXE:            isa 0x0
+OBJC2_32BIT_EXE:     superclass 0x0
+OBJC2_32BIT_EXE:          cache 0x0
+OBJC2_32BIT_EXE:         vtable 0x0
+OBJC2_32BIT_EXE:           data 0x6860 (struct class_ro_t *)
+OBJC2_32BIT_EXE:                     flags 0x185 RO_META RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_EXE:             instanceStart 20
+OBJC2_32BIT_EXE:              instanceSize 20
+OBJC2_32BIT_EXE:                ivarLayout 0x0
+OBJC2_32BIT_EXE:                      name 0x52db DetailViewController
+OBJC2_32BIT_EXE:               baseMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_EXE:             baseProtocols 0x0
+OBJC2_32BIT_EXE:                     ivars 0x0
+OBJC2_32BIT_EXE:            weakIvarLayout 0x0
+OBJC2_32BIT_EXE:            baseProperties 0x0
+OBJC2_32BIT_EXE: Contents of (__DATA,__objc_classrefs) section
+OBJC2_32BIT_EXE: 00006a30 0x0
+OBJC2_32BIT_EXE: 00006a34 0x6ac0
+OBJC2_32BIT_EXE: 00006a38 0x0
+OBJC2_32BIT_EXE: 00006a3c 0x0
+OBJC2_32BIT_EXE: 00006a40 0x0
+OBJC2_32BIT_EXE: 00006a44 0x0
+OBJC2_32BIT_EXE: 00006a48 0x0
+OBJC2_32BIT_EXE: 00006a4c 0x0
+OBJC2_32BIT_EXE: 00006a50 0x6a84
+OBJC2_32BIT_EXE: Contents of (__DATA,__objc_superrefs) section
+OBJC2_32BIT_EXE: 00006a54 0x6a98
+OBJC2_32BIT_EXE: 00006a58 0x6ac0
+OBJC2_32BIT_EXE: Contents of (__DATA,__objc_protolist) section
+OBJC2_32BIT_EXE: 00006074 0x6ae8
+OBJC2_32BIT_EXE: 00006078 0x6b14
+OBJC2_32BIT_EXE: 0000607c 0x6b40
+OBJC2_32BIT_EXE: Contents of (__DATA,__objc_imageinfo) section
+OBJC2_32BIT_EXE:   version 0
+OBJC2_32BIT_EXE:     flags 0x20
+
+OBJC2_32BIT_OBJ: /Volumes/SandBox/llvm/test/tools/llvm-objdump/X86/Inputs/Objc2.32bit.obj.macho-i386:
+OBJC2_32BIT_OBJ: Objective-C segment
+OBJC2_32BIT_OBJ: Contents of (__DATA,__objc_classlist) section
+OBJC2_32BIT_OBJ: 00003ae4 0x3914 _OBJC_CLASS_$_DetailViewController
+OBJC2_32BIT_OBJ:            isa 0x3928 _OBJC_METACLASS_$_DetailViewController
+OBJC2_32BIT_OBJ:     superclass 0x0 _OBJC_CLASS_$_UIViewController
+OBJC2_32BIT_OBJ:          cache 0x0 __objc_empty_cache
+OBJC2_32BIT_OBJ:         vtable 0x0 -[DetailViewController setDetailItem:]
+OBJC2_32BIT_OBJ:           data 0x3a38 (struct class_ro_t *)
+OBJC2_32BIT_OBJ:                     flags 0x184 RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_OBJ:             instanceStart 4
+OBJC2_32BIT_OBJ:              instanceSize 12
+OBJC2_32BIT_OBJ:                ivarLayout 0x3955
+OBJC2_32BIT_OBJ:                 layout map: 0x01 0x10 
+OBJC2_32BIT_OBJ:                      name 0x3940 DetailViewController
+OBJC2_32BIT_OBJ:               baseMethods 0x3988 (struct method_list_t *)
+OBJC2_32BIT_OBJ: 		   entsize 12
+OBJC2_32BIT_OBJ: 		     count 8
+OBJC2_32BIT_OBJ: 		      name 0x3899 setDetailItem:
+OBJC2_32BIT_OBJ: 		     types 0x3a60 v12 at 0:4 at 8
+OBJC2_32BIT_OBJ: 		       imp 0x0 -[DetailViewController setDetailItem:]
+OBJC2_32BIT_OBJ: 		      name 0x3830 configureView
+OBJC2_32BIT_OBJ: 		     types 0x3a6a v8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0xb0 -[DetailViewController configureView]
+OBJC2_32BIT_OBJ: 		      name 0x3875 viewDidLoad
+OBJC2_32BIT_OBJ: 		     types 0x3a6a v8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0x1b0 -[DetailViewController viewDidLoad]
+OBJC2_32BIT_OBJ: 		      name 0x3881 didReceiveMemoryWarning
+OBJC2_32BIT_OBJ: 		     types 0x3a6a v8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0x210 -[DetailViewController didReceiveMemoryWarning]
+OBJC2_32BIT_OBJ: 		      name 0x38a8 .cxx_destruct
+OBJC2_32BIT_OBJ: 		     types 0x3a6a v8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0x320 -[DetailViewController .cxx_destruct]
+OBJC2_32BIT_OBJ: 		      name 0x383e detailItem
+OBJC2_32BIT_OBJ: 		     types 0x3a71 @8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0x260 -[DetailViewController detailItem]
+OBJC2_32BIT_OBJ: 		      name 0x3849 detailDescriptionLabel
+OBJC2_32BIT_OBJ: 		     types 0x3a71 @8 at 0:4
+OBJC2_32BIT_OBJ: 		       imp 0x290 -[DetailViewController detailDescriptionLabel]
+OBJC2_32BIT_OBJ: 		      name 0x38b6 setDetailDescriptionLabel:
+OBJC2_32BIT_OBJ: 		     types 0x3a60 v12 at 0:4 at 8
+OBJC2_32BIT_OBJ: 		       imp 0x2d0 -[DetailViewController setDetailDescriptionLabel:]
+OBJC2_32BIT_OBJ:             baseProtocols 0x0
+OBJC2_32BIT_OBJ:                     ivars 0x39f0
+OBJC2_32BIT_OBJ:                     entsize 20
+OBJC2_32BIT_OBJ:                       count 2
+OBJC2_32BIT_OBJ: 			   offset 0x3828 4
+OBJC2_32BIT_OBJ: 			     name 0x38d1 _detailItem
+OBJC2_32BIT_OBJ: 			     type 0x3a78 @
+OBJC2_32BIT_OBJ: 			alignment 2
+OBJC2_32BIT_OBJ: 			     size 4
+OBJC2_32BIT_OBJ: 			   offset 0x382c 8
+OBJC2_32BIT_OBJ: 			     name 0x38dd _detailDescriptionLabel
+OBJC2_32BIT_OBJ: 			     type 0x3a7a @"UILabel"
+OBJC2_32BIT_OBJ: 			alignment 2
+OBJC2_32BIT_OBJ: 			     size 4
+OBJC2_32BIT_OBJ:            weakIvarLayout 0x3958
+OBJC2_32BIT_OBJ:                 layout map: 0x11 
+OBJC2_32BIT_OBJ:            baseProperties 0x3a20
+OBJC2_32BIT_OBJ:                     entsize 8
+OBJC2_32BIT_OBJ:                       count 2
+OBJC2_32BIT_OBJ: 			     name 0x3a85 detailItem
+OBJC2_32BIT_OBJ: 			attributes 0x3a90 T@,&,N,V_detailItem
+OBJC2_32BIT_OBJ: 			     name 0x3aa4 detailDescriptionLabel
+OBJC2_32BIT_OBJ: 			attributes 0x3abb T@"UILabel",W,N,V_detailDescriptionLabel
+OBJC2_32BIT_OBJ: Meta Class
+OBJC2_32BIT_OBJ:            isa 0x0 _OBJC_METACLASS_$_NSObject
+OBJC2_32BIT_OBJ:     superclass 0x0 _OBJC_METACLASS_$_UIViewController
+OBJC2_32BIT_OBJ:          cache 0x0 __objc_empty_cache
+OBJC2_32BIT_OBJ:         vtable 0x0 -[DetailViewController setDetailItem:]
+OBJC2_32BIT_OBJ:           data 0x3960 (struct class_ro_t *)
+OBJC2_32BIT_OBJ:                     flags 0x185 RO_META RO_HAS_CXX_STRUCTORS
+OBJC2_32BIT_OBJ:             instanceStart 20
+OBJC2_32BIT_OBJ:              instanceSize 20
+OBJC2_32BIT_OBJ:                ivarLayout 0x0
+OBJC2_32BIT_OBJ:                      name 0x3940 DetailViewController
+OBJC2_32BIT_OBJ:               baseMethods 0x0 (struct method_list_t *)
+OBJC2_32BIT_OBJ:             baseProtocols 0x0
+OBJC2_32BIT_OBJ:                     ivars 0x0
+OBJC2_32BIT_OBJ:            weakIvarLayout 0x0
+OBJC2_32BIT_OBJ:            baseProperties 0x0
+OBJC2_32BIT_OBJ: Contents of (__DATA,__objc_superrefs) section
+OBJC2_32BIT_OBJ: 0000393c 0x3914 _OBJC_CLASS_$_DetailViewController
+OBJC2_32BIT_OBJ: Contents of (__DATA,__objc_imageinfo) section
+OBJC2_32BIT_OBJ:   version 0
+OBJC2_32BIT_OBJ:     flags 0x20

Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=234185&r1=234184&r2=234185&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Mon Apr  6 12:47:03 2015
@@ -135,7 +135,6 @@ static cl::opt<bool> NoSymbolicOperands(
     "no-symbolic-operands",
     cl::desc("do not symbolic operands when disassembling (requires -macho)"));
 
-
 static cl::list<std::string>
     ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
               cl::ZeroOrMore);
@@ -2424,14 +2423,21 @@ static const char *get_pointer_64(uint64
   return nullptr;
 }
 
+static const char *get_pointer_32(uint32_t Address, uint32_t &offset,
+                                  uint32_t &left, SectionRef &S,
+                                  DisassembleInfo *info) {
+  return get_pointer_64(Address, offset, left, S, info);
+}
+
 // get_symbol_64() returns the name of a symbol (or nullptr) and the address of
 // the symbol indirectly through n_value. Based on the relocation information
 // for the specified section offset in the specified section reference.
 // If no relocation information is found and a non-zero ReferenceValue for the
 // symbol is passed, look up that address in the info's AddrMap.
-static const char *get_symbol_64(uint32_t sect_offset, SectionRef S,
-                                 DisassembleInfo *info, uint64_t &n_value,
-                                 uint64_t ReferenceValue = 0) {
+static const char *
+get_symbol_64(uint32_t sect_offset, SectionRef S, DisassembleInfo *info,
+              uint64_t &n_value,
+              uint64_t ReferenceValue = UnknownAddressOrSize) {
   n_value = 0;
   if (!info->verbose)
     return nullptr;
@@ -2486,12 +2492,19 @@ static const char *get_symbol_64(uint32_
 
   // We did not find an external relocation entry so look up the ReferenceValue
   // as an address of a symbol and if found return that symbol's name.
-  if (ReferenceValue != 0)
+  if (ReferenceValue != UnknownAddressOrSize)
     SymbolName = GuessSymbolName(ReferenceValue, info->AddrMap);
 
   return SymbolName;
 }
 
+static const char *get_symbol_32(uint32_t sect_offset, SectionRef S,
+                                 DisassembleInfo *info,
+                                 uint32_t ReferenceValue) {
+  uint64_t n_value64;
+  return get_symbol_64(sect_offset, S, info, n_value64, ReferenceValue);
+}
+
 // These are structs in the Objective-C meta data and read to produce the
 // comments for disassembly.  While these are part of the ABI they are no
 // public defintions.  So the are here not in include/llvm/Support/MachO.h .
@@ -2513,6 +2526,14 @@ struct class64_t {
   uint64_t data;       // class_ro64_t * (64-bit pointer)
 };
 
+struct class32_t {
+  uint32_t isa;        /* class32_t * (32-bit pointer) */
+  uint32_t superclass; /* class32_t * (32-bit pointer) */
+  uint32_t cache;      /* Cache (32-bit pointer) */
+  uint32_t vtable;     /* IMP * (32-bit pointer) */
+  uint32_t data;       /* class_ro32_t * (32-bit pointer) */
+};
+
 struct class_ro64_t {
   uint32_t flags;
   uint32_t instanceStart;
@@ -2527,7 +2548,21 @@ struct class_ro64_t {
   uint64_t baseProperties; // const struct objc_property_list (64-bit pointer)
 };
 
-/* Values for class_ro64_t->flags */
+struct class_ro32_t {
+  uint32_t flags;
+  uint32_t instanceStart;
+  uint32_t instanceSize;
+  uint32_t ivarLayout;     /* const uint8_t * (32-bit pointer) */
+  uint32_t name;           /* const char * (32-bit pointer) */
+  uint32_t baseMethods;    /* const method_list_t * (32-bit pointer) */
+  uint32_t baseProtocols;  /* const protocol_list_t * (32-bit pointer) */
+  uint32_t ivars;          /* const ivar_list_t * (32-bit pointer) */
+  uint32_t weakIvarLayout; /* const uint8_t * (32-bit pointer) */
+  uint32_t baseProperties; /* const struct objc_property_list *
+                                                   (32-bit pointer) */
+};
+
+/* Values for class_ro{64,32}_t->flags */
 #define RO_META (1 << 0)
 #define RO_ROOT (1 << 1)
 #define RO_HAS_CXX_STRUCTORS (1 << 2)
@@ -2538,17 +2573,34 @@ struct method_list64_t {
   /* struct method64_t first;  These structures follow inline */
 };
 
+struct method_list32_t {
+  uint32_t entsize;
+  uint32_t count;
+  /* struct method32_t first;  These structures follow inline */
+};
+
 struct method64_t {
   uint64_t name;  /* SEL (64-bit pointer) */
   uint64_t types; /* const char * (64-bit pointer) */
   uint64_t imp;   /* IMP (64-bit pointer) */
 };
 
+struct method32_t {
+  uint32_t name;  /* SEL (32-bit pointer) */
+  uint32_t types; /* const char * (32-bit pointer) */
+  uint32_t imp;   /* IMP (32-bit pointer) */
+};
+
 struct protocol_list64_t {
   uint64_t count; /* uintptr_t (a 64-bit value) */
   /* struct protocol64_t * list[0];  These pointers follow inline */
 };
 
+struct protocol_list32_t {
+  uint32_t count; /* uintptr_t (a 32-bit value) */
+  /* struct protocol32_t * list[0];  These pointers follow inline */
+};
+
 struct protocol64_t {
   uint64_t isa;                     /* id * (64-bit pointer) */
   uint64_t name;                    /* const char * (64-bit pointer) */
@@ -2562,10 +2614,29 @@ struct protocol64_t {
                                                        (64-bit pointer) */
 };
 
+struct protocol32_t {
+  uint32_t isa;                     /* id * (32-bit pointer) */
+  uint32_t name;                    /* const char * (32-bit pointer) */
+  uint32_t protocols;               /* struct protocol_list_t *
+                                                    (32-bit pointer) */
+  uint32_t instanceMethods;         /* method_list_t * (32-bit pointer) */
+  uint32_t classMethods;            /* method_list_t * (32-bit pointer) */
+  uint32_t optionalInstanceMethods; /* method_list_t * (32-bit pointer) */
+  uint32_t optionalClassMethods;    /* method_list_t * (32-bit pointer) */
+  uint32_t instanceProperties;      /* struct objc_property_list *
+                                                       (32-bit pointer) */
+};
+
 struct ivar_list64_t {
   uint32_t entsize;
   uint32_t count;
-  /* struct ivar_t first;  These structures follow inline */
+  /* struct ivar64_t first;  These structures follow inline */
+};
+
+struct ivar_list32_t {
+  uint32_t entsize;
+  uint32_t count;
+  /* struct ivar32_t first;  These structures follow inline */
 };
 
 struct ivar64_t {
@@ -2576,10 +2647,24 @@ struct ivar64_t {
   uint32_t size;
 };
 
+struct ivar32_t {
+  uint32_t offset; /* uintptr_t * (32-bit pointer) */
+  uint32_t name;   /* const char * (32-bit pointer) */
+  uint32_t type;   /* const char * (32-bit pointer) */
+  uint32_t alignment;
+  uint32_t size;
+};
+
 struct objc_property_list64 {
   uint32_t entsize;
   uint32_t count;
-  /* struct objc_property first;  These structures follow inline */
+  /* struct objc_property64 first;  These structures follow inline */
+};
+
+struct objc_property_list32 {
+  uint32_t entsize;
+  uint32_t count;
+  /* struct objc_property32 first;  These structures follow inline */
 };
 
 struct objc_property64 {
@@ -2587,6 +2672,11 @@ struct objc_property64 {
   uint64_t attributes; /* const char * (64-bit pointer) */
 };
 
+struct objc_property32 {
+  uint32_t name;       /* const char * (32-bit pointer) */
+  uint32_t attributes; /* const char * (32-bit pointer) */
+};
+
 struct category64_t {
   uint64_t name;               /* const char * (64-bit pointer) */
   uint64_t cls;                /* struct class_t * (64-bit pointer) */
@@ -2597,10 +2687,24 @@ struct category64_t {
                                   (64-bit pointer) */
 };
 
+struct category32_t {
+  uint32_t name;               /* const char * (32-bit pointer) */
+  uint32_t cls;                /* struct class_t * (32-bit pointer) */
+  uint32_t instanceMethods;    /* struct method_list_t * (32-bit pointer) */
+  uint32_t classMethods;       /* struct method_list_t * (32-bit pointer) */
+  uint32_t protocols;          /* struct protocol_list_t * (32-bit pointer) */
+  uint32_t instanceProperties; /* struct objc_property_list *
+                                  (32-bit pointer) */
+};
+
 struct objc_image_info64 {
   uint32_t version;
   uint32_t flags;
 };
+struct objc_image_info32 {
+  uint32_t version;
+  uint32_t flags;
+};
 /* masks for objc_image_info.flags */
 #define OBJC_IMAGE_IS_REPLACEMENT (1 << 0)
 #define OBJC_IMAGE_SUPPORTS_GC (1 << 1)
@@ -2610,6 +2714,11 @@ struct message_ref64 {
   uint64_t sel; /* SEL (64-bit pointer) */
 };
 
+struct message_ref32 {
+  uint32_t imp; /* IMP (32-bit pointer) */
+  uint32_t sel; /* SEL (32-bit pointer) */
+};
+
 inline void swapStruct(struct cfstring64_t &cfs) {
   sys::swapByteOrder(cfs.isa);
   sys::swapByteOrder(cfs.flags);
@@ -2625,6 +2734,14 @@ inline void swapStruct(struct class64_t
   sys::swapByteOrder(c.data);
 }
 
+inline void swapStruct(struct class32_t &c) {
+  sys::swapByteOrder(c.isa);
+  sys::swapByteOrder(c.superclass);
+  sys::swapByteOrder(c.cache);
+  sys::swapByteOrder(c.vtable);
+  sys::swapByteOrder(c.data);
+}
+
 inline void swapStruct(struct class_ro64_t &cro) {
   sys::swapByteOrder(cro.flags);
   sys::swapByteOrder(cro.instanceStart);
@@ -2639,21 +2756,49 @@ inline void swapStruct(struct class_ro64
   sys::swapByteOrder(cro.baseProperties);
 }
 
+inline void swapStruct(struct class_ro32_t &cro) {
+  sys::swapByteOrder(cro.flags);
+  sys::swapByteOrder(cro.instanceStart);
+  sys::swapByteOrder(cro.instanceSize);
+  sys::swapByteOrder(cro.ivarLayout);
+  sys::swapByteOrder(cro.name);
+  sys::swapByteOrder(cro.baseMethods);
+  sys::swapByteOrder(cro.baseProtocols);
+  sys::swapByteOrder(cro.ivars);
+  sys::swapByteOrder(cro.weakIvarLayout);
+  sys::swapByteOrder(cro.baseProperties);
+}
+
 inline void swapStruct(struct method_list64_t &ml) {
   sys::swapByteOrder(ml.entsize);
   sys::swapByteOrder(ml.count);
 }
 
+inline void swapStruct(struct method_list32_t &ml) {
+  sys::swapByteOrder(ml.entsize);
+  sys::swapByteOrder(ml.count);
+}
+
 inline void swapStruct(struct method64_t &m) {
   sys::swapByteOrder(m.name);
   sys::swapByteOrder(m.types);
   sys::swapByteOrder(m.imp);
 }
 
+inline void swapStruct(struct method32_t &m) {
+  sys::swapByteOrder(m.name);
+  sys::swapByteOrder(m.types);
+  sys::swapByteOrder(m.imp);
+}
+
 inline void swapStruct(struct protocol_list64_t &pl) {
   sys::swapByteOrder(pl.count);
 }
 
+inline void swapStruct(struct protocol_list32_t &pl) {
+  sys::swapByteOrder(pl.count);
+}
+
 inline void swapStruct(struct protocol64_t &p) {
   sys::swapByteOrder(p.isa);
   sys::swapByteOrder(p.name);
@@ -2665,11 +2810,27 @@ inline void swapStruct(struct protocol64
   sys::swapByteOrder(p.instanceProperties);
 }
 
+inline void swapStruct(struct protocol32_t &p) {
+  sys::swapByteOrder(p.isa);
+  sys::swapByteOrder(p.name);
+  sys::swapByteOrder(p.protocols);
+  sys::swapByteOrder(p.instanceMethods);
+  sys::swapByteOrder(p.classMethods);
+  sys::swapByteOrder(p.optionalInstanceMethods);
+  sys::swapByteOrder(p.optionalClassMethods);
+  sys::swapByteOrder(p.instanceProperties);
+}
+
 inline void swapStruct(struct ivar_list64_t &il) {
   sys::swapByteOrder(il.entsize);
   sys::swapByteOrder(il.count);
 }
 
+inline void swapStruct(struct ivar_list32_t &il) {
+  sys::swapByteOrder(il.entsize);
+  sys::swapByteOrder(il.count);
+}
+
 inline void swapStruct(struct ivar64_t &i) {
   sys::swapByteOrder(i.offset);
   sys::swapByteOrder(i.name);
@@ -2678,16 +2839,34 @@ inline void swapStruct(struct ivar64_t &
   sys::swapByteOrder(i.size);
 }
 
+inline void swapStruct(struct ivar32_t &i) {
+  sys::swapByteOrder(i.offset);
+  sys::swapByteOrder(i.name);
+  sys::swapByteOrder(i.type);
+  sys::swapByteOrder(i.alignment);
+  sys::swapByteOrder(i.size);
+}
+
 inline void swapStruct(struct objc_property_list64 &pl) {
   sys::swapByteOrder(pl.entsize);
   sys::swapByteOrder(pl.count);
 }
 
+inline void swapStruct(struct objc_property_list32 &pl) {
+  sys::swapByteOrder(pl.entsize);
+  sys::swapByteOrder(pl.count);
+}
+
 inline void swapStruct(struct objc_property64 &op) {
   sys::swapByteOrder(op.name);
   sys::swapByteOrder(op.attributes);
 }
 
+inline void swapStruct(struct objc_property32 &op) {
+  sys::swapByteOrder(op.name);
+  sys::swapByteOrder(op.attributes);
+}
+
 inline void swapStruct(struct category64_t &c) {
   sys::swapByteOrder(c.name);
   sys::swapByteOrder(c.cls);
@@ -2697,16 +2876,35 @@ inline void swapStruct(struct category64
   sys::swapByteOrder(c.instanceProperties);
 }
 
+inline void swapStruct(struct category32_t &c) {
+  sys::swapByteOrder(c.name);
+  sys::swapByteOrder(c.cls);
+  sys::swapByteOrder(c.instanceMethods);
+  sys::swapByteOrder(c.classMethods);
+  sys::swapByteOrder(c.protocols);
+  sys::swapByteOrder(c.instanceProperties);
+}
+
 inline void swapStruct(struct objc_image_info64 &o) {
   sys::swapByteOrder(o.version);
   sys::swapByteOrder(o.flags);
 }
 
+inline void swapStruct(struct objc_image_info32 &o) {
+  sys::swapByteOrder(o.version);
+  sys::swapByteOrder(o.flags);
+}
+
 inline void swapStruct(struct message_ref64 &mr) {
   sys::swapByteOrder(mr.imp);
   sys::swapByteOrder(mr.sel);
 }
 
+inline void swapStruct(struct message_ref32 &mr) {
+  sys::swapByteOrder(mr.imp);
+  sys::swapByteOrder(mr.sel);
+}
+
 static const char *get_dyld_bind_info_symbolname(uint64_t ReferenceValue,
                                                  struct DisassembleInfo *info);
 
@@ -2879,6 +3077,57 @@ walk_pointer_list_64(const char *listnam
   }
 }
 
+static void
+walk_pointer_list_32(const char *listname, const SectionRef S,
+                     MachOObjectFile *O, struct DisassembleInfo *info,
+                     void (*func)(uint32_t, struct DisassembleInfo *info)) {
+  if (S == SectionRef())
+    return;
+
+  StringRef SectName;
+  S.getName(SectName);
+  DataRefImpl Ref = S.getRawDataRefImpl();
+  StringRef SegName = O->getSectionFinalSegmentName(Ref);
+  outs() << "Contents of (" << SegName << "," << SectName << ") section\n";
+
+  StringRef BytesStr;
+  S.getContents(BytesStr);
+  const char *Contents = reinterpret_cast<const char *>(BytesStr.data());
+
+  for (uint32_t i = 0; i < S.getSize(); i += sizeof(uint32_t)) {
+    uint32_t left = S.getSize() - i;
+    uint32_t size = left < sizeof(uint32_t) ? left : sizeof(uint32_t);
+    uint32_t p = 0;
+    memcpy(&p, Contents + i, size);
+    if (i + sizeof(uint32_t) > S.getSize())
+      outs() << listname << " list pointer extends past end of (" << SegName
+             << "," << SectName << ") section\n";
+    outs() << format("%08" PRIx32, S.getAddress() + i) << " ";
+
+    if (O->isLittleEndian() != sys::IsLittleEndianHost)
+      sys::swapByteOrder(p);
+    outs() << format("0x%" PRIx32, p);
+
+    const char *name = get_symbol_32(i, S, info, p);
+    if (name != nullptr)
+      outs() << " " << name;
+    outs() << "\n";
+
+    if (func)
+      func(p, info);
+  }
+}
+
+static void print_layout_map(const char *layout_map, uint32_t left) {
+  outs() << "                layout map: ";
+  do {
+    outs() << format("0x%02" PRIx32, (*layout_map) & 0xff) << " ";
+    left--;
+    layout_map++;
+  } while (*layout_map != '\0' && left != 0);
+  outs() << "\n";
+}
+
 static void print_layout_map64(uint64_t p, struct DisassembleInfo *info) {
   uint32_t offset, left;
   SectionRef S;
@@ -2887,15 +3136,18 @@ static void print_layout_map64(uint64_t
   if (p == 0)
     return;
   layout_map = get_pointer_64(p, offset, left, S, info);
-  if (layout_map != nullptr) {
-    outs() << "                layout map: ";
-    do {
-      outs() << format("0x%02" PRIx32, (*layout_map) & 0xff) << " ";
-      left--;
-      layout_map++;
-    } while (*layout_map != '\0' && left != 0);
-    outs() << "\n";
-  }
+  print_layout_map(layout_map, left);
+}
+
+static void print_layout_map32(uint32_t p, struct DisassembleInfo *info) {
+  uint32_t offset, left;
+  SectionRef S;
+  const char *layout_map;
+
+  if (p == 0)
+    return;
+  layout_map = get_pointer_32(p, offset, left, S, info);
+  print_layout_map(layout_map, left);
 }
 
 static void print_method_list64_t(uint64_t p, struct DisassembleInfo *info,
@@ -2991,6 +3243,68 @@ static void print_method_list64_t(uint64
   }
 }
 
+static void print_method_list32_t(uint64_t p, struct DisassembleInfo *info,
+                                  const char *indent) {
+  struct method_list32_t ml;
+  struct method32_t m;
+  const char *r;
+  uint32_t offset, xoffset, left, i;
+  SectionRef S, xS;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&ml, '\0', sizeof(struct method_list32_t));
+  if (left < sizeof(struct method_list32_t)) {
+    memcpy(&ml, r, left);
+    outs() << "   (method_list_t entends past the end of the section)\n";
+  } else
+    memcpy(&ml, r, sizeof(struct method_list32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(ml);
+  outs() << indent << "\t\t   entsize " << ml.entsize << "\n";
+  outs() << indent << "\t\t     count " << ml.count << "\n";
+
+  p += sizeof(struct method_list32_t);
+  offset += sizeof(struct method_list32_t);
+  for (i = 0; i < ml.count; i++) {
+    r = get_pointer_32(p, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    memset(&m, '\0', sizeof(struct method32_t));
+    if (left < sizeof(struct method32_t)) {
+      memcpy(&ml, r, left);
+      outs() << indent << "   (method_t entends past the end of the section)\n";
+    } else
+      memcpy(&m, r, sizeof(struct method32_t));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      swapStruct(m);
+
+    outs() << indent << "\t\t      name " << format("0x%" PRIx32, m.name);
+    name = get_pointer_32(m.name, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    outs() << indent << "\t\t     types " << format("0x%" PRIx32, m.types);
+    name = get_pointer_32(m.types, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    outs() << indent << "\t\t       imp " << format("0x%" PRIx32, m.imp);
+    name = get_symbol_32(offset + offsetof(struct method32_t, imp), S, info,
+                         m.imp);
+    if (name != nullptr)
+      outs() << " " << name;
+    outs() << "\n";
+
+    p += sizeof(struct method32_t);
+    offset += sizeof(struct method32_t);
+  }
+}
+
 static void print_protocol_list64_t(uint64_t p, struct DisassembleInfo *info) {
   struct protocol_list64_t pl;
   uint64_t q, n_value;
@@ -3120,6 +3434,82 @@ static void print_protocol_list64_t(uint
   }
 }
 
+static void print_protocol_list32_t(uint32_t p, struct DisassembleInfo *info) {
+  struct protocol_list32_t pl;
+  uint32_t q;
+  struct protocol32_t pc;
+  const char *r;
+  uint32_t offset, xoffset, left, i;
+  SectionRef S, xS;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&pl, '\0', sizeof(struct protocol_list32_t));
+  if (left < sizeof(struct protocol_list32_t)) {
+    memcpy(&pl, r, left);
+    outs() << "   (protocol_list_t entends past the end of the section)\n";
+  } else
+    memcpy(&pl, r, sizeof(struct protocol_list32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(pl);
+  outs() << "                      count " << pl.count << "\n";
+
+  p += sizeof(struct protocol_list32_t);
+  offset += sizeof(struct protocol_list32_t);
+  for (i = 0; i < pl.count; i++) {
+    r = get_pointer_32(p, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    q = 0;
+    if (left < sizeof(uint32_t)) {
+      memcpy(&q, r, left);
+      outs() << "   (protocol_t * entends past the end of the section)\n";
+    } else
+      memcpy(&q, r, sizeof(uint32_t));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      sys::swapByteOrder(q);
+    outs() << "\t\t      list[" << i << "] " << format("0x%" PRIx32, q)
+           << " (struct protocol_t *)\n";
+    r = get_pointer_32(q, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    memset(&pc, '\0', sizeof(struct protocol32_t));
+    if (left < sizeof(struct protocol32_t)) {
+      memcpy(&pc, r, left);
+      outs() << "   (protocol_t entends past the end of the section)\n";
+    } else
+      memcpy(&pc, r, sizeof(struct protocol32_t));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      swapStruct(pc);
+    outs() << "\t\t\t      isa " << format("0x%" PRIx32, pc.isa) << "\n";
+    outs() << "\t\t\t     name " << format("0x%" PRIx32, pc.name);
+    name = get_pointer_32(pc.name, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+    outs() << "\t\t\tprotocols " << format("0x%" PRIx32, pc.protocols) << "\n";
+    outs() << "\t\t  instanceMethods "
+           << format("0x%" PRIx32, pc.instanceMethods)
+           << " (struct method_list_t *)\n";
+    if (pc.instanceMethods != 0)
+      print_method_list32_t(pc.instanceMethods, info, "\t");
+    outs() << "\t\t     classMethods " << format("0x%" PRIx32, pc.classMethods)
+           << " (struct method_list_t *)\n";
+    if (pc.classMethods != 0)
+      print_method_list32_t(pc.classMethods, info, "\t");
+    outs() << "\t  optionalInstanceMethods "
+           << format("0x%" PRIx32, pc.optionalInstanceMethods) << "\n";
+    outs() << "\t     optionalClassMethods "
+           << format("0x%" PRIx32, pc.optionalClassMethods) << "\n";
+    outs() << "\t       instanceProperties "
+           << format("0x%" PRIx32, pc.instanceProperties) << "\n";
+    p += sizeof(uint32_t);
+    offset += sizeof(uint32_t);
+  }
+}
+
 static void print_ivar_list64_t(uint64_t p, struct DisassembleInfo *info) {
   struct ivar_list64_t il;
   struct ivar64_t i;
@@ -3221,23 +3611,91 @@ static void print_ivar_list64_t(uint64_t
   }
 }
 
-static void print_objc_property_list64(uint64_t p,
-                                       struct DisassembleInfo *info) {
-  struct objc_property_list64 opl;
-  struct objc_property64 op;
+static void print_ivar_list32_t(uint32_t p, struct DisassembleInfo *info) {
+  struct ivar_list32_t il;
+  struct ivar32_t i;
   const char *r;
   uint32_t offset, xoffset, left, j;
   SectionRef S, xS;
-  const char *name, *sym_name;
-  uint64_t n_value;
+  const char *name, *ivar_offset_p;
+  uint32_t ivar_offset;
 
-  r = get_pointer_64(p, offset, left, S, info);
+  r = get_pointer_32(p, offset, left, S, info);
   if (r == nullptr)
     return;
-  memset(&opl, '\0', sizeof(struct objc_property_list64));
-  if (left < sizeof(struct objc_property_list64)) {
-    memcpy(&opl, r, left);
-    outs() << "   (objc_property_list entends past the end of the section)\n";
+  memset(&il, '\0', sizeof(struct ivar_list32_t));
+  if (left < sizeof(struct ivar_list32_t)) {
+    memcpy(&il, r, left);
+    outs() << "   (ivar_list_t entends past the end of the section)\n";
+  } else
+    memcpy(&il, r, sizeof(struct ivar_list32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(il);
+  outs() << "                    entsize " << il.entsize << "\n";
+  outs() << "                      count " << il.count << "\n";
+
+  p += sizeof(struct ivar_list32_t);
+  offset += sizeof(struct ivar_list32_t);
+  for (j = 0; j < il.count; j++) {
+    r = get_pointer_32(p, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    memset(&i, '\0', sizeof(struct ivar32_t));
+    if (left < sizeof(struct ivar32_t)) {
+      memcpy(&i, r, left);
+      outs() << "   (ivar_t entends past the end of the section)\n";
+    } else
+      memcpy(&i, r, sizeof(struct ivar32_t));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      swapStruct(i);
+
+    outs() << "\t\t\t   offset " << format("0x%" PRIx32, i.offset);
+    ivar_offset_p = get_pointer_32(i.offset, xoffset, left, xS, info);
+    if (ivar_offset_p != nullptr && left >= sizeof(*ivar_offset_p)) {
+      memcpy(&ivar_offset, ivar_offset_p, sizeof(ivar_offset));
+      if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+        sys::swapByteOrder(ivar_offset);
+      outs() << " " << ivar_offset << "\n";
+    } else
+      outs() << "\n";
+
+    outs() << "\t\t\t     name " << format("0x%" PRIx32, i.name);
+    name = get_pointer_32(i.name, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    outs() << "\t\t\t     type " << format("0x%" PRIx32, i.type);
+    name = get_pointer_32(i.type, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    outs() << "\t\t\talignment " << i.alignment << "\n";
+    outs() << "\t\t\t     size " << i.size << "\n";
+
+    p += sizeof(struct ivar32_t);
+    offset += sizeof(struct ivar32_t);
+  }
+}
+
+static void print_objc_property_list64(uint64_t p,
+                                       struct DisassembleInfo *info) {
+  struct objc_property_list64 opl;
+  struct objc_property64 op;
+  const char *r;
+  uint32_t offset, xoffset, left, j;
+  SectionRef S, xS;
+  const char *name, *sym_name;
+  uint64_t n_value;
+
+  r = get_pointer_64(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&opl, '\0', sizeof(struct objc_property_list64));
+  if (left < sizeof(struct objc_property_list64)) {
+    memcpy(&opl, r, left);
+    outs() << "   (objc_property_list entends past the end of the section)\n";
   } else
     memcpy(&opl, r, sizeof(struct objc_property_list64));
   if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
@@ -3300,6 +3758,61 @@ static void print_objc_property_list64(u
   }
 }
 
+static void print_objc_property_list32(uint32_t p,
+                                       struct DisassembleInfo *info) {
+  struct objc_property_list32 opl;
+  struct objc_property32 op;
+  const char *r;
+  uint32_t offset, xoffset, left, j;
+  SectionRef S, xS;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&opl, '\0', sizeof(struct objc_property_list32));
+  if (left < sizeof(struct objc_property_list32)) {
+    memcpy(&opl, r, left);
+    outs() << "   (objc_property_list entends past the end of the section)\n";
+  } else
+    memcpy(&opl, r, sizeof(struct objc_property_list32));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(opl);
+  outs() << "                    entsize " << opl.entsize << "\n";
+  outs() << "                      count " << opl.count << "\n";
+
+  p += sizeof(struct objc_property_list32);
+  offset += sizeof(struct objc_property_list32);
+  for (j = 0; j < opl.count; j++) {
+    r = get_pointer_32(p, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    memset(&op, '\0', sizeof(struct objc_property32));
+    if (left < sizeof(struct objc_property32)) {
+      memcpy(&op, r, left);
+      outs() << "   (objc_property entends past the end of the section)\n";
+    } else
+      memcpy(&op, r, sizeof(struct objc_property32));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      swapStruct(op);
+
+    outs() << "\t\t\t     name " << format("0x%" PRIx32, op.name);
+    name = get_pointer_32(op.name, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    outs() << "\t\t\tattributes " << format("0x%" PRIx32, op.attributes);
+    name = get_pointer_32(op.attributes, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << format(" %.*s", left, name);
+    outs() << "\n";
+
+    p += sizeof(struct objc_property32);
+    offset += sizeof(struct objc_property32);
+  }
+}
+
 static void print_class_ro64_t(uint64_t p, struct DisassembleInfo *info,
                                bool &is_meta_class) {
   struct class_ro64_t cro;
@@ -3388,7 +3901,7 @@ static void print_class_ro64_t(uint64_t
 
   outs() << "                    ivars ";
   sym_name = get_symbol_64(offset + offsetof(struct class_ro64_t, ivars), S,
-                           info, n_value, cro.baseProtocols);
+                           info, n_value, cro.ivars);
   if (n_value != 0) {
     if (info->verbose && sym_name != nullptr)
       outs() << sym_name;
@@ -3438,6 +3951,69 @@ static void print_class_ro64_t(uint64_t
   is_meta_class = (cro.flags & RO_META) ? true : false;
 }
 
+static void print_class_ro32_t(uint32_t p, struct DisassembleInfo *info,
+                               bool &is_meta_class) {
+  struct class_ro32_t cro;
+  const char *r;
+  uint32_t offset, xoffset, left;
+  SectionRef S, xS;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&cro, '\0', sizeof(struct class_ro32_t));
+  if (left < sizeof(struct class_ro32_t)) {
+    memcpy(&cro, r, left);
+    outs() << "   (class_ro_t entends past the end of the section)\n";
+  } else
+    memcpy(&cro, r, sizeof(struct class_ro32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(cro);
+  outs() << "                    flags " << format("0x%" PRIx32, cro.flags);
+  if (cro.flags & RO_META)
+    outs() << " RO_META";
+  if (cro.flags & RO_ROOT)
+    outs() << " RO_ROOT";
+  if (cro.flags & RO_HAS_CXX_STRUCTORS)
+    outs() << " RO_HAS_CXX_STRUCTORS";
+  outs() << "\n";
+  outs() << "            instanceStart " << cro.instanceStart << "\n";
+  outs() << "             instanceSize " << cro.instanceSize << "\n";
+  outs() << "               ivarLayout " << format("0x%" PRIx32, cro.ivarLayout)
+         << "\n";
+  print_layout_map32(cro.ivarLayout, info);
+
+  outs() << "                     name " << format("0x%" PRIx32, cro.name);
+  name = get_pointer_32(cro.name, xoffset, left, xS, info);
+  if (name != nullptr)
+    outs() << format(" %.*s", left, name);
+  outs() << "\n";
+
+  outs() << "              baseMethods "
+         << format("0x%" PRIx32, cro.baseMethods)
+         << " (struct method_list_t *)\n";
+  if (cro.baseMethods != 0)
+    print_method_list32_t(cro.baseMethods, info, "");
+
+  outs() << "            baseProtocols "
+         << format("0x%" PRIx32, cro.baseProtocols) << "\n";
+  if (cro.baseProtocols != 0)
+    print_protocol_list32_t(cro.baseProtocols, info);
+  outs() << "                    ivars " << format("0x%" PRIx32, cro.ivars)
+         << "\n";
+  if (cro.ivars != 0)
+    print_ivar_list32_t(cro.ivars, info);
+  outs() << "           weakIvarLayout "
+         << format("0x%" PRIx32, cro.weakIvarLayout) << "\n";
+  print_layout_map32(cro.weakIvarLayout, info);
+  outs() << "           baseProperties "
+         << format("0x%" PRIx32, cro.baseProperties) << "\n";
+  if (cro.baseProperties != 0)
+    print_objc_property_list32(cro.baseProperties, info);
+  is_meta_class = (cro.flags & RO_META) ? true : false;
+}
+
 static void print_class64_t(uint64_t p, struct DisassembleInfo *info) {
   struct class64_t c;
   const char *r;
@@ -3504,7 +4080,7 @@ static void print_class64_t(uint64_t p,
   if ((c.data + n_value) & 0x7)
     outs() << " Swift class";
   outs() << "\n";
-  bool is_meta_class = true;
+  bool is_meta_class;
   print_class_ro64_t((c.data + n_value) & ~0x7, info, is_meta_class);
 
   if (is_meta_class == false) {
@@ -3513,6 +4089,71 @@ static void print_class64_t(uint64_t p,
   }
 }
 
+static void print_class32_t(uint32_t p, struct DisassembleInfo *info) {
+  struct class32_t c;
+  const char *r;
+  uint32_t offset, left;
+  SectionRef S;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&c, '\0', sizeof(struct class32_t));
+  if (left < sizeof(struct class32_t)) {
+    memcpy(&c, r, left);
+    outs() << "   (class_t entends past the end of the section)\n";
+  } else
+    memcpy(&c, r, sizeof(struct class32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(c);
+
+  outs() << "           isa " << format("0x%" PRIx32, c.isa);
+  name =
+      get_symbol_32(offset + offsetof(struct class32_t, isa), S, info, c.isa);
+  if (name != nullptr)
+    outs() << " " << name;
+  outs() << "\n";
+
+  outs() << "    superclass " << format("0x%" PRIx32, c.superclass);
+  name = get_symbol_32(offset + offsetof(struct class32_t, superclass), S, info,
+                       c.superclass);
+  if (name != nullptr)
+    outs() << " " << name;
+  outs() << "\n";
+
+  outs() << "         cache " << format("0x%" PRIx32, c.cache);
+  name = get_symbol_32(offset + offsetof(struct class32_t, cache), S, info,
+                       c.cache);
+  if (name != nullptr)
+    outs() << " " << name;
+  outs() << "\n";
+
+  outs() << "        vtable " << format("0x%" PRIx32, c.vtable);
+  name = get_symbol_32(offset + offsetof(struct class32_t, vtable), S, info,
+                       c.vtable);
+  if (name != nullptr)
+    outs() << " " << name;
+  outs() << "\n";
+
+  name =
+      get_symbol_32(offset + offsetof(struct class32_t, data), S, info, c.data);
+  outs() << "          data " << format("0x%" PRIx32, c.data)
+         << " (struct class_ro_t *)";
+
+  // This is a Swift class if some of the low bits of the pointer are set.
+  if (c.data & 0x3)
+    outs() << " Swift class";
+  outs() << "\n";
+  bool is_meta_class;
+  print_class_ro32_t(c.data & ~0x3, info, is_meta_class);
+
+  if (is_meta_class == false) {
+    outs() << "Meta Class\n";
+    print_class32_t(c.isa, info);
+  }
+}
+
 static void print_category64_t(uint64_t p, struct DisassembleInfo *info) {
   struct category64_t c;
   const char *r;
@@ -3633,6 +4274,52 @@ static void print_category64_t(uint64_t
     print_objc_property_list64(c.instanceProperties + n_value, info);
 }
 
+static void print_category32_t(uint32_t p, struct DisassembleInfo *info) {
+  struct category32_t c;
+  const char *r;
+  uint32_t offset, left;
+  SectionRef S, xS;
+  const char *name;
+
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&c, '\0', sizeof(struct category32_t));
+  if (left < sizeof(struct category32_t)) {
+    memcpy(&c, r, left);
+    outs() << "   (category_t entends past the end of the section)\n";
+  } else
+    memcpy(&c, r, sizeof(struct category32_t));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(c);
+
+  outs() << "              name " << format("0x%" PRIx32, c.name);
+  name = get_symbol_32(offset + offsetof(struct category32_t, name), S, info,
+                       c.name);
+  if (name != NULL)
+    outs() << " " << name;
+  outs() << "\n";
+
+  outs() << "               cls " << format("0x%" PRIx32, c.cls) << "\n";
+  if (c.cls != 0)
+    print_class32_t(c.cls, info);
+  outs() << "   instanceMethods " << format("0x%" PRIx32, c.instanceMethods)
+         << "\n";
+  if (c.instanceMethods != 0)
+    print_method_list32_t(c.instanceMethods, info, "");
+  outs() << "      classMethods " << format("0x%" PRIx32, c.classMethods)
+         << "\n";
+  if (c.classMethods != 0)
+    print_method_list32_t(c.classMethods, info, "");
+  outs() << "         protocols " << format("0x%" PRIx32, c.protocols) << "\n";
+  if (c.protocols != 0)
+    print_protocol_list32_t(c.protocols, info);
+  outs() << "instanceProperties " << format("0x%" PRIx32, c.instanceProperties)
+         << "\n";
+  if (c.instanceProperties != 0)
+    print_objc_property_list32(c.instanceProperties, info);
+}
+
 static void print_message_refs64(SectionRef S, struct DisassembleInfo *info) {
   uint32_t i, left, offset, xoffset;
   uint64_t p, n_value;
@@ -3698,6 +4385,52 @@ static void print_message_refs64(Section
   }
 }
 
+static void print_message_refs32(SectionRef S, struct DisassembleInfo *info) {
+  uint32_t i, left, offset, xoffset, p;
+  struct message_ref32 mr;
+  const char *name, *r;
+  SectionRef xS;
+
+  if (S == SectionRef())
+    return;
+
+  StringRef SectName;
+  S.getName(SectName);
+  DataRefImpl Ref = S.getRawDataRefImpl();
+  StringRef SegName = info->O->getSectionFinalSegmentName(Ref);
+  outs() << "Contents of (" << SegName << "," << SectName << ") section\n";
+  offset = 0;
+  for (i = 0; i < S.getSize(); i += sizeof(struct message_ref64)) {
+    p = S.getAddress() + i;
+    r = get_pointer_32(p, offset, left, S, info);
+    if (r == nullptr)
+      return;
+    memset(&mr, '\0', sizeof(struct message_ref32));
+    if (left < sizeof(struct message_ref32)) {
+      memcpy(&mr, r, left);
+      outs() << "   (message_ref entends past the end of the section)\n";
+    } else
+      memcpy(&mr, r, sizeof(struct message_ref32));
+    if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+      swapStruct(mr);
+
+    outs() << "  imp " << format("0x%" PRIx32, mr.imp);
+    name = get_symbol_32(offset + offsetof(struct message_ref32, imp), S, info,
+                         mr.imp);
+    if (name != nullptr)
+      outs() << " " << name;
+    outs() << "\n";
+
+    outs() << "  sel " << format("0x%" PRIx32, mr.sel);
+    name = get_pointer_32(mr.sel, xoffset, left, xS, info);
+    if (name != nullptr)
+      outs() << " " << name;
+    outs() << "\n";
+
+    offset += sizeof(struct message_ref32);
+  }
+}
+
 static void print_image_info64(SectionRef S, struct DisassembleInfo *info) {
   uint32_t left, offset, swift_version;
   uint64_t p;
@@ -3739,6 +4472,46 @@ static void print_image_info64(SectionRe
   outs() << "\n";
 }
 
+static void print_image_info32(SectionRef S, struct DisassembleInfo *info) {
+  uint32_t left, offset, swift_version, p;
+  struct objc_image_info32 o;
+  const char *r;
+
+  StringRef SectName;
+  S.getName(SectName);
+  DataRefImpl Ref = S.getRawDataRefImpl();
+  StringRef SegName = info->O->getSectionFinalSegmentName(Ref);
+  outs() << "Contents of (" << SegName << "," << SectName << ") section\n";
+  p = S.getAddress();
+  r = get_pointer_32(p, offset, left, S, info);
+  if (r == nullptr)
+    return;
+  memset(&o, '\0', sizeof(struct objc_image_info32));
+  if (left < sizeof(struct objc_image_info32)) {
+    memcpy(&o, r, left);
+    outs() << "   (objc_image_info entends past the end of the section)\n";
+  } else
+    memcpy(&o, r, sizeof(struct objc_image_info32));
+  if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
+    swapStruct(o);
+  outs() << "  version " << o.version << "\n";
+  outs() << "    flags " << format("0x%" PRIx32, o.flags);
+  if (o.flags & OBJC_IMAGE_IS_REPLACEMENT)
+    outs() << " OBJC_IMAGE_IS_REPLACEMENT";
+  if (o.flags & OBJC_IMAGE_SUPPORTS_GC)
+    outs() << " OBJC_IMAGE_SUPPORTS_GC";
+  swift_version = (o.flags >> 8) & 0xff;
+  if (swift_version != 0) {
+    if (swift_version == 1)
+      outs() << " Swift 1.0";
+    else if (swift_version == 2)
+      outs() << " Swift 1.1";
+    else
+      outs() << " unknown future Swift version (" << swift_version << ")";
+  }
+  outs() << "\n";
+}
+
 static void printObjc2_64bit_MetaData(MachOObjectFile *O, bool verbose) {
   SymbolAddressMap AddrMap;
   if (verbose)
@@ -3840,10 +4613,104 @@ static void printObjc2_64bit_MetaData(Ma
 }
 
 static void printObjc2_32bit_MetaData(MachOObjectFile *O, bool verbose) {
-  outs() << "Printing Objc2 32-bit MetaData not yet supported\n";
+  SymbolAddressMap AddrMap;
+  if (verbose)
+    CreateSymbolAddressMap(O, &AddrMap);
+
+  std::vector<SectionRef> Sections;
+  for (const SectionRef &Section : O->sections()) {
+    StringRef SectName;
+    Section.getName(SectName);
+    Sections.push_back(Section);
+  }
+
+  struct DisassembleInfo info;
+  // Set up the block of info used by the Symbolizer call backs.
+  info.verbose = verbose;
+  info.O = O;
+  info.AddrMap = &AddrMap;
+  info.Sections = &Sections;
+  info.class_name = nullptr;
+  info.selector_name = nullptr;
+  info.method = nullptr;
+  info.demangled_name = nullptr;
+  info.bindtable = nullptr;
+  info.adrp_addr = 0;
+  info.adrp_inst = 0;
+
+  const SectionRef CL = get_section(O, "__OBJC2", "__class_list");
+  if (CL != SectionRef()) {
+    info.S = CL;
+    walk_pointer_list_32("class", CL, O, &info, print_class32_t);
+  } else {
+    const SectionRef CL = get_section(O, "__DATA", "__objc_classlist");
+    info.S = CL;
+    walk_pointer_list_32("class", CL, O, &info, print_class32_t);
+  }
+
+  const SectionRef CR = get_section(O, "__OBJC2", "__class_refs");
+  if (CR != SectionRef()) {
+    info.S = CR;
+    walk_pointer_list_32("class refs", CR, O, &info, nullptr);
+  } else {
+    const SectionRef CR = get_section(O, "__DATA", "__objc_classrefs");
+    info.S = CR;
+    walk_pointer_list_32("class refs", CR, O, &info, nullptr);
+  }
+
+  const SectionRef SR = get_section(O, "__OBJC2", "__super_refs");
+  if (SR != SectionRef()) {
+    info.S = SR;
+    walk_pointer_list_32("super refs", SR, O, &info, nullptr);
+  } else {
+    const SectionRef SR = get_section(O, "__DATA", "__objc_superrefs");
+    info.S = SR;
+    walk_pointer_list_32("super refs", SR, O, &info, nullptr);
+  }
+
+  const SectionRef CA = get_section(O, "__OBJC2", "__category_list");
+  if (CA != SectionRef()) {
+    info.S = CA;
+    walk_pointer_list_32("category", CA, O, &info, print_category32_t);
+  } else {
+    const SectionRef CA = get_section(O, "__DATA", "__objc_catlist");
+    info.S = CA;
+    walk_pointer_list_32("category", CA, O, &info, print_category32_t);
+  }
+
+  const SectionRef PL = get_section(O, "__OBJC2", "__protocol_list");
+  if (PL != SectionRef()) {
+    info.S = PL;
+    walk_pointer_list_32("protocol", PL, O, &info, nullptr);
+  } else {
+    const SectionRef PL = get_section(O, "__DATA", "__objc_protolist");
+    info.S = PL;
+    walk_pointer_list_32("protocol", PL, O, &info, nullptr);
+  }
+
+  const SectionRef MR = get_section(O, "__OBJC2", "__message_refs");
+  if (MR != SectionRef()) {
+    info.S = MR;
+    print_message_refs32(MR, &info);
+  } else {
+    const SectionRef MR = get_section(O, "__DATA", "__objc_msgrefs");
+    info.S = MR;
+    print_message_refs32(MR, &info);
+  }
+
+  const SectionRef II = get_section(O, "__OBJC2", "__image_info");
+  if (II != SectionRef()) {
+    info.S = II;
+    print_image_info32(II, &info);
+  } else {
+    const SectionRef II = get_section(O, "__DATA", "__objc_imageinfo");
+    info.S = II;
+    print_image_info32(II, &info);
+  }
 }
 
 static bool printObjc1_32bit_MetaData(MachOObjectFile *O, bool verbose) {
+  outs() << "Objective-C segment\n";
   const SectionRef S = get_section(O, "__OBJC", "__module_info");
   if (S != SectionRef()) {
     outs() << "Printing Objc1 32-bit MetaData not yet supported\n";





More information about the llvm-commits mailing list