Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Unified Diff: class-dump/src/CDFatFile.m

Issue 7793008: Add the 3.3.3 sources for class-dump. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « class-dump/src/CDFatFile.h ('k') | class-dump/src/CDFile.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: class-dump/src/CDFatFile.m
===================================================================
--- class-dump/src/CDFatFile.m (revision 0)
+++ class-dump/src/CDFatFile.m (revision 0)
@@ -0,0 +1,168 @@
+// -*- mode: ObjC -*-
+
+// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files.
+// Copyright (C) 1997-1998, 2000-2001, 2004-2010 Steve Nygard.
+
+#import "CDFatFile.h"
+
+#include <mach-o/arch.h>
+#include <mach-o/fat.h>
+
+#import "CDDataCursor.h"
+#import "CDFatArch.h"
+#import "CDMachOFile.h"
+
+@implementation CDFatFile
+
+- (id)initWithData:(NSData *)someData offset:(NSUInteger)anOffset filename:(NSString *)aFilename searchPathState:(CDSearchPathState *)aSearchPathState;
+{
+ CDDataCursor *cursor;
+ unsigned int index;
+ struct fat_header header;
+
+ if ([super initWithData:someData offset:anOffset filename:aFilename searchPathState:aSearchPathState] == nil)
+ return nil;
+
+ arches = [[NSMutableArray alloc] init];
+
+ cursor = [[CDDataCursor alloc] initWithData:someData];
+ [cursor setOffset:offset];
+ header.magic = [cursor readBigInt32];
+
+ //NSLog(@"(testing fat) magic: 0x%x", header.magic);
+ if (header.magic != FAT_MAGIC) {
+ [cursor release];
+ [self release];
+ return nil;
+ }
+
+ header.nfat_arch = [cursor readBigInt32];
+ //NSLog(@"nfat_arch: %u", header.nfat_arch);
+ for (index = 0; index < header.nfat_arch; index++) {
+ CDFatArch *arch;
+
+ arch = [[CDFatArch alloc] initWithDataCursor:cursor];
+ [arch setFatFile:self];
+ [arches addObject:arch];
+ [arch release];
+ }
+
+ [cursor release];
+
+ //NSLog(@"arches: %@", arches);
+
+ return self;
+}
+
+- (void)dealloc;
+{
+ [arches release];
+
+ [super dealloc];
+}
+
+
+// Case 1: no arch specified
+// - check main file for these, then lock down on that arch:
+// - local arch, 64 bit
+// - local arch, 32 bit
+// - any arch, 64 bit
+// - any arch, 32 bit
+//
+// Case 2: you specified a specific arch (i386, x86_64, ppc, ppc7400, ppc64, etc.)
+// - only that arch
+//
+// In either case, we can ignore the cpu subtype
+
+// Returns YES on success, NO on failure.
+- (BOOL)bestMatchForLocalArch:(CDArch *)archPtr;
+{
+ const NXArchInfo *archInfo;
+ cpu_type_t targetType;
+
+ archInfo = NXGetLocalArchInfo();
+ if (archInfo == NULL)
+ return NO;
+
+ if (archPtr == NULL)
+ return [arches count] > 0;
+
+ targetType = archInfo->cputype & ~CPU_ARCH_MASK;
+
+#ifdef __LP64__
+ // This architecture, 64 bit
+ for (CDFatArch *fatArch in arches) {
+ if ([fatArch maskedCPUType] == targetType && [fatArch uses64BitABI]) {
+ *archPtr = [fatArch arch];
+ return YES;
+ }
+ }
+#endif
+
+ // This architecture, 32 bit
+ for (CDFatArch *fatArch in arches) {
+ if ([fatArch maskedCPUType] == targetType && [fatArch uses64BitABI] == NO) {
+ *archPtr = [fatArch arch];
+ return YES;
+ }
+ }
+
+#ifdef __LP64__
+ // Any architecture, 64 bit
+ for (CDFatArch *fatArch in arches) {
+ if ([fatArch uses64BitABI]) {
+ *archPtr = [fatArch arch];
+ return YES;
+ }
+ }
+#endif
+
+ // Any architecture, 32 bit
+ for (CDFatArch *fatArch in arches) {
+ if ([fatArch uses64BitABI] == NO) {
+ *archPtr = [fatArch arch];
+ return YES;
+ }
+ }
+
+ // Any architecture
+ if ([arches count] > 0) {
+ *archPtr = [[arches objectAtIndex:0] arch];
+ return YES;
+ }
+
+ return NO;
+}
+
+- (CDMachOFile *)machOFileWithArch:(CDArch)cdarch;
+{
+ for (CDFatArch *arch in arches) {
+ if ([arch cpuType] == cdarch.cputype)
+ return [arch machOFile];
+ }
+
+ return nil;
+}
+
+- (NSString *)description;
+{
+ return [NSString stringWithFormat:@"[%p] CDFatFile with %u arches", self, [arches count]];
+}
+
+- (NSArray *)arches;
+{
+ return arches;
+}
+
+- (NSArray *)archNames;
+{
+ NSMutableArray *archNames;
+
+ archNames = [NSMutableArray array];
+ for (CDFatArch *arch in arches)
+ [archNames addObject:[arch archName]];
+
+ return archNames;
+}
+
+@end
Property changes on: class-dump/src/CDFatFile.m
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « class-dump/src/CDFatFile.h ('k') | class-dump/src/CDFile.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698