Skip to content

Commit

Permalink
Undo iOS ARM64 changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
atgreen committed Dec 5, 2013
1 parent 356b2cb commit 3dc3f32
Show file tree
Hide file tree
Showing 19 changed files with 616 additions and 803 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Expand Up @@ -19,5 +19,3 @@ autom4te.cache
libffi.xcodeproj/xcuserdata
libffi.xcodeproj/project.xcworkspace
ios/
osx/
build_*/
28 changes: 0 additions & 28 deletions ChangeLog
@@ -1,31 +1,3 @@
2013-11-30 Anthony Green <green@moxielogic.com>

* Makefile.am (EXTRA_DIST): Remove build-ios.sh.
* Makefile:in: Rebuilt.

2012-11-30 Zachary Waldowski <zwaldowski@gmail.com>

* src/arm/ffi.c, src/dlmalloc.c, src/x86/ffi.c: Silence Clang
warnings.
* src/arm/sysv.S: Simplify RETLDM arguments for LLVM 3.1. More
Clang clean-ups.
* .gitignore: Exclude OS X generated source and build_.
* generate-osx-source-and-headers.py: Clean up, modernize scripts.
* generate-ios-source-and-headers.py: Ditto, and add __arm64__
support.
* include/ffi_common.h: Test for HAVE_STRING_H.
* src/closures.c (open_temp_exec_file_dir): Use size_t.
* src/prep_cif (ffi_prep_cif_core): Cast ALIGN result.
* src/x86/ffi64.c: More Clang warning clean-ups.
* src/aarch64/sysv.S: Use CNAME for global symbols. Only use
.size for ELF targets.
* src/aarch64/ffi.c: Clean up for double == long double. Clean up
for Xcode warnings. Use Clang cache invalidation builtin. Use
size_t in place of unsigned in many places.
* libffi.xcodeproj/project.pbxproj: Include x86_64+aarch64 pieces
in library. Export headers properly.
* build-ios.sh: Remove.

2013-11-21 Anthony Green <green@moxielogic.com>

* configure, Makefile.in, include/Makefile.in, include/ffi.h.in,
Expand Down
2 changes: 1 addition & 1 deletion Makefile.am
Expand Up @@ -8,7 +8,7 @@ SUBDIRS = include testsuite man

EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \
src/alpha/ffi.c src/alpha/osf.S \
build-ios.sh src/alpha/ffi.c src/alpha/osf.S \
src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \
src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \
src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \
Expand Down
2 changes: 1 addition & 1 deletion Makefile.in
Expand Up @@ -593,7 +593,7 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = include testsuite man
EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \
src/alpha/ffi.c src/alpha/osf.S \
build-ios.sh src/alpha/ffi.c src/alpha/osf.S \
src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \
src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \
src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \
Expand Down
5 changes: 1 addition & 4 deletions README
Expand Up @@ -51,7 +51,6 @@ tested:
|-----------------+------------------+-------------------------|
| Architecture | Operating System | Compiler |
|-----------------+------------------+-------------------------|
| AArch64 (ARM64) | iOS | Clang |
| AArch64 | Linux | GCC |
| Alpha | Linux | GCC |
| Alpha | Tru64 | GCC |
Expand Down Expand Up @@ -170,10 +169,8 @@ History
See the ChangeLog files for details.

3.0.14 TBD
Add Aarch (ARM64) iOS support.
Add m88k and DEC VAX support.
Add Nios II support.
Add Power ELFv2 Linux support.
Add m88k and DEC VAX support.
Fix MIPS N32 ABI bug.
Various FreeBSD and UltraSPARC IIi fixes.

Expand Down
67 changes: 67 additions & 0 deletions build-ios.sh
@@ -0,0 +1,67 @@
#!/bin/sh

PLATFORM_IOS=/Developer/Platforms/iPhoneOS.platform/
PLATFORM_IOS_SIM=/Developer/Platforms/iPhoneSimulator.platform/
SDK_IOS_VERSION="4.2"
MIN_IOS_VERSION="3.0"
OUTPUT_DIR="universal-ios"

build_target () {
local platform=$1
local sdk=$2
local arch=$3
local triple=$4
local builddir=$5

mkdir -p "${builddir}"
pushd "${builddir}"
export CC="${platform}"/Developer/usr/bin/gcc-4.2
export CFLAGS="-arch ${arch} -isysroot ${sdk} -miphoneos-version-min=${MIN_IOS_VERSION}"
../configure --host=${triple} && make
popd
}

# Build all targets
build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv6 arm-apple-darwin10 armv6-ios
build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv7 arm-apple-darwin10 armv7-ios
build_target "${PLATFORM_IOS_SIM}" "${PLATFORM_IOS_SIM}/Developer/SDKs/iPhoneSimulator${SDK_IOS_VERSION}.sdk/" i386 i386-apple-darwin10 i386-ios-sim

# Create universal output directories
mkdir -p "${OUTPUT_DIR}"
mkdir -p "${OUTPUT_DIR}/include"
mkdir -p "${OUTPUT_DIR}/include/armv6"
mkdir -p "${OUTPUT_DIR}/include/armv7"
mkdir -p "${OUTPUT_DIR}/include/i386"

# Create the universal binary
lipo -create armv6-ios/.libs/libffi.a armv7-ios/.libs/libffi.a i386-ios-sim/.libs/libffi.a -output "${OUTPUT_DIR}/libffi.a"

# Copy in the headers
copy_headers () {
local src=$1
local dest=$2

# Fix non-relative header reference
sed 's/<ffitarget.h>/"ffitarget.h"/' < "${src}/include/ffi.h" > "${dest}/ffi.h"
cp "${src}/include/ffitarget.h" "${dest}"
}

copy_headers armv6-ios "${OUTPUT_DIR}/include/armv6"
copy_headers armv7-ios "${OUTPUT_DIR}/include/armv7"
copy_headers i386-ios-sim "${OUTPUT_DIR}/include/i386"

# Create top-level header
(
cat << EOF
#ifdef __arm__
#include <arm/arch.h>
#ifdef _ARM_ARCH_6
#include "include/armv6/ffi.h"
#elif _ARM_ARCH_7
#include "include/armv7/ffi.h"
#endif
#elif defined(__i386__)
#include "include/i386/ffi.h"
#endif
EOF
) > "${OUTPUT_DIR}/ffi.h"
142 changes: 43 additions & 99 deletions generate-ios-source-and-headers.py
@@ -1,40 +1,29 @@
#!/usr/bin/env python

import subprocess
import re
import os
import errno
import collections
import sys

class Platform(object):
pass

sdk_re = re.compile(r'.*-sdk ([a-zA-Z0-9.]*)')


def sdkinfo(sdkname):
ret = {}
for line in subprocess.Popen(['xcodebuild', '-sdk', sdkname, '-version'], stdout=subprocess.PIPE).stdout:
kv = line.strip().split(': ', 1)
if len(kv) == 2:
k, v = kv
k,v = kv
ret[k] = v
return ret


def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST:
pass
else:
raise


sim_sdk_info = sdkinfo('iphonesimulator')
device_sdk_info = sdkinfo('iphoneos')


def latest_sdks():
latest_sim = None
latest_device = None
Expand All @@ -50,62 +39,36 @@ def latest_sdks():

sim_sdk, device_sdk = latest_sdks()


class simulator_platform(Platform):
sdk = 'iphonesimulator'
sdk='iphonesimulator'
arch = 'i386'
short_arch = arch
triple = 'i386-apple-darwin11'
name = 'simulator'
triple = 'i386-apple-darwin10'
sdkroot = sim_sdk_info['Path']
version_min = '5.1.1'

prefix = "#ifdef __i386__\n\n"
prefix = "#if !defined(__arm__) && defined(__i386__)\n\n"
suffix = "\n\n#endif"


class simulator64_platform(Platform):
sdk = 'iphonesimulator'
arch = 'x86_64'
short_arch = arch
triple = 'x86_64-apple-darwin13'
sdkroot = sim_sdk_info['Path']
version_min = '7.0'

prefix = "#ifdef __x86_64__\n\n"
suffix = "\n\n#endif"


class device_platform(Platform):
sdk = 'iphoneos'
sdk='iphoneos'
name = 'ios'
arch = 'armv7'
short_arch = 'arm'
triple = 'arm-apple-darwin11'
triple = 'arm-apple-darwin10'
sdkroot = device_sdk_info['Path']
version_min = '5.1.1'

prefix = "#ifdef __arm__\n\n"
suffix = "\n\n#endif"


class device64_platform(Platform):
sdk = 'iphoneos'
arch = 'arm64'
short_arch = 'arm64'
triple = 'aarch64-apple-darwin13'
sdkroot = device_sdk_info['Path']
version_min = '7.0'

prefix = "#ifdef __arm64__\n\n"
suffix = "\n\n#endif"


def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''):
mkdir_p(dst_dir)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)

out_filename = filename

if file_suffix:
split_name = os.path.splitext(filename)
out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])
out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])

with open(os.path.join(src_dir, filename)) as in_file:
with open(os.path.join(dst_dir, out_filename), 'w') as out_file:
Expand All @@ -119,15 +82,16 @@ def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''

headers_seen = collections.defaultdict(set)


def move_source_tree(src_dir, dest_dir, dest_include_dir, arch=None, prefix=None, suffix=None):
for root, dirs, files in os.walk(src_dir, followlinks=True):
relroot = os.path.relpath(root, src_dir)
relroot = os.path.relpath(root,src_dir)

def move_dir(arch, prefix='', suffix='', files=[]):
for file in files:
file_suffix = None
if file.endswith('.h'):
if dest_include_dir:
file_suffix = arch
if arch:
headers_seen[file].add(arch)
move_file(root, dest_include_dir, file, arch, prefix=prefix, suffix=suffix)
Expand All @@ -145,66 +109,46 @@ def move_dir(arch, prefix='', suffix='', files=[]):
move_dir(arch='arm',
prefix="#ifdef __arm__\n\n",
suffix="\n\n#endif",
files=['sysv.S', 'trampoline.S', 'ffi.c'])
elif relroot == 'aarch64':
move_dir(arch='arm64',
prefix="#ifdef __arm64__\n\n",
suffix="\n\n#endif",
files=['sysv.S', 'ffi.c'])
files=files)
elif relroot == 'x86':
move_dir(arch='i386',
prefix="#ifdef __i386__\n\n",
prefix="#if !defined(__arm__) && defined(__i386__)\n\n",
suffix="\n\n#endif",
files=['darwin.S', 'ffi.c'])
move_dir(arch='x86_64',
prefix="#ifdef __x86_64__\n\n",
suffix="\n\n#endif",
files=['darwin64.S', 'ffi64.c'])

files=files)

def build_target(platform):
def xcrun_cmd(cmd):
return subprocess.check_output(['xcrun', '-sdk', platform.sdkroot, '-find', cmd]).strip()

build_dir = 'build_' + platform.short_arch
mkdir_p(build_dir)
env = dict(CC=xcrun_cmd('clang'),
LD=xcrun_cmd('ld'),
CFLAGS='-arch %s -isysroot %s -miphoneos-version-min=%s' % (platform.arch, platform.sdkroot, platform.version_min))
working_dir = os.getcwd()
try:
os.chdir(build_dir)
subprocess.check_call(['../configure', '-host', platform.triple], env=env)
move_source_tree('.', None, '../ios/include',
arch=platform.short_arch,
prefix=platform.prefix,
suffix=platform.suffix)
move_source_tree('./include', None, '../ios/include',
arch=platform.short_arch,
prefix=platform.prefix,
suffix=platform.suffix)
finally:
os.chdir(working_dir)

for header_name, archs in headers_seen.iteritems():
basename, suffix = os.path.splitext(header_name)


def make_tramp():
with open('src/arm/trampoline.S', 'w') as tramp_out:
p = subprocess.Popen(['bash', 'src/arm/gentramp.sh'], stdout=tramp_out)
p.wait()

build_dir = 'build_' + platform.name
if not os.path.exists(build_dir):
os.makedirs(build_dir)
env = dict(CC=xcrun_cmd('clang'),
LD=xcrun_cmd('ld'),
CFLAGS='-arch %s -isysroot %s -miphoneos-version-min=4.0' % (platform.arch, platform.sdkroot))
working_dir=os.getcwd()
try:
os.chdir(build_dir)
subprocess.check_call(['../configure', '-host', platform.triple], env=env)
move_source_tree('.', None, '../ios/include',
arch=platform.arch,
prefix=platform.prefix,
suffix=platform.suffix)
move_source_tree('./include', None, '../ios/include',
arch=platform.arch,
prefix=platform.prefix,
suffix=platform.suffix)
finally:
os.chdir(working_dir)

for header_name, archs in headers_seen.iteritems():
basename, suffix = os.path.splitext(header_name)

def main():
make_tramp()

move_source_tree('src', 'ios/src', 'ios/include')
move_source_tree('include', None, 'ios/include')
build_target(simulator_platform)
build_target(simulator64_platform)
build_target(device_platform)
build_target(device64_platform)

for header_name, archs in headers_seen.iteritems():
basename, suffix = os.path.splitext(header_name)
Expand Down

0 comments on commit 3dc3f32

Please sign in to comment.