From d26d7ae0e4262abfbed488e44f54548e645f7b9f Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Tue, 10 Aug 2021 10:26:13 -0700 Subject: [PATCH] Perform build and magnum tuning Building o//third_party/python now takes 5 seconds on my PC This change works towards modifying Python to use runtime dispatching when appropriate. For example, when loading the magnums in the socket module, it's a good idea to check if the magnum is zero, because that means the local system platform doesn't support it. --- .gitattributes | 3 + libc/sock/alg.h | 29 + libc/sysv/consts.sh | 46 +- libc/sysv/consts/AF_IPX.S | 2 +- libc/sysv/consts/AF_KEY.S | 2 +- libc/sysv/consts/AF_LINK.S | 2 + libc/sysv/consts/ALG_SET_AEAD_ASSOCLEN.S | 2 + libc/sysv/consts/ALG_SET_AEAD_AUTHSIZE.S | 2 + libc/sysv/consts/ALG_SET_DRBG_ENTROPY.S | 2 + libc/sysv/consts/ALG_SET_IV.S | 2 + libc/sysv/consts/ALG_SET_KEY.S | 2 + libc/sysv/consts/ALG_SET_OP.S | 2 + libc/sysv/consts/IPPORT_USERRESERVED.S | 2 + libc/sysv/consts/IP_ADD_MEMBERSHIP.S | 2 +- libc/sysv/consts/IP_DROP_MEMBERSHIP.S | 2 +- libc/sysv/consts/IP_MULTICAST_IF.S | 2 +- libc/sysv/consts/IP_MULTICAST_LOOP.S | 2 +- libc/sysv/consts/IP_MULTICAST_TTL.S | 2 +- libc/sysv/consts/IP_RECVDSTADDR.S | 2 + libc/sysv/consts/IP_TTL.S | 2 +- libc/sysv/consts/LOCAL_PEERCRED.S | 2 + libc/sysv/consts/MSG_BCAST.S | 2 + libc/sysv/consts/MSG_EOF.S | 2 + libc/sysv/consts/MSG_FIN.S | 2 +- libc/sysv/consts/MSG_MCAST.S | 2 + libc/sysv/consts/MSG_NOTIFICATION.S | 2 + libc/sysv/consts/PF_CAN.S | 2 +- libc/sysv/consts/SO_DOMAIN.S | 2 +- libc/sysv/consts/SO_PEERCRED.S | 2 +- libc/sysv/consts/SO_PROTOCOL.S | 2 +- libc/sysv/consts/SO_SETFIB.S | 2 + libc/sysv/consts/SO_USELOOPBACK.S | 2 + libc/sysv/consts/af.h | 90 +- libc/sysv/consts/alg.h | 30 + libc/sysv/consts/ip.h | 94 +- libc/sysv/consts/ipport.h | 102 +- libc/sysv/consts/msg.h | 54 +- libc/sysv/consts/so.h | 114 +- third_party/gdtoa/gdtoa.internal.h | 19 +- third_party/gdtoa/misc.c | 72 - third_party/lua/lua.mk | 4 +- third_party/python/.gitattributes | 7 +- third_party/python/Include/Python.h | 201 +- third_party/python/Include/abstract.h | 10 +- third_party/python/Include/accu.h | 21 +- third_party/python/Include/asdl.h | 1 + third_party/python/Include/ast.h | 10 +- third_party/python/Include/bitset.h | 12 +- third_party/python/Include/bltinmodule.h | 9 +- third_party/python/Include/boolobject.h | 18 +- third_party/python/Include/bytearrayobject.h | 13 +- third_party/python/Include/bytes_methods.h | 1 + third_party/python/Include/bytesobject.h | 14 +- third_party/python/Include/cellobject.h | 10 +- third_party/python/Include/ceval.h | 10 +- third_party/python/Include/classobject.h | 13 +- third_party/python/Include/code.h | 11 +- third_party/python/Include/codecs.h | 9 +- third_party/python/Include/compile.h | 24 +- third_party/python/Include/complexobject.h | 11 +- third_party/python/Include/datetime.h | 11 +- third_party/python/Include/descrobject.h | 12 +- third_party/python/Include/dictobject.h | 10 +- third_party/python/Include/dtoa.h | 10 +- .../python/Include/dynamic_annotations.h | 10 +- third_party/python/Include/enumobject.h | 13 +- third_party/python/Include/errcode.h | 9 +- third_party/python/Include/eval.h | 12 +- third_party/python/Include/fileobject.h | 11 +- third_party/python/Include/fileutils.h | 11 +- third_party/python/Include/floatobject.h | 16 +- third_party/python/Include/frameobject.h | 12 +- third_party/python/Include/funcobject.h | 11 +- third_party/python/Include/genobject.h | 12 +- third_party/python/Include/graminit.h | 1 + third_party/python/Include/grammar.h | 15 +- third_party/python/Include/import.h | 12 +- third_party/python/Include/intrcheck.h | 10 +- third_party/python/Include/iterobject.h | 10 +- third_party/python/Include/listobject.h | 16 +- third_party/python/Include/longintrepr.h | 12 +- third_party/python/Include/longobject.h | 10 +- third_party/python/Include/marshal.h | 15 +- third_party/python/Include/memoryobject.h | 11 +- third_party/python/Include/metagrammar.h | 10 +- third_party/python/Include/methodobject.h | 12 +- third_party/python/Include/modsupport.h | 15 +- third_party/python/Include/moduleobject.h | 12 +- third_party/python/Include/namespaceobject.h | 12 +- third_party/python/Include/node.h | 12 +- third_party/python/Include/object.h | 10 +- third_party/python/Include/objimpl.h | 17 +- third_party/python/Include/odictobject.h | 10 +- third_party/python/Include/opcode.h | 14 +- third_party/python/Include/osdefs.h | 19 +- third_party/python/Include/osmodule.h | 12 +- third_party/python/Include/parsetok.h | 11 +- third_party/python/Include/patchlevel.h | 1 + third_party/python/Include/pgen.h | 10 +- third_party/python/Include/pgenheaders.h | 15 +- third_party/python/Include/py_curses.h | 56 +- third_party/python/Include/pyarena.h | 98 +- third_party/python/Include/pyatomic.h | 11 +- third_party/python/Include/pycapsule.h | 15 +- third_party/python/Include/pyctype.h | 1 + third_party/python/Include/pydebug.h | 9 +- third_party/python/Include/pydtrace.d | 19 - third_party/python/Include/pydtrace.h | 76 +- third_party/python/Include/pyerrors.h | 12 +- third_party/python/Include/pyexpat.h | 1 + third_party/python/Include/pyfpe.h | 161 +- third_party/python/Include/pygetopt.h | 10 +- third_party/python/Include/pyhash.h | 10 +- third_party/python/Include/pylifecycle.h | 12 +- third_party/python/Include/pymacconfig.h | 2 + third_party/python/Include/pymacro.h | 1 + third_party/python/Include/pymath.h | 93 +- third_party/python/Include/pymem.h | 18 +- third_party/python/Include/pyport.h | 442 +- third_party/python/Include/pystate.h | 13 +- third_party/python/Include/pystrcmp.h | 11 +- third_party/python/Include/pystrhex.h | 11 +- third_party/python/Include/pystrtod.h | 12 +- third_party/python/Include/pythonrun.h | 12 +- third_party/python/Include/pythread.h | 12 +- third_party/python/Include/pytime.h | 15 +- third_party/python/Include/rangeobject.h | 12 +- third_party/python/Include/setobject.h | 11 +- third_party/python/Include/sliceobject.h | 9 +- third_party/python/Include/structmember.h | 14 +- third_party/python/Include/structseq.h | 12 +- third_party/python/Include/symtable.h | 14 +- third_party/python/Include/sysmodule.h | 12 +- third_party/python/Include/token.h | 11 +- third_party/python/Include/traceback.h | 14 +- third_party/python/Include/tupleobject.h | 12 +- third_party/python/Include/typeslots.h | 1 + third_party/python/Include/ucnhash.h | 10 +- third_party/python/Include/unicodeobject.h | 23 +- third_party/python/Include/warnings.h | 9 +- third_party/python/Include/weakrefobject.h | 13 +- .../distutils/command/wininst-10.0-amd64.exe | Bin 222208 -> 0 bytes .../Lib/distutils/command/wininst-10.0.exe | Bin 190976 -> 0 bytes .../distutils/command/wininst-14.0-amd64.exe | Bin 587776 -> 0 bytes .../Lib/distutils/command/wininst-14.0.exe | Bin 458240 -> 0 bytes .../Lib/distutils/command/wininst-6.0.exe | Bin 61440 -> 0 bytes .../Lib/distutils/command/wininst-7.1.exe | Bin 65536 -> 0 bytes .../Lib/distutils/command/wininst-8.0.exe | Bin 61440 -> 0 bytes .../distutils/command/wininst-9.0-amd64.exe | Bin 224256 -> 0 bytes .../Lib/distutils/command/wininst-9.0.exe | Bin 196096 -> 0 bytes .../python/Lib/idlelib/Icons/idle.icns | Bin 57435 -> 0 bytes third_party/python/Lib/idlelib/Icons/idle.ico | Bin 19790 -> 0 bytes third_party/python/Modules/_asynciomodule.c | 3 +- third_party/python/Modules/_bisectmodule.c | 3 +- .../python/Modules/_blake2/blake2b_impl.c | 11 +- .../python/Modules/_blake2/blake2module.c | 5 +- third_party/python/Modules/_blake2/blake2ns.h | 1 + .../python/Modules/_blake2/blake2s_impl.c | 21 +- .../Modules/_blake2/impl/blake2-config.h | 1 + .../python/Modules/_blake2/impl/blake2-impl.h | 4 +- .../python/Modules/_blake2/impl/blake2.h | 4 +- .../Modules/_blake2/impl/blake2b-load-sse2.h | 1 + .../Modules/_blake2/impl/blake2b-load-sse41.h | 1 + .../python/Modules/_blake2/impl/blake2b-ref.c | 5 +- .../Modules/_blake2/impl/blake2b-round.h | 1 + .../python/Modules/_blake2/impl/blake2b.c | 1 + .../Modules/_blake2/impl/blake2s-load-sse2.h | 1 + .../Modules/_blake2/impl/blake2s-load-sse41.h | 1 + .../Modules/_blake2/impl/blake2s-load-xop.h | 1 + .../python/Modules/_blake2/impl/blake2s-ref.c | 5 +- .../Modules/_blake2/impl/blake2s-round.h | 1 + .../python/Modules/_blake2/impl/blake2s.c | 1 + third_party/python/Modules/_bz2module.c | 13 +- third_party/python/Modules/_codecsmodule.c | 9 +- .../python/Modules/_collectionsmodule.c | 11 +- third_party/python/Modules/_cryptmodule.c | 3 +- third_party/python/Modules/_csv.c | 5 +- third_party/python/Modules/_ctypes/_ctypes.c | 1 + .../python/Modules/_ctypes/_ctypes_test.c | 1 + .../python/Modules/_ctypes/_ctypes_test.h | 1 + .../python/Modules/_ctypes/callbacks.c | 1 + third_party/python/Modules/_ctypes/callproc.c | 1 + third_party/python/Modules/_ctypes/cfield.c | 1 + third_party/python/Modules/_ctypes/ctypes.h | 1 + .../python/Modules/_ctypes/ctypes_dlfcn.h | 1 + .../python/Modules/_ctypes/darwin/LICENSE | 31 - .../python/Modules/_ctypes/darwin/README | 95 - .../Modules/_ctypes/darwin/README.ctypes | 11 - .../python/Modules/_ctypes/darwin/dlfcn.h | 84 - .../Modules/_ctypes/darwin/dlfcn_simple.c | 272 - .../python/Modules/_ctypes/libffi/ChangeLog | 5105 ---- .../Modules/_ctypes/libffi/ChangeLog.libffi | 584 - .../_ctypes/libffi/ChangeLog.libffi-3.1 | 6000 ----- .../Modules/_ctypes/libffi/ChangeLog.libgcj | 40 - .../Modules/_ctypes/libffi/ChangeLog.v1 | 764 - .../python/Modules/_ctypes/libffi/LICENSE | 21 - .../python/Modules/_ctypes/libffi/Makefile.am | 254 - .../python/Modules/_ctypes/libffi/Makefile.in | 2156 -- .../python/Modules/_ctypes/libffi/README | 428 - .../Modules/_ctypes/libffi/acinclude.m4 | 92 - .../python/Modules/_ctypes/libffi/aclocal.m4 | 1961 -- .../python/Modules/_ctypes/libffi/compile | 347 - .../Modules/_ctypes/libffi/config.guess | 1558 -- .../python/Modules/_ctypes/libffi/config.sub | 1788 -- .../python/Modules/_ctypes/libffi/configure | 21691 ---------------- .../Modules/_ctypes/libffi/configure.ac | 630 - .../python/Modules/_ctypes/libffi/depcomp | 791 - .../Modules/_ctypes/libffi/doc/libffi.info | 618 - .../Modules/_ctypes/libffi/doc/libffi.texi | 625 - .../Modules/_ctypes/libffi/doc/stamp-vti | 4 - .../Modules/_ctypes/libffi/doc/version.texi | 4 - .../Modules/_ctypes/libffi/fficonfig.h.in | 210 - .../Modules/_ctypes/libffi/fficonfig.py.in | 35 - .../generate-darwin-source-and-headers.py | 209 - .../_ctypes/libffi/include/Makefile.am | 9 - .../_ctypes/libffi/include/Makefile.in | 587 - .../Modules/_ctypes/libffi/include/ffi.h.in | 476 - .../_ctypes/libffi/include/ffi_common.h | 132 - .../python/Modules/_ctypes/libffi/install-sh | 527 - .../Modules/_ctypes/libffi/libffi.pc.in | 11 - .../libffi/libffi.xcodeproj/project.pbxproj | 637 - .../Modules/_ctypes/libffi/libtool-ldflags | 106 - .../Modules/_ctypes/libffi/libtool-version | 29 - .../python/Modules/_ctypes/libffi/ltmain.sh | 10932 -------- .../Modules/_ctypes/libffi/m4/asmcfi.m4 | 13 - .../_ctypes/libffi/m4/ax_append_flag.m4 | 69 - .../Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 | 181 - .../_ctypes/libffi/m4/ax_cflags_warn_all.m4 | 122 - .../libffi/m4/ax_check_compile_flag.m4 | 72 - .../_ctypes/libffi/m4/ax_compiler_vendor.m4 | 84 - .../_ctypes/libffi/m4/ax_configure_args.m4 | 70 - .../_ctypes/libffi/m4/ax_enable_builddir.m4 | 300 - .../_ctypes/libffi/m4/ax_gcc_archflag.m4 | 225 - .../_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 | 79 - .../Modules/_ctypes/libffi/m4/libtool.m4 | 7989 ------ .../Modules/_ctypes/libffi/m4/ltoptions.m4 | 382 - .../Modules/_ctypes/libffi/m4/ltsugar.m4 | 124 - .../Modules/_ctypes/libffi/m4/ltversion.m4 | 23 - .../Modules/_ctypes/libffi/m4/lt~obsolete.m4 | 99 - .../Modules/_ctypes/libffi/man/Makefile.am | 8 - .../Modules/_ctypes/libffi/man/Makefile.in | 541 - .../python/Modules/_ctypes/libffi/man/ffi.3 | 41 - .../Modules/_ctypes/libffi/man/ffi_call.3 | 103 - .../Modules/_ctypes/libffi/man/ffi_prep_cif.3 | 68 - .../_ctypes/libffi/man/ffi_prep_cif_var.3 | 73 - .../python/Modules/_ctypes/libffi/mdate-sh | 224 - .../python/Modules/_ctypes/libffi/missing | 215 - .../python/Modules/_ctypes/libffi/msvcc.sh | 233 - .../Modules/_ctypes/libffi/src/aarch64/ffi.c | 1168 - .../_ctypes/libffi/src/aarch64/ffitarget.h | 63 - .../Modules/_ctypes/libffi/src/aarch64/sysv.S | 333 - .../Modules/_ctypes/libffi/src/alpha/ffi.c | 288 - .../_ctypes/libffi/src/alpha/ffitarget.h | 53 - .../Modules/_ctypes/libffi/src/alpha/osf.S | 387 - .../_ctypes/libffi/src/arc/arcompact.S | 135 - .../Modules/_ctypes/libffi/src/arc/ffi.c | 268 - .../_ctypes/libffi/src/arc/ffitarget.h | 53 - .../Modules/_ctypes/libffi/src/arm/ffi.c | 931 - .../_ctypes/libffi/src/arm/ffitarget.h | 71 - .../_ctypes/libffi/src/arm/gentramp.sh | 118 - .../Modules/_ctypes/libffi/src/arm/sysv.S | 491 - .../_ctypes/libffi/src/arm/trampoline.S | 4450 ---- .../Modules/_ctypes/libffi/src/avr32/ffi.c | 423 - .../_ctypes/libffi/src/avr32/ffitarget.h | 55 - .../Modules/_ctypes/libffi/src/avr32/sysv.S | 208 - .../Modules/_ctypes/libffi/src/bfin/ffi.c | 196 - .../_ctypes/libffi/src/bfin/ffitarget.h | 43 - .../Modules/_ctypes/libffi/src/bfin/sysv.S | 179 - .../Modules/_ctypes/libffi/src/closures.c | 660 - .../Modules/_ctypes/libffi/src/cris/ffi.c | 386 - .../_ctypes/libffi/src/cris/ffitarget.h | 56 - .../Modules/_ctypes/libffi/src/cris/sysv.S | 215 - .../python/Modules/_ctypes/libffi/src/debug.c | 59 - .../Modules/_ctypes/libffi/src/dlmalloc.c | 5166 ---- .../Modules/_ctypes/libffi/src/frv/eabi.S | 128 - .../Modules/_ctypes/libffi/src/frv/ffi.c | 292 - .../_ctypes/libffi/src/frv/ffitarget.h | 62 - .../Modules/_ctypes/libffi/src/ia64/ffi.c | 586 - .../_ctypes/libffi/src/ia64/ffitarget.h | 55 - .../_ctypes/libffi/src/ia64/ia64_flags.h | 40 - .../Modules/_ctypes/libffi/src/ia64/unix.S | 560 - .../Modules/_ctypes/libffi/src/java_raw_api.c | 356 - .../Modules/_ctypes/libffi/src/m32r/ffi.c | 232 - .../_ctypes/libffi/src/m32r/ffitarget.h | 53 - .../Modules/_ctypes/libffi/src/m32r/sysv.S | 121 - .../Modules/_ctypes/libffi/src/m68k/ffi.c | 362 - .../_ctypes/libffi/src/m68k/ffitarget.h | 54 - .../Modules/_ctypes/libffi/src/m68k/sysv.S | 330 - .../Modules/_ctypes/libffi/src/m88k/ffi.c | 400 - .../_ctypes/libffi/src/m88k/ffitarget.h | 49 - .../Modules/_ctypes/libffi/src/m88k/obsd.S | 209 - .../Modules/_ctypes/libffi/src/metag/ffi.c | 330 - .../_ctypes/libffi/src/metag/ffitarget.h | 53 - .../Modules/_ctypes/libffi/src/metag/sysv.S | 311 - .../_ctypes/libffi/src/microblaze/ffi.c | 321 - .../_ctypes/libffi/src/microblaze/ffitarget.h | 53 - .../_ctypes/libffi/src/microblaze/sysv.S | 302 - .../Modules/_ctypes/libffi/src/mips/ffi.c | 1050 - .../_ctypes/libffi/src/mips/ffitarget.h | 247 - .../Modules/_ctypes/libffi/src/mips/n32.S | 576 - .../Modules/_ctypes/libffi/src/mips/o32.S | 381 - .../Modules/_ctypes/libffi/src/moxie/eabi.S | 101 - .../Modules/_ctypes/libffi/src/moxie/ffi.c | 272 - .../_ctypes/libffi/src/moxie/ffitarget.h | 52 - .../Modules/_ctypes/libffi/src/nios2/ffi.c | 304 - .../_ctypes/libffi/src/nios2/ffitarget.h | 52 - .../Modules/_ctypes/libffi/src/nios2/sysv.S | 136 - .../Modules/_ctypes/libffi/src/pa/ffi.c | 719 - .../Modules/_ctypes/libffi/src/pa/ffitarget.h | 83 - .../Modules/_ctypes/libffi/src/pa/hpux32.S | 368 - .../Modules/_ctypes/libffi/src/pa/linux.S | 357 - .../Modules/_ctypes/libffi/src/powerpc/aix.S | 328 - .../_ctypes/libffi/src/powerpc/aix_closure.S | 447 - .../Modules/_ctypes/libffi/src/powerpc/asm.h | 125 - .../_ctypes/libffi/src/powerpc/darwin.S | 378 - .../libffi/src/powerpc/darwin_closure.S | 571 - .../Modules/_ctypes/libffi/src/powerpc/ffi.c | 141 - .../_ctypes/libffi/src/powerpc/ffi_darwin.c | 1359 - .../_ctypes/libffi/src/powerpc/ffi_linux64.c | 943 - .../_ctypes/libffi/src/powerpc/ffi_powerpc.h | 77 - .../_ctypes/libffi/src/powerpc/ffi_sysv.c | 931 - .../_ctypes/libffi/src/powerpc/ffitarget.h | 183 - .../_ctypes/libffi/src/powerpc/linux64.S | 260 - .../libffi/src/powerpc/linux64_closure.S | 391 - .../_ctypes/libffi/src/powerpc/ppc_closure.S | 384 - .../Modules/_ctypes/libffi/src/powerpc/sysv.S | 220 - .../Modules/_ctypes/libffi/src/prep_cif.c | 245 - .../Modules/_ctypes/libffi/src/raw_api.c | 254 - .../Modules/_ctypes/libffi/src/s390/ffi.c | 781 - .../_ctypes/libffi/src/s390/ffitarget.h | 67 - .../Modules/_ctypes/libffi/src/s390/sysv.S | 434 - .../Modules/_ctypes/libffi/src/sh/ffi.c | 717 - .../Modules/_ctypes/libffi/src/sh/ffitarget.h | 54 - .../Modules/_ctypes/libffi/src/sh/sysv.S | 850 - .../Modules/_ctypes/libffi/src/sh64/ffi.c | 469 - .../_ctypes/libffi/src/sh64/ffitarget.h | 58 - .../Modules/_ctypes/libffi/src/sh64/sysv.S | 539 - .../Modules/_ctypes/libffi/src/sparc/ffi.c | 681 - .../_ctypes/libffi/src/sparc/ffitarget.h | 73 - .../Modules/_ctypes/libffi/src/sparc/v8.S | 346 - .../Modules/_ctypes/libffi/src/sparc/v9.S | 307 - .../Modules/_ctypes/libffi/src/tile/ffi.c | 355 - .../_ctypes/libffi/src/tile/ffitarget.h | 65 - .../Modules/_ctypes/libffi/src/tile/tile.S | 360 - .../python/Modules/_ctypes/libffi/src/types.c | 92 - .../Modules/_ctypes/libffi/src/vax/elfbsd.S | 195 - .../Modules/_ctypes/libffi/src/vax/ffi.c | 276 - .../_ctypes/libffi/src/vax/ffitarget.h | 49 - .../Modules/_ctypes/libffi/src/x86/darwin.S | 444 - .../Modules/_ctypes/libffi/src/x86/darwin64.S | 416 - .../Modules/_ctypes/libffi/src/x86/ffi.c | 867 - .../Modules/_ctypes/libffi/src/x86/ffi64.c | 676 - .../_ctypes/libffi/src/x86/ffitarget.h | 143 - .../Modules/_ctypes/libffi/src/x86/freebsd.S | 463 - .../Modules/_ctypes/libffi/src/x86/sysv.S | 483 - .../Modules/_ctypes/libffi/src/x86/unix64.S | 432 - .../Modules/_ctypes/libffi/src/x86/win32.S | 1306 - .../Modules/_ctypes/libffi/src/x86/win64.S | 468 - .../Modules/_ctypes/libffi/src/xtensa/ffi.c | 298 - .../_ctypes/libffi/src/xtensa/ffitarget.h | 53 - .../Modules/_ctypes/libffi/src/xtensa/sysv.S | 253 - .../_ctypes/libffi/testsuite/Makefile.am | 85 - .../_ctypes/libffi/testsuite/Makefile.in | 590 - .../libffi/testsuite/config/default.exp | 1 - .../_ctypes/libffi/testsuite/lib/libffi.exp | 413 - .../libffi/testsuite/lib/target-libpath.exp | 283 - .../_ctypes/libffi/testsuite/lib/wrapper.exp | 45 - .../libffi/testsuite/libffi.call/call.exp | 28 - .../testsuite/libffi.call/closure_fn0.c | 89 - .../testsuite/libffi.call/closure_fn1.c | 81 - .../testsuite/libffi.call/closure_fn2.c | 81 - .../testsuite/libffi.call/closure_fn3.c | 82 - .../testsuite/libffi.call/closure_fn4.c | 89 - .../testsuite/libffi.call/closure_fn5.c | 92 - .../testsuite/libffi.call/closure_fn6.c | 90 - .../testsuite/libffi.call/closure_loc_fn0.c | 95 - .../testsuite/libffi.call/closure_simple.c | 55 - .../libffi/testsuite/libffi.call/cls_12byte.c | 94 - .../libffi/testsuite/libffi.call/cls_16byte.c | 95 - .../libffi/testsuite/libffi.call/cls_18byte.c | 96 - .../libffi/testsuite/libffi.call/cls_19byte.c | 102 - .../testsuite/libffi.call/cls_1_1byte.c | 89 - .../libffi/testsuite/libffi.call/cls_20byte.c | 91 - .../testsuite/libffi.call/cls_20byte1.c | 93 - .../libffi/testsuite/libffi.call/cls_24byte.c | 113 - .../libffi/testsuite/libffi.call/cls_2byte.c | 90 - .../testsuite/libffi.call/cls_3_1byte.c | 95 - .../libffi/testsuite/libffi.call/cls_3byte1.c | 90 - .../libffi/testsuite/libffi.call/cls_3byte2.c | 90 - .../testsuite/libffi.call/cls_4_1byte.c | 98 - .../libffi/testsuite/libffi.call/cls_4byte.c | 90 - .../testsuite/libffi.call/cls_5_1_byte.c | 109 - .../libffi/testsuite/libffi.call/cls_5byte.c | 98 - .../libffi/testsuite/libffi.call/cls_64byte.c | 124 - .../testsuite/libffi.call/cls_6_1_byte.c | 113 - .../libffi/testsuite/libffi.call/cls_6byte.c | 99 - .../testsuite/libffi.call/cls_7_1_byte.c | 117 - .../libffi/testsuite/libffi.call/cls_7byte.c | 97 - .../libffi/testsuite/libffi.call/cls_8byte.c | 88 - .../libffi/testsuite/libffi.call/cls_9byte1.c | 90 - .../libffi/testsuite/libffi.call/cls_9byte2.c | 91 - .../testsuite/libffi.call/cls_align_double.c | 93 - .../testsuite/libffi.call/cls_align_float.c | 91 - .../libffi.call/cls_align_longdouble.c | 92 - .../libffi.call/cls_align_longdouble_split.c | 134 - .../libffi.call/cls_align_longdouble_split2.c | 117 - .../testsuite/libffi.call/cls_align_pointer.c | 95 - .../testsuite/libffi.call/cls_align_sint16.c | 91 - .../testsuite/libffi.call/cls_align_sint32.c | 91 - .../testsuite/libffi.call/cls_align_sint64.c | 92 - .../testsuite/libffi.call/cls_align_uint16.c | 91 - .../testsuite/libffi.call/cls_align_uint32.c | 91 - .../testsuite/libffi.call/cls_align_uint64.c | 93 - .../testsuite/libffi.call/cls_dbls_struct.c | 66 - .../libffi/testsuite/libffi.call/cls_double.c | 43 - .../testsuite/libffi.call/cls_double_va.c | 61 - .../libffi/testsuite/libffi.call/cls_float.c | 42 - .../testsuite/libffi.call/cls_longdouble.c | 107 - .../testsuite/libffi.call/cls_longdouble_va.c | 61 - .../testsuite/libffi.call/cls_multi_schar.c | 74 - .../testsuite/libffi.call/cls_multi_sshort.c | 74 - .../libffi.call/cls_multi_sshortchar.c | 86 - .../testsuite/libffi.call/cls_multi_uchar.c | 91 - .../testsuite/libffi.call/cls_multi_ushort.c | 74 - .../libffi.call/cls_multi_ushortchar.c | 86 - .../testsuite/libffi.call/cls_pointer.c | 74 - .../testsuite/libffi.call/cls_pointer_stack.c | 142 - .../libffi/testsuite/libffi.call/cls_schar.c | 44 - .../libffi/testsuite/libffi.call/cls_sint.c | 42 - .../libffi/testsuite/libffi.call/cls_sshort.c | 42 - .../testsuite/libffi.call/cls_struct_va1.c | 114 - .../libffi/testsuite/libffi.call/cls_uchar.c | 42 - .../testsuite/libffi.call/cls_uchar_va.c | 44 - .../libffi/testsuite/libffi.call/cls_uint.c | 43 - .../testsuite/libffi.call/cls_uint_va.c | 45 - .../testsuite/libffi.call/cls_ulong_va.c | 45 - .../testsuite/libffi.call/cls_ulonglong.c | 47 - .../libffi/testsuite/libffi.call/cls_ushort.c | 43 - .../testsuite/libffi.call/cls_ushort_va.c | 44 - .../testsuite/libffi.call/err_bad_abi.c | 36 - .../testsuite/libffi.call/err_bad_typedef.c | 26 - .../libffi/testsuite/libffi.call/ffitest.h | 135 - .../libffi/testsuite/libffi.call/float.c | 59 - .../libffi/testsuite/libffi.call/float1.c | 58 - .../libffi/testsuite/libffi.call/float2.c | 58 - .../libffi/testsuite/libffi.call/float3.c | 72 - .../libffi/testsuite/libffi.call/float4.c | 62 - .../libffi/testsuite/libffi.call/float_va.c | 107 - .../testsuite/libffi.call/huge_struct.c | 343 - .../libffi/testsuite/libffi.call/many.c | 59 - .../libffi/testsuite/libffi.call/many2.c | 57 - .../libffi/testsuite/libffi.call/negint.c | 52 - .../testsuite/libffi.call/nested_struct.c | 152 - .../testsuite/libffi.call/nested_struct1.c | 161 - .../testsuite/libffi.call/nested_struct10.c | 133 - .../testsuite/libffi.call/nested_struct11.c | 121 - .../testsuite/libffi.call/nested_struct2.c | 110 - .../testsuite/libffi.call/nested_struct3.c | 111 - .../testsuite/libffi.call/nested_struct4.c | 111 - .../testsuite/libffi.call/nested_struct5.c | 112 - .../testsuite/libffi.call/nested_struct6.c | 131 - .../testsuite/libffi.call/nested_struct7.c | 111 - .../testsuite/libffi.call/nested_struct8.c | 131 - .../testsuite/libffi.call/nested_struct9.c | 131 - .../libffi/testsuite/libffi.call/problem1.c | 90 - .../libffi/testsuite/libffi.call/promotion.c | 59 - .../libffi/testsuite/libffi.call/pyobjc-tc.c | 114 - .../libffi/testsuite/libffi.call/return_dbl.c | 36 - .../testsuite/libffi.call/return_dbl1.c | 43 - .../testsuite/libffi.call/return_dbl2.c | 42 - .../libffi/testsuite/libffi.call/return_fl.c | 35 - .../libffi/testsuite/libffi.call/return_fl1.c | 36 - .../libffi/testsuite/libffi.call/return_fl2.c | 49 - .../libffi/testsuite/libffi.call/return_fl3.c | 42 - .../libffi/testsuite/libffi.call/return_ldl.c | 34 - .../libffi/testsuite/libffi.call/return_ll.c | 41 - .../libffi/testsuite/libffi.call/return_ll1.c | 43 - .../libffi/testsuite/libffi.call/return_sc.c | 36 - .../libffi/testsuite/libffi.call/return_sl.c | 38 - .../libffi/testsuite/libffi.call/return_uc.c | 38 - .../libffi/testsuite/libffi.call/return_ul.c | 38 - .../testsuite/libffi.call/stret_large.c | 145 - .../testsuite/libffi.call/stret_large2.c | 148 - .../testsuite/libffi.call/stret_medium.c | 124 - .../testsuite/libffi.call/stret_medium2.c | 125 - .../libffi/testsuite/libffi.call/strlen.c | 44 - .../libffi/testsuite/libffi.call/strlen2.c | 49 - .../libffi/testsuite/libffi.call/strlen3.c | 49 - .../libffi/testsuite/libffi.call/strlen4.c | 55 - .../libffi/testsuite/libffi.call/struct1.c | 67 - .../libffi/testsuite/libffi.call/struct2.c | 67 - .../libffi/testsuite/libffi.call/struct3.c | 60 - .../libffi/testsuite/libffi.call/struct4.c | 64 - .../libffi/testsuite/libffi.call/struct5.c | 66 - .../libffi/testsuite/libffi.call/struct6.c | 64 - .../libffi/testsuite/libffi.call/struct7.c | 74 - .../libffi/testsuite/libffi.call/struct8.c | 81 - .../libffi/testsuite/libffi.call/struct9.c | 68 - .../testsuite/libffi.call/testclosure.c | 70 - .../testsuite/libffi.call/uninitialized.c | 61 - .../testsuite/libffi.call/unwindtest.cc | 117 - .../libffi.call/unwindtest_ffi_call.cc | 54 - .../libffi/testsuite/libffi.call/va_1.c | 196 - .../libffi/testsuite/libffi.call/va_struct1.c | 121 - .../libffi/testsuite/libffi.call/va_struct2.c | 123 - .../libffi/testsuite/libffi.call/va_struct3.c | 125 - .../python/Modules/_ctypes/libffi/texinfo.tex | 10079 ------- .../Modules/_ctypes/libffi_msvc/LICENSE | 20 - .../python/Modules/_ctypes/libffi_msvc/README | 500 - .../Modules/_ctypes/libffi_msvc/README.ctypes | 7 - .../python/Modules/_ctypes/libffi_msvc/ffi.c | 530 - .../python/Modules/_ctypes/libffi_msvc/ffi.h | 322 - .../Modules/_ctypes/libffi_msvc/ffi_common.h | 77 - .../Modules/_ctypes/libffi_msvc/fficonfig.h | 96 - .../Modules/_ctypes/libffi_msvc/ffitarget.h | 85 - .../Modules/_ctypes/libffi_msvc/prep_cif.c | 188 - .../Modules/_ctypes/libffi_msvc/types.c | 104 - .../Modules/_ctypes/libffi_msvc/win32.c | 162 - .../Modules/_ctypes/libffi_msvc/win64.asm | 156 - .../python/Modules/_ctypes/libffi_osx/LICENSE | 20 - .../python/Modules/_ctypes/libffi_osx/README | 500 - .../Modules/_ctypes/libffi_osx/README.pyobjc | 5 - .../python/Modules/_ctypes/libffi_osx/ffi.c | 227 - .../Modules/_ctypes/libffi_osx/include/ffi.h | 355 - .../_ctypes/libffi_osx/include/ffi_common.h | 102 - .../_ctypes/libffi_osx/include/fficonfig.h | 150 - .../_ctypes/libffi_osx/include/ffitarget.h | 13 - .../libffi_osx/include/ppc-ffitarget.h | 104 - .../libffi_osx/include/x86-ffitarget.h | 88 - .../_ctypes/libffi_osx/powerpc/ppc-darwin.S | 365 - .../_ctypes/libffi_osx/powerpc/ppc-darwin.h | 85 - .../libffi_osx/powerpc/ppc-darwin_closure.S | 308 - .../libffi_osx/powerpc/ppc-ffi_darwin.c | 1776 -- .../libffi_osx/powerpc/ppc64-darwin_closure.S | 418 - .../python/Modules/_ctypes/libffi_osx/types.c | 115 - .../Modules/_ctypes/libffi_osx/x86/darwin64.S | 417 - .../_ctypes/libffi_osx/x86/x86-darwin.S | 422 - .../_ctypes/libffi_osx/x86/x86-ffi64.c | 737 - .../_ctypes/libffi_osx/x86/x86-ffi_darwin.c | 438 - .../python/Modules/_ctypes/malloc_closure.c | 1 + third_party/python/Modules/_ctypes/stgdict.c | 1 + third_party/python/Modules/_curses_panel.c | 1 + third_party/python/Modules/_cursesmodule.c | 3 +- third_party/python/Modules/_datetimemodule.c | 15 +- third_party/python/Modules/_dbmmodule.c | 3 +- .../python/Modules/_decimal/_decimal.c | 21 +- .../python/Modules/_decimal/docstrings.h | 10 +- .../Modules/_decimal/libmpdec/basearith.c | 5 +- .../Modules/_decimal/libmpdec/basearith.h | 2 +- .../python/Modules/_decimal/libmpdec/bits.h | 2 +- .../Modules/_decimal/libmpdec/constants.c | 2 +- .../Modules/_decimal/libmpdec/constants.h | 1 + .../Modules/_decimal/libmpdec/context.c | 6 +- .../Modules/_decimal/libmpdec/convolute.c | 2 +- .../Modules/_decimal/libmpdec/convolute.h | 2 +- .../python/Modules/_decimal/libmpdec/crt.c | 3 +- .../python/Modules/_decimal/libmpdec/crt.h | 2 +- .../Modules/_decimal/libmpdec/difradix2.c | 3 +- .../Modules/_decimal/libmpdec/difradix2.h | 2 +- .../python/Modules/_decimal/libmpdec/fnt.c | 5 +- .../python/Modules/_decimal/libmpdec/fnt.h | 2 +- .../Modules/_decimal/libmpdec/fourstep.c | 2 +- .../Modules/_decimal/libmpdec/fourstep.h | 2 +- .../python/Modules/_decimal/libmpdec/io.c | 10 +- .../python/Modules/_decimal/libmpdec/io.h | 34 +- .../libmpdec/literature/REFERENCES.txt | 51 - .../_decimal/libmpdec/literature/bignum.txt | 83 - .../_decimal/libmpdec/literature/fnt.py | 208 - .../libmpdec/literature/matrix-transform.txt | 256 - .../libmpdec/literature/mulmod-64.txt | 127 - .../libmpdec/literature/mulmod-ppro.txt | 269 - .../_decimal/libmpdec/literature/six-step.txt | 63 - .../libmpdec/literature/umodarith.lisp | 692 - .../python/Modules/_decimal/libmpdec/memory.c | 3 +- .../Modules/_decimal/libmpdec/mpalloc.h | 1 + .../Modules/_decimal/libmpdec/mpdecimal.c | 7 +- .../Modules/_decimal/libmpdec/mpdecimal.h | 102 +- .../Modules/_decimal/libmpdec/numbertheory.c | 3 +- .../Modules/_decimal/libmpdec/numbertheory.h | 1 + .../Modules/_decimal/libmpdec/sixstep.c | 4 +- .../Modules/_decimal/libmpdec/sixstep.h | 2 +- .../Modules/_decimal/libmpdec/transpose.c | 6 +- .../Modules/_decimal/libmpdec/transpose.h | 33 +- .../Modules/_decimal/libmpdec/typearith.h | 2 + .../Modules/_decimal/libmpdec/umodarith.h | 1 + .../Modules/_decimal/libmpdec/vccompat.h | 1 + .../Modules/_decimal/libmpdec/vcstdint.h | 1 + third_party/python/Modules/_elementtree.c | 11 +- third_party/python/Modules/_functoolsmodule.c | 5 +- third_party/python/Modules/_gdbmmodule.c | 3 +- third_party/python/Modules/_hashopenssl.c | 3 +- third_party/python/Modules/_heapqmodule.c | 3 +- third_party/python/Modules/_io/_iomodule.c | 21 +- third_party/python/Modules/_io/_iomodule.h | 1 + third_party/python/Modules/_io/bufferedio.c | 11 +- third_party/python/Modules/_io/bytesio.c | 9 +- .../clinic/{_iomodule.c.h => _iomodule.inc} | 0 .../clinic/{bufferedio.c.h => bufferedio.inc} | 0 .../_io/clinic/{bytesio.c.h => bytesio.inc} | 0 .../_io/clinic/{fileio.c.h => fileio.inc} | 0 .../_io/clinic/{iobase.c.h => iobase.inc} | 0 .../_io/clinic/{stringio.c.h => stringio.inc} | 0 .../_io/clinic/{textio.c.h => textio.inc} | 0 .../{winconsoleio.c.h => winconsoleio.inc} | 0 third_party/python/Modules/_io/fileio.c | 22 +- third_party/python/Modules/_io/iobase.c | 9 +- third_party/python/Modules/_io/stringio.c | 11 +- third_party/python/Modules/_io/textio.c | 9 +- third_party/python/Modules/_io/winconsoleio.c | 19 +- third_party/python/Modules/_json.c | 7 +- third_party/python/Modules/_localemodule.c | 28 +- third_party/python/Modules/_lsprof.c | 20 +- third_party/python/Modules/_lzmamodule.c | 3 +- third_party/python/Modules/_math.c | 6 +- third_party/python/Modules/_math.h | 9 + .../_multiprocessing/multiprocessing.c | 1 + .../_multiprocessing/multiprocessing.h | 1 + third_party/python/Modules/_opcode.c | 7 +- third_party/python/Modules/_operator.c | 3 +- third_party/python/Modules/_pickle.c | 7 +- third_party/python/Modules/_posixsubprocess.c | 50 +- third_party/python/Modules/_randommodule.c | 7 +- third_party/python/Modules/_scproxy.c | 263 - .../Modules/_sha3/clinic/sha3module.c.h | 1 + .../python/Modules/_sha3/kcp/KeccakHash.c | 2 +- .../python/Modules/_sha3/kcp/KeccakHash.h | 2 +- .../_sha3/kcp/KeccakP-1600-SnP-opt32.h | 1 + .../_sha3/kcp/KeccakP-1600-SnP-opt64.h | 3 +- .../Modules/_sha3/kcp/KeccakP-1600-SnP.h | 1 + .../_sha3/kcp/KeccakP-1600-inplace32BI.c | 1 + .../_sha3/kcp/KeccakP-1600-opt64-config.h | 1 + .../Modules/_sha3/kcp/KeccakP-1600-opt64.c | 3 +- .../_sha3/kcp/KeccakP-1600-unrolling.macros | 1 + .../python/Modules/_sha3/kcp/KeccakSponge.c | 1 + .../python/Modules/_sha3/kcp/KeccakSponge.h | 2 +- .../python/Modules/_sha3/kcp/KeccakSponge.inc | 1 + .../Modules/_sha3/kcp/PlSnP-Fallback.inc | 1 + .../python/Modules/_sha3/kcp/SnP-Relaned.h | 1 + third_party/python/Modules/_sha3/kcp/align.h | 1 + third_party/python/Modules/_sha3/sha3module.c | 889 +- third_party/python/Modules/_sqlite/cache.c | 1 + third_party/python/Modules/_sqlite/cache.h | 1 + .../python/Modules/_sqlite/connection.c | 1 + .../python/Modules/_sqlite/connection.h | 1 + third_party/python/Modules/_sqlite/cursor.c | 1 + third_party/python/Modules/_sqlite/cursor.h | 1 + .../python/Modules/_sqlite/microprotocols.c | 1 + .../python/Modules/_sqlite/microprotocols.h | 1 + third_party/python/Modules/_sqlite/module.c | 1 + third_party/python/Modules/_sqlite/module.h | 1 + .../python/Modules/_sqlite/prepare_protocol.c | 1 + .../python/Modules/_sqlite/prepare_protocol.h | 1 + third_party/python/Modules/_sqlite/row.c | 1 + third_party/python/Modules/_sqlite/row.h | 1 + .../python/Modules/_sqlite/statement.c | 1 + .../python/Modules/_sqlite/statement.h | 1 + third_party/python/Modules/_sqlite/util.c | 1 + third_party/python/Modules/_sqlite/util.h | 1 + third_party/python/Modules/_sre.c | 12 +- third_party/python/Modules/_ssl.c | 11 +- .../Modules/{_ssl_data.h => _ssl_data.inc} | 1 + third_party/python/Modules/_stat.c | 62 +- third_party/python/Modules/_struct.c | 6 +- third_party/python/Modules/_testbuffer.c | 1 + third_party/python/Modules/_testcapimodule.c | 24 +- .../python/Modules/_testimportmultiple.c | 1 + third_party/python/Modules/_testmultiphase.c | 1 + third_party/python/Modules/_threadmodule.c | 1 + third_party/python/Modules/_tkinter.c | 3 +- third_party/python/Modules/_tracemalloc.c | 11 +- third_party/python/Modules/_weakref.c | 6 +- third_party/python/Modules/_winapi.c | 3 +- third_party/python/Modules/arraymodule.c | 15 +- third_party/python/Modules/atexitmodule.c | 3 +- third_party/python/Modules/audioop.c | 5 +- third_party/python/Modules/binascii.c | 151 +- .../python/Modules/cjkcodecs/_codecs_cn.c | 6 +- .../python/Modules/cjkcodecs/_codecs_hk.c | 5 +- .../Modules/cjkcodecs/_codecs_iso2022.c | 9 +- .../python/Modules/cjkcodecs/_codecs_jp.c | 11 +- .../python/Modules/cjkcodecs/_codecs_kr.c | 5 +- .../python/Modules/cjkcodecs/_codecs_tw.c | 5 +- .../{alg_jisx0201.h => alg_jisx0201.inc} | 2 + .../python/Modules/cjkcodecs/cjkcodecs.h | 11 +- ...{multibytecodec.c.h => multibytecodec.inc} | 0 ..._jisx0213_2000.h => emu_jisx0213_2000.inc} | 2 + .../{mappings_cn.h => mappings_cn.inc} | 2 + .../{mappings_hk.h => mappings_hk.inc} | 2 + ...0213_pair.h => mappings_jisx0213_pair.inc} | 1 + .../{mappings_jp.h => mappings_jp.inc} | 1 + .../{mappings_kr.h => mappings_kr.inc} | 1 + .../{mappings_tw.h => mappings_tw.inc} | 1 + .../python/Modules/cjkcodecs/multibytecodec.c | 9 +- .../python/Modules/cjkcodecs/multibytecodec.h | 13 +- ...{_asynciomodule.c.h => _asynciomodule.inc} | 1 + .../clinic/{_bz2module.c.h => _bz2module.inc} | 1 + .../{_codecsmodule.c.h => _codecsmodule.inc} | 1 + .../{_cryptmodule.c.h => _cryptmodule.inc} | 1 + .../{_cursesmodule.c.h => _cursesmodule.inc} | 1 + ...datetimemodule.c.h => _datetimemodule.inc} | 1 + .../clinic/{_dbmmodule.c.h => _dbmmodule.inc} | 1 + .../{_elementtree.c.h => _elementtree.inc} | 1 + .../{_gdbmmodule.c.h => _gdbmmodule.inc} | 1 + .../{_hashopenssl.c.h => _hashopenssl.inc} | 1 + .../{_lzmamodule.c.h => _lzmamodule.inc} | 1 + .../clinic/{_opcode.c.h => _opcode.inc} | 1 + .../clinic/{_pickle.c.h => _pickle.inc} | 1 + .../Modules/clinic/{_sre.c.h => _sre.inc} | 1 + .../Modules/clinic/{_ssl.c.h => _ssl.inc} | 1 + .../clinic/{_tkinter.c.h => _tkinter.inc} | 1 + .../clinic/{_weakref.c.h => _weakref.inc} | 1 + .../clinic/{_winapi.c.h => _winapi.inc} | 1 + .../{arraymodule.c.h => arraymodule.inc} | 1 + .../clinic/{audioop.c.h => audioop.inc} | 1 + .../clinic/{binascii.c.h => binascii.inc} | 1 + .../{cmathmodule.c.h => cmathmodule.inc} | 1 + .../{fcntlmodule.c.h => fcntlmodule.inc} | 1 + .../clinic/{grpmodule.c.h => grpmodule.inc} | 1 + .../clinic/{md5module.c.h => md5module.inc} | 1 + .../{posixmodule.c.h => posixmodule.inc} | 1 + .../clinic/{pwdmodule.c.h => pwdmodule.inc} | 1 + .../clinic/{pyexpat.c.h => pyexpat.inc} | 1 + .../clinic/{sha1module.c.h => sha1module.inc} | 1 + .../{sha256module.c.h => sha256module.inc} | 1 + .../{sha512module.c.h => sha512module.inc} | 1 + .../{signalmodule.c.h => signalmodule.inc} | 1 + .../clinic/{spwdmodule.c.h => spwdmodule.inc} | 1 + .../{unicodedata.c.h => unicodedata.inc} | 1 + .../clinic/{zlibmodule.c.h => zlibmodule.inc} | 1 + third_party/python/Modules/cmathmodule.c | 16 +- third_party/python/Modules/config.c | 13 +- third_party/python/Modules/config.c.in | 1 + third_party/python/Modules/errnomodule.c | 39 +- third_party/python/Modules/expat/ascii.h | 45 +- third_party/python/Modules/expat/asciitab.h | 1 + third_party/python/Modules/expat/expat.h | 2 +- .../python/Modules/expat/expat_config.h | 10 +- .../python/Modules/expat/expat_external.h | 1 + third_party/python/Modules/expat/iasciitab.h | 1 + third_party/python/Modules/expat/internal.h | 1 + third_party/python/Modules/expat/latin1tab.h | 1 + third_party/python/Modules/expat/nametab.h | 1 + third_party/python/Modules/expat/pyexpatns.h | 1 + third_party/python/Modules/expat/siphash.h | 22 +- third_party/python/Modules/expat/utf8tab.h | 1 + third_party/python/Modules/expat/winconfig.h | 1 + third_party/python/Modules/expat/xmlparse.c | 5962 ++--- third_party/python/Modules/expat/xmlrole.c | 12 +- third_party/python/Modules/expat/xmlrole.h | 1 + third_party/python/Modules/expat/xmltok.c | 23 +- third_party/python/Modules/expat/xmltok.h | 1 + .../python/Modules/expat/xmltok_impl.c | 1 + .../python/Modules/expat/xmltok_impl.h | 3 +- third_party/python/Modules/expat/xmltok_ns.c | 1 + third_party/python/Modules/faulthandler.c | 19 +- third_party/python/Modules/fcntlmodule.c | 23 +- third_party/python/Modules/fpectlmodule.c | 18 +- third_party/python/Modules/fpetestmodule.c | 1 + third_party/python/Modules/gcmodule.c | 9 +- third_party/python/Modules/getaddrinfo.c | 638 - third_party/python/Modules/getbuildinfo.c | 7 +- third_party/python/Modules/getnameinfo.c | 214 - third_party/python/Modules/getpath.c | 22 +- third_party/python/Modules/grpmodule.c | 11 +- third_party/python/Modules/hashtable.c | 5 +- third_party/python/Modules/itertoolsmodule.c | 5 +- third_party/python/Modules/main.c | 30 +- third_party/python/Modules/mathmodule.c | 5 +- third_party/python/Modules/md5module.c | 9 +- third_party/python/Modules/mmapmodule.c | 56 +- third_party/python/Modules/nismodule.c | 9 +- third_party/python/Modules/ossaudiodev.c | 1 + third_party/python/Modules/overlapped.c | 5 +- third_party/python/Modules/parsermodule.c | 24 +- third_party/python/Modules/posixmodule.c | 284 +- third_party/python/Modules/posixmodule.h | 14 +- third_party/python/Modules/pwdmodule.c | 10 +- third_party/python/Modules/pyexpat.c | 14 +- third_party/python/Modules/readline.c | 8 +- third_party/python/Modules/resource.c | 11 +- third_party/python/Modules/rotatingtree.c | 1 + third_party/python/Modules/rotatingtree.h | 12 +- third_party/python/Modules/selectmodule.c | 54 +- third_party/python/Modules/sha1module.c | 9 +- third_party/python/Modules/sha256module.c | 11 +- third_party/python/Modules/sha512module.c | 11 +- third_party/python/Modules/signalmodule.c | 52 +- third_party/python/Modules/socketmodule.c | 1346 +- third_party/python/Modules/socketmodule.h | 156 +- third_party/python/Modules/spwdmodule.c | 11 +- third_party/python/Modules/symtablemodule.c | 9 +- third_party/python/Modules/syslogmodule.c | 5 +- third_party/python/Modules/termios.c | 1 + third_party/python/Modules/timemodule.c | 29 +- third_party/python/Modules/tkappinit.c | 1 + third_party/python/Modules/unicodedata.c | 9 +- third_party/python/Modules/winreparse.h | 1 + third_party/python/Modules/xxlimited.c | 1 + third_party/python/Modules/xxmodule.c | 1 + third_party/python/Modules/xxsubtype.c | 5 +- third_party/python/Modules/zipimport.c | 11 +- third_party/python/Modules/zlibmodule.c | 7 +- third_party/python/Objects/abstract.c | 10 +- third_party/python/Objects/accu.c | 5 +- third_party/python/Objects/boolobject.c | 5 +- third_party/python/Objects/bytearrayobject.c | 29 +- third_party/python/Objects/bytes_methods.c | 11 +- third_party/python/Objects/bytesobject.c | 29 +- third_party/python/Objects/capsule.c | 3 +- third_party/python/Objects/cellobject.c | 3 +- third_party/python/Objects/classobject.c | 5 +- ...ytearrayobject.c.h => bytearrayobject.inc} | 0 .../{bytesobject.c.h => bytesobject.inc} | 0 .../clinic/{dictobject.c.h => dictobject.inc} | 0 .../{unicodeobject.c.h => unicodeobject.inc} | 0 third_party/python/Objects/codeobject.c | 9 +- third_party/python/Objects/complexobject.c | 8 +- third_party/python/Objects/descrobject.c | 7 +- third_party/python/Objects/dict-common.h | 1 + third_party/python/Objects/dictnotes.txt | 149 - third_party/python/Objects/dictobject.c | 9 +- third_party/python/Objects/enumobject.c | 3 +- third_party/python/Objects/exceptions.c | 7 +- third_party/python/Objects/fileobject.c | 12 +- third_party/python/Objects/floatobject.c | 7 +- third_party/python/Objects/frameobject.c | 12 +- third_party/python/Objects/funcobject.c | 7 +- third_party/python/Objects/genobject.c | 9 +- third_party/python/Objects/iterobject.c | 3 +- third_party/python/Objects/listobject.c | 11 +- third_party/python/Objects/listsort.txt | 755 - third_party/python/Objects/lnotab_notes.txt | 135 - third_party/python/Objects/longobject.c | 18 +- third_party/python/Objects/memoryobject.c | 6 +- third_party/python/Objects/methodobject.c | 5 +- third_party/python/Objects/moduleobject.c | 8 +- third_party/python/Objects/namespaceobject.c | 8 +- third_party/python/Objects/object.c | 16 +- third_party/python/Objects/obmalloc.c | 17 +- third_party/python/Objects/odictobject.c | 9 +- third_party/python/Objects/rangeobject.c | 7 +- third_party/python/Objects/setobject.c | 6 +- third_party/python/Objects/sliceobject.c | 7 +- .../stringlib/{asciilib.h => asciilib.inc} | 2 + .../stringlib/{codecs.h => codecs.inc} | 1 + .../Objects/stringlib/{count.h => count.inc} | 3 +- .../Objects/stringlib/{ctype.h => ctype.inc} | 3 +- .../python/Objects/stringlib/{eq.h => eq.inc} | 1 + .../{fastsearch.h => fastsearch.inc} | 1 + .../Objects/stringlib/{find.h => find.inc} | 3 +- .../{find_max_char.h => find_max_char.inc} | 1 + .../Objects/stringlib/{join.h => join.inc} | 1 + .../{localeutil.h => localeutil.inc} | 1 + .../stringlib/{partition.h => partition.inc} | 3 +- .../stringlib/{replace.h => replace.inc} | 3 +- .../Objects/stringlib/{split.h => split.inc} | 3 +- .../{stringdefs.h => stringdefs.inc} | 1 + .../{transmogrify.h => transmogrify.inc} | 1 + .../stringlib/{ucs1lib.h => ucs1lib.inc} | 1 + .../stringlib/{ucs2lib.h => ucs2lib.inc} | 1 + .../stringlib/{ucs4lib.h => ucs4lib.inc} | 1 + .../Objects/stringlib/{undef.h => undef.inc} | 1 + .../{unicode_format.h => unicode_format.inc} | 1 + .../{unicodedefs.h => unicodedefs.inc} | 1 + third_party/python/Objects/structseq.c | 7 +- third_party/python/Objects/tupleobject.c | 6 +- third_party/python/Objects/typeobject.c | 12 +- third_party/python/Objects/typeslots.inc | 1 + third_party/python/Objects/unicodectype.c | 7 +- third_party/python/Objects/unicodeobject.c | 127 +- .../{unicodetype_db.h => unicodetype_db.inc} | 1 + third_party/python/Objects/weakrefobject.c | 6 +- third_party/python/PC/WinMain.c | 16 - third_party/python/PC/_findvs.cpp | 259 - third_party/python/PC/_msi.c | 1120 - third_party/python/PC/_testconsole.c | 131 - .../python/PC/bdist_wininst/PythonPowered.bmp | Bin 2582 -> 0 bytes .../python/PC/bdist_wininst/README.txt | 5 - third_party/python/PC/bdist_wininst/archive.h | 104 - .../PC/bdist_wininst/bdist_wininst.vcxproj | 108 - .../bdist_wininst.vcxproj.filters | 61 - third_party/python/PC/bdist_wininst/build.bat | 19 - third_party/python/PC/bdist_wininst/extract.c | 320 - third_party/python/PC/bdist_wininst/install.c | 2700 -- .../python/PC/bdist_wininst/install.rc | 77 - .../python/PC/bdist_wininst/resource.h | 31 - third_party/python/PC/clinic/_testconsole.c.h | 82 - third_party/python/PC/clinic/msvcrtmodule.c.h | 572 - .../PC/clinic/{winreg.c.h => winreg.inc} | 0 .../PC/clinic/{winsound.c.h => winsound.inc} | 0 third_party/python/PC/config.c | 3 +- third_party/python/PC/dl_nt.c | 4 +- third_party/python/PC/dllbase_nt.txt | 77 - third_party/python/PC/empty.c | 6 - third_party/python/PC/errmap.h | 80 - third_party/python/PC/errmap.mak | 5 - third_party/python/PC/external/Externals.txt | 3 - .../PC/external/include/Setup.Configuration.h | 827 - ...isualStudio.Setup.Configuration.Native.lib | Bin 2384 -> 0 bytes ...isualStudio.Setup.Configuration.Native.lib | Bin 2392 -> 0 bytes ...isualStudio.Setup.Configuration.Native.lib | Bin 2384 -> 0 bytes ...isualStudio.Setup.Configuration.Native.lib | Bin 2392 -> 0 bytes third_party/python/PC/frozen_dllmain.c | 115 +- third_party/python/PC/generrmap.c | 32 - third_party/python/PC/getpathp.c | 1429 +- third_party/python/PC/icons/launcher.icns | Bin 264476 -> 0 bytes third_party/python/PC/icons/launcher.ico | Bin 87263 -> 0 bytes third_party/python/PC/icons/py.icns | Bin 195977 -> 0 bytes third_party/python/PC/icons/py.ico | Bin 75809 -> 0 bytes third_party/python/PC/icons/pyc.icns | Bin 212125 -> 0 bytes third_party/python/PC/icons/pyc.ico | Bin 78396 -> 0 bytes third_party/python/PC/icons/pyd.icns | Bin 223199 -> 0 bytes third_party/python/PC/icons/pyd.ico | Bin 83351 -> 0 bytes third_party/python/PC/icons/python.icns | Bin 201868 -> 0 bytes third_party/python/PC/icons/python.ico | Bin 77671 -> 0 bytes third_party/python/PC/icons/pythonw.icns | Bin 193222 -> 0 bytes third_party/python/PC/icons/pythonw.ico | Bin 76102 -> 0 bytes third_party/python/PC/icons/setup.icns | Bin 220699 -> 0 bytes third_party/python/PC/icons/setup.ico | Bin 78328 -> 0 bytes .../python/PC/invalid_parameter_handler.c | 17 +- third_party/python/PC/launcher.c | 6 +- third_party/python/PC/msvcrtmodule.c | 606 - third_party/python/PC/pylauncher.rc | 54 - third_party/python/PC/pyshellext.cpp | 610 - third_party/python/PC/pyshellext.def | 6 - third_party/python/PC/pyshellext.idl | 12 - third_party/python/PC/pyshellext.rc | 46 - third_party/python/PC/pyshellext_d.def | 6 - third_party/python/PC/python.manifest | 30 - third_party/python/PC/python3dll.c | 9 - third_party/python/PC/python_exe.rc | 49 - third_party/python/PC/python_nt.rc | 52 - third_party/python/PC/python_ver_rc.h | 34 - third_party/python/PC/pythonw_exe.rc | 49 - third_party/python/PC/readme.txt | 81 - third_party/python/PC/sqlite3.rc | 49 - third_party/python/PC/validate_ucrtbase.py | 89 - third_party/python/PC/winreg.c | 8 +- third_party/python/PC/winsound.c | 7 +- third_party/python/Parser/acceler.c | 12 +- third_party/python/Parser/bitset.c | 5 +- third_party/python/Parser/firstsets.c | 7 +- third_party/python/Parser/grammar.c | 12 +- third_party/python/Parser/grammar1.c | 9 +- third_party/python/Parser/listnode.c | 7 +- third_party/python/Parser/metagrammar.c | 10 +- third_party/python/Parser/myreadline.c | 10 +- third_party/python/Parser/node.c | 9 +- third_party/python/Parser/parser.c | 15 +- third_party/python/Parser/parsetok.c | 17 +- third_party/python/Parser/parsetok_pgen.c | 2 +- third_party/python/Parser/pgen.c | 16 +- third_party/python/Parser/pgenmain.c | 13 +- third_party/python/Parser/printgrammar.c | 5 +- third_party/python/Parser/tokenizer.c | 22 +- third_party/python/Parser/tokenizer.h | 9 +- third_party/python/Parser/tokenizer_pgen.c | 3 +- third_party/python/Programs/_testembed.c | 7 +- third_party/python/Programs/python.c | 16 +- third_party/python/Python/Python-ast.c | 7 +- third_party/python/Python/README | 1 - third_party/python/Python/_warnings.c | 5 +- third_party/python/Python/asdl.c | 6 +- third_party/python/Python/ast.c | 31 +- third_party/python/Python/bltinmodule.c | 24 +- third_party/python/Python/ceval.c | 27 +- .../Python/{ceval_gil.h => ceval_gil.inc} | 8 +- .../{bltinmodule.c.h => bltinmodule.inc} | 0 .../Python/clinic/{import.c.h => import.inc} | 0 third_party/python/Python/codecs.c | 7 +- third_party/python/Python/compile.c | 18 +- third_party/python/Python/condvar.h | 25 +- third_party/python/Python/dtoa.c | 85 +- third_party/python/Python/dup2.c | 31 - .../python/Python/dynamic_annotations.c | 16 +- third_party/python/Python/dynload_dl.c | 7 +- third_party/python/Python/dynload_shlib.c | 23 +- third_party/python/Python/dynload_stub.c | 7 +- third_party/python/Python/dynload_win.c | 17 +- third_party/python/Python/errors.c | 19 +- third_party/python/Python/fileutils.c | 25 +- third_party/python/Python/formatter_unicode.c | 4 +- third_party/python/Python/frozen.c | 8 +- third_party/python/Python/frozenmain.c | 4 +- third_party/python/Python/future.c | 16 +- third_party/python/Python/getargs.c | 8 +- third_party/python/Python/getcompiler.c | 3 +- third_party/python/Python/getcopyright.c | 4 +- third_party/python/Python/getopt.c | 9 +- third_party/python/Python/getplatform.c | 4 +- third_party/python/Python/getversion.c | 8 +- third_party/python/Python/graminit.c | 6 +- third_party/python/Python/import.c | 38 +- third_party/python/Python/importdl.c | 7 +- third_party/python/Python/importdl.h | 7 - .../Python/{importlib.h => importlib.inc} | 1 + ...tlib_external.h => importlib_external.inc} | 0 .../python/Python/makeopcodetargets.py | 2 +- third_party/python/Python/marshal.c | 12 +- third_party/python/Python/modsupport.c | 5 +- third_party/python/Python/mysnprintf.c | 4 +- third_party/python/Python/mystrtoul.c | 12 +- .../{opcode_targets.h => opcode_targets.inc} | 1 + third_party/python/Python/peephole.c | 19 +- third_party/python/Python/pyarena.c | 3 +- third_party/python/Python/pyctype.c | 3 +- third_party/python/Python/pyfpe.c | 5 +- third_party/python/Python/pyhash.c | 12 +- third_party/python/Python/pylifecycle.c | 57 +- third_party/python/Python/pymath.c | 54 +- third_party/python/Python/pystate.c | 128 +- third_party/python/Python/pystrcmp.c | 4 +- third_party/python/Python/pystrhex.c | 4 +- third_party/python/Python/pystrtod.c | 4 +- third_party/python/Python/pythonrun.c | 56 +- third_party/python/Python/pytime.c | 10 +- third_party/python/Python/random.c | 166 +- third_party/python/Python/sigcheck.c | 3 +- third_party/python/Python/structmember.c | 7 +- third_party/python/Python/symtable.c | 12 +- third_party/python/Python/sysmodule.c | 28 +- third_party/python/Python/thread.c | 22 +- third_party/python/Python/thread_nt.h | 9 +- third_party/python/Python/thread_pthread.h | 36 +- third_party/python/Python/traceback.c | 18 +- third_party/python/pyconfig.h | 48 +- third_party/python/python-modules.mk | 22 +- third_party/python/python.mk | 11 +- 1028 files changed, 6576 insertions(+), 172777 deletions(-) create mode 100644 .gitattributes create mode 100644 libc/sock/alg.h create mode 100644 libc/sysv/consts/AF_LINK.S create mode 100644 libc/sysv/consts/ALG_SET_AEAD_ASSOCLEN.S create mode 100644 libc/sysv/consts/ALG_SET_AEAD_AUTHSIZE.S create mode 100644 libc/sysv/consts/ALG_SET_DRBG_ENTROPY.S create mode 100644 libc/sysv/consts/ALG_SET_IV.S create mode 100644 libc/sysv/consts/ALG_SET_KEY.S create mode 100644 libc/sysv/consts/ALG_SET_OP.S create mode 100644 libc/sysv/consts/IPPORT_USERRESERVED.S create mode 100644 libc/sysv/consts/IP_RECVDSTADDR.S create mode 100644 libc/sysv/consts/LOCAL_PEERCRED.S create mode 100644 libc/sysv/consts/MSG_BCAST.S create mode 100644 libc/sysv/consts/MSG_EOF.S create mode 100644 libc/sysv/consts/MSG_MCAST.S create mode 100644 libc/sysv/consts/MSG_NOTIFICATION.S create mode 100644 libc/sysv/consts/SO_SETFIB.S create mode 100644 libc/sysv/consts/SO_USELOOPBACK.S create mode 100644 libc/sysv/consts/alg.h delete mode 100644 third_party/python/Include/pydtrace.d delete mode 100644 third_party/python/Lib/distutils/command/wininst-10.0-amd64.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-10.0.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-14.0-amd64.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-14.0.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-6.0.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-7.1.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-8.0.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-9.0-amd64.exe delete mode 100644 third_party/python/Lib/distutils/command/wininst-9.0.exe delete mode 100644 third_party/python/Lib/idlelib/Icons/idle.icns delete mode 100644 third_party/python/Lib/idlelib/Icons/idle.ico delete mode 100644 third_party/python/Modules/_ctypes/darwin/LICENSE delete mode 100644 third_party/python/Modules/_ctypes/darwin/README delete mode 100644 third_party/python/Modules/_ctypes/darwin/README.ctypes delete mode 100644 third_party/python/Modules/_ctypes/darwin/dlfcn.h delete mode 100644 third_party/python/Modules/_ctypes/darwin/dlfcn_simple.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/ChangeLog delete mode 100644 third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi delete mode 100644 third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi-3.1 delete mode 100644 third_party/python/Modules/_ctypes/libffi/ChangeLog.libgcj delete mode 100644 third_party/python/Modules/_ctypes/libffi/ChangeLog.v1 delete mode 100644 third_party/python/Modules/_ctypes/libffi/LICENSE delete mode 100644 third_party/python/Modules/_ctypes/libffi/Makefile.am delete mode 100644 third_party/python/Modules/_ctypes/libffi/Makefile.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/README delete mode 100644 third_party/python/Modules/_ctypes/libffi/acinclude.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/aclocal.m4 delete mode 100755 third_party/python/Modules/_ctypes/libffi/compile delete mode 100755 third_party/python/Modules/_ctypes/libffi/config.guess delete mode 100755 third_party/python/Modules/_ctypes/libffi/config.sub delete mode 100755 third_party/python/Modules/_ctypes/libffi/configure delete mode 100644 third_party/python/Modules/_ctypes/libffi/configure.ac delete mode 100755 third_party/python/Modules/_ctypes/libffi/depcomp delete mode 100644 third_party/python/Modules/_ctypes/libffi/doc/libffi.info delete mode 100644 third_party/python/Modules/_ctypes/libffi/doc/libffi.texi delete mode 100644 third_party/python/Modules/_ctypes/libffi/doc/stamp-vti delete mode 100644 third_party/python/Modules/_ctypes/libffi/doc/version.texi delete mode 100644 third_party/python/Modules/_ctypes/libffi/fficonfig.h.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/fficonfig.py.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/generate-darwin-source-and-headers.py delete mode 100644 third_party/python/Modules/_ctypes/libffi/include/Makefile.am delete mode 100644 third_party/python/Modules/_ctypes/libffi/include/Makefile.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/include/ffi.h.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/include/ffi_common.h delete mode 100755 third_party/python/Modules/_ctypes/libffi/install-sh delete mode 100644 third_party/python/Modules/_ctypes/libffi/libffi.pc.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj delete mode 100755 third_party/python/Modules/_ctypes/libffi/libtool-ldflags delete mode 100644 third_party/python/Modules/_ctypes/libffi/libtool-version delete mode 100644 third_party/python/Modules/_ctypes/libffi/ltmain.sh delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/asmcfi.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_append_flag.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_configure_args.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/libtool.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ltoptions.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ltsugar.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/ltversion.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/m4/lt~obsolete.m4 delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/Makefile.am delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/Makefile.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/ffi.3 delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/ffi_call.3 delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif.3 delete mode 100644 third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3 delete mode 100755 third_party/python/Modules/_ctypes/libffi/mdate-sh delete mode 100755 third_party/python/Modules/_ctypes/libffi/missing delete mode 100755 third_party/python/Modules/_ctypes/libffi/msvcc.sh delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/aarch64/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/aarch64/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/aarch64/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/alpha/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/alpha/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/alpha/osf.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arc/arcompact.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arc/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arc/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arm/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arm/ffitarget.h delete mode 100755 third_party/python/Modules/_ctypes/libffi/src/arm/gentramp.sh delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arm/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/arm/trampoline.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/avr32/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/avr32/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/avr32/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/bfin/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/bfin/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/bfin/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/closures.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/cris/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/cris/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/cris/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/debug.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/dlmalloc.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/frv/eabi.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/frv/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/frv/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/ia64/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/ia64/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/ia64/ia64_flags.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/ia64/unix.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/java_raw_api.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m32r/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m32r/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m32r/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m68k/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m68k/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m68k/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m88k/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m88k/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/m88k/obsd.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/metag/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/metag/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/metag/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/microblaze/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/microblaze/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/microblaze/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/mips/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/mips/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/mips/n32.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/mips/o32.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/moxie/eabi.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/moxie/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/moxie/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/nios2/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/nios2/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/nios2/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/pa/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/pa/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/pa/hpux32.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/pa/linux.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/aix.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/aix_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/asm.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_linux64.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_powerpc.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/powerpc/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/prep_cif.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/raw_api.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/s390/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/s390/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/s390/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh64/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh64/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sh64/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sparc/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sparc/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sparc/v8.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/sparc/v9.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/tile/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/tile/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/tile/tile.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/types.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/vax/elfbsd.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/vax/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/vax/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/darwin.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/darwin64.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/ffi64.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/freebsd.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/unix64.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/win32.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/x86/win64.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/xtensa/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/xtensa/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/src/xtensa/sysv.S delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.am delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.in delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/config/default.exp delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/lib/libffi.exp delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/lib/wrapper.exp delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn0.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn4.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn5.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn6.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_loc_fn0.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_simple.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_float.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_schar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshort.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshortchar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_uchar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushort.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushortchar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_schar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sint.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sshort.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float4.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/many.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/negint.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct11.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/problem1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/promotion.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ldl.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sl.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_uc.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ul.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen4.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/uninitialized.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest.cc delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct1.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct2.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct3.c delete mode 100644 third_party/python/Modules/_ctypes/libffi/texinfo.tex delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/LICENSE delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/README delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/README.ctypes delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/ffi.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/ffi_common.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/fficonfig.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/prep_cif.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/types.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/win32.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_msvc/win64.asm delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/LICENSE delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/README delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/README.pyobjc delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/ffi.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/ffi.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/ffi_common.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/fficonfig.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/include/x86-ffitarget.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/types.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/x86/darwin64.S delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/x86/x86-darwin.S delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c delete mode 100644 third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/REFERENCES.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/bignum.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/fnt.py delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/matrix-transform.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/mulmod-64.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/six-step.txt delete mode 100644 third_party/python/Modules/_decimal/libmpdec/literature/umodarith.lisp rename third_party/python/Modules/_io/clinic/{_iomodule.c.h => _iomodule.inc} (100%) rename third_party/python/Modules/_io/clinic/{bufferedio.c.h => bufferedio.inc} (100%) rename third_party/python/Modules/_io/clinic/{bytesio.c.h => bytesio.inc} (100%) rename third_party/python/Modules/_io/clinic/{fileio.c.h => fileio.inc} (100%) rename third_party/python/Modules/_io/clinic/{iobase.c.h => iobase.inc} (100%) rename third_party/python/Modules/_io/clinic/{stringio.c.h => stringio.inc} (100%) rename third_party/python/Modules/_io/clinic/{textio.c.h => textio.inc} (100%) rename third_party/python/Modules/_io/clinic/{winconsoleio.c.h => winconsoleio.inc} (100%) delete mode 100644 third_party/python/Modules/_scproxy.c rename third_party/python/Modules/{_ssl_data.h => _ssl_data.inc} (99%) rename third_party/python/Modules/cjkcodecs/{alg_jisx0201.h => alg_jisx0201.inc} (99%) rename third_party/python/Modules/cjkcodecs/clinic/{multibytecodec.c.h => multibytecodec.inc} (100%) rename third_party/python/Modules/cjkcodecs/{emu_jisx0213_2000.h => emu_jisx0213_2000.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_cn.h => mappings_cn.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_hk.h => mappings_hk.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_jisx0213_pair.h => mappings_jisx0213_pair.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_jp.h => mappings_jp.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_kr.h => mappings_kr.inc} (99%) rename third_party/python/Modules/cjkcodecs/{mappings_tw.h => mappings_tw.inc} (99%) rename third_party/python/Modules/clinic/{_asynciomodule.c.h => _asynciomodule.inc} (99%) rename third_party/python/Modules/clinic/{_bz2module.c.h => _bz2module.inc} (99%) rename third_party/python/Modules/clinic/{_codecsmodule.c.h => _codecsmodule.inc} (99%) rename third_party/python/Modules/clinic/{_cryptmodule.c.h => _cryptmodule.inc} (97%) rename third_party/python/Modules/clinic/{_cursesmodule.c.h => _cursesmodule.inc} (98%) rename third_party/python/Modules/clinic/{_datetimemodule.c.h => _datetimemodule.inc} (97%) rename third_party/python/Modules/clinic/{_dbmmodule.c.h => _dbmmodule.inc} (99%) rename third_party/python/Modules/clinic/{_elementtree.c.h => _elementtree.inc} (99%) rename third_party/python/Modules/clinic/{_gdbmmodule.c.h => _gdbmmodule.inc} (99%) rename third_party/python/Modules/clinic/{_hashopenssl.c.h => _hashopenssl.inc} (98%) rename third_party/python/Modules/clinic/{_lzmamodule.c.h => _lzmamodule.inc} (99%) rename third_party/python/Modules/clinic/{_opcode.c.h => _opcode.inc} (97%) rename third_party/python/Modules/clinic/{_pickle.c.h => _pickle.inc} (99%) rename third_party/python/Modules/clinic/{_sre.c.h => _sre.inc} (99%) rename third_party/python/Modules/clinic/{_ssl.c.h => _ssl.inc} (99%) rename third_party/python/Modules/clinic/{_tkinter.c.h => _tkinter.inc} (99%) rename third_party/python/Modules/clinic/{_weakref.c.h => _weakref.inc} (98%) rename third_party/python/Modules/clinic/{_winapi.c.h => _winapi.inc} (99%) rename third_party/python/Modules/clinic/{arraymodule.c.h => arraymodule.inc} (99%) rename third_party/python/Modules/clinic/{audioop.c.h => audioop.inc} (99%) rename third_party/python/Modules/clinic/{binascii.c.h => binascii.inc} (99%) rename third_party/python/Modules/clinic/{cmathmodule.c.h => cmathmodule.inc} (99%) rename third_party/python/Modules/clinic/{fcntlmodule.c.h => fcntlmodule.inc} (99%) rename third_party/python/Modules/clinic/{grpmodule.c.h => grpmodule.inc} (99%) rename third_party/python/Modules/clinic/{md5module.c.h => md5module.inc} (99%) rename third_party/python/Modules/clinic/{posixmodule.c.h => posixmodule.inc} (99%) rename third_party/python/Modules/clinic/{pwdmodule.c.h => pwdmodule.inc} (98%) rename third_party/python/Modules/clinic/{pyexpat.c.h => pyexpat.inc} (99%) rename third_party/python/Modules/clinic/{sha1module.c.h => sha1module.inc} (99%) rename third_party/python/Modules/clinic/{sha256module.c.h => sha256module.inc} (99%) rename third_party/python/Modules/clinic/{sha512module.c.h => sha512module.inc} (99%) rename third_party/python/Modules/clinic/{signalmodule.c.h => signalmodule.inc} (99%) rename third_party/python/Modules/clinic/{spwdmodule.c.h => spwdmodule.inc} (98%) rename third_party/python/Modules/clinic/{unicodedata.c.h => unicodedata.inc} (99%) rename third_party/python/Modules/clinic/{zlibmodule.c.h => zlibmodule.inc} (99%) delete mode 100644 third_party/python/Modules/getaddrinfo.c delete mode 100644 third_party/python/Modules/getnameinfo.c rename third_party/python/Objects/clinic/{bytearrayobject.c.h => bytearrayobject.inc} (100%) rename third_party/python/Objects/clinic/{bytesobject.c.h => bytesobject.inc} (100%) rename third_party/python/Objects/clinic/{dictobject.c.h => dictobject.inc} (100%) rename third_party/python/Objects/clinic/{unicodeobject.c.h => unicodeobject.inc} (100%) delete mode 100644 third_party/python/Objects/dictnotes.txt delete mode 100644 third_party/python/Objects/listsort.txt delete mode 100644 third_party/python/Objects/lnotab_notes.txt rename third_party/python/Objects/stringlib/{asciilib.h => asciilib.inc} (96%) rename third_party/python/Objects/stringlib/{codecs.h => codecs.inc} (99%) rename third_party/python/Objects/stringlib/{count.h => count.inc} (87%) rename third_party/python/Objects/stringlib/{ctype.h => ctype.inc} (97%) rename third_party/python/Objects/stringlib/{eq.h => eq.inc} (97%) rename third_party/python/Objects/stringlib/{fastsearch.h => fastsearch.inc} (99%) rename third_party/python/Objects/stringlib/{find.h => find.inc} (97%) rename third_party/python/Objects/stringlib/{find_max_char.h => find_max_char.inc} (99%) rename third_party/python/Objects/stringlib/{join.h => join.inc} (99%) rename third_party/python/Objects/stringlib/{localeutil.h => localeutil.inc} (99%) rename third_party/python/Objects/stringlib/{partition.h => partition.inc} (97%) rename third_party/python/Objects/stringlib/{replace.h => replace.inc} (95%) rename third_party/python/Objects/stringlib/{split.h => split.inc} (99%) rename third_party/python/Objects/stringlib/{stringdefs.h => stringdefs.inc} (98%) rename third_party/python/Objects/stringlib/{transmogrify.h => transmogrify.inc} (99%) rename third_party/python/Objects/stringlib/{ucs1lib.h => ucs1lib.inc} (98%) rename third_party/python/Objects/stringlib/{ucs2lib.h => ucs2lib.inc} (98%) rename third_party/python/Objects/stringlib/{ucs4lib.h => ucs4lib.inc} (98%) rename third_party/python/Objects/stringlib/{undef.h => undef.inc} (91%) rename third_party/python/Objects/stringlib/{unicode_format.h => unicode_format.inc} (99%) rename third_party/python/Objects/stringlib/{unicodedefs.h => unicodedefs.inc} (98%) rename third_party/python/Objects/{unicodetype_db.h => unicodetype_db.inc} (99%) delete mode 100644 third_party/python/PC/WinMain.c delete mode 100644 third_party/python/PC/_findvs.cpp delete mode 100644 third_party/python/PC/_msi.c delete mode 100644 third_party/python/PC/_testconsole.c delete mode 100644 third_party/python/PC/bdist_wininst/PythonPowered.bmp delete mode 100644 third_party/python/PC/bdist_wininst/README.txt delete mode 100644 third_party/python/PC/bdist_wininst/archive.h delete mode 100644 third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj delete mode 100644 third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj.filters delete mode 100644 third_party/python/PC/bdist_wininst/build.bat delete mode 100644 third_party/python/PC/bdist_wininst/extract.c delete mode 100644 third_party/python/PC/bdist_wininst/install.c delete mode 100644 third_party/python/PC/bdist_wininst/install.rc delete mode 100644 third_party/python/PC/bdist_wininst/resource.h delete mode 100644 third_party/python/PC/clinic/_testconsole.c.h delete mode 100644 third_party/python/PC/clinic/msvcrtmodule.c.h rename third_party/python/PC/clinic/{winreg.c.h => winreg.inc} (100%) rename third_party/python/PC/clinic/{winsound.c.h => winsound.inc} (100%) delete mode 100644 third_party/python/PC/dllbase_nt.txt delete mode 100644 third_party/python/PC/empty.c delete mode 100644 third_party/python/PC/errmap.h delete mode 100644 third_party/python/PC/errmap.mak delete mode 100644 third_party/python/PC/external/Externals.txt delete mode 100644 third_party/python/PC/external/include/Setup.Configuration.h delete mode 100644 third_party/python/PC/external/v140/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib delete mode 100644 third_party/python/PC/external/v140/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib delete mode 100644 third_party/python/PC/external/v141/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib delete mode 100644 third_party/python/PC/external/v141/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib delete mode 100644 third_party/python/PC/generrmap.c delete mode 100644 third_party/python/PC/icons/launcher.icns delete mode 100644 third_party/python/PC/icons/launcher.ico delete mode 100644 third_party/python/PC/icons/py.icns delete mode 100644 third_party/python/PC/icons/py.ico delete mode 100644 third_party/python/PC/icons/pyc.icns delete mode 100644 third_party/python/PC/icons/pyc.ico delete mode 100644 third_party/python/PC/icons/pyd.icns delete mode 100644 third_party/python/PC/icons/pyd.ico delete mode 100644 third_party/python/PC/icons/python.icns delete mode 100644 third_party/python/PC/icons/python.ico delete mode 100644 third_party/python/PC/icons/pythonw.icns delete mode 100644 third_party/python/PC/icons/pythonw.ico delete mode 100644 third_party/python/PC/icons/setup.icns delete mode 100644 third_party/python/PC/icons/setup.ico delete mode 100644 third_party/python/PC/msvcrtmodule.c delete mode 100644 third_party/python/PC/pylauncher.rc delete mode 100644 third_party/python/PC/pyshellext.cpp delete mode 100644 third_party/python/PC/pyshellext.def delete mode 100644 third_party/python/PC/pyshellext.idl delete mode 100644 third_party/python/PC/pyshellext.rc delete mode 100644 third_party/python/PC/pyshellext_d.def delete mode 100644 third_party/python/PC/python.manifest delete mode 100644 third_party/python/PC/python3dll.c delete mode 100644 third_party/python/PC/python_exe.rc delete mode 100644 third_party/python/PC/python_nt.rc delete mode 100644 third_party/python/PC/python_ver_rc.h delete mode 100644 third_party/python/PC/pythonw_exe.rc delete mode 100644 third_party/python/PC/readme.txt delete mode 100644 third_party/python/PC/sqlite3.rc delete mode 100644 third_party/python/PC/validate_ucrtbase.py delete mode 100644 third_party/python/Python/README rename third_party/python/Python/{ceval_gil.h => ceval_gil.inc} (99%) rename third_party/python/Python/clinic/{bltinmodule.c.h => bltinmodule.inc} (100%) rename third_party/python/Python/clinic/{import.c.h => import.inc} (100%) delete mode 100644 third_party/python/Python/dup2.c rename third_party/python/Python/{importlib.h => importlib.inc} (99%) rename third_party/python/Python/{importlib_external.h => importlib_external.inc} (100%) rename third_party/python/Python/{opcode_targets.h => opcode_targets.inc} (99%) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..91cf9befd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# -*- conf -*- +/build/bootstrap/*.com binary +/usr/share/zoneinfo/* binary diff --git a/libc/sock/alg.h b/libc/sock/alg.h new file mode 100644 index 000000000..0bb5affd4 --- /dev/null +++ b/libc/sock/alg.h @@ -0,0 +1,29 @@ +#ifndef COSMOPOLITAN_LIBC_SOCK_ALG_H_ +#define COSMOPOLITAN_LIBC_SOCK_ALG_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +struct sockaddr_alg { + uint16_t salg_family; + uint8_t salg_type[14]; + uint32_t salg_feat; + uint32_t salg_mask; + uint8_t salg_name[64]; +}; + +struct sockaddr_alg_new { + uint16_t salg_family; + uint8_t salg_type[14]; + uint32_t salg_feat; + uint32_t salg_mask; + uint8_t salg_name[]; /* Linux v4.12+ */ +}; + +struct af_alg_iv { + uint32_t ivlen; + uint8_t iv[0]; +}; + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_SOCK_ALG_H_ */ diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index 4b4acc36f..80e5bc876 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -44,7 +44,7 @@ syscon errno EEXIST 17 17 17 17 17 183 # file exists; unix conse syscon errno EXDEV 18 18 18 18 18 17 # improper link; unix consensus; kNtErrorNotSameDevice; raised by copy_file_range(2), fanotify_mark(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), link(2), openat2(2), rename(2) syscon errno ENODEV 19 19 19 19 19 1200 # no such device; unix consensus; kNtErrorBadDevice; raised by arch_prctl(2), eventfd(2), fallocate(2), fanotify_mark(2), mmap(2), mount(2), move_pages(2), open(2), pciconfig_read(2), perf_event_open(2), pidfd_open(2), prctl(2), s390_pci_mmio_write(2), signalfd(2), spu_create(2), timerfd_create(2) syscon errno ENOTDIR 20 20 20 20 20 3 # not a directory; unix consensus; kNtErrorPathNotFound; raised by access(2), acct(2), bind(2), chdir(2), chmod(2), chown(2), chroot(2), execve(2), execveat(2), fanotify_mark(2), fcntl(2), futimesat(2), getdents(2), inotify_add_watch(2), ioctl_fat(2), keyctl(2), link(2), mkdir(2), mknod(2), mount(2), open(2), open_by_handle_at(2), pivot_root(2), readdir(2), readlink(2), rename(2), rmdir(2), spu_create(2), stat(2), statfs(2), statx(2), symlink(2), sysctl(2), truncate(2), unlink(2), utimensat(2) -syscon errno EISDIR 21 21 21 21 21 267 # is a a directory; unix consensus; kNtErrorDirectoryNotSupported; raised by acct(2), copy_file_range(2), execve(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), open(2), read(2), rename(2), truncate(2), unlink(2) +syscon errno EISDIR 21 21 21 21 21 267 # is a a directory; unix consensus; kNtErrorDirectory; raised by acct(2), copy_file_range(2), execve(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), open(2), read(2), rename(2), truncate(2), unlink(2) syscon errno EINVAL 22 22 22 22 22 87 # invalid argument; unix consensus; kNtErrorInvalidParameter; raised by accept(2), access(2), add_key(2), adjtimex(2), arch_prctl(2), bdflush(2), bind(2), bpf(2), cacheflush(2), capget(2), chmod(2), chown(2), clock_getres(2), clock_nanosleep(2), clone(2), copy_file_range(2), create_module(2), dup(2), epoll_create(2), epoll_ctl(2), epoll_wait(2), eventfd(2), execve(2), execveat(2), fallocate(2), fanotify_init(2), fanotify_mark(2), fcntl(2), flock(2), futex(2), get_mempolicy(2), get_robust_list(2), getdents(2), getdomainname(2), getgroups(2), gethostname(2), getitimer(2), getpeername(2), getpriority(2), getrandom(2), getrlimit(2), getrusage(2), getsockname(2), getsockopt(2), gettimeofday(2), init_module(2), inotify_add_watch(2), inotify_init(2), inotify_rm_watch(2), io_cancel(2), io_destroy(2), io_getevents(2), io_setup(2), io_submit(2), ioctl(2), ioctl_console(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), ioctl_getfsmap(2), ioctl_ns(2), ioctl_tty(2), ioctl_userfaultfd(2), ioperm(2), iopl(2), ioprio_set(2), kcmp(2), kexec_load(2), keyctl(2), kill(2), link(2), llseek(2), lookup_dcookie(2), lseek(2), madvise(2), mbind(2), membarrier(2), memfd_create(2), migrate_pages(2), mincore(2), mkdir(2), mknod(2), mlock(2), mmap(2), mmap2(2), modify_ldt(2), mount(2), move_pages(2), mprotect(2), mremap(2), msgctl(2), msgop(2), msync(2), nanosleep(2), open(2), open_by_handle_at(2), openat2(2), pciconfig_read(2), perf_event_open(2), personality(2), pidfd_getfd(2), pidfd_open(2), pidfd_send_signal(2), pipe(2), pivot_root(2), pkey_alloc(2), poll(2), posix_fadvise(2), prctl(2), process_vm_readv(2), ptrace(2), query_module(2), quotactl(2), read(2), readahead(2), readdir(2), readlink(2), readv(2), reboot(2), recv(2), recvmmsg(2), remap_file_pages(2), rename(2), request_key(2), rmdir(2), rt_sigqueueinfo(2), s390_guarded_storage(2), s390_pci_mmio_write(2), s390_runtime_instr(2), s390_sthyi(2), sched_get_priority_max(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_setscheduler(2), seccomp(2), select(2), semctl(2), semget(2), semop(2), send(2), sendfile(2), set_mempolicy(2), set_thread_area(2), seteuid(2), setfsgid(2), setfsuid(2), setgid(2), setns(2), setpgid(2), setresuid(2), setreuid(2), setuid(2), shmctl(2), shmget(2), shmop(2), shutdown(2), sigaction(2), sigaltstack(2), signal(2), signalfd(2), sigprocmask(2), sigsuspend(2), sigwaitinfo(2), socket(2), splice(2), spu_create(2), spu_run(2), stat(2), statx(2), subpage_prot(2), swapon(2), sync_file_range(2), sysfs(2), syslog(2), tee(2), timer_create(2), timer_delete(2), timer_getoverrun(2), timer_settime(2), timerfd_create(2), tkill(2), truncate(2), umount(2), unlink(2), unshare(2), userfaultfd(2), ustat(2), utimensat(2), vmsplice(2), wait(2), write(2), unix(7), ip(7) syscon errno ENFILE 23 23 23 23 23 331 # too many open files in system; unix consensus; kNtErrorTooManyDescriptors; raised by accept(2), acct(2), epoll_create(2), eventfd(2), execve(2), futex(2), inotify_init(2), memfd_create(2), mmap(2), open(2), pidfd_getfd(2), pidfd_open(2), pipe(2), shmget(2), signalfd(2), socket(2), socketpair(2), spu_create(2), swapon(2), timerfd_create(2), uselib(2), userfaultfd(2) syscon errno EMFILE 24 24 24 24 24 336 # too many open files; unix consensus; kNtErrorTooManyOpenFiles; raised by accept(2), dup(2), epoll_create(2), eventfd(2), execve(2), fanotify_init(2), fcntl(2), inotify_init(2), memfd_create(2), mount(2), open(2), perf_event_open(2), pidfd_getfd(2), pidfd_open(2), pipe(2), signalfd(2), socket(2), socketpair(2), spu_create(2), timerfd_create(2) @@ -626,6 +626,7 @@ syscon so SO_REUSEADDR 2 4 4 4 4 0 # bsd consensus (default behav syscon so SO_KEEPALIVE 9 8 8 8 8 8 # bsd consensus syscon so SO_DONTROUTE 5 0x10 0x10 0x10 0x10 0x10 # bsd consensus syscon so SO_BROADCAST 6 0x20 0x20 0x20 0x20 0x20 # bsd consensus +syscon so SO_USELOOPBACK 0 0x40 0x40 0x40 0x40 0x40 # bsd consensus syscon so SO_LINGER 13 0x80 0x80 0x80 0x80 0x80 # takes struct linger; causes close() return value to actually mean something; bsd consensus syscon so SO_DEBUG 1 1 1 1 1 1 # consensus syscon so SO_ACCEPTCONN 30 2 2 2 2 2 # takes int pointer and stores boolean indicating if listen() was called on fd; bsd consensus @@ -640,10 +641,12 @@ syscon so SO_EXCLUSIVEADDRUSE 0 0 0 0 0 0xfffffffb # hoo boy syscon so SO_SNDLOWAT 19 0x1003 0x1003 0x1003 0x1003 0x1003 # bsd consensus syscon so SO_TYPE 3 0x1008 0x1008 0x1008 0x1008 0x1008 # bsd consensus syscon so SO_TIMESTAMP 29 0x0400 0x0400 0x0800 0x2000 0 -syscon so SO_DOMAIN 39 0 0x1019 0 0 0 +syscon so SO_SETFIB 0 0 0x1014 0 0 0 +syscon so SO_DOMAIN 39 0 0x1019 0x1024 0 0 syscon so SO_MAX_PACING_RATE 47 0 0x1018 0 0 0 -syscon so SO_PEERCRED 17 0 0 0x1022 0x1022 0 -syscon so SO_PROTOCOL 38 0 0x1016 0 0 0 +syscon so SO_PEERCRED 17 0 0 0x1022 0 0 +syscon so LOCAL_PEERCRED 0 1 1 0 0 0 +syscon so SO_PROTOCOL 38 0 0x1016 0x1025 0 0 syscon so SO_ATTACH_BPF 50 0 0 0 0 0 syscon so SO_ATTACH_FILTER 26 0 0 0 0 0 syscon so SO_ATTACH_REUSEPORT_CBPF 51 0 0 0 0 0 @@ -707,6 +710,13 @@ syscon sol SOL_RXRPC 272 0 0 0 0 0 syscon sol SOL_TIPC 271 0 0 0 0 0 syscon sol SOL_X25 262 0 0 0 0 0 +syscon alg ALG_SET_KEY 1 0 0 0 0 0 +syscon alg ALG_SET_IV 2 0 0 0 0 0 +syscon alg ALG_SET_OP 3 0 0 0 0 0 +syscon alg ALG_SET_AEAD_ASSOCLEN 4 0 0 0 0 0 +syscon alg ALG_SET_AEAD_AUTHSIZE 5 0 0 0 0 0 +syscon alg ALG_SET_DRBG_ENTROPY 6 0 0 0 0 0 + # {set,get}sockopt(fd, level=IPPROTO_TCP, X, ...) # » most elite of all tuning groups # @@ -758,15 +768,16 @@ syscon ip IP_MAX_MEMBERSHIPS 20 0x0fff 0x0fff 0x0fff 0x0fff 20 # b syscon ip IP_OPTIONS 4 1 1 1 1 1 # bsd consensus syscon ip IP_TOS 1 3 3 3 3 8 # bsd consensus syscon ip IP_RECVTTL 12 24 65 31 23 21 -syscon ip IP_ADD_MEMBERSHIP 35 12 12 12 12 0 # bsd consensus -syscon ip IP_DROP_MEMBERSHIP 36 13 13 13 13 0 # bsd consensus -syscon ip IP_MULTICAST_IF 0x20 9 9 9 9 0 # bsd consensus -syscon ip IP_MULTICAST_LOOP 34 11 11 11 11 0 # bsd consensus -syscon ip IP_MULTICAST_TTL 33 10 10 10 10 0 # bsd consensus +syscon ip IP_ADD_MEMBERSHIP 35 12 12 12 12 5 # bsd consensus +syscon ip IP_DROP_MEMBERSHIP 36 13 13 13 13 6 # bsd consensus +syscon ip IP_MULTICAST_IF 0x20 9 9 9 9 2 # bsd consensus +syscon ip IP_MULTICAST_LOOP 34 11 11 11 11 4 # bsd consensus +syscon ip IP_MULTICAST_TTL 33 10 10 10 10 3 # bsd consensus syscon ip IP_RECVOPTS 6 5 5 5 5 0 # bsd consensus syscon ip IP_RECVRETOPTS 7 6 6 6 6 0 # bsd consensus +syscon ip IP_RECVDSTADDR 0 7 7 7 7 0 # bsd consensus syscon ip IP_RETOPTS 7 8 8 8 8 0 # bsd consensus -syscon ip IP_TTL 2 4 4 4 4 0 # bsd consensus +syscon ip IP_TTL 2 4 4 4 4 7 # bsd consensus syscon ip IP_ADD_SOURCE_MEMBERSHIP 39 70 70 0 0 15 syscon ip IP_BLOCK_SOURCE 38 72 72 0 0 17 syscon ip IP_DROP_SOURCE_MEMBERSHIP 40 71 71 0 0 0x10 @@ -800,6 +811,8 @@ syscon ip IP_TRANSPARENT 19 0 0 0 0 0 syscon ip IP_XFRM_POLICY 17 0 0 0 0 0 syscon ip INET_ADDRSTRLEN 0x10 0x10 0x10 0x10 0x10 22 # unix consensus +syscon ipport IPPORT_USERRESERVED 5000 5000 5000 49151 5000 5000 + # ptrace() codes # # group name GNU/Systemd XNU's Not UNIX! FreeBSD OpenBSD NetBSD The New Technology Commentary @@ -1052,7 +1065,7 @@ syscon af AF_LOCAL 1 1 1 1 1 1 # consensus syscon af AF_FILE 1 0 0 0 0 0 syscon af AF_INET 2 2 2 2 2 2 # consensus syscon af AF_AX25 3 0 0 0 0 0 -syscon af AF_IPX 4 23 23 23 23 0 # bsd consensus +syscon af AF_IPX 4 23 23 23 23 6 # bsd consensus syscon af AF_APPLETALK 5 0x10 0x10 0x10 0x10 0x10 # bsd consensus syscon af AF_NETROM 6 0 0 0 0 0 syscon af AF_BRIDGE 7 0 0 0 0 0 @@ -1062,10 +1075,11 @@ syscon af AF_INET6 10 30 28 24 24 23 syscon af AF_ROSE 11 0 0 0 0 0 syscon af AF_NETBEUI 13 0 0 0 0 0 syscon af AF_SECURITY 14 0 0 0 0 0 -syscon af AF_KEY 15 0 0 30 30 0 +syscon af AF_KEY 15 0 0 30 0 0 syscon af AF_ROUTE 16 17 17 17 34 0 # bsd consensus syscon af AF_NETLINK 16 0 0 0 0 0 syscon af AF_PACKET 17 0 0 0 0 0 +syscon af AF_LINK 0 18 18 18 18 0 syscon af AF_ASH 18 0 0 0 0 0 syscon af AF_ECONET 19 0 0 0 0 0 syscon af AF_ATMSVC 20 0 0 0 0 0 @@ -1113,7 +1127,7 @@ syscon pf PF_ATMSVC 20 0 0 0 0 0 syscon pf PF_AX25 3 0 0 0 0 0 syscon pf PF_BRIDGE 7 0 0 0 0 0 syscon pf PF_CAIF 37 0 0 0 0 0 -syscon pf PF_CAN 29 0 0 0 0 0 +syscon af PF_CAN 29 0 0 0 35 0 syscon pf PF_ECONET 19 0 0 0 0 0 syscon pf PF_FILE 1 0 0 0 0 0 syscon pf PF_IB 27 0 0 0 0 0 @@ -1255,7 +1269,8 @@ syscon msg MSG_WAITFORONE 0x010000 0 0x080000 0 0x2000 0 syscon msg MSG_BATCH 0x040000 0 0 0 0 0 syscon msg MSG_CONFIRM 0x0800 0 0 0 0 0 syscon msg MSG_EXCEPT 0x2000 0 0 0 0 0 -syscon msg MSG_FIN 0x0200 0 0 0 0 0 +syscon msg MSG_FIN 0x0200 0x0100 0x0100 0 0 0 +syscon msg MSG_EOF 0x0200 0x0100 0x0100 0 0 0 syscon msg MSG_INFO 12 0 0 0 0 0 syscon msg MSG_MORE 0x8000 0 0 0 0 0 syscon msg MSG_PARITY_ERROR 9 0 0 0 0 0 @@ -1263,6 +1278,9 @@ syscon msg MSG_PROXY 0x10 0 0 0 0 0 syscon msg MSG_RST 0x1000 0 0 0 0 0 syscon msg MSG_STAT 11 0 0 0 0 0 syscon msg MSG_SYN 0x0400 0 0 0 0 0 +syscon msg MSG_BCAST 0 0 0 0x100 0x100 0 +syscon msg MSG_MCAST 0 0 0 0x200 0x200 0 +syscon msg MSG_NOTIFICATION 0x8000 0 0x2000 0 0x4000 0 # getpriority() / setpriority() magnums (a.k.a. nice) # diff --git a/libc/sysv/consts/AF_IPX.S b/libc/sysv/consts/AF_IPX.S index a3c5a1d7c..b4f2f79d7 100644 --- a/libc/sysv/consts/AF_IPX.S +++ b/libc/sysv/consts/AF_IPX.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon af,AF_IPX,4,23,23,23,23,0 +.syscon af,AF_IPX,4,23,23,23,23,6 diff --git a/libc/sysv/consts/AF_KEY.S b/libc/sysv/consts/AF_KEY.S index 974def0b1..896a11678 100644 --- a/libc/sysv/consts/AF_KEY.S +++ b/libc/sysv/consts/AF_KEY.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon af,AF_KEY,15,0,0,30,30,0 +.syscon af,AF_KEY,15,0,0,30,0,0 diff --git a/libc/sysv/consts/AF_LINK.S b/libc/sysv/consts/AF_LINK.S new file mode 100644 index 000000000..7b95ace9d --- /dev/null +++ b/libc/sysv/consts/AF_LINK.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon af,AF_LINK,0,18,18,18,18,0 diff --git a/libc/sysv/consts/ALG_SET_AEAD_ASSOCLEN.S b/libc/sysv/consts/ALG_SET_AEAD_ASSOCLEN.S new file mode 100644 index 000000000..adb1fce4f --- /dev/null +++ b/libc/sysv/consts/ALG_SET_AEAD_ASSOCLEN.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_AEAD_ASSOCLEN,4,0,0,0,0,0 diff --git a/libc/sysv/consts/ALG_SET_AEAD_AUTHSIZE.S b/libc/sysv/consts/ALG_SET_AEAD_AUTHSIZE.S new file mode 100644 index 000000000..c189aa408 --- /dev/null +++ b/libc/sysv/consts/ALG_SET_AEAD_AUTHSIZE.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_AEAD_AUTHSIZE,5,0,0,0,0,0 diff --git a/libc/sysv/consts/ALG_SET_DRBG_ENTROPY.S b/libc/sysv/consts/ALG_SET_DRBG_ENTROPY.S new file mode 100644 index 000000000..859863d68 --- /dev/null +++ b/libc/sysv/consts/ALG_SET_DRBG_ENTROPY.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_DRBG_ENTROPY,6,0,0,0,0,0 diff --git a/libc/sysv/consts/ALG_SET_IV.S b/libc/sysv/consts/ALG_SET_IV.S new file mode 100644 index 000000000..a98afeb22 --- /dev/null +++ b/libc/sysv/consts/ALG_SET_IV.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_IV,2,0,0,0,0,0 diff --git a/libc/sysv/consts/ALG_SET_KEY.S b/libc/sysv/consts/ALG_SET_KEY.S new file mode 100644 index 000000000..4873384c5 --- /dev/null +++ b/libc/sysv/consts/ALG_SET_KEY.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_KEY,1,0,0,0,0,0 diff --git a/libc/sysv/consts/ALG_SET_OP.S b/libc/sysv/consts/ALG_SET_OP.S new file mode 100644 index 000000000..62c64aeb4 --- /dev/null +++ b/libc/sysv/consts/ALG_SET_OP.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon alg,ALG_SET_OP,3,0,0,0,0,0 diff --git a/libc/sysv/consts/IPPORT_USERRESERVED.S b/libc/sysv/consts/IPPORT_USERRESERVED.S new file mode 100644 index 000000000..b12920d80 --- /dev/null +++ b/libc/sysv/consts/IPPORT_USERRESERVED.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon ipport,IPPORT_USERRESERVED,5000,5000,5000,49151,5000,5000 diff --git a/libc/sysv/consts/IP_ADD_MEMBERSHIP.S b/libc/sysv/consts/IP_ADD_MEMBERSHIP.S index 1c4eda637..f6ed74684 100644 --- a/libc/sysv/consts/IP_ADD_MEMBERSHIP.S +++ b/libc/sysv/consts/IP_ADD_MEMBERSHIP.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_ADD_MEMBERSHIP,35,12,12,12,12,0 +.syscon ip,IP_ADD_MEMBERSHIP,35,12,12,12,12,5 diff --git a/libc/sysv/consts/IP_DROP_MEMBERSHIP.S b/libc/sysv/consts/IP_DROP_MEMBERSHIP.S index 5074d6c46..9f143eb73 100644 --- a/libc/sysv/consts/IP_DROP_MEMBERSHIP.S +++ b/libc/sysv/consts/IP_DROP_MEMBERSHIP.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_DROP_MEMBERSHIP,36,13,13,13,13,0 +.syscon ip,IP_DROP_MEMBERSHIP,36,13,13,13,13,6 diff --git a/libc/sysv/consts/IP_MULTICAST_IF.S b/libc/sysv/consts/IP_MULTICAST_IF.S index 18c2a311e..15a293548 100644 --- a/libc/sysv/consts/IP_MULTICAST_IF.S +++ b/libc/sysv/consts/IP_MULTICAST_IF.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_MULTICAST_IF,0x20,9,9,9,9,0 +.syscon ip,IP_MULTICAST_IF,0x20,9,9,9,9,2 diff --git a/libc/sysv/consts/IP_MULTICAST_LOOP.S b/libc/sysv/consts/IP_MULTICAST_LOOP.S index 4351340eb..acb649a6f 100644 --- a/libc/sysv/consts/IP_MULTICAST_LOOP.S +++ b/libc/sysv/consts/IP_MULTICAST_LOOP.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_MULTICAST_LOOP,34,11,11,11,11,0 +.syscon ip,IP_MULTICAST_LOOP,34,11,11,11,11,4 diff --git a/libc/sysv/consts/IP_MULTICAST_TTL.S b/libc/sysv/consts/IP_MULTICAST_TTL.S index 892656944..584539d04 100644 --- a/libc/sysv/consts/IP_MULTICAST_TTL.S +++ b/libc/sysv/consts/IP_MULTICAST_TTL.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_MULTICAST_TTL,33,10,10,10,10,0 +.syscon ip,IP_MULTICAST_TTL,33,10,10,10,10,3 diff --git a/libc/sysv/consts/IP_RECVDSTADDR.S b/libc/sysv/consts/IP_RECVDSTADDR.S new file mode 100644 index 000000000..99646ed8d --- /dev/null +++ b/libc/sysv/consts/IP_RECVDSTADDR.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon ip,IP_RECVDSTADDR,0,7,7,7,7,0 diff --git a/libc/sysv/consts/IP_TTL.S b/libc/sysv/consts/IP_TTL.S index 764786e92..ea5927372 100644 --- a/libc/sysv/consts/IP_TTL.S +++ b/libc/sysv/consts/IP_TTL.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon ip,IP_TTL,2,4,4,4,4,0 +.syscon ip,IP_TTL,2,4,4,4,4,7 diff --git a/libc/sysv/consts/LOCAL_PEERCRED.S b/libc/sysv/consts/LOCAL_PEERCRED.S new file mode 100644 index 000000000..9fc999511 --- /dev/null +++ b/libc/sysv/consts/LOCAL_PEERCRED.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon so,LOCAL_PEERCRED,0,1,1,0,0,0 diff --git a/libc/sysv/consts/MSG_BCAST.S b/libc/sysv/consts/MSG_BCAST.S new file mode 100644 index 000000000..41fa09dc5 --- /dev/null +++ b/libc/sysv/consts/MSG_BCAST.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon msg,MSG_BCAST,0,0,0,0x100,0x100,0 diff --git a/libc/sysv/consts/MSG_EOF.S b/libc/sysv/consts/MSG_EOF.S new file mode 100644 index 000000000..7ca3c13ed --- /dev/null +++ b/libc/sysv/consts/MSG_EOF.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon msg,MSG_EOF,0x0200,0x0100,0x0100,0,0,0 diff --git a/libc/sysv/consts/MSG_FIN.S b/libc/sysv/consts/MSG_FIN.S index 3b36ebc8b..22c6a6e01 100644 --- a/libc/sysv/consts/MSG_FIN.S +++ b/libc/sysv/consts/MSG_FIN.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon msg,MSG_FIN,0x0200,0,0,0,0,0 +.syscon msg,MSG_FIN,0x0200,0x0100,0x0100,0,0,0 diff --git a/libc/sysv/consts/MSG_MCAST.S b/libc/sysv/consts/MSG_MCAST.S new file mode 100644 index 000000000..9a4981ff6 --- /dev/null +++ b/libc/sysv/consts/MSG_MCAST.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon msg,MSG_MCAST,0,0,0,0x200,0x200,0 diff --git a/libc/sysv/consts/MSG_NOTIFICATION.S b/libc/sysv/consts/MSG_NOTIFICATION.S new file mode 100644 index 000000000..2583572af --- /dev/null +++ b/libc/sysv/consts/MSG_NOTIFICATION.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon msg,MSG_NOTIFICATION,0x8000,0,0x2000,0,0x4000,0 diff --git a/libc/sysv/consts/PF_CAN.S b/libc/sysv/consts/PF_CAN.S index 70b22e205..476670edb 100644 --- a/libc/sysv/consts/PF_CAN.S +++ b/libc/sysv/consts/PF_CAN.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon pf,PF_CAN,29,0,0,0,0,0 +.syscon af,PF_CAN,29,0,0,0,35,0 diff --git a/libc/sysv/consts/SO_DOMAIN.S b/libc/sysv/consts/SO_DOMAIN.S index 478708db6..8ffeb2e6a 100644 --- a/libc/sysv/consts/SO_DOMAIN.S +++ b/libc/sysv/consts/SO_DOMAIN.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon so,SO_DOMAIN,39,0,0x1019,0,0,0 +.syscon so,SO_DOMAIN,39,0,0x1019,0x1024,0,0 diff --git a/libc/sysv/consts/SO_PEERCRED.S b/libc/sysv/consts/SO_PEERCRED.S index 1e24e33fc..e47d46102 100644 --- a/libc/sysv/consts/SO_PEERCRED.S +++ b/libc/sysv/consts/SO_PEERCRED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon so,SO_PEERCRED,17,0,0,0x1022,0x1022,0 +.syscon so,SO_PEERCRED,17,0,0,0x1022,0,0 diff --git a/libc/sysv/consts/SO_PROTOCOL.S b/libc/sysv/consts/SO_PROTOCOL.S index 6798f1fd5..207e3767e 100644 --- a/libc/sysv/consts/SO_PROTOCOL.S +++ b/libc/sysv/consts/SO_PROTOCOL.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon so,SO_PROTOCOL,38,0,0x1016,0,0,0 +.syscon so,SO_PROTOCOL,38,0,0x1016,0x1025,0,0 diff --git a/libc/sysv/consts/SO_SETFIB.S b/libc/sysv/consts/SO_SETFIB.S new file mode 100644 index 000000000..61edb03c7 --- /dev/null +++ b/libc/sysv/consts/SO_SETFIB.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon so,SO_SETFIB,0,0,0x1014,0,0,0 diff --git a/libc/sysv/consts/SO_USELOOPBACK.S b/libc/sysv/consts/SO_USELOOPBACK.S new file mode 100644 index 000000000..40d2321f8 --- /dev/null +++ b/libc/sysv/consts/SO_USELOOPBACK.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon so,SO_USELOOPBACK,0,0x40,0x40,0x40,0x40,0x40 diff --git a/libc/sysv/consts/af.h b/libc/sysv/consts/af.h index fc6e6f127..cf345dfd9 100644 --- a/libc/sysv/consts/af.h +++ b/libc/sysv/consts/af.h @@ -26,6 +26,7 @@ extern const long AF_ISDN; extern const long AF_IUCV; extern const long AF_KCM; extern const long AF_KEY; +extern const long AF_LINK; extern const long AF_LLC; extern const long AF_LOCAL; extern const long AF_MAX; @@ -53,50 +54,51 @@ extern const long AF_X25; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#define AF_ALG SYMBOLIC(AF_ALG) -#define AF_APPLETALK SYMBOLIC(AF_APPLETALK) -#define AF_ASH SYMBOLIC(AF_ASH) -#define AF_ATMPVC SYMBOLIC(AF_ATMPVC) -#define AF_ATMSVC SYMBOLIC(AF_ATMSVC) -#define AF_AX25 SYMBOLIC(AF_AX25) -#define AF_BLUETOOTH SYMBOLIC(AF_BLUETOOTH) -#define AF_BRIDGE SYMBOLIC(AF_BRIDGE) -#define AF_CAIF SYMBOLIC(AF_CAIF) -#define AF_CAN SYMBOLIC(AF_CAN) -#define AF_ECONET SYMBOLIC(AF_ECONET) -#define AF_FILE SYMBOLIC(AF_FILE) -#define AF_IB SYMBOLIC(AF_IB) +#define AF_ALG SYMBOLIC(AF_ALG) +#define AF_LINK SYMBOLIC(AF_LINK) +#define AF_APPLETALK SYMBOLIC(AF_APPLETALK) +#define AF_ASH SYMBOLIC(AF_ASH) +#define AF_ATMPVC SYMBOLIC(AF_ATMPVC) +#define AF_ATMSVC SYMBOLIC(AF_ATMSVC) +#define AF_AX25 SYMBOLIC(AF_AX25) +#define AF_BLUETOOTH SYMBOLIC(AF_BLUETOOTH) +#define AF_BRIDGE SYMBOLIC(AF_BRIDGE) +#define AF_CAIF SYMBOLIC(AF_CAIF) +#define AF_CAN SYMBOLIC(AF_CAN) +#define AF_ECONET SYMBOLIC(AF_ECONET) +#define AF_FILE SYMBOLIC(AF_FILE) +#define AF_IB SYMBOLIC(AF_IB) #define AF_IEEE802154 SYMBOLIC(AF_IEEE802154) -#define AF_INET LITERALLY(2) -#define AF_INET6 SYMBOLIC(AF_INET6) -#define AF_IPX SYMBOLIC(AF_IPX) -#define AF_IRDA SYMBOLIC(AF_IRDA) -#define AF_ISDN SYMBOLIC(AF_ISDN) -#define AF_IUCV SYMBOLIC(AF_IUCV) -#define AF_KCM SYMBOLIC(AF_KCM) -#define AF_KEY SYMBOLIC(AF_KEY) -#define AF_LLC SYMBOLIC(AF_LLC) -#define AF_LOCAL SYMBOLIC(AF_LOCAL) -#define AF_MAX SYMBOLIC(AF_MAX) -#define AF_MPLS SYMBOLIC(AF_MPLS) -#define AF_NETBEUI SYMBOLIC(AF_NETBEUI) -#define AF_NETLINK SYMBOLIC(AF_NETLINK) -#define AF_NETROM SYMBOLIC(AF_NETROM) -#define AF_NFC SYMBOLIC(AF_NFC) -#define AF_PACKET SYMBOLIC(AF_PACKET) -#define AF_PHONET SYMBOLIC(AF_PHONET) -#define AF_PPPOX SYMBOLIC(AF_PPPOX) -#define AF_RDS SYMBOLIC(AF_RDS) -#define AF_ROSE SYMBOLIC(AF_ROSE) -#define AF_ROUTE SYMBOLIC(AF_ROUTE) -#define AF_RXRPC SYMBOLIC(AF_RXRPC) -#define AF_SECURITY SYMBOLIC(AF_SECURITY) -#define AF_SNA SYMBOLIC(AF_SNA) -#define AF_TIPC SYMBOLIC(AF_TIPC) -#define AF_UNIX LITERALLY(1) -#define AF_UNSPEC LITERALLY(0) -#define AF_VSOCK SYMBOLIC(AF_VSOCK) -#define AF_WANPIPE SYMBOLIC(AF_WANPIPE) -#define AF_X25 SYMBOLIC(AF_X25) +#define AF_INET LITERALLY(2) +#define AF_INET6 SYMBOLIC(AF_INET6) +#define AF_IPX SYMBOLIC(AF_IPX) +#define AF_IRDA SYMBOLIC(AF_IRDA) +#define AF_ISDN SYMBOLIC(AF_ISDN) +#define AF_IUCV SYMBOLIC(AF_IUCV) +#define AF_KCM SYMBOLIC(AF_KCM) +#define AF_KEY SYMBOLIC(AF_KEY) +#define AF_LLC SYMBOLIC(AF_LLC) +#define AF_LOCAL SYMBOLIC(AF_LOCAL) +#define AF_MAX SYMBOLIC(AF_MAX) +#define AF_MPLS SYMBOLIC(AF_MPLS) +#define AF_NETBEUI SYMBOLIC(AF_NETBEUI) +#define AF_NETLINK SYMBOLIC(AF_NETLINK) +#define AF_NETROM SYMBOLIC(AF_NETROM) +#define AF_NFC SYMBOLIC(AF_NFC) +#define AF_PACKET SYMBOLIC(AF_PACKET) +#define AF_PHONET SYMBOLIC(AF_PHONET) +#define AF_PPPOX SYMBOLIC(AF_PPPOX) +#define AF_RDS SYMBOLIC(AF_RDS) +#define AF_ROSE SYMBOLIC(AF_ROSE) +#define AF_ROUTE SYMBOLIC(AF_ROUTE) +#define AF_RXRPC SYMBOLIC(AF_RXRPC) +#define AF_SECURITY SYMBOLIC(AF_SECURITY) +#define AF_SNA SYMBOLIC(AF_SNA) +#define AF_TIPC SYMBOLIC(AF_TIPC) +#define AF_UNIX LITERALLY(1) +#define AF_UNSPEC LITERALLY(0) +#define AF_VSOCK SYMBOLIC(AF_VSOCK) +#define AF_WANPIPE SYMBOLIC(AF_WANPIPE) +#define AF_X25 SYMBOLIC(AF_X25) #endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_AF_H_ */ diff --git a/libc/sysv/consts/alg.h b/libc/sysv/consts/alg.h new file mode 100644 index 000000000..846fe2853 --- /dev/null +++ b/libc/sysv/consts/alg.h @@ -0,0 +1,30 @@ +#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_ALG_H_ +#define COSMOPOLITAN_LIBC_SYSV_CONSTS_ALG_H_ +#include "libc/runtime/symbolic.h" + +#define ALG_SET_AEAD_ASSOCLEN SYMBOLIC(ALG_SET_AEAD_ASSOCLEN) +#define ALG_SET_AEAD_AUTHSIZE SYMBOLIC(ALG_SET_AEAD_AUTHSIZE) +#define ALG_SET_DRBG_ENTROPY SYMBOLIC(ALG_SET_DRBG_ENTROPY) +#define ALG_SET_IV SYMBOLIC(ALG_SET_IV) +#define ALG_SET_KEY SYMBOLIC(ALG_SET_KEY) +#define ALG_SET_OP SYMBOLIC(ALG_SET_OP) + +#define ALG_OP_DECRYPT SYMBOLIC(ALG_OP_DECRYPT) +#define ALG_OP_ENCRYPT SYMBOLIC(ALG_OP_ENCRYPT) + +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +extern const long ALG_SET_AEAD_ASSOCLEN; +extern const long ALG_SET_AEAD_AUTHSIZE; +extern const long ALG_SET_DRBG_ENTROPY; +extern const long ALG_SET_IV; +extern const long ALG_SET_KEY; +extern const long ALG_SET_OP; + +extern const long ALG_OP_DECRYPT; +extern const long ALG_OP_ENCRYPT; + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_ALG_H_ */ diff --git a/libc/sysv/consts/ip.h b/libc/sysv/consts/ip.h index 2f98756ec..cee35cc32 100644 --- a/libc/sysv/consts/ip.h +++ b/libc/sysv/consts/ip.h @@ -2,54 +2,55 @@ #define COSMOPOLITAN_LIBC_SYSV_CONSTS_IP_H_ #include "libc/runtime/symbolic.h" -#define IP_ADD_MEMBERSHIP SYMBOLIC(IP_ADD_MEMBERSHIP) -#define IP_ADD_SOURCE_MEMBERSHIP SYMBOLIC(IP_ADD_SOURCE_MEMBERSHIP) -#define IP_BIND_ADDRESS_NO_PORT SYMBOLIC(IP_BIND_ADDRESS_NO_PORT) -#define IP_BLOCK_SOURCE SYMBOLIC(IP_BLOCK_SOURCE) -#define IP_CHECKSUM SYMBOLIC(IP_CHECKSUM) +#define IP_ADD_MEMBERSHIP SYMBOLIC(IP_ADD_MEMBERSHIP) +#define IP_ADD_SOURCE_MEMBERSHIP SYMBOLIC(IP_ADD_SOURCE_MEMBERSHIP) +#define IP_BIND_ADDRESS_NO_PORT SYMBOLIC(IP_BIND_ADDRESS_NO_PORT) +#define IP_BLOCK_SOURCE SYMBOLIC(IP_BLOCK_SOURCE) +#define IP_CHECKSUM SYMBOLIC(IP_CHECKSUM) #define IP_DEFAULT_MULTICAST_LOOP SYMBOLIC(IP_DEFAULT_MULTICAST_LOOP) -#define IP_DEFAULT_MULTICAST_TTL SYMBOLIC(IP_DEFAULT_MULTICAST_TTL) -#define IP_DROP_MEMBERSHIP SYMBOLIC(IP_DROP_MEMBERSHIP) +#define IP_DEFAULT_MULTICAST_TTL SYMBOLIC(IP_DEFAULT_MULTICAST_TTL) +#define IP_DROP_MEMBERSHIP SYMBOLIC(IP_DROP_MEMBERSHIP) #define IP_DROP_SOURCE_MEMBERSHIP SYMBOLIC(IP_DROP_SOURCE_MEMBERSHIP) -#define IP_FREEBIND SYMBOLIC(IP_FREEBIND) -#define IP_HDRINCL SYMBOLIC(IP_HDRINCL) -#define IP_IPSEC_POLICY SYMBOLIC(IP_IPSEC_POLICY) -#define IP_MAX_MEMBERSHIPS SYMBOLIC(IP_MAX_MEMBERSHIPS) -#define IP_MINTTL SYMBOLIC(IP_MINTTL) -#define IP_MSFILTER SYMBOLIC(IP_MSFILTER) -#define IP_MTU SYMBOLIC(IP_MTU) -#define IP_MTU_DISCOVER SYMBOLIC(IP_MTU_DISCOVER) -#define IP_MULTICAST_ALL SYMBOLIC(IP_MULTICAST_ALL) -#define IP_MULTICAST_IF SYMBOLIC(IP_MULTICAST_IF) -#define IP_MULTICAST_LOOP SYMBOLIC(IP_MULTICAST_LOOP) -#define IP_MULTICAST_TTL SYMBOLIC(IP_MULTICAST_TTL) -#define IP_NODEFRAG SYMBOLIC(IP_NODEFRAG) -#define IP_OPTIONS SYMBOLIC(IP_OPTIONS) -#define IP_ORIGDSTADDR SYMBOLIC(IP_ORIGDSTADDR) -#define IP_PASSSEC SYMBOLIC(IP_PASSSEC) -#define IP_PKTINFO SYMBOLIC(IP_PKTINFO) -#define IP_PKTOPTIONS SYMBOLIC(IP_PKTOPTIONS) -#define IP_PMTUDISC SYMBOLIC(IP_PMTUDISC) -#define IP_PMTUDISC_DO SYMBOLIC(IP_PMTUDISC_DO) -#define IP_PMTUDISC_DONT SYMBOLIC(IP_PMTUDISC_DONT) -#define IP_PMTUDISC_INTERFACE SYMBOLIC(IP_PMTUDISC_INTERFACE) -#define IP_PMTUDISC_OMIT SYMBOLIC(IP_PMTUDISC_OMIT) -#define IP_PMTUDISC_PROBE SYMBOLIC(IP_PMTUDISC_PROBE) -#define IP_PMTUDISC_WANT SYMBOLIC(IP_PMTUDISC_WANT) -#define IP_RECVERR SYMBOLIC(IP_RECVERR) -#define IP_RECVOPTS SYMBOLIC(IP_RECVOPTS) -#define IP_RECVORIGDSTADDR SYMBOLIC(IP_RECVORIGDSTADDR) -#define IP_RECVRETOPTS SYMBOLIC(IP_RECVRETOPTS) -#define IP_RECVTOS SYMBOLIC(IP_RECVTOS) -#define IP_RECVTTL SYMBOLIC(IP_RECVTTL) -#define IP_RETOPTS SYMBOLIC(IP_RETOPTS) -#define IP_ROUTER_ALERT SYMBOLIC(IP_ROUTER_ALERT) -#define IP_TOS SYMBOLIC(IP_TOS) -#define IP_TRANSPARENT SYMBOLIC(IP_TRANSPARENT) -#define IP_TTL SYMBOLIC(IP_TTL) -#define IP_UNBLOCK_SOURCE SYMBOLIC(IP_UNBLOCK_SOURCE) -#define IP_UNICAST_IF SYMBOLIC(IP_UNICAST_IF) -#define IP_XFRM_POLICY SYMBOLIC(IP_XFRM_POLICY) +#define IP_FREEBIND SYMBOLIC(IP_FREEBIND) +#define IP_HDRINCL SYMBOLIC(IP_HDRINCL) +#define IP_IPSEC_POLICY SYMBOLIC(IP_IPSEC_POLICY) +#define IP_MAX_MEMBERSHIPS SYMBOLIC(IP_MAX_MEMBERSHIPS) +#define IP_MINTTL SYMBOLIC(IP_MINTTL) +#define IP_MSFILTER SYMBOLIC(IP_MSFILTER) +#define IP_MTU SYMBOLIC(IP_MTU) +#define IP_MTU_DISCOVER SYMBOLIC(IP_MTU_DISCOVER) +#define IP_MULTICAST_ALL SYMBOLIC(IP_MULTICAST_ALL) +#define IP_MULTICAST_IF SYMBOLIC(IP_MULTICAST_IF) +#define IP_MULTICAST_LOOP SYMBOLIC(IP_MULTICAST_LOOP) +#define IP_MULTICAST_TTL SYMBOLIC(IP_MULTICAST_TTL) +#define IP_NODEFRAG SYMBOLIC(IP_NODEFRAG) +#define IP_OPTIONS SYMBOLIC(IP_OPTIONS) +#define IP_ORIGDSTADDR SYMBOLIC(IP_ORIGDSTADDR) +#define IP_PASSSEC SYMBOLIC(IP_PASSSEC) +#define IP_PKTINFO SYMBOLIC(IP_PKTINFO) +#define IP_PKTOPTIONS SYMBOLIC(IP_PKTOPTIONS) +#define IP_PMTUDISC SYMBOLIC(IP_PMTUDISC) +#define IP_PMTUDISC_DO SYMBOLIC(IP_PMTUDISC_DO) +#define IP_PMTUDISC_DONT SYMBOLIC(IP_PMTUDISC_DONT) +#define IP_PMTUDISC_INTERFACE SYMBOLIC(IP_PMTUDISC_INTERFACE) +#define IP_PMTUDISC_OMIT SYMBOLIC(IP_PMTUDISC_OMIT) +#define IP_PMTUDISC_PROBE SYMBOLIC(IP_PMTUDISC_PROBE) +#define IP_PMTUDISC_WANT SYMBOLIC(IP_PMTUDISC_WANT) +#define IP_RECVDSTADDR SYMBOLIC(IP_RECVDSTADDR) +#define IP_RECVERR SYMBOLIC(IP_RECVERR) +#define IP_RECVOPTS SYMBOLIC(IP_RECVOPTS) +#define IP_RECVORIGDSTADDR SYMBOLIC(IP_RECVORIGDSTADDR) +#define IP_RECVRETOPTS SYMBOLIC(IP_RECVRETOPTS) +#define IP_RECVTOS SYMBOLIC(IP_RECVTOS) +#define IP_RECVTTL SYMBOLIC(IP_RECVTTL) +#define IP_RETOPTS SYMBOLIC(IP_RETOPTS) +#define IP_ROUTER_ALERT SYMBOLIC(IP_ROUTER_ALERT) +#define IP_TOS SYMBOLIC(IP_TOS) +#define IP_TRANSPARENT SYMBOLIC(IP_TRANSPARENT) +#define IP_TTL SYMBOLIC(IP_TTL) +#define IP_UNBLOCK_SOURCE SYMBOLIC(IP_UNBLOCK_SOURCE) +#define IP_UNICAST_IF SYMBOLIC(IP_UNICAST_IF) +#define IP_XFRM_POLICY SYMBOLIC(IP_XFRM_POLICY) #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -88,6 +89,7 @@ extern const long IP_PMTUDISC_INTERFACE; extern const long IP_PMTUDISC_OMIT; extern const long IP_PMTUDISC_PROBE; extern const long IP_PMTUDISC_WANT; +extern const long IP_RECVDSTADDR; extern const long IP_RECVERR; extern const long IP_RECVOPTS; extern const long IP_RECVORIGDSTADDR; diff --git a/libc/sysv/consts/ipport.h b/libc/sysv/consts/ipport.h index d8d00ae6c..0dcaaf779 100644 --- a/libc/sysv/consts/ipport.h +++ b/libc/sysv/consts/ipport.h @@ -1,61 +1,69 @@ #ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_IPPORT_H_ #define COSMOPOLITAN_LIBC_SYSV_CONSTS_IPPORT_H_ +#include "libc/runtime/symbolic.h" /** * ARPA network ports. */ -#define IPPORT_ECHO 7 -#define IPPORT_DISCARD 9 -#define IPPORT_SYSTAT 11 -#define IPPORT_DAYTIME 13 -#define IPPORT_NETSTAT 15 -#define IPPORT_FTP 21 -#define IPPORT_TELNET 23 -#define IPPORT_SMTP 25 -#define IPPORT_TIMESERVER 37 -#define IPPORT_NAMESERVER 42 -#define IPPORT_WHOIS 43 -#define IPPORT_MTP 57 -#define IPPORT_TFTP 69 -#define IPPORT_RJE 77 -#define IPPORT_FINGER 79 -#define IPPORT_TTYLINK 87 -#define IPPORT_SUPDUP 95 -#define IPPORT_EXECSERVER 512 -#define IPPORT_LOGINSERVER 513 -#define IPPORT_CMDSERVER 514 -#define IPPORT_EFSSERVER 520 -#define IPPORT_BIFFUDP 512 -#define IPPORT_WHOSERVER 513 -#define IPPORT_ROUTESERVER 520 -#define IPPORT_RESERVED 1024 -#define IPPORT_USERRESERVED 5000 +#define IPPORT_ECHO 7 +#define IPPORT_DISCARD 9 +#define IPPORT_SYSTAT 11 +#define IPPORT_DAYTIME 13 +#define IPPORT_NETSTAT 15 +#define IPPORT_FTP 21 +#define IPPORT_TELNET 23 +#define IPPORT_SMTP 25 +#define IPPORT_TIMESERVER 37 +#define IPPORT_NAMESERVER 42 +#define IPPORT_WHOIS 43 +#define IPPORT_MTP 57 +#define IPPORT_TFTP 69 +#define IPPORT_RJE 77 +#define IPPORT_FINGER 79 +#define IPPORT_TTYLINK 87 +#define IPPORT_SUPDUP 95 +#define IPPORT_EXECSERVER 512 +#define IPPORT_LOGINSERVER 513 +#define IPPORT_CMDSERVER 514 +#define IPPORT_EFSSERVER 520 +#define IPPORT_BIFFUDP 512 +#define IPPORT_WHOSERVER 513 +#define IPPORT_ROUTESERVER 520 +#define IPPORT_RESERVED 1024 +#define IPPORT_USERRESERVED SYMBOLIC(IPPORT_USERRESERVED) /** * Modern network ports. */ -#define IPPORT_SSH 22 -#define IPPORT_DOMAIN 53 -#define IPPORT_HTTP 80 -#define IPPORT_POP3 110 -#define IPPORT_SFTP 115 -#define IPPORT_NTP 123 -#define IPPORT_IMAP2 143 -#define IPPORT_NETBIOS_NS 137 +#define IPPORT_SSH 22 +#define IPPORT_DOMAIN 53 +#define IPPORT_HTTP 80 +#define IPPORT_POP3 110 +#define IPPORT_SFTP 115 +#define IPPORT_NTP 123 +#define IPPORT_IMAP2 143 +#define IPPORT_NETBIOS_NS 137 #define IPPORT_NETBIOS_DGM 138 #define IPPORT_NETBIOS_SSN 139 -#define IPPORT_BGP 179 -#define IPPORT_IRC 194 -#define IPPORT_HTTPS 443 -#define IPPORT_PRINTER 515 -#define IPPORT_NFS 2049 -#define IPPORT_DISTCC 3632 -#define IPPORT_SIP 5060 -#define IPPORT_POSTGRESQL 5432 -#define IPPORT_X11 6000 -#define IPPORT_GIT 9418 -#define IPPORT_IRCD 6667 -#define IPPORT_IMAPS 993 -#define IPPORT_POP3S 995 +#define IPPORT_BGP 179 +#define IPPORT_IRC 194 +#define IPPORT_HTTPS 443 +#define IPPORT_PRINTER 515 +#define IPPORT_NFS 2049 +#define IPPORT_DISTCC 3632 +#define IPPORT_SIP 5060 +#define IPPORT_POSTGRESQL 5432 +#define IPPORT_X11 6000 +#define IPPORT_GIT 9418 +#define IPPORT_IRCD 6667 +#define IPPORT_IMAPS 993 +#define IPPORT_POP3S 995 +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +extern const long IPPORT_USERRESERVED; + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_IPPORT_H_ */ diff --git a/libc/sysv/consts/msg.h b/libc/sysv/consts/msg.h index 6033774c9..41d28ee29 100644 --- a/libc/sysv/consts/msg.h +++ b/libc/sysv/consts/msg.h @@ -5,20 +5,24 @@ COSMOPOLITAN_C_START_ extern const long MSG_BATCH; +extern const long MSG_BCAST; extern const long MSG_CMSG_CLOEXEC; extern const long MSG_CONFIRM; extern const long MSG_CTRUNC; extern const long MSG_DONTROUTE; extern const long MSG_DONTWAIT; +extern const long MSG_EOF; extern const long MSG_EOR; extern const long MSG_ERRQUEUE; extern const long MSG_EXCEPT; extern const long MSG_FASTOPEN; extern const long MSG_FIN; extern const long MSG_INFO; +extern const long MSG_MCAST; extern const long MSG_MORE; extern const long MSG_NOERROR; extern const long MSG_NOSIGNAL; +extern const long MSG_NOTIFICATION; extern const long MSG_OOB; extern const long MSG_PARITY_ERROR; extern const long MSG_PEEK; @@ -33,30 +37,34 @@ extern const long MSG_WAITFORONE; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#define MSG_BATCH SYMBOLIC(MSG_BATCH) +#define MSG_BATCH SYMBOLIC(MSG_BATCH) +#define MSG_BCAST SYMBOLIC(MSG_BCAST) #define MSG_CMSG_CLOEXEC SYMBOLIC(MSG_CMSG_CLOEXEC) -#define MSG_CONFIRM SYMBOLIC(MSG_CONFIRM) -#define MSG_CTRUNC SYMBOLIC(MSG_CTRUNC) -#define MSG_DONTROUTE LITERALLY(4) -#define MSG_DONTWAIT SYMBOLIC(MSG_DONTWAIT) -#define MSG_EOR SYMBOLIC(MSG_EOR) -#define MSG_ERRQUEUE SYMBOLIC(MSG_ERRQUEUE) -#define MSG_EXCEPT SYMBOLIC(MSG_EXCEPT) -#define MSG_FASTOPEN SYMBOLIC(MSG_FASTOPEN) -#define MSG_FIN SYMBOLIC(MSG_FIN) -#define MSG_INFO SYMBOLIC(MSG_INFO) -#define MSG_MORE SYMBOLIC(MSG_MORE) -#define MSG_NOERROR SYMBOLIC(MSG_NOERROR) -#define MSG_NOSIGNAL SYMBOLIC(MSG_NOSIGNAL) -#define MSG_OOB LITERALLY(1) +#define MSG_CONFIRM SYMBOLIC(MSG_CONFIRM) +#define MSG_CTRUNC SYMBOLIC(MSG_CTRUNC) +#define MSG_DONTROUTE LITERALLY(4) +#define MSG_DONTWAIT SYMBOLIC(MSG_DONTWAIT) +#define MSG_EOF SYMBOLIC(MSG_EOF) +#define MSG_EOR SYMBOLIC(MSG_EOR) +#define MSG_ERRQUEUE SYMBOLIC(MSG_ERRQUEUE) +#define MSG_EXCEPT SYMBOLIC(MSG_EXCEPT) +#define MSG_FASTOPEN SYMBOLIC(MSG_FASTOPEN) +#define MSG_FIN SYMBOLIC(MSG_FIN) +#define MSG_INFO SYMBOLIC(MSG_INFO) +#define MSG_MCAST SYMBOLIC(MSG_MCAST) +#define MSG_MORE SYMBOLIC(MSG_MORE) +#define MSG_NOERROR SYMBOLIC(MSG_NOERROR) +#define MSG_NOSIGNAL SYMBOLIC(MSG_NOSIGNAL) +#define MSG_NOTIFICATION SYMBOLIC(MSG_NOTIFICATION) +#define MSG_OOB LITERALLY(1) #define MSG_PARITY_ERROR SYMBOLIC(MSG_PARITY_ERROR) -#define MSG_PEEK LITERALLY(2) -#define MSG_PROXY SYMBOLIC(MSG_PROXY) -#define MSG_RST SYMBOLIC(MSG_RST) -#define MSG_STAT SYMBOLIC(MSG_STAT) -#define MSG_SYN SYMBOLIC(MSG_SYN) -#define MSG_TRUNC SYMBOLIC(MSG_TRUNC) -#define MSG_WAITALL SYMBOLIC(MSG_WAITALL) -#define MSG_WAITFORONE SYMBOLIC(MSG_WAITFORONE) +#define MSG_PEEK LITERALLY(2) +#define MSG_PROXY SYMBOLIC(MSG_PROXY) +#define MSG_RST SYMBOLIC(MSG_RST) +#define MSG_STAT SYMBOLIC(MSG_STAT) +#define MSG_SYN SYMBOLIC(MSG_SYN) +#define MSG_TRUNC SYMBOLIC(MSG_TRUNC) +#define MSG_WAITALL SYMBOLIC(MSG_WAITALL) +#define MSG_WAITFORONE SYMBOLIC(MSG_WAITFORONE) #endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_MSG_H_ */ diff --git a/libc/sysv/consts/so.h b/libc/sysv/consts/so.h index f11b05382..e3ec79d74 100644 --- a/libc/sysv/consts/so.h +++ b/libc/sysv/consts/so.h @@ -2,66 +2,72 @@ #define COSMOPOLITAN_LIBC_SYSV_CONSTS_SO_H_ #include "libc/runtime/symbolic.h" -#define SO_ACCEPTCONN SYMBOLIC(SO_ACCEPTCONN) -#define SO_ATTACH_BPF SYMBOLIC(SO_ATTACH_BPF) -#define SO_ATTACH_FILTER SYMBOLIC(SO_ATTACH_FILTER) +#define LOCAL_PEERCRED SYMBOLIC(LOCAL_PEERCRED) +#define SO_ACCEPTCONN SYMBOLIC(SO_ACCEPTCONN) +#define SO_ATTACH_BPF SYMBOLIC(SO_ATTACH_BPF) +#define SO_ATTACH_FILTER SYMBOLIC(SO_ATTACH_FILTER) #define SO_ATTACH_REUSEPORT_CBPF SYMBOLIC(SO_ATTACH_REUSEPORT_CBPF) #define SO_ATTACH_REUSEPORT_EBPF SYMBOLIC(SO_ATTACH_REUSEPORT_EBPF) -#define SO_BINDTODEVICE SYMBOLIC(SO_BINDTODEVICE) -#define SO_BPF_EXTENSIONS SYMBOLIC(SO_BPF_EXTENSIONS) -#define SO_BROADCAST SYMBOLIC(SO_BROADCAST) -#define SO_BSDCOMPAT SYMBOLIC(SO_BSDCOMPAT) -#define SO_BUSY_POLL SYMBOLIC(SO_BUSY_POLL) -#define SO_CNX_ADVICE SYMBOLIC(SO_CNX_ADVICE) -#define SO_DEBUG SYMBOLIC(SO_DEBUG) -#define SO_DETACH_BPF SYMBOLIC(SO_DETACH_BPF) -#define SO_DETACH_FILTER SYMBOLIC(SO_DETACH_FILTER) -#define SO_DOMAIN SYMBOLIC(SO_DOMAIN) -#define SO_DONTROUTE SYMBOLIC(SO_DONTROUTE) -#define SO_ERROR SYMBOLIC(SO_ERROR) -#define SO_EXCLUSIVEADDRUSE SYMBOLIC(SO_EXCLUSIVEADDRUSE) -#define SO_GET_FILTER SYMBOLIC(SO_GET_FILTER) -#define SO_INCOMING_CPU SYMBOLIC(SO_INCOMING_CPU) -#define SO_KEEPALIVE SYMBOLIC(SO_KEEPALIVE) -#define SO_LINGER SYMBOLIC(SO_LINGER) -#define SO_LOCK_FILTER SYMBOLIC(SO_LOCK_FILTER) -#define SO_MARK SYMBOLIC(SO_MARK) -#define SO_MAX_PACING_RATE SYMBOLIC(SO_MAX_PACING_RATE) -#define SO_NOFCS SYMBOLIC(SO_NOFCS) -#define SO_NO_CHECK SYMBOLIC(SO_NO_CHECK) -#define SO_OOBINLINE SYMBOLIC(SO_OOBINLINE) -#define SO_PASSCRED SYMBOLIC(SO_PASSCRED) -#define SO_PASSSEC SYMBOLIC(SO_PASSSEC) -#define SO_PEEK_OFF SYMBOLIC(SO_PEEK_OFF) -#define SO_PEERCRED SYMBOLIC(SO_PEERCRED) -#define SO_PEERNAME SYMBOLIC(SO_PEERNAME) -#define SO_PEERSEC SYMBOLIC(SO_PEERSEC) -#define SO_PRIORITY SYMBOLIC(SO_PRIORITY) -#define SO_PROTOCOL SYMBOLIC(SO_PROTOCOL) -#define SO_RCVBUF SYMBOLIC(SO_RCVBUF) -#define SO_RCVBUFFORCE SYMBOLIC(SO_RCVBUFFORCE) -#define SO_RCVLOWAT SYMBOLIC(SO_RCVLOWAT) -#define SO_RCVTIMEO SYMBOLIC(SO_RCVTIMEO) -#define SO_REUSEADDR SYMBOLIC(SO_REUSEADDR) -#define SO_REUSEPORT SYMBOLIC(SO_REUSEPORT) -#define SO_RXQ_OVFL SYMBOLIC(SO_RXQ_OVFL) -#define SO_SECURITY_AUTHENTICATION SYMBOLIC(SO_SECURITY_AUTHENTICATION) +#define SO_BINDTODEVICE SYMBOLIC(SO_BINDTODEVICE) +#define SO_BPF_EXTENSIONS SYMBOLIC(SO_BPF_EXTENSIONS) +#define SO_BROADCAST SYMBOLIC(SO_BROADCAST) +#define SO_BSDCOMPAT SYMBOLIC(SO_BSDCOMPAT) +#define SO_BUSY_POLL SYMBOLIC(SO_BUSY_POLL) +#define SO_CNX_ADVICE SYMBOLIC(SO_CNX_ADVICE) +#define SO_DEBUG SYMBOLIC(SO_DEBUG) +#define SO_DETACH_BPF SYMBOLIC(SO_DETACH_BPF) +#define SO_DETACH_FILTER SYMBOLIC(SO_DETACH_FILTER) +#define SO_DOMAIN SYMBOLIC(SO_DOMAIN) +#define SO_DONTROUTE SYMBOLIC(SO_DONTROUTE) +#define SO_ERROR SYMBOLIC(SO_ERROR) +#define SO_EXCLUSIVEADDRUSE SYMBOLIC(SO_EXCLUSIVEADDRUSE) +#define SO_GET_FILTER SYMBOLIC(SO_GET_FILTER) +#define SO_INCOMING_CPU SYMBOLIC(SO_INCOMING_CPU) +#define SO_KEEPALIVE SYMBOLIC(SO_KEEPALIVE) +#define SO_LINGER SYMBOLIC(SO_LINGER) +#define SO_LOCK_FILTER SYMBOLIC(SO_LOCK_FILTER) +#define SO_MARK SYMBOLIC(SO_MARK) +#define SO_MAX_PACING_RATE SYMBOLIC(SO_MAX_PACING_RATE) +#define SO_NOFCS SYMBOLIC(SO_NOFCS) +#define SO_NO_CHECK SYMBOLIC(SO_NO_CHECK) +#define SO_OOBINLINE SYMBOLIC(SO_OOBINLINE) +#define SO_PASSCRED SYMBOLIC(SO_PASSCRED) +#define SO_PASSSEC SYMBOLIC(SO_PASSSEC) +#define SO_PEEK_OFF SYMBOLIC(SO_PEEK_OFF) +#define SO_PEERCRED SYMBOLIC(SO_PEERCRED) +#define SO_PEERNAME SYMBOLIC(SO_PEERNAME) +#define SO_PEERSEC SYMBOLIC(SO_PEERSEC) +#define SO_PRIORITY SYMBOLIC(SO_PRIORITY) +#define SO_PROTOCOL SYMBOLIC(SO_PROTOCOL) +#define SO_RCVBUF SYMBOLIC(SO_RCVBUF) +#define SO_RCVBUFFORCE SYMBOLIC(SO_RCVBUFFORCE) +#define SO_RCVLOWAT SYMBOLIC(SO_RCVLOWAT) +#define SO_RCVTIMEO SYMBOLIC(SO_RCVTIMEO) +#define SO_REUSEADDR SYMBOLIC(SO_REUSEADDR) +#define SO_REUSEPORT SYMBOLIC(SO_REUSEPORT) +#define SO_RXQ_OVFL SYMBOLIC(SO_RXQ_OVFL) +#define SO_SELECT_ERR_QUEUE SYMBOLIC(SO_SELECT_ERR_QUEUE) +#define SO_SETFIB SYMBOLIC(SO_SETFIB) +#define SO_SNDBUF SYMBOLIC(SO_SNDBUF) +#define SO_SNDBUFFORCE SYMBOLIC(SO_SNDBUFFORCE) +#define SO_SNDLOWAT SYMBOLIC(SO_SNDLOWAT) +#define SO_SNDTIMEO SYMBOLIC(SO_SNDTIMEO) +#define SO_TIMESTAMP SYMBOLIC(SO_TIMESTAMP) +#define SO_TIMESTAMPING SYMBOLIC(SO_TIMESTAMPING) +#define SO_TIMESTAMPNS SYMBOLIC(SO_TIMESTAMPNS) +#define SO_TYPE SYMBOLIC(SO_TYPE) +#define SO_USELOOPBACK SYMBOLIC(SO_USELOOPBACK) +#define SO_WIFI_STATUS SYMBOLIC(SO_WIFI_STATUS) + +#define SO_SECURITY_AUTHENTICATION SYMBOLIC(SO_SECURITY_AUTHENTICATION) #define SO_SECURITY_ENCRYPTION_NETWORK SYMBOLIC(SO_SECURITY_ENCRYPTION_NETWORK) -#define SO_SECURITY_ENCRYPTION_TRANSPORT SYMBOLIC(SO_SECURITY_ENCRYPTION_TRANSPORT) -#define SO_SELECT_ERR_QUEUE SYMBOLIC(SO_SELECT_ERR_QUEUE) -#define SO_SNDBUF SYMBOLIC(SO_SNDBUF) -#define SO_SNDBUFFORCE SYMBOLIC(SO_SNDBUFFORCE) -#define SO_SNDLOWAT SYMBOLIC(SO_SNDLOWAT) -#define SO_SNDTIMEO SYMBOLIC(SO_SNDTIMEO) -#define SO_TIMESTAMP SYMBOLIC(SO_TIMESTAMP) -#define SO_TIMESTAMPING SYMBOLIC(SO_TIMESTAMPING) -#define SO_TIMESTAMPNS SYMBOLIC(SO_TIMESTAMPNS) -#define SO_TYPE SYMBOLIC(SO_TYPE) -#define SO_WIFI_STATUS SYMBOLIC(SO_WIFI_STATUS) +#define SO_SECURITY_ENCRYPTION_TRANSPORT \ + SYMBOLIC(SO_SECURITY_ENCRYPTION_TRANSPORT) #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +extern const long LOCAL_PEERCRED; extern const long SO_ACCEPTCONN; extern const long SO_ATTACH_BPF; extern const long SO_ATTACH_FILTER; @@ -109,6 +115,7 @@ extern const long SO_SECURITY_AUTHENTICATION; extern const long SO_SECURITY_ENCRYPTION_NETWORK; extern const long SO_SECURITY_ENCRYPTION_TRANSPORT; extern const long SO_SELECT_ERR_QUEUE; +extern const long SO_SETFIB; extern const long SO_SNDBUF; extern const long SO_SNDBUFFORCE; extern const long SO_SNDLOWAT; @@ -117,6 +124,7 @@ extern const long SO_TIMESTAMP; extern const long SO_TIMESTAMPING; extern const long SO_TIMESTAMPNS; extern const long SO_TYPE; +extern const long SO_USELOOPBACK; extern const long SO_WIFI_STATUS; COSMOPOLITAN_C_END_ diff --git a/third_party/gdtoa/gdtoa.internal.h b/third_party/gdtoa/gdtoa.internal.h index 970015a47..9c120c511 100644 --- a/third_party/gdtoa/gdtoa.internal.h +++ b/third_party/gdtoa/gdtoa.internal.h @@ -540,10 +540,8 @@ extern void __gdtoa_memcpy(void *, const void *, size_t); #define gethex __gdtoa_gethex #define hexdig __gdtoa_hexdig #define hexnan __gdtoa_hexnan -#define hi0bits(x) __gdtoa_hi0bits((ULong)(x)) #define i2b __gdtoa_i2b #define increment __gdtoa_increment -#define lo0bits __gdtoa_lo0bits #define lshift __gdtoa_lshift #define match __gdtoa_match #define mult __gdtoa_mult @@ -594,10 +592,8 @@ extern char *g__fmt(char *, char *, char *, int, ULong, size_t); extern int gethex(CONST char **, CONST FPI *, Long *, Bigint **, int MTd); extern void __gdtoa_hexdig_init(void); extern int hexnan(CONST char **, CONST FPI *, ULong *); -extern int __gdtoa_hi0bits(ULong); extern Bigint *i2b(int MTd); extern Bigint *increment(Bigint *MTd); -extern int lo0bits(ULong *); extern Bigint *lshift(Bigint *, int MTd); extern int match(CONST char **, char *); extern Bigint *mult(Bigint *, Bigint *MTd); @@ -617,6 +613,21 @@ extern Bigint *sum(Bigint *, Bigint *MTd); extern int trailz(Bigint *); extern double ulp(U *); +forceinline int lo0bits(ULong *y) { + int k; + if (*y) { + k = __builtin_ctz(*y); + *y >>= k; + return k; + } else { + return 32; + } +} + +forceinline int hi0bits(ULong x) { + return x ? __builtin_clz(x) : 32; +} + #ifdef __cplusplus } #endif diff --git a/third_party/gdtoa/misc.c b/third_party/gdtoa/misc.c index debea4093..ffcea5b4d 100644 --- a/third_party/gdtoa/misc.c +++ b/third_party/gdtoa/misc.c @@ -177,49 +177,6 @@ Bfree(Bigint *v MTd) } } -int -lo0bits(ULong *y) -{ - int k; - ULong x = *y; - - if (x & 7) { - if (x & 1) - return 0; - if (x & 2) { - *y = x >> 1; - return 1; - } - *y = x >> 2; - return 2; - } - k = 0; - if (!(x & 0xffff)) { - k = 16; - x >>= 16; - } - if (!(x & 0xff)) { - k += 8; - x >>= 8; - } - if (!(x & 0xf)) { - k += 4; - x >>= 4; - } - if (!(x & 0x3)) { - k += 2; - x >>= 2; - } - if (!(x & 1)) { - k++; - x >>= 1; - if (!x) - return 32; - } - *y = x; - return k; - } - Bigint * multadd(Bigint *b, int m, int a MTd) /* multiply by m and add a */ { @@ -272,35 +229,6 @@ multadd(Bigint *b, int m, int a MTd) /* multiply by m and add a */ return b; } -int -__gdtoa_hi0bits(ULong x) -{ - int k = 0; - - if (!(x & 0xffff0000)) { - k = 16; - x <<= 16; - } - if (!(x & 0xff000000)) { - k += 8; - x <<= 8; - } - if (!(x & 0xf0000000)) { - k += 4; - x <<= 4; - } - if (!(x & 0xc0000000)) { - k += 2; - x <<= 2; - } - if (!(x & 0x80000000)) { - k++; - if (!(x & 0x40000000)) - return 32; - } - return k; - } - Bigint * i2b(int i MTd) { diff --git a/third_party/lua/lua.mk b/third_party/lua/lua.mk index 4cb4e841d..8b204ae5b 100644 --- a/third_party/lua/lua.mk +++ b/third_party/lua/lua.mk @@ -52,7 +52,7 @@ o/$(MODE)/third_party/lua/lua.com.dbg: \ $(THIRD_PARTY_LUA_DEPS) \ $(THIRD_PARTY_LUA_A) \ $(THIRD_PARTY_LUA_A).pkg \ - o/$(MODE)/third_party/lua/lua.o \ + o/$(MODE)/third_party/lua/lua.main.o \ $(CRT) \ $(APE) -@$(APELINK) @@ -61,7 +61,7 @@ o/$(MODE)/third_party/lua/luac.com.dbg: \ $(THIRD_PARTY_LUA_DEPS) \ $(THIRD_PARTY_LUA_A) \ $(THIRD_PARTY_LUA_A).pkg \ - o/$(MODE)/third_party/lua/luac.o \ + o/$(MODE)/third_party/lua/luac.main.o \ $(CRT) \ $(APE) -@$(APELINK) diff --git a/third_party/python/.gitattributes b/third_party/python/.gitattributes index e3dbd9d3a..62001a921 100644 --- a/third_party/python/.gitattributes +++ b/third_party/python/.gitattributes @@ -1,17 +1,14 @@ -# Binary data types +# -*- conf -*- +*.com binary *.aif binary *.aifc binary *.aiff binary *.au binary *.bmp binary -*.exe binary -*.icns binary *.gif binary -*.ico binary *.jpg binary *.pck binary *.png binary -*.psd binary *.tar binary *.wav binary *.whl binary diff --git a/third_party/python/Include/Python.h b/third_party/python/Include/Python.h index bf1dfac06..55c75d24e 100644 --- a/third_party/python/Include/Python.h +++ b/third_party/python/Include/Python.h @@ -1,57 +1,29 @@ #ifndef Py_PYTHON_H #define Py_PYTHON_H -/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ +#include "libc/assert.h" +#include "libc/calls/calls.h" +#include "libc/calls/weirdtypes.h" +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/fmt.h" +#include "libc/limits.h" +#include "libc/log/log.h" +#include "libc/mem/mem.h" +#include "libc/rand/rand.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/stdio/temp.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/exit.h" +#include "libc/sysv/consts/fileno.h" +#include "libc/sysv/consts/o.h" +#include "third_party/python/Include/patchlevel.h" +#include "third_party/python/Include/pymacconfig.h" +#include "third_party/python/pyconfig.h" +/* clang-format off */ -/* Include nearly all Python header files */ - -#include "patchlevel.h" -#include "pyconfig.h" -#include "pymacconfig.h" - -#include - -#ifndef UCHAR_MAX -#error "Something's broken. UCHAR_MAX should be defined in limits.h." -#endif - -#if UCHAR_MAX != 255 -#error "Python's source code assumes C's unsigned char is an 8-bit type." -#endif - -#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE) -#define _SGI_MP_SOURCE -#endif - -#include -#ifndef NULL -# error "Python.h requires that stdio.h define NULL." -#endif - -#include -#ifdef HAVE_ERRNO_H -#include -#endif -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_CRYPT_H -#include -#endif - -/* For size_t? */ -#ifdef HAVE_STDDEF_H -#include -#endif - -/* CAUTION: Build setups should ensure that NDEBUG is defined on the - * compiler command line when building Python in release mode; else - * assert() calls won't be removed. - */ -#include - -#include "pyport.h" -#include "pymacro.h" +#include "third_party/python/Include/pyport.h" +#include "third_party/python/Include/pymacro.h" /* A convenient way for code to know if clang's memory sanitizer is enabled. */ #if defined(__has_feature) @@ -62,7 +34,7 @@ # endif #endif -#include "pyatomic.h" +#include "third_party/python/Include/pyatomic.h" /* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. * PYMALLOC_DEBUG is in error if pymalloc is not in use. @@ -73,76 +45,77 @@ #if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) #error "PYMALLOC_DEBUG requires WITH_PYMALLOC" #endif -#include "pymath.h" -#include "pytime.h" -#include "pymem.h" -#include "object.h" -#include "objimpl.h" -#include "typeslots.h" -#include "pyhash.h" +#include "third_party/python/Include/pymath.h" +#include "third_party/python/Include/pytime.h" +#include "third_party/python/Include/pymem.h" -#include "pydebug.h" +#include "third_party/python/Include/object.h" +#include "third_party/python/Include/objimpl.h" +#include "third_party/python/Include/typeslots.h" +#include "third_party/python/Include/pyhash.h" -#include "bytearrayobject.h" -#include "bytesobject.h" -#include "unicodeobject.h" -#include "longobject.h" -#include "longintrepr.h" -#include "boolobject.h" -#include "floatobject.h" -#include "complexobject.h" -#include "rangeobject.h" -#include "memoryobject.h" -#include "tupleobject.h" -#include "listobject.h" -#include "dictobject.h" -#include "odictobject.h" -#include "enumobject.h" -#include "setobject.h" -#include "methodobject.h" -#include "moduleobject.h" -#include "funcobject.h" -#include "classobject.h" -#include "fileobject.h" -#include "pycapsule.h" -#include "traceback.h" -#include "sliceobject.h" -#include "cellobject.h" -#include "iterobject.h" -#include "genobject.h" -#include "descrobject.h" -#include "warnings.h" -#include "weakrefobject.h" -#include "structseq.h" -#include "namespaceobject.h" +#include "third_party/python/Include/pydebug.h" -#include "codecs.h" -#include "pyerrors.h" +#include "third_party/python/Include/bytearrayobject.h" +#include "third_party/python/Include/bytesobject.h" +#include "third_party/python/Include/unicodeobject.h" +#include "third_party/python/Include/longobject.h" +#include "third_party/python/Include/longintrepr.h" +#include "third_party/python/Include/boolobject.h" +#include "third_party/python/Include/floatobject.h" +#include "third_party/python/Include/complexobject.h" +#include "third_party/python/Include/rangeobject.h" +#include "third_party/python/Include/memoryobject.h" +#include "third_party/python/Include/tupleobject.h" +#include "third_party/python/Include/listobject.h" +#include "third_party/python/Include/dictobject.h" +#include "third_party/python/Include/odictobject.h" +#include "third_party/python/Include/enumobject.h" +#include "third_party/python/Include/setobject.h" +#include "third_party/python/Include/methodobject.h" +#include "third_party/python/Include/moduleobject.h" +#include "third_party/python/Include/funcobject.h" +#include "third_party/python/Include/classobject.h" +#include "third_party/python/Include/fileobject.h" +#include "third_party/python/Include/pycapsule.h" +#include "third_party/python/Include/traceback.h" +#include "third_party/python/Include/sliceobject.h" +#include "third_party/python/Include/cellobject.h" +#include "third_party/python/Include/iterobject.h" +#include "third_party/python/Include/genobject.h" +#include "third_party/python/Include/descrobject.h" +#include "third_party/python/Include/warnings.h" +#include "third_party/python/Include/weakrefobject.h" +#include "third_party/python/Include/structseq.h" +#include "third_party/python/Include/namespaceobject.h" -#include "pystate.h" +#include "third_party/python/Include/codecs.h" +#include "third_party/python/Include/pyerrors.h" -#include "pyarena.h" -#include "modsupport.h" -#include "pythonrun.h" -#include "pylifecycle.h" -#include "ceval.h" -#include "sysmodule.h" -#include "osmodule.h" -#include "intrcheck.h" -#include "import.h" +#include "third_party/python/Include/pystate.h" -#include "abstract.h" -#include "bltinmodule.h" +#include "third_party/python/Include/pyarena.h" +#include "third_party/python/Include/modsupport.h" +#include "third_party/python/Include/pythonrun.h" +#include "third_party/python/Include/pylifecycle.h" +#include "third_party/python/Include/ceval.h" +#include "third_party/python/Include/sysmodule.h" +#include "third_party/python/Include/osmodule.h" +#include "third_party/python/Include/intrcheck.h" +#include "third_party/python/Include/import.h" -#include "compile.h" -#include "eval.h" +#include "third_party/python/Include/abstract.h" +#include "third_party/python/Include/bltinmodule.h" -#include "pyctype.h" -#include "pystrtod.h" -#include "pystrcmp.h" -#include "dtoa.h" -#include "fileutils.h" -#include "pyfpe.h" +#include "third_party/python/Include/compile.h" +#include "third_party/python/Include/eval.h" + +#include "third_party/python/Include/pyctype.h" +#include "third_party/python/Include/pystrtod.h" +#include "third_party/python/Include/pystrcmp.h" +#include "third_party/python/Include/dtoa.h" +#include "third_party/python/Include/fileutils.h" +#include "third_party/python/Include/pyfpe.h" #endif /* !Py_PYTHON_H */ diff --git a/third_party/python/Include/abstract.h b/third_party/python/Include/abstract.h index 6bb76ec95..1ccad73fb 100644 --- a/third_party/python/Include/abstract.h +++ b/third_party/python/Include/abstract.h @@ -1,8 +1,7 @@ #ifndef Py_ABSTRACTOBJECT_H #define Py_ABSTRACTOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifdef PY_SSIZE_T_CLEAN #define PyObject_CallFunction _PyObject_CallFunction_SizeT @@ -1370,8 +1369,5 @@ PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape); #endif /* !Py_LIMITED_API */ - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* Py_ABSTRACTOBJECT_H */ diff --git a/third_party/python/Include/accu.h b/third_party/python/Include/accu.h index 3636ea6c9..4a1ff91a4 100644 --- a/third_party/python/Include/accu.h +++ b/third_party/python/Include/accu.h @@ -1,20 +1,8 @@ #ifndef Py_LIMITED_API #ifndef Py_ACCU_H #define Py_ACCU_H - -/*** This is a private API for use by the interpreter and the stdlib. - *** Its definition may be changed or removed at any moment. - ***/ - -/* - * A two-level accumulator of unicode objects that avoids both the overhead - * of keeping a huge number of small separate objects, and the quadratic - * behaviour of using a naive repeated concatenation scheme. - */ - -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #undef small /* defined by some Windows headers */ @@ -29,9 +17,6 @@ PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* Py_ACCU_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/asdl.h b/third_party/python/Include/asdl.h index 35e9fa186..94b52f14e 100644 --- a/third_party/python/Include/asdl.h +++ b/third_party/python/Include/asdl.h @@ -1,5 +1,6 @@ #ifndef Py_ASDL_H #define Py_ASDL_H +/* clang-format off */ typedef PyObject * identifier; typedef PyObject * string; diff --git a/third_party/python/Include/ast.h b/third_party/python/Include/ast.h index 6a8c8165c..325f245b5 100644 --- a/third_party/python/Include/ast.h +++ b/third_party/python/Include/ast.h @@ -1,9 +1,9 @@ #ifndef Py_AST_H #define Py_AST_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ +extern int foo; PyAPI_FUNC(int) PyAST_Validate(mod_ty); PyAPI_FUNC(mod_ty) PyAST_FromNode( const node *n, @@ -16,7 +16,5 @@ PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( PyObject *filename, PyArena *arena); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_AST_H */ diff --git a/third_party/python/Include/bitset.h b/third_party/python/Include/bitset.h index faeb41913..11544451c 100644 --- a/third_party/python/Include/bitset.h +++ b/third_party/python/Include/bitset.h @@ -1,11 +1,7 @@ - #ifndef Py_BITSET_H #define Py_BITSET_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Bitset interface */ +COSMOPOLITAN_C_START_ +/* clang-format off */ #define BYTE char @@ -26,7 +22,5 @@ void mergebitset(bitset bs1, bitset bs2, int nbits); #define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) #define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_BITSET_H */ diff --git a/third_party/python/Include/bltinmodule.h b/third_party/python/Include/bltinmodule.h index 868c9e644..3d5fe57c0 100644 --- a/third_party/python/Include/bltinmodule.h +++ b/third_party/python/Include/bltinmodule.h @@ -1,14 +1,11 @@ #ifndef Py_BLTINMODULE_H #define Py_BLTINMODULE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_DATA(PyTypeObject) PyFilter_Type; PyAPI_DATA(PyTypeObject) PyMap_Type; PyAPI_DATA(PyTypeObject) PyZip_Type; -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_BLTINMODULE_H */ diff --git a/third_party/python/Include/boolobject.h b/third_party/python/Include/boolobject.h index 7cc2f1fe2..cbf0cbee6 100644 --- a/third_party/python/Include/boolobject.h +++ b/third_party/python/Include/boolobject.h @@ -1,11 +1,7 @@ -/* Boolean object interface */ - #ifndef Py_BOOLOBJECT_H #define Py_BOOLOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_DATA(PyTypeObject) PyBool_Type; @@ -18,17 +14,15 @@ Don't forget to apply Py_INCREF() when returning either!!! */ PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; /* Use these macros */ -#define Py_False ((PyObject *) &_Py_FalseStruct) -#define Py_True ((PyObject *) &_Py_TrueStruct) +#define Py_False ((PyObject *)&_Py_FalseStruct) +#define Py_True ((PyObject *)&_Py_TrueStruct) /* Macros for returning Py_True or Py_False, respectively */ -#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True #define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False /* Function to return a bool from a C long */ PyAPI_FUNC(PyObject *) PyBool_FromLong(long); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_BOOLOBJECT_H */ diff --git a/third_party/python/Include/bytearrayobject.h b/third_party/python/Include/bytearrayobject.h index a757b8805..08b484a2b 100644 --- a/third_party/python/Include/bytearrayobject.h +++ b/third_party/python/Include/bytearrayobject.h @@ -1,12 +1,7 @@ -/* ByteArray object interface */ - #ifndef Py_BYTEARRAYOBJECT_H #define Py_BYTEARRAYOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - -#include +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Type PyByteArrayObject represents a mutable array of bytes. * The Python API is that of a sequence; @@ -56,7 +51,5 @@ PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); PyAPI_DATA(char) _PyByteArray_empty_string[]; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/third_party/python/Include/bytes_methods.h b/third_party/python/Include/bytes_methods.h index 7fa7540c3..7dc173ea3 100644 --- a/third_party/python/Include/bytes_methods.h +++ b/third_party/python/Include/bytes_methods.h @@ -1,6 +1,7 @@ #ifndef Py_LIMITED_API #ifndef Py_BYTES_CTYPE_H #define Py_BYTES_CTYPE_H +/* clang-format off */ /* * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) diff --git a/third_party/python/Include/bytesobject.h b/third_party/python/Include/bytesobject.h index 0f0bf9f36..ab789bc51 100644 --- a/third_party/python/Include/bytesobject.h +++ b/third_party/python/Include/bytesobject.h @@ -1,13 +1,7 @@ - -/* Bytes (String) object interface */ - #ifndef Py_BYTESOBJECT_H #define Py_BYTESOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - -#include +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Type PyBytesObject represents a character string. An extra zero byte is @@ -218,7 +212,5 @@ PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, Py_ssize_t size); #endif /* Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_BYTESOBJECT_H */ diff --git a/third_party/python/Include/cellobject.h b/third_party/python/Include/cellobject.h index a0aa4d947..73ab55afd 100644 --- a/third_party/python/Include/cellobject.h +++ b/third_party/python/Include/cellobject.h @@ -1,10 +1,8 @@ -/* Cell object interface */ #ifndef Py_LIMITED_API #ifndef Py_CELLOBJECT_H #define Py_CELLOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct { PyObject_HEAD @@ -22,8 +20,6 @@ PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); #define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) #define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_TUPLEOBJECT_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/ceval.h b/third_party/python/Include/ceval.h index f46aef180..c949b817f 100644 --- a/third_party/python/Include/ceval.h +++ b/third_party/python/Include/ceval.h @@ -1,9 +1,7 @@ #ifndef Py_CEVAL_H #define Py_CEVAL_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Interface to random parts in ceval.c */ @@ -232,7 +230,5 @@ PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); #define FVS_MASK 0x4 #define FVS_HAVE_SPEC 0x4 -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_CEVAL_H */ diff --git a/third_party/python/Include/classobject.h b/third_party/python/Include/classobject.h index eeeb3e95a..50705a214 100644 --- a/third_party/python/Include/classobject.h +++ b/third_party/python/Include/classobject.h @@ -1,13 +1,8 @@ -/* Former class object interface -- now only bound methods are here */ - -/* Revealing some structures (not for general use) */ - #ifndef Py_LIMITED_API #ifndef Py_CLASSOBJECT_H #define Py_CLASSOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct { PyObject_HEAD @@ -51,8 +46,6 @@ PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); #define PyInstanceMethod_GET_FUNCTION(meth) \ (((PyInstanceMethodObject *)meth) -> func) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_CLASSOBJECT_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/code.h b/third_party/python/Include/code.h index c5fce3c96..511c73b5d 100644 --- a/third_party/python/Include/code.h +++ b/third_party/python/Include/code.h @@ -1,11 +1,8 @@ -/* Definitions for bytecode */ - #ifndef Py_LIMITED_API #ifndef Py_CODE_H #define Py_CODE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef uint16_t _Py_CODEUNIT; @@ -150,8 +147,6 @@ PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_CODE_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/codecs.h b/third_party/python/Include/codecs.h index 3ad0f2b5a..6619b734b 100644 --- a/third_party/python/Include/codecs.h +++ b/third_party/python/Include/codecs.h @@ -1,8 +1,7 @@ #ifndef Py_CODECREGISTRY_H #define Py_CODECREGISTRY_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* ------------------------------------------------------------------------ @@ -234,7 +233,5 @@ PyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc); PyAPI_DATA(const char *) Py_hexdigits; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_CODECREGISTRY_H */ diff --git a/third_party/python/Include/compile.h b/third_party/python/Include/compile.h index ecd8dc1d1..6a76013c0 100644 --- a/third_party/python/Include/compile.h +++ b/third_party/python/Include/compile.h @@ -1,12 +1,14 @@ #ifndef Py_COMPILE_H #define Py_COMPILE_H +#include "third_party/python/Include/code.h" +COSMOPOLITAN_C_START_ + +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 #ifndef Py_LIMITED_API -#include "code.h" - -#ifdef __cplusplus -extern "C" { -#endif +/* clang-format off */ /* Public interface */ struct _node; /* Declare the existence of this type */ @@ -58,16 +60,6 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); #define PY_INVALID_STACK_EFFECT INT_MAX PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); -#ifdef __cplusplus -} -#endif - #endif /* !Py_LIMITED_API */ - -/* These definitions must match corresponding definitions in graminit.h. - There's code in compile.c that checks that they are the same. */ -#define Py_single_input 256 -#define Py_file_input 257 -#define Py_eval_input 258 - +COSMOPOLITAN_C_END_ #endif /* !Py_COMPILE_H */ diff --git a/third_party/python/Include/complexobject.h b/third_party/python/Include/complexobject.h index cb8c52c58..0377f9899 100644 --- a/third_party/python/Include/complexobject.h +++ b/third_party/python/Include/complexobject.h @@ -1,10 +1,7 @@ -/* Complex number structure */ - #ifndef Py_COMPLEXOBJECT_H #define Py_COMPLEXOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API typedef struct { @@ -63,7 +60,5 @@ PyAPI_FUNC(int) _PyComplex_FormatAdvancedWriter( Py_ssize_t end); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_COMPLEXOBJECT_H */ diff --git a/third_party/python/Include/datetime.h b/third_party/python/Include/datetime.h index 3bf35cbb7..297cbcdd0 100644 --- a/third_party/python/Include/datetime.h +++ b/third_party/python/Include/datetime.h @@ -1,11 +1,8 @@ -/* datetime.h - */ #ifndef Py_LIMITED_API #ifndef DATETIME_H #define DATETIME_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Fields are packed into successive bytes, each viewed as unsigned and * big-endian, unless otherwise noted: @@ -253,8 +250,6 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; #endif /* Py_BUILD_CORE */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif #endif /* !Py_LIMITED_API */ diff --git a/third_party/python/Include/descrobject.h b/third_party/python/Include/descrobject.h index 8f3e84c36..52e5cc016 100644 --- a/third_party/python/Include/descrobject.h +++ b/third_party/python/Include/descrobject.h @@ -1,9 +1,7 @@ -/* Descriptors */ #ifndef Py_DESCROBJECT_H #define Py_DESCROBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef PyObject *(*getter)(PyObject *, void *); typedef int (*setter)(PyObject *, PyObject *, void *); @@ -100,8 +98,6 @@ PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); PyAPI_DATA(PyTypeObject) PyProperty_Type; -#ifdef __cplusplus -} -#endif -#endif /* !Py_DESCROBJECT_H */ +COSMOPOLITAN_C_END_ +#endif /* !Py_DESCROBJECT_H */ diff --git a/third_party/python/Include/dictobject.h b/third_party/python/Include/dictobject.h index c4f2e2f5b..f7da9da57 100644 --- a/third_party/python/Include/dictobject.h +++ b/third_party/python/Include/dictobject.h @@ -1,9 +1,7 @@ #ifndef Py_DICTOBJECT_H #define Py_DICTOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Dictionary object type -- mapping from hashable object to object */ @@ -171,7 +169,5 @@ int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_DICTOBJECT_H */ diff --git a/third_party/python/Include/dtoa.h b/third_party/python/Include/dtoa.h index 9bfb6251d..4646dc94c 100644 --- a/third_party/python/Include/dtoa.h +++ b/third_party/python/Include/dtoa.h @@ -1,8 +1,7 @@ #ifndef Py_LIMITED_API #ifndef PY_NO_SHORT_FLOAT_REPR -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, @@ -11,9 +10,6 @@ PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); PyAPI_FUNC(double) _Py_dg_stdnan(int sign); PyAPI_FUNC(double) _Py_dg_infinity(int sign); - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif #endif diff --git a/third_party/python/Include/dynamic_annotations.h b/third_party/python/Include/dynamic_annotations.h index 0bd1a833c..67ba5f2d0 100644 --- a/third_party/python/Include/dynamic_annotations.h +++ b/third_party/python/Include/dynamic_annotations.h @@ -1,3 +1,5 @@ +/* clang-format off */ + /* Copyright (c) 2008-2009, Google Inc. * All rights reserved. * @@ -369,9 +371,7 @@ #endif /* DYNAMIC_ANNOTATIONS_ENABLED */ /* Use the macros above rather than using these functions directly. */ -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ void AnnotateRWLockCreate(const char *file, int line, const volatile void *lock); void AnnotateRWLockDestroy(const char *file, int line, @@ -455,9 +455,7 @@ void AnnotateFlushState(const char *file, int line); */ int RunningOnValgrind(void); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus) diff --git a/third_party/python/Include/enumobject.h b/third_party/python/Include/enumobject.h index c14dbfc8c..ededaea41 100644 --- a/third_party/python/Include/enumobject.h +++ b/third_party/python/Include/enumobject.h @@ -1,17 +1,10 @@ #ifndef Py_ENUMOBJECT_H #define Py_ENUMOBJECT_H - -/* Enumerate Object */ - -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_DATA(PyTypeObject) PyEnum_Type; PyAPI_DATA(PyTypeObject) PyReversed_Type; -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_ENUMOBJECT_H */ diff --git a/third_party/python/Include/errcode.h b/third_party/python/Include/errcode.h index 5946686c6..4894688a6 100644 --- a/third_party/python/Include/errcode.h +++ b/third_party/python/Include/errcode.h @@ -1,8 +1,7 @@ #ifndef Py_ERRCODE_H #define Py_ERRCODE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Error codes passed around between file input, tokenizer, parser and @@ -32,7 +31,5 @@ extern "C" { #define E_IDENTIFIER 26 /* Invalid characters in identifier */ #define E_BADSINGLE 27 /* Ill-formed single statement input */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_ERRCODE_H */ diff --git a/third_party/python/Include/eval.h b/third_party/python/Include/eval.h index a1c6e817d..65c1ccac7 100644 --- a/third_party/python/Include/eval.h +++ b/third_party/python/Include/eval.h @@ -1,11 +1,7 @@ - -/* Interface to execute compiled code */ - #ifndef Py_EVAL_H #define Py_EVAL_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyObject *, PyObject *, PyObject *); @@ -21,7 +17,5 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_EVAL_H */ diff --git a/third_party/python/Include/fileobject.h b/third_party/python/Include/fileobject.h index 1dde17e1e..2056b02dc 100644 --- a/third_party/python/Include/fileobject.h +++ b/third_party/python/Include/fileobject.h @@ -1,10 +1,7 @@ -/* File object interface (what's left of it -- see io.py) */ - #ifndef Py_FILEOBJECT_H #define Py_FILEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #define PY_STDIOTEXTMODE "b" @@ -44,7 +41,5 @@ PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; #define _PyIsSelectable_fd(FD) (1) #endif /* HAVE_SELECT */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_FILEOBJECT_H */ diff --git a/third_party/python/Include/fileutils.h b/third_party/python/Include/fileutils.h index 4efcf1321..170711b8a 100644 --- a/third_party/python/Include/fileutils.h +++ b/third_party/python/Include/fileutils.h @@ -1,9 +1,7 @@ #ifndef Py_FILEUTILS_H #define Py_FILEUTILS_H - -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 PyAPI_FUNC(wchar_t *) Py_DecodeLocale( @@ -152,8 +150,5 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( #endif /* Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_FILEUTILS_H */ diff --git a/third_party/python/Include/floatobject.h b/third_party/python/Include/floatobject.h index f1044d64c..4c387204b 100644 --- a/third_party/python/Include/floatobject.h +++ b/third_party/python/Include/floatobject.h @@ -1,15 +1,7 @@ - -/* Float object interface */ - -/* -PyFloatObject represents a (double precision) floating point number. -*/ - #ifndef Py_FLOATOBJECT_H #define Py_FLOATOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API typedef struct { @@ -124,7 +116,5 @@ PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter( Py_ssize_t end); #endif /* Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_FLOATOBJECT_H */ diff --git a/third_party/python/Include/frameobject.h b/third_party/python/Include/frameobject.h index 00c50933d..25a83042f 100644 --- a/third_party/python/Include/frameobject.h +++ b/third_party/python/Include/frameobject.h @@ -1,12 +1,8 @@ - -/* Frame object interface */ - #ifndef Py_LIMITED_API #ifndef Py_FRAMEOBJECT_H #define Py_FRAMEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct { int b_type; /* what kind of block this is */ @@ -88,8 +84,6 @@ PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); /* Return the line of code the frame is currently executing. */ PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_FRAMEOBJECT_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/funcobject.h b/third_party/python/Include/funcobject.h index 77bb8c39a..bcca715e7 100644 --- a/third_party/python/Include/funcobject.h +++ b/third_party/python/Include/funcobject.h @@ -1,11 +1,8 @@ - -/* Function object interface */ #ifndef Py_LIMITED_API #ifndef Py_FUNCOBJECT_H #define Py_FUNCOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Function objects and code objects should not be confused with each other: * @@ -96,8 +93,6 @@ PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_FUNCOBJECT_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/genobject.h b/third_party/python/Include/genobject.h index 8c1825fc0..2b2b6e07c 100644 --- a/third_party/python/Include/genobject.h +++ b/third_party/python/Include/genobject.h @@ -1,12 +1,8 @@ - -/* Generator object interface */ - #ifndef Py_LIMITED_API #ifndef Py_GENOBJECT_H #define Py_GENOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ struct _frame; /* Avoid including frameobject.h */ @@ -97,8 +93,6 @@ int PyAsyncGen_ClearFreeLists(void); #undef _PyGenObject_HEAD -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_GENOBJECT_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/graminit.h b/third_party/python/Include/graminit.h index e9b4a9385..5afef6977 100644 --- a/third_party/python/Include/graminit.h +++ b/third_party/python/Include/graminit.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Generated by Parser/pgen */ #define single_input 256 diff --git a/third_party/python/Include/grammar.h b/third_party/python/Include/grammar.h index f775f9638..07057a852 100644 --- a/third_party/python/Include/grammar.h +++ b/third_party/python/Include/grammar.h @@ -1,13 +1,8 @@ - -/* Grammar interface */ - #ifndef Py_GRAMMAR_H #define Py_GRAMMAR_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "bitset.h" /* Sigh... */ +#include "third_party/python/Include/bitset.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ /* A label of an arc */ @@ -88,7 +83,5 @@ void PyGrammar_RemoveAccelerators(grammar *); void printgrammar(grammar *g, FILE *fp); void printnonterminals(grammar *g, FILE *fp); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_GRAMMAR_H */ diff --git a/third_party/python/Include/import.h b/third_party/python/Include/import.h index bb6beba67..58eff3e6e 100644 --- a/third_party/python/Include/import.h +++ b/third_party/python/Include/import.h @@ -1,11 +1,7 @@ - -/* Module definition and import interface */ - #ifndef Py_IMPORT_H #define Py_IMPORT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_FUNC(void) _PyImportZip_Init(void); @@ -134,7 +130,5 @@ struct _frozen { PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_IMPORT_H */ diff --git a/third_party/python/Include/intrcheck.h b/third_party/python/Include/intrcheck.h index 8fb96cf9a..48cab065d 100644 --- a/third_party/python/Include/intrcheck.h +++ b/third_party/python/Include/intrcheck.h @@ -1,9 +1,7 @@ - #ifndef Py_INTRCHECK_H #define Py_INTRCHECK_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(int) PyOS_InterruptOccurred(void); PyAPI_FUNC(void) PyOS_InitInterrupts(void); @@ -18,7 +16,5 @@ PyAPI_FUNC(void*) _PyOS_SigintEvent(void); #endif #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_INTRCHECK_H */ diff --git a/third_party/python/Include/iterobject.h b/third_party/python/Include/iterobject.h index f61726f1f..d082448c2 100644 --- a/third_party/python/Include/iterobject.h +++ b/third_party/python/Include/iterobject.h @@ -1,9 +1,7 @@ #ifndef Py_ITEROBJECT_H #define Py_ITEROBJECT_H -/* Iterators (the basic kind, over a sequence) */ -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; @@ -18,8 +16,6 @@ PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_ITEROBJECT_H */ diff --git a/third_party/python/Include/listobject.h b/third_party/python/Include/listobject.h index 31843b5db..4708aee4c 100644 --- a/third_party/python/Include/listobject.h +++ b/third_party/python/Include/listobject.h @@ -1,7 +1,10 @@ +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +COSMOPOLITAN_C_START_ +/* clang-format off */ -/* List object interface */ +/* List object interface -/* Another generally useful object type is a list of object pointers. This is a mutable type: the list items can be changed, and items can be added or removed. Out-of-range indices or non-list objects are ignored. @@ -13,11 +16,6 @@ inserted in the list. Similarly, PyList_GetItem does not increment the returned item's reference count. */ -#ifndef Py_LISTOBJECT_H -#define Py_LISTOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif #ifndef Py_LIMITED_API typedef struct { @@ -75,7 +73,5 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); #define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_LISTOBJECT_H */ diff --git a/third_party/python/Include/longintrepr.h b/third_party/python/Include/longintrepr.h index a3b74b4f6..5e8fa3a52 100644 --- a/third_party/python/Include/longintrepr.h +++ b/third_party/python/Include/longintrepr.h @@ -1,10 +1,10 @@ #ifndef Py_LIMITED_API #ifndef Py_LONGINTREPR_H #define Py_LONGINTREPR_H -#ifdef __cplusplus -extern "C" { -#endif - +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pyport.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ /* This is published for the benefit of "friends" marshal.c and _decimal.c. */ @@ -92,8 +92,6 @@ PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); /* Return a copy of src. */ PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_LONGINTREPR_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/longobject.h b/third_party/python/Include/longobject.h index efd409c75..c0dac0121 100644 --- a/third_party/python/Include/longobject.h +++ b/third_party/python/Include/longobject.h @@ -1,9 +1,7 @@ #ifndef Py_LONGOBJECT_H #define Py_LONGOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Long (arbitrary precision) integer object interface */ @@ -209,7 +207,5 @@ PyAPI_FUNC(long) PyOS_strtol(const char *, char **, int); PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_LONGOBJECT_H */ diff --git a/third_party/python/Include/marshal.h b/third_party/python/Include/marshal.h index 09d9337e5..e282bca6c 100644 --- a/third_party/python/Include/marshal.h +++ b/third_party/python/Include/marshal.h @@ -1,11 +1,7 @@ - -/* Interface for marshal.c */ - #ifndef Py_MARSHAL_H #define Py_MARSHAL_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #define Py_MARSHAL_VERSION 4 @@ -19,10 +15,7 @@ PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); #endif -PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, - Py_ssize_t); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, Py_ssize_t); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_MARSHAL_H */ diff --git a/third_party/python/Include/memoryobject.h b/third_party/python/Include/memoryobject.h index 990a716f2..c0e2d47b1 100644 --- a/third_party/python/Include/memoryobject.h +++ b/third_party/python/Include/memoryobject.h @@ -1,10 +1,7 @@ -/* Memory view object. In Python this is available as "memoryview". */ - #ifndef Py_MEMORYOBJECT_H #define Py_MEMORYOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; @@ -66,7 +63,5 @@ typedef struct { } PyMemoryViewObject; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_MEMORYOBJECT_H */ diff --git a/third_party/python/Include/metagrammar.h b/third_party/python/Include/metagrammar.h index 15c8ef8f3..b36b5ef16 100644 --- a/third_party/python/Include/metagrammar.h +++ b/third_party/python/Include/metagrammar.h @@ -1,9 +1,7 @@ #ifndef Py_METAGRAMMAR_H #define Py_METAGRAMMAR_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ #define MSTART 256 #define RULE 257 @@ -12,7 +10,5 @@ extern "C" { #define ITEM 260 #define ATOM 261 -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_METAGRAMMAR_H */ diff --git a/third_party/python/Include/methodobject.h b/third_party/python/Include/methodobject.h index 79fad8235..db052dac5 100644 --- a/third_party/python/Include/methodobject.h +++ b/third_party/python/Include/methodobject.h @@ -1,11 +1,7 @@ - -/* Method object interface */ - #ifndef Py_METHODOBJECT_H #define Py_METHODOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* This is about the type 'builtin_function_or_method', not Python methods in user-defined classes. See classobject.h @@ -104,7 +100,5 @@ PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_METHODOBJECT_H */ diff --git a/third_party/python/Include/modsupport.h b/third_party/python/Include/modsupport.h index 46bf41ab2..be0165656 100644 --- a/third_party/python/Include/modsupport.h +++ b/third_party/python/Include/modsupport.h @@ -1,15 +1,8 @@ - #ifndef Py_MODSUPPORT_H #define Py_MODSUPPORT_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Module support interface */ - -#include - #pragma GCC diagnostic ignored "-Wredundant-decls" +COSMOPOLITAN_C_START_ +/* clang-format off */ /* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier to mean Py_ssize_t */ @@ -179,7 +172,5 @@ PyAPI_FUNC(PyObject *) PyModule_FromDefAndSpec2(PyModuleDef *def, PyAPI_DATA(char *) _Py_PackageContext; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_MODSUPPORT_H */ diff --git a/third_party/python/Include/moduleobject.h b/third_party/python/Include/moduleobject.h index b6e49333d..67dbc0d72 100644 --- a/third_party/python/Include/moduleobject.h +++ b/third_party/python/Include/moduleobject.h @@ -1,11 +1,7 @@ - -/* Module object interface */ - #ifndef Py_MODULEOBJECT_H #define Py_MODULEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_DATA(PyTypeObject) PyModule_Type; @@ -83,7 +79,5 @@ typedef struct PyModuleDef{ freefunc m_free; } PyModuleDef; -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_MODULEOBJECT_H */ diff --git a/third_party/python/Include/namespaceobject.h b/third_party/python/Include/namespaceobject.h index 0c8d95c0f..44d9270dc 100644 --- a/third_party/python/Include/namespaceobject.h +++ b/third_party/python/Include/namespaceobject.h @@ -1,11 +1,7 @@ - -/* simple namespace object interface */ - #ifndef NAMESPACEOBJECT_H #define NAMESPACEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_DATA(PyTypeObject) _PyNamespace_Type; @@ -13,7 +9,5 @@ PyAPI_DATA(PyTypeObject) _PyNamespace_Type; PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !NAMESPACEOBJECT_H */ diff --git a/third_party/python/Include/node.h b/third_party/python/Include/node.h index 654ad8582..7b9a844a3 100644 --- a/third_party/python/Include/node.h +++ b/third_party/python/Include/node.h @@ -1,11 +1,7 @@ - -/* Parse tree node interface */ - #ifndef Py_NODE_H #define Py_NODE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct _node { short n_type; @@ -38,7 +34,5 @@ PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); PyAPI_FUNC(void) PyNode_ListTree(node *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_NODE_H */ diff --git a/third_party/python/Include/object.h b/third_party/python/Include/object.h index deac94097..d46d2aa19 100644 --- a/third_party/python/Include/object.h +++ b/third_party/python/Include/object.h @@ -1,9 +1,7 @@ #ifndef Py_OBJECT_H #define Py_OBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Object and type object interface */ @@ -1072,7 +1070,5 @@ PyAPI_FUNC(void) _PyObject_DebugTypeStats(FILE *out); #endif /* ifndef Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_OBJECT_H */ diff --git a/third_party/python/Include/objimpl.h b/third_party/python/Include/objimpl.h index e7a3696d7..375a82353 100644 --- a/third_party/python/Include/objimpl.h +++ b/third_party/python/Include/objimpl.h @@ -1,15 +1,8 @@ -/* The PyObject_ memory family: high-level object memory interfaces. - See pymem.h for the low-level PyMem_ family. -*/ - #ifndef Py_OBJIMPL_H #define Py_OBJIMPL_H - -#include "pymem.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "third_party/python/Include/pymem.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ /* BEWARE: @@ -364,7 +357,5 @@ PyAPI_FUNC(void) PyObject_GC_Del(void *); #define PyObject_GET_WEAKREFS_LISTPTR(o) \ ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_OBJIMPL_H */ diff --git a/third_party/python/Include/odictobject.h b/third_party/python/Include/odictobject.h index 692194dae..7accf3461 100644 --- a/third_party/python/Include/odictobject.h +++ b/third_party/python/Include/odictobject.h @@ -1,9 +1,7 @@ #ifndef Py_ODICTOBJECT_H #define Py_ODICTOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* OrderedDict */ /* This API is optional and mostly redundant. */ @@ -37,7 +35,5 @@ PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_ODICTOBJECT_H */ diff --git a/third_party/python/Include/opcode.h b/third_party/python/Include/opcode.h index be360e101..edc4b82e3 100644 --- a/third_party/python/Include/opcode.h +++ b/third_party/python/Include/opcode.h @@ -1,12 +1,10 @@ -/* Auto-generated by Tools/scripts/generate_opcode_h.py */ #ifndef Py_OPCODE_H #define Py_OPCODE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ +/* Auto-generated by Tools/scripts/generate_opcode_h.py */ - - /* Instruction opcodes for compiled code */ +/* Instruction opcodes for compiled code */ #define POP_TOP 1 #define ROT_TWO 2 #define ROT_THREE 3 @@ -140,7 +138,5 @@ enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_OPCODE_H */ diff --git a/third_party/python/Include/osdefs.h b/third_party/python/Include/osdefs.h index bd84c1c12..dc71b732c 100644 --- a/third_party/python/Include/osdefs.h +++ b/third_party/python/Include/osdefs.h @@ -1,9 +1,7 @@ #ifndef Py_OSDEFS_H #define Py_OSDEFS_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Operating system dependencies */ @@ -19,15 +17,6 @@ extern "C" { #define SEP L'/' #endif -/* Max pathname length */ -#ifdef __hpux -#include -#include -#ifndef PATH_MAX -#define PATH_MAX MAXPATHLEN -#endif -#endif - #ifndef MAXPATHLEN #if defined(PATH_MAX) && PATH_MAX > 1024 #define MAXPATHLEN PATH_MAX @@ -41,7 +30,5 @@ extern "C" { #define DELIM L':' #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_OSDEFS_H */ diff --git a/third_party/python/Include/osmodule.h b/third_party/python/Include/osmodule.h index 9095c2fdd..1be0db89d 100644 --- a/third_party/python/Include/osmodule.h +++ b/third_party/python/Include/osmodule.h @@ -1,17 +1,11 @@ - -/* os module interface */ - #ifndef Py_OSMODULE_H #define Py_OSMODULE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 PyAPI_FUNC(PyObject *) PyOS_FSPath(PyObject *path); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_OSMODULE_H */ diff --git a/third_party/python/Include/parsetok.h b/third_party/python/Include/parsetok.h index 2acb85467..09d230191 100644 --- a/third_party/python/Include/parsetok.h +++ b/third_party/python/Include/parsetok.h @@ -1,11 +1,8 @@ - -/* Parser-tokenizer link interface */ #ifndef Py_LIMITED_API #ifndef Py_PARSETOK_H #define Py_PARSETOK_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct { int error; @@ -101,8 +98,6 @@ PyAPI_FUNC(node *) PyParser_ParseStringObject( PyAPI_FUNC(void) PyParser_SetError(perrdetail *); PyAPI_FUNC(void) PyParser_ClearError(perrdetail *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PARSETOK_H */ #endif /* !Py_LIMITED_API */ diff --git a/third_party/python/Include/patchlevel.h b/third_party/python/Include/patchlevel.h index 5af2de3bc..2311758aa 100644 --- a/third_party/python/Include/patchlevel.h +++ b/third_party/python/Include/patchlevel.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Python version identification scheme. diff --git a/third_party/python/Include/pgen.h b/third_party/python/Include/pgen.h index 8a325ed07..b24f0406d 100644 --- a/third_party/python/Include/pgen.h +++ b/third_party/python/Include/pgen.h @@ -1,9 +1,7 @@ #ifndef Py_PGEN_H #define Py_PGEN_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Parser generator interface */ @@ -12,7 +10,5 @@ extern grammar *meta_grammar(void); struct _node; extern grammar *pgen(struct _node *); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PGEN_H */ diff --git a/third_party/python/Include/pgenheaders.h b/third_party/python/Include/pgenheaders.h index 4843de6c0..00e14b1f9 100644 --- a/third_party/python/Include/pgenheaders.h +++ b/third_party/python/Include/pgenheaders.h @@ -1,13 +1,8 @@ #ifndef Py_PGENHEADERS_H #define Py_PGENHEADERS_H -#ifdef __cplusplus -extern "C" { -#endif - - -/* Include files and extern declarations used by most of the parser. */ - -#include "Python.h" +#include "third_party/python/Include/Python.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 1, 2))); @@ -37,7 +32,5 @@ PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) #define tok_dump _Py_tok_dump #define translatelabels _Py_translatelabels -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PGENHEADERS_H */ diff --git a/third_party/python/Include/py_curses.h b/third_party/python/Include/py_curses.h index b09dde480..0eeb78d56 100644 --- a/third_party/python/Include/py_curses.h +++ b/third_party/python/Include/py_curses.h @@ -1,43 +1,6 @@ - #ifndef Py_CURSES_H #define Py_CURSES_H - -#ifdef __APPLE__ -/* -** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards -** against multiple definition of wchar_t. -*/ -#ifdef _BSD_WCHAR_T_DEFINED_ -#define _WCHAR_T -#endif -#endif /* __APPLE__ */ - -#ifdef __FreeBSD__ -/* -** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards -** against multiple definition of wchar_t and wint_t. -*/ -#ifdef _XOPEN_SOURCE_EXTENDED -#ifndef __FreeBSD_version -#include -#endif -#if __FreeBSD_version >= 500000 -#ifndef __wchar_t -#define __wchar_t -#endif -#ifndef __wint_t -#define __wint_t -#endif -#else -#ifndef _WCHAR_T -#define _WCHAR_T -#endif -#ifndef _WINT_T -#define _WINT_T -#endif -#endif -#endif -#endif +/* clang-format off */ #if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS) /* The following definition is necessary for ncurses 5.7; without it, @@ -46,12 +9,6 @@ #define NCURSES_OPAQUE 0 #endif -#ifdef HAVE_NCURSES_H -#include -#else -#include -#endif - #ifdef HAVE_NCURSES_H /* configure was checking , but we will use , which has some or all these features. */ @@ -66,9 +23,7 @@ #endif #endif -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ #define PyCurses_API_pointers 4 @@ -169,10 +124,5 @@ static PyObject *PyCurses_ ## X (PyObject *self) \ Py_INCREF(Py_None); \ return Py_None; } -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !defined(Py_CURSES_H) */ - - diff --git a/third_party/python/Include/pyarena.h b/third_party/python/Include/pyarena.h index db3ad0188..a31571198 100644 --- a/third_party/python/Include/pyarena.h +++ b/third_party/python/Include/pyarena.h @@ -1,64 +1,56 @@ -/* An arena-like memory interface for the compiler. - */ - #ifndef Py_LIMITED_API #ifndef Py_PYARENA_H #define Py_PYARENA_H +COSMOPOLITAN_C_START_ +/* clang-format off */ -#ifdef __cplusplus -extern "C" { -#endif +typedef struct _arena PyArena; - typedef struct _arena PyArena; +/* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) - /* PyArena_New() and PyArena_Free() create a new arena and free it, - respectively. Once an arena has been created, it can be used - to allocate memory via PyArena_Malloc(). Pointers to PyObject can - also be registered with the arena via PyArena_AddPyObject(), and the - arena will ensure that the PyObjects stay alive at least until - PyArena_Free() is called. When an arena is freed, all the memory it - allocated is freed, the arena releases internal references to registered - PyObject*, and none of its pointers are valid. - XXX (tim) What does "none of its pointers are valid" mean? Does it - XXX mean that pointers previously obtained via PyArena_Malloc() are - XXX no longer valid? (That's clearly true, but not sure that's what - XXX the text is trying to say.) + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). +*/ +PyAPI_FUNC(PyArena *) PyArena_New(void); +PyAPI_FUNC(void) PyArena_Free(PyArena *); - PyArena_New() returns an arena pointer. On error, it - returns a negative number and sets an exception. - XXX (tim): Not true. On error, PyArena_New() actually returns NULL, - XXX and looks like it may or may not set an exception (e.g., if the - XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on - XXX and an exception is set; OTOH, if the internal - XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but - XXX an exception is not set in that case). - */ - PyAPI_FUNC(PyArena *) PyArena_New(void); - PyAPI_FUNC(void) PyArena_Free(PyArena *); +/* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ +PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); - /* Mostly like malloc(), return the address of a block of memory spanning - * `size` bytes, or return NULL (without setting an exception) if enough - * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with - * size=0 does not guarantee to return a unique pointer (the pointer - * returned may equal one or more other pointers obtained from - * PyArena_Malloc()). - * Note that pointers obtained via PyArena_Malloc() must never be passed to - * the system free() or realloc(), or to any of Python's similar memory- - * management functions. PyArena_Malloc()-obtained pointers remain valid - * until PyArena_Free(ar) is called, at which point all pointers obtained - * from the arena `ar` become invalid simultaneously. - */ - PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); - - /* This routine isn't a proper arena allocation routine. It takes - * a PyObject* and records it so that it can be DECREFed when the - * arena is freed. - */ - PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); - -#ifdef __cplusplus -} -#endif +/* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ +PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); +COSMOPOLITAN_C_END_ #endif /* !Py_PYARENA_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/pyatomic.h b/third_party/python/Include/pyatomic.h index 893d30d2e..cc298b909 100644 --- a/third_party/python/Include/pyatomic.h +++ b/third_party/python/Include/pyatomic.h @@ -1,14 +1,9 @@ #ifndef Py_ATOMIC_H #define Py_ATOMIC_H #ifdef Py_BUILD_CORE - -#include "dynamic_annotations.h" - -#include "pyconfig.h" - -#if defined(HAVE_STD_ATOMIC) -#include -#endif +#include "third_party/python/Include/dynamic_annotations.h" +#include "third_party/python/pyconfig.h" +/* clang-format off */ /* This is modeled after the atomics interface from C1x, according to * the draft at diff --git a/third_party/python/Include/pycapsule.h b/third_party/python/Include/pycapsule.h index d9ecda7a4..e11f0097a 100644 --- a/third_party/python/Include/pycapsule.h +++ b/third_party/python/Include/pycapsule.h @@ -1,3 +1,7 @@ +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Capsule objects let you wrap a C "void *" pointer in a Python object. They're a way of passing data through the Python interpreter @@ -12,12 +16,6 @@ documentation. */ -#ifndef Py_CAPSULE_H -#define Py_CAPSULE_H -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_DATA(PyTypeObject) PyCapsule_Type; typedef void (*PyCapsule_Destructor)(PyObject *); @@ -52,8 +50,5 @@ PyAPI_FUNC(void *) PyCapsule_Import( const char *name, /* UTF-8 encoded string */ int no_block); - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_CAPSULE_H */ diff --git a/third_party/python/Include/pyctype.h b/third_party/python/Include/pyctype.h index 6bce63eeb..08bfb3b5a 100644 --- a/third_party/python/Include/pyctype.h +++ b/third_party/python/Include/pyctype.h @@ -1,6 +1,7 @@ #ifndef Py_LIMITED_API #ifndef PYCTYPE_H #define PYCTYPE_H +/* clang-format off */ #define PY_CTF_LOWER 0x01 #define PY_CTF_UPPER 0x02 diff --git a/third_party/python/Include/pydebug.h b/third_party/python/Include/pydebug.h index 6e23a896c..21a0113e6 100644 --- a/third_party/python/Include/pydebug.h +++ b/third_party/python/Include/pydebug.h @@ -1,9 +1,8 @@ #ifndef Py_LIMITED_API #ifndef Py_PYDEBUG_H #define Py_PYDEBUG_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* These global variable are defined in pylifecycle.c */ /* XXX (ncoghlan): move these declarations to pylifecycle.h? */ @@ -33,8 +32,6 @@ PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; PYTHONPATH and PYTHONHOME from the environment */ #define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYDEBUG_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/pydtrace.d b/third_party/python/Include/pydtrace.d deleted file mode 100644 index 883605566..000000000 --- a/third_party/python/Include/pydtrace.d +++ /dev/null @@ -1,19 +0,0 @@ -/* Python DTrace provider */ - -provider python { - probe function__entry(const char *, const char *, int); - probe function__return(const char *, const char *, int); - probe instance__new__start(const char *, const char *); - probe instance__new__done(const char *, const char *); - probe instance__delete__start(const char *, const char *); - probe instance__delete__done(const char *, const char *); - probe line(const char *, const char *, int); - probe gc__start(int); - probe gc__done(long); -}; - -#pragma D attributes Evolving/Evolving/Common provider python provider -#pragma D attributes Evolving/Evolving/Common provider python module -#pragma D attributes Evolving/Evolving/Common provider python function -#pragma D attributes Evolving/Evolving/Common provider python name -#pragma D attributes Evolving/Evolving/Common provider python args diff --git a/third_party/python/Include/pydtrace.h b/third_party/python/Include/pydtrace.h index c43a253d3..2c0103172 100644 --- a/third_party/python/Include/pydtrace.h +++ b/third_party/python/Include/pydtrace.h @@ -1,13 +1,8 @@ -/* Static DTrace probes interface */ - #ifndef Py_DTRACE_H #define Py_DTRACE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ #ifdef WITH_DTRACE - #include "pydtrace_probes.h" /* pydtrace_probes.h, on systems with DTrace, is auto-generated to include @@ -25,29 +20,56 @@ extern "C" { /* Without DTrace, compile to nothing. */ -static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) {} -static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} -static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} -static inline void PyDTrace_GC_START(int arg0) {} -static inline void PyDTrace_GC_DONE(int arg0) {} -static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} -static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} -static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} -static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} +static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) { +} +static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, + int arg2) { +} +static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, + int arg2) { +} +static inline void PyDTrace_GC_START(int arg0) { +} +static inline void PyDTrace_GC_DONE(int arg0) { +} +static inline void PyDTrace_INSTANCE_NEW_START(int arg0) { +} +static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) { +} +static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) { +} +static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) { +} -static inline int PyDTrace_LINE_ENABLED(void) { return 0; } -static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } -static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; } -static inline int PyDTrace_GC_START_ENABLED(void) { return 0; } -static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; } -static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; } -static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; } -static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } -static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_LINE_ENABLED(void) { + return 0; +} +static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { + return 0; +} +static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { + return 0; +} +static inline int PyDTrace_GC_START_ENABLED(void) { + return 0; +} +static inline int PyDTrace_GC_DONE_ENABLED(void) { + return 0; +} +static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { + return 0; +} +static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { + return 0; +} +static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { + return 0; +} +static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { + return 0; +} #endif /* !WITH_DTRACE */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_DTRACE_H */ diff --git a/third_party/python/Include/pyerrors.h b/third_party/python/Include/pyerrors.h index 44f20303c..97891db16 100644 --- a/third_party/python/Include/pyerrors.h +++ b/third_party/python/Include/pyerrors.h @@ -1,10 +1,7 @@ #ifndef Py_ERRORS_H #define Py_ERRORS_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Error objects */ +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API /* PyException_HEAD defines the initial segment of every exception class. */ @@ -491,13 +488,10 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( # define vsnprintf _vsnprintf #endif -#include PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 3, 4))); PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) Py_GCC_ATTRIBUTE((format(printf, 3, 0))); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_ERRORS_H */ diff --git a/third_party/python/Include/pyexpat.h b/third_party/python/Include/pyexpat.h index 07020b5dc..8694275f2 100644 --- a/third_party/python/Include/pyexpat.h +++ b/third_party/python/Include/pyexpat.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Stuff to export relevant 'expat' entry points from pyexpat to other * parser modules, such as cElementTree. */ diff --git a/third_party/python/Include/pyfpe.h b/third_party/python/Include/pyfpe.h index f9a15e622..6bd2dbfe9 100644 --- a/third_party/python/Include/pyfpe.h +++ b/third_party/python/Include/pyfpe.h @@ -1,176 +1,21 @@ #ifndef Py_PYFPE_H #define Py_PYFPE_H -#ifdef __cplusplus -extern "C" { -#endif -/* - --------------------------------------------------------------------- - / Copyright (c) 1996. \ - | The Regents of the University of California. | - | All rights reserved. | - | | - | Permission to use, copy, modify, and distribute this software for | - | any purpose without fee is hereby granted, provided that this en- | - | tire notice is included in all copies of any software which is or | - | includes a copy or modification of this software and in all | - | copies of the supporting documentation for such software. | - | | - | This work was produced at the University of California, Lawrence | - | Livermore National Laboratory under contract no. W-7405-ENG-48 | - | between the U.S. Department of Energy and The Regents of the | - | University of California for the operation of UC LLNL. | - | | - | DISCLAIMER | - | | - | This software was prepared as an account of work sponsored by an | - | agency of the United States Government. Neither the United States | - | Government nor the University of California nor any of their em- | - | ployees, makes any warranty, express or implied, or assumes any | - | liability or responsibility for the accuracy, completeness, or | - | usefulness of any information, apparatus, product, or process | - | disclosed, or represents that its use would not infringe | - | privately-owned rights. Reference herein to any specific commer- | - | cial products, process, or service by trade name, trademark, | - | manufacturer, or otherwise, does not necessarily constitute or | - | imply its endorsement, recommendation, or favoring by the United | - | States Government or the University of California. The views and | - | opinions of authors expressed herein do not necessarily state or | - | reflect those of the United States Government or the University | - | of California, and shall not be used for advertising or product | - \ endorsement purposes. / - --------------------------------------------------------------------- -*/ - -/* - * Define macros for handling SIGFPE. - * Lee Busby, LLNL, November, 1996 - * busby1@llnl.gov - * - ********************************************* - * Overview of the system for handling SIGFPE: - * - * This file (Include/pyfpe.h) defines a couple of "wrapper" macros for - * insertion into your Python C code of choice. Their proper use is - * discussed below. The file Python/pyfpe.c defines a pair of global - * variables PyFPE_jbuf and PyFPE_counter which are used by the signal - * handler for SIGFPE to decide if a particular exception was protected - * by the macros. The signal handler itself, and code for enabling the - * generation of SIGFPE in the first place, is in a (new) Python module - * named fpectl. This module is standard in every respect. It can be loaded - * either statically or dynamically as you choose, and like any other - * Python module, has no effect until you import it. - * - * In the general case, there are three steps toward handling SIGFPE in any - * Python code: - * - * 1) Add the *_PROTECT macros to your C code as required to protect - * dangerous floating point sections. - * - * 2) Turn on the inclusion of the code by adding the ``--with-fpectl'' - * flag at the time you run configure. If the fpectl or other modules - * which use the *_PROTECT macros are to be dynamically loaded, be - * sure they are compiled with WANT_SIGFPE_HANDLER defined. - * - * 3) When python is built and running, import fpectl, and execute - * fpectl.turnon_sigfpe(). This sets up the signal handler and enables - * generation of SIGFPE whenever an exception occurs. From this point - * on, any properly trapped SIGFPE should result in the Python - * FloatingPointError exception. - * - * Step 1 has been done already for the Python kernel code, and should be - * done soon for the NumPy array package. Step 2 is usually done once at - * python install time. Python's behavior with respect to SIGFPE is not - * changed unless you also do step 3. Thus you can control this new - * facility at compile time, or run time, or both. - * - ******************************** - * Using the macros in your code: - * - * static PyObject *foobar(PyObject *self,PyObject *args) - * { - * .... - * PyFPE_START_PROTECT("Error in foobar", return 0) - * result = dangerous_op(somearg1, somearg2, ...); - * PyFPE_END_PROTECT(result) - * .... - * } - * - * If a floating point error occurs in dangerous_op, foobar returns 0 (NULL), - * after setting the associated value of the FloatingPointError exception to - * "Error in foobar". ``Dangerous_op'' can be a single operation, or a block - * of code, function calls, or any combination, so long as no alternate - * return is possible before the PyFPE_END_PROTECT macro is reached. - * - * The macros can only be used in a function context where an error return - * can be recognized as signaling a Python exception. (Generally, most - * functions that return a PyObject * will qualify.) - * - * Guido's original design suggestion for PyFPE_START_PROTECT and - * PyFPE_END_PROTECT had them open and close a local block, with a locally - * defined jmp_buf and jmp_buf pointer. This would allow recursive nesting - * of the macros. The Ansi C standard makes it clear that such local - * variables need to be declared with the "volatile" type qualifier to keep - * setjmp from corrupting their values. Some current implementations seem - * to be more restrictive. For example, the HPUX man page for setjmp says - * - * Upon the return from a setjmp() call caused by a longjmp(), the - * values of any non-static local variables belonging to the routine - * from which setjmp() was called are undefined. Code which depends on - * such values is not guaranteed to be portable. - * - * I therefore decided on a more limited form of nesting, using a counter - * variable (PyFPE_counter) to keep track of any recursion. If an exception - * occurs in an ``inner'' pair of macros, the return will apparently - * come from the outermost level. - * - */ - +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifdef WANT_SIGFPE_HANDLER -#include -#include -#include extern jmp_buf PyFPE_jbuf; extern int PyFPE_counter; extern double PyFPE_dummy(void *); - #define PyFPE_START_PROTECT(err_string, leave_stmt) \ if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \ PyErr_SetString(PyExc_FloatingPointError, err_string); \ PyFPE_counter = 0; \ leave_stmt; \ } - -/* - * This (following) is a heck of a way to decrement a counter. However, - * unless the macro argument is provided, code optimizers will sometimes move - * this statement so that it gets executed *before* the unsafe expression - * which we're trying to protect. That pretty well messes things up, - * of course. - * - * If the expression(s) you're trying to protect don't happen to return a - * value, you will need to manufacture a dummy result just to preserve the - * correct ordering of statements. Note that the macro passes the address - * of its argument (so you need to give it something which is addressable). - * If your expression returns multiple results, pass the last such result - * to PyFPE_END_PROTECT. - * - * Note that PyFPE_dummy returns a double, which is cast to int. - * This seeming insanity is to tickle the Floating Point Unit (FPU). - * If an exception has occurred in a preceding floating point operation, - * some architectures (notably Intel 80x86) will not deliver the interrupt - * until the *next* floating point operation. This is painful if you've - * already decremented PyFPE_counter. - */ #define PyFPE_END_PROTECT(v) PyFPE_counter -= (int)PyFPE_dummy(&(v)); - #else - #define PyFPE_START_PROTECT(err_string, leave_stmt) #define PyFPE_END_PROTECT(v) - -#endif - -#ifdef __cplusplus -} #endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYFPE_H */ diff --git a/third_party/python/Include/pygetopt.h b/third_party/python/Include/pygetopt.h index 962720c87..0d94c380b 100644 --- a/third_party/python/Include/pygetopt.h +++ b/third_party/python/Include/pygetopt.h @@ -1,9 +1,7 @@ - #ifndef Py_PYGETOPT_H #define Py_PYGETOPT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_DATA(int) _PyOS_opterr; @@ -15,7 +13,5 @@ PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); PyAPI_FUNC(int) _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYGETOPT_H */ diff --git a/third_party/python/Include/pyhash.h b/third_party/python/Include/pyhash.h index 9cfd071ea..bba1a804b 100644 --- a/third_party/python/Include/pyhash.h +++ b/third_party/python/Include/pyhash.h @@ -1,9 +1,7 @@ #ifndef Py_HASH_H - #define Py_HASH_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Helpers for hash functions */ #ifndef Py_LIMITED_API @@ -138,8 +136,6 @@ PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); # endif /* uint64_t && uint32_t && aligned */ #endif /* Py_HASH_ALGORITHM */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_HASH_H */ diff --git a/third_party/python/Include/pylifecycle.h b/third_party/python/Include/pylifecycle.h index 9a528218e..53d6e7e16 100644 --- a/third_party/python/Include/pylifecycle.h +++ b/third_party/python/Include/pylifecycle.h @@ -1,11 +1,7 @@ - -/* Interfaces to configure, query, create & destroy the Python runtime */ - #ifndef Py_PYLIFECYCLE_H #define Py_PYLIFECYCLE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(void) Py_SetProgramName(wchar_t *); PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); @@ -125,7 +121,5 @@ PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYLIFECYCLE_H */ diff --git a/third_party/python/Include/pymacconfig.h b/third_party/python/Include/pymacconfig.h index 9dde11bd5..b3ce31829 100644 --- a/third_party/python/Include/pymacconfig.h +++ b/third_party/python/Include/pymacconfig.h @@ -1,5 +1,7 @@ #ifndef PYMACCONFIG_H #define PYMACCONFIG_H +/* clang-format off */ + /* * This file moves some of the autoconf magic to compile-time * when building on MacOSX. This is needed for building 4-way diff --git a/third_party/python/Include/pymacro.h b/third_party/python/Include/pymacro.h index 2a839abf8..d61135db4 100644 --- a/third_party/python/Include/pymacro.h +++ b/third_party/python/Include/pymacro.h @@ -1,5 +1,6 @@ #ifndef Py_PYMACRO_H #define Py_PYMACRO_H +/* clang-format off */ /* Minimum value between x and y */ #define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) diff --git a/third_party/python/Include/pymath.h b/third_party/python/Include/pymath.h index 6cf69f98a..a113e2b8a 100644 --- a/third_party/python/Include/pymath.h +++ b/third_party/python/Include/pymath.h @@ -1,7 +1,7 @@ #ifndef Py_PYMATH_H #define Py_PYMATH_H - -#include "pyconfig.h" /* include for defines */ +#include "third_party/python/pyconfig.h" +/* clang-format off */ /************************************************************************** Symbols and macros to supply platform-independent interfaces to mathematical @@ -29,10 +29,10 @@ extern double hypot(double, double); /* extra declarations */ #ifndef _MSC_VER #ifndef __STDC__ -extern double fmod (double, double); -extern double frexp (double, int *); -extern double ldexp (double, int); -extern double modf (double, double *); +extern double fmod(double, double); +extern double frexp(double, int *); +extern double ldexp(double, int); +extern double modf(double, double *); extern double pow(double, double); #endif /* __STDC__ */ #endif /* _MSC_VER */ @@ -60,7 +60,6 @@ extern double pow(double, double); #define Py_MATH_TAU 6.2831853071795864769252867665590057683943L #endif - /* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU register and into a 64-bit memory location, rounding from extended precision to double precision in the process. On other platforms it does @@ -69,12 +68,12 @@ extern double pow(double, double); /* we take double rounding as evidence of x87 usage */ #ifndef Py_LIMITED_API #ifndef Py_FORCE_DOUBLE -# ifdef X87_DOUBLE_ROUNDING +#ifdef X87_DOUBLE_ROUNDING PyAPI_FUNC(double) _Py_force_double(double); -# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) -# else -# define Py_FORCE_DOUBLE(X) (X) -# endif +#define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +#else +#define Py_FORCE_DOUBLE(X) (X) +#endif #endif #endif @@ -115,12 +114,12 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf */ #ifndef Py_IS_INFINITY -# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 -# define Py_IS_INFINITY(X) isinf(X) -# else -# define Py_IS_INFINITY(X) ((X) && \ - (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) -# endif +#if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +#define Py_IS_INFINITY(X) isinf(X) +#else +#define Py_IS_INFINITY(X) \ + ((X) && (Py_FORCE_DOUBLE(X) * 0.5 == Py_FORCE_DOUBLE(X))) +#endif #endif /* Py_IS_FINITE(X) @@ -157,27 +156,29 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); */ #if !defined(Py_NAN) && !defined(Py_NO_NAN) #if !defined(__INTEL_COMPILER) - #define Py_NAN (Py_HUGE_VAL * 0.) +#define Py_NAN (Py_HUGE_VAL * 0.) #else /* __INTEL_COMPILER */ - #if defined(ICC_NAN_STRICT) - #pragma float_control(push) - #pragma float_control(precise, on) - #pragma float_control(except, on) - #if defined(_MSC_VER) - __declspec(noinline) - #else /* Linux */ - __attribute__((noinline)) - #endif /* _MSC_VER */ - static double __icc_nan() - { - return sqrt(-1.0); - } - #pragma float_control (pop) - #define Py_NAN __icc_nan() - #else /* ICC_NAN_RELAXED as default for Intel Compiler */ - static const union { unsigned char buf[8]; double __icc_nan; } __nan_store = {0,0,0,0,0,0,0xf8,0x7f}; - #define Py_NAN (__nan_store.__icc_nan) - #endif /* ICC_NAN_STRICT */ +#if defined(ICC_NAN_STRICT) +#pragma float_control(push) +#pragma float_control(precise, on) +#pragma float_control(except, on) +#if defined(_MSC_VER) +__declspec(noinline) +#else /* Linux */ +__attribute__((noinline)) +#endif /* _MSC_VER */ + static double __icc_nan() { + return sqrt(-1.0); +} +#pragma float_control(pop) +#define Py_NAN __icc_nan() +#else /* ICC_NAN_RELAXED as default for Intel Compiler */ +static const union { + unsigned char buf[8]; + double __icc_nan; +} __nan_store = {0, 0, 0, 0, 0, 0, 0xf8, 0x7f}; +#define Py_NAN (__nan_store.__icc_nan) +#endif /* ICC_NAN_STRICT */ #endif /* __INTEL_COMPILER */ #endif @@ -210,21 +211,25 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); #if defined(__FreeBSD__) || defined(__OpenBSD__) #define Py_OVERFLOWED(X) isinf(X) #else -#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ - (X) == Py_HUGE_VAL || \ - (X) == -Py_HUGE_VAL)) +#define Py_OVERFLOWED(X) \ + ((X) != 0.0 && (errno == ERANGE || (X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL)) #endif /* Return whether integral type *type* is signed or not. */ #define _Py_IntegralTypeSigned(type) ((type)(-1) < 0) /* Return the maximum value of integral type *type*. */ -#define _Py_IntegralTypeMax(type) ((_Py_IntegralTypeSigned(type)) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) +#define _Py_IntegralTypeMax(type) \ + ((_Py_IntegralTypeSigned(type)) \ + ? (((((type)1 << (sizeof(type) * CHAR_BIT - 2)) - 1) << 1) + 1) \ + : ~(type)0) /* Return the minimum value of integral type *type*. */ -#define _Py_IntegralTypeMin(type) ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) +#define _Py_IntegralTypeMin(type) \ + ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) /* Check whether *v* is in the range of integral type *type*. This is most * useful if *v* is floating-point, since demoting a floating-point *v* to an * integral type that cannot represent *v*'s integral part is undefined * behavior. */ -#define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) +#define _Py_InIntegralTypeRange(type, v) \ + (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) #endif /* Py_PYMATH_H */ diff --git a/third_party/python/Include/pymem.h b/third_party/python/Include/pymem.h index a9f0186bd..68642f604 100644 --- a/third_party/python/Include/pymem.h +++ b/third_party/python/Include/pymem.h @@ -1,15 +1,8 @@ -/* The PyMem_ family: low-level memory allocation interfaces. - See objimpl.h for the PyObject_ memory family. -*/ - #ifndef Py_PYMEM_H #define Py_PYMEM_H - -#include "pyport.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "third_party/python/Include/pyport.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); @@ -228,8 +221,5 @@ PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); #endif -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_PYMEM_H */ diff --git a/third_party/python/Include/pyport.h b/third_party/python/Include/pyport.h index a076d28e3..58cae2ffa 100644 --- a/third_party/python/Include/pyport.h +++ b/third_party/python/Include/pyport.h @@ -1,9 +1,19 @@ #ifndef Py_PYPORT_H #define Py_PYPORT_H - -#include "pyconfig.h" /* include for defines */ - -#include +#include "libc/calls/calls.h" +#include "libc/calls/termios.h" +#include "libc/calls/weirdtypes.h" +#include "libc/limits.h" +#include "libc/math.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/clock.h" +#include "libc/sysv/consts/itimer.h" +#include "libc/sysv/consts/s.h" +#include "libc/sysv/consts/sched.h" +#include "libc/sysv/consts/termios.h" +#include "libc/time/time.h" +#include "third_party/python/pyconfig.h" +/* clang-format off */ /************************************************************************** Symbols and macros to supply platform-independent interfaces to basic @@ -44,8 +54,8 @@ Used in: Py_SAFE_DOWNCAST #ifndef PY_LONG_LONG #define PY_LONG_LONG long long /* If LLONG_MAX is defined in limits.h, use that. */ -#define PY_LLONG_MIN LLONG_MIN -#define PY_LLONG_MAX LLONG_MAX +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX #define PY_ULLONG_MAX ULLONG_MAX #endif @@ -73,19 +83,19 @@ Used in: Py_SAFE_DOWNCAST * without loss of information. Similarly for intptr_t, wrt a signed * integral type. */ -typedef uintptr_t Py_uintptr_t; -typedef intptr_t Py_intptr_t; +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; /* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an * unsigned integral type). See PEP 353 for details. */ #ifdef HAVE_SSIZE_T -typedef ssize_t Py_ssize_t; +typedef ssize_t Py_ssize_t; #elif SIZEOF_VOID_P == SIZEOF_SIZE_T -typedef Py_intptr_t Py_ssize_t; +typedef Py_intptr_t Py_ssize_t; #else -# error "Python needs a typedef for Py_ssize_t in pyport.h." +#error "Python needs a typedef for Py_ssize_t in pyport.h." #endif /* Py_hash_t is the same size as a pointer. */ @@ -106,9 +116,9 @@ typedef int Py_ssize_clean_t; #define PY_SIZE_MAX SIZE_MAX /* Largest positive value of type Py_ssize_t. */ -#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1) >> 1)) /* Smallest negative value of type Py_ssize_t. */ -#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX - 1) /* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf * format to convert an argument with the width of a size_t or Py_ssize_t. @@ -135,15 +145,15 @@ typedef int Py_ssize_clean_t; * Py_ssize_t on the platform. */ #ifndef PY_FORMAT_SIZE_T -# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) -# define PY_FORMAT_SIZE_T "" -# elif SIZEOF_SIZE_T == SIZEOF_LONG -# define PY_FORMAT_SIZE_T "l" -# elif defined(MS_WINDOWS) -# define PY_FORMAT_SIZE_T "I" -# else -# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" -# endif +#if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +#define PY_FORMAT_SIZE_T "" +#elif SIZEOF_SIZE_T == SIZEOF_LONG +#define PY_FORMAT_SIZE_T "l" +#elif defined(MS_WINDOWS) +#define PY_FORMAT_SIZE_T "I" +#else +#error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +#endif #endif /* Py_LOCAL can be used instead of static to get the fastest possible calling @@ -169,15 +179,15 @@ typedef int Py_ssize_clean_t; #pragma optimize("agtw", on) #endif /* ignore warnings if the compiler decides not to inline a function */ -#pragma warning(disable: 4710) +#pragma warning(disable : 4710) /* fastest possible local call under MSVC */ -#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL(type) static type __fastcall #define Py_LOCAL_INLINE(type) static __inline type __fastcall #elif defined(USE_INLINE) -#define Py_LOCAL(type) static type +#define Py_LOCAL(type) static type #define Py_LOCAL_INLINE(type) static inline type #else -#define Py_LOCAL(type) static type +#define Py_LOCAL(type) static type #define Py_LOCAL_INLINE(type) static type #endif @@ -185,79 +195,7 @@ typedef int Py_ssize_clean_t; * see https://bugs.python.org/issue28126 */ #define Py_MEMCPY memcpy -#include - -#ifdef HAVE_IEEEFP_H -#include /* needed for 'finite' declaration on some platforms */ -#endif - -#include /* Moved here from the math section, before extern "C" */ - -/******************************************** - * WRAPPER FOR and/or * - ********************************************/ - -#ifdef TIME_WITH_SYS_TIME -#include -#include -#else /* !TIME_WITH_SYS_TIME */ -#ifdef HAVE_SYS_TIME_H -#include -#else /* !HAVE_SYS_TIME_H */ -#include -#endif /* !HAVE_SYS_TIME_H */ -#endif /* !TIME_WITH_SYS_TIME */ - - -/****************************** - * WRAPPER FOR * - ******************************/ - -/* NB caller must include */ - -#ifdef HAVE_SYS_SELECT_H -// #include -#endif /* !HAVE_SYS_SELECT_H */ - -/******************************* - * stat() and fstat() fiddling * - *******************************/ - -#ifdef HAVE_SYS_STAT_H -#include -#elif defined(HAVE_STAT_H) -#include -#endif - -#ifndef S_IFMT -/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ -#define S_IFMT 0170000 -#endif - -#ifndef S_IFLNK -/* Windows doesn't define S_IFLNK but posixmodule.c maps - * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ -# define S_IFLNK 0120000 -#endif - -#ifndef S_ISREG -#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) -#endif - -#ifndef S_ISCHR -#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) -#endif - -#ifdef __cplusplus -/* Move this down here since some C++ #include's don't like to be included - inside an extern "C" */ -extern "C" { -#endif - +COSMOPOLITAN_C_START_ /* Py_ARITHMETIC_RIGHT_SHIFT * C doesn't define whether a right-shift of a signed integer sign-extends @@ -279,7 +217,7 @@ extern "C" { */ #ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ - ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) + ((I) < 0 ? -1 - ((-1 - (I)) >> (J)) : (I) >> (J)) #else #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) #endif @@ -299,7 +237,7 @@ extern "C" { */ #ifdef Py_DEBUG #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ - (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) #else #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) #endif @@ -313,19 +251,22 @@ extern "C" { * This isn't reliable. See Py_OVERFLOWED comments. * X is evaluated more than once. */ -#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) -#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || \ + (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) \ + if (isnan(X)) errno = EDOM; #else #define _Py_SET_EDOM_FOR_NAN(X) ; #endif -#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ - do { \ - if (errno == 0) { \ - if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ - errno = ERANGE; \ - else _Py_SET_EDOM_FOR_NAN(X) \ - } \ - } while(0) +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else \ + _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while (0) /* Py_SET_ERANGE_ON_OVERFLOW(x) * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. @@ -346,26 +287,22 @@ extern "C" { * This isn't reliable. See Py_OVERFLOWED comments. * X and Y may be evaluated more than once. */ -#define Py_ADJUST_ERANGE1(X) \ - do { \ - if (errno == 0) { \ - if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ - errno = ERANGE; \ - } \ - else if (errno == ERANGE && (X) == 0.0) \ - errno = 0; \ - } while(0) +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) errno = ERANGE; \ + } else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while (0) -#define Py_ADJUST_ERANGE2(X, Y) \ - do { \ - if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ - (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ - if (errno == 0) \ - errno = ERANGE; \ - } \ - else if (errno == ERANGE) \ - errno = 0; \ - } while(0) +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || (Y) == Py_HUGE_VAL || \ + (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) errno = ERANGE; \ + } else if (errno == ERANGE) \ + errno = 0; \ + } while (0) /* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are * required to support the short float repr introduced in Python 3.1) require @@ -394,62 +331,21 @@ extern "C" { #ifdef HAVE_GCC_ASM_FOR_X87 #define HAVE_PY_SET_53BIT_PRECISION 1 /* _Py_get/set_387controlword functions are defined in Python/pymath.c */ -#define _Py_SET_53BIT_PRECISION_HEADER \ - unsigned short old_387controlword, new_387controlword -#define _Py_SET_53BIT_PRECISION_START \ - do { \ - old_387controlword = _Py_get_387controlword(); \ - new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ - if (new_387controlword != old_387controlword) \ - _Py_set_387controlword(new_387controlword); \ - } while (0) -#define _Py_SET_53BIT_PRECISION_END \ - if (new_387controlword != old_387controlword) \ - _Py_set_387controlword(old_387controlword) +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) #endif /* get and set x87 control word for VisualStudio/x86 */ -#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ -#define HAVE_PY_SET_53BIT_PRECISION 1 -#define _Py_SET_53BIT_PRECISION_HEADER \ - unsigned int old_387controlword, new_387controlword, out_387controlword -/* We use the __control87_2 function to set only the x87 control word. - The SSE control word is unaffected. */ -#define _Py_SET_53BIT_PRECISION_START \ - do { \ - __control87_2(0, 0, &old_387controlword, NULL); \ - new_387controlword = \ - (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ - if (new_387controlword != old_387controlword) \ - __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ - &out_387controlword, NULL); \ - } while (0) -#define _Py_SET_53BIT_PRECISION_END \ - do { \ - if (new_387controlword != old_387controlword) \ - __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ - &out_387controlword, NULL); \ - } while (0) -#endif - -#ifdef HAVE_GCC_ASM_FOR_MC68881 -#define HAVE_PY_SET_53BIT_PRECISION 1 -#define _Py_SET_53BIT_PRECISION_HEADER \ - unsigned int old_fpcr, new_fpcr -#define _Py_SET_53BIT_PRECISION_START \ - do { \ - __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \ - /* Set double precision / round to nearest. */ \ - new_fpcr = (old_fpcr & ~0xf0) | 0x80; \ - if (new_fpcr != old_fpcr) \ - __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr)); \ - } while (0) -#define _Py_SET_53BIT_PRECISION_END \ - do { \ - if (new_fpcr != old_fpcr) \ - __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \ - } while (0) -#endif /* default definitions are empty */ #ifndef HAVE_PY_SET_53BIT_PRECISION @@ -471,7 +367,7 @@ extern "C" { */ #if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ - !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) #define PY_NO_SHORT_FLOAT_REPR #endif @@ -483,7 +379,6 @@ extern "C" { #define PY_NO_SHORT_FLOAT_REPR #endif - /* Py_DEPRECATED(version) * Declare a variable, type, or function deprecated. * Usage: @@ -491,8 +386,8 @@ extern "C" { * typedef int T1 Py_DEPRECATED(2.4); * extern int x() Py_DEPRECATED(2.5); */ -#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ - (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) #else #define Py_DEPRECATED(VERSION_UNUSED) @@ -512,76 +407,18 @@ extern int gethostname(char *, int); #endif #ifdef HAVE__GETPTY -#include /* we need to import mode_t */ -extern char * _getpty(int *, int, mode_t, int); -#endif - -/* On QNX 6, struct termio must be declared by including sys/termio.h - if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must - be included before termios.h or it will generate an error. */ -#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) -#include +extern char *_getpty(int *, int, mode_t, int); #endif #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) #if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) /* BSDI does not supply a prototype for the 'openpty' and 'forkpty' functions, even though they are included in libutil. */ -#include extern int openpty(int *, int *, char *, struct termios *, struct winsize *); extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ - -/* On 4.4BSD-descendants, ctype functions serves the whole range of - * wchar_t character set rather than single byte code points only. - * This characteristic can break some operations of string object - * including str.upper() and str.split() on UTF-8 locales. This - * workaround was provided by Tim Robbins of FreeBSD project. - */ - -#ifdef __FreeBSD__ -#include -#if (__FreeBSD_version >= 500040 && __FreeBSD_version < 602113) || \ - (__FreeBSD_version >= 700000 && __FreeBSD_version < 700054) || \ - (__FreeBSD_version >= 800000 && __FreeBSD_version < 800001) -# define _PY_PORT_CTYPE_UTF8_ISSUE -#endif -#endif - - -#if defined(__APPLE__) -# define _PY_PORT_CTYPE_UTF8_ISSUE -#endif - -#ifdef _PY_PORT_CTYPE_UTF8_ISSUE -#ifndef __cplusplus - /* The workaround below is unsafe in C++ because - * the defines these symbols as real functions, - * with a slightly different signature. - * See issue #10910 - */ -#include -#include -#undef isalnum -#define isalnum(c) iswalnum(btowc(c)) -#undef isalpha -#define isalpha(c) iswalpha(btowc(c)) -#undef islower -#define islower(c) iswlower(btowc(c)) -#undef isspace -#define isspace(c) iswspace(btowc(c)) -#undef isupper -#define isupper(c) iswupper(btowc(c)) -#undef tolower -#define tolower(c) towlower(btowc(c)) -#undef toupper -#define toupper(c) towupper(btowc(c)) -#endif -#endif - - /* Declarations for symbol visibility. PyAPI_FUNC(type): Declares a public Python API function and return type @@ -595,84 +432,16 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); we support a HAVE_DECLSPEC_DLL macro to save duplication. */ -/* - All windows ports, except cygwin, are handled in PC/pyconfig.h. - - Cygwin is the only other autoconf platform requiring special - linkage handling and it uses __declspec(). -*/ -#if defined(__CYGWIN__) -# define HAVE_DECLSPEC_DLL -#endif - -/* only get special linkage if built as shared or platform is Cygwin */ -#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) -# if defined(HAVE_DECLSPEC_DLL) -# ifdef Py_BUILD_CORE -# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE -# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE - /* module init functions inside the core need no external linkage */ - /* except for Cygwin to handle embedding */ -# if defined(__CYGWIN__) -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* -# else /* __CYGWIN__ */ -# define PyMODINIT_FUNC PyObject* -# endif /* __CYGWIN__ */ -# else /* Py_BUILD_CORE */ - /* Building an extension module, or an embedded situation */ - /* public Python functions and data are imported */ - /* Under Cygwin, auto-import functions to prevent compilation */ - /* failures similar to those described at the bottom of 4.1: */ - /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ -# if !defined(__CYGWIN__) -# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE -# endif /* !__CYGWIN__ */ -# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE - /* module init functions outside the core must be exported */ -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* -# endif /* __cplusplus */ -# endif /* Py_BUILD_CORE */ -# endif /* HAVE_DECLSPEC */ -#endif /* Py_ENABLE_SHARED */ - -/* If no external linkage macros defined by now, create defaults */ -#ifndef PyAPI_FUNC -# define PyAPI_FUNC(RTYPE) RTYPE -#endif -#ifndef PyAPI_DATA -# define PyAPI_DATA(RTYPE) extern RTYPE -#endif -#ifndef PyMODINIT_FUNC -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC PyObject* -# endif /* __cplusplus */ +#define PyAPI_FUNC(RTYPE) RTYPE +#define PyAPI_DATA(RTYPE) extern RTYPE +#ifdef __cplusplus +#define PyMODINIT_FUNC extern "C" PyObject * +#else +#define PyMODINIT_FUNC PyObject * #endif /* limits.h constants that may be missing */ -#ifndef INT_MAX -#define INT_MAX 2147483647 -#endif - -#ifndef LONG_MAX -#if SIZEOF_LONG == 4 -#define LONG_MAX 0X7FFFFFFFL -#elif SIZEOF_LONG == 8 -#define LONG_MAX 0X7FFFFFFFFFFFFFFFL -#else -#error "could not set LONG_MAX in pyport.h" -#endif -#endif - -#ifndef LONG_MIN -#define LONG_MIN (-LONG_MAX-1) -#endif - #ifndef LONG_BIT #define LONG_BIT (8 * SIZEOF_LONG) #endif @@ -686,15 +455,13 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ /* * Hide GCC attributes from compilers that don't support them. */ #if (!defined(__GNUC__) || __GNUC__ < 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) + (__GNUC__ == 2 && __GNUC_MINOR__ < 7)) #define Py_GCC_ATTRIBUTE(x) #else #define Py_GCC_ATTRIBUTE(x) __attribute__(x) @@ -713,7 +480,7 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); * when using do{...}while(0) macros */ #ifdef __SUNPRO_C -#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#pragma error_messages(off, E_END_OF_LOOP_CODE_NOT_REACHED) #endif #ifndef Py_LL @@ -733,35 +500,14 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); */ #ifdef WORDS_BIGENDIAN -#define PY_BIG_ENDIAN 1 +#define PY_BIG_ENDIAN 1 #define PY_LITTLE_ENDIAN 0 #else -#define PY_BIG_ENDIAN 0 +#define PY_BIG_ENDIAN 0 #define PY_LITTLE_ENDIAN 1 #endif -#ifdef Py_BUILD_CORE -/* - * Macros to protect CRT calls against instant termination when passed an - * invalid parameter (issue23524). - */ -#if defined _MSC_VER && _MSC_VER >= 1900 - -extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; -#define _Py_BEGIN_SUPPRESS_IPH { _invalid_parameter_handler _Py_old_handler = \ - _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); -#define _Py_END_SUPPRESS_IPH _set_thread_local_invalid_parameter_handler(_Py_old_handler); } - -#else - #define _Py_BEGIN_SUPPRESS_IPH #define _Py_END_SUPPRESS_IPH -#endif /* _MSC_VER >= 1900 */ -#endif /* Py_BUILD_CORE */ - -#ifdef __ANDROID__ -#include -#endif - #endif /* Py_PYPORT_H */ diff --git a/third_party/python/Include/pystate.h b/third_party/python/Include/pystate.h index 1838fa404..1e52b4f33 100644 --- a/third_party/python/Include/pystate.h +++ b/third_party/python/Include/pystate.h @@ -1,12 +1,7 @@ - -/* Thread and interpreter state structures and their interfaces */ - - #ifndef Py_PYSTATE_H #define Py_PYSTATE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* This limitation is for performance and simplicity. If needed it can be removed (with effort). */ @@ -318,7 +313,5 @@ typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYSTATE_H */ diff --git a/third_party/python/Include/pystrcmp.h b/third_party/python/Include/pystrcmp.h index edb12397e..2a62ff228 100644 --- a/third_party/python/Include/pystrcmp.h +++ b/third_party/python/Include/pystrcmp.h @@ -1,9 +1,7 @@ #ifndef Py_STRCMP_H #define Py_STRCMP_H - -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); @@ -16,8 +14,5 @@ PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); #define PyOS_stricmp PyOS_mystricmp #endif -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_STRCMP_H */ diff --git a/third_party/python/Include/pystrhex.h b/third_party/python/Include/pystrhex.h index 66a30e223..bf5a44e3a 100644 --- a/third_party/python/Include/pystrhex.h +++ b/third_party/python/Include/pystrhex.h @@ -1,9 +1,7 @@ #ifndef Py_STRHEX_H #define Py_STRHEX_H - -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API /* Returns a str() containing the hex representation of argbuf. */ @@ -12,8 +10,5 @@ PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); PyAPI_FUNC(PyObject*) _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_STRHEX_H */ diff --git a/third_party/python/Include/pystrtod.h b/third_party/python/Include/pystrtod.h index c1e84de6f..b1055f060 100644 --- a/third_party/python/Include/pystrtod.h +++ b/third_party/python/Include/pystrtod.h @@ -1,10 +1,7 @@ #ifndef Py_STRTOD_H #define Py_STRTOD_H - -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(double) PyOS_string_to_double(const char *str, char **endptr, @@ -38,8 +35,5 @@ PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); #define Py_DTST_INFINITE 1 #define Py_DTST_NAN 2 -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_STRTOD_H */ diff --git a/third_party/python/Include/pythonrun.h b/third_party/python/Include/pythonrun.h index efc613f65..478a27a0c 100644 --- a/third_party/python/Include/pythonrun.h +++ b/third_party/python/Include/pythonrun.h @@ -1,11 +1,7 @@ - -/* Interfaces to parse and execute pieces of python code */ - #ifndef Py_PYTHONRUN_H #define Py_PYTHONRUN_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ @@ -191,7 +187,5 @@ PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; PyAPI_FUNC(int) PyOS_CheckStack(void); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_PYTHONRUN_H */ diff --git a/third_party/python/Include/pythread.h b/third_party/python/Include/pythread.h index 88c4873a5..c3a5701a4 100644 --- a/third_party/python/Include/pythread.h +++ b/third_party/python/Include/pythread.h @@ -1,14 +1,11 @@ - #ifndef Py_PYTHREAD_H #define Py_PYTHREAD_H +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef void *PyThread_type_lock; typedef void *PyThread_type_sema; -#ifdef __cplusplus -extern "C" { -#endif - /* Return status codes for Python lock acquisition. Chosen for maximum * backwards compatibility, ie failure -> 0, success -> 1. */ typedef enum PyLockStatus { @@ -83,8 +80,5 @@ PyAPI_FUNC(void) PyThread_delete_key_value(int key); /* Cleanup after a fork */ PyAPI_FUNC(void) PyThread_ReInitTLS(void); -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* !Py_PYTHREAD_H */ diff --git a/third_party/python/Include/pytime.h b/third_party/python/Include/pytime.h index 158c460ae..4116d942c 100644 --- a/third_party/python/Include/pytime.h +++ b/third_party/python/Include/pytime.h @@ -1,17 +1,15 @@ #ifndef Py_LIMITED_API #ifndef Py_PYTIME_H #define Py_PYTIME_H - -#include "pyconfig.h" /* include for defines */ -#include "object.h" +#include "third_party/python/Include/object.h" +#include "third_party/python/pyconfig.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related functions and constants **************************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif /* _PyTime_t: Python timestamp with subsecond precision. It can be used to store a duration, and so indirectly a date (related to another date, like @@ -203,9 +201,6 @@ PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); Return 0 on success, raise an exception and return -1 on error. */ PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); -#ifdef __cplusplus -} -#endif - +COSMOPOLITAN_C_END_ #endif /* Py_PYTIME_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/rangeobject.h b/third_party/python/Include/rangeobject.h index 7e4dc2889..9d3e462c7 100644 --- a/third_party/python/Include/rangeobject.h +++ b/third_party/python/Include/rangeobject.h @@ -1,11 +1,7 @@ - -/* Range object interface */ - #ifndef Py_RANGEOBJECT_H #define Py_RANGEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* A range object represents an integer range. This is an immutable object; @@ -21,7 +17,5 @@ PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; #define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_RANGEOBJECT_H */ diff --git a/third_party/python/Include/setobject.h b/third_party/python/Include/setobject.h index 87ec1c8af..c0225cede 100644 --- a/third_party/python/Include/setobject.h +++ b/third_party/python/Include/setobject.h @@ -1,10 +1,7 @@ -/* Set object interface */ - #ifndef Py_SETOBJECT_H #define Py_SETOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API @@ -102,7 +99,5 @@ PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); (Py_TYPE(ob) == &PyFrozenSet_Type || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_SETOBJECT_H */ diff --git a/third_party/python/Include/sliceobject.h b/third_party/python/Include/sliceobject.h index 579ac073d..9fe402473 100644 --- a/third_party/python/Include/sliceobject.h +++ b/third_party/python/Include/sliceobject.h @@ -1,8 +1,7 @@ #ifndef Py_SLICEOBJECT_H #define Py_SLICEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* The unique ellipsis object "..." */ @@ -59,7 +58,5 @@ PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t step); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_SLICEOBJECT_H */ diff --git a/third_party/python/Include/structmember.h b/third_party/python/Include/structmember.h index 5da8a4668..403d09b57 100644 --- a/third_party/python/Include/structmember.h +++ b/third_party/python/Include/structmember.h @@ -1,20 +1,15 @@ #ifndef Py_STRUCTMEMBER_H #define Py_STRUCTMEMBER_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Interface to map C struct members to Python object attributes */ -#include /* For offsetof */ - /* An array of PyMemberDef structures defines the name, type and offset of selected members of a C structure. These can be read by PyMember_GetOne() and set by PyMember_SetOne() (except if their READONLY flag is set). The array must be terminated with an entry whose name pointer is NULL. */ - typedef struct PyMemberDef { char *name; int type; @@ -67,8 +62,5 @@ typedef struct PyMemberDef { PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_STRUCTMEMBER_H */ diff --git a/third_party/python/Include/structseq.h b/third_party/python/Include/structseq.h index af227164c..92a316bfd 100644 --- a/third_party/python/Include/structseq.h +++ b/third_party/python/Include/structseq.h @@ -1,11 +1,7 @@ - -/* Named tuple object interface */ - #ifndef Py_STRUCTSEQ_H #define Py_STRUCTSEQ_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct PyStructSequence_Field { char *name; @@ -43,7 +39,5 @@ typedef PyTupleObject PyStructSequence; PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_STRUCTSEQ_H */ diff --git a/third_party/python/Include/symtable.h b/third_party/python/Include/symtable.h index 86ae3c28e..68f49738f 100644 --- a/third_party/python/Include/symtable.h +++ b/third_party/python/Include/symtable.h @@ -1,14 +1,8 @@ #ifndef Py_LIMITED_API #ifndef Py_SYMTABLE_H #define Py_SYMTABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal - * names. - */ +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } _Py_block_ty; @@ -112,8 +106,6 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *); #define GENERATOR 1 #define GENERATOR_EXPRESSION 2 -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_SYMTABLE_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/sysmodule.h b/third_party/python/Include/sysmodule.h index c5547ff67..75acad2fa 100644 --- a/third_party/python/Include/sysmodule.h +++ b/third_party/python/Include/sysmodule.h @@ -1,11 +1,7 @@ - -/* System module interface */ - #ifndef Py_SYSMODULE_H #define Py_SYSMODULE_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); @@ -37,7 +33,5 @@ PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_SYSMODULE_H */ diff --git a/third_party/python/Include/token.h b/third_party/python/Include/token.h index 595afa015..0eef17b16 100644 --- a/third_party/python/Include/token.h +++ b/third_party/python/Include/token.h @@ -1,11 +1,8 @@ - -/* Token types */ #ifndef Py_LIMITED_API #ifndef Py_TOKEN_H #define Py_TOKEN_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ @@ -83,8 +80,6 @@ PyAPI_FUNC(int) PyToken_OneChar(int); PyAPI_FUNC(int) PyToken_TwoChars(int, int); PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_TOKEN_H */ #endif /* Py_LIMITED_API */ diff --git a/third_party/python/Include/traceback.h b/third_party/python/Include/traceback.h index b5874100f..e1589307d 100644 --- a/third_party/python/Include/traceback.h +++ b/third_party/python/Include/traceback.h @@ -1,11 +1,8 @@ - #ifndef Py_TRACEBACK_H #define Py_TRACEBACK_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "pystate.h" +#include "third_party/python/Include/pystate.h" +COSMOPOLITAN_C_START_ +/* clang-format off */ struct _frame; @@ -112,8 +109,5 @@ PyAPI_FUNC(void) _Py_DumpHexadecimal( Py_ssize_t width); #endif /* !Py_LIMITED_API */ - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_TRACEBACK_H */ diff --git a/third_party/python/Include/tupleobject.h b/third_party/python/Include/tupleobject.h index c273ce7dc..02bb1acae 100644 --- a/third_party/python/Include/tupleobject.h +++ b/third_party/python/Include/tupleobject.h @@ -1,11 +1,7 @@ - -/* Tuple object interface */ - #ifndef Py_TUPLEOBJECT_H #define Py_TUPLEOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* Another generally useful object type is a tuple of object pointers. @@ -67,7 +63,5 @@ PyAPI_FUNC(int) PyTuple_ClearFreeList(void); PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); #endif /* Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_TUPLEOBJECT_H */ diff --git a/third_party/python/Include/typeslots.h b/third_party/python/Include/typeslots.h index 0ce6a377d..8276e3086 100644 --- a/third_party/python/Include/typeslots.h +++ b/third_party/python/Include/typeslots.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Do not renumber the file; these numbers are part of the stable ABI. */ /* Disabled, see #10181 */ #undef Py_bf_getbuffer diff --git a/third_party/python/Include/ucnhash.h b/third_party/python/Include/ucnhash.h index 45362e997..ef689ee82 100644 --- a/third_party/python/Include/ucnhash.h +++ b/third_party/python/Include/ucnhash.h @@ -1,10 +1,8 @@ -/* Unicode name database interface */ #ifndef Py_LIMITED_API #ifndef Py_UCNHASH_H #define Py_UCNHASH_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ /* revised ucnhash CAPI interface (exported through a "wrapper") */ @@ -29,8 +27,6 @@ typedef struct { } _PyUnicode_Name_CAPI; -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_UCNHASH_H */ #endif /* !Py_LIMITED_API */ diff --git a/third_party/python/Include/unicodeobject.h b/third_party/python/Include/unicodeobject.h index c81a38181..e4d31d827 100644 --- a/third_party/python/Include/unicodeobject.h +++ b/third_party/python/Include/unicodeobject.h @@ -1,10 +1,9 @@ #ifndef Py_UNICODEOBJECT_H #define Py_UNICODEOBJECT_H - -#include +COSMOPOLITAN_C_START_ +/* clang-format off */ /* - Unicode implementation based on original code by Fredrik Lundh, modified by Marc-Andre Lemburg (mal@lemburg.com) according to the Unicode Integration Proposal. (See @@ -55,8 +54,6 @@ Copyright (c) Corporation for National Research Initiatives. * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * -------------------------------------------------------------------- */ -#include - /* === Internal API ======================================================= */ /* --- Internal Unicode Format -------------------------------------------- */ @@ -103,14 +100,6 @@ typedef wchar_t Py_UNICODE; # endif #endif -#ifdef HAVE_WCHAR_H -/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */ -# ifdef _HAVE_BSDI -# include -# endif -# include -#endif - /* Py_UCS4 and Py_UCS2 are typedefs for the respective unicode representations. */ typedef uint32_t Py_UCS4; @@ -186,10 +175,6 @@ typedef uint8_t Py_UCS1; #endif /* Py_LIMITED_API */ -#ifdef __cplusplus -extern "C" { -#endif - /* --- Unicode Type ------------------------------------------------------- */ #ifndef Py_LIMITED_API @@ -2336,7 +2321,5 @@ PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); #endif /* !Py_LIMITED_API */ -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_UNICODEOBJECT_H */ diff --git a/third_party/python/Include/warnings.h b/third_party/python/Include/warnings.h index a3f83ff69..7bada505f 100644 --- a/third_party/python/Include/warnings.h +++ b/third_party/python/Include/warnings.h @@ -1,8 +1,7 @@ #ifndef Py_WARNINGS_H #define Py_WARNINGS_H -#ifdef __cplusplus -extern "C" { -#endif +COSMOPOLITAN_C_START_ +/* clang-format off */ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject*) _PyWarnings_Init(void); @@ -56,8 +55,6 @@ PyErr_WarnExplicitFormat(PyObject *category, #define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) #endif -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_WARNINGS_H */ diff --git a/third_party/python/Include/weakrefobject.h b/third_party/python/Include/weakrefobject.h index 17051568f..61a448835 100644 --- a/third_party/python/Include/weakrefobject.h +++ b/third_party/python/Include/weakrefobject.h @@ -1,11 +1,7 @@ -/* Weak references objects for Python. */ - #ifndef Py_WEAKREFOBJECT_H #define Py_WEAKREFOBJECT_H -#ifdef __cplusplus -extern "C" { -#endif - +COSMOPOLITAN_C_START_ +/* clang-format off */ typedef struct _PyWeakReference PyWeakReference; @@ -79,8 +75,5 @@ PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); ? ((PyWeakReference *)(ref))->wr_object \ : Py_None) - -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_WEAKREFOBJECT_H */ diff --git a/third_party/python/Lib/distutils/command/wininst-10.0-amd64.exe b/third_party/python/Lib/distutils/command/wininst-10.0-amd64.exe deleted file mode 100644 index 6fa0dce16315854223a9fefc3ac9f3cf71730a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222208 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�?!H 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 N70sMIW8OSN{vUE=L&yLC diff --git a/third_party/python/Lib/distutils/command/wininst-10.0.exe b/third_party/python/Lib/distutils/command/wininst-10.0.exe deleted file mode 100644 index afc3bc6c14847283f32f53327184c6c2806efe0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190976 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

OPEHI2%PD3L3F4K9SA@F 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 diff --git a/third_party/python/Lib/distutils/command/wininst-14.0-amd64.exe b/third_party/python/Lib/distutils/command/wininst-14.0-amd64.exe deleted file mode 100644 index 253c2e2eccefa79393827f44f85680536906574a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587776 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 z zeg;oiY6wfcGYnD?a}|xlrI`X#yLvqlE1z5A2TKKo$qMLY@Q_3W_oZjunTTDWV{b1k zDqgDrj`y%e&VN#Sn!O)@l2wUVTNjcT&xEz?B_VD4gC6eNkKj+OV%=SkN%Gig`{-d) zIb~r)kVT(lAg3bU%v_V9#xOp{;09RN#7l>9YhI|+;6YPqkvfD-HS?RZ?L#3&-lRO( zdJ&a@zxFdBy|O--)Xr>n@}f&xQCn~wC?m=k$&A!u9(Yq1Ao?ZR zXU@gB+#+Q21lcv&+lL6rFW_;k?xe1nA*(F+KYbbY8SS1kXkE4u!IL!&EmBW^WjI{- z_CCd>s!LfysBiNb?~~wk08l%V&4wIyepNZ_x;1x$>OR@IqBAdJBIwP= z1ImN-t!5(K`n0fn8#nUV?s-^P74X@;rMte^<4h5u(D)fk7c#dp2?_rVc z9|#p>toES_tJb=wcs6he*N#-tHsDzKMWOjGK?I{1W=$XQbovllg(G>t=Z>~6GZmaL zyzTo9!bZINrIGP*(5;M3dn#J^0)2E79!@0?xipb~O(NQ4iytS1e|eHxh49Y@D(?;%4KI53Vc*p7LWH4uFyn8c<00O3usjss8aD2?- zqmiMo%UCKGDi+Cla4SB;ems;fkU0%A$G8aiP}iaPlQg`9Pu9cQ`8UY=C(9lWI+vBs zoGVLSc|9*syn*AkHH;_^0(9B^k|<#Ui#W_=1iLgy6H z4+&0Z8b+r0QR+S7%nUhH&yWEen*{VM!JQlnLKEjFtSqCFmF2pXeOQ@R+1rQ#RJNA5 z|5=$v+IZYt{m-0^=Y=;|i&d6x(py#km7TAt{#&g2$}?iKH0|3gu`YY&O?yt6p=-f{ z519O~WZW(ky~nB-J41wr;j6}FTm=OkWVi_8%@30}J0Ad5ku7+Qo8?9@`r$YcI&k4G z`}{?!=rF_L4C`5Xn>&VsX~rE|vl=I;JBmv^H^IA1%ZeLC3Q|2leC!D3osO9@P$8J#$dL)|B|H`tzw#*6grn22rsI zeB!^x|1#aqaCVeAyIA3oIBNI0w6)S-`!DGqwAH9-3-_YsE8Dk~4~hC~TSc_;*G7fY zlnq~FkKihXk*{#jYhDINczRESC(J1#-hBEO|Apx4_RA@9SGSz~BZJoFE5)2UwS0K^(G1+J!~JV~l9= zfcj;DX1Ufekgi6(JFTs{UGQJWvjW@fM%BxRH949k>$$&7L>1U5Z7c)4G-!SU?j;fJeT4`dMxHv0dO}^9T(^%*8l(mkf(qtW zk$&+>YgkGl-T0BqX*EOrn+=>6xEffEy~RS^;rzv1n9mYL#eN%mPAz3)uT}Q0ii19_ zd`)oHKiQ|H`kNKp^fB)-zBwTJxVomZ+FaFgJWF&Q7G@U@3-}(90h0j_Hxo7qt`6P3 z7dXir>FEn$rEJ_8a?fB2%i>bEi|?9}X|PuUAgD+2o_K$@d}vMvBYlze z>sPhL*{XYq9A(xDe3z*rt@R%naPpRsYG_oiP>p=5R+;lgpL9P$Q~Y{STomYR1+`Ze zjuiP>SUo7}P}4_gfEG(Vqu6tFWG*;_daLKCQvl}El9*?z6dAK7 zcu3+j)tobfea~o;^KG}s=xjLw7R6vtNcdT`<)b8neg<75M zH6<5Yb;5@*^*BKmv%K-?Syh=y*mFBq=Da1gGc}c zP|di}P)%1{_* zthZVyfd)+5x4OO6UvX>crRr6RCy?Q4`GDr56jq`JD^YbMl>%54(<=25K*&v*8!PlG zfw|Re?%3UiF_*r7#_FKwjnDCX#_d_A4aZSOadSxsS+u7sIfc{bHyZf7$H^p@8>e#D zQBHBgdG`<#>L{{{LLDdLQoiHVU?4JyyF2J@L35nT^{@#wuNk7OcL89SwHeRUdqX6 z$Xr}rB98uJ*|aYQj{sdebDPj=Xg$g`SbttK8CRDV(Tj8E&g2a}gtkz}1nZ9LbfA0= z9Bty9(V>otImd-M&Y5#~sH4iN7r%b=;2I4d<8ZR@iin9kmq_M!#Os$pD}f>ju)p>m zA%Tsdj`OU#)5&bznX4PQz`9dR)f%b0qe!V2F=F;q{AJ7bFD=!3@Nap ztki*tb8iWCoHhFzCf3=ZjzW7_DEcZq*jltt)1SBXR6|$lE_g;vDixwsZ^8xv=vV+U zs*YB5s6I2?5_?O!(Y4l$MmX=87lq5w$0bt1-*g4uUsG%RsZdA2xD>i}HTo^gwY6)Ls!eb>oov_A8SXXquJulR8f&Gh6$5i`5OjqslP?Ux; z=bi*i3|D~xr%erHU1vhf3UH`v9Rp)Pn^&I)cu+`AY@iv7^QDFVn7*DS;cra%PznFb zg!e&)vF#@OiG<%G{0jddxSpD7T#^ws(i+;k&#Et_nO8Kci{xFszGp@+UQmpbGt^Us z7qzJ^N5fk$@4$XI;@!%0(vg2gs)IeW#V$3y|HnzRwSpsGXItpg?0ALgpYNX<-EHc0 zZi(#Izu*b6BTU(|_0@0&<>eh3t6wC({WKEV+hx`J$k=dsQA1TpP3Hvr$cX=yr#iX3 z*Eu~{RueC;*_%6eEH70DPX|H|h2?cw?{RuUa_VlquUUxhjLUS|RKushKeD{d@Wap< z8TN5n5!b2;-XlAwT68^``!aHak2Xy@=b54{v1&mxMT35MCL2|tH=2Na*GIg7yDCdZ zKA(uZ8L!ZBuS5$f?UP+vUPWH467M@!sJA(RdUe@RoRkzKxMQ2T+rR}(m z%!_a#vjf5J#Y>}wKdMBnV)gg)J8|D1<|?J1$XJ?yhWdwbd?p}o2G zv7xD!a&@riJeZV#;ASLXtrZ_w1_-So&+PjkX`H@zv| z!+};4Ct1rXh5dSNS(=mKs^Z&uN>EmoaB!Dzaqx9t3CA^k*>~2I;Kp_4!r*b`4!3Q} zUx!+5fLeB_NBc1ZrNJF`9@AxqF#Onj^6ToT`f#eQbiSrO42pw0s55G<$X$j88+%y3 z8ZposuBzy;sXIq?44b+Y?RvB0&7h>SCZu{8bt;!v%|nwq@GBV;o-PXt_pD#a z40m|K&+KO>^3}ds!!$AAjGMw$DPFM`bgs!_O6(A@&3VNR^*91lB905AGFx`2zrZ^s zQh&w1q$$cXG`*=QwvkV^uN<4ev{silX2!NAVnpk(x;&a0dy|+HJR-@rZx*fF1i*P~ zcp5kwjQPz#)T{;>Q1pijO0zmbgEGI_I%Ymb@7FcQuP~r2qLu`KP_`NtAjyKc_!-tq zo;RP($>`%^#4dHQfkn%>GbkAQiivINIWfJS9cmEuINm!c>|f>wYzFXhK8z@Q0U^jB zcx-nP=u!{&)g%BP!vkK1<2@_A{7^n#mf^-U#adCqI5&;zj13po;&?Jhgv9KeK$qvc zXJm(Xgth1?-LQ6k)C{9iC%&tPV;3YR$k`>svP(S;R|$mX??B)W?y`;vHrpp?YzE0! zwM(rdnK6_?GT?3@TgRIGG9aeNd{g9sRFSlH{Aoo{_xtv&$+zlcxfUHpo_n~vK2}H1 z%SukLuZQ#XGmA)<3cdr3F4Qis-KE;}%I)#cT>#TSN{^b$N=Di_YWHxsqI)>Ffa1aq z-5O*?+ohfpR^WCyeik@<^&cXgkF;e+(504A9uun72@|Tu#Z_BtIXUN10Rs^8lO zKyx^)8H!};B6gz4`&$lB6A1qCo#lK4pH%%p)ktWr2s)fd65;Uvx z`RFx&D}8(2_OMCXngjha48zq-`nreELyO^_ILWvlgMiQb|*iaO#SNE3&o;xA41 zC;o!x*X_-7DvcQz#3t0L!Y(|1(Q zXzYm_1~wlR;d8bP6JH3C3lw2RSiAg^eUqc@f@E($DY>^#m{!U%Dx&z#7VztM2K*I` z)7laq1QOX9LrS{>wTD~{M-HW`HwJTlBBqsQ0{-hS@Q2c>mY^J}72!l#@)T|YEy7~@ z;A(-&Th&1lQ&Ec-DIn#U?cTJNHS2w57Jn8Lt_SmUwLfmu zEkFJQ!XhNJO4YFeBJ(?*eNX3PEFF)3j&)XjoVj8;uZS(l=Xeq$to-0`-P1bw5Cz^M zDK4hAbg7ZBm}hxTS<64~H5=<4eL64JI|Uie#>SWx`Z%*@{fgx43`YU7|!9SuN6^KkM6i~vSirhQVN8&3T!fGTUL8UNs9VntL{zLQ#idNk4_V{ z);YSmFYzem4pD1dnr@X0)Z$%=45G7m7#c~?!vzRBgSwY$6WLqnn^QH&nOeZ%LOvb9N z^?B3yYah*>g5mypT^4 zNU^a`H8yM2GOv<$s@nE2-FaFySA14H$@uOmlWVS>{+g1>WswUrgZ-TJ%k%9 z_8%gPU)HuD4r$Kj+Kyp)Y}_?)N-#LWh6Ajsg0T0vtdue zo~=j-A(fP7znMO^FqN)92~+9hF)Dwfvi$8We)RHeGnTjZy*Wqg+Bpx{gIvB`GK#{; z-TGTA;14UgwDBkj@+AFQMlKYaV&BI5bM|%eXS)13O#bu}AJ8{5vrds6ST%tm61Yh4 z$7>X7yPo3Sqlh%Rmp1kA`UK)z6O&XOiVTvRcL zAT!0CB|>Wy)?9!I&A>e%{KP0ITGa}K6{#D(nZvHJ3tDG0h1GmAfX{+Y?1Y=dkBp^X~FSh zix(7(J;gqC?5VbO+-YMo=Zay=75EPTz=(H}1f=idB_P_06U4QE^z5ISh&?@NiPH`E z$PbT0P0?n#x7ig$5cCc=S=-cU>p+u>ge0P$)9ZVAs~BOGx5!cw?{Aor;Ug*_rGAos zRI+dla#!d{_#9J)@aF=AT$q(X@nh}CV(Ql=c%G;TGt5 ze`GY4g;lz~T%p9yOHVcAwiexcB(^m#Vk>A4@TRtE`I9cUaXn{Pxl)IHt;exVuwbO; zR@DkKNsO&LlO%$I;?jwZ)LdWKz2^M4705`K6#&kUzASMsUh9jx>59Y}TEu61CIIJ6 zeMA&FpI{R|oQHw{V4(VFwd`BoW@;uhb^~ZO_Gk|%KNF_F3c+Gx_cqJg9YiyEPSVqg zw*>v6uTRtOGUa{$N6;49cT8|($zZ!c@|fgt4A4iC7CGw&S#SFDZe+Z#^KQJB+}UN; z#NB0McH57ZIrDdEbrXA_9))GYzYl~j-&yW_T^63di~g2x^@skIWz`kxnd!6YjJD5v zm0a7FZZyBiFc?$Y9GA`HsIv{5nojeQ2?Wa>pz^IHgKWR5!W>fX-P&axZhk{1k{p1g ziuaL)mokZZrEHG+H!F7W`|-n2YCLwJM&BV_O1a9jypJC?(`+jOuO`46CBW2>#Y#f&M2wvgOTfWy-E@}25U zb7VMBpxo)-vl^A#`($%Gw^M=a@qKl$wnv2;=%kv1+B((!mQ{)F4|K6NQ1vw(8R&Lj zS3FSdK}w)|1B>6+sEpq_Y^ntufHySKfKqdmPqM@ewM{sRwfN#(*8(*V9u()6=(nQd8*h0)eK`6aZHr0D$|61Cs*ORu$mG$-DLUq6&wcFj^jjSq<0Qv}Gt6 zj@B72Awy&A;Py?vx{Z_@XdkRLau}iy5XqE9rucC63Q_+ZWsb+9CaIxOVS)k0QBxFc zR-&e5ENs;DccT7#P4dj(!QghQKH9~N{?Tv&3$ui5&CZ(DQJ^EC9WW9xN365)b$FW( zi8$fvQ}|>0S;IUrBTPz8X=e=u0jHFUf5ywbzWj$LCw4PAf0hFJ_FwAe3HNxp1!mnJ z-PcrDu&RMuHpw#!>Y1F&YQk;}*EOT%E+HNoI1@0{E&J1ttJ7sucd`P`Eu1CbR4rL3 zlqiHpO4fh{0G3SqMI!CT1~krOd_e+79`C=&X2|j9HuOlpn=?t4h0W%?c=~Q=ty;o9 zVTaMz1y0x@8VEz~90aTHo1k|&5?*?AVzD?HAxN68mNOn>7_xtVBDVr9;^@u}v57n= z;BaQLUj5?<7Zbd*P~T-?C##?l-N_a}W76WjlsFFt~Md)p&t${z9*e`71Y zZ=coy(#!^gL{0xnJE8gE=u95X_fY>)_wgp=RHQ62dP6JBfkhH za@`e6J8oK3HL+n5;oe%oZP8W3stezu#aB9TGZp@U3vypx2WIhV&w%w z7}={c*sBh`;sLh9V={t0(OR{{Z`YNIO9Z7D_gR5mRXVeBx@&wF2`;5&zK(-p-w1b1D~PJ(-xc<>MXJDTEUm0h<=75eh#St zLy{n_r^~VN%sDq#Y?Un3qomEQ`&nMzjh*c#%0PrvKd9<(sY5uAOH{{F2m6U_mVPWV z)Hxm_mQLS-@=)iQ){-yb?4iyH!PDgx=!kbW2bOwBpXQ306zUrrgP0^VuRGd6qe9`g z(5jfjxB{wJS?EFa*7j%D`dX-SignjSA^y$_tjJ<%BR0vZ`v~le+Gy1crW3s7xk@@k zYtfKGl{0h}cl*-eUj4e@!ZVO2wF*ik$tbI}V~)7jGrX}v4P0X=+F~ufNyFr^LRS&c z=wxdE5=Qo6X5FGI%UgG!(Z^_!@HIZ@gjJWT2lyoL5@p=8<_?yYm=qK@ZOuhci^(gw zfl;#csiR=5Mw(9KqZ1gg>GIntaykEvZdd9uN z6Qss>f1L4%^o*OysLjmURL+;oO%csf^W-~SjobK>dk7gzGTdB`4|_=Hnba&$gC)rN7R>bVQfZ0JnysJs`nP*>)xo&kWU8G$ibneg-kx<{nc(+pvB;fjGHB6#5>Te7%l2>8PfTJWLa~fJz@{K zz%bonk+kp)=#TW)GBqDdLB_j#yCdT?_y}g{b(fOeU8MdXwPOz0D|Rm-SLVZD<LMFs*sw8G>9FTwOr+f%RAI2m|ScLjrbdUnPUs>Lq%)# zGilUWuQ%`N+ZO@jT4E}=qfLzysWAcksYHijXv4&H0xDHw=BxwH3YEtCnYCQBt=G$+ zY4Yc=P^X9LgMZX+!908Jf*K#~1st+0nYd4g)7^xzdQVNr5CsBCGZhnAB#~gLuf)AY zoGJJ;1!F#8pb_s^c`nk%F5eGnPp;5NyPeD+ZCpYXeA zIa}Fj5Bn2J*CiiNqtgW?G|vO3_~|AQKuOOdUDct-Nw$A!q(-$-Er6q>G#FQGIvz}%}V&?Ml#lh3eVcC6>MI2Aa zf#Qzd!2j+GU@b~kB9@yqvsE=pk~*0UN?mTgJP1ST zP1f{?Thn0@YZyYCS}&1qiG_sW<89CtvasH7tv1I4`k)~6hEKMi|8b-Z?_>KsKeBP|srk5lp|h`jYuB3L`@~XA4s&?i zyO@eDg}&LgMZD({FhMUYK7yEYEO7T=WXZ`i|Le1z!#E5j$@qytV}|CU~WJkK|{r_!(ST~>1H zD!%PJ0hQ9jQCWJreFfdW7G?)M*QhN3qv@pEX1(g=RJU_{b$jgNwYmS@>a%AK zl>P8TcA%4e3e<5lO(F$Y_209!7}6LZP^`#hnX~G)5~~-8**b8jRrfaC48>5>UZG>K zl9(+qow@e4T9|u8bzll7YKE$3WfwS2LxRkJ)p=5Kj1SjSyirk|SYH}NFd&y1F-$ijRPUA{Oh-)g{TBs>Y8~{oyCBf;S z@`J@%X0qyS7BoE$QFYlr08y^$=!#QXmirQQ>v(;~0EpCUiD*4KU7j#i>h-?%7y2Um z>WR55>ZiwU1LgGmmm~`>r{nbbJB;_1UcO&L*CcAx@hNN`oQU_mm>C->)j6Iay1GE7 z94w#5QZhbR!S=&LtP!Iz6j8;y4n$aQvaBbjpHS7NMJ_5f!!BaQdVyz8@yicg%AmDv z%J+AvYJdIHtx}bYN9HM6jM*JjC-7IRg1-qqz2R&H2&Qy$k@NiPxZnNSTZtYC3ACQ$NwPU zdp^HYton*H5o5Vfdqoc#<1s`O11ePm?L>)jJnxSlw))VJU0rhE5I{AO@o_zI^a zrul5S9Y&}6(*pd}$coPSiTbM0GJ}>LPd!k5% z(Rxh~_-fO#$a8$gua^4zCu|VhTWWF4yT)W_vhe4=x6@(KZ_L0$rKugWk`fB<RPpAq<1yveTE4D2LxKfr zun;k3jryV<{tx~lWRUJhZ5cv(vj2~*0YHU%~t0V6cA^J_BY*DSbTG9Pn2Jdg<;n%+5QJecY zBh@$EMA>~6n(rW@1v4G(>Uyi2JwR3DVw^^8QSZn}jX4Y%Q{|k7!e0Pe z9UoTV91@tpY2~fJ)~xQNg38EQWPP_X8w0?NU0YWpj^~PoJ$rQ)6sa$cYGJ5Egl$>G z3&er7=;(u^%SNr#POHntaHqer3H28yb$MfZ^u%|~rpi(4aL+lRp+}~Fv1~gkLO986 z6PH%mDvGlL)D_omz=g6$Cj=QPm(4o$=HipYLA?r0IOX z&!zE}Y#Pi35}4btq0Fhs2XmDiW|WUXS0#*8yjIsBlT4s^PVA#8v@K|4PVd8tGd{4(v9Q^8e6ZSqs6wAqm z?M4SA*V&?kVHNjFMdB>^MA3xc9TEMkr^by8#)WBk^;%<6W|0Cz%*MxlSCgw;^-Lxb z-KsV!#)3X~nu$Whne&<8Z z@uM1G&$?gIP%#dM%a7)1iWf3{i*JFSe3Q7k9WE_fJmM}|@|E0@Yt@gZo9MtVCt^?b z>*Wo+opBsd9M5N$HSDaN`A2Oe!|miic>V)r4ek1p^3gE9;nE**qM}vhL-|r;VSFxQ ze<1b<>r2g;!b)dvaCpsanT5fj){1koME!AID0Y&4x@ZT+%b#OI7_Oh%kUjR|;5kxR z#5?i_PX=1!wF{*MobFr&my8XgKL3k6+O&%8>CnHE7GEzP@!mDJWnUP4oiHalL+>LY zR!!cqg~7w9t|VLA-r;9z=q)6v#UyDR!dS%CzYE6j-=vO0CDiV@kqj9=cBkhBO2^IS z!#>Nu46T*)bD++5s9wc59R6lSHfS4nE}4Y6HLHvUwlX-N=Ta{_auD9)swS#-a?+%a zzr7dl^<=1tavm3%`lR$Mfh@I>^_&Io0Xo0)dpb{=tc3U*LgtkO{S_~$o%yIBYE!vp|e#LoMo|1TEH1&-aMj2g2|`d2h<%}j2?Q8t+w#4O+9apQHPu-K}j z#hdh^TZAS5zAy^zutRa5SG+B--?{6L==nnbMeK)!mRkku*bV;zAT=$Y4hg@`*b$re z?0nf{3=U*tAD8zyA7#$Bp}l8YceRlrwD&A4auNXyj_Tw%1Pc`O=9z@bMztHe5CZl< ztV<5I>bDUuJ?py#8q*&_affsW9;#kac?5hV^Z#hwwUxFBy>8tl8Yus=83IdWYLkqW z%IYM)95#s0(1!A+#pP?p9v|%6P`-9?dDH6hwI|?@y}aoJ@~4emK7WP==8UC#d zm$>GAKy4)hA_ncmpOOM&+9|M0fFC93yOMgGt+98B(0=q@QlCGH-9tQ3vo~vQfv)r$ zEj_Ra10REdNS^?_q|PM>ZqKq$5p-Je=WO{iqHIiikbN!SH1CnNP01ZhVz=Y~O6v4y z($Zf~rGH0Ir{9&9{zoFwZ@i@a`M|S#s<()Vk7O7p+g|>jZ(qXS3+yv7B>I~?9(}gU z!Z)fR8V5q2rwe(iIfgu2=``fY>Dp{e18##%-5c0}&`}wyxpPrF%Xk2TDbbruph@xr znSYB^Z;(mgCG|082ko8{Z!-*pH=0hUbjB6&S%t`Rq|?C*i?utuVCHITJ&dB+&qLA) zK5;5anA%Sz5tZYVb`RvdUMe+SGAwQEq38PpsyAZ;&d;~2`I}`=<8P*Y4&CN@TtA}; zy_5v}cB_&Sl1o3ns8%8P*#^G_)u58sFLmg*pDeRyg#Jhi~rz}uCcKM_f* zi~rCeP5{S;K18H&<_0tQYedNYP#uA>P3jZjeB0j>2WhiRjkg-WvzD(E3z{H-SA~a)LhTMuFpo9=dEO9p$ z34ex(%Q12>20=#6;ZW0vCUPm}fcokj0McZk9c)eu7HF#kq@RQdHwW$vRO?&~cP8#+ zWJmcXx;n`3W=)^QzxY83q^EhGSn_A4|50SDkc_g$`|=N|J8UU073YFoIoU_s=N^&X zM@f;bt2J^&`))2Eu&W!%`O0L#!4sGdREhIZxeXv%^1Q0-Reo*rUnChCGLG|)9cQoW=+YYN**tu zECsjBL1R*qZ{IF0ob}Xy?4zjtZ2Lt1o?|V!-LzJl#ZPP zCorFP@+tKcVWTn(aJWr-V&J!x*-;w$C26V`Sveodk6lg`s6i2q+JS1BxUP*=5T`8x zdg{Qb3w{ym^jq~E^s{zd#@*zQt}K_lRijqL#6p00W=`yRf}z+1tL_N`{!#0#x_c9W zJ9JW>RsWoeu7)iD^I=c`&6S%Pp1J3jgE(r!h|wR475VqP=XV;lGc9SkQC@BDv(DLM zE&n3Vf8;8wOx_>wDGPdM7FXm#ojvT+Vi%B=3_0;pp>@9aQG2%Q&JBt3i22P1{$I;o zAzHbI-=6&9`pzJ2GO)zXA(IPGuC+)M*Cbji)&eW;ujyQoeH$IKua!U5^5+8iQzm~- zkw1mLQ=vB0RG?9Mv! z{(`(3i&(n5i0m9R{{m;_a&e^4hno@D1P-zXhB|WXzC6ln=cD`rUBw!+*mpXsg@yi87_M>TPzVw z*xpS%|dB>plN)`&AJbU*MNn` zaQ7>_low4GZ;)i2Unqz>ZuUIQKrh`1E~*KFnQiLB2Lwr|Sku&XgVVs!ns=ZmCk{aa zu$on;2px{6pJ_jV!>*f5dkaU4La-iy1_My+moOgzW8rY9Aee9{)vSK+4oS26!c_OV zlxIlBnqB*|e8!6e+Y661n|9&;r~Ou%-r5b^Us7I-8w5eZ@o#iFe)4Gq*ET+FPo3I> zz~E#cZ@m;kHG7asC+`&6E^lbj^3FHRsZ6ej7|&gYSD@?TWfUhbgFKbtyk7jMk-tZ> z68;GZY-K@_?OWNf%Xj!|O2-E$=|hjB)k9j&&D(aPEbyokjn;52p8#II6$|jXM`d8O zx0R(tlLh15J==zCZhx<9rCRh5jfhino?yJ~OAkWrTAT~{m*K%F1E)G-tY}-K^EuoF zM4pexUKNa6FZQxt%ox)Y>{$_NJUBj@q8FzX<+8sva{S41R=s%Jpsd^i&7r%80+;&m z3)x5?O)$g9MjBVa@K3ejtmbefN#>`JXqj%Ch$YplYFWzc)($Yhbk$Eqz zMa^X1$NoTrIyT~cEzVYY5|QSlb)agyUlU;t={sF%cc;1rv4Kgm6N0;&0+J>h>7D8y zA{iwtoXg1-FO$cT3Kyz2!F68Hsf5JZbfV+?lj^`698X=fm#d%<(>Z4uO zZP4L6u%b%AP&P^+8_iN|bF9_83EQ5mN0V7?fiRUyi z6|d{G5@j{FdsrIQvY-15p0Sa}BKP2wiubd5GBdlINIU+%s}k*{mrvM64{>dy)2jKy z0jf#Joyj*m<(awAErXc2vH7POOKBbwOKO`hN!4+PxHUw{yPIQK+JAL!FP+zN)4+w+OIj=R(+?ZOeq=yk6l%<9H;wIX z@)t)-GW9DNs4IDSWDil2U)w$Vd4)BeFDD;xh%A@0tSrxN6wZ=qz1VwH`dfP1HiPp3 zqu8l%wi}<4=&Gyg*XoCP{zjL13G~sruCBY$)&1uhy6n^y<_p^kd-lj@XhhFzVI|f@ zQD%}SPL%ahUEv^daFohxD_0g4uyvMKLp4(nt?)i3r>yuzO8rJ?unnEvU!*Q}<;5tn z{w(3}&?j}&`*wjmG!gdREuSoA$Dt>HKG>=|<80#MZvo*2K*%YC%-mLBHrK3@7j0AT zVy5mf|JQymHT`~?eWCQ*qnl3ld!OiXLnHbTo9OqqM1h!sM7IeG3gkVxg8h1*k?j2! z!X0(*|0XrMy?;u=;h|6KsATVdEuZxMgkY-obBNQup9-A+wfF8mFnvCvTiK5BjXsiy zsk!leY>nC7%LA|M^4W3065o+>pg&h_MShZ{+6RH@hezw9Vu3Nq3h+XiF}|pzuUJp8 zUA{oP%!R&0bJG@xTq`%q-($b24yFw`f1&P;hAt}Qswm@_tL9QaRkP>U6_&6K);=8^ z&pj7N$2alRO7Tj0V|q&y1b?8n(bL~QFJ8+V(*f(byuDXRX>TQ!IO|e1B<_}&T;6wd zuAxUsuJwW9ZMvQHyyMF}gA*;EjYzabWj~QEZ^^S4{m=P`5)Q9$w7l$tQbM1MAGMCB zH>--9Di`G~)|Gj-lZS_~iyM?=2pC%k*WWyt*YN-ZwZ8An5Ni%O4og6 zj~3~oQRNdOHz9}_nTkQKmzYENFhyho)5yHK&lVTb)m^I#r>R^%0bsPpr@D|C%c~`bRVUP0ypMh zlL2!&$#2z|tu(W}Nkk(u#|cvT7yQteM?<8Cls=wDVt1Tqmq zp1NLwVeKlnm+DV$N8SdCGEoX3>I2ppe>_#^;|Hqqi}X5QBX_qtWu77}bG=$7UJ-Za z&77lAbQ||aSsn(eMU+~TA%H6%O%z9CcMz5=n{^iZLzb2-6WlCIOP-pNED}dwEapC^ z{UsY}B_vBko+{QE22oG^nFOzgad4Q~tWJDEWJqqgzylE(3*fyL z%}o-lM9UARKe9#@=rik7uQ18N!+BcI{{C39XS1HtJ-ZW#bRM^BAMi1&tn_5lyNv`- z0{URGTpZo50Cy3HN$cJeok4f+FJd7CFHiLDD@>CQ(7T(d!1T^WUXa~ys&|~#UMyYI z%h84^hr8_L;AT~?ST?mmZ{6Y?6UW@Al3uYw>SM5wEAQ8GWh`eO7SkIx_?P+UY;3K3 zrDV3^_Y+jxDOB5Eh1sh_rXK>$PIxjqBVN#rVt++p91b1NJ5E zoH97#7;;!fx=)Q>s(Jr>oWOFWFTDR5J?qR2B*ph%7a>ouuuLSsxM$27t8z_XM$>XM zFNl-Zl1W|gFeHYDP0uX(x=vas9XgG0@I;esTsa>y1CB}L94k2|n4CqD)58_Ac#zwp zxJt>XB6s9?RVhDJV)C~95jm5%_YG>sPn%R0@vddl!D1w^;HL*B z4wbpcT6hdW+cvl7nw|_7c68`R-n_UXv^qBsS`Fpx$_zdX1woKSX~qlb76eWsm-VI# zAlF1M7Qr^j1Jx}XvoqA+Hqdpsk$%n31)9En)SsI*ke8b8Y+xwr@?Q5xgzXT|pM~}g z3d-JlEXiuZLu3t&IFWF2+|ca`c@9)xJe-`uk3W%}p`8@s$^&Z=Hjg}%7S5_dCeE%1 z=fZe&Tz-W-GYbKrz>;PIT_gVWuqPuC{#e3H9sLjbaC`&Er+*ujyX{JTyIZm}noe^2 z$tl2k1DK54v@%s-Kp!vGl*J=HV}@V-j-!F2!;7VUCzuWI~55>dB4Zr~ZEf$0k{ z_^<=U_!kOM3&|Bwj)f3J%3H5KBg(W?;T083AtJmJYpw@^Xt+jBV77?C`J- z%SH{u=HV}lQ=&fzwJv%zPJRqi|1_BL_J^r31=EL*YM6cp8|e2 z3Z_GT8YaEOv#$~Y;#SL*Y_KYwM#SH>vi4M#NPHs@>A{U(M1H6x&A+L%PE>W9X}y|bDfH3RtsDwS zZPnY@Z%a*&K9qtYFCB_;Nhpe?@e;S-m4!vrv_=EQj$L<4>bXSMBM>c1K;#XMLTsz;h;Uaqj3=VrmhwgywbH0BHW_Zy~B7z)f+3Bv#;^N<^IYsdv6}7uKZn+ zriMPE1qoDxTxVW2`?GT+g~lgd1%g7BI+yX0UIizOS@K}z&mPF;1nIoY zGgtQ*GcJ(5z5>5k?5E<@%g2#Z-EcL$nf~x5QIiHKFzT(qnDz5(1Cc-`;Ee(znzTaK z2@?-(gpsfIm5eVDYOvpf9k;sF0PQO6u5}wz_RKkW#$y744XvY0Ai`tmW`D)DrvIlQB(>Z=j0EZBTNXOV(tkq_q zA}O0v$Lmr}U}s$*`}bdP*=AK3-<94m@Go$xv;01im!oh zk%v+0rG$TxjDHGGK8+{P1D3uKEP<@>yjFuNzVRH{lKGZd?RUE`!Tms1VMd^L&80Xx!>x%(c2%tu&g;3z3Vek{geuzZN=8eLuF}_mOM6ryr!h0}k8$CKyw+ zW^7hQuwCTDRNSo4*fWh{GB888e@P3KxZ$UfjS^vhTKqja-j(^g$@+byn<-g8eGepB zCcR={4(u)&n`LynyvP2Uf&49KDABNmz6=ycB@+mC$G?m>B{%aqQX{>~+a|OxB?2N( zepyn62xjJ%3<_n7H+Olr+>@+U=#*;BQW#<#EDHxTHRAbuo16Xj>2*40e}W9E_bIYx z!BvIP>$`h8>6_=JYILY(kEg%?nELL9mv8Uth8Ni^$v;k|kLTpd)iWSUVcC7KYQW=J zLTPa(5??%D<&X>N%2C&orZ;>cQBWMX{Ml*cv-T^0Lbvj_a!> z);2#Y-rw=$&?lH$KP%tUG(jJz`E%p{AA4T{-&B?TpEfPDY$vMF> z@j5B%E8=?iKTb)Jrpou?5{&vyOXFQVX$KE`SUWxy8qsK2S7H5u=JVo&zfkH!j4v>> zplkMeFLm``*)s+4+et*1&B zDd-TzV!~!S7z9VeSLMM6YCmsYgE=+cGb^4qOBkhfolD+ianjBA5i~8N$uLj4J$wIJ z^Ek|jBL99Gzh%Nq*@#kk^V?Ea&>QAP&0}b(Ty|BS8FlgI?Z`p-{7uE8ZGR5sBDeRA zlxr(00H!Yw&f#Cn3x~VTePAsOW~Kl0nAur|h$u(17g@qz8ICA~8Gxt2m1%Zyw&Iib z8Fw9b%`^-yr^ECt%wCTXE6F}-9CSLmPSD$QdfN^hucr9{!ZD_K2*tdN;zG}*Jz(Zk z@M3>Vwr2Zt+3Wr0Nrjk=-UvjPM#jVA-4YTKo(03TA^}1iP3Y(!w zedn-7FfGiO1^e}H;FI^z2WOR@1?}%wln? z4L!HC7)*`z7HUYbxXLb)0FnLzvy1v5={1=T@I6EBs*;~NoWck6U1kwR8R;{_H_hgVz%{<3UtE~gwnR{WLNYPm@c_mZg? zfa6k%3)T#H_mY|H4%Y9Lz#l4dxRV|33AkLDYI854@j8>&)CPM%8yvB11FRbN5~(L9 z`#9#QUXOhkdmH!?!|5Z1s`K#KKf4rLi^qFdYYkTr{Rr7zU)o*G~{^lmXo7dch+u@dsO>Big2ZG4C3qMBeC~UeYL~(@@{1>qrk7$W*7GA9Z_gT1a zksg%W%8m-5v26Hu%+uSE729^Kr(uC0A6XK)9pBug;bUoSOz{!du6E4O+mROAcC2Vu zJ9aM7@bTz9F~!F|+9(?}U8d;mNQrGbh6lAnUXz#Opi}%EY&fN1jj$-a)MTff^AOJO zVeo0GmN4WZ&y)Vtl?I{LSZdzJD=aj8f(u?+s@Je2SeAK}ZgLxME0R1_aTus!aD<2i zm=$^x`~E~W4yvGWQU)78u@RHh9V-+<%VF0n=}P1ga!$9@)Swut2v6=D-y$hrD~jYK zm1Gmy0IXF}4VV{NYs>Ys@=n5Ji{F(hndMSl+0sFHhTGg(zTsFQ&cJK{)q0Bb8QwOV zPDho#?$SH#fjR8lU&9zdUXQ~BFQ&{FAp{QYrh=eZ9GyQ%ddlG6sIKF{q2O~P5*=fw zr&n02zhh_$z~skx1x)V7g<+CrMhL~#&2$4yPLK-FB*G+4crs$LI=u=>G-S?~kx3h% z2&`MB9>~U!NlRtY;l+eZ?-IKI7WZ<20r(7EV1E<{Yj^s>!&Iz_)Bm6d6z&=$J&8NQ z=?LI-I1=KdRYK~0c&#CI3435j9apU(wS;EPrxH?W>Kyo_DJ})4w8xU|KX@j6FEQ?t z-6@GQGECe*0@EC{2cd>MhE>CYW=V)eQ>6iVRc{EaDsMM11<88MjBIm$#EXxx5inL1 zr%IdPq>m*N+-KQ5`DxPpNz_@Vr&~?MBElgf*pag8@MXNKo2{03fMRc~#l}DEJHTk% zfeAmba|!Ku1UxltNR2>Kj4X(rMu|#g%B;H_08k7naWQVnu&}Y;Y3JyqHn?2)T}jlh z>WHEk-COD8@r;`H=V$P_J8v86bI}yfZ1PqeNX`vw5$vm%n$9_AEh2RAq6dpUCh778 zm@g5Yq|4nTG=i;K9FbtJeGy2o*_U;$Z-t@PoCylOra|Hz!M(%_O0Cd(>$-UwsRrKB2B~zt)$j8_QZ--%cBJ%HMzKPxd5bh! z#lCMnHaBwLQuWs8F>>EJa(e55(~Z;$*|+}X(g;?*Fe1UqJ`E(8#nHLG6~@kZ=2C@T z^=^$`M?!B&6%qTEO0XrPJE^zW8azz?_s9`7kLJrWCBz%zogd8j?o|8B-R_v3VLt&ii~FHv%=LVtkw%poSw%~>EncA0j< zibY5Ym%Od60ldJa!Pmf^hQlPe7Kc0DOED4nGPe37w3OY}Pr3}D36y;kN%PIrZkMov z7JTAdQ*0uKASC??5v~ByR_q*a-U5#cPrt2WPjdBZj)%2xvejOaU~}iEybxE{NVI< zL+oIPpQgYtT(9BN+hPI3Bf)fNuF$Ylg&F|EJe3Yt2GGG$Z_hUpqQ6WC7@loWVq~cT zMVVg5$q}JY_6KE!=ciV1_;1nRSPm;LmT=6uUV-C}dL5HcM|h5+bz#;ExHK>u-vU;1 zcY}LJ$KQqFQJZC%+|Ll{Be0)+b+d+-zra=kUYsg@+uhH`8T;AIa9)RJ^_NnOUc-f` zArLE;WdYqxiB}Plwr#^ORIlNK%2>ki*wqRQjla>bbUSM3JPZ#9(_xxkL#hnJZ7Ll) z(9Z%WvHBVXiXU;Ffg)31gtZk8ifDML6%2pW%b$eu!AmiNA?Z2=hV%70_TCyE2CXky zmZ{xK?{gh^7X~K|%WG}uv3q7~IJcs`z)6hsSg$DxM$XV{_y`tRAXRzGYXKdsLohVW z(qLGG8e#{-xTy*Z*XuQ$6cZR)%m14+7?#7X0SqzIW7Drxp!lO+$0XDdo)QuCn8Hu3 z;5c8eV=rv3Si*s`Rzec+{qGoM3<^!hMC5Csc=%m~AHcNdQ_QpKD8Chrs_%}xO#$n7T zF+lt4HEf<845+0(Kpcj*H`;>Xg&Q?g&Or^agJFcqY!mbvy2S*BR=WC|=^6}6XE7LJ zrmH8ZEGO!9*ic7cmkFdqG`!RbhD^Qu&u@w?43AD$xT(2J!&4RN2nU1KZ!Gny7&O=$ z?SIz_C%PPQl(o^lQuXF;of%8k{4*w%Sod0XgNBe>P(vU>__Dz6)w+L00mCG{hMqBn zVIvj^7!2QDufg#2j99?XiZvh5Yp|mRh=`bVukT9~C`Rgad{G_&iYR!g6%3n7H7wPj z{8+*;7E7Uw5;OHWPKyMC*1!0&*8Qsk@50~&GaGDLie{Jsrlpoo({OU@jSMH19kw&Z z8tsgWiWH1oq1RwR4T1ejG#YvF3&WQVrC+t0hAO>A!}%bzw>>5mIXVPP_o|a0^g;S+yh7E(S8FxY zUmuJSKA>a4x1l32{7J82GHQq&41Mhi4CC|~zAKFd46S7T_Nz23J%}3GCG!d2fz!PK zl(^s$1q!EL$EZk9L_vpEF!a;Qe|=hPVOXL{>1VIh@N^UE2$T^)+@$p{Uhhn?eisFv zTJ^czQ#BZ#ye^jfT4_@#U8mPjfEvPL$v7Y0emr#u{wX^A*Txe5vO*Ppy@mqRaBSgk z)lYU`p~HVoZ2QTCixmvi>UD6aBP<3w(!e{1+B>+oM4TllY3wN9;G2ZuUh0)G^+ zw(9F9y&WsAiY2e#V^t{q{}9|;SzMTc8p1-_G5wmS*YN$7v4r6TPJ!XQi5d(Kp@z=G z(2D2g>ouGs!w~(rFoJ&lFkgY9pI*o7QzJkT1uwON;l;}}Ed2)M$I?bPP1PJFdL7A; zVCan82$i=LPWmdT>}lUxQn(gxt4aC4P0%oM^%RDYh0%@*;cF0Ry>iN^kUmJm5xa1f6`}3Qzi&y3O%pnhwQ|iHzb=FDqbsLtqb7 zM=kV0`oFOXo>mrXc$$YAg6JKK@#8gm4gF&Z!<*w27=CbQFuZViEMRD*8y?kbn1CAE zr5gy}fjuvP5{GgXD8}e@?3oY&iYR!g6%23Tz#GMq@u2)z!oaEWyh5*IcqACK{uZP0 zV-z@PWj{7tqTysgNi6%<`12I1UZ>YE5H%cu{`HexgW;viVhKa#`3ek==`~D54V{Of z6>sL~HSD`Iw!HaxjsnG7yoM(a>Ie%(6ui_52B%*Bs2IcWi7KsA^g7lTM}Xmo_pgDP z{m9nEA>-n`t$NsX<29@gM2jJHqSjz>ZD}z2Abl}fq3cfl{A^s)XvAPF6xU%l01n}c zcb<#iIOj+ln3s%09w}EE*RU(TT-a5{Rec(_{2Rh}%@$UMZQNG9kUGQ~r$0-5Toe5n zVvl1#1;y}h`;X;WnT*2#yxw;ynw!|iQlIRl*u>z=IBZaetFyKckG8tE)Z>Hl-gqw> z(i`u2dQj5;-0u~5!|h#pP~N+;&6UJ^mQYN8!`>F&yb8>(AHr}UJXVa)m%^#X_&g-& z`&sO}yzkz_O$7%bR3+8N(N>l9HiTib*w*pFa(ZV{&lEri$|_}Zjl;wF9p;8&cRtUF z`8hQWcP17hY~FePb%WD_6zS>%$YIr-*wzdtC6L>qp zZ|$~wPxMplusqAyW<;rI@jH9_&7zrZy8D}R58aXITPt)&=D>&x z2&Trv0U!JXF3Bf=^9>9lo*eol*MO(r(WB_YO{buQj)n?NQKTXBtHnwg} zWBAr6F zQY{dIN1R+W*6&Q>{7r?q+ZVmU#@(1pLV+`7LjkefQ>=AAP%YW-w^c_vt7C{-iIu6Cm3#RyhnqFcxQLwrc%wJHnkqjPj*Xaf^;EAVkDb zEb3rujObrG=)kD%yt@d@Py~V$ff0&85FGL7F3NHjff~A~1tUhaKP|GXtOz zW-_**P>t>aMv$qvLBwFQ1Esk|I_*H(k%`l*+y#(0n60IAd5&n^6zW@G#~uiD>_I?N z&~%D+<8X^r)G%vs!_++rM+YyBBaS9s0uUh;9@VOzdiG4<0i2FK1aR&cF@K(EC@MAmp1#)2&x|I zH8A)n##$R!t$i%P2I+zSnoYH&LKGc=*J3=GC^(Y!bSy~o!e42riEI$uvSlb;kMN?K zRFd@cX%z183A)GCa7I1!oSNpIDAJTgk>;W((hQCw&4IMYZGJO~H2;YrjTl9m8BwGu zh$79YQKb3t)X1>E8%3HIqDXUp6lrEhk!E}pX@*9T#y=!7?C(dBrap=^4@HsYmMGE` zMUm#rDAJgtNVD^l$oP3BiZs7(od)N7*4dN1dsZ<2gx_=vC?rgs&opXc(ONA z(WzAZz3C086zAVnoJ{EcJA0%M=Os#r^Bg6_InHIY)@_znphXnz{9d`S2+928hll+R z&!5r>97Om{#es8}iunv-{4qXH_U0_1<|cd7mFvmMHBGtpplbkLN)aj;cq!YY;iZJV zG2o@FzBOK^+}jzv-1MD_mxl%i;AQIIsPOVvv`EGaYb@~c*#|OS2%HdjNvmoD?%5mL zhI{t1)^JY~I|KLQ8b8d-2!Olvq^RJ23M~qR+xLE0xKF+_7;dE>RBq7VZq*MeUuq5a zjJnRieP}OoQ_qlufdO#O926DY&!I(u{ouRz!uEso#cja7aDCfwFMP2z+_$(p1NSJ6 z&&}xpa95;81@{WHC=l)+cZ7v|%9WN(&o&7f;Qe^=?hu5CP2zR(&EGip172TsF7 zb|Bx+92gZIo0 znq6l290~{HUCF|77KzyT4Lk7NUCU-*YUP6`Ypal&$EjKF2PhHFk{SbV#Z8-jedSdU z+E&nSymBtKpPdNWv3E2VE3zrJd0mb1l{6X(JT!1}s)I@Q^~s+MJK^5o;7uAYalPBi6RHP3=zx~uXn z%N$7`3!hkg@!9J+Pr^F$I=o6qZj=&0OF8}KcBa2DTzV=!iAtBto*OQ0h_>XnGyU^d zg@HAwEngxn+=8!~*UM5L9x-y;m$ftfu(0X1#z2P1kA(l znWf_p0J1x>)R}Ah)@`W+lQw~?!Mn6L#|&z~uR4CWc|~7i{_M074t%;?y^;?(Jx978 z=lN?UWHCu{q^^vf>?|&JetcTh?FkjU_-!G1H0`rIyo!?@-V3w0Rd2J@JPB-8W!^ZP%nN7|-`Wa0>8MfRem(78hs~-~YEOK6hgB2!czUj=vUpD^i zxoBUbc%HeOMCR=<6%& z>f-E$61s8tN%Xy77uP#-8+~JJ<5szbk6Y(D!-gfX60Q!;)V-utZ}|NLRNeNvD-!6% zb9gbX$=3zDZxYAB?Y}|pNjNSHCuOt6ZSSXMX#scPraT_2aM3`*CWaC z+Uw7wUZ06xf2Q2)E%mJ1|F}_Q153T!@4a|)f)8}*|Lfp`@74$N!6$eVnGZaPHbQTID)fxfUzeLgjjaay?hMj#92?DA!YzYk%e1lUG~3+gk%Hr`b!&KW4m=c?j+=HJ){;8YhR;SF`!-BF4%+bk z$YYO(DaSz@-h>lLYI#Iw*b^iF|&p3!uv8*2QMsyuj@O0fz7eKBG0i^(?C>s15^E@vh9f`p{xXdBTZfeLNoFHf>dE) zhRJd-!j78i3OI4%$dPHvY*zt?*{%$Aw#$>S!Msjvv@Gi}ywRKBE*dEuOtMrXa-OMX zy`}mfx+Zp7TdLnxZ~h?PIA_uZ?5pS}gMJ1G2jeU?klpCO8>QdbOeXId>ehHze-0j& zKu}n>Fk#`%GoV1%T<6hNxlmxrSE+F z#-a40tTbOHe&c;-2xVh{xh(wUnbsCqP40y`YYQfsd_Aa@Nohn1=M=Or6>~O499i^_ zAIAJVL-9zHvx~5BWLMX)K;qQ=21&$%3}qNPM;?YwYm%0lHDX_%jCuBE-v{crR6CoG zony^bUw35h31F33dhVgf4OTh%9i3HjF#p4kot^4@7i{71TyXOEM3Y~j>1>hx3N237hWAwFxSytP?pN4M_bW8h&AHElcy$+~x@VWT zXOFCdLkoxLhU!NtGf**hc82BN`|)64wiL`_6mXb9bL7a}Cce(N4R3mkm6?rD{M1GQ z!BUL_{7hoONTCJ%hbW+!Mzd6(jH@7l{|mf+_EL zlPZ+u*FT9QA?25cXv^eRUz$1zLosKTzUrP(%lO0Ad(N`9VWYo zcbM#=8z#HJEHjB?t_tFv)2Lox>r3JtRdyv3@3fX(Ct+#%_?KOiPG)p33Sf-CDvS{% zukL6=UbUd(DY4C-OK3x0(Lg7AKe={{eU8+cD^+ULv)zttq{#k5_#Jy|s`Jypb)o8q z@ImH-+4+ekcV&sYa-_G2Qj=V%gj_*<(r`>5ZVs))NE4D0`;Iy$DKW@O`Q}mi#yKOD z5`)Rb7~x7pW%iu7qr;RAfWrNsI-q4q$=5 zD=aX!a-^cYGK08bUMp^ZP_W7i6Vex$WKdY*|HU(wc-JT+WG5h1hmisUUp%Go#Z!9T z8<3ayLe^S0fiGmORgOcNe+F9X07OKLwbpcEI8|#2XW^lh)_Q86s4ux4&|1n|zh-j_D~JQpm3Kfo4b=<#z#q@J zP*zh5U}k?3B%X9NHRpokNKG{pvw#PgblNrw53SXd|C^tKni>T!B@nt(YHC7@#va`c z$IE85GVaGrK?UaI=BGL^_rNg=CP-QJ(=)$*NM?tA%#;qHtXiNPWI44mHxaXV^G;I~ z)>6_MLP2Ug(^&EnLP0*pUFBTnTDG2UvD6pj8?9kkZ5ga#HuQQC1(DY3N;Q$zq7^)L z^Edg%Ih(ZBb@XExdJ&tF`I3o9`rd)c!+FFP-SAK@EX+5Iy=Hw4#vsXIR7R@W@{+wo zn(J*`<&3iGT4PMjRF}p5G_^?`f_Wdu6G6%4u61S!Ekm7W2rZe;lZ2L0PK(fzWvRJK zPM+jjM452L6=|{xTXJQVZx+*J(?e*o5=22P$j6urZjx+QmcIKHro6mQYivc5^Hg4Z zh}T&SCn54sB3Jb5M|n_8u6SUjW{4c zBhs=WHg;Ma>MRq7q224>Ydm=OkBkSmlAmbnt+bQ4$@1)QkaE0NFQ5Q9)+t)qxDHOePqH zcgkD>G2}KyQ7uLZ>hKN+wlNbu9aos)mg+9*%_?FLSmz7r=awK7Jr}8{$iBqmdy$eJ z_GjYZGdwU>#T$8i*L62od=p+vXRMGl-61Nv)%fmTc#H9!9pk$~jPL%Ru^=|Udr8WB zQ7+(BLjl?VuOh?%Z>rn}Ry#469qK%d`T)kKqnzE*2V5bBdA8)Ttcb(BZGD)S92d;I zQ&r|AWLyjUF{SxF4fS$i`6^2De=Uq7Lk;!7$W!G71nyey8VvX}o{bLihl&f z6TfyPrVC}{`-s47R$|zB0dn&nL{m*}K8Gir&BDk{NX>*C!=UdeWF)R-Qj<7}Nlm)> z8&M6+G@E{|3*xA|sCMA(uSTiK6Gw%RnqzkT;-%)k>Nch3Rl$sRvC4QsqH<_tQTaD? zUWIe6-mi*Eo$qEsUsqtmt{VOzNMBFabDx6T#CNG}@!d}#Fyp&(dyPpnd2UhF^}mSl z8rzYll*)FQYXXH^mNIvxYwL3i6QwjgOWHb#>LG3IBX*-3#&^)sA+(v~`{YzJrYtT3dgJ52USWtPn|CKSzzzwDl8sBB*oMI7gG9${;~?3JIz{ zOj*0-)JfhdC7bVdrmvmJv$K4+Fm-)X2z5Q#Qa@4A)*`86Uc^?nv0REP#hL?)DiLbf zmq`kF817X4&7w9aTdomU80(+%1EMN~*4Y=S+^3IXgLQWA07j%aST>3^M7)p&eXTL# zw(nF%)a0Lm58Kk&+xKV%Jct59>Fh_&`Pu30vlNvXL!JGuQD>huJfzNk^9xmHyD==K z(RGJ)_FtgaseogvvoGlph0Z?r6{F6+2LeP9jn;h~(Afr_WgZAYvNJ<3{*%2jzjkj+ zc78)Ljdb?8bI&r$&ZkLUX|i(}o}!VRq_MLM8k^<=Nn36EZcD5 z>Na)>Ej2mg)j-!VcuyNJjDO;TY)i)vajqW13aTyMWyW{m2in`gUYMNUV6(@uN=LD+ zjelw*dm0eM5QMduBk|2xH{A=@=a>k8N9tO~g<7ROS+HYWRGi$UG9Rp{*dSxWo+k_aU(%sZwPr1o49!y7CF9|N z4&mXS^F!g`UcJIXV}(Y%zbMy-Rcbc2uwk`K8(;LUqWOC^zDO5}GW@M?7wH(dC?y%I`^Od%WCH)$A_1M2E z&Kbz{C#x*~XQyFCp$h|DW_+2+!{PZVdG{sbc$3r7_AGE<)oI3Q;I#17E4b_cT+NkX z;X-5W`Pe2Smn?gGspH_jj8D68ertv=gA;gg>S^>qtZEl)|yZ^I)3D?cO4n zeQ|7LoUxzDcu7iRI6q?LV*#INdIZYvKtDaTB5XgEd9efKHs5k&%Dp9gxksWu{#?pb zbp@A1I%wGh4rDW}FkyC*7wLa_O^*`ibX75F5pn~ygV7ut3f>6ljBpO+Y18Z5H9Xz@Q81q1 zBZj$N!qQfoWf|9sbon(stj?KXbXGdkSwmXsEL*Lnvix9ze0b>+{VoCh@@4v+tGDax z4-M_gV7`sVu3e8~on0~euQ;CCm8iFCu(5!yGo5quW;t)jo8vq$&*>bN zH_tgB@AhZm=uc|}&0Jm=T)aEwdn~n>yj$gaYL4O@$E8-~%yIRFPC$AX)(FwVrFy9r zJkx=Y%xMYtFj`IC2PuI_d1ks&9yi*BO)mNI_{es)p*~+;-g)fP80}Mcwb;`}PDN0M!7SoKzzL9*T~Pvt_n3<% z)KZ+#2)OUt2JW+g7DdzSe&+=4^Ns-SpY7KM?(4DnLcx8-+b3{;L~!4~4czB$)^Pv7 zH&5XHh~R!e8@PWBzIO`W&);?e_eTQvtKm2uQr8x2)NudPmJ_(|DDKHNQth03g6y2t zspM_7AYV0gW*AJJ)$29%-|+@RKka6cO&xi?4fYPy0>=3;c>c?7VDUVSo0n(eCwG-| zkBIs4@~^3zzM#Yx^-^PB^P7H0oo1A}J&z=etKnf>#ze9!Ekw{TCkO!?RpS3h28 zAcI6Rfa>Lh%mAW_@r@Zke-4pJwSc^L$qAVev;aAn5mbR2W(3V3Bgj&ZLzr8#U8xAR z6E7P=2}qzBLizZ5p8Qp|h3KoMkJBkG4pOAeJIR7*IN{A9W)Fp<(e6QQ(1TWFt8R$kV32+lUZ4kd0_vl9d%{H-F`s3q(vxs5NOpQ)$^u}}5Z@5yB4&^+Im z%934s*8LW=zQbf%G*~Qv7c-JJJJqBBb+eR5>RQ%D+?BWaKP(dI`-zRHiEp4uUP{N^{E;KvQ6t@v@a z%#W!$KmLMb;Xm$)iu3NrVoO9>cooW$Id9JW5jgK`Bn``Xa=ehE&3n~WmG{1cwcG(c zY{q;{hxPD?X{~tgeg|G9O3O2TiF)|LyQAX0fzj~Zw>2v7t@A|Sy=Ejm4tej@3sv6R zg&B_y@ZP{#o#4H?Yg_T&3q_3grs}-+i`T=?2vKol%_C7r!%~!`=;3=KaOAm28kQrE zg&t17K;_5%m?iB1Kb}3a6a0Ai>Q?-Crp%B1bbkB=>EY4rM7W4!lI|EJM%2S!;&e4d z57$NDyjPGkEa!#L!)&878xvb`Qr(Jcm6NM%={dA?v2rRKSMKoK?6r9oKScxOt1Z=- zr#0oSu~fs&fQ^%}n;hfhP3#HdWOD7Gaq@MD3KM3ST$rn}HtfQEbjzMj=!oE zOOCk&uM(xl&(zfO9BoiSXL+z;G95^m?We)=7&c6{d2UIg!Qp6asNBsneiVJr@(pIA z<>i^chi{KMT26-7{hV|RH~p6SqI_-z9XepCZ!AaDAg-n{)X*7UxmUALNI7B^AdO)Z zeKrc4zKDj=<++=k$>q7PhZsiVY!S4Fr7{ks2LukKxw^NdUF>ADHu;vu$TXH74};Li zw}X_ibZ>bq&DFg{Bjm?Xn9R6ht-`n`>w{@6?c0?0R-|Q|i^Cy#oH%&v96EvQnsh6U z8_cnbvvIA&IU}FZ*qWl2XmKh7Y|21h-gDK_vQ@cWV0$l>?j6p_PQ z*$ILC-E->EY=k(W~M?9nm)zNQoW{aQ&Y{%)}`{yszJ?_b*(@%f6VIN1l;8(CK0 zh{9w}?tW(^P9BT2MouoiE+Qvy+C+Pp*k-FS-r|SRaDk((bR89Km3u- zwD%U|mac7|IpGZM)!tWwCIK*Bi1;H01x766~24jz$u?@2+RmFphm`h{}6 zL%F(?>u;3njdT?bCf+&PnOd_R(VY?G@-+GxKtJ7a5Rhy5a#ro~1Zu?cc=n5l1!VJf zaehY0KEml<&K%X>NS}5sNx_CjE#g<4*N_Ct0T8kS8vU7w5O| zHGXF{FV0Kiadh7Zo5qbzrPxLV=H+}eOG7qt&+Q-grZ#g2II!phxhbc zwll%hTu{;lsN>y5JRM8KP85PPfp-bp`Kg_6MsdzlS$K0^C{3XQ)e!e)htxNpDuJJo z68Tu$5;~D0Smy*ct{{&^t?4dJi`2NpLB_@vu*Oll=mcvPXA?n;rZsgGHy=-lgqz1c ziV8O!q)lnW`cI0kel`AgDB8^9I!2qOD}$(dH4fE^=O29`ea9HLeKy1hz398zeN(iguFW;>_sjIM&|(R&mPI8@7%wAaD(viL7}0i zo6GU_ai!4v@$kmPzGCw7G$A?fSui#6T0HRL8+_Ro>Fv{CQ!h6`W5Y4@G+uZuiBz~N zkrNwy-FWdH6CU}kQsNVc73wZPK;?TV0bhfYt8LAQn8G9013L*x$;o5gs}$atY2R8> ztS#SKdgIZRSS+sdb#sXKQ)%|CUS7OkE@izd+2Q#;)$Z%*5PvU!-sLcF<%NSLCvvd* z?OP?3NRdRSbSq!8o)^uQm5A74vAs*La>RlhT5oeZ(ldCEBfZptyR>3)gY?)LI68*> zHxrk}Ir~yf1Q$+_n2559czc^(B9bj>Ayq6U+3MnaN!+*w zSi1gIb@4#fw{`Kjg{B?tOCDLcbf^AhA1`j;{Tr&rWjR}HIfy-qhq^c<=KYPeEGw$u zt8zxUx+A8x6}!#}k!TiQ7eCUTcgDPa{EE|1E&cJ9CmJgg))sJ;ys#c;5H?m}YnAJO zyQoA~z2tCOLW^O_nBAGqOahfbq#NN3thoI41)5dirX2=Y^CNfx=woaITm-UFfy_n< zj=DA%$ZP~Y@GJ~qqx(+v`&TMll%{b}g19yu6TvyRlsHM;XkaGdAL);*uUo1w_LE_( z@}z@`GxCIyi|$vsNM$mI87FTM7x7}f%*9`~n~Rti@mgup&@f!|E*6xICoU@D>*5qH zdfC85t5hyp2QF%;%8Mf|D$uwH23&>8N-{6SR?ht9lwY)*8GTw94tZ(8@x>vXmou^D zjR}K)(Y!I>)G)m9hk3s=-jI(2G#Dw;9c8b2kHPzU~@P=DS-gGc#PbTL@ z1Q+1SxuI*z4+M;i2DCGI*F2a?9pOji*j$>&6>j3mvNqK%r) z3OQ;TfVUVmaj)s@#t=p9)@)=qjG!31X=rQ)yR|ut8s8_TD(v$yvI;x*C=8>*aho!X z>Ny|`w>@xk0Jk-}jt6ej^w=Oia4coywlD)KFyDL{RpGQqWqf`VWLA92FIr|b_YK2E zm&^&^qP52b7iqdKMl$Ot@X*Shzi1v3dWYemF0+0GJcN0|5PHut;n?WC%eu!@@4a}| zai#bATf%VLqcZ}y?S$Uzu&v%L`4=s--slmAi!Q%0fQx=%dM|sM_evP|n{Z9Uas^$# zSFV4BAx_W5X8C#nR+#A7t6bfQ%6GU_(EB~g)zejeo&diU*`I@XQqZC^*3}e$4afOd ze!xlx7I}&SSGlmjtJse$N)RJVkVbIS)^eZ8Qjz-uK62P>PTz1=cuUI+idf zRdG#&gBH=)@|jqaRyU!At4)FT2SCG;6Ipf|K4S(o7 zc-8I4!U|e`8wEkhDu=g9mL!}*f|1R{{T-FGUJb&o7dVnEoXU@_rzS>*(E;ZV1<3t} z8Ia=`kYiXWqKpnDK_LuNH0Un1TFoY}{JrJUoc`jA-@7k4KtT%HcMe zN1?%!#!_F=B0V`;21SuE5C~^G#G)i7C#OAb)07o@Px z-Axfn9OwZ_K(V{x{kCSyMeFH~_i=i|sq4S&HR$pFuil zV&Zn2sC(Uf3{fV_7$ztIM0Ooq02mMq8U{la!4m+;avUHIK>9O4ES7r8Ba7H_Itxn` zKsp%A%OSKJlIM?D$Bu;ab6PbwGR}L-P3;Mr-7D-uV4d;f(>KsC!$g zBlE^;h@p<~#-ILoOn9SztL8?=`M&RBfOGO9LU=gNQ_{`*EcH0Uvz6vO4bNj>4j7+T z!>}?wPl7>ZeCFY=Y<%91Saincnb^)@e7*+TmyFN5ErHLAuvO3ay#m`%Wxs6h74khM zZzy|SVcj~LxUJAr@Duqf-^l!x9prvIk$%S0&jsYKe2ravlNVRP*3DA5*QUaOB?dCP0~FqAAw-zlL!uf&H0 z%QC(Nk}(S|TdX=~3Iy7M?)-rroUqPna~EW>vtW{yX=h(=p)BhFbNL!ukh9oKUR^co zT?u%*vrt@R&wZ0zq_)!0qDe3#ecj~yXCRqTNu$&io>Zp@3rkFJc!C#I)z~bYO5-Q% z6mETSS$^hI0#gm=nJROhdi=XdY`rE;+$B@%W$=`VtJ`by+>l`N%soUjo6Tr8iObyV zyqbP4qn|=9ceCpTyZ93?Oi#Ch*3I_JwU+7^k)7QjE(T5`0qx3o#L~V%%D!2n-R??8 zyQ@GeUi`tg@-;@gdb@bo_dHSVpH%*nM7h8C9?tgr9tV)5M6AFiaKKfsb#|3RxHtJ` zN}r#O%k`lW%NUK)>SywEcA`a=+r!=zd9NDxwn z&fm{u=#GQON`{Vym9G-pH(Vw5@hwBU&d})GFz46VM@M4Nqmpe)hDx^MM260|QKL`V z>|ZB+GB7|=>9gs~_S5H>$_Qxf(9r_a_ z;CQLPgajdF=#BqlGISQq%+NA)(HD9NW$2v<)S}Qi=Z0Tr zA9Y~Jp!U(d*qA9#!9*`ZsgD}s5-9Vc2l==wG5^Tn4~sv4|CT0>T>~WxLh>s3URTQS zT}!h|m*ufpIhu+a>AVo(9?qw!O&0T^7u{uG`qVir`+eW(udtc4!LP7c(0(+RW}yV# zXf7?$hw0V#c)=Iv9Kn7E<2N2tRk`oEYWTA88N9oTufI4x1D9Tw`tcd%xJj(LETgv9 z+VNH#IIe{iP#2FFY-|Z5`+b_9%b^!o7(OWV!njdc)ZPLJgx6@&EY8(ac#S5_aCY!= zyp^8W$KdWG4Mf~m1@0}=;!VDFMv%{T<^g0D*WwfcrZ@d`Wf3lXrvsu;Py^sNXCk0> zZIdxhP>*F$pTVH+OHkj#i`b~jmt6+XlYHsyNxUor_o?jOQhynckVN|>k&ZBtWWc-6ed{M`a8_LTGofz;xm&SIf$e?7dsJxn@YJ6PY$17fn4e5@ z<_H(YW|;3)c=t2-MJsUsY058;cOQ@x`u>P`hYFl8UUB@>SDb*QP&u{-&cWN&)jc6g zc4tWPezMc=-xTKi^`C_QUiew~?`u8}|Gn_b@ZX0^;lDrS4gY<(FZ}nOd%}PBd>#IK z&%NQl@7ss(EQp(OJRxGZxhLd!Z~7?o`+Y=@5a~Z8I)r$CBjG>9`#psB5bt*ozC*mf zp70#vy_fJC;{Dr%*AVZoC47c>{{`VO#QUv;zo7A$;*iJU#EG}&2#5XTna6yM=eI1! zg8!YodjXv8_EN~JE$}Gd%ie*%>?sJ@Mp5Dr9`1<;6A%%mka+`3``wU41Mv|b78^e- zsf~xP1H#2=@jbF=MZR@xHqQbq+M_w|O0(Ehh11!}HMdl(%wbI<-#fHe4i<+tN@t^i zXdPk(U1V}~LwLb1)CPA~UbLXy)L>~6wGbmeCBcpd3<;$7?};}V8c6MxTNyUKUPQb- znj8Xev#DkkZ!3Ww6>k?CKiJWtsPHDR7^2b9F)37g-oM|_p0f&U$PwUiqs5%7P&?$U=#VYcA#Xv0fZCx5>d2S9i#|61b+UeGDcnr%`O=LtCVUPg zadk(JkUWIR0^WgePleg*Yy68xaaB1c=b03Uh_ft12rqcO#;q__Vdrv9j}oWZ?r*?< z&fjRuePhv^Hf7s#7R`r*=^r}%M|>?$IX*=bAxZ#9J=PO*9}4WxN)S8h(D%VN2>_;R z{q^!xPf`u*}9`u(%->-V+~_51BG+|@F-e5~J3|5U$kfl;oe+53fhpW=0H z)9;hC_M~`CT6$Ck!V)UZi2*#X^P?um0w5coSQkd`R>Q#V4~v z;v`;E<#U8RSEhv?w=uMA z)8B}A6CGNj=9M<_GVz8`ymGYh^0>Uq@e^qi!ow?gsVQK1d0Br`i8s;WMK%mMI+TK@ zQN~a_*Ur3)s!!&$EvGh43x(&SDyK@|hspZnj64m=Y55Gvll3>f@TLtU=X69)g~3TZ z{7{auoEkY?!O29NQ=l+j502r4)8G7HjWtf%?2k<$adNc#VbF@b0uqI(PFr$fnycyl0Ck3Px#+qFHq{({9UUK8((bp+8#n9K& zjndP7c>x15bh<=6-O5nua)favm};f2-ZpnUnOCr`ScN%FWLrs34rTneTY448izs+@ z$pyVf?TM6s@)=70MSA{oL*?&-`kB%WYCr;fqR|0%OSyUh|I1?#!v{yNzpeb6WLdjg z`Vr@)C;+^uf2$dd0R1A>f-Xwuv9nWNj_56*o)x z8kg=GA{?B4#~{UGT4%YeQ8uX=L9uC3I&iLrgJ*LY4!`U?4sM?sH4X;$=pYUTppF>f z;5(e7qwv8q<3i%#BZUtv^>O7w3s~WGjYuZf4KgbraAX!fCeP!I>~Oz~3LGQ>c3?Ja z+x*bIdn8<38JZtPguw;GF!&)2{E%KQM8ObWW^2g!^H>=fkTXF%(Q$m-37;NxkErnR zV{!-aaS|$Ni#OVfk9TnBlENJK=VvCa*>}F`^%a+h6 z-Qih6qRippFS*pygU8?c;@n2(2#%)s^V95ZYZCbhsxFe`F^GNWf8vGwv?ROGkm}nS zsKW?%#F@>vfKJezsH$oO7|%_mm%*;7Q9KB&#~3nIn3#hlWV`NV^4DRYmNt7X|p;n#ML$V zGT59B$4*<5&cwb-DE}{|3-y8zjDeN+4r8b+?8A?`Z9kr+we3X|0kg1kZCiM<(zd_p z1z#PuZFd>)wjcm+)AS-z<+fcNfHzCMJ>Q79{xagUNsiW-dmU#|Fw7WVvIZUNmg>1x9M zc5xjg{6tCk2@>{b+|OMQ2f@B}qz3q%qZ#0;P^GqE8FWvDeD2^E%JoC#`nGa?UAeAN zuK!i8FDci5Dc2{J>*LDx5xUBH7^|pual5S!ff2UaM7|%_=h+$`dtahW?#JDOil-CAHh5+E5}m5s*O?x^I~t#Qol}GjzAJC{C+Il z<~F(#h3jGy=}F9*fTIkYbfgxMy_K8f$v#KLR`EWdssaih!+#Ly_;y_vsbh8l&TicA%i=d zH;Y^e43QbUcq^anN4UDhsJs{1@MD-|PbVv7am(4+gr3{tr7q7gud#D%WXKgFJuPde zI6Or-gGrnTp+%*qvHa2y3Az25&KO1S2} z)p@x7@vrFNTGdW^{Wg$Z=4j!1?9I-@wfULo;o60$QtjcxmyzDUhnb&;qZi^5T``44 zB!b&0qGj%|<=i^SQu8oO5GD#O_qlOP;*b*$%MtP%=_L@XPKtB$jv5-Td?{Aj%Or@- zDZD6<9E04nrI$brK?{)*LOdn*-Z8c!$q60v5G7(-WbO)s7U{wSquF1O!JEJLH}m2e z5}0>KB`{w?I4+WqQwjPxI9E+royA=@?K)NV#|YNj|F7e)-n~3Vu&yWFa^zvX?;jn9 z^|AUG!TKTM+D3qt6kr;8xo2hX0TWwuZUPhkR%haS6eboAsXS~gch7-h)miw7CkfOo zG7B@^%~%*o6#Jz&N=^=oer;#^=0Xis#MW5(}>)7QQDc z7N&iN1S&7HFuIr=N{UvQwRpE$EU`|(`@-Lk19&$mq&*7oHa&41!22HNbi>mZdspWu zhq6E}b8P1Zv&eTi#BX_VpG_=*WxorS{i--;AJwvVB^AcSc^_q5z9_xaUMBJ8T{iI| z;Y<^s`?k}?i(R<70lGBCkf4h^BZxq%l4NIjP6BZ6eVSv1q|;9TLN5iV>n?Gh^I z0AyPM*8r2WBxNL=l`-z0-2a^ydyU1bg(01+`5K{5= z*ZFr6H(75wMlBBU6FXW@O}|hW)>hMtS<}Z;(;aHl9cX%y=j8JoVv{tMH9sMpk4v?S z3F(eF0w5t>f#7T$qst($_e;Q3>Rr*J!-({L~G9=!8Vv4wki zPcdRJ7B=9%MSAmhhj9k%>e6d5j}={8&ehxU^=UC}%lJpy+m@#WYk0XKwr$C6cUw-; z+wx9YO!4x~!|lb(gC}Wtxg@r2`K;Y-Nz~i2^3<5(Wy(VuUP8zRX0!1E4k&{}^4i6{ z2v7SJyR6dx z!=25Y<2w)Gw@+Hzl_eS>)#7cl>2#`#8-lslRB^knpEQ@f9YAk0@sZ>CUE9Bc#*uTEX)BCu>;l!QL_~uff~UScayfWAg~r&=hPu2|Eo# zj>%ILj~E(LkT1r?IZWmu;t#V6=EXhP5sY?1R~K_mgyQ%bA|eTdKb!)}RSc;V(<^_K^2e zyx{gX$2p7n8ow(WDp1S4qjzv_Y*k@iz*=rZ7Gf_-`P^n#Ma}#3EBM@YJ+FCAhXOfeU}9C%xk+k$1~em$su{>Ua!J4 zUm-qUFwcBu38s2`c;?AgxsM*t3=gV1BG0t+3Ivrh1n~?JmuB=I+#>S~Q9mTl$ZM7e zxdVCO%p;L-KG~DtYV>N>Z)Hwroz@3Ei+*8VYi3#{O&Z-tm3O}G(i!Z5iMfvkGW|~S zOo>k(NtP{Lsq$r;vTRLnjV~8d`H*GLv@OdPE)L|&GqJXDgk;(3T?${m0S~iazAWk) zNGwbBfnZtoW!ti>XRF-d`LYtS%t^BB7Fm{^M#8ELH0uH-HOvP$9z~d4g6HXr5BtVb zf(NzN@E&6#SpF*A*CVj;p;$8$Y11!O<=HhMas=_FD$l-uJqGfu;#HMz+LUJ=9C4uN zz>E90!8f`*D_9iBH{W2+zB7CiMxO2cO5vN&(pvLP-|m5^Zy(>h-7PrxQRSN}f~t?q zH|ZgA1o4e3)Bd|Lf=pw2P@buUmXAuZt$09|Y~}7;vgFdFsSu#DB?rk?#2%PrOXw?0 zHa67+@kWzNt8liN@gJYN)p9ppVk9sJQ^wl#1hxxUi^Y9pPC;=?WK5M{EOMzQJq`w2 zdAa4(YGfioz0)rK&yoApyfZAP+UR++zyH}5Y-Xg>G&XbocWN4V%Vi&7`GU_qaNEZY zaSe`YK(BXZ@|gV@#%J!doN6^``S(f!P*Y+^irtltXoE?X7xOVZGhwQojdB1gt ztQlyNHu<7Wxv;4-S|8_gH#pNsF${KOZm=wi$FAxgy}8P$^DZ$a z4&&SC$b17VX~O{!h2j&i8-29W$ z8gpX+X?+`!puEP~CDpM|T zUjt^)Qz5HGfLVo9e(&GdRpvcjlzEXC72XtOUUlF-@gy(a%lMz{vV&`}V!C8Cbr7=N zVZ68cr^^HE4leFa5d$(e>|fQ@nNb&C-GHuVss4;)jDMBgzs}heUtC}Mdf3G#j2#nt z^TMhm%r&B`C*3y8zQTW){afrXuXDf|N%+=ZoW0e)!W75;Eh(Rb=^$Rta(h%%Mp ztM%gNSASlc-W!wra&0&9jZz9r<-9?8b%mT_qVhOiPhnMFjgeEFqdcCW6>+NarmvhJ zMSir@jLHdO#$C&&je)NKbO{$r3*#7{HJW8dnu?reO6vjim zI51C;u@ZKFV?dThJjLA02G>VYsZ|dOU0@z_uhZY)_Q~wvf=kft(=T{^xj; zrM`gxx_}mbWROnr^)E+c1)&+v-T+Eyk)diTck5tXg`(R83upHwd$0KmCW&x$q7Lu* z&`gjG-tOoO0Ww0D4}9iUQq8jtG{P;z zZY*2yX%3vdqoa@`V>Ln>{2LRpXTery=qD!JM^#}HWe>^ zgF&OEdN1$;*G$AuzPR7g2Iu*F*~KYn#Mzcwn%?F`L?M=dIoLK>6#S4@)jr#8HVwZn zh0pZyaYG#DAH7c^At!!-DeSrPZiW#+KU6+5;R%4))?K7dJFjz3aXp*U}C(M&2uxPwpqA6Db8wH*1WhMdWXb`Z^Ptx>=~+KvgCuS-#UnTETQw<&^0K(J8HDn zE(*IB0o4`j^o&DpPERe9>AgIBmMu`#)Xi8iHgEBXnfjcnKP>JG> zMI#nbOlAZ`BxI7B$#tr=Zm-pIp;j*oM$`FdFdnXRD5+w&cjNy1F#yb*@eTsCxyPobk@4? z#pL89Q5cSDqTGWAooZw7iq5LT84J$@MqB(%oe{gEenJCQV{~iONkP+sGU`Z)Y&0=N zx)@CH&X{hL?Hj%0Wc!xNT-V_JvVC905MQc&{XNt}saWNuR}ZG_xAst^T8VPc)Z1qXUP<_exS4x z@=as1`W`}fNh>#mzJ*&Xmg~^r6EKk~!VTvO#Bq|0jx2N{L}0(e+OVi1ywkImr) z^ij5VN!9b{>jEH3Uquy-;TfEFw^Ut1U-xNWx!~6Dh5Qj&^YPHI0GOBCyDEpG)^XH~ z@JPz@F9rj(!FUVGgOEh3o&#zLD)%tTWHQp>(*a*qjtzjn?6iEr?Q=$sCJTI&1^%)H zjsV`#Ri&`Na7hnYzCZ!2l~l1rulHSsO+ng<+jQ7FfUR<1(i3!s4t<%Rdth89s9lG` zMuRfXA=nrJt2`qNV@R~&6pSqON;;2OOC$v>A4y~928-Xp0pd~j3=0-N%MX~8O_39{ zH>6&e0&&{k*s;dC&@FZb?@x|Yg1Y2}k5IIF z%~ZSv6_5~+xlXf_dtFfOnw*` zqDPQlI2(JIZ13>q)Ap4&_-hw-ufe=~VW~@v40K`ha?cd^8&?`7iwkk#$#rqJ{Q zyqDb-8qX!1g+Xu}SZ8BS1GgRFIoW$I7b6TGxmpo%dx6-_uI@)d^z^dG`CM*_d~mms z1AB(Cr(KP0W*hBkk`fpsi%qRmY-;ncshPe4?1-qzmN?VZFFw!xozYdvM{EiByrv%c zyl-YRpT|c(Vi`SG&y3#R{<}Yn9`kwF@&uok)*GAmpRjmXCdK9F78Y+wLKg1|!Qy=% z$KnnC*66*php^i5jWTXa`ZS&4ZBR+ci$_EGKwRnV8SZdSLa|3RZ8Bmhk1s ziGnND0UdPu5lE9fJJDrttGq}a{B4PSe}&{r$Mxm7y!#$>R%&FZTU`%{ezQy6=ZR(f z!V5rh9@}VQ22I|t7_KB5tNO!1Oqf{S4~Ohxc)uNZcVoUlo=5w^`*}mjT!5G_#QT+i z_qz?nBzwo|Tv|`OpDE@)3fy=*q4og6HR&WHOw`={i z@c_-5cvet`!Y&~zxG41I4a^Fb5G(jX&XXv=KiuGFzdJr|u+5p{rEPExF-hPGyHL+Q zJgy>M5Fbm+VVGM@yDVOE7vM!Oh7N<}|NqFCmR|`d>?zB_`Q&JA-qqTCVri? z|KQ#8h4`JBnZ@tdpCW#5A)d$JU!ff$UP-EM#zxFMg2tBqh2EJ(_%%Hdhx;r)T%Y6B zxl`g;1$SD5r`3Wx*ky31#4_MB3cr;;3+7e-+!UTJKBM3%^jUDP`se2GSo&-SZ=1`R znNQs%YHkfn{1JOMv90Cyr+JhFZ%bVs-ixt9G@eq%`*XaM+po{bm8xlb2YfEWw`lNu zsT!dv2|kPAD>ZnbR6SC_7l`(2aEDZli~1=2Y=)D&DwVHD)ucWH{0_h?DhZY?Rd)(l z4#93B*jN~D1?)nCO()nSsrn@Wa}w+lf_bEBcob84GYK}DVAofk7G4G*J>SwFwiSzB zpKNOxv#nS3!nWStoozjp*w&LmMYx_oo6z5XLkl?xOFUPwk_#QG;7PHd%gmNyS!as- z2MrwwOnEr+)#8LGM9Re;xZJ-mmmB%BAjxHvRknj`eF#qm*E)m>a^Qq_r zSLo5z&nWmX^|lKe`|0M;8g++0tCEX zgM$Ds6L1hP%0wO#Suaug(S8T?iY;5Qqydh7f z4SC|=ujBV)FtLavVA+qEu44Jwzs2#hVq>tdw9kKG5a_l01WS7sv$U_|JdA#mY8D+9 zT&Gs(of4wu~^H#>!%eKJ2b=xX@1cZzPjVa=F zbbB9OpA6>%=*97ExU@1EUKCI}3@5uH*%FC{vZWPla63m)lM(R5cK>jYle%R!X+}av z9wVoJ1t!EfTSzw@$q0=A2#<^Wd*F`&ng&i(sfuLyh0E zu>r+bF$@p%A6|kosj3G`Ynl)Nt|cgwqFTINjW<$Li?>T!up}WbEBMOo>ow-ae|REs z7){XL)njE}O?w%A_0OX>;`ul&Z7;zhC_36Jwy|E2p*NV&w^obI1?93*M5O&=uoO!& zUyc546C4Zh;erBXE$arvbiNC`C{@D@C|QsQxTD-nQh(vcSpW zsF##PB?-j{N+QP>{mZ|w<_nxE7V5BV41;21eZ?Fdwg#}(LNT(wqC|%hZ?jq`M%Gtc zqC+3y{Mc63SBw_0%2UHj0o3$z?byHZhM^*zTrLKXRdGWxuKbWngQ&e=)O3{`)8=q; zOCfuX_*HG7U;L5ZNEG32Y%n&AEX;(;WBI4X{xI>&wqr<0DmrLKDCt#Z zQprfFrRDgb7nupZ4%;XalOB+WY>HI3h$A}GOxM~iok^2^jD0!L8_$$hp{eLqpV+8DCm6)o&1a_$e_h0 z%a=k+4pzo#CBf6zp!Q!|(&Kg@gBGET(^7xKG(+qW_ZS4 z^srdnMuXrChmHjKPDegoEifCap`|c?_xeCOn+ru`YZb=f3!$%%y)Yq<$wF3rO_DQZ$IxHpO(1vEq$ba zQKUEer;UV_UfR1bF8xD9w7sOC8khdIKFU8i4*v`KDF5>hV*6)cALXx%OTUAJ6$}2^ z*xfK3#Yd=zKb1GS*Rr5E#B|-aA;_v zat=Wq-dj12vMa9^QAr#)rlgJCsi8}|qR}_Wza@|r`uB%6xQU}T9XDNfL(6JNkkI_+ z;NQ^7zv6@g&K7nezRS{Kp>#7-Wb^XLOfz4E?u1jV|JFkI6_ynGZ{3II{G`xQT+|6+ zxK;*w_^>bZvH-u(s zpEK}TwWCbj8w>EqPf>aBIW5_jQj(u{Sj!nn$y}WcYMz<-S zkUX+{~zMj5bI-Jg%!0UCaj<9QhphO0kz8k}2F<`k#m2cO*s!|s%=aplC#2Dg|EB6SI7gPUdp{db-lGlDANVjEFx zx+kR(^bH^xy|rLD#!Nz&Oi!Q+tsxRJ=;EfMPV zf4q#(s&IOTGKaat>`=$0bc_UMc2<;}=z+^;?rPFZVS+vn*GsjX+@7H{88U16#{{ps z4>z+2Lrk`2&cSTKUJMR0uI%}V%1#kwyW-0x_;Hjy9A*2z&+w%Mr(Y5|zgr6&)I%FW zAKlL_7={+CB9OFlrR2E2nUSbmt>4e3 zayzwtA31CJCj>9(DD>nM#&$fy8>R7JuR?+(V;JJw@R>b98?+aZQ`8V zOTlqtJU>ynR|}k7@i-H_m!jiw9-gRdxTg@#;U#hXoY_mkaX7DY)d*kSW;Jp-W_OY6_^T{;gGA@UI1)FT2FHF!c z+I(G1^~BFtQO_B)GU@9iAGZDO-ZWl@#H{93oR&^&-8aP5eRiU{wfTE=aa`TzI@-PN zMMmA6o8Ic~a+d!SZ7n`6rgk8hR;ksABzo^#>iqa| zZog6I%NHl8Q(MoL$JeQ?XWi?JE)wnZf0CM@&iSHFgVrueRHwGq4Hb2YwT|`%bFJ$> z-gR2FB9&fq46W^dEVjL?E=tf|Z7uxu!ni)x*23=Xm5la6L=#kI>EorMPNTi9M0ING zT*3s_mJwvP5|4C+o_68q~ z?c=gUb!uzuxcEA?HMV=5f4)bjsq_SOj*6@Eu>iuFEQ%0C8+Zc zzu|To<2pZ4owNpH&3B19&2c4oPirO^Uv16g+{U;n>iY0(xK*<5DbZQ*tH)?(!H+$G zT5)`EaHtfZ*puKIkDn<2$$I`@A+V#!pP49szt58QdglBh2*Q{wxh-uNm_}Gcb(f|? zxMrMe?FEfB9XO@kwC4;svQ{mFH;I5jb;|$kTZXSn)1Jx7V4PJ?Zn30C(bn{MrT=

64S?Ez{~ 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 z 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 diff --git a/third_party/python/Lib/distutils/command/wininst-14.0.exe b/third_party/python/Lib/distutils/command/wininst-14.0.exe deleted file mode 100644 index 46f5f356676c800f99742deb6bf4c0a96aa166c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458240 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�VkkI>$}~d(uZJ57cs;^Uz@cHejzJwU6!4Wk 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%0A7`rF^n2GrI3(dH~ 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 diff --git a/third_party/python/Lib/distutils/command/wininst-7.1.exe b/third_party/python/Lib/distutils/command/wininst-7.1.exe deleted file mode 100644 index 1433bc1ad3775ec9277e13ca8bdca3a5dbc23643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/third_party/python/Lib/distutils/command/wininst-9.0-amd64.exe b/third_party/python/Lib/distutils/command/wininst-9.0-amd64.exe deleted file mode 100644 index 94fbd4341b2a140fb0aa38ed1e10ff69600d4911..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224256 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ÎsYM~fS}Xp>Y#7qtYq?Xvt~um=bn8Y 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 hJDV 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 diff --git a/third_party/python/Lib/distutils/command/wininst-9.0.exe b/third_party/python/Lib/distutils/command/wininst-9.0.exe deleted file mode 100644 index 2ec261f9fdcd034cff9602af0c81fb7953ce2e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196096 zcmeFae|%KcwKsg`N0I>sW{?0uB1B0vIH<7$nmEBbgv=0y2@}UmNFf1RrKeL{X*dVy zEs2R|(&n%kOCPZp??Z2~(tBy^ZMpYR#A+cSm;}`Fvxq`lw6vaaQVklzL{iT4UHi<0 z1hu{QeLnB!dH;Cx`Q)5^_FjAMwbx#I?X}kaF@Y~`5iEirSn;pxg0L5F`t$PV-+pLF zo-p%Q6NKl+yng*&(~{S(zhC_7+PpOlk9?)!fv@L%`GIeI;}I$EOAqBW$lu8O>NoPr zmxl7b{>Xz5-8z2!*!)z{cjT09Z}`@nBkBJmcl_#zjPHkCyN=w?-!C3{5bx^!3yyq~ zziW;(;@$AATaKLK>AyUp^Y`8(Yx(=v{C(e7zbsOj=@tZig0RG774%&#_oU;_2^P~h z(-=Xx!z>5~jo5ue04M%~h$AXc7{Ls@=r8>iR)K0D+L2c*l-$e#36?VO_wb7%1>5h; z!VU^}EkfTU3Vilo-+g8w_p_6D?Cuk0!s^N&@O%~seBR%!(nA|0B>r+9fCw*YEASrq zmnR6TZf$t*0qFrjxOqELsO|rP_g$k4_5%A`4KQKny-4pv`Zai;{uEsMtqp4%zDyw0 zR>=xunZCMT8oC@-lq4 zw#$=R{~|eRM0==Ah-B!$RSwz{Sv3)p{@dExfljBKE53jl^vNp-`Y+P>QIK7kEBx~2 zW_+Mb!}tkBj;GgSwon%Q^aF zFYsfHLlhMZf`aAvE|Ih4F$h;6oLCXo92t-aZD z(IU6Cc!G;fW>wzlX!S!Vw%i?DY_U38N#Hv6hh`}4x5n&QYG8+B|KdE$VMOIxjym@H zb1e&Rwj6Wpue{cR4rsF+iItmXu-I#;LG?Aqe0$aEsHRNNa2nl{p(29_nzib(+V}PS(+AW+`DwsBGaO1yPVwjEJ(ZhCrsYS8n+=6hQJ)qPilpP+yw^I9=Wn zj0oBVKqnQyCOzjrJU z*%HartDjR2I#W@)Z+D4rw_|hovaZMPz=Lp~+ru(r8`9)sl~z|byRc~@QFhSv8_S`{{ zS|Jt2jy)fwdu(|Zk+oVaK*)!WWWtOgxtfjZfX8%1^C@&n;9>s)h^jZ8_ z;OuUXH=*tEHn3g%XLvwlRzY44vJVrhxR9?`bo08}=D`*6V(%tf^I*}&isnIg(~Rc9 zZ%Fp$!3Md++m$)qpSYdBx-!T5mo7~dL~OCZP*qTSMCAQeI#$jgsHJV0%s1puSlcG} zy-OiOx39!ZP=BcN>0Ox%A^WAQp!Pbl)ap{cRXfya5|n~y!9qklLjY+oIb&~8b(zo^ zj@Y!1zY4~|)WiC;rvP88Wtn`c77!Z;e%?Ng1kUw-ka?!!@oB5ZK)w z42DraUNETtmL+4>e+X(%qfBmC4m>vKQe-d84QKPv}$ zNH*T#S1ylj_!E-E6}iOZxMvmut0qlvOgW_w* zM6)6%S3c;S1%6-6bL|L2r+qJW9Wg zr*D;J=yDqe*~&r64G@7qJ^>X=w!0u5GRG3w%##7Fb%iH~;UGo>#;lnhxQ^dfq9|z-!TUCdAn{x&erV&I9*>De)&AC54&Eik=kvqt!>I-*5|1(WWYp!eii0Wzel!j z)FPJUG2e3#NJ(u!ln|Pwq`Q>5NTIOINr{7~2IEU9aw| zMdwua62#BkAOP!3jE$J%IS{Dm=Ga5K(9P+qW z8_cLUBsPPhFoMF60YZC_`g$@Mk8Iv5jPS_EFc9@qk$%;Oj)#C^^H!vy(fjz0pyyxo zW-k=9256iN8eP)!sx;Fu9?>7#X3!Nh1g3Q4)xMCsJpgSm-`|g zQ=z?7D4Vw%pfFNV{fp$5@pP;mYkac4gqdB4`AtFXU81R)<>{0PLm^64>yrB9Y~UXv zVH?)(qyi@AP=m5qAla5{;t^yN>N1*|ODVqoVY?32^A$mn9uK>S_4#;64FZx5si8rf zzn#*-guuGb-R?Opc}jdk(j6tfe(ClSUs9Um>5~e@9i(+s4{>h$3Wx>jU@T+&*TQx) zqv6&4tUF;*dURu;#vab!+|o+|a(J|^VZMzp@7-rYuvX7$^?9SZFk(vg;n}PE5S>MR zh_MOsUg<-O>lC?-KK#WX`Y`FaB;RcK0x(TQUySa~seIAbL~`f5ENNtHZ5JEhj0cVT*HvzxsrW`Os5?{KG|$Eea`*1PdSB=30N zc?_Pm++yuJ{kk63R@8xK5@W@efsM8nQQ$m)8Y}_I87y&*1=bjo$v0tQE3Zg=CTZ!l zK|~Dq$B?@{ypM!NiO(j@4+dkgBs#V#jIIre!bA{fvWT{Y_2(%*);fe|P-BKrG9od_ z(~!t)Uaxgjr^b9s zuXPl%VQAG((8X@#=F%>xjfbp+bVZL=7_OWOydOt*RY>2ckZLNV85NG!KNA-gVj3co zk?~%)i)(;LVuRxapOeko0`6dq*&XMc(3C}Zk<$_u3}&wp%_AbXlPAqzzozDCKL-CK z#7L1Sj%eFRB`6`LYL_OWJn?>j1+_C@Hb`nhen?XL+EJyI^3q~PX+*|$=y2Y8ZNvR3LRP^x&{5oTFI-e2HIjv%<$MY|z3*X%y7PE{wR zy*tg0)_x?l-2LtF+-szX_w9ccG}O)vfw=MCA;ELNvH1kvtkUK=ERAQUTw$y0m^zuT zb@{C<(B|^n*k#q^YO-<#Ub}8NNpfG57>tAk88$pcpS%W*!4xX#aul&(uU*t(`s9a= z_!VT*2K9ATuy!ibC1+=|b%qKWBaBZyt&))Uz=AEeRb zW_%izoRbZZrfnGJK&IQv^y{&Ro`xDGTfQQTuSXl_IMZS!W0k- zyj+E-HM~R>ZlB2#1;^Gtb#YKU2V`lE;D6xOm!Wkd4EVVq8OQ|iVuavimf^X24voau zKJP@ZQkUV*Aps3v&U`Or2uB@!ZEE$9`;PNFc-NqL$<$jcs zVzj+hB5w(l&NO*Bzg5<-Mw=rV12tP3?M_GsN9!~AsL?ip=bt7aLY|at67CI1UEAWQ98r;!s&2PVkjK-l4pimbRkqzB}&D#nf8i711C~D|CvNoC_6U4u!KH6b$ z@`(v4^@&+w}m>iK%&SrFN+D3MZ}MQjXe@Ze}YPWQ<#k zp;%yBl{gK$H3o_5+ib`_G07PMgVKCkQ&7-dzEC_vx;5r2-8A7Yo1AmktCDk5rRlB;lWh0lKf3Lc(09&+Xz);}bqyGT?bzfFF69qiNjbFN%beb`a_S z6ex_9415BY67m&=(I5yseX@-=K+Z=cK^Ox7ftv(;9f*d5;y)Xo>f^L{M8g^xtjI8u z96CmsjG>jHMD#M|@|E>Gia;SnS&V2;ynbVVczp}LIImY>pbP~gR`lzGeHeAzIlxKJ z`dSC%F??P$3c*U-)^>87lJg_H59l<*Pvf0WS>%b@FVWu^zC|i`j?{NTO)6cE60`BZ zbO|v|t`w~eU>8qMZ@+lj()A3LRNtv=%(t4GGWX8KSEp>pr_Ibi8Z-7SFdYqQ^ zr8FxYRHOMeM6qaoHeQNW2@mVD`8fzmj@fM*cw&`9n281V7GA}1ed;5)8G4G*+x{f(ElK+y|v3h^Ss)mRNf`Ox1C11rS+ zE?1%lFc*`)2>+$XKrW=bp_b=6QTR1bw59P8p&}@LCzaAXpUM{`S11 zd@5BPYa@17#}k9RNSWC&7#ulmxn^(lj66`4s)iE*Zehy0DU}t*?EO#)xHDbC2%|JL zl_ruiP2^s*`$2+`RrfGOZrg@`%(h4a%wlP0@*rS$qxp}RuC$;=S z>8=iTVHk#y*Nyw!%JZ{>oV@V6Rm1PbsgNiKd(Q!Tr-d~<@!_yY{U;K`qqk`=P#;<& zri2+YBA4Wd=QBr2l5ggth?W@KuesZ`WCaR5NW(9sA1vdJ&O#a|=~c>|sDibUqgC~7 z<-(!cx6M{xCUD6h!JORIUk757Y!-rCEs6y;SA`;0$gq7C7r-?^{SEjJ<|)YxIXB`A ziQ51_$^(lz;7QaO5~E1L96lFK0h<#4?xVR5=H6B~KQV^IHGl|eook`L8W9ikhzdkJ zL*^5SUhNBuNxenDoDK|Pt4L5R1#BuCiRz#>p&?yPP@hNHH4V0?m^TT0R0QBuNUS{p_raBNC?qc7Szkw10|hL+ z8fFI9qPs>mXkRH{k?FtFAk326gQME=HY`(jJ7#~(tuz7*M@5g1X4hT##_am}rXFX# zUtnzUKvOy(BM=mGF?7HeqQQW%M+mAd&3zG6%PnW+U_QD6KF#l}fK)Q-)nC4~^SCd)2`p04-tDDB-FkiDU67iV13qLc}Oe(F_}emJG@K zVDn13#5e_A6YF+-8$vVGxNQ-0FxI$LtK$YMb_PgOgW?Vpqx~BQ%{`+@OeUCqmBy`t zG@e+E`>w$~C&VBCc{_=jP9RNFAVuKI+N___{)+ivdBV@t3AgU)mL`FLhV==^FcQZl zoSyPE+LLd?EyasQ3K6lU#&Crja+wU_Le}~mIx8*Tr*fr@lyT%3A;QTxrY`2jaWVR* z<&_=yBm-~sN-)+VI>jP%6{HJa_1&Gx{p6Z{j+?{F(j4O(N+}rJU$Q_XJ%vm$Lj&es zNzzYzy9_NDeh}DRBQ!~9h25~;44FmBDEEv1uq>s5UgcmNinWr78|>yU;$#@ChTxfk z%*wCHeUh=>F5604$;Ma<|G!b<;wvRak?jilTxTIY#E{!jw3!&A5M)-8d5_M4wA+Z1 z#0rBLDccfyk{1z18mz7nK0fW-0z#fv`LWxiJm1EIP0qU}%2T7qVO9i9cU76>abE8N zQUG99baMX}7YKQL{#-S3{ydA(gUQiYMCF@&f^HoK)>bq+W_-tdC&hz=oR)Z)#KB3i zoqw&x7dtIJhmVl96zWL|e%~&{ghN{Cl_+sD2fCSJd?#UiXfqLnKn-c-SZ0Zo*F(lN z!%q|Z2R?ko5y{;HM3!TXB&n^x3yn{@&w%$lmmE>@(uWsC>T0xlO2D>1&qt1E3u4=5_#8dGjfdNDU;Zsr&|1~=MAXc>twV8*~Qh7-7=i0RN6r70otH4yb`&|#B_ z7Ka-AsI-2iv1hF+)rc=YJ=}=@Ecu*9JVgmtHDZ2PdkoRM5o`Vr8et#Zi1UB15&w=! z#b`u0au*b8yLPGAzz!y&xxUly*q0g9&VB<>80!}xkH~>vkIga$^y{Ai{fiOM+kj7M z>!dTXoVxjcA_rfR!tIw>Tns3=x%gs2)lUvFYPeFH24kc@wbRSZFy&G>!C^8n)6t?hThZdZ|*k-p}no?CIF8flMP-Vy>lp9}9 z(=1zKt%+Fn-;bnP_i=dKCy+x{^x`}II);!~ijcm>rj?1PVStuvw_%Uvco+!zND0S( z3ZO`#Hk~>eQzX(d!|@r2gt`^;?G$M}2>U8!J{5vMjj_g^OOY^g-yYTkO_h#));ojR zF~}uig+71;yUOS76tqYF#U!xmt#HYd)NO^Yce85!{>EITb1duZIA;!4X_KK56Jndm z{rog~cvRKbq^p)y+F`U!`yR*#N7p~y;ic`EMwXWf!E0Ql}qgCS32e_?3MuL*e zbhK7L>Xyh`yEDkDM3}Z<(5!&nKaR)$7g4~xoWU0r*v96z!3)iP!`bTQ5o|TX(rJ0s z5bBAk5n=z!s6zY7pUCG()K$c|APO19Y}EN1Mpjcw)oAO6>zEYQzD=tE=&o<- zzP9)Q&~zB5LJoY-NZ`B_aJlZ=9)EHqu#*Glrh%ms!^I3?n1nTRIz`S6YfC@DLeetB zX%9)c6q}i)dv)KAgl{;P#&f+EOjE-a)_za9ZWx9*$sv9=3;{n>R69eyf8DnYyCF+_ z+Z>x|gBQbQvvoE@;Gm%yz&$YuwHfuZCL1<#{t?-f#vRmn3EQf7kPl7XE;geMs6NJQ zpPhi8pGPkn8SRXC#d1UtVrdOPn~QA+v=JGKKMhzo)s8_bL+!_xG0F>}O|mz;s%V0REvo*_39|}WKhkb z`!-`|8RGOi#5JRVA{K2f2na(5?U&m|*A8&54UgE#!PZ$ZDQspj-eBKmV>aIn>D}_m zX<)`@bEVgrUgRI%@$&ap`1b-YV})PbWdyMu0^2-z>$zrnujlvDLhSsJ?#8YksiZ_s zN^@z)&uws1y4;7b37>BOa6H+eV%Zs6?y{g zfyBZkGE{Vz;~Bw+4AL1~BR=#__5VIp5?D9^Wx&0ij7t}E*dP>s_L%TwaR zfJoJSD*hJ?4z|wLa`|?Q6{)c0GOaK;T2CQ*gnMwLVH5uqWtm5&P6%szFp$Xjsa9{H zZA9G}WS9Z~YcybS@?QerYXra}Xi?xL?nvw$x%}9?cP28gkgj2uu2`d~ZRVo@tJ~TL zQqwhE4{0CvLZm>jI->cga-`!>yDbi(G>=Hjl25PT3}btVY+;PEYq4(%y2TREAq2Ga zd6cgG;CCdS(uVa3G(jv*L5O>9@S^y9?!+N42;WCoqrG;7IF|M-juW#1tKD{DWEtN> z8Or>vWSmQPiAjtWs!lwQz{v5M+BH=A2JJY3X5+x7^_4UUK&x2>l`Msmv{0G9B~@0> z-zlr_)NolQZPJLcRxXE?wmIJho~^HQzoz|YE(F3sS_vb^A|0BcT{V%p?lW+9go4`P zFF>-kt95;`#{QrGJW}-Yn6EvABO5PkyO9EEv|q463}Oa{WD(RxtcuX0B%4==CpYq= zfZoyV+kUvvi{;5JUjvv9^B*b+QX1P31tkS3+jSRcjFkQ>DPK2I-t`(O$tx+)S}D&R zZc4$*74*lK(G(1Ss-B-X!K(2==$ESREG@Wp``Yu6jvX^_fP^7 zR?pMaVZbd5Qi!aewDhEJT7<_SaH1cFJ?uZYJv|UQ(ck-NOK{CTaxaJ7e<2x-EH!-E z!pBa0h$IZcTKp_k{0zwi&nxnT^d5=Qhal27hC~u9hTM3G@OhD3sqCoMM53m4IiaVu z0`p3mwW0#F% zk6`KBdx0YQ8qBUf%Vkf}@z|RngDV+7ju#8qTMs#+zd=yB>Q17Fn13_&#dn#R1m6p91VdV0=*z*w`nI z)_VZbdd3lb2kqgF+{YW%p;`a0wm?ZZ(~Y3BCJC2gk7==`Z-M19&Z&I#BJZ>d=(G#0 z8;!ZZ4kT_I1;M&FjQcpdK<(yDzQ8_V-Oz5wbwT*m(Z(C*gEBZ05Uk>O;WFUg?0Dbl z_~ik$+R1wt%<{r%tkzokT(UFv^2|PvF&6y-M`LiE%{Ay5TxWI-{^}jwgxyaF9`JPF zNxJm7ZeH8oW#Cn+vr1{S3E_)JUqlgtlsj<1B29Jd`GUJ|)`bqu=C(dhfMw_%`8*)= zLNyU9`*5Y>FW z9nm=yMp?5u+}W+mzKPYZDadpHtzd6arVeIpO=YqgnGl`hMwl`kb6cO}nXc3{Tn**^ z|5{CG&ReMl8R-3uHYs1XuSLF%f+C2emd5n1ZO@cj2yo`Lv1pcK=h~~UZnR?vWF`kKd z`TwA%;c5)@{$HzUxE`Z%f3r=TEqS}ZM{&-UX(IkT3Ud1Wcj_8uO3oR?nE~F9X7nTY zlDd+Uceoo3M*o`~Nt}61?%*XVT~=Z$Vy3$dX6nAeOq@mkeDOFtfN}I8v1Aus#E%{4 zY%48Y9q;ATTMoc+jcrl(few>ocAJmIl>^q+Lvmjyt>$C%33k@yxh^kf_B+}A`A+Q^ zW(hSD)h?EMA#h33w)B!!hNIeooPiycDDIHEeF3&YUVP( zD>1m>L)U(YhY_UZ2kmiuLW8KSrL~9@$Uh=(z~?m8N)Gm$*pob46~Xl#YjjFCjmRAw zhO`5+x>>t94JQ8*6SL2bQ3~{Jt;c0r6C(#Vt?6hdu@xW3yT~~40(DklWkF|%oM)B6GBt3HRo;K%9ag#QUbXr)_wlk5?;y|v^+y?Wti4Y0 z*=-9QdnN%QU^i6{8DRt{fdyWhg+i;(Gy5hr(8sF#I^s6Ros@PNwR9p!HvDSr2d7IkYS>gCk8!AurAGLg2$R%1HlQ zl+j-46`%-2)#_egSrV|Xby4*rXqp5mDSi^-({!ddf=Q7m38bk$-hy6M-OG-+0tY?E z9N&2#au|E7tCODUcE@)Mxja6750NmSVYuAL0%u)^P53UNHcecl z<4nv{`QyZ5&*8OIuEUnVS%M5CT>%ZyYwH22`>0PhU9;#OKz_&q>9Q&PZlt44qYER< z(9*udETdi=2?FS(Pgi;h`54ZzePUj>Bv$sQ1h`)6;m=@z^Y~ zKjw6Mb2hiaX1NXli2~UJ9eI+iJ98Xplo*fLWr*$0oQ_ZQOh??}db8tg3wpwRXaNJS z+A&PnVQk2qbu6~nq}pOjO=<;r>!j;dr6WVdm<=3t9ck$>p;OcfCoGPYYPeYSmy(N* zEy=gKk7Ij$fGx=N9FY8KFjuY0R;z4kRZjPUBIFTbZABT#>QsYPHE8elW(&>u4Cbl9 zLNz!?4Hl`vVl`N*Ry?d$1l5WqkRXxE%lO)G7-rEt=B2A8ZbelX$j(O#Sgw(@Cj!_Z znNy6>iy&Qr;<+eiMJ~q`e5y@3B~5wq*lvH`eQUh7|cH%~YAf(<1Cz|HA7qWW_iv(yc?i*F_-Vk-N@TBZ!5akfSa#!jp%seF>P-Vs(S z^3@G7YY1c2KNn7~OmFMv6LbJTF5Yo(L<3q7YBa@bOP(A9$j2y?YD*MV->#<99cNGxyx z)HmemTxU`1hS(w;jT>@x2AO}Z#a|TEexD1v`f%{m?m8`9hvX0vsf<^UKuFXVp?uVp zxX$D+f^cWyLeF8@N@YXfV;E=PUWLjz=tyJT7wV?cJ12ybN;RINQYCB1#c8xfC1rN0 zti&v5l$2TJ66Nl3a%Oj?9qnRec6P5*dFZUb>Wf)ZDb8gvGw@|)R;+ugzLP8yLmTsk zlFVH<4y?l6NT@{5Z`~kz1?IPbNH-gW#k1gTP#TkP6)#2zJ0)OJLgcU`C*HBVrK6eM zHbr+foZV%X?rym>li_^J9pqiD(KM`csQ#RYnKmYO`Fdw|`ToN6bvfD*B)|oSH20bA zOd2Hdr?K|I{CUc1C;0-bN=1=A;J2BKv$u{tSmU#?S1~DBIwCWKvMN*Yun(@A-ySK zyLdwRqgi=%3@}p{6j4{raG!~15N^DRjZ{G21Q0}buD!{i$~>M5st5*E&VeA7(?l4e z3aF~qJDV@rBzt$6f#PoDzt}09gW*VVtEkNFh(q(y^s&5|%G(e{7yV8F^P`m4R@cjk z2n>U5b$=leZoUYd!4|~QprTvv&IBm%%1h(*Ln_kunRw-Kyo~xR>N0D(q9UxNYPL4? z65h@>-}_Xt6}<=D9Tk5-6;Jwf#c)oKBuM_}S8Nc(sCWu{wdHLxK-3BwtIXq7s|)OD zTt2JO|1|KaMw2g;vfwR=BYNdW<3G3c!$_$0UJx7v$o^ZE-f(rLiE%~)tja1UW)>1Y zDGX98Xklo3N$4}4qmU22em<2wh$cdPn#&fz#dI3g-pm$cvwL!Ida}CTa@2Edoz>No zu&_XX6{cs%6H8B(_GAtSdvKT}I7ZY@n?ukGF@AuP`W~l9X8V#R-_UHoSHY$iN9#_= z0Ah{R@LOkQrm%yvTWT^GHi~rjA_E~K7@`H}$p$(jsFo`jxMihq zgIG!9reWItT-@?U;#T-y$8FW;;`S|62U3l|Egv)kt$2^p*ef5wQ;P}uvqzM{Q;rw> zIXF5@qk0LA>aMY94aTOyFWD^YgwoOR$(UKkF!Li)ttjFL-?V-3l|ll6fHa^N6vaP8 zzl|8n$57Dc)SMd2ukPi}fgX0L<6Woa2wor9W+gk`hE&VJ1xnUwC|fNnG9(2`6O<-9 zMEYHXA)UR`p1=-90|i6!85$JMv1K@-_fhrWs3xl*WwRs7+gT?PuEFk1u%{4z7jvnfycD&#pJT`@>!C~VN`G9g`Y+MIQ1 zIs{L5<~8(*c@D!Ha^AdjY5XgwpX1~jJdqedvma9YXZKc`W~}q#u>$fX!*=m>@P5mo zew%=-?lY?2OJWt$45HbKflTXlwHWRg-8dJ{$2LxCrGqrg9nqVRH8m<^O*@%Q(CGo{ z>oehm^g%mDYWzRIWQsl^O|?FJeh#t|hN(6)gDau_RUL^8qTNg{0;>N(3Okf`E9O1r zg9$B7t7zkm>R++`8l~yM8SA05h#)9NnUJUiefu9r6J1n4pVj57t2QPtn$@YpDn-W& z_COKxP&HYr)$+K4q<8 zTq}ARePj$+SUpzp4cM_Sh5{5eaq$iFmcaXbg-N9A>m-K`8JKb_+BWGXJVrIdPj= zD;-&Jird<#VkZhQ1P!Q_*-+ck*k?x1Gz3u*>~Y+TzzxJcvIYY~D&mqb6N74fvD#Fs zjmIh>0dmb7d;TimKG9f(6B;+R`g*N!-arYD{|6KnFe&rHgF~L0StpovOQOi=pLZy6 zr04=-bZNxaU z90p4Nfjn>1NJ)>ebl9m@dT|%rxbDoUKs3G+8sx4#37?o@h4_>7=}k)jvftwy5#`u} zElCd5U(ua831G}$0WneHNv_Q|uznUWqXsUKj4TvSQ$@pBG@bQuLYu-~;F0Xkgm6Y5 zEMxxQXY@fml{UH$mR;2c!O^0H`ryA$``}fy|1+ecQSX0?_9$jp#(h5RuTYhICGi`n zu4)_W0cjx*iMo~LoWNKBO%ZrL2%NHX77wF#m8HW8Oa)a|aP|aUO#X7-+5R~$U!TQy zzQkX?j`SjO*2I5-;nbZu1$8KmeV8;q#5XQF0wk*}_w=m0#nl5_nro&-C4v5R<1GF{ zxSm|T{zL{I#A{x-LMh1!-OZ=rpc{{&EP+0Xw;<>u#}+(crzueBW!2gyo9@%RxaX&B ztlVd4%j9fJbU z{JFTi1sv;w9MN39^GcHwd#u*wU@3h+_WUF=G$*!njno3!F@k}LfsCwEo>f399?ZkH zouB|2!!2)93`}F=JIB)D@#jcmK;|_NWQltXZEqT(4CJK^RGid6=+B}dBQ=g<@HBTL zz2O{s(^H=-EkIezhQ&L}gvY?~o#U{V?9){E8h~IK9AiVOnd}}o8Mq|GZAQ-k z#=zlP;Lz=(-T6WS2l~#!cgLkI9Nsx%b}Mj^6OxjU!vCNKvG<5}R8aw*to(%k|HmJ=1*0x1LK)D~$f1(;Vl!cEhDj2(UVLl%apfJa<(MU0s@BZGTx3OgnNX3f z@_423tUx#4oW&kfwCrqr7ZBWXYmHZ^TIR(adtTv7wO--(_+Rx!uW%Xv|GeBQd|`!G zcpm?g>byb;{{8qrhktLqSNH+`m#y>)uRY)u?);KhIQeC-aP5O$VctVt;VJxIzuGI5 zG>cw7Y?M;rWtq_a7W?$FSvOU9RDJQ< zZ^p3CFtsj&E0B`XWH{5{Xqv!QvzLTK*6s*VxZUTQ{6y*I=Qe z#&yKf6ROglK(yL42i?)_r=##NRuV0AYz9S6H$0=+174dMNG{2@sTFz314V!_JgC^j zUV?R)bqhi@%Aj>^G1h48o3fqCpn1C9@~#PJJNCTQ(ygOd&mUyVf`kJ*wXN7rn-#Hs z(RGX+_Ij`*s-bh`a&-bN<6t8S?h2-T7C%K6_U+tO-4Xp41eI@F1+c)QrM9(MkxTIy zq9WHVE6I`;s99`LDeEDN=_|#q4)-B-QK^!&HB8yGsJP>iVwRa zZL#&DawE3K%m;qxr?pl@=x*&+e9m5IHCapxZOYwNwh*gX*sQ_{J(I1?4r!0j&OzKc zve2fk&93dvqPZ00vKSp!$34m*+cbl0*C@r~<*~|!Qi1lqda+8!iAH-Hu-puzig1z=X(C&hz?To{dwe9ejh=&h#k>CAuz%}e3T4XOugN3Ef2*HBT;Qk zmVA3I#^2&AZrQXW85$8FaXJpp4Z|OtIE29*nNZ7%#HnQ&x7=y1q)jhe5_^IS3RLhS zy*&pSZi_uJr+`B13tXMpuaPvzqFe!my}=d+uZ|0{g%7jF zve8#6kEuWq8?4s$VSO0>RcXOJQmzt6>NrQUVGHaCpSBk- zSSq-iECPk&MKd1zlQ7F&gKA^{{$iw3NbB|`X=OMu9`0?Zy7=T;Ay(xAy*k5sHCO7C zM$x3!!S8)GcCW5te^>Q6Y}DPy2bSPpHsQg!0K|;X>!7SJXWFe4AzAC*n6$V zpqq4~^T4W(7tj>q zs0C;>tG44Jr|;Yd=>bJ()~i@{_5^Te<77neMRl+M%$UAd>G$YH8f=tu^^{pUPP~H> z*A{|E2FfsRYj;ScFUpIeRtuHkKvkR3ho4wgGX-x8lFk8f!l zBI-Jnf8|J>WOY_{RQ2_;%#L@=xc7}^ZVK4jmY7W}6H9?T9fM%5C1xlPXXF0}tB&^q zaW;CwplIS=LRXr?TY)A>7?pPAA?QbUxB1XpP6lI!1#(pTKcy+j$#{a3aU6Po)~lAo z>`fvhcAxzx^c7kUJZCoHe&?eqxPS##7>5lOl5gadRfjtF(v9z(k!oW#4zMpae;?e} z!%QShZH`}-=i7tYjqt40(vp=;I|yeHf(5iUS1+Kg#CpLBY~s`lmhmV3e1KlSuL&!l zyY2M?evGkzF2UCe=xThupp-x9{zkokHiV)y{w(BAI%umG&^@nu0c{V}3+R44y@2jZ z)C+d=8fot}>gCT>{P`e%iv0O7f3D$A+H$PcMI#@@FxB&gIV_e`fQil|OC#na7{G{F%d_0)IOB)6SoTysjPmxsyM) z89v;>0NjN5H%T5XAzZ&sFR5w)UPyfF1w6; zomkm7UPJVH?KNl#HJI4o=y#IN-NBAox;&TH*=Xx6U1rcSNTRu6rZWHGn-`*CQ) zyAI{g4iAcxZS^bb;(L8?vUgLn<;l31M0v-e4B8rQ{^%!q{*wnKuds!6|B6zTxV6C! zKe43;tCOeKV%vOv>?Eb*y^P)(;<6Da#{aBin=;$7Hu+6$i%gsRW|Z5u$gFf(lx|-7 zYs00-?zsZXp-f7bS?M+t4*xm~wZ$k;=`s<9-6l$H8%{+TFQLv|_}_v5ZTR1U|2F(L z<9`GGS^4AV)$;G1$6Lc&!@C#nUcCG8?!&tu?|!_Kcqj25!h0xYB^^>g4<}RPU^+GW zEdDk84^i1Z(D6{`7HaXxu+jQd3~(Gp5s)Jd8J@D>T-ZTN4;|0cg>*0Hul7Ug|Ty$?9`{&Pgp zgj)*cN?*NiRzBdp&^7{c%Lq8M04+@Q+56;#Mz1&?3u8VTkppFC1EE~}=i`44{^#Pq z6#wP;ufacPoeNs$;+=zc4&K>#XXEX}+ljXwZ*1jy+=e%f=|678+d8^$3>vLLc^mNG zhX3tUcDir;7EoYBU+{0Vc0@m*ZGbW2M)lomSN_Oyfq`R%Lhw~XcEEc!rR5Vo$|j^o zSw?(CId=cELFE%`!|fN}#PvRs-F2)ji&!^qk_X_1+fU!=0sM}scyXap4SHgI+g$=F=;b(QIbjXg96d!%SvVKJ}3j0wZm=54t z<)3nKq_IUq0J|RIB?sn{j>T`XqICI)@_{Ka9=)ExYQ2S)6|AsevoCgW*)RrMF5_l- zMdF4{Q!ox;pv`ZaYP3h1or3w30aHwi{uXHx2joD2&Z36@rOmOt-e^?YRJ@(b>sNNF zD8`CZsfXjsGE*2c)RV&bEDHEdbU?cK;sK8FHS`9`2i4(HR;yE?>!HZD8Z(uO?{o#8 z@pQwHZ2qV-9)b{LI_(6c?UYzH<-diKz86xv2i=C_STNBzOmB9`eTGgv;3j0Xt{+=W zJRiw3wD+rER!*s>i`znKk@jr}P-J3VaSxQ&8XQ_CLpH1(g>Qv5(xun91bCXZcXTeF zkqeiBEV6n!nd8ySjgvgDHaL`I*2d|N+FAznN4!t0o2a!I+0-JG{}yDq_T&;wUAT`~ z+qV=t4(!PB91$&srU4DQ6JI+!I;kO@G!)c68J$#PBteD4u1L?T>>oCM1C{H|{T5-} zgHX+$a^cKWZ*cnIu-Zub(6ry9db+p3(YgfKl+@vp@dXHkwJ0Uf>d6=IiM6(;X8U?6 z>$K{=u(oSB7u`CJO-*T=1&}NxW zu_Qd%0ULX3`kSeu5)K|sy5w6xdHP$p^Q<&fqn!oy)XdiQ#&Jq}snUHAdsw~*zhl*JFf2D;A3!ve5JcN;~r&eCnO_g>voMWnlMawt;v>t!-Z(t%cNLr*xc+|f257AC7s6v7!SBsAcib#C|6rTYa_subFI~pZ zu*6Xoc8qPD@MzY2&XXCi2-#84AKt7CEG1T1vHy<73&d-fUFh=L1-RtCtO;v~kl1be zusVTNh-xLQVb6HmU(2wckd4nD!eOI|HFB2r;R@;_^n)j(@DdWIVB6D`belGCKkpF4 z4tUp?lhx#IDjYPXJvY| z5ZPZoCsZbWm5*61!lt`9+Vo0{T>9%4rht&zzb)W{shOO!nAH2JJX~FN8gwsd%!UK5 zG26WH5T5yucCtWkXwwW8Kc&@VQeJ!(*-cGTiSw~rDuQF{6%FW&KriG#!pXkhgLEXo zDlAjZfnlVKO*0oIx|=WEB4;Xr9CIS0`I1YvAQDy`hSTQ7s1t_2ajCzO%y)c`F7>B< zVa=C{;A8e>WBp7>%-xh#x-6ezAj`?$Yg>UTuy)&^$N|@#`&0JWuI3 zY3rRv;*pXPy>V_P@tjo5% z32{nIXZuk5qr0r~^j#)-zH-hije*Syw3^qCK`UK22fpq`?H?fy27EcDZs7(b!Py%a z(i0BE;3CsyjwjnKU9_*xM~C3eYB9x2mWy>mqdE}MA%Sf=229bYBwV3Om%4H`#x{)M zEB8w>`o}JWKUs8wZ45lVx0D4OQMEFN|2VX=@>KiL7C*R6@{L*cgK=&gitR6+oa9*lZze1|CCk51l8BJoAFUX8jE)ax?fmh0Obp8px#Uhw~UB=DcR+rC7B` zc~UabB^ymjmko}(~uICVRSCHa&&GS zM(6w&MxiqSodLPSe+?v<$W7J%Cg@G|Px;LH-(aWV^0+l(uP@2i;aCVm6aAqTqTw`= zJJ5{yx2eB2-vg=_X|4RVl65Y}>3+>bVA?kk*DctAGL{O4B{|(hAty`bNuU*I0hb*u z<&mG<^Lsf@D@7(;r5p~Y#9L1(7jFc22yiv{i4A#KWPV61+Cpu_H4D?>HhXoyj(+qU zXAlk@rjNchqOSJ;{>CHSg-U2*%DK#PO z5;8#y+u3QY4?*lB_WWV3)zjT@owmJVG=7B!esMaKAKQpAj*9L;MdWGc^^8LTNQav4 zL`|5zP;QsiG9RIZu1l8FsBQ)&)L~;L?ubfa>#=q~r2;_biMUY05hcloOC#dH!nfxf{uhct$ih3PJ}_an+9nW`Yw{C z4SWMxNJNmVvT3hDvJj@{uO6CT0eC0iPktTnRLD^(#Ew|((WT#Dfsn<;CeyV(Kgyl5 zQZ42Tr8VBgSqZE|zdCh@p3YUXh}juolG66M!?Js3?P% zAyn@*vKH~IV~DCpJx4a$JmZUTaJnH|yV*#0UP*t3VF@E6W^MHX0-k>Mrt-&`9e>PZ zf@5Dfrnz$_=}?vSeK2z^rhn3*1xx3E*J_gUwL{SFjr}!B;5?k_h9D+KItjwTMl@P4 z!m)7hT7mv3Fr_K}31CGRl3ho4?M%W|gSZ@?+>k+S2a2mrJV*E2X1yrn0r?F6OD?O` z%1pFSouF3Io<@A);#xed__yPKEKUw!-A--FQ=9T}r~uphsSGTmWXHb(QG*M#>_O0w zBd^cR!8LHGkCeq(_~8V9cDxKgbcLKh6aOgDKNkO1FCI4f?X)ZTHX|RY|MwyT_FrZW z__ms)tnoC26B*<8;DtPyC5^k}@g6a&O1Dg)8i;TenXGL^ymp{8zH}NW2lNPo#FhF#vSsclE$6#1lr<>9lHK} z9F0iVxMM_(wVzqz!v9K*W79R}sNvj_#%)yN_Ee39yv8}{8n=z8@m-9JPq*CYy5j~AK^603KsP0six6h#C62@*{-o}ItNuqypFh83m?8dfwn z7=t=bn~o{i7*EEi{t+R!++2CUu=K~AvUU_{;t9=^ZbQL!4 z)4L1}{%FT18MN9uv*Ybdi~UI&KVVp=UM37I$bVFxO`y{VG#jpv!3=Dn>^PTcvBnI* zy&TY+-z?>7IHo!Zv+*g+FsMr8^YW~a_9R9PetZ!>$AX*v@XM_8o`i_-orm2ubt|V- zdhpShr@^=JA8GJ`Hgrc#t)cYAd^iG=*3+~%&>YN9sp)le+L^1;=z8&#xNE;EX=ITH zuSy${?WgIay=@n;%<=S&yKpf?B)cB7LDpVc5KCm@H}|qw*E5ttzh!&#cYt{9Gn+Bn z184?*qgS0rY1+h52^o=Var(%8{6#7^k?}Oat9G-}kw;GIL0f;Bu<^af<$6GD14Ipu zmL@ZB?3;RleWJWOv*X=NX3e6`!Y}zsu!&`}dONb0wG1YaVdHQ387J-SXP~XmKZhw) zkTSFyG)JFDb!qdlJ3d8V(zbZ}a67~eEtj>A%7pdTvft2(QwFYAsL}!=+|`wK;$qy* zt#sw#_Q7pcSJX9Ve@ZgDaf;IJ3~G4*hUjUjFyPTqSc7WM!vLc!seVHa-f~Yz!_4`- z!km^>b`rL5%~`82rUm`gpYa7nn$1;%$+ zI;I~Q*HIh4)*=YQv03R@D`E}xw>J+yrjk0Re4X}#e}M8te<>~P2I#-AHE42w6iZ}8 zLHr)r_3%Mmr$w%U9e{G0g1wLIxkoVqJU#2N`|3PId^Y{if-~kjhg)oVF`#f$o~Gir zrpEpc%H_n*RDFaC)dJ@?z}7w2mXp98u;+py?V2AGn=!g_A!QrId^s2#e)mKZ$~IZz>4|@>ll(9SxK14@rD-shoZNm9tQ`#pgx!{w$ZL}Zp0p*Y6MH~hL z#GOh4Uc|Ix&+v3gQ__VPcZa6@pYIvYNXbYqR3{SBJnkNuJ4(3`6TTShzv9 zL;8omP&!O-7Jp#c0`TX;_O!K=RUClHog+yeUW#)lBxd{zI z(8$1f8~lpI(OEt0V1a^=6V_8S-Rwk&{{LWkGvZPia5l^=sn%#|$k#blI&&_q( z127f14wxD=f4MD9gT&mDM!WR;7il!06)=HPY>zSF>A=vyPq@kOm!g$~8g9{pvEWS8 znMNDUDO|XV)}jT1MhDdak+!-Fh_sA1Kx#e-)?&!*^ zI$E5oJ>nVN;!C&k7LV&plnwapigagKTe}^j4|dj1I`P(Cev0n=eC+^%!THgcfs$}C z)Sn9lb8L{Gx}#&CYLlIQlNfioKwBsxZDGP%WWhvBI=Bt~vWuiHbc5)gIBUsVVG(sqJ++{_6Z%phl(8LC-z609~tPC#BWi2SgZJCc(PD>@!NrX>yurA z8t0T|GC3QKpQ$yV=8@ff`4-;zl=l>xu;+;M7VvPxon<>6Yg>yK*ByECBau&lDvi&q@D(x+AlVe)C4K7KTE`^TGzohs}IEQLxNm#H$ z`W>1A88ExaYPuU1hU*We#-YSgPhGNMDSV>vLVWbk7z3Cs8)qA45bn_-83%^(xgzw6{OP~8)coh6D{JL3=2`d$cp+2L-fT4pQ z*21pKDX`BW&BEIEsS<3(;rXQRVt?$2jNj)O$@4gz@prRR8JF>lY3v$WyE27l9AUyp zB-e8vxt>uL40}Nv1a(v7Q+jjLgg6gEd>eabL1lvwvGv8!&A}OVv_@Z7qUUss zmX@H_%0onieoH47*sz0~hyi%{x11g-Q04R(f`jW(rCUsulWN)eqgTlB5)|pH$dQ$9 z)nlk=m>hRr$@5*FXA~t)6s9Oq$@5_11X8u~Rb30*6J`0$f%(z z?SYPtYQS)|?lda)?1O;gbP||3wMJ??1Awx0Ijvw#1CY)seeCo!Ia_qjGf?A8=e+mq zoR8|9@=MN*pUnB{#i>TmJv*n6i@i;L$vNkfIUh{t94R?x(uptT?{RYv$`s17x5+PO zc;|dF=MpDpeI2(xVKYZ$bYTg(jg>x(=Eov{Y%`~@iue$vq2|#Xzz?^In#R}}Www`a zF$;w1d4^?Ft{xj2`q1JNr|WkWG>w>U54T1~Th?cqr!v;OYYmPWvzv39M>LI{-Q+K3 zBlh89hx>~qEez+O0$Q}ti^HIz4C|VK1&uDVhgc&97Ie+LW`FbWrqT17yv2d`l^-TQ z7r1iOW%J@y8R$%maX_#p00dOolym+(v)7I!7!VnQFULz#Y((E4W#wfpL_iW?77eSe`kub5^*Z5O*YNi@uG(M_da>FZ3H7-26JUr1MzM2y!tz9UCN5y2~f<*~& z3~s8qM&lOR6w0c}Z#5blc`YvwPvY+!Y#NG6fwTTii0qz)h0~Ou@qu5p`+h9Xj_^2C zVv}R~VmGB?8zl=@gjh)$o7V6#O-`n1zmBgHkAM55>cI~!Inj%KolU#=Do#Adua)Ig zB+3J3cOcQh)W(8~b$(gSv?rgzvK4By4x(rFs>4c%x>kn4UY zCGMe_iO);h)C$KHF(?b)ULGzh4_{IqX;qiAxKU5BxVQF+jg~y?Mb?MbK`ZC`aQMVV zDX$E5bLo9S5qNPr$l8@SM1P)%k-?#i#7F|G6WRRs(NZxVV%7h?Yj~jqw8ayfg&0;l zTaHZ=Btb7!K3cyFqct16*0+U`C$p??3tI-4YCZ=cs6Y41D$JvKefI%GI4}FCafOHS z+p5DO%UO8t6y}&5ZtWEIN=Z8(g#zEV z;OyNxSc#aYQ+BJmcnqMI!#pprBDrYOo7cHkkG4ioRkOQkkWK5lO6=hz*zgxIn{JBV zZcrD${WY-1xfJfF_PlM|d)t}^BXju+dhu+(%z!KWws34L&P<;%B_n)_HW)kim?xJR z_k9DBG#cj#37@>wXgnybIXT^E{DFQc$Ew81xp)vb`30k~i6H2GfqI;Arw_Bnn}Lkg zx$#*USk*Qfg`+l)v4%H|u(Rx8R(CV1JxyLaYnDAsz%in$AcMqQeym;P;W6dm^UA|R z%Ok&dVn$*rS)ce~Vlt1^w&;nkBrfGkQf8Kiha@+q!^;x};lbTcBlc7~VMqc=B-8B3 zOy&ezbm-&h&@8l8*)%?}B5{ZYx=$V7m0>grC(!UTiUlQ*V>H$hH1*PODXn9M!LII( zPi^4S6f&@ZXy6+I8W{QSL=FYbN(@gmk@ig}4-bb~|CXAbn4VZj0Z)7(A=pkgXIY|{ zFRRs5L8Ea3ucpFWgeG8SsYb{J?su^SM(bs4?SlOqI46&;lp<>qgQUp26Q@ZB>6>f4 zT;?3dDBGSIW!q(xF{K;PW_h8t8yk2rb`GYo73%jXRB>=Muq$67$)~l{9+r?Xpo@{I zDUGmy|MX&nVg?p-7DYs!N`65)*jpay(oZBTR36^%L4;VQF;~OMj z?PfPLP@-Ego>uS9nNoXH)?6y3Ra61;kphaEV7~g+Sy{$^Y8IIbVQ2oPT=9+cE(k)~ zhAM|3zqRW1)`!)6T@U`0HX@Hh_ZZFcyQf|po(`Z8Cu_pXpG{Hc`J5XT&Fxt|n%Q6q z>zn4`+&OI;YL|M&1Z7vVoG&(I@QIsZr5*=wGs=o;d)74YgVtNAw<$ND9a)F8|5onznqOG)ak5fu-j#MW<)Zi( z$&=*gsZE!O^x;APPhKK<|Cs8!PqaiA#}ViUeN)p6GC&3R|X}@4UXK$`L`K<46J7>Rw$yt{~wBL>p5kpvbYRuh3AhxIPMs zW~;iPMR4FtZlNpic&&;UM`sFQhER&g;~D@~AAKFdbazUU5Gqa`Ux_tMib-LHIQZ_G?bGItLv<@ zi>jEAH+q3-N;vZrFVv!QrT~*Tp#y1#417mcn$`pU#G%J8cj@-`WzN-^2hiA+ZIU2O zWAV~)bj+D#WSo`a%=)MAKD&Z5Xz;?bqLEz#^hTOgla`aovAzWU?94zvfx3ke-Tri6 z3yM<_-#sJ3Jn9$BqxXC68^YGQ%;IKg!45tJ-g8al}mCuIl^aM;(EHduQB~lJn;G%P>j^>zw|=; zPvs5>{xd*8MdM!qaLyS3kT_j^^wX;!^=Z}X)%%zJN%e#NFVzqFAFBWN*FL57_{{RE zBeOoe^`8Gr^`8Hs`Y~r#?~p(}{VfoDF$KX{Bp}iM3Wl>tK$54S_$MUrtplHe1k^9R z>W^igjs)+&0^n>CKoIRv;6EXOb3Uzl28mbQ_D`z!|6i&{=ipyf|D9LQXuZ=1gHyxs z52c?v3?=$s!Eja|Nb)ok|D+GHKMjiN6cmd-9SVv5KR_YL{|6}U#Y*)jSkjmj6tB+w zR9r~({{ad~{y#vGaV8WFOUe_1n4bdSY?hSwuK+lk9`n-GpFxiebzT`NoSPm@%|dW8 ztVE?gQoOuKPSj*ydg5h^Xad2BOl)_F}Mil?I>`@!NRXPky}ze(;9EMWavjZVU;)n7%% z688+{0)J0c(k=JiB3$qYoLF;V>JDdRmA%k!?nWH zB2MHcAQgQ@=SLQqlhHITV;<5-0N^gTB*o#xsWp!+S-jNxOInd3)c_5TWBFVgoj?~6 z1>Q?(%|+^6R_3yNbpEA|pT9an$S#L%G)1w3@<;8}SSHDFp%S?5(=tqRGRVf89A@vJ zmB;28zdqsqh(ic^SPr!~n!*pI9Oa!T#%9HuQQQousIJ5m-|w6iS7J3}x?dT;?r^tp zLRo1q%yDo+pJ8D3& ze+!&mGgjkM;%d9s_y$BC#is|o;H#!<956QgE%1jmS4q+B;fv^smobOlWo)A(77jDE z`I~Ywu&^|&iORc*u_pTtOU`?((@E1!LA|TSIpvM&FE9MJK<~=)bp6C3;th1IHU>mv z0|682-58VZ&3`e!J8*JcexQBTC{Da$jq$b2?6D`~Vr5=TZU)|7Rb+wRIzNa`e3xbu zqLV)CBz>SiY5S_-oF++9)P_SO<&~2OQ)O_{VKfy<$OBQSz-rXi@5R6Y7i-?Ox)K2* z@k4yS>=>S^WQkPkg^-3bP}SF9AT^1X=t7~c% z=_yB^KFDg9RrV3}(>8I8_BTqVIC78FTr9V!?ntDZBlxVs<7Kgk&(W;s1?m}~i!WM7 z9pSvQ%UmdB+USn7Q!K+Ht&xXh5eZwTD{|!kb$KbYl1VUC?BmGXtZtT;XpYx1o}3HTovDT51o&nC^z_okjBFcNPv-((oQgm<&U<=#G+bXc!K&jUG!)m zc6O6ucheE@b`yqhw$^7n!p1ZFx@<1}NCjjY8t#zXZ^t5s@h5r^nu5qhKO?fbO8p0C zLjPZ=Y@VlHX3sis=X;A!!wT&c)gB2?wdy+UxxVmK_B_wpq1JF54NZ>?PYwpDPf6#L z9z-7^GBi-XJsUQ4~~EJtOAmo{g~=BTRj|Y-E{4Op2*zhijR4pdhLRbBiA%n^zwem zwF`P97c^Jcy!)?RU`K|ToGKR8^{m{Lyx!PWjNPKycCw7OUfz0>Q+fNCw~v!o@rE_B z**#qFWRAhozR~QblpLIk`-`#M(SuxL-6j^Zm8`NV@ehIZsb!u|z7L6?ifKmyA zhY@T#rICMB@FhM`nG{nN!W^WkeFK&Udm!5yUH_A$cq!ynKfR6~;!>OX)iin0&{p9t zc$mc<%kUuTYWD;p-j!YH9lxk9Aqg;8Ao#7}OvQuj{W^_r<Hc^93P_Xsi%Mu?O5;HTupE8=HhN8zzS zd8#jLr%AM8sBWGtqGqOlovH5Rj!Y90vEqfb0@U0g=JlCaG#9%$LGS!y=tzYR4BLbP)X5v1;9q* zZ=u}S_#?bGm->I)$&>R4ml1u0aC`DPDSpHxvRU1+x`S9vT5C^UD}g+MUdQ7kKX?3ezJYrem&`%fooDNMD_G><%A(;R&i%L7g z!==o+gYYO_gH?Ah`J-Sb&ELLHa3GrPH9;lcN96lW`A(192>`Bd2VNG_O{Cpl3IMB6 zZzBn5yS^^yCE^B&Xj3oGks&VYLRn}@!ZyKjA5jyk1pvQHhlVmFp?bvmZsU^x_07~L zD^m5^Rl$XYpil?nC3$2qAv; zK72(7_?0Z7YSiUVLOHcP>MLK62uy{Yr@qWdT#Y?yJ3wt&A>?T6cDc431xMOH?nzn^%|y7%vQM%h)0~G?t}SU+3m70 z{9DJqNqzK~%xaZ^S0a;9T5iRz?vXSmju1E3>n4EQ_%bT>=a(L-xM_i!(^o_C+;n0; zE=m%Euq+3>Ze6G>vSmqrOqv+-1#{nk;=dsRHn`(*Rrr+D-0K(3mN8(<|6h=$2y(F8?3<=x5TOpF8nK zvx9=WBp5pAl3==bS{CzitTnp6tzHUr`quF4?(aTt%Y;k$HWRl%8nBP&|@;m;R z{7&wY-)TqrUA}2lE{T?J%El8GkMT+eW**Uxi#zq>vxj*+d|#%YBvz?wi$^~_Tf96m z&bTE(Su~!-1q@LexrwZ zwMV@qe5#yGp$v6ZD||vG={*DnkLl&oZeGo4lE4Kc%uvH6O;F0_avIjA;J+;-Ny)ZB z;+AnkOOP53KuW(Jg837v-&Gl!6W7&;(9HhNr`c?4xMI=E;6?Fh0l$pISo8{BV$n|d zjf<_;*mn=g?<23t?^dxe65AnHI+t(yZnu8KkLt%Gd-Nl^TR(o%q94C}j>p6IMZ0)d zrJnd)Plv8aP#23TLSyk`5;wai7C*vEhX!hlU{M1rSd2xF^kFT8ilT$6xCR_d2(p+T zL`vetw)dadpVb7VgfnoZbqp4(FFhkl1{zOQ_GH1Dnvt((P^(Mr_>8b@jZ3la(3VPY z0SQto&)UR8uwtD(73q;kMx(pd?xgl*QhRM;6{*tdx-VdCVMe%c=px*|A5n3C+01O)T=u}8fI&4}D$7YR9wj%7=OHcQ-{EmPSCFE1LuoDUQbM};Nu)v0b6 zmjpi}!RKz?!-GbRV6M;4)JY`Y!DN=xA#pB>R)(%;Znq1ngA+-NEaD|=+CJ*lceIV7 z+I^9sa&+!$T6BGqqj`Db0!&}N6`qhCT${?N^Y|qXS`wWYAdyUPR{ffbUvL>GB1)0b zXGadJ@9XD5wMF-wFTEK4BFTzsUo)bA<0a&-3Kh%N_!@Qj4#B4AmZs?BH>`ueB=*zl zulsDo+flklYAC~Ujwnpr(c&L2lyIauYifSjJGEflsHsI8MwBK0UU$ zzwX+|6f#vwCNP_UQhp{W2bYntpza?MpG*AJ5`T7NQSBZvsBy&DnT0V+kbRK`*k0pN z|3-QT+#ILl-43|;#+c=4LUrhf`l=TI3)rWtMfy#hEbgC*wOtVQH5sUJi$txu1c3SbtheK{?1wPM<>n&fAnVOL zUKOQ4ce}eS-Z<#uhizLbNBDYY%i#Q7ZWJyS=5EM}hqF#52f4ct@``p1aEk+yGk_ic z31A@{pH;tGKt*MP*ZX-5bgiFhzCSp5{lJEwQP6pxC}@Z^X{&DWU|yuP?#Q@1_fB=s z&C|aV@7SxrqI>RToB(7*a$=JY3XjM>+{Y=BcZ%*tZ1NEuuJ~0yWH}{VwC}3IRVOw5 zAy&PkMT*PFlyrBW)1aTOTQAA9vn79W>~{Gm(!uL|m+PmUsf*UkX`phRuZoHbk8`E0 zM}6dRYRqc%WoFZ30Ae(;wlM@67GhWf0Xb#qcNALqRGN9j7GLooFiwp z%g0mMEj+jsp1C{q+$GQDMU%JljEo}UIbNzH#ZHO2sWOREYUjPG>ZU5*g}GF!YQ`)d zEBT<*yLhnslWZ#_8_%!GlY*D=jEo^5$crvGBr*1yoXX^Ig7p_hA=czb;lj|k7o}O` z#N^H9sXIgNMWI1#l#elAu%qg(8yWH}vR)(r_AiQF^ok=KS#VQjB}vtD#~Mw}N8;hyD@-@#6=2lhv@3-<;xg?5ZbT9d=%LkPimnB8ge$&fd= zNG8RDQ)O>jH2F0_$Y(-XYSk6=F5R388m4y8zjmg?r&%GJZY$g$VpRc+he5}4{EnBh8qIJW>>f5kEM5K+r9s0HOi8lJy5q?oS8bO?i z;WQZ7hSBS=>sHJi!BsvbdgT-sD@Z;kCf|l`_*=utS1y_Uoi%@{tPa)}zLUYO^{WgE zZqc`v#TzvLN-?|m-S980cw;0PUEB^aBgX9X9acH{2e~QK$H3w<-G66u5TE`G#>#H0 zP#aosZrX9)fspIj`UM%TN`mepi0z!adjzgSVOtyKVtmYAHH%^zIs^)H;W0pHcn4_f zQB1l!bGEs+XL=+XMvNjhj93njGc_xITC-LOo9;d>`I1-3ZX=aBopb2F%*k~&(PbAI zct~dHV;DE6R?7ufcr_dMP_X`2y*6+^$=W3abdT#9VV;r9XM~-ii!SPHGdy+K*1_pT zRXc#?qSVl76LD z??b_^4{WLRI%=)d)rO`@D)l>(U=4#olHVO$k{7#fpdG0yRl<-RV1`Ym|4*7>qp2eP zY)Ab0U79{n{CUAYG#?ZZ=1?p97(-3WBlpQo`!n8pRz`(JZ%Xz_#_oTf@uIUb{`!oJ zU7yJ46N8A%{?~G2ef71x3~I_1J+Z*)FlfyofD_7$a6r94Cl0WYSnZUHxuk{U47aPF zof&^kU;NeaNzwX$urRw?U5`RVaZPM6XBc7{KY4DT)W142bm5|;-@ZDfb2eqBUU@RH zAY&5@wQZN?wrv;K+qO$d&VUBZ@GH;nng|Jx#8&!eSAGyL|C@Po#G2uu>_u$XJipsS zTy0zCOt=#k?*m**zNl4SO;pe3X|Y$<_O9a;NLZVCJRNk*3G$^jGK!m_;yq+R%&We^ zD+_S-9M4!my5rPWoUEB4AN8sqIq9WqQ=3LdY98o{oP%En?ih~!sINPRDSZV2VQoJl zsPSi%_r?FQyuI2ojuwp%Q-zW|U0!unWueXW`kY}cbvd)JcIrQI@Wk8ZL062h7@x$A zOULE*$BiQ{cUTMB=5r=uz;z;8{5T&z$eW+%f#h`FCFbUdn01}#-=Ez7*8cbQ9~^cl za*X({6U!!!Lu@s3V(y8*y7#Xf9w6Ns@5;gA_F;9#JZ{gn&yNf~@%D*>=G!jr(C_l2 z6)*o)a!FVUOoQa>2gwge*o+mh>PAY%{ZY9@(Za}iz@*{P(9WFb0~V~+&%b+K5|hw6 z(rL2qEP(d_aPGJG$w@)$2ioC4>s#&3r}gK74W2%p{`q&O0bjZpxb<#RZa;A_!p_mL zDEcs*VZdm)9Cl-Bi=rR97)I&2Wy4SV=9V^@Tb#M1&Zlaf?93%ES*;IMKVLs#<6u^` z`|fzPzVq&G_Y3hHF`MMtE(|@eXWaxW%k#+1-?QBn{Zod#XU@RsWgqixjaB75^t{Xw zCs;7URbjn%vxvTTR+nkF+vm7{$eKYSlLV#u7|C%nJL+PmD(xv-ERwX9n<6)OxPi$)Gz&_ zDMk}=KWPXd3vmb`?-4I7GBPA=e`5b3O~`v8>#>)?-h}heM)at?~8#pa1;lPrFVawc70?asJECOGZ(A@fXjJoQQ9fTT(kk zCf1zeC2U^g1ef_VVKy8c$DGwKuHsfnRG}q=w;GQ<>L45D=Ov#A4NgN*g)L2unPScWInxpTNv^^>Td0ZU%T>O#06M(}rW1AaeB%||Ni!0&}WJ`P~?CP{Rx6D zCTX2$wN5lqu(qjGsyW`85guMYCu_XFc~hnon;dbxbx?Se1m#H(1vPET5_BcK?Tz}y zB~9I#ta7l}5j{dVKLX;yy_f5E>$?&XZyYYU-239Uv!cP4fE94 zHB>vCI`-GUm)GP^a>EaIBd@I7g!ef6q^;abZWAZ^e{=&D`we)B)`d)o(g_8Vc=?+g+Zn034aKa zij6tdC2VTiJ%A9g=nQe zGPzswBAe;f7s1=pdfjJS^WxNB+sUa`%VgMhb4JGEq!)W!ZR#m{6K#M;07lNYT8g$8 z&{(7KTLK&xU|R~Nb@96L-3D91ce&z2$_6{3-1ABV zkPyF-dXUCT#$mJJl`T~G>I_Icc8@2v%2%{d85_H)qQ35ZikI6l@yOqshc{x+dlw(Z zwlW6G-o$_KKA@N;iouTv#oW2KfWzGQe-%q7MUEstgPC&1*=5GI>u?;0icD!|bNv-W zdS?d4Q(DF>d^^3z@~o_^{yJA=KmBHN_SKF$U?&H{M^+}R4nXTD5qlRdeQp=Zik0}{ zCH{D966M^o+`1B*as|_ii*Ja0WPPOGM6{E5ieXtl$35P|h2GW2DSN%mne-$O9xpln zX}NS%@AVeXj-0egJn9^BP-Lvq%dz4r);OAFIh^Vq;Z(`TizW+=7|}(Pi~hfifh95s zW%kzo|8JFI>PJy=VFOvLIM#=cy;DB;3ywRB=0JVR}`76KQGokn9BfloKlGRB*A z`lFwi7s>7fjSDi0ImJ%8KiVVlk;C@tVBh${%1UsWGr}s==YK}x*pgtSHBH8p{pRtq z6<9-hk8H;?Wn6Q;>i2vwwu;B62XBdIivl~inc8wxKYd%ecw%7)lI_l{^DnpNl=v|y zS$de@;-u0s(}d&KWjD{s9oN*9cX9?12`56vVjcW0SNKy?(`Bb5?yo3Y(cOJukJNmi z5AfBDX+*Y?q|$yf%?m)0D_H=ro6i$Qki1y*cJdldJI$?B#ga?4va)xyIdF=5dnY@) zPIa2Se49C~{xc;Ushkt~SXI&UH657}08})tZSykT+qMVgSI*L5MN{X8d;&9eH^mfCb?9!1u$!@jT~4HNbvps1Q&Ab zkE5?`Ql9!ofA|_+B_sJI<4j5}wl?nO>$5`a6{?B^*2b53f4-id{EiA$qJ#FOz9#F! zTKH0*;nm#jkMDeqFKh5LKl>DbeNdo^7!~SPCMjgVZj#m1#Mfi6%bP`1!-nq5pb-3l z4+ex`fPkR>4-AHyqNP39(-tH0>EI3t<`mDK>y30&sqONqH%MtjP8RZ$ZCkbdhIOwr zmqnAiLOuk0eIEi--$zUTM|^1?Sob(!4YAy*gyucm_ZZ5^Pk*;*I4D{goGC?8Q9n2W zhPZDtiJ*@s%f$5m8(1jec4)0C?3goAo<|$Tpo%cEI&^i7)y=Tygjj78Vr9XEzRfix zD6F!uAs)W0nu}3CkSNJmr6xdk+`FxbFvS)~&oRXo3b(L2Fv*7|hcDPIjOk~WLlm!{ z11)qpb9>ne)`jbt+sCP$61?KB)CBK;TXMIn9poUp8iz`tmTbk#?y{zdU3GN_l@5?^ z=@HsWQX8gM1NTpDQJEd3@{FhS7vbci9?nG{CjW*x;7)KF%2gS-);G9?+b+^S{Ty5KC0SKQ0v1~u~ovm_j zEIUVDnjWX4W7$55Z4#1*W$$4KSWPlUW7$&~(^k_S{qBfz5*_xfbH2`zkDW^g$xLLvr@X60B~p|dVwm2MjGNo-hHah zc^Acz+JtPm>HlJB%+I*dr(XBdB8(KH^)!DHne?IE5xv`Kz@27#x076~ehX;o2y!87 z)?FCQpB1EPiuX$cM9K;DqnX$Gfc(6Jpf0IC-9TB&4_wrd*9BeO4kSQ(gyLQq4sJILB&zDh@P(w#1_Zi{e~-YC-da2qsF44f6rQ>Q8^pF?&$K z*&EY&G9brLkc)_8b_lhElG$a0F)<&E_;bxJPgq)0JmV2aN> zDN?;+YIi3k!G&%HVr`eIr#_Z8M`dLzSI(>BYd!6QU9nsaC*n)|@se`80I7Cx5k+F} z^BJmk2N#gJTD<|4$|_BK$YTSjMjLNo7#BG%-Fy278$k3h!|-( zvFI`gLtIMkxRsY!^frFgW*^h(!(@t=UlxnsOi;Z1iuj_u%wH20iwiBqqCtLzPm1=E zxkHL!q;Wk_3JZSkp;n9r7O7wyH!%E!?I?E;EoHy=@~#>_Iuq+ zf!=Vo7=<3ZJT?n|f%y5=Ffmo)P{Y#TCT3A~mAa>ZMUl+yHL+*~g$6oST~TFk6}XiB zL#K<4Mp=RoDln@=U+DJ#e+T7bHaf|X(9R-Vx8a$bk~lwXjp|-WgTWb zRpPNUQeqjYMAfNUx4<506&oU!DJhs%4zr?C&(4VpSq@ilr@?{cM~_IU!f8en9(OQs z$zhEFbiIxjZI$i_j|gQ|+WJ*}<=eXKqOHrzrLw*q(N*8;+YvP!-3@~K2?hrSZ>jiD7LO4xXFky&W4j_At&m4hIv}oZ zrc_imbnGLe+UN`uXja(mBPUqa(7G6zS0a5W;B5tcXSBUXiM% z0c?VzEBF9aPgo`8qDd3ImG3ytyUf(e(K(V!mug;9m>AXRV;}diI1-VmPH4rYD$>SE%8jQq z4q_RhtQ0n&ZemsI{kpF>7iSN40tA6?$@LSdR!()SSre`Kc@BtH2Y#mm{_xe7-`0(e zd9An<6Z`H=elhhDD~I6Zox=fhhm?^S`>v!|_uJ%!md*pbxp7a2<;OJ@8LB;fg_L_z zSt3D{nOEn4XmW}aEVLoGM>wmfFmL71#N3@nF-3(fPuuk3@(VVVN=go0Hmv+xu$NZY zlk-?@It5gyNv~_#5`kwi!;~%9mpz=3dBh#EC$>@6Vp=g^h|_p+*Hg;Ludm9!zlmyv z|6Xb7jOuw;~4ZshI~!p00;vRYi2=tqJ#I2s2rv6;)*>I<}L7|(I{rG>Wk(W z(E@q7JEO#iUZURyEj6NIbi+CsybUH%-8#tFU`n?sBfoZ%Fg3$gr4YKI>EC`(d_v!lU;gqxZHT0!61ZO(Jv6bl*k&JLWw;JuAft+T6x=`zl zV3#C(OMHDfKH3ZIYtlSq&_fPq36HIG08ke@6-T@mXe1<40FUW9c6mQl-{E2r7~XsvU9ARwqu3!s-sYjacpq=rnIxSx?I*LA7#@Asm=H zKcm$`1_P*!jHP=GiMU!7u$-?_7n6xOD0vk_+{)rCT3wkWsi6HLf>b8)BtF!oA3g6& zo)6&tbYNTKZF zRM|{AuK1F>kluciva8iz&{rd3v&dB`ky+$&E3jQ}e(xehC|B=0%@$upuzM()iHDjs zrqx%ZRiZt@M#z=?tW|fIolfB)s`|4R2vYl=H}!jRc(uBXimKH&FvHdFMTrF$lVqow ziX>h#n9EoE-C4cS*z~okNLFp)>KAM~eUyu4s%&*9cZtOB4LbOO&A9|1D+`Z7eNrOr zH|%{xc&++wnxDLMXBZBH;9YKgK|RxtAAW3d;8By$RQ&+ac?18;coZ{iFuh62^CTsg)pmKEVg;R}LFYt??3JmByJ*>h zXnV6DLE?vlw;oC~vo+Ea-$Aa%F8om$EfaHL&}X6@dCgb%P!RGI*5Msxw_di3#lAfY z&nfi8M5iaL@zN9af!Idrx}cy4#ZUPbe8$$VXy3R8swrvTcq88>9c4k0jIvA?c z8}`*miwEw;uOmHVd7UKC3jVlZxeGGzYRcx_UVWFk>L`$<1+i?<@mR+$z76mk(Zg`s zCSE^Orhbw0L&uYhJz0>#jW1cD*!wj4=LK^ZXK1z`xG2pb!`IRY8hsAF#qAj=6%q`w zsux3KNJ>Y!xZq{Z^Vr;|gQ5vPtQd@l`gFN|0?1lESRAE1a)m@OHi?IbVNuzNR`~2c55C=j#RMYo_z{oby%g zeErJ#x^zzvz`VPo!N1k1+R!HJB&a0hXdQdW^rADgHOtHOD=bwpI z+L9XW&Nk5DE6AH=Ux;Acr9OuKKnK~?t(?<32{fc?j{cTfbxmrj{uZ#dXr6Ng-%P-| zG9^lX5Y_F$p+}1azf#~v5`ft)(n-Q_%G2ZOo;+HqS03R>XO62%CkrK=C*$fX(l=*} zt3o7CgHNI z21+DV7t2DGeb!f?E}2fwX-3U%P*Z7lQ|-z2(o^DhrEqUkZFhU=N!N5rVlT2Hht-K_ z2y17dlp~(hu3(FQ3f;~XbFm)erVJKZEg{-fpA5~rpXrZ5s3ASlxxIl z4x@|4mlK9pzjYAIdW7_o=kRT|`-84}m>n7cJ@zP{Q2Es|K(rIYH_i5(l7P;*?%)zz z=je}Ix;Sl;z$UNR;w;N{(J%N=G1>&0Rd!0&X0TkaT#y1DZxh#7DNSR zN3QzsjVavw%FN!0>t3aQ#gOtuosxsEYjj?QvQ69c)dqU6*IBFm~)&$!iTJE$v#jCG+4~A z@1xOC^};8G(4C>dhT6Qi-UlBwFP7op+Hy0$90X@eYdSI)@e9se#i`Y*l`W|@O96N8 z&2jI+O9<9+DttINC*8^+W=jq>ypw&3isn(j?AfP_uC%Wjb1Qda7^J85?}qit9eX_@ zG1`zO+h_I;!OiSk?*(I%|w9y#tO_W9xkR@{NCh6F9EQ)f;zC)+HUjD894klqH>^+ z&t25o?$*%{}_pLpYfF!0WCdm?L`JjMeWNyEC`X9Fm*7Tqp8_)&Z$%JbXVR4Lk5&yivnF1QR$toPf_ge_u7y+T;(+d0tz* z0($IB0n94%n_kSAr`Hn;7C-?w&E~-2>;CG(LrJ&0rG!iQC#|+STJ$JxERazQ{g-y% z5-aw`im|@#y&-Ze(ihoc00$ANsJ-+-icQ) zsPJl!M`@|iQE?UuH`B*%oV@s~H}e<3(Z;mCXIL+s#nFyg^LubEJUj3~d|gqGH6b=v zL?*^J<*4j<8*HwW7x!CO;<+!t8?2}Gqz4|@ZJxY-byn#58eXlXp1@LXq{QKGC-YXF zE2FVHJ|{ynxch~{T_WsaY;uCx3WMv9eE9yec-(w1rNv-&^F7uEZ|rVlQ2zXvaVLa( z4wv!GpMVaztv%P*YJ29#=Umxi+M3BOwQ7&W$DNLG*MG6jU+a(6cw;wugrnT(A**o=`D+kJ`?f_>Mhnl=aPS#Ss7K=fA(DBc*A z>TC??`;AR<)Ax9*fuS>A8cqr$H17Lv-Z?-kTH9kpxA1Ot1wLH)LnHbmsp*$3^B8U+Tp|Tda;d>-*&5^>2hGSjKGHDm8~Uz-93L@r`9t zT&t@d9g0@Ntdfej%;lnOW~(p$ErBKQg3)*-5rIA2&K_(2x!3)oMVT)|-j|p$lEo`* z51uEDs|mbpL^CCH?rTNmtQ9_{W^fQIeGNTMK#4{GSr}IM0tUl&V(a0;FCS1tN)HYx z#n2SAFCYAW)GB?gXsrjU_-8mhs z@IP~(pbTWBK=ydYJ(23;v zp?@UL4IN944tf z`4wCoGtew&zAK+;6{XuU9CEk5)d(UnJ(qk}Rx_VmSwu8%EbZgVh7=OJ+q!5Q@Y%DGqmb`-5*-5rZFS(u67mV%27~fG09@Mg~IC{a2 zp43JJ_l7rkt$*{x?)Ffj^>4E9aMbbuGBxwv;Ej=Bfh346@TTBe;>>)*dRrOjP0WII z7uDAdb47;fsf{83_aOnRe-i8&vaV^SY)VLy-9G^ixkvVN@#h>+=XL5$*MawkTmuWk zg3++p(Ab<2vZ!FK73p&CmvsX{SFvn3W(|+uoe{e(x;JueV7#p3K{rfLZ$=`6Q*#X= zF>ic^2c4|F*s2XyxTm|8*^}u$7x#bsvAZVvo711~ITE+O(jeeVJF`pM!DpxVl6FSWU}aSS?e#qaSuh0gQ1Un%rWQAat~#myyd zq@3@=@?Gl1as6^5I$CpQe|({eRrXkmePV-u?osn}Z+I#8cjKPL)|`zw@tGU___{!u z11FSwq5n74_S;-8D$R(ttSjCi_lNOb*WDX=xxUVJg(q5BXM%7?3WO>R!nLYKgK*5j zMjL<&c9MHp{4^AOY1LOc8BWuR8T77jUQnLuzuEYhyE%#t8;B@E88_LZBwQ>U&Go6p z0D}fq(IQ{?9PJ{Z+B#tEQA?a)h#^+)I~$}oRykNngVZkHw6WYv>pocOay=s*Sybuc z>IW~WVqa84C^Run<`?1E3l?ZQ!3YDzSZhyU+{YrJ3lBkp#)5my%J=y(%rzi6i(>-9r@o5!Y(K^HRYz~aL^7$rcwpv|{^otb| zm`LepH9n=ef6znLotsHh6>_y_{v;dh*`pr7U=bBu5?n+%!PBs~Ds_xgPp5=Fb(&(Q zj4Jgk2eHM#ICb@uD)lQq%=ZKC_K^GOhYjqv+)N?)d)P3qUMoe&!C0T7)W_SLNeD%$ zUz6!k5hSG#g0Wm1 zN!F;8aTg_6PuD?Arty2BxK5Fh3&6w~)EPpRRL$PShAPx@TQk$hsfy~$VjSN+j zK%&e}uBsM=<^xD&x*FM(H?l@x}@g-v9@q$Hk{AiBEm7=$c4Z z14l*n^{YZ5PbJ2gq#56%UIq)*EKJVR@ctgo5cosgpc9AUC4<-$ZTcK}rb#}-yog5y zii=L(#p%38<4_`GP9OJRY#0M4w#pN`QsWTR8I4~P28QPGF>S=47}HQH%Gs!N2WJO? zUZZg?DTtRO;uKGkpwHn9WRRQU2pzxCT!R&MeB3NiF?E-enA2R`LC%mRZ+A)>-zL}Y z!U(q@qA||Nw%NTl;*Cv~q)ERyx5qBh??x0|V{KI-WOEuMHlM1haAh8g9JSwM4hys! zjSZxbbFBmH%YavR$qG!hM7kO?^35pdYm*x~d0n^1a`L8V0`Q_oc18dPub%6B_FNJ3ltLRrgJ5U2+)gtOf878fsP*>gO<)VsgC zyq{SJ*(NV=n8jE7m_;@Y$~=RoP79B39Ka~v62>4I1~Q7&_y3Mj+|DF+CZqV=e>#l9 z_dhcVF+0MxUq*i$mNOQ!ThV$=sl$_Z|4Wk*qcr(d?&nksL-{CN8Jbq5=Jt{0QLI)J zb9HAb9+;M9r1*p$x|uK0F!;n|Q0WZjw#aRwxHPe7yo@RC=ImfHfF^EGojV5d1X(7E zU?BRS30MWbff?S6epclqx*R1%Y?Hs9fH2}WD3lIoP;mV>; z;RS7)7YLkxf}jGY;RSz;&l{gpHNS*>^Ex4TP^ zHsuzdc;+47st%4$;P?=t!wJYwPV(xObAc|xkh_(ol#6X=HOtu7Q0A}=^sv2@9D zKFukJb2a39FG`OH>i^eewVhQ~s-(+)q+t@Et|%(?h5wh3wSJ;Bf2zQ9nGw>UQKJ8U zTjCC<#DSY5-m&4~InfHX*@HA^n5`MGuz5~EFF2XeO|T-9f_J@7s} z=SX1=VUHCp@kXu%l@;oOFEAu(lGBZC`;X7OYP=_WZgI2!+5_S1jHmV*+g@#b$2;tW zqPf1vu=3=1lc;he^%v`nZb#vx&%0V5 zX|n&{cDyvm2o>cwXBxC zY~*|sztnzl>KGYWiJ;6|iNwrZ89I(~nXLB*$Hrj+XK`}0x^26#0T%f#739^-bIIB) zEs}DEci_dU>UE0)*&2pQk+)`AAH=6dH2{MF1{mD!Y=ARxMU9N7AicsLpZ{XmKRfK5 z{ZF7UeOXBRlB3kyY?x9|{E63Ct_C7~;SDs%W;j>1%f2elrGDO*oOHEqS_c5zYz~sn z#pYM%1i_O}qo}nr%iSu#;X@`Wg%_whd88zMy5%Q+rYVBLl7lRl>>hkU|3UOOZsar# z(Vx{JO+Jxo=_K9oloe(4I-r@WQJZ-24^WI~WAJ^hR>z2!K}fD;vMOSU;zpKkmtlTV zi!@XLC>Mtg<8|TYyAxX9&9XeY==jVjxS!Kn72~C(92OMl41aAW znK|6fcK~he%>tX9nQl?V#z?sxxqDVZrr}UACO!&9TTFDRS$KRQ?$Zs4Wtf_3@~jbv z{-sg7R*h*d_P99WZ7;%cNBRyy>jHLL&r;f-mtsAE$>9B&s7Y| zb=SXGPhh>gz~9l4egIr>Mm^eDvRA0RPf`|Cs}#kwncagTne{IgCmAj72${U3U<#SBb;c4x+Y&fspBk<^)GjcB@c zkjEMkzj@Ha`U~r=AyC=G`n(OPF_0!{bTIK4bHr$ri`1C*yImd;U!g6|56;sCi`n!6 zh>L@``n=vMl`p7s$l5$QN#EToY-wm0Pv&NCSv6Zwu0mpQoXyrCL^{25*f1FPUC2A^ zE?$BQ>|w^eBl*OR=osT(5k8xBxdG!|xuIg#jpOYf`pu6&@+5C@&m-CjQ+bc&%5TLq znl^1(S8BDNWj?gM&uHq%_(pB1&-$ZSOf{m9$q1?SnWwn{CF@l#1&%lF`=*4JV(mLs z5@rTdMp&^$Dup?Q|BQ5DuV_1fUP@W-#!GB`V?G67$0UR#d8OB(U~i zZw|YL)$To^sUzR6T%aCJh31|S+AN_+V#g8c?jHHJTFB%n5+b$!33`l?)F<@1@iEOr zVG1mz#BYIEOk6sB*-`4bIYifC3xB zaC7)vVsRd9)^(%!8ZUjRLKOp>fP_B(F%2#E&JHB~Y8~5|KDooNeOiVUx;eO32H+iN z6l+;yy!2uC=5vg&6gdmeSW=}v{)Y?7O}P7_Tq`I z_Tr0&wijPAG`4n1d+{XUA6B;H<1|n>OzX;*mKW8%j7&h2iatZM89LUK_##i-6F_Bt zr%u?rZjja6QQAo|S8}oDVPDhG(8eljZfD$?;QDx2{C*A5X9hqd{Hy-9iS=oa%-f~_ zo&(be_Zxv-D_^zo05MG(wC)k^SLrwN_D)ySUjG&NmgO~1+F{Yw3omGPKb{f3@o{ft z7>C`$i-2P)JXw$IGbTsLh_I^J-Bjl3XaE1W)nWfe<6c?>_owO-v-AiqfjZZHhZ*i8 zSx8LQ%L*jkc6gYGy|e1)dFqoZ;q(n0EoFv|i#f-(auH>iE&rg;v;?!;^3%inKxT^xIJnG zZDzeP0y*IT7Z<{Szx*x?SnGOg=tb%D%J{vyJI*yXU~Ok;e3s11qM3^5yrbBeLAzJ} zi5=;}FEMhoN~))!SLE>PcBYk!&s=Jl>;<#;=iSE=6l5VDSm6mev{EGIOGyNj`` zMX|D6t|2C~t?R`k+I6udxv0c7%<~NrJ=T_`#f#-WZF+GiYV_etMR$>^q}=e>Ds_zk zdtUCdWyP^P*G03;$RyXY08Gz#R{ggk7U8=^57ezxMyI9 z7lX9ZyR8Lh1d?odf4YXFYvB_8w<^;XwF+D0D!Qnh$Hf4BZ0nQqyW_C@Mz`x<@hcFE ziaUaoH-YFr{Vv`IVo~u(pkAw$`{Sw=5bF{Q&{z;G0rrkO9JLC$fzMK6EUSyjA zc_#L7^q@VL!O)KKUh|9}L7xmU%sKRiN3)K6XM)w$+RMe!EVpl~5HU;P7miP#xFPZ_ zNjFx~<)qh}vZnUv)itSh9WS1ULVyeuY=pjLGyAi^?``$f?>-*j_5{0}s=rr{(w8X@|s6mNb z-s?|&CUOPRdZ(YQ4LyNg$KQkzKgmSkl*L|D7#Ejh!#BG}`BoL*gZ( zVq2wUiB?{v*h|hXR$`6#k9Dyc2Z?{z1rbsQ zqF*B1X^(KO#Lbc{a93n>Nh*->>GW2jh$shsf8w)!?|F#}cyD%3y*e_!{+^6UkufFd ztRN_rwU-l)sf9YhRXV{>1j+UWI!seS;`fqZnbG*VJnt|Xe<#nc;m%8*5ugg|Tf{MND_H`bGd^kG3>Nh4N~`7g}){c=4@5c`C%37wd^m zwT)?A zO|FP*uPiv%+(8a)B4R>EREDcmk{sDQtEWjP?9k~X(8=gPm6%LL9QLP&7N-UQj3otL z4o`BLC**59j~x$bLpbN5{9XII2Q;D!k(NUsiNEl=xuUPV70UZJ2qp0{!Djag zZ8ZLwU$gsmW7Bgw{L98SC$T~>yYC2p-R%Bq_%gHmYew`@;*RTHs&~K!2v_(Esonrx z$%WQ6eK4yZv!xc5!q2lUb+YA!eao$=kmho(1ag^QGtjJl#3cSh5Ud$au~P*+(`D&^ z6I#{GX#6RlT7#`>jtRYq*ZGKys6X}P$n6d}@$E|16lv00k5LI>2Ms&qcMCD=ueUT^ zHni80uu47m9s@)(ZP=}Fa29-irwd|Rg;K49$)QfclD+V_^a-Xbnj~sgPb|8Lm(-xN zHBV+7*}4jc_$q8&OkC%vM9X^xJ)zd^rVF@TxkDI(xqDp0yY-YF&T|G$BsWzeCv@v1 z`CKPCyVo5u%D)^L2N4fQv{n*b)|V*o*~o}gpU_A~ztBi!LXM%GrbxHN;@b&LPBhgj zqj4K-0rGB)NuSHyu#JozdfL8}v}g1=EE0OTgOtrWfoDN`^fihqXo|khqeD;X(1I&b zN*X$i3`X=uDY?UQyfrV3nHpIY9B*Z@WIR8sC+U&F^AJm*S=|394!a*>4fbk(qVoc8 zY#6i7gNxn~*mr)_b>i**#-#?s{ZPc)R(E7j;UQD^wX4oIfE>;>H3vSS`Oul9VRZ~^ zi)3A(fsSLsQqzmAnM$-}1HzVJZQ;-2M+$&3k&pVpsiz^()&lcnQS1>-ApZ|*UjrUh zarM8O-6RVn>>>#U2oM1k4MH@a#7!_8NB||cYa}5;09(u(S8D^_1!^G%H=)_wuG$Y< zZHtvsTl%S0`Op?f2u(n#@?jOl)}V;9Ueq86K_dJAoiq1tHpzzeecnIML-yX8bI+VP zGjrz5nVEACzqcmA!rW{aJWtyZEIggrTBH*OKIq|@w(vl`8~rO$eZ4j(ODPTW*j4#& zt2rxQn?9!!=?VGyh;?};ljYLEPHh4UtnL9U1(udLr*@i2i6_`EC9EvSzk`GfIKBu? zsPbUloUhyfJ2g7k0NGU6X=zyJ=r5Vtpv`g05Sf!9n-8!im1phD4OI2a4F{;j7+VrH zR9U%0NGc?j!0vP-)@-ophFJwsckl$nnZY3S43Ud``LPXQFXfZfcUf79H%lTBXU;GN z|Bk(Y2ia7pf`bP&-%y!x`n0hvAsi&8yWy+_tMFj`lXxj|7m1g*p;buA`X=OXqLLBb zLYWeOu=tGFMn&wPuiKg((5D$ny+9P+G;odFc`V*sh#^BWI@j)5aFG+8MSai&Zl57LT??9u)X$p9|rM<0-6cm`wRZIj1X-{Ayve+KM5W@Bg7D_oj2g53F2G%B( ziJRfihz@kn8pXG&Okj5cOzc*^4>W%j&l)%@-%qge9se?E=&XNV6Rm&4t}ShHhW;JD zodNU5*J4}shgbzfQ#M+s4E9Kh@;DaG;!c6j9bsP@?15O0Ab2^65mdhjgsoZg@+As>CTwf*mwI@YiEcM7gdJOr$??3+spCiAq zS3cc1;=MMB{=R;*89RB;i7vhSYes&Zk?nO+miBaS=3Wm%5Mfn3P1nICZ`t&zBFe_z+GCdNqqXPbeEGj4 z2g6DZP8{MoYbI`u*Gw!!1hR1$GUaaZ%}F%4>F$yp-_0ME|^`4F7B4 zCHT-^X@xyzF+$epZA69zEG6N0fKFqUYm-aG8tRsi!0}iyYGY_kpO0cwO2sRf|J>rh zKLK~{NcqSn-3S0*DMyH%SG^@oXb5Zj9xBs9m4R8AMoznPDlya^^rH}FM9}(t&NSTg zlMF3IH7Y6qUk*>tI1a4y@_BW3(%ELeGC60y%{Rm?ZZ!tXXfRzHo`c}lDdcJ#?J-%; zg2@1(N!NA>n!Ss(Is`WGwd)P>e5t79LU1%vZoa^OC(N}rGwf7~1u;#*)XMt_Qns>( ztR|)6ZY(blUklAvzWEW~<>K%!X!z35A~6Nz+iP=T4v`Q=LOuXtQkcoU6RD{OzwWL z&1=Q}y%{K#y3coTj+6|CBgt?$Ol^kDqWhk3Wd*~5F5z^+WzA4ve=30q`pq{@rg6J5 zQIWvA61}#u*w$dvhLHy%1g+%ae39aE)^_3a9CdM&M=o60*2l-nq{vUe&39jsYWK#u zo!E)Z6gRY^0i@9jW-|sCL6W4|VGai@9x)vL8Av>M6`u?=W)c{N zYUx;%K9uZRL7Qk_Me4DACk{^d68!D&`$Zz|hu>;lJwP4ELD~nl+#wF;fVr{@p!>my zRS|MwSm}sLa27Y5ARv*TSkq}tM0am-3w1Tf#@v0Zd-Se5*@fomHZ!TkbfO0{99_E$ z1k=&eg26TTEB&v*!6Ba8>c`_R`I`uA$)db1Y5bS`SU`))5O@Bp=gin1WVs6dhNi-- zhgH^l5QF(8zK7i6H`tkpZACiLd_h`~HuSI}T@^ix$qm}RRwN}uyzx{|A{KTN@!Vh- zddP%k1I3~ZQlT-iwf>uUL5;{GOJGYb{?bbRK7gw1sSfror*ar8KEB` zvGI0u?fDzwSz%UO?X)S_My#iD;h1U*t!4vTrs1#lt=jY1KHM(_$PGTL+Nmw7J-#1^Dj{iax7Qq+phvSh8tCV3E>#4HZ*x)R4 z?X>%qpGq1oa;3GTi$SXO#UQbub_cV?UPoSsYIiWJ0y}2o#W!57r+%zv1?sK%C4YpR zfZ6Bl4Mzi8$XnpF4TQv(hGr^J21%}lb7%O_Ehq!VbLqkze%Rd?<(-& zM(zdmet=C-$o3&ByBw4*3PnEB0_;f;J=b1$a1iwdoNf%lN-Ma_sM}S(ADGO+16#t3Xmh%x}k6{|_mkpA`jX`3#&W0q*CE0Lq zH|FmFa}QeILS7UbenJNnA@3XgI~D*x`p^={Y}t_aPi1@wrj;e!ATMp4VTWi_~mn@0xj|3dF>4ElxEuucbJU(?fU*aahc!s>vpRd+E9Z z7_|D>M6e2sI7wKT-LJ|y$pd>9Nr+af1r}o#yt84{Qpf=HTWmtZs0HmNvI)PUkRsXXtN(#)I3sUm@q)Nah(=98$uG;}E?7Ig!Z+ZBilWxSk2AE&#wSQ)&=wcv zUgs;QJETl+99(<8Lb<8v=7SGf8=Ez2Cv_S)SSo9tV^vTr@0;-FEY+V-OP z(1*>!5}X6e8;nxqsug-1d9{EtMEYfEzxA5GD8j);&6%3Hs-}a#` zNQg|c2VX*}%4(mwV;Yj|zdmPaK4H=B@S3~>!>kF0Ia@T`2FMQeEA6HT?(az4%8FKhG*&N~1YQ*ng z0a>lw5UH~nMmy$bZ3OPyzQH;_*FMnvu|=DBUwEK)b>xc@`GsBtM~_uZ`etp zHqiMY$A-#D!8M5o`r*P$_)zD4}E}t>~*xT*L$~b znw-6)c+k5Ttg(_yaJEdWqXQw1+8v~`!=E7hhgm8E)1?l4kr!XHq{6N(&Ak$`kW~IF zeQ|21F5ll0=Q_{|M<8!!1vXICB{(jg+|SFM%SX!z;flxyt@yyc)vn`p?)A-*166Vx zCpcwqXKcMM+m9!$jf%e(Y0^d?1%mR@W(X^y4v?zU!wf-N*ZrCyGQgi6W(Zyv1cJ1VY2&qLv@wF% zDy4p43o(&R63v00)_~%*RC_YkhaShySr3!MPyqsC9&GtPnj~_25wUkogouG4f=v=8 zP%Nh0dB~_c9$}VPh#!?ZW_fv$eQN@Gul&?^D!|F1 zrEKP)u8Ub8hKl`Us3?M=Vhb56Fw$rM8-@xN009a|I>9TyeB^ z2lFqmfmH)(`+?CSK^iS6Pd8f7Ba9Z){cmIhcBJFQA10$kn2Z+T-bRbtp~3VvT3m)S zIZ?2(|8WwgI4)K8BQ;2k)5B;n5g@fYxF$Xql{C;Feh_;A;qUrxkm|LX#f%pd+R3?C0e@5C)PGJJ$#_=tz$!ym?h9zK=vsES;F_&#>ikuAi+;CFP-h!*>5y$J}SZ5}i%|5r8- zDpqCbDhp`jWn@g7M-;JD-Ij^%;J2>7^fmoR%hrFic|>6z+>Lp0Z_^LiL!#L5E7~Ic zKiNE}T&%le*gT>rT0={E*)aQiTVco^VhkO&dFUAX+B|OT#*vA%qDM2)Z64HPFJ<$1 z5!=za&BKn5qir4}hoFc8JBvoLdC*j2mPUK2?;)lU>x&ym?u%lO2Ac;Y6plI2#HA15 zzUGgDZu7@m0ztSV&5DJ=(Pj@?(~;R@3Iw0M{uJKqJ9&v0)8z4n%F>w( zAFTk5u;|Z(g=bX=z-yumMs@3v)4&@rJnYB9`7ceHh85&3v4E{0SE61)mISbZ5PRF| zNiT}Ff{e#ItRR%^7M0kCf)#{b*b0LC{-Mz*N^N61$oGgIoLH)R0sv$OS!*P0CJ`m= zAPI&Yq#PpEu!FELMocwGW;qMU*(@}RMRm_MLwMZ9K3kErT6Nn%22UiS5GpFl2C_o8 zfq2OVG8;CKnbHQ5*V_g%;Xm6zWE;Q|GD<#O${zAK*+br;%J6Kct51(b*+VAk=80s? zj##Gi_CYVB$QD=$bP2)h=q!7^f^6sFww^A!z>J!kfnEl8Gz7nO4{HBzNbONC}H&y-ZyHX6R)I*gtm|g zgyTDfo~K8-H|7=}!s-BP2oF1Z-6l-mkq$n)+ZsYsdk$XpwPa6ANCq;xEg@t>>1zq$ zdAwVA{ud1}CCVH^G693^54@UXyPUnA-2D)fm;1xj3RaiQHn%9eiv^y&?gLu8hrjKc zq_5lU!2?K<3rV@3WB+xtrMcY_;I(Cdw|KNlX%nFxk}zA-gmN<-T%+Y@;0a3BW<<)W zkYyRMa3i`K`n7M!nN(izAxt8PHx4&~>C0jYk}NhN8QS%cuiNF<$~SbA%d-S+75~Cw zUycp=5dv?~ykeMOXeu(vkzV`bm%((hNXN8N+3%L?3vP%!XLo}O??Q=;nmna zsPi*q8 zLUit2ueda>ybRps<)K=nM<#N1JEK`zEpYAh5GF7aC^AKaoBWQ#vLZ4N8%xkDOqxr) z{T<>EFE`~U@Z%PwLC&UCEd#*@@zM&|)Upz-9!A?-ASo*mQ}NT<YS}Fik=c|H+h- z1W1!ITjdi4Y|6>??{FZ|>>D8pL6JO6XI!#*<9;d%mu%#Bu=dyhOP6eVS$pL6?vU2pXtGb_7rLzL=+^IEFqEQmCd z=MkHD4cw%&RJhT$cU6Rh7?-I#pVJRlF5#g0K(S^I;xQuoV z``p=0h)YJ7+={Hmm9g!|N8tG9_L~vKh1~vS{~c$TaPJhSXt1dL2o>BijsIrhFHUr_ zSIZDoB%A@gS~x);JPBNZAKjAxA13`1jJ~>kY9~MuR#NvK5R_g6aQBaI`diu>7mSZP zdf)=iegJ*LhO6#2SuNB#%Hy>XDrwa#v;JwK2f2h~$yYJ#QBzZ$2uQybk=8s?vADE^Xe zt9s+;EVFi-eP^>sm#pREX58S&4N%{|11y#wmu)}h-kVDUU{K>vK55x zwaf@JA=*f<88Q9{2=|4fV1j_5VeXB`X=snv91Ic+EpCV}`q$x9a)3qAnCx|n@By6V zac$kDM59_yO{to|KItrvwqLFR7!)DO2vSF~H0Nv~1_kP=bJ@S2ihTbLsz2sUY-x7m z1PxJ0TMN%5_dt9AI+cG1p~8*!H}Dd!C;VZ?8}b8Fu353>#`&(WZ_Cc!SLwe9RyV^P z7!wnRjbuQ}X4V0*Q9)^9#$UkXN+&bPUSCD!FjDNWF`dda-sA=D0OyNgJ%F7|2h~hc zgA;Z+T%P?Aa_$$p8u{wrMyz@Wrr}Qe6m@W5rhQsyFfy|DQ5Qg0M*rMJomGxPZV1|; zc@=fidsi`f7pa)Iu*^M44H6^#&k~c8aOCH&<34kd>bK>;uOB%HQJDkX^}CDHh>ocG z-9q)tM-EqreOCqhRD{OqY#4wRQ}g7?x}Xx~Ed*(KovSif*1^(h=J6u`q6U^$S%b|G zdn5zv(+7} zn@S(Y8o)}DWec^c^WP7@rX|TqSN43QERq9T)?N;1ZsURAfp!bZ2-2q>>OuqY}`_qGRoi`pk@$?K&9>1$LrbqD?JO;9~TlCSp z1+V4W_4>GAd7lq2uiOJ`r;XqX{CzrDA(rFOpFwVaG@KlxLNmD&EupuaX2)3EK-E{DINpUVmV{k{##vtc#*J5{Q;2^SXYC39h|+Z z$bWwLDhrNF+qVu3erFeq)%4n&fyu|}Y*yY~lG$wN5mAn(vNJGQAI+(-`6h`3lpgJN z>WAOpx<ofMeX5D)pez*7K;e-U5~(L>@7>DL~1lIa|QJsO5mv?LkQJ8$W<~t zW<`=sf5s$M-VKjnYye)`16ZcLg|r@!@WW{nH}-_&v_JNSv=U@ePe@LCq!(lr>c-T* z|3_+o2(?D?9lhWYvj&)7=m9L#CiI46C9k0;B&S_OT6Ddt5_OI(>;W7}e!Vw*nGT=X z6W&OEx;H$X#@orkxHM0qX!5yWxrj72TimE{)IVcF$Z2A0)y?$B-EmSpy;kf~ku_VpMb@ zJcee5wKPNd3Y&j-D>=C{klriERDD%<6;-1Aky5MTD8ahE+VUn4&9dgWy$XZF- zAfyZcyYU{Ez0XzDm{4|ei@omOND6u$-et1<_|U!*CM{bC@_Y6+{oej~nOC!FsPaB-5Ot*{eGrVy@YmVMXO{zex8{aM7i(%irEL2!4sWLf=CkdEs1z?=$og zG@oDGsVwq~!Ajw5<$9v;a=%Eh*AE6_a*Nf3>&!(1)+T9lb1KgGa@XC{72bszMS5!2 zZlc7i2dstLcy`^cU1fZ8*}CE+k}p~crC`rqv1aen5-AlgU>~?w|0?8FPDO{*5R7*6 zT1u;|yD{$_!XbN%T~dK0VCIlmnTw74{=bgfJ$Zm1dsP8+R^5WmH7jOZSdy@-2^HoB@7 z%%U?1h$qH^*ez!9LMMghF1U-yfIlVaB8J@a!%Ux;8LUNpfb+~W#?}+C01asP{N+a=+0*q=GMNc#bW&pxhI;aZ+|nivoF zC*^7~-OmeH2lGdKPj3!;^-6H%D+&rMv}^ z4AeWvI}qL=1+FX8=HKD=c&er>i^M&UwuU`{nd5EC0#^bFMMB6@7uWzjF?+aL4PR{+ z;m+XB@l*U?UBoo~#mY&+DJz4EUUaB~&|3cQT1~$FRUD&YhD~_UkzS@@r{ZM|UbN?z zJ%)8Rb)PgeWDEJvJm<1PTQ+ScI3*k9+2EHyd#|`6B@8F7RcRFLt=bW;P7%{F&C>kD zFsMc#ZaV~zsbxOU*wkyn%hSWl)56Oqh*TXAL3ihumX)ZVWH+Ig93sd4;e!j=f#fIZ zDYY4VX+vM;+6Z&4bm87$3TOZxoeI#T6XIrn+U>ZB3u@pLovVv%R(#|I*dO*N5=i98mYKd@ znfix(_Z5txI!5MA<3rBO?U89PI0ZMsZpE3NXyNi!nNg7t4O^Pjps_kIO0IxI-%(;j zFZka?;59F6h|tZQovSPuTyWXOd`Q!4PwnIr;DOG7Kw%2B(<#oDHDl2-M!O85_A3#) zTB%*gj2aIirVXYDQ^y+?O%K~QG|isPa!co43USYUx zp45W2vYZMBJ7jjysJaZg#w*AH`MM`(hnT_SkYO|Q82*TCyrcbOU7TwjE3Z?h!Nik~ zRW{d%TpK{_P+jJV1OWS|jrH9ly0BD$ugOKKsZ0W5{uksU1hCY21P?!cXsr?A04*!< z)nw6%Cz_ya+BmRitYlG|cn-`j9gK?f0P%0h>qx6d^RS8sLnn4X zLC>YT2SdId3z8X%MejNEkR*`E>s#6Q;>kOi#LzkLkS)~qx|4X^3x39p9V{ z{S&YLy=GjZm6vvL?fA&gFpX*PxD6Xf2(L_oSsQotcVQT~#T`L|c$tJP1o?bX8Cxno#xwkUmg-)7#oKttrOa}=l9`C&_-<}vzIFT~ zxsUh~;Q`K+0hdEHX{I<#=&4i*n=<%!&}ndfs;wxEv?z6Oc%GGSx(?QcvUk3A2cmZl zz%}F=D>skMeGjBRT(@BI7C)>(hnl(?k2Jq`iAV5GPVEte=@CDwq5eDb{oo9%ztg$` zeiN3UzG^4l%blGM&fZSP$?y=TwprSoZ7b|bWFj@6Q|t6p<@)9e zafoj6q}Z?)aGQt-T7^7@H;%1QD(X0cNy1fLxn07uK&jUXXC9wzA_{S99blL!8N()m z#%20=Z`uMxqrM8W-D0{!UQ7Cu4Muhmo&{(`w4$;)FQR0~L*p(wSxv}6?05jSh<^jp zm;r2J8`#4!8;+E7pn=luOW!Oo?W8{lBLbfh2077E|~4Sm@8rwd}QTbETA&+P5uF$Uant?bfvVvnxl! z?18)f&hskyW=O}4bYr@C=be36IVUTB_svM>5ft*zku%FL>=PXkI^BFW?HmUNiq6G2wcY#)F-|~UsLnf$c7HR1VVwUopAjDxWZGPhi^wQ>$~Vym%s-c z;r&%Rz6Ea^8?h~0zKOnS(M?}yqU7(RCzR$mU@JUz-`OM!oI^Ju>dA^v@7tGTDYh+k zHa}=ZF18PiVeBatAE4XF?T{jL0=0C}M#93IUaywqN_oUFT~nKD)0e z$+FwI_d#1u4$kT})8GQd1JU$YQs{BxE}*Ua7viyQT57{U$`5_Q2{_aIZ#<~;mQvu? z;-tX5rSSOWKX0?wZ>RL+S`@72)zROBmh;ZH*Nz9_YRw}5GWe=f^Ei7HWfxf92SLum zYd%mb;QUvuS(b+#PM8ncik6Yg(H7@DZoIFf_j!3gFy8CveR|%HjQ4tapOhCg-XEd& z(Rr9GCBF6aJ~;1(^bR?>jF#WwmCIntIb0s7Sq2v!sH7)+7#`uv14TQ; zw;Aa>>67qO`YTet1F1)Xs6CG89I=xyg{RVA(Ye~lOGO@SLSrw@tR#xJC?mlTUbG4# z@6OP~v=LO;;aU_1=iJ8u8z!CZcsUwT%mOV~DoBCS-P_#O-renFcXx}=K{ofd@Kmav zScam@Tf_-;Uw_lG7V$5BSjv0ZRN)OjASv5!f_6$_zAsvF;s@Q*e-Q`Z-ob-6Zi(}K z8N=0oA=S7xKMWoOQ49Zt1ULZX2fMxQ=lp;<&VRuQFB2CA$?%}!6j&xZd;<{fny|aT zlvA_FcXfDb1G<(_HxR3f7SZ~ab~#oGBHUgoTG4j+r8cFwslPoohFuVK7+LN=usvHZEt6;B5EFwme>_DuhcvQzX-JiDy zTr&Bldd*c=RlBh1;lR2U<{@V@Li;3BrZ!wWvVdx!?_{7I+ku!l){@z#tbhRsH;fTQ zXEy9E%DCCShjrcy>^{@1g@7;jmx?8L<1VKy*89ue?);ugxMexywgPo-WdHh1Sw zEEQuYpVGC_dS7hl&WB@^FxE8Oxyy}?1_c8iTiQ*&q3ZnO>Taz7EetL!gB(S7yI@u( z!CS9#jsHS21v0bOfF(m}Mu>G~h6-++;TUuqwFK#l;sqEpTD%!m`P6xq;)SgoaDY#} z=fa?e=VF_t#T!?i*{qDke;fWU%WU?|6xu5A5DLo?#O>g_D0hR2JhC>@z`|jdRn*Rd zzb01uTWxBBc9+`X7j`9=*qS*Tu9`kB?M>P8TbVNL&pWBNZ=^rkFdmZ|nUw=~62~^u zAKmdfuK9scSm0uefjN+oN5H0>!ggOG0 z>Km!v4te@!VAfKk`|{P>mj#Lsw9Q)fed0D!CP}#(D1J{(X3?5Ta@2yz7w@edt`@&X zBDQQ%VCE3Ga(+)cDqdEig#$?r!ZIejYFSBmetWq#9Grz8e~1T@Le2Lq<`0-mD6c1B zLlB-;rwSo?4g_W`%We{JFdaoEtWA5t2V*KCg_7Rkgp*nZqA~kyInHT}7PVL&c!w?F zRXH}GlIJjw)wWO@h${(X!K+t2G;CAVOBl)sk%JKfF7c;@JwH7(+xS!^_-6o*^El(_ zKtLz%DoqxtfLHT!Dd9-?ZMSH-Q?~{LEaD0NIE|A3h~#qZ)-o~TK|COYT^)W)tB8Dj zmzsp{VZaywWj36;0Kq!Ew4*=~w6N{>0=|`}qr`9VsKQAv!gxfcjCCh}4AP=cvrtre zUmAQvtW7eP1?m+j0f8+z#e}fRbVahHsuq8PJJ1Ya^$qM)rr=;1p0RLp^JWRU@18U) z@x4-D_&Xnx=1(jw_4U;j!YQUegaR^9kA1!{$X}9uwg|WFnx3TQfIfdgDJ}`q)+Al= z!e4A!@#;)|efEzKL9!%eGzC9uz<02}1c}ms8CM0b$YHva#4>TU4S5*8bhB=8_CFSi zg^;cLTHr6=Q-&h1#Ssx$JfK(TQITFO1FkkJYW$)G!uXWdc@Ls3LEzbU) zs{#Z+YZ%=)hELU5vhWE~_BAH_W#HLRT+76)S+mxK-^6zf32WZf{$fmQnzF z`bo?)*nw&d%}k z3ryI)$XI2A>%K`iUN$~=tZzW}zIr-7q@L&V?cYLwAcmQXinPN3O@xiTuF3c164=yQ z{EV0|-w4d5>eQ17;D0u`wx+-@p=Z!15ird>t5iIMMNv5d%$xc1PrTMyW#Yb{$W9f= zqrh4y|22uBL@Ov2bMS$BWCm>V<;wLq>m%|2E$>z;^Gb0rsPGBu4oRRb61m_9Gq{If z{bM;@JKf}aIm{G^9q~xNl87_;uQs*CE8qalmN-j>F^9;K9N6op3`LK;hkiWL6^TBAT8j^WQ4ASvJYLc3vXA@Jkbdo%o#w1-@+sY$=4;m8AlLUepPfK zTtgR#S6j42h|_@mjuzh|;Zze!P!Y<{Ubg}~#D>?ve6acg{W+W2n(szgVl;}uve5#121PeBO!>4qOXofP_jK|=C@I@D??nDz{|ap#hg_B9 zdQ86O4s5Ceh_)05`#^o_Y9hzimF?>cr=A40*-)TO2<1S(9sCZ91K`e3O$yIs7j|TK zz!aFc^LAj?2GyVTCE|E)yJJvCfJ025dn+)N3Rt`ZRQa!*f)l|eDaE}5+3YW#2Q{Ey zmmgRG8X3De!?5UAgkTYuq4+972aQJqb}~jsOe8MOFp#j%$?T)B2dDI~2ZLu7E#3Cu zks=$X*P76c9Ej*z&BAfBE6z6@i9>F_+v0N|DxH6~b>MN| zAr*69%i|-P4z~N7%q{13(?C(u8sq%C%|P=p!rkGc_s;F6#j*11N);J||8=Cc68^sf z{|DkWkstY{bkw@Qfmvr0aTSOlE2i61zG8yPdMKPO&w6cK@*$D zLDO1@NUX-tg;o(wP7J`fz_gsTNyC~O+qRui-_d2ZMCGIEm}wV5PSTTzJAk1 zKBJ~B5MDxv{YK@q>AS)Y#Q1p7=#09gNK4z(<%Y2yBnEt4a1>&i(82(60izlx~9^We0~6(!J$mT3C5KJu)Z9N zDr@7gjf!oVBw_zPH!_guja+dvGZId8jTO3K$0oxB)oULPjG z3*adh4X$?1@*)~r%WsS>(hAqAtAStdBHzLz>DtHPDa6-a<`y@ovU06P80Fd=y_d)` zr-8k_Yq|1aS<4Tx8*F&=JUO>}=|xHf?Xd+a-UN>V743nFBM5pI@VykM*q*aE#a=fI zGAmeQ#l)K7wr?xSs`gTLV*|!x6*as1y ztLD0C6`v^+f`y+q+930>ep-#ge)}{;y?(FNYR7p>+brk#np64t(-wq%N3n*1VzAO0 zPsP9#kH2Bxdx63x(%s|Gr~G>|sJJF%AmkN%^%C?hGJ=(@YhH&RPg%bH-O7{_aR3J$ zP-XfgNS_oQVeAB0=Em0y41&W1yr~;_DFYu@*R}^6Xl0yz$iMc0xiTr4Kn@4HUOO ze0A{qv#DO1MJ?VRE^L3rginFlf)1Es8Q!Z)ZqM(J%(M%uZhVAWZ_2kF-lLbnKE z`$=8DAJ4mL@h7v*E#BfJ()j6ZFYQllZNi(_fk!N*(I2Fn+`xKDRtuW~>-X}*o&cj( z3;z~ilxpGLz~-<#rILhm~+?&jZiQO>_dga^McQ|xif z&|VAfY$6s2~jJJJVfas`d>i8~nWluHMp?~rqvz9)Ntfetg!#nTaX(EKXU&^Xz5%*mR zNfjZpJ4_|# zjv*2t&h?yIHa-R6{^;qLnIVO%I8XkdM{Zmvb=LW;PqK%l#))q6AkdG(q)L z&Zv`EBKW42!1d6qvZ_6>cJbguM9$+-a-oIT0(k_YrA93++Ttk*eHL;irDiO*&kxZhfisVkDem@>?W-_ND1NXWT zz}P@xhB|cuIyIg87|#YM%pRBng4VxNn`4!cA=fYVy2p@EGsD}SeQ3eCbHKmirr^w5 zY^38ELnolfx*Bq|ApXS)EEeDJhWvY}GsEdiwAk0BKphFWmc*971_)1t#}F# zv{Mx-=cd7l)($%A&aH#PR<<5ZMS4-~FR_3R6rRKZ1YS~Jf$yA!8TPuPs38{1#VK?- zg4#_y4Nx*579t|O@}@dfFhjv@n}fXN8^ zPKr;TM!O@lDw!?M{d?ruarj)UN&u_05e6%PjI<}PBAiMUQo*k?WZFF=?mkUIv9JTR zP0A@uBP0DhPHGL_(~gA~#8>t|MD0nEU2=JG5~yr+eE#*%NrXs{Z`8{KpPbENYO4KkX3j!y`GZG%Z zbO@BjFWJ?3{0cnq_)S9(N#yaH);)eRX#7%?4DhFW{H7V>7wc0~P42pI2hQuQni4&B zk9>`0?lpGrBhK|0yXp~GlI{&!Z*hA~C893GEnG%LqC6VCCQN1{&k^v&Fhi=X5Tiuz`o5rGk{ZA^E>H)3+zv@SKM<37h4f^ z7TT-Zd%Xu{L0CVawXXgcC^~~hHn;Z%tiNR9H<369iAip6b|i70p6GCUr$iESkm%pz zCg2pecWNa43LQAj?Y%LQn1sYq?@f3IJeU5}30Y8v+Y7y3Fa0AV>Nv-{y_u2pf9Svy z+}??i#O-?GM7Q_4Na7|vG0W|p6iIxv8|@UgcXA|sr4F3#_GU#A@75EixxF(ZiF5VD zT(`F{l6X@$+I+XSD3U%#2cGHn&Wa=s)DvgBy|W{UUw$N+FxTy!6G?1GqRs?daJ@B> zzE=mn)9t-2lK7&YxWMh58%caxPh8~o7Do~T-DsD(z4IdJ%XQ#oZtv}p#6@~ymD@Wl zk~m9Gyx;B3i6q|8jkenDg>gi0$`LxS;`TZtiSc^kYPUBxlGt%vGGUF|n-@tuibTnT z^|k2aZZATC>X@4({Q5dhza^5sSx;}^^n9e3keN?BuBU&W(=oT|cvg28K~uQfTM)@Y z=yw_g>uG<^?VS-xrxVGPPB$go-U*TP>-2O85TuheLw54i?joMytTC9j^#1>$MD=S< zhh)&xKhV=RQ+k!fK`Muy)uv~WLgKC(fGoA5lj=w=jDL?zW*Cg80lMsCGAyXHu%#=| z>oA>TF(#hCEJfGtgZ!H$>iO3p*79$P@bPb&_!j-%C@T3iLoDXs@uHM}Cy06cJ5dzz zZ zDK!3FAU@>ZMdB#`E)|FQcbRyNf2%|b|K2bD%D>g(MgCR9ANY5**u=kU#Lw|dBy6n( zdqj{@w^A<>kMJXP9I=WYsjrCp`H}jDxSJoTJBU(#q#ht{<40GXpBGSw>w0=!+nadfby!k7Wf+UGn{?aW4Tq);Q7$hj zZ8Ya*t#Rb$Je)K!tHJD=HpKTSZXV=1eP`6>V70k%bVHijI?Vy=uiPDz9SEL&6P)o$ zn3_oYaT5tDj8ZH=~<+v%rZPa9)UZqXRIgUG&-LaM>#4sW1MGIF(fHwVr-f?8ONm z93CKTv(-0K%+AHo|L0Rok(vU3iA4PrH%mMB)HS#O&$d*;N9ML%M%Y?x4am3J%8X zKoRBs*TdSQ&>dmtysXhydp>K;WwqyX9!{*pz<0ioc2n(nCj$0$1Z&KV_J+ag zIojC#Li<2XCZ3S36-WMv(}CGmHJKPpOq-23I-NK%gv`P&bdWea_^IX9snVLDSlm$2 z{3I}tJq9mWC#Qv9qy!NZppKa-9>F7cfQxVP^TN&me?$fQiQU|T_O<*Udr%EdB0J;L zKs|M#WGYlGayaAD^^^-Ab4rRcK0{9l$&@r_{CGX(ZJCnpjGv&V{9UGGIO8YkDKB!$ z%JI&rS)5WTHd0D=S9I_m3XI%1XNNUGVC|WlnlxW(PE9&4pde{&=U=%m-iWm^_r>4P z5uzh78ow_)qK`7H;#MSc-)r*?C=t0-h}I5+cuktUj;{FtCSQMD|u5l%2=Xhj=710*vnfe;9Z=Y8YZ8Ogu)0soD2ClXdf0GMmR{ zlX>jX>F|-0i=H2`j`5y3R$Tg3k&z-TtH-{?v*V~mXkRB+C! zqwVR>8V5HFEGUAF*n)jQZ2mbK(!{~ZKr^-+V&{~$MW1CN+kN|SbF5T9$LDstvD+V< zV`_}Ue%t`;+1dYK9j~1NV_{`NI=1f`6F95YY~N%Z|KMi`m9QtnI9;3Fgev4?OKVM0 zX&FS>bZjtKTHrPUPPYne2QLP5JHj{NZc8{zoNU6F#5n{X4p}&GNF

4O*Kp59>M2 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 * Modified for CPython by Christian Heimes @@ -13,14 +14,14 @@ * The blake2s_impl.c is autogenerated from blake2b_impl.c. */ -#include "Python.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pystrhex.h" #ifdef WITH_THREAD -#include "pythread.h" +#include "third_party/python/Include/pythread.h" #endif -#include "../hashlib.h" -#include "blake2ns.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Modules/_blake2/blake2ns.h" #define HAVE_BLAKE2B 1 #define BLAKE2_LOCAL_INLINE(type) Py_LOCAL_INLINE(type) diff --git a/third_party/python/Modules/_blake2/blake2module.c b/third_party/python/Modules/_blake2/blake2module.c index e2a3d420d..7d473239a 100644 --- a/third_party/python/Modules/_blake2/blake2module.c +++ b/third_party/python/Modules/_blake2/blake2module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Written in 2013 by Dmitry Chestnykh * Modified for CPython by Christian Heimes @@ -8,9 +9,9 @@ * any warranty. http://creativecommons.org/publicdomain/zero/1.0/ */ -#include "Python.h" +#include "third_party/python/Include/Python.h" -#include "impl/blake2.h" +#include "third_party/python/Modules/_blake2/impl/blake2.h" extern PyTypeObject PyBlake2_BLAKE2bType; extern PyTypeObject PyBlake2_BLAKE2sType; diff --git a/third_party/python/Modules/_blake2/blake2ns.h b/third_party/python/Modules/_blake2/blake2ns.h index 53bce8e0f..ad7683377 100644 --- a/third_party/python/Modules/_blake2/blake2ns.h +++ b/third_party/python/Modules/_blake2/blake2ns.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Prefix all public blake2 symbols with PyBlake2_ */ diff --git a/third_party/python/Modules/_blake2/blake2s_impl.c b/third_party/python/Modules/_blake2/blake2s_impl.c index 24e529b65..6d5f0b3a7 100644 --- a/third_party/python/Modules/_blake2/blake2s_impl.c +++ b/third_party/python/Modules/_blake2/blake2s_impl.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Written in 2013 by Dmitry Chestnykh * Modified for CPython by Christian Heimes @@ -13,25 +14,25 @@ * The blake2s_impl.c is autogenerated from blake2s_impl.c. */ -#include "Python.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pystrhex.h" #ifdef WITH_THREAD -#include "pythread.h" +#include "third_party/python/Include/pythread.h" #endif -#include "../hashlib.h" -#include "blake2ns.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Modules/_blake2/blake2ns.h" #define HAVE_BLAKE2S 1 #define BLAKE2_LOCAL_INLINE(type) Py_LOCAL_INLINE(type) -#include "impl/blake2.h" -#include "impl/blake2-impl.h" /* for secure_zero_memory() and store48() */ +#include "third_party/python/Modules/_blake2/impl/blake2.h" +#include "third_party/python/Modules/_blake2/impl/blake2-impl.h" /* for secure_zero_memory() and store48() */ #ifdef BLAKE2_USE_SSE -#include "impl/blake2s.c" +#include "third_party/python/Modules/_blake2/impl/blake2s.c" #else -#include "impl/blake2s-ref.c" +#include "third_party/python/Modules/_blake2/impl/blake2s-ref.c" #endif @@ -46,7 +47,7 @@ typedef struct { #endif } BLAKE2sObject; -#include "clinic/blake2s_impl.c.h" +#include "third_party/python/Modules/_blake2/clinic/blake2s_impl.c.h" /*[clinic input] module _blake2 diff --git a/third_party/python/Modules/_blake2/impl/blake2-config.h b/third_party/python/Modules/_blake2/impl/blake2-config.h index 40455b120..aea1f4d63 100644 --- a/third_party/python/Modules/_blake2/impl/blake2-config.h +++ b/third_party/python/Modules/_blake2/impl/blake2-config.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2-impl.h b/third_party/python/Modules/_blake2/impl/blake2-impl.h index bbe3c0f1c..4367fd695 100644 --- a/third_party/python/Modules/_blake2/impl/blake2-impl.h +++ b/third_party/python/Modules/_blake2/impl/blake2-impl.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations @@ -16,9 +17,6 @@ #ifndef __BLAKE2_IMPL_H__ #define __BLAKE2_IMPL_H__ -#include -#include - BLAKE2_LOCAL_INLINE(uint32_t) load32( const void *src ) { #if defined(NATIVE_LITTLE_ENDIAN) diff --git a/third_party/python/Modules/_blake2/impl/blake2.h b/third_party/python/Modules/_blake2/impl/blake2.h index 1a9fdf430..5a6215fae 100644 --- a/third_party/python/Modules/_blake2/impl/blake2.h +++ b/third_party/python/Modules/_blake2/impl/blake2.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - reference C implementations @@ -16,9 +17,6 @@ #ifndef __BLAKE2_H__ #define __BLAKE2_H__ -#include -#include - #ifdef BLAKE2_NO_INLINE #define BLAKE2_LOCAL_INLINE(type) static type #endif diff --git a/third_party/python/Modules/_blake2/impl/blake2b-load-sse2.h b/third_party/python/Modules/_blake2/impl/blake2b-load-sse2.h index 0004a9856..3564775bb 100644 --- a/third_party/python/Modules/_blake2/impl/blake2b-load-sse2.h +++ b/third_party/python/Modules/_blake2/impl/blake2b-load-sse2.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2b-load-sse41.h b/third_party/python/Modules/_blake2/impl/blake2b-load-sse41.h index 42a134935..b605afff6 100644 --- a/third_party/python/Modules/_blake2/impl/blake2b-load-sse41.h +++ b/third_party/python/Modules/_blake2/impl/blake2b-load-sse41.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2b-ref.c b/third_party/python/Modules/_blake2/impl/blake2b-ref.c index ab375a499..79d484579 100644 --- a/third_party/python/Modules/_blake2/impl/blake2b-ref.c +++ b/third_party/python/Modules/_blake2/impl/blake2b-ref.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - reference C implementations @@ -13,10 +14,6 @@ https://blake2.net. */ -#include -#include -#include - #include "blake2.h" #include "blake2-impl.h" diff --git a/third_party/python/Modules/_blake2/impl/blake2b-round.h b/third_party/python/Modules/_blake2/impl/blake2b-round.h index 4ce225540..c6a3230a5 100644 --- a/third_party/python/Modules/_blake2/impl/blake2b-round.h +++ b/third_party/python/Modules/_blake2/impl/blake2b-round.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2b.c b/third_party/python/Modules/_blake2/impl/blake2b.c index ebb65bb13..9ca73f023 100644 --- a/third_party/python/Modules/_blake2/impl/blake2b.c +++ b/third_party/python/Modules/_blake2/impl/blake2b.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2s-load-sse2.h b/third_party/python/Modules/_blake2/impl/blake2s-load-sse2.h index eadefa7a5..7f04ba1df 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s-load-sse2.h +++ b/third_party/python/Modules/_blake2/impl/blake2s-load-sse2.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2s-load-sse41.h b/third_party/python/Modules/_blake2/impl/blake2s-load-sse41.h index 54bf0cdd6..d9156ad98 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s-load-sse41.h +++ b/third_party/python/Modules/_blake2/impl/blake2s-load-sse41.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2s-load-xop.h b/third_party/python/Modules/_blake2/impl/blake2s-load-xop.h index 2797722b3..5377fbc88 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s-load-xop.h +++ b/third_party/python/Modules/_blake2/impl/blake2s-load-xop.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2s-ref.c b/third_party/python/Modules/_blake2/impl/blake2s-ref.c index 6636753bf..d7c6a9901 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s-ref.c +++ b/third_party/python/Modules/_blake2/impl/blake2s-ref.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - reference C implementations @@ -13,10 +14,6 @@ https://blake2.net. */ -#include -#include -#include - #include "blake2.h" #include "blake2-impl.h" diff --git a/third_party/python/Modules/_blake2/impl/blake2s-round.h b/third_party/python/Modules/_blake2/impl/blake2s-round.h index 7470d928a..b6a1f7694 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s-round.h +++ b/third_party/python/Modules/_blake2/impl/blake2s-round.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_blake2/impl/blake2s.c b/third_party/python/Modules/_blake2/impl/blake2s.c index 69385dcc3..e79aa5db3 100644 --- a/third_party/python/Modules/_blake2/impl/blake2s.c +++ b/third_party/python/Modules/_blake2/impl/blake2s.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* BLAKE2 reference source code package - optimized C implementations diff --git a/third_party/python/Modules/_bz2module.c b/third_party/python/Modules/_bz2module.c index fe06953ec..fe8ce4aba 100644 --- a/third_party/python/Modules/_bz2module.c +++ b/third_party/python/Modules/_bz2module.c @@ -1,18 +1,15 @@ +/* clang-format off */ /* _bz2 - Low-level Python interface to libbzip2. */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #ifdef WITH_THREAD -#include "pythread.h" +#include "third_party/python/Include/pythread.h" #endif -#include -#include - - #ifndef BZ_CONFIG_ERROR #define BZ2_bzCompress bzCompress #define BZ2_bzCompressInit bzCompressInit @@ -217,7 +214,7 @@ class _bz2.BZ2Decompressor "BZ2Decompressor *" "&BZ2Decompressor_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=dc7d7992a79f9cb7]*/ -#include "clinic/_bz2module.c.h" +#include "third_party/python/Modules/clinic/_bz2module.inc" /*[clinic input] _bz2.BZ2Compressor.compress diff --git a/third_party/python/Modules/_codecsmodule.c b/third_party/python/Modules/_codecsmodule.c index 586b73ad3..cc492f3fe 100644 --- a/third_party/python/Modules/_codecsmodule.c +++ b/third_party/python/Modules/_codecsmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* ------------------------------------------------------------------------ _codecs -- Provides access to the codec registry and the builtin @@ -32,18 +33,14 @@ Copyright (c) Corporation for National Research Initiatives. ------------------------------------------------------------------------ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" - -#ifdef MS_WINDOWS -#include -#endif +#include "third_party/python/Include/Python.h" /*[clinic input] module _codecs [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e1390e3da3cb9deb]*/ -#include "clinic/_codecsmodule.c.h" +#include "third_party/python/Modules/clinic/_codecsmodule.inc" /* --- Registry ----------------------------------------------------------- */ diff --git a/third_party/python/Modules/_collectionsmodule.c b/third_party/python/Modules/_collectionsmodule.c index 25006fa2c..4897d564b 100644 --- a/third_party/python/Modules/_collectionsmodule.c +++ b/third_party/python/Modules/_collectionsmodule.c @@ -1,11 +1,6 @@ -#include "Python.h" -#include "structmember.h" - -#ifdef STDC_HEADERS -#include -#else -#include /* For size_t */ -#endif +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* collections module implementation of a deque() datatype Written and maintained by Raymond D. Hettinger diff --git a/third_party/python/Modules/_cryptmodule.c b/third_party/python/Modules/_cryptmodule.c index 8e4737c7b..6f1b2f7a3 100644 --- a/third_party/python/Modules/_cryptmodule.c +++ b/third_party/python/Modules/_cryptmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* cryptmodule.c - by Steve Majewski */ @@ -12,7 +13,7 @@ module crypt [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c6252cf4f2f2ae81]*/ -#include "clinic/_cryptmodule.c.h" +#include "third_party/python/Modules/clinic/_cryptmodule.inc" /*[clinic input] crypt.crypt diff --git a/third_party/python/Modules/_csv.c b/third_party/python/Modules/_csv.c index 5324fa6bb..936f7787c 100644 --- a/third_party/python/Modules/_csv.c +++ b/third_party/python/Modules/_csv.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* csv module */ /* @@ -10,8 +11,8 @@ module instead. #define MODULE_VERSION "1.0" -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" typedef struct { diff --git a/third_party/python/Modules/_ctypes/_ctypes.c b/third_party/python/Modules/_ctypes/_ctypes.c index 24d64858e..2a44dae02 100644 --- a/third_party/python/Modules/_ctypes/_ctypes.c +++ b/third_party/python/Modules/_ctypes/_ctypes.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* ToDo: diff --git a/third_party/python/Modules/_ctypes/_ctypes_test.c b/third_party/python/Modules/_ctypes/_ctypes_test.c index 6ffbeab8b..0094c6ff3 100644 --- a/third_party/python/Modules/_ctypes/_ctypes_test.c +++ b/third_party/python/Modules/_ctypes/_ctypes_test.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include #ifdef MS_WIN32 diff --git a/third_party/python/Modules/_ctypes/_ctypes_test.h b/third_party/python/Modules/_ctypes/_ctypes_test.h index 060d4d69b..dfcf2d6a6 100644 --- a/third_party/python/Modules/_ctypes/_ctypes_test.h +++ b/third_party/python/Modules/_ctypes/_ctypes_test.h @@ -1 +1,2 @@ +/* clang-format off */ extern int _testfunc_i_bhilfd(char b, short h, int i, long l, float f, double d); diff --git a/third_party/python/Modules/_ctypes/callbacks.c b/third_party/python/Modules/_ctypes/callbacks.c index c8773a12e..87dd8055d 100644 --- a/third_party/python/Modules/_ctypes/callbacks.c +++ b/third_party/python/Modules/_ctypes/callbacks.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include "Python.h" #include "frameobject.h" diff --git a/third_party/python/Modules/_ctypes/callproc.c b/third_party/python/Modules/_ctypes/callproc.c index 2bb289bce..5832a0ac9 100644 --- a/third_party/python/Modules/_ctypes/callproc.c +++ b/third_party/python/Modules/_ctypes/callproc.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * History: First version dated from 3/97, derived from my SCMLIB version * for win16. diff --git a/third_party/python/Modules/_ctypes/cfield.c b/third_party/python/Modules/_ctypes/cfield.c index e39065fa9..3c1cefb57 100644 --- a/third_party/python/Modules/_ctypes/cfield.c +++ b/third_party/python/Modules/_ctypes/cfield.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include "Python.h" #include diff --git a/third_party/python/Modules/_ctypes/ctypes.h b/third_party/python/Modules/_ctypes/ctypes.h index 5d3b96633..83ae89ccd 100644 --- a/third_party/python/Modules/_ctypes/ctypes.h +++ b/third_party/python/Modules/_ctypes/ctypes.h @@ -1,3 +1,4 @@ +/* clang-format off */ #if defined (__SVR4) && defined (__sun) # include #endif diff --git a/third_party/python/Modules/_ctypes/ctypes_dlfcn.h b/third_party/python/Modules/_ctypes/ctypes_dlfcn.h index 54cdde9a4..4ebb820c5 100644 --- a/third_party/python/Modules/_ctypes/ctypes_dlfcn.h +++ b/third_party/python/Modules/_ctypes/ctypes_dlfcn.h @@ -1,3 +1,4 @@ +/* clang-format off */ #ifndef _CTYPES_DLFCN_H_ #define _CTYPES_DLFCN_H_ diff --git a/third_party/python/Modules/_ctypes/darwin/LICENSE b/third_party/python/Modules/_ctypes/darwin/LICENSE deleted file mode 100644 index 786fb5025..000000000 --- a/third_party/python/Modules/_ctypes/darwin/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2002 Jorge Acereda & - Peter O'Gorman - -Portions may be copyright others, see the AUTHORS file included with this -distribution. - -Maintained by Peter O'Gorman - -Bug Reports and other queries should go to - - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - diff --git a/third_party/python/Modules/_ctypes/darwin/README b/third_party/python/Modules/_ctypes/darwin/README deleted file mode 100644 index 4d63f3dfa..000000000 --- a/third_party/python/Modules/_ctypes/darwin/README +++ /dev/null @@ -1,95 +0,0 @@ -dlcompat for Darwin -========================= - -This is dlcompat, a small library that emulates the dlopen() -interface on top of Darwin's dyld API. - -dlcompat allows loading a ".dylib" library (as long as the RTLD_LOCAL -flag isn't passed to dlopen()). It can be configured to yield a warning -when trying to close it (dynamic libraries cannot currently be unloaded). - -It automatically searches for modules in several directories when no -absolute path is specified and the module is not found in the current -directory. - -The paths searched are those specified in the environment variables -LD_LIBRARY_PATH and DYLD_LIBRARY_PATH plus /lib, /usr/local/lib and -/usr/lib or the path specified in the environment variable -DYLD_FALLBACK_LIBRARY_PATH. - -In the default install the behavior of dlsym is to automatically prepend -an underscore to passed in symbol names, this allows easier porting of -applications which were written specifically for ELF based lifeforms. - -Installation --------------- -Type: - ./configure - make - sudo make install - -This will compile the source file, generate both a static and shared -library called libdl and install it into /usr/local/lib. The header -file dlfcn.h will be installed in /usr/local/include. - -If you want to place the files somewhere else, run - - make clean - ./configure --prefix= - make - sudo make install - -where is the hierarchy you want to install into, e.g. /usr -for /usr/lib and /usr/include (_NOT_ recommended!). - -To enable debugging output (useful for me), run - - make clean - ./configure --enable-debug - make - sudo make install - -If you want old dlcompat style behavior of not prepending the underscore -on calls to dlsym then type: - - make clean - ./configure --enable-fink - make - sudo make install - -Usage -------- -Software that uses GNU autoconf will likely check for a library called -libdl, that's why I named it that way. For software that doesn't find -the library on its own, you must add a '-ldl' to the appropriate -Makefile (or environment) variable, usually LIBS. - -If you installed dlcompat into a directory other than /usr/local/lib, -you must tell the compiler where to find it. Add '-L/lib' to -LDFLAGS (or CFLAGS) and '-I/include' to CPPFLAGS (or CFLAGS). - -Notes ------ -If you are writing new software and plan to have Mac OX X compatibility you -should look at the dyld api's in /usr/include/mach-o/dyld.h, rather than -using dlcompat, using the native api's is the supported method of loading -dynamically on Mac OS X, if you want an small example, look at dlfcn_simple.c, -which should help get you started. - -Also note that the functions in dlcompat are not thread safe, and while it is not -POSIX spec compliant, it is about as close to compliance as it is going to get though. - -You can always get the latest version from opendarwin cvs: - - cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/cvs/od login - cvs -z3 -d :pserver:anonymous@anoncvs.opendarwin.org:/cvs/od \ - co -d dlcompat proj/dlcompat - - -It is hoped that this library will be useful, and as bug free as possible, if you find -any bugs please let us know about them so they can be fixed. - -Please send bug reports to Peter O'Gorman - -Thanks. - diff --git a/third_party/python/Modules/_ctypes/darwin/README.ctypes b/third_party/python/Modules/_ctypes/darwin/README.ctypes deleted file mode 100644 index 8520b01f4..000000000 --- a/third_party/python/Modules/_ctypes/darwin/README.ctypes +++ /dev/null @@ -1,11 +0,0 @@ -The files in this directory are taken from -http://www.opendarwin.org/cgi-bin/cvsweb.cgi/~checkout~/proj/dlcompat/ - -The LICENSE in this directory applies to these files. - -Thomas Heller, Jan 2003 - -These files have been modified so they fall back to the system -dlfcn calls if available in libSystem. - -Bob Ippolito, Feb 2006 diff --git a/third_party/python/Modules/_ctypes/darwin/dlfcn.h b/third_party/python/Modules/_ctypes/darwin/dlfcn.h deleted file mode 100644 index a2afc3eeb..000000000 --- a/third_party/python/Modules/_ctypes/darwin/dlfcn.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright (c) 2002 Jorge Acereda & - Peter O'Gorman - -Portions may be copyright others, see the AUTHORS file included with this -distribution. - -Maintained by Peter O'Gorman - -Bug Reports and other queries should go to - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -#ifndef _DLFCN_H_ -#define _DLFCN_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* - * Structure filled in by dladdr(). - */ - -typedef struct dl_info { - const char *dli_fname; /* Pathname of shared object */ - void *dli_fbase; /* Base address of shared object */ - const char *dli_sname; /* Name of nearest symbol */ - void *dli_saddr; /* Address of nearest symbol */ -} Dl_info; - - -#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_2 -#warning CTYPES_DARWIN_DLFCN -#define CTYPES_DARWIN_DLFCN -extern void * (*ctypes_dlopen)(const char *path, int mode); -extern void * (*ctypes_dlsym)(void * handle, const char *symbol); -extern const char * (*ctypes_dlerror)(void); -extern int (*ctypes_dlclose)(void * handle); -extern int (*ctypes_dladdr)(const void *, Dl_info *); -#else -extern void * dlopen(const char *path, int mode); -extern void * dlsym(void * handle, const char *symbol); -extern const char * dlerror(void); -extern int dlclose(void * handle); -extern int dladdr(const void *, Dl_info *); -#endif - -#define RTLD_LAZY 0x1 -#define RTLD_NOW 0x2 -#define RTLD_LOCAL 0x4 -#define RTLD_GLOBAL 0x8 -#define RTLD_NOLOAD 0x10 -#define RTLD_NODELETE 0x80 - -/* These are from the Mac OS X 10.4 headers */ -#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */ -#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */ - -#ifdef __cplusplus -} -#endif - -#endif /* _DLFCN_H_ */ diff --git a/third_party/python/Modules/_ctypes/darwin/dlfcn_simple.c b/third_party/python/Modules/_ctypes/darwin/dlfcn_simple.c deleted file mode 100644 index 2b293bb86..000000000 --- a/third_party/python/Modules/_ctypes/darwin/dlfcn_simple.c +++ /dev/null @@ -1,272 +0,0 @@ -/* -Copyright (c) 2002 Peter O'Gorman - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - - -/* Just to prove that it isn't that hard to add Mac calls to your code :) - This works with pretty much everything, including kde3 xemacs and the gimp, - I'd guess that it'd work in at least 95% of cases, use this as your starting - point, rather than the mess that is dlfcn.c, assuming that your code does not - require ref counting or symbol lookups in dependent libraries -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "dlfcn.h" - -#ifdef CTYPES_DARWIN_DLFCN - -#define ERR_STR_LEN 256 - -#ifndef MAC_OS_X_VERSION_10_3 -#define MAC_OS_X_VERSION_10_3 1030 -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 -#define DARWIN_HAS_DLOPEN -extern void * dlopen(const char *path, int mode) __attribute__((weak_import)); -extern void * dlsym(void * handle, const char *symbol) __attribute__((weak_import)); -extern const char * dlerror(void) __attribute__((weak_import)); -extern int dlclose(void * handle) __attribute__((weak_import)); -extern int dladdr(const void *, Dl_info *) __attribute__((weak_import)); -#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */ - -#ifndef DARWIN_HAS_DLOPEN -#define dlopen darwin_dlopen -#define dlsym darwin_dlsym -#define dlerror darwin_dlerror -#define dlclose darwin_dlclose -#define dladdr darwin_dladdr -#endif - -void * (*ctypes_dlopen)(const char *path, int mode); -void * (*ctypes_dlsym)(void * handle, const char *symbol); -const char * (*ctypes_dlerror)(void); -int (*ctypes_dlclose)(void * handle); -int (*ctypes_dladdr)(const void *, Dl_info *); - -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 -/* Mac OS X 10.3+ has dlopen, so strip all this dead code to avoid warnings */ - -static void *dlsymIntern(void *handle, const char *symbol); - -static const char *error(int setget, const char *str, ...); - -/* Set and get the error string for use by dlerror */ -static const char *error(int setget, const char *str, ...) -{ - static char errstr[ERR_STR_LEN]; - static int err_filled = 0; - const char *retval; - va_list arg; - if (setget == 0) - { - va_start(arg, str); - strncpy(errstr, "dlcompat: ", ERR_STR_LEN); - vsnprintf(errstr + 10, ERR_STR_LEN - 10, str, arg); - va_end(arg); - err_filled = 1; - retval = NULL; - } - else - { - if (!err_filled) - retval = NULL; - else - retval = errstr; - err_filled = 0; - } - return retval; -} - -/* darwin_dlopen */ -static void *darwin_dlopen(const char *path, int mode) -{ - void *module = 0; - NSObjectFileImage ofi = 0; - NSObjectFileImageReturnCode ofirc; - - /* If we got no path, the app wants the global namespace, use -1 as the marker - in this case */ - if (!path) - return (void *)-1; - - /* Create the object file image, works for things linked with the -bundle arg to ld */ - ofirc = NSCreateObjectFileImageFromFile(path, &ofi); - switch (ofirc) - { - case NSObjectFileImageSuccess: - /* It was okay, so use NSLinkModule to link in the image */ - module = NSLinkModule(ofi, path, - NSLINKMODULE_OPTION_RETURN_ON_ERROR - | (mode & RTLD_GLOBAL) ? 0 : NSLINKMODULE_OPTION_PRIVATE - | (mode & RTLD_LAZY) ? 0 : NSLINKMODULE_OPTION_BINDNOW); - NSDestroyObjectFileImage(ofi); - break; - case NSObjectFileImageInappropriateFile: - /* It may have been a dynamic library rather than a bundle, try to load it */ - module = (void *)NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR); - break; - default: - /* God knows what we got */ - error(0, "Can not open \"%s\"", path); - return 0; - } - if (!module) - error(0, "Can not open \"%s\"", path); - return module; - -} - -/* dlsymIntern is used by dlsym to find the symbol */ -static void *dlsymIntern(void *handle, const char *symbol) -{ - NSSymbol nssym = 0; - /* If the handle is -1, if is the app global context */ - if (handle == (void *)-1) - { - /* Global context, use NSLookupAndBindSymbol */ - if (NSIsSymbolNameDefined(symbol)) - { - nssym = NSLookupAndBindSymbol(symbol); - } - - } - /* Now see if the handle is a struch mach_header* or not, use NSLookupSymbol in image - for libraries, and NSLookupSymbolInModule for bundles */ - else - { - /* Check for both possible magic numbers depending on x86/ppc byte order */ - if ((((struct mach_header *)handle)->magic == MH_MAGIC) || - (((struct mach_header *)handle)->magic == MH_CIGAM)) - { - if (NSIsSymbolNameDefinedInImage((struct mach_header *)handle, symbol)) - { - nssym = NSLookupSymbolInImage((struct mach_header *)handle, - symbol, - NSLOOKUPSYMBOLINIMAGE_OPTION_BIND - | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); - } - - } - else - { - nssym = NSLookupSymbolInModule(handle, symbol); - } - } - if (!nssym) - { - error(0, "Symbol \"%s\" Not found", symbol); - return NULL; - } - return NSAddressOfSymbol(nssym); -} - -static const char *darwin_dlerror(void) -{ - return error(1, (char *)NULL); -} - -static int darwin_dlclose(void *handle) -{ - if ((((struct mach_header *)handle)->magic == MH_MAGIC) || - (((struct mach_header *)handle)->magic == MH_CIGAM)) - { - error(0, "Can't remove dynamic libraries on darwin"); - return 0; - } - if (!NSUnLinkModule(handle, 0)) - { - error(0, "unable to unlink module %s", NSNameOfModule(handle)); - return 1; - } - return 0; -} - - -/* dlsym, prepend the underscore and call dlsymIntern */ -static void *darwin_dlsym(void *handle, const char *symbol) -{ - static char undersym[257]; /* Saves calls to malloc(3) */ - int sym_len = strlen(symbol); - void *value = NULL; - char *malloc_sym = NULL; - - if (sym_len < 256) - { - snprintf(undersym, 256, "_%s", symbol); - value = dlsymIntern(handle, undersym); - } - else - { - malloc_sym = malloc(sym_len + 2); - if (malloc_sym) - { - sprintf(malloc_sym, "_%s", symbol); - value = dlsymIntern(handle, malloc_sym); - free(malloc_sym); - } - else - { - error(0, "Unable to allocate memory"); - } - } - return value; -} - -static int darwin_dladdr(const void *handle, Dl_info *info) { - return 0; -} -#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 */ - -#if __GNUC__ < 4 -#pragma CALL_ON_LOAD ctypes_dlfcn_init -#else -static void __attribute__ ((constructor)) ctypes_dlfcn_init(void); -static -#endif -void ctypes_dlfcn_init(void) { - if (dlopen != NULL) { - ctypes_dlsym = dlsym; - ctypes_dlopen = dlopen; - ctypes_dlerror = dlerror; - ctypes_dlclose = dlclose; - ctypes_dladdr = dladdr; - } else { -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 - ctypes_dlsym = darwin_dlsym; - ctypes_dlopen = darwin_dlopen; - ctypes_dlerror = darwin_dlerror; - ctypes_dlclose = darwin_dlclose; - ctypes_dladdr = darwin_dladdr; -#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 */ - } -} - -#endif /* CTYPES_DARWIN_DLFCN */ diff --git a/third_party/python/Modules/_ctypes/libffi/ChangeLog b/third_party/python/Modules/_ctypes/libffi/ChangeLog deleted file mode 100644 index c85cbe621..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ChangeLog +++ /dev/null @@ -1,5105 +0,0 @@ -commit 0403f332b1f478696c30d3d8a0e2f6eef24aaf88 -Author: Anthony Green -Date: Mon May 19 09:41:32 2014 -0400 - - Update date. Annoucing 3.1 today. - -commit 94ac0c168ee7b115409121d88b25a4979446c8da -Author: Anthony Green -Date: Mon May 19 09:37:21 2014 -0400 - - Increment libtool library revision number - -commit 57465744b6e1295d7202de5a7734df589518f1c8 -Author: Anthony Green -Date: Sun May 11 10:30:22 2014 -0400 - - Update to version 3.1 - -commit 0c2251a42df5108b6d9ebe5fe1cf83d0bcdf660e -Author: Anthony Green -Date: Sun May 11 10:22:30 2014 -0400 - - Support versions of git older than 1.8.5 - -commit 70c303cb88e23aaee91c87c56b108c50ab4f3c2f -Author: Anthony Green -Date: Sun May 11 09:56:40 2014 -0400 - - Fix testsuite for GCC 4.9.0 - -commit 52b3457093ed19b2a7c5fcf243c4014c90ce6225 -Author: Magnus Granberg -Date: Sun May 11 09:55:28 2014 -0400 - - Check /proc/self/status for PaX status. - -commit 7ba4c5d72aa440a4b21fb57e999e67c5957761da -Author: Dominik Vogt -Date: Sun May 11 09:52:47 2014 -0400 - - Use to get correct dir - -commit 31e0d4ecff6dc2a6c75a066ee099b52a43f6ba27 -Merge: 1c0e9a7 99909eb -Author: Anthony Green -Date: Wed Apr 23 19:24:47 2014 -0400 - - Merge pull request #119 from joshtriplett/fastcall-fastball - - src/x86/win32.S: Define ffi_closure_FASTCALL in the MASM section, too - -commit 99909eb6184b62408d88b6b4e7ab38e84e6d0bf3 -Author: Josh Triplett -Date: Tue Apr 22 21:17:52 2014 -0700 - - src/x86/win32.S: Define ffi_closure_FASTCALL in the MASM section, too - -commit 1c0e9a7297ced15413c2d2d5d35f6c650c4b46c9 -Merge: 93a24f2 d369522 -Author: Anthony Green -Date: Mon Apr 21 12:41:56 2014 -0400 - - Merge pull request #101 from joshtriplett/fastcall-closures - - Support closures for fastcall - -commit d36952273d4fafbda91ecc205fc0824f7cc65e70 -Author: Josh Triplett -Date: Sun Apr 20 12:03:25 2014 -0700 - - Support fastcall closures - - libffi on 32-bit x86 now supports closures for all supported ABIs. - Thus, rewrite the last remaining duplicated-by-ABI test (closure_stdcall - and closure_thiscall) to use the generic ABI_NUM/ABI_ATTR mechanism. - -commit 93a24f216bcdd1018b976d697179c6d49004015a -Merge: dd11a04 2349fec -Author: Anthony Green -Date: Sat Apr 12 19:38:07 2014 -0400 - - Merge pull request #80 from ueno/devel - - Fix typo in doc - -commit dd11a04061cb49ce1d702545693c24eb1267d648 -Merge: 8fa2812 03ca880 -Author: Anthony Green -Date: Sat Apr 12 19:37:21 2014 -0400 - - Merge pull request #86 from joshtriplett/testsuite-CC-CXX - - testsuite ignores CC parameter supplied to configure or make - -commit 8fa2812355e685a42abf9a62fbc674d616b2edee -Merge: 8a58e6b 419503f -Author: Anthony Green -Date: Sat Apr 12 19:32:08 2014 -0400 - - Merge pull request #116 from frida/fix/darwin-aarch64-variadic - - Fix handling of variadic calls on Darwin/AArch64 - -commit 8a58e6b7805b736def197b8baf8e465a2a3f6913 -Merge: 30b77c5 a539f7f -Author: Anthony Green -Date: Sat Apr 12 19:30:18 2014 -0400 - - Merge pull request #115 from frida/fix/darwin-aarch64-alignment - - Fix alignment of AArch64 assembler functions - -commit 30b77c56f95c63ecd83399aafdbad7b07330f2fd -Merge: dc33cb3 3e2b84d -Author: Anthony Green -Date: Sat Apr 12 19:29:13 2014 -0400 - - Merge pull request #117 from frida/fix/windows-regression - - Fix Windows regression - -commit 3e2b84d295531720917bf46afc532fc6d877e3ec -Author: Ole André Vadla Ravnås -Date: Sat Apr 12 01:04:04 2014 +0200 - - Fix Windows regression - - Introduced by b5fed601948237037513a9b7f967c8fc6c9ff1f6. - -commit 419503f409c321fe31ff59d963ef34bb913420d0 -Author: Ole André Vadla Ravnås -Date: Sun Apr 6 20:54:13 2014 +0200 - - Fix handling of variadic calls on Darwin/AArch64 - -commit a539f7ffd6783aa11353d13265520e453c565fb4 -Author: Ole André Vadla Ravnås -Date: Sun Apr 6 20:53:02 2014 +0200 - - Fix alignment of AArch64 assembler functions - -commit dc33cb3c998da521a960385c1269c3aef552f69f -Merge: c860a99 b5fed60 -Author: Anthony Green -Date: Sat Apr 5 23:41:22 2014 -0400 - - Merge pull request #114 from joshtriplett/bounce-on-a-tiny-trampoline - - Fix ABI on 32-bit non-Windows x86: go back to trampoline size 10 - -commit b5fed601948237037513a9b7f967c8fc6c9ff1f6 -Author: Josh Triplett -Date: Sat Apr 5 17:33:42 2014 -0700 - - Fix ABI on 32-bit non-Windows x86: go back to trampoline size 10 - - The trampoline size is part of the ABI, so it cannot change. Move the - logic from the stdcall and thiscall trampolines to the functions they - call, to reduce them both to 10 bytes. - - This drops the previously added support for raw THISCALL closures on - non-Windows. (Non-raw THISCALL closures still work.) - -commit 03ca880081b22efab09ba72268270f83017d3d7b -Author: Josh Triplett -Date: Thu Mar 27 08:44:34 2014 -0700 - - README: Note the testsuite changes to respect $CC and $CXX - -commit d74df8c5d8c6722ecb908da98c86cc8e2c755b84 -Author: Josh Triplett -Date: Thu Mar 27 00:44:12 2014 -0700 - - README: Update Windows example to set both CC and CXX - -commit 7d698125b1f05173f3656a89755a2eb58813b002 -Author: Josh Triplett -Date: Wed Mar 26 23:17:56 2014 -0700 - - Use the proper C++ compiler to run C++ tests - - Running the C compiler with -shared-libgcc -lstdc++ does not work on - non-GCC compilers. - -commit fa5e88f170cb37c7b2b9bb015c8c5b854ffd8a3e -Author: Josh Triplett -Date: Wed Mar 26 23:53:57 2014 -0700 - - .travis.yml: Make the build command more readable by splitting at && - - "script" can contain multiple commands to run in sequence. - -commit 0c3824702d3d59d37f8c177d646303f546187683 -Author: Josh Triplett -Date: Wed Mar 26 14:51:32 2014 -0700 - - Always set CC_FOR_TARGET for dejagnu, to make the testsuite respect $CC - - This fixes cross-compilation and compilation with CC="gcc -m32". - -commit 9946a92af31b30cb7760150d1f8ca6c11b01aeea -Author: Josh Triplett -Date: Wed Mar 26 20:18:58 2014 -0700 - - Stop looking for expect and runtest above top_builddir - - Users wishing to test hand-compiled versions of expect and runtest can - easily enough put them in their path or set EXPECT and RUNTEST - themselves. - -commit acb202325215058639234efb7af1f04c1c8a1f44 -Author: Josh Triplett -Date: Wed Mar 26 20:18:41 2014 -0700 - - Stop setting an empty AM_RUNTESTFLAGS - -commit c860a992fef5d7cd7bb0975b1632d17a9fafe007 -Author: Anthony Green -Date: Tue Mar 25 17:02:51 2014 -0400 - - Upgrade version to 3.1-rc1 - -commit 9837073e6203048a162a226798c5d252600219ed -Author: Anthony Green -Date: Tue Mar 25 16:24:14 2014 -0400 - - Update copyright date and clean up README notes. - -commit 18d3baa9f597b026675baa1b4e5a5eeef7577a08 -Merge: afee537 f0c8a31 -Author: Anthony Green -Date: Tue Mar 25 16:12:53 2014 -0400 - - Merge pull request #108 from joshtriplett/freebsd - - [3.1 blocker] Fix FreeBSD support - -commit afee53738a995e23bd2f89fd0f7b30b380566106 -Merge: 7d24785 b2d610e -Author: Anthony Green -Date: Tue Mar 25 16:12:35 2014 -0400 - - Merge pull request #106 from joshtriplett/darwin-award - - [3.1 blocker] Update OS X build system to include win32.S on 32-bit - -commit 7d2478568ed9f03cbf57627f449a2d2cf4d1571c -Merge: beab5f3 56be47f -Author: Anthony Green -Date: Tue Mar 25 16:12:17 2014 -0400 - - Merge pull request #110 from joshtriplett/w64 - - Fix 64-bit Windows support - -commit beab5f334d9ec5b8b91d1cc727d1029b40358e7e -Merge: 28fb197 ef5890e -Author: Anthony Green -Date: Tue Mar 25 16:07:47 2014 -0400 - - Merge pull request #105 from joshtriplett/win32-relocations - - [3.1 blocker] win32.S needs to handle relocations/GOT - -commit f0c8a31577172104049283f0a80c723084a5bd77 -Author: Josh Triplett -Date: Mon Mar 24 22:14:26 2014 -0700 - - Compile win32.S on FreeBSD - -commit b2d610e028b5ce48d1ad7e5d0debc9c321d891b2 -Author: Josh Triplett -Date: Fri Mar 21 11:10:13 2014 -0700 - - Compile win32.S on 32-bit Darwin as well - -commit be50b87a490e794362cb4a27ada2fbaab202adb8 -Author: Josh Triplett -Date: Mon Mar 24 21:44:13 2014 -0700 - - Always use configure to detect whether global symbols need underscores - - 64-bit Windows already used this check; make it universal, and use it in - place of an ifdef on X86_WIN32, to handle non-Windows platforms that use - the underscore, such as Darwin. - -commit 56be47f87629e31afbcb0774aa65735f539ee972 -Author: Josh Triplett -Date: Mon Mar 24 21:24:53 2014 -0700 - - Fix a warning on 64-bit Windows - - When sizeof(size_t) != sizeof(unsigned), adding a size_t to cif->bytes - produces a "possible loss of data" warning. However, the size_t in - question refers to the size of a single parameter. Use a cast to avoid - the warning. - -commit 48a8eda74aad8a21b6f26df5df08fe64c043d208 -Author: Josh Triplett -Date: Mon Mar 24 21:21:12 2014 -0700 - - Avoid referencing undefined ABIs on 64-bit Windows builds - - 64-bit Windows does not have FFI_STDCALL, FFI_THISCALL, or FFI_FASTCALL. - -commit f0f4138f90345d7d67dfa6783a7e1c7cc30d3c6f -Author: Josh Triplett -Date: Sat Mar 22 10:00:53 2014 -0700 - - win32.S: Add handling for position-independent code on Darwin - - Newer versions of Darwin generate the necessary stub functions - automatically and just need a call instruction, but accomodating older - versions as well requires adding the stub. - -commit ef5890ebafb7cd2fbf9acf161edb55fe1382871c -Author: Josh Triplett -Date: Fri Mar 21 11:01:39 2014 -0700 - - win32.S: Use shifting for multiplication rather than repeated addition - - The jump table code added a register to itself twice to multiply by 4; - shift the register left by 2 instead. - -commit 4fca48901e7e4f53bf490ed22607b2d2d8f4bfcc -Author: Josh Triplett -Date: Fri Mar 21 11:00:41 2014 -0700 - - win32.S: Make the jump tables position-independent - - Now that non-Windows platforms include win32.S, it needs to support - building as position-independent code. This fixes build failures on - target platforms that do not allow text relocations. - -commit 2087dcf736274286f76c69d3988fb6d7cc4fd0f5 -Author: Josh Triplett -Date: Fri Mar 21 10:57:06 2014 -0700 - - win32.S: Make calls to ffi_closure_SYSV_inner position-independent - - Now that non-Windows platforms include win32.S, it needs to support - building as position-independent code. This fixes one source of build - failures on target platforms that do not allow text relocations. - -commit 28fb197079cf1d11da4eef7c8c243ab05590c528 -Merge: c697472 c3dd0a1 -Author: Anthony Green -Date: Tue Mar 18 12:19:36 2014 -0400 - - Merge pull request #107 from rvandermeulen/msvcc - - Various compatibility fixes and improvements to msvcc.sh. - -commit c3dd0a1a0245fc174361a70876e88ae24285f861 -Author: Ryan VanderMeulen -Date: Tue Mar 18 12:09:45 2014 -0400 - - Various compatibility fixes and improvements to msvcc.sh. - - * Don't try to mix incompatible optimization flags in debug builds. - * Workaround ax_cc_maxopt.m4 not supporting MSVC and change -O3 to -O2. - * Fix MSVC warning by properly passing linker flags to compiler. - * Make msvcc.sh return 1 if invalid command line options are used rather than silently eating them. - * Add more comments. - -commit c697472fccfbb5b87b007c053cda9ef014b346b9 -Merge: 83fd2bc e48918e -Author: Anthony Green -Date: Mon Mar 17 00:32:42 2014 -0400 - - Merge pull request #102 from joshtriplett/test-generic - - Add ABIs to the test matrix; unify many bits of the testsuite - -commit e48918ecf876bc85d040fc50a232059c566553a8 -Author: Josh Triplett -Date: Sun Mar 16 20:29:27 2014 -0700 - - testsuite: Add ABIs to the test matrix; unify tests across ABIs - - This eliminates all the *_win32.c tests in favor of the tests they were - branched from, and expands test coverage to run many more tests on - stdcall, thiscall, and fastcall. - - This same mechanism also supports testing any other target that has - multiple ABIs. - -commit 4d4d368e5a55d9443c4c53b1b70d58ab6d8c941c -Author: Josh Triplett -Date: Sun Mar 16 17:02:05 2014 -0700 - - testsuite: Replace ffitestcxx.h with ffitest.h - - ffitest.h contains a superset of the functionality of ffitestcxx.h; - make the C++ tests include ffitest.h instead, and remove ffitestcxx.h. - -commit 3f97cf3413c46caf2a79f32ac9cda4620972c2d7 -Author: Josh Triplett -Date: Sun Mar 16 16:53:42 2014 -0700 - - testsuite: Unify the C and C++ testsuites - - These two testsuites differ only in the source file glob and a couple of - additional compiler options; unify the remaining bits. - -commit 0d9cce8edb937bbe771a6cdd25f671edf06d2128 -Author: Josh Triplett -Date: Sun Mar 16 16:22:58 2014 -0700 - - testsuite: ffitest.h: Parenthesize the CHECK macro - -commit 5695ec1444c5323e48fe4314f8c8f027625e67df -Author: Josh Triplett -Date: Sun Mar 16 16:04:58 2014 -0700 - - testsuite: Factor out a function to run a matrix of tests - - This commons up code from libffi.call/call.exp and - libffi.special/special.exp, unifies the optimization option matrix - between the two, and makes it easier to add more axes to the matrix - in the future. - -commit dfdb02cc869855d3b68571e5f7aa77ae8c9d254a -Author: Josh Triplett -Date: Sun Mar 16 15:26:26 2014 -0700 - - testsuite: Introduce a __THISCALL__ compiler-specific macro - -commit 83fd2bce0456224483435d4b764063f4513fd464 -Merge: 3658a07 06ff924 -Author: Anthony Green -Date: Sun Mar 16 22:03:29 2014 -0400 - - Merge pull request #99 from joshtriplett/gitignore - - .gitignore: Ignore more generated files - -commit 3658a0700a50d37a2fdba04fd9d79ad2f706d9f5 -Merge: d948d0a 46c5d3c -Author: Anthony Green -Date: Sun Mar 16 21:37:42 2014 -0400 - - Merge pull request #100 from rvandermeulen/bug-756740 - - Change double quotes in Makefile.am to single quotes. - -commit 46c5d3c30fdc2b43c076ad955078d7c5f1e75b37 -Author: Ryan VanderMeulen -Date: Sun Mar 16 21:16:08 2014 -0400 - - Change double quotes in Makefile.am to single quotes. - - This was originally done in PR #84, except the change was made to Makefile.in instead of Makefile.am and was therefore reverted the next time the files were regenerated. - -commit 06ff924215a2f9739efa2c059dc595bc4ec1c851 -Author: Josh Triplett -Date: Sun Mar 16 16:19:46 2014 -0700 - - .gitignore: Ignore more generated files - - The build process generates doc/libffi.info and fficonfig.h.in, so add - them to .gitignore. - -commit bad8948346e9b8813023a0cc78a3b6eb8d9c14c6 -Author: Josh Triplett -Date: Sun Mar 16 15:16:18 2014 -0700 - - testsuite: Introduce a __STDCALL__ compiler-specific macro - - Several tests want to use stdcall, which differs in syntax by compiler, - so introduce a macro for it in ffitest.h. - -commit 98a793fa36a4ab3ba24d059cb80a2891cdb940e1 -Author: Josh Triplett -Date: Sun Mar 16 15:20:36 2014 -0700 - - testsuite: Common up the ifdef blocks for compiler-specific macros - -commit d948d0a729c934b0224749338a3ba0a2c8f51c45 -Merge: b61b472 a86bd31 -Author: Anthony Green -Date: Sun Mar 16 10:53:48 2014 -0400 - - Merge pull request #98 from joshtriplett/unconfigure.host - - Merge configure.host into configure.ac - -commit a86bd318e2424d879d784ee7b29d6536d7a17c18 -Author: Josh Triplett -Date: Sun Mar 16 06:58:59 2014 -0700 - - Merge configure.host into configure.ac - - configure.host only has a single entry, and shows no signs of needing - more added. - -commit b61b472bd0647006d6685238721002017f1d119c -Author: Anthony Green -Date: Sun Mar 16 09:45:55 2014 -0400 - - Update version to 3.1-rc0. Clean up README. - -commit 7a64e7dbba54e6e9f69954adfb943be1856ff928 -Merge: 11a5c5c eef2e02 -Author: Anthony Green -Date: Sun Mar 16 09:39:08 2014 -0400 - - Merge pull request #97 from joshtriplett/remove-more-generated-files - - Remove more generated files - -commit 11a5c5c39f5861011f6c5ddf795da3a32b5f0082 -Merge: 9a62a21 1c68c07 -Author: Anthony Green -Date: Sun Mar 16 09:38:47 2014 -0400 - - Merge pull request #96 from joshtriplett/sawing-changelogs - - Generate ChangeLog from git in make dist; remove it from version control - -commit eef2e02a13d7d1c8145d47a64467f654406a3548 -Author: Josh Triplett -Date: Sun Mar 16 06:26:03 2014 -0700 - - doc: Remove autogenerated info file and stamp - -commit 9fb403d3c5d9643e0f561cab6d4a07b1e54907ff -Author: Josh Triplett -Date: Sun Mar 16 06:25:52 2014 -0700 - - fficonfig.h.in: Remove, configure generates it - -commit 1c68c07217fda78a779778c1480fedef7a58d5b4 -Author: Josh Triplett -Date: Sun Mar 16 06:11:58 2014 -0700 - - Generate ChangeLog from git in make dist - - Archive the existing ChangeLog to ChangeLog.libffi-3.1 - -commit c65ed55e655711e008282edbdd82ce95d008b4f6 -Author: Josh Triplett -Date: Sun Mar 16 05:52:00 2014 -0700 - - ChangeLog.v1: Fix typo in explanatory header. - -commit 9a62a21f5c3a8e1da463229f3170c8ab3031d920 -Author: Anthony Green -Date: Sun Mar 16 09:03:57 2014 -0400 - - Add missing ChangeLog entry. Clean up some entries. - -commit 9bc704c58cb7a049d867837e3a11e2e31886ec66 -Merge: 694447a e892e58 -Author: Anthony Green -Date: Sun Mar 16 08:41:00 2014 -0400 - - Merge pull request #95 from joshtriplett/news - - README: Update news for 3.0.14 - -commit e892e581d1838a06c18c7ecd50ebd79915cff92b -Author: Josh Triplett -Date: Sun Mar 16 05:38:24 2014 -0700 - - README: Update news for 3.0.14 - -commit 694447aa29deadd571efb4e9a26ee3f68ede1493 -Merge: fdc87f3 45a6c21 -Author: Anthony Green -Date: Sun Mar 16 08:32:05 2014 -0400 - - Merge pull request #93 from joshtriplett/travis-dist - - Make Travis check "make dist" - -commit 45a6c21efa944b520842e631dc54919b04884744 -Author: Josh Triplett -Date: Sun Mar 16 05:29:08 2014 -0700 - - .travis.yml: Test "make dist" too. - -commit fdc87f3b2ea37b58a4a9ae6c35083f544909fe3c -Merge: 7412b83 e1911f7 -Author: Anthony Green -Date: Sun Mar 16 08:05:51 2014 -0400 - - Merge pull request #85 from joshtriplett/stdcall - - stdcall support on Linux - -commit e1911f78df113ca58738b66089a070d4cf747de7 -Author: Josh Triplett -Date: Sun Mar 16 03:25:53 2014 -0700 - - Add support for stdcall, thiscall, and fastcall on non-Windows x86-32 - - Linux supports the stdcall calling convention, either via functions - explicitly declared with the stdcall attribute, or via code compiled - with -mrtd which effectively makes stdcall the default. - - This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on - non-Windows x86-32 platforms, as non-default calling conventions. - -commit 7412b838d543aae4fa925862bd5702d3dacbc29a -Merge: c0cc5fd 9531d05 -Author: Anthony Green -Date: Sun Mar 16 07:58:16 2014 -0400 - - Merge pull request #90 from joshtriplett/win32-unifdef - - prep_cif.c: Remove unnecessary ifdef for X86_WIN32 - -commit c0cc5fdaa237b67e86f22d2f6e13f3b42d9aae33 -Merge: 98b5296 b3a5da0 -Author: Anthony Green -Date: Sun Mar 16 07:57:59 2014 -0400 - - Merge pull request #89 from joshtriplett/travis32 - - .travis.yml: Test on both 32-bit and 64-bit - -commit 9531d05f64c2a674e0197158ffad68d69f177bd0 -Author: Josh Triplett -Date: Sun Mar 16 01:50:02 2014 -0700 - - prep_cif.c: Remove unnecessary ifdef for X86_WIN32 - - ffi_prep_cif_core had a special case for X86_WIN32, checking for - FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI range - before returning FFI_BAD_ABI. However, on X86_WIN32, FFI_THISCALL - already falls in that range, making the special case unnecessary. - Remove it. - -commit b3a5da068abd2f2983d9e67adbf41b0e0f34e37f -Author: Josh Triplett -Date: Sat Mar 15 23:27:56 2014 -0700 - - .travis.yml: Test on both 32-bit and 64-bit - -commit 98b52960485a261399f081915f36063de3854a5f -Merge: 134ce4c f6dd184 -Author: Anthony Green -Date: Sun Mar 16 07:51:33 2014 -0400 - - Merge pull request #94 from joshtriplett/esp-extra-stackery-perception - - ChangeLog: Document testsuite changes to remove fragile stack pointer checks - -commit f6dd1845434dd53e22129becdfa092c082df307c -Author: Josh Triplett -Date: Sun Mar 16 04:49:36 2014 -0700 - - ChangeLog: Document testsuite changes to remove fragile stack pointer checks - -commit 134ce4c0266bf994f07518fc534de53f1d3c8de8 -Merge: 2680e9e 9c27932 -Author: Anthony Green -Date: Sun Mar 16 07:47:17 2014 -0400 - - Merge pull request #91 from joshtriplett/esp-extra-stackery-perception - - testsuite: Remove fragile stack pointer checks - -commit 9c279328ee12fc869adff63ca81f1230977bd42b -Author: Josh Triplett -Date: Sun Mar 16 02:31:19 2014 -0700 - - testsuite: Remove fragile stack pointer checks - - testsuite/libffi.call/closure_stdcall.c and - testsuite/libffi.call/closure_thiscall.c include inline assembly to save - the stack pointer before and after the call, and compare the values. - However, compilers can and do leave the stack in different states for - these two pieces of inline assembly, such as by saving a temporary value - on the stack across the call; observed with gcc -Os, and verified as - spurious through careful inspection of disassembly. - -commit 2680e9ea9b4c87ea8042a61e551bd667493d4bd3 -Merge: 071eab3 82f8cb2 -Author: Anthony Green -Date: Sun Mar 16 07:44:08 2014 -0400 - - Merge pull request #88 from joshtriplett/such-precision-many-fail-wow - - testsuite/libffi.call/many.c: Avoid spurious failure due to excess precision - -commit 82f8cb24a1d976db35ae31a4b86cec8926da327d -Author: Josh Triplett -Date: Sun Mar 16 04:27:32 2014 -0700 - - ChangeLog: Document many.c and many_win32.c changes to avoid spurious failures - -commit 88d562a8b5912e99306063fe3bc289bab6ca6ebe -Author: Josh Triplett -Date: Sat Mar 15 22:08:19 2014 -0700 - - testsuite/libffi.call/many_win32.c: Avoid spurious failure due to excess precision - - The test case testsuite/libffi.call/many_win32.c can spuriously fail due - to excess floating-point precision. Instrumenting it with some printf - calls shows differences well above FLT_EPSILON. (Note when - instrumenting it that multiple computations of the difference, such as - one in a print and another in the conditional, may produce different - results.) - - Rather than complicating the test suite with architecture-specific flags - to avoid excess precision, just simplify the floating-point computation - to avoid a dependency on potential excess precision. - -commit c00a49ecd165b2d06c1c9b249d212dc843fa116f -Author: Josh Triplett -Date: Sat Mar 15 22:08:19 2014 -0700 - - testsuite/libffi.call/many.c: Avoid spurious failure due to excess precision - - The test case testsuite/libffi.call/many.c can spuriously fail due to - excess floating-point precision. Instrumenting it with some printf - calls shows differences well above FLT_EPSILON. (Note when - instrumenting it that multiple computations of the difference, such as - one in a print and another in the conditional, may produce different - results.) - - Rather than complicating the test suite with architecture-specific flags - to avoid excess precision, just simplify the floating-point computation - to avoid a dependency on potential excess precision. - -commit 071eab32a7f9fbbef46c0d8f37d9985bc9cceb37 -Merge: 2228c7a 2f44952 -Author: Anthony Green -Date: Sun Mar 16 07:36:52 2014 -0400 - - Merge pull request #92 from joshtriplett/autogen - - Re-add libtool-ldflags - -commit 2f44952c95765c1486fad66f57235f8d459a9748 -Author: Josh Triplett -Date: Sun Mar 16 04:35:12 2014 -0700 - - Re-add libtool-ldflags - -commit 2228c7ab190f3c529b9018495467b841fa21cba2 -Merge: 76d19d0 35634db -Author: Anthony Green -Date: Sun Mar 16 07:25:18 2014 -0400 - - Merge pull request #87 from joshtriplett/autogen - - Remove autogenerated files from the repository - -commit 35634dbceaac0a1544f7385addc01d21ef1ef6a8 -Author: Josh Triplett -Date: Sat Mar 15 18:11:16 2014 -0700 - - Remove autogenerated files from the repository - - Add an autogen.sh to regenerate them. - -commit 76d19d004e36e99d261ee78261e2f52cea5e4ab1 -Merge: c86d9b6 a1a6f71 -Author: Anthony Green -Date: Fri Mar 14 16:54:31 2014 -0400 - - Ensure the linker supports @unwind sections in libffi. - -commit c86d9b6cc6e16ee262844a33b40441374400758c -Merge: 4efb7db f8cdf11 -Author: Anthony Green -Date: Fri Mar 14 16:51:20 2014 -0400 - - Fix merge - -commit 4efb7dbfd9427c478a948cd0d464210123db8de8 -Merge: 634a475 18eb81d -Author: Anthony Green -Date: Fri Mar 14 16:47:57 2014 -0400 - - Merge pull request #81 from rvandermeulen/bug-756740 - - Allow building for mipsel with Android NDK r8. - -commit a1a6f71bfe4199293043b2e4cfb4c8d3cb1112f9 -Author: Ryan VanderMeulen -Date: Mon Mar 10 15:12:47 2014 -0400 - - Remove stray hunk that shouldn't have been included in this patch. - -commit f8cdf11467181f2a9a6b7e748167569aa58e3a81 -Author: Ryan VanderMeulen -Date: Mon Mar 10 15:04:58 2014 -0400 - - Replace double quotes with single quotes in Makefile.in to improve compatibility between some versions of MSYS and gmake. From Mozilla bug 943728. - https://bugzilla.mozilla.org/show_bug.cgi?id=943728 - -commit dfa3738732e1bc3a7f4130395ae4bab55fcebb99 -Author: Ryan VanderMeulen -Date: Mon Mar 10 14:53:48 2014 -0400 - - Ensure the linker supports @unwind sections in libffi. From Mozilla bug 756740. - https://bugzilla.mozilla.org/show_bug.cgi?id=778414 - - Also tracked as issue #42. - https://github.com/atgreen/libffi/issues/42 - -commit 18eb81d032f29d645d0498ba92bddfd651f009ae -Author: Ryan VanderMeulen -Date: Mon Mar 10 14:43:37 2014 -0400 - - Allow building for mipsel with Android NDK r8. From Mozilla bug 756740. - https://bugzilla.mozilla.org/show_bug.cgi?id=756740 - -commit 2349fec9a818fb52fd2f294bcbc7b3156cd113de -Author: Daiki Ueno -Date: Wed Mar 5 17:53:02 2014 +0900 - - Fix typo in doc - -commit 634a475eaf1bee31c09f7d519e31c13b64cd24df -Author: Anthony Green -Date: Sat Mar 1 18:37:29 2014 -0500 - - Update Makefile for new darwin scripts - -commit c7b67e874bb89859f9a07d1cf9606052b6c0dcc1 -Author: Anthony Green -Date: Sat Mar 1 18:34:18 2014 -0500 - - Add README note - -commit a04e30ba3dc303133d459c1ac273ceefe4d49b32 -Author: Anthony Green -Date: Fri Feb 28 17:20:59 2014 -0500 - - Add missing -DFFI_DEBUG flag - -commit 934dc1b5c8d6a9e727bedc72342831eb7d62c35f -Merge: 11d7aa9 67fbef3 -Author: Anthony Green -Date: Fri Feb 28 01:10:17 2014 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 11d7aa9d7a4bbe642944edc0f07cf96db9b270b6 -Merge: b40aeda 3b44d41 -Author: Anthony Green -Date: Fri Feb 28 01:06:48 2014 -0500 - - Merge pull request #46 from makotokato/android-clang - - Fix build failure when using clang for Android - -commit 67fbef3b56ff0ef88f9b1a7fe48cb77222fa6cec -Merge: b40aeda 3b44d41 -Author: Anthony Green -Date: Fri Feb 28 01:06:48 2014 -0500 - - Merge pull request #46 from makotokato/android-clang - - Fix build failure when using clang for Android - -commit b40aeda31a74d95a37c723b6243aabac466e67c4 -Merge: 20698ab 53ceaf1 -Author: Anthony Green -Date: Fri Feb 28 01:01:29 2014 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 53ceaf14c5eeb16ba09745f0ca87cca367d41a90 -Merge: 860fe66 cc9b518 -Author: Anthony Green -Date: Fri Feb 28 01:01:02 2014 -0500 - - Merge pull request #40 from wojdyr/master - - Correct the -L flag in libffi.pc.in - -commit 20698abc6a00092fd7fd3e434a3a29dc0f048f1e -Merge: 64bd069 1a0b01e -Author: Anthony Green -Date: Fri Feb 28 00:56:27 2014 -0500 - - Merge pull request #66 from ppizarro/master - - BlackFin fixes - Fatal error when calling a function defined in a shared library from within the function called by FFI - -commit 860fe6646f5ae603e99a8d1d722ddddba8b75769 -Merge: 64bd069 1a0b01e -Author: Anthony Green -Date: Fri Feb 28 00:56:27 2014 -0500 - - Merge pull request #66 from ppizarro/master - - BlackFin fixes - Fatal error when calling a function defined in a shared library from within the function called by FFI - -commit 64bd06990a7accf72271516a2110b86cdccd8df4 -Author: Anthony Green -Date: Fri Feb 28 00:52:56 2014 -0500 - - Add ChangeLog entry for Josh's change - -commit edf29c5169b06fcfc241445e152e325bc3c50e0e -Merge: 33c9954 3998d26 -Author: Anthony Green -Date: Fri Feb 28 00:50:25 2014 -0500 - - Merge pull request #75 from joshtriplett/longdouble - - Fix build error on x86 without distinct long double - -commit 33c9954f2eec539011a0f93270aaf013318837ae -Author: Anthony Green -Date: Fri Feb 28 00:38:41 2014 -0500 - - Rebuilt with new libtool - -commit 926b6989fbd08488b9105943293353d45ac527e0 -Merge: 5a88c85 cc82051 -Author: Anthony Green -Date: Fri Feb 28 00:26:57 2014 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - - Conflicts: - ChangeLog - -commit 5a88c85fde304052bed1581ed0b6452ac2c68838 -Author: Anthony Green -Date: Fri Feb 28 00:23:04 2014 -0500 - - Fix spelling errors - -commit cc82051c7e80cea772c4b72da026eb7e68d598fc -Author: Anthony Green -Date: Fri Feb 28 00:23:04 2014 -0500 - - Fix spelling errors - -commit 001aaf4b1b56349596bb6f6b5c1613dcbbd84ea8 -Author: Anthony Green -Date: Fri Feb 28 00:20:17 2014 -0500 - - When no VFP arguments are present the IP register is used - uninitialized. Initialize it to the value of FP. - - This fixes a number of testsuite failures when configured for - armv7l-unknown-linux-gnueabihf - -commit 49f7729c3ce697c12408c42ccb29cdf4eb66bb85 -Author: Anthony Green -Date: Fri Feb 28 00:17:16 2014 -0500 - - aarch64 fix - -commit 447483d51c6aa9df7116f346a73fc1cf795f4c2b -Merge: 51377bd b4df9cf -Author: Anthony Green -Date: Thu Feb 27 15:42:41 2014 -0500 - - Fix ChangeLog merge - -commit 3998d2604b5c0d45a098ff3119a9fd9710ef429d -Author: Josh Triplett -Date: Mon Feb 17 11:20:33 2014 -0800 - - Fix build error on x86 without distinct long double - - src/x86/ffi64.c: In function 'classify_argument': - src/x86/ffi64.c:205:5: error: duplicate case value - case FFI_TYPE_LONGDOUBLE: - ^ - src/x86/ffi64.c:202:5: error: previously used here - case FFI_TYPE_DOUBLE: - ^ - -commit 51377bda9aed0b2c1309c818460cab9d9ab3d46e -Merge: f08da54 40927bd -Author: Anthony Green -Date: Sat Feb 15 08:06:29 2014 -0500 - - Merge pull request #72 from heiher/devel - - MIPS N32: Fix call floating point va function - -commit f08da5465463e60a28f5e921f23ebf2ba984c148 -Merge: 3dc3f32 fa5f25c -Author: Anthony Green -Date: Sat Feb 15 08:06:11 2014 -0500 - - Merge pull request #68 from zeldin/master - - Linux/ppc64: Remove assumption on contents of r11 in closure - -commit 40927bd3e1e7c6007025ba10854fd8a0664e47df -Author: Heiher -Date: Tue Jan 21 23:18:27 2014 +0800 - - Fix call floating point va function - - I'm not sure floating-point arguments in GPR or FPR before calling - variable number arguments function. so, load all arguments to GPR and - FPR. - -commit b4df9cf9cc4a9a9401a53fd6bea1f3c2c283b97b -Author: Zachary Waldowski -Date: Wed Feb 5 14:22:52 2014 -0500 - - AArch64: Fix void fall-through case when assertions are enabled - -commit f466aad0d91a117e42571d1d6fb434fa0433c930 -Author: Zachary Waldowski -Date: Tue Jan 21 16:38:31 2014 -0500 - - AArch64: Fix missing semicolons when assertions are enabled - -commit 7ea677733bd98917241852b8901a6b7580728895 -Author: Anthony Green -Date: Sat Nov 30 20:58:31 2013 -0500 - - Remove build-ios from Makefile - - Conflicts: - ChangeLog - -commit 6ae046cc59c12b2cd40158d6bcb96f4a59886159 -Author: Anthony Green -Date: Sat Nov 30 21:06:51 2013 -0500 - - Mention Aarch64 on iOS - -commit bfc06b3fdb32abe90ce0749aedfec649df85a7ef -Author: Zachary Waldowski -Date: Mon Dec 30 17:36:39 2013 -0500 - - Update ChangeLog - -commit 0a0f12ce1f7be81006b08a3c81a636926d283a9b -Author: Zachary Waldowski -Date: Thu Jan 9 13:50:17 2014 -0500 - - AArch64: Remove duplicitous element_count call. - - This inhibits an analyzer warning by Clang. - -commit 4330fdcd92e67c816288d64ab230237065768206 -Author: Zachary Waldowski -Date: Thu Jan 9 13:53:30 2014 -0500 - - Darwin/aarch64: Respect iOS ABI re: stack argument alignment - -commit 0a333d6c3973935d4fe02aae76b10e39d3c88e07 -Author: Zachary Waldowski -Date: Thu Jan 9 14:03:29 2014 -0500 - - Darwin/aarch64: Fix size_t assumptions - -commit 2c18e3c76aad1b426617db05a4384e7c3a920176 -Author: Zachary Waldowski -Date: Mon Dec 30 16:14:02 2013 -0500 - - Darwin/aarch64: Fix "shadows declaration" warnings - -commit 1b8a8e20e344f3c55495ab6eb46bd14e843d4b3e -Author: Zachary Waldowski -Date: Thu Jan 9 13:55:21 2014 -0500 - - Darwin/aarch64: Use Clang cache invalidation builtin - -commit 6030cdcae776f8fb5876a53168f7d1e75d28a242 -Author: Zachary Waldowski -Date: Mon Dec 30 15:45:51 2013 -0500 - - Darwin/aarch64: Account for long double being equal to double - -commit 5658b0892683d2e24e4d5842978c184a7ad33858 -Author: Zachary Waldowski -Date: Mon Dec 30 16:33:47 2013 -0500 - - Darwin/aarch64: Use CNAME, restrict .size like ARM - -commit 07175780802acec5dc49fdedd6d20a62409a6707 -Author: Zachary Waldowski -Date: Mon Dec 30 17:48:22 2013 -0500 - - Darwin/aarch64: Fix invalid reference in assembly - -commit 9da28b44277fea3aeb827c35dd63d609d2524a8b -Author: Zachary Waldowski -Date: Mon Dec 30 16:23:21 2013 -0500 - - Darwin/x86_64: Fix 64-bit type shortening warnings - -commit 821d398f08bd1d540a5b235507812ffeee49b580 -Author: Zachary Waldowski -Date: Thu Jan 9 13:15:06 2014 -0500 - - Darwin: Merge build scripts, redo project, incl. arm64 - -commit 6eff9ff9e72463b9783be2514f944b6f05692054 -Author: Zachary Waldowski -Date: Mon Dec 30 17:48:10 2013 -0500 - - Darwin/iOS: Improve unified syntax use for LLVM - -commit ba0ea99c82aadd5957386a031e3122011bd36d52 -Author: Zachary Waldowski -Date: Mon Dec 30 15:27:44 2013 -0500 - - Fix dlmalloc warnings due to set_segment_flags, sizeof(size_t) - -commit 994be3a5c1d0d17b19103396103e128517fd62f9 -Author: Zachary Waldowski -Date: Mon Dec 30 15:27:14 2013 -0500 - - Darwin/iOS: Fix mis-typing of vfp_reg_free - -commit a8e0a835ab1f62d03ad6391760e3e8b7732d24f8 -Author: Zachary Waldowski -Date: Mon Dec 30 15:26:20 2013 -0500 - - Darwin/ARM: Assert on NULL dereference - - This inhibits an analyzer warning by Clang on all platforms. - -commit 13675341581c489ed9df8ba390c8e08a732decb2 -Author: Zachary Waldowski -Date: Thu Jan 9 13:42:08 2014 -0500 - - Darwin/i386: Inhibit Clang previous prototype warnings - -commit 66469c381e2e2cc96e7d409266dea0ffe177eeca -Author: Zachary Waldowski -Date: Thu Jan 9 13:41:45 2014 -0500 - - Darwin/ARM: Inhibit Clang previous prototype warnings - -commit 5bfe62a00d2d659eec9f19b39802b6e69844fc27 -Author: Zachary Waldowski -Date: Thu Jan 9 13:41:27 2014 -0500 - - Darwin/AArch64: Inhibit Clang previous prototype warnings - -commit fa5f25c20f76a6ef5e950a7ccbce826672c8a620 -Author: Marcus Comstedt -Date: Sat Jan 4 19:00:08 2014 +0100 - - Linux/ppc64: Remove assumption on contents of r11 in closure - -commit 1a0b01e171e9c750437cef2f18917f5a6e32c498 -Author: Paulo Pizarro -Date: Thu Jan 2 16:17:59 2014 -0200 - - When the function called by the ffi called a function defined in a shared library generate a fatal error - The correction was to take into consideration the GOT. - -commit 3dc3f32c35db5ab995a835225f6815369735ceb7 -Author: Anthony Green -Date: Thu Dec 5 16:23:25 2013 -0500 - - Undo iOS ARM64 changes. - -commit 356b2cbc304bfe5bdc28b8d1c68d1ff084e9ec37 -Merge: 484a758 07345a3 -Author: Anthony Green -Date: Sat Nov 30 22:38:13 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 484a7584260e2fbb399ce90083046834271bf9ff -Author: Anthony Green -Date: Sat Nov 30 21:06:51 2013 -0500 - - Mention Aarch64 on iOS - -commit 07345a30ec0a2fa45a7c363d301f57723690cfa0 -Author: Anthony Green -Date: Sat Nov 30 21:06:51 2013 -0500 - - Mention Aarch64 on iOS - -commit d4b931c1b872378c35f12ddbb9a6d55e7f17c65e -Author: Anthony Green -Date: Sat Nov 30 20:58:31 2013 -0500 - - Remove build-ios from Makefile - -commit dfbf236d70fc1ec68e6ff193584a154353508e2f -Merge: 852ac3b bb9740e -Author: Anthony Green -Date: Sat Nov 30 20:54:54 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - Add ChangeLog entry. - -commit bb9740e545205f93a525c77aa6d1cbf4ca9371f3 -Merge: ac75368 4d701e0 -Author: Anthony Green -Date: Sat Nov 30 17:54:39 2013 -0800 - - Merge pull request #60 from zwaldowski/ios-redo - - Mac/iOS support, including aarch64 port - -commit 4d701e03faa475a5eb3b54b90046114a1e27b813 -Author: Zachary Waldowski -Date: Sat Nov 30 13:25:27 2013 -0500 - - Darwin: Properly export headers from Xcode project - -commit 022f12eb9ad2264e838fa5fb453733f5177888f4 -Author: Zachary Waldowski -Date: Sat Nov 30 12:21:38 2013 -0500 - - Darwin: Freshen gen scripts, remove old build-ios.sh - -commit e820fe2025d7ad3df7584407946dfaad2af69599 -Author: Zachary Waldowski -Date: Sat Nov 30 12:03:51 2013 -0500 - - Darwin/iOS: Include x86_64+aarch64 pieces in library - -commit 0278284e470ec91db7cdc15ac3dcd64683305848 -Author: Zachary Waldowski -Date: Sat Nov 30 03:03:37 2013 -0500 - - Darwin/aarch64: size_t assumptions - -commit 9775446b6441c91cd9059215c106aa3bcf949767 -Author: Zachary Waldowski -Date: Sat Nov 30 02:39:34 2013 -0500 - - Darwin/aarch64: Fix “shadows declaration” warnings - -commit 4260badc37705d3618e774dfe61184ac709881c1 -Author: Zachary Waldowski -Date: Sat Nov 30 02:08:14 2013 -0500 - - Darwin/aarch64: Use Clang cache invalidation builtin - -commit 9fa7998d5f9250908cbf12a671479852ebadf9d1 -Author: Zachary Waldowski -Date: Sat Nov 30 02:07:48 2013 -0500 - - Darwin/aarch64: Inhibit Xcode warning - -commit 0e832048a93830575b0976406444e134e649a4f7 -Author: Zachary Waldowski -Date: Sat Nov 30 02:07:34 2013 -0500 - - Darwin/aarch64: double == long double - -commit 602dc22d76931092610234cf063f9f1b8dbc1a51 -Author: Zachary Waldowski -Date: Sat Nov 30 02:06:00 2013 -0500 - - Darwin/iOS prep script: try and compile for arm64 - -commit b513dfe79de4725e8a717325a9e3b5b9f69f63dc -Author: Zachary Waldowski -Date: Sat Nov 30 02:05:22 2013 -0500 - - Darwin/aarch64: Restrict .size to ELF like arm32. - -commit bc978099bf2812de755c076b67ef9c2547607572 -Author: Zachary Waldowski -Date: Sat Nov 30 02:04:57 2013 -0500 - - Darwin/aarch64: Potentially(?) fix compile error - -commit d6bb9314467c6e0683156559d23ca341c43fa3c8 -Author: Zachary Waldowski -Date: Sat Nov 30 02:04:22 2013 -0500 - - Darwin/aarch64: Use CNAME refs - -commit 33c46ce5680eea28d3437c8771ec1d137e226b45 -Author: Zachary Waldowski -Date: Sat Nov 30 04:13:42 2013 -0500 - - Darwin/Mac: Fix 64/32 shortening warnings - -commit 0612081e6c161d9d820742f995975d35da2adbc2 -Author: Zachary Waldowski -Date: Sat Nov 30 03:03:00 2013 -0500 - - Darwin: Misc size_t warnings - -commit 6a6247d179ec3859311c2d8775841b884f309f66 -Author: Zachary Waldowski -Date: Sat Nov 30 02:55:48 2013 -0500 - - Darwin: Fix dlmalloc warnings due to sizeof(size_t) - -commit 4d60d9e1e32de6166ffd63bbe9ce54cf961c78fc -Author: Zachary Waldowski -Date: Sat Nov 30 04:09:30 2013 -0500 - - Darwin: Rebuild Xcode project - -commit cb719a5c1c2eb391d6a5f5e02484ba4aa990a51b -Author: Zachary Waldowski -Date: Sat Nov 30 04:09:18 2013 -0500 - - Darwin/iOS: Fix LLVM 3.3 warning re: memcpy. - -commit 21bde92c9abb378f9c456a9d95e6f9b99ef8c920 -Author: Zachary Waldowski -Date: Sat Nov 30 03:43:42 2013 -0500 - - Darwin: Clean up, modernize generator scripts - -commit fd54eab74cef7891e4acaaafb71e783142ecb69e -Author: Zachary Waldowski -Date: Sat Nov 30 03:38:02 2013 -0500 - - Darwin/Mac: Also exclude OS X generated source - -commit 953b6f14c655141f9e7d82550a312c3eeb961091 -Author: Zachary Waldowski -Date: Tue Apr 24 11:16:20 2012 -0400 - - Darwin/iOS: More unified syntax support w/ Clang. - - Signed-off-by: Zachary Waldowski - -commit c713a55379481c339877f2e0003d97cb8d9ed80e -Author: Zachary Waldowski -Date: Tue Apr 24 10:25:29 2012 -0400 - - Darwin/iOS: Simplify RETLDM arguments for LLVM 3.1 - - Signed-off-by: Zachary Waldowski - -commit 16ba1b80028db5cb71cf86e5f79f5e48317f83c8 -Author: Zachary Waldowski -Date: Wed Apr 11 23:26:04 2012 -0400 - - Darwin: Silence Clang warnings. - -commit 852ac3bd302d6ed97b1ef65f4cbed69c258a48df -Merge: ab79d6e ac75368 -Author: Anthony Green -Date: Thu Nov 21 21:25:44 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - - Conflicts: - ChangeLog - -commit ab79d6e21992dd86139ba07530ff888833b78a04 -Author: Alan Modra -Date: Thu Nov 21 06:12:35 2013 -0500 - - This separates the 32-bit sysv/linux/bsd code from the 64-bit linux - code, and makes it possible to link code compiled with different - options to those used to compile libffi. For example, a - -mlong-double-128 libffi can be used with -mlong-double-64 code. - - Using the return value area as a place to pass parameters wasn't such - a good idea, causing a failure of cls_ulonglong.c. I didn't see this - when running the mainline gcc libffi testsuite because that version of - the test is inferior to the upstreamm libffi test. - - Using NUM_FPR_ARG_REGISTERS rather than NUM_FPR_ARG_REGISTERS64 meant - that a parameter save area could be allocated before it was strictly - necessary. Wrong but harmless. Found when splitting apart ffi.c - into 32-bit and 64-bit support. - -commit ac7536889334d4be50709006d7e23536364d7891 -Author: Alan Modra -Date: Thu Nov 21 06:12:35 2013 -0500 - - This separates the 32-bit sysv/linux/bsd code from the 64-bit linux - code, and makes it possible to link code compiled with different - options to those used to compile libffi. For example, a - -mlong-double-128 libffi can be used with -mlong-double-64 code. - - Using the return value area as a place to pass parameters wasn't such - a good idea, causing a failure of cls_ulonglong.c. I didn't see this - when running the mainline gcc libffi testsuite because that version of - the test is inferior to the upstreamm libffi test. - - Using NUM_FPR_ARG_REGISTERS rather than NUM_FPR_ARG_REGISTERS64 meant - that a parameter save area could be allocated before it was strictly - necessary. Wrong but harmless. Found when splitting apart ffi.c - into 32-bit and 64-bit support. - -commit 69df91cfb4fa6bcb644350a80bff970f27478a6a -Merge: 2f45082 aa1f62c -Author: Anthony Green -Date: Mon Nov 18 06:34:04 2013 -0800 - - Merge pull request #59 from iains/powerpc-darwin-unwind-fix - - Fix PowerPC Darwin FDE encodings to use pcrel correctly. Modernise the picbase labels. - -commit aa1f62c0a093c30325dff1d4d2b6b4b22eb96929 -Author: Iain Sandoe -Date: Mon Nov 18 13:11:56 2013 +0000 - - Fix PowerPC Darwin FDE encodings to use pcrel correctly. Modernise the picbase labels. - -commit 2f450822a8698ba88441c56d152c7dc8924b127f -Author: Anthony Green -Date: Mon Nov 18 06:52:29 2013 -0500 - - Clean up code to appease modern GCC compiler. - -commit 16d56c51aded374730920a4acde76ff3d2860ae1 -Author: Alan Modra -Date: Mon Nov 18 06:36:03 2013 -0500 - - An #endif in the wrong place would cause compile failure on powerpcle. - Using bl instead of b doesn't cause runtime failures as you might think, - but does mess the processor branch prediction. - -commit 34f878a5ef28663f6b1d7fd26fb099429ea1579e -Merge: 83f65b6 1fd0457 -Author: Anthony Green -Date: Sat Nov 16 06:57:54 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - - Conflicts: - ChangeLog - src/powerpc/ffi.c - -commit 83f65b63d9764a9cc7688fc5cda5ee2bd23faf54 -Author: Alan Modra -Date: Sat Nov 16 06:53:50 2013 -0500 - - Finally, this adds _CALL_ELF == 2 support. ELFv1 objects can't be - linked with ELFv2 objects, so this is one case where preprocessor - tests in ffi.c are fine. Also, there is no need to define a new - FFI_ELFv2 or somesuch value in enum ffi_abi. FFI_LINUX64 will happily - serve both ABIs. - -commit 1fd045784cac874b5d76b7fa931f67209a8280d3 -Author: Alan Modra -Date: Sat Nov 16 06:53:50 2013 -0500 - - Finally, this adds _CALL_ELF == 2 support. ELFv1 objects can't be - linked with ELFv2 objects, so this is one case where preprocessor - tests in ffi.c are fine. Also, there is no need to define a new - FFI_ELFv2 or somesuch value in enum ffi_abi. FFI_LINUX64 will happily - serve both ABIs. - -commit 362851379a49ce07d3e36e82c4e5c7b6cc16a352 -Author: Alan Modra -Date: Sat Nov 16 06:52:43 2013 -0500 - - Andreas' 2013-02-08 change reverted some breakage for struct return - values from 2011-11-12, but in so doing reintroduced string - instructions to sysv.S that are not supported on all powerpc variants. - This patch properly copies the bounce buffer to destination in C code - rather than in asm. - - I have tested this on powerpc64-linux, powerpc-linux and - powerpc-freebsd. Well, the last on powerpc-linux by lying to - configure with - - CC="gcc -m32 -msvr4-struct-return -mlong-double-64" \ - CXX="g++ -m32 -msvr4-struct-return -mlong-double-64" \ - /src/libffi-current/configure --build=powerpc-freebsd - - and then - - make && make CC="gcc -m32" CXX="g++ -m32" \ - RUNTESTFLAGS=--target_board=unix/-m32/-msvr4-struct-return/-mlong-double-64\ - check - -commit 1c06515d927d9de1582438d4eb5953890e79c5c7 -Author: Alan Modra -Date: Sat Nov 16 06:41:36 2013 -0500 - - The powerpc64 ABIs align structs passed by value, a fact ignored by - gcc for quite some time. Since gcc now does the correct alignment, - libffi needs to follow suit. This ought to be made selectable via - a new abi value, and the #ifdefs removed from ffi.c along with many - other #ifdefs present there and in assembly. I'll do that with a - followup patch sometime. - - This is a revised version of - https://sourceware.org/ml/libffi-discuss/2013/msg00162.html - -commit a97cf1fae575d8bfd5259c5c422025ad43911326 -Author: Alan Modra -Date: Sat Nov 16 06:40:13 2013 -0500 - - This patch prepares for ELFv2, where sizes of these areas change. It - also makes some minor changes to improve code efficiency. - -commit 164283f4ac5972ce2ab5e015cc2ab1014c23276c -Author: Alan Modra -Date: Sat Nov 16 06:38:55 2013 -0500 - - The powerpc64 support opted to pass floating point values both in the - fpr area and the parameter save area, necessary when the backend - doesn't know if a function argument corresponds to the ellipsis - arguments of a variadic function. This patch adds powerpc support for - variadic functions, and changes the code to only pass fp in the ABI - mandated area. ELFv2 needs this change since the parameter save area - may not exist there. - - This also fixes two faulty tests that used a non-variadic function - cast to call a variadic function, and spuriously reasoned that this is - somehow necessary for static functions.. - -commit 31257b3189f81a199bc2902c22bc5f2d7c54ccde -Author: Andrew Haley -Date: Sat Nov 16 06:35:51 2013 -0500 - - Fix sample closure code - -commit db0ace3a38496af73eae3df02ef353736d16909f -Author: Andrew Haley -Date: Sat Nov 16 06:29:25 2013 -0500 - - Fix broken test cases - -commit de10f5039ed7a53382ddcc95c368d03e535edb98 -Merge: 58c2577 f3657da -Author: Anthony Green -Date: Thu Nov 14 10:56:29 2013 -0500 - - Merge branch 'master' of https://github.com/bivab/libffi - - Conflicts: - ChangeLog - -commit f3657da278dd63afcdd8762894a9bdaea8ef028a -Author: David Schneider -Date: Thu Nov 14 13:02:16 2013 +0100 - - update Changelog - -commit 58c2577a3ff80e7416ef0434769e2af23365719c -Author: Alan Modra -Date: Wed Nov 13 16:55:36 2013 -0500 - - This enshrines the current testsuite practice of using ffi_arg for - returned values. It would be reasonable and logical to use the actual - return argument type as passed to ffi_prep_cif, but this would mean - changing a large number of tests that use ffi_arg and all backends - that write results to an ffi_arg. - -commit 8af42f9944f7ed72c81ae360aac6a84dc11f89dc -Author: Anthony Green -Date: Wed Nov 13 16:40:28 2013 -0500 - - Respect HAVE_ALLOCA_H - -commit cdf405d574f479b782454516366bd4f4b9b3415e -Author: David Schneider -Date: Wed Nov 13 15:50:21 2013 +0100 - - add a testcase for the double/float issue on ARMHF - -commit 77f823e31ffb557a466b24f7fba845fbf7831798 -Author: David Schneider -Date: Wed Nov 13 14:26:57 2013 +0100 - - stop trying to assing vfp regs once we are done with the registers - -commit 37067ec5036f2a6ed7a4799f83f8f53160460344 -Author: David Schneider -Date: Tue Nov 12 19:49:01 2013 +0100 - - mark all vfp registers as used when done. - - To avoid assigning registers the would fit, once arguments have been on - the stack, we mark all registers as used once we do not find a free - register for the first time. - -commit 2f5b7ce545473a7f6e41193edc29407cbebe82d5 -Author: Anthony Green -Date: Sat Nov 9 06:16:32 2013 -0500 - - UltraSPARC IIi fix. Update README and build configury. - -commit becd754434173032f426d22ffcbfe24f55b3c137 -Author: Mark Kettenis -Date: Wed Nov 6 06:43:49 2013 -0500 - - Align the stack pointer to 16-bytes. - -commit 05c31093409f7b3e6d795fac21d2c954313d8162 -Author: Konstantin Belousov -Date: Wed Nov 6 06:40:58 2013 -0500 - - Mark executable as not requiring executable stack. - -commit cf6bf9818e8394cfcdb07a40c6a5e2ee6b01d333 -Author: Anthony Green -Date: Sat Nov 2 17:23:59 2013 -0400 - - Fix up docs - -commit 02177176854d16fc0f1a5958aa34da2f306630ee -Merge: c242217 c265b4c -Author: Anthony Green -Date: Sat Nov 2 17:11:22 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit c2422174b3edc0de0b148dfd6b67087bb881c4a6 -Merge: f4b843f d918d47 -Author: Anthony Green -Date: Sat Nov 2 14:08:23 2013 -0700 - - Merge pull request #45 from foss-for-synopsys-dwc-arc-processors/arc_support - - arc: Fix build error - -commit c265b4cacb9130f042699a85de9c7242b3f49cc3 -Merge: f4b843f d918d47 -Author: Anthony Green -Date: Sat Nov 2 14:08:23 2013 -0700 - - Merge pull request #45 from foss-for-synopsys-dwc-arc-processors/arc_support - - arc: Fix build error - -commit f4b843f83710ac378c48abd87fe66bb519d30d2e -Author: Anthony Green -Date: Sat Nov 2 17:01:15 2013 -0400 - - Don't align stack for win32 - -commit f3cd39345713db8e414cf642b6cb65a4cfe6018c -Merge: 666f3e7 6aa1590 -Author: Anthony Green -Date: Sat Nov 2 13:17:57 2013 -0700 - - Merge pull request #51 from vbudovski/for_upstream - - Don't use 16 byte aligned stack for WIN32 - -commit 666f3e71b56d92c49fcd2d7f349b8f8ebca0f8a3 -Author: Anthony Green -Date: Sat Oct 26 09:12:42 2013 -0400 - - Add more credits to README. Tidy up. - -commit 73ada14e756bad97fad0e6915a821a3c7e079f81 -Author: Anthony Green -Date: Sat Oct 26 09:09:45 2013 -0400 - - Update README - -commit d3372c54ce7117e80d389ba875dc5b6b2213c71e -Author: Mark H Weaver -Date: Sat Oct 26 08:30:06 2013 -0400 - - Fix N32 ABI issue for MIPS. - -commit d6716aba8118eb0513885cfe557bedebb7016e8b -Author: Anthony Green -Date: Tue Oct 15 15:42:49 2013 -0400 - - Update travis-ci build dependencies to include texinfo - -commit 16b93a211bcfbe4bd0efdcf94de225a71aa0ee02 -Author: Sandra Loosemore -Date: Tue Oct 15 15:33:59 2013 -0400 - - Add nios2 port. - -commit 2f5626ce02fce8267ab48ceb6d7d0ed7d672a75e -Author: Sandra Loosemore -Date: Tue Oct 15 15:32:16 2013 -0400 - - Fix testsuite bug - -commit f64e4a865557e440774436b4c2b2fd7374290e97 -Author: Marcus Shawcroft -Date: Tue Oct 15 15:20:14 2013 -0400 - - Fix many.c testcase for Aarch64 - -commit 128cd1d2f358f26d9fa75a27cf2b30356f5dd903 -Author: Anthony Green -Date: Tue Oct 8 06:45:51 2013 -0400 - - Fix spelling errors - -commit ff06269d707cafbfef2a88afb07a79c9d1480c5f -Author: Anthony Green -Date: Tue Oct 8 06:32:18 2013 -0400 - - Update README for M88K and VAX - -commit d2fcbcdfbea750d1f6a9f493e2e6c4d5ffa71b34 -Author: Anthony Green -Date: Tue Oct 8 06:27:46 2013 -0400 - - Add m88k and VAX support. Update some configury bits. - -commit 6aa15900accc0a648cdebf11ec11d11697ebfffd -Author: Vitaly Budovski -Date: Thu Sep 5 12:05:06 2013 +1000 - - Don't use 16 byte aligned stack for WIN32 - - This fixes a crash when accessing __stdcall functions in Python ctypes. - -commit 3b44d41156149af8da2a58825fefdfa23274ae7a -Author: Makoto Kato -Date: Wed Jul 10 15:34:53 2013 +0900 - - Fix build failure when using clang for Android - - clang for Android generates __gnu_linux__ define, but gcc for Android doesn't. So we should add check it for Android - -commit d918d47809c174d62283306b282749f8db93661f -Author: Mischa Jonker -Date: Mon Jul 8 15:51:36 2013 +0200 - - arc: Fix build error - - One part of the patch for ARC support was missing in the upstreamed - version. - - Signed-off-by: Mischa Jonker - -commit d3d099b40c122550279789200263346f120f6909 -Author: Anthony Green -Date: Tue Jul 2 16:11:38 2013 -0400 - - little-endian ppc64 support - -commit 0f8690a84c874ec09a090c8c6adfb93c594acac6 -Author: Anthony Green -Date: Tue Jul 2 15:54:40 2013 -0400 - - Rebuild for ARC additions - -commit f88118b345f27c46f5445d6e4832c498ff9a6d85 -Author: Anthony Green -Date: Tue Jul 2 15:51:27 2013 -0400 - - Revert "Merge pull request #36 from abergmeier/emscripten_fix" - - This reverts commit 6a4d901dde7b3f87984c563505717cde3113d16e, reversing - changes made to b50a13b9c07ec09af4b9697e482acdad571e6961. - -commit 6a4d901dde7b3f87984c563505717cde3113d16e -Merge: b50a13b 587002c -Author: Anthony Green -Date: Tue Jul 2 12:12:34 2013 -0700 - - Merge pull request #36 from abergmeier/emscripten_fix - - Fixes for building with Emscripten - -commit b50a13b9c07ec09af4b9697e482acdad571e6961 -Merge: 767f1f9 b082e15 -Author: Anthony Green -Date: Tue Jul 2 12:10:26 2013 -0700 - - Merge pull request #44 from foss-for-synopsys-dwc-arc-processors/arc_support - - Add ARC support - -commit 767f1f96e5282da44d7340e6815e9820a3f78e39 -Merge: c3c40e0 b8a91d8 -Author: Anthony Green -Date: Tue Jul 2 12:08:04 2013 -0700 - - Merge pull request #43 from JensTimmerman/__m128 - - added include for xmmintrin.h - -commit b8a91d81be77d479327fdb6bdd9fdae6d18e6e63 -Author: Jens Timmerman -Date: Tue Jul 2 10:57:37 2013 +0200 - - added include for xmmintrin.h - -commit b082e15091961373c03d10ed0251f619ebb6ed76 -Author: Mischa Jonker -Date: Mon Jun 10 16:19:33 2013 +0200 - - Add ARC support - - This adds support for the ARC architecture to libffi. DesignWare ARC - is a family of processors from Synopsys, Inc. - - This patch has been tested on a little-endian system and passes - the testsuite. - - Signed-off-by: Mischa Jonker - -commit cc9b518687e46b0d1acafdd4bc3f3b281c25a3d9 -Author: Marcin Wojdyr -Date: Tue May 14 15:01:23 2013 +0200 - - Update libffi.pc.in - - use -L${toolexeclibdir} instead of -L${libdir} - to be consistent with Makefile.am - -commit 587002c092cffe6e7a8d7028f246c241d03b738c -Author: Andreas Bergmeier -Date: Fri Apr 19 17:12:24 2013 +0200 - - Enable disabling of libtool on platforms where it does not work (e.g. LLVM). - Build libraries normally then. - -commit c3c40e0290377d7cf948b072eedd8317c4bf215e -Merge: ede96e4 4750e3c -Author: Anthony Green -Date: Sat Mar 30 05:24:14 2013 -0700 - - Merge pull request #34 from davidsch/armhf - - Fix ARM hard-float support for large numbers of VFP arguments - -commit 4750e3c662fd9569cb3e2d28f539685fd1ca8caf -Author: David Schneider -Date: Thu Mar 28 16:56:36 2013 +0100 - - update changelog - -commit 9708e7cf09f1bf815f4d6485eb1f180fabb35804 -Author: David Schneider -Date: Wed Mar 27 19:31:04 2013 +0100 - - folow the ARM hard-float ABI in ffi_prep_incoming_args_VFP - -commit b41120981e5e49ca2da10b94b154775f50da5f36 -Author: David Schneider -Date: Wed Mar 27 16:38:35 2013 +0100 - - create separated versions of ffi_prep_incoming_args_* for SYSV and VFP ABIs. - - The different versions will be called depending on the value of cif->abi - -commit dd26f1f39c54861c5b91931f0f37a72942c2a072 -Author: David Schneider -Date: Thu Mar 28 15:39:01 2013 +0100 - - add a failing test for closures on ARM hardfloat - -commit 3c1608613ab3c2184222b98c5482cddedd6b559b -Author: David Schneider -Date: Tue Mar 26 19:24:47 2013 +0100 - - extend ffi_prepare_args for FFI_VFP (hard-float ABI), fixing an issue with passing VFP arguments in VFP registers and the stack, while at the same time not using all core registers. - -commit 0f2ff2d4c92719be8936179f9ab674f4d1a3fd14 -Author: David Schneider -Date: Tue Mar 26 19:22:02 2013 +0100 - - separate ARM ffi_prepare_args in a version implementing the simple SYSV calling convention and one for the hard-float calling convention - -commit 3a352b8a8252400a83de22c7c424bf1887b4a2ef -Author: David Schneider -Date: Tue Mar 26 14:24:04 2013 +0100 - - move the hardfloat specific argument copying code to the helper function - -commit 5df6b7944a4225b6eb329f3886be64e04e966f29 -Author: David Schneider -Date: Tue Mar 26 14:02:21 2013 +0100 - - extract setting of arguments to be passed to a helper function - -commit 7d1048c471bb4b1f9d67a9e9f8e95f9a1d2e6d45 -Author: David Schneider -Date: Tue Mar 26 11:33:33 2013 +0100 - - extract code to align the argument storage pointer to a helper function - -commit b9f013788f0f384c423ad963475aaacb55598135 -Author: David Schneider -Date: Mon Mar 25 13:27:36 2013 +0100 - - add a testcase, that on ARM hardfloat needs more than the 8 VFP argument registers to pass arguments to a call - -commit 2fbdb0f231cafdb77b025d3cd8afe90cda99b3ba -Author: David Schneider -Date: Mon Mar 25 13:26:02 2013 +0100 - - use the absolute value to check the test result against an epsilon - -commit ede96e4eb660bbf3e0fe048135efa8106f48af5d -Merge: f22ab3c 9e34992 -Author: Anthony Green -Date: Sun Mar 17 18:38:21 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit f22ab3c6877cbdd07f058b68816b0086b1cb0e1e -Merge: 12b1886 d08124b -Author: Anthony Green -Date: Sun Mar 17 18:34:54 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 9e34992a5ea2fda1dba5875bf96dc91a7230f51f -Merge: 12b1886 d08124b -Author: Anthony Green -Date: Sun Mar 17 18:34:54 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 12b1886d7b1f8aa264b1d348bfa47a0e14712df4 -Author: Anthony Green -Date: Sun Mar 17 18:32:12 2013 -0400 - - cygwin fix & updates for 3.0.13 - -commit d08124bedf2c6d61874fe215404783aeb9f6f1ac -Author: Anthony Green -Date: Sun Mar 17 18:32:12 2013 -0400 - - cygwin fix & updates for 3.0.13 - -commit cb32c812d04d1dfa72002cc04924e7e4fef89e02 -Author: Anthony Green -Date: Sun Mar 17 09:27:55 2013 -0400 - - Fix lib install dir - -commit efd7866a361a6f636bae8400d26c6811e56ca207 -Author: Anthony Green -Date: Sat Mar 16 08:35:57 2013 -0400 - - 2.0.13rc1 - -commit ff647ad4dff2f07dd153f295a1f70b1d906cd6ca -Merge: 4acf005 d9dd417 -Author: Anthony Green -Date: Sat Mar 16 08:20:40 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - - Conflicts: - ChangeLog - -commit 4acf0056f55c757490dae6c29a65b0321327ea8a -Author: Anthony Green -Date: Sat Mar 16 08:18:45 2013 -0400 - - Build fix for soft-float power targets - -commit 675c9839224e4268187f1ec6f512127f9db555d0 -Author: Anthony Green -Date: Sat Mar 16 08:12:38 2013 -0400 - - Documentation fix - -commit 8a286f570ccd41db81f74ea7f248da62241d898a -Author: Anthony Green -Date: Sat Mar 16 08:01:19 2013 -0400 - - Fix for m68000 systems - -commit d9dd417b09566af55b7b3000bb53ccaf2e1d6c92 -Author: Anthony Green -Date: Sat Mar 16 08:01:19 2013 -0400 - - Fix for m68000 systems - -commit 215763d012a944d95406b394d6013b80d220e870 -Author: Anthony Green -Date: Sat Mar 16 07:57:35 2013 -0400 - - Update configury. - -commit 9180d8f39c9b6afe17b78277c2711a5d9948e824 -Merge: 2fb527a 7e1b326 -Author: Anthony Green -Date: Sat Mar 16 07:46:55 2013 -0400 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 2fb527a017a4943e176a489ff103231b86464b59 -Author: Anthony Green -Date: Sat Mar 16 07:46:38 2013 -0400 - - Add Meta processor support - -commit 211a9ebf4d1a9801e15e103566aed2b8c42790be -Merge: f308faf ee18766 -Author: Anthony Green -Date: Sat Mar 16 04:24:40 2013 -0700 - - Merge pull request #32 from alex/patch-1 - - Fix for a crasher due to misaligned stack on x86-32. - -commit 7e1b32649efd24814e86172e196f390566f9e970 -Merge: f308faf ee18766 -Author: Anthony Green -Date: Sat Mar 16 04:24:40 2013 -0700 - - Merge pull request #32 from alex/patch-1 - - Fix for a crasher due to misaligned stack on x86-32. - -commit ee18766b169811426c14b011fbb46d81e344f926 -Author: Alex Gaynor -Date: Thu Mar 14 15:00:33 2013 -0700 - - Fix for a crasher due to misaligned stack on x86-32. - - Full information on reproduction (using Python's ctypes available here: http://bugs.python.org/issue17423) - -commit f308faf1eabaf8dc24966ab17fbf94368f46b9c7 -Author: Anthony Green -Date: Mon Feb 11 14:25:13 2013 -0500 - - Add moxie support. Release 3.0.12. - -commit 4ea22e54e3b143fe05c413f6dddd236af6bcbfb2 -Author: Anthony Green -Date: Sun Feb 10 08:48:38 2013 -0500 - - Update README - -commit 10e77227b6ae85f46f28590bfb09ca3608554358 -Author: Anthony Green -Date: Sun Feb 10 08:47:26 2013 -0500 - - mend - -commit a9521411a53d58f2bf88199242200ceb0d4dae3a -Author: Anthony Green -Date: Sat Feb 9 06:54:40 2013 -0500 - - sparc v8 and testsuite fixes - -commit 70b11b47eea93bf43627588d494d0b3b0d062481 -Author: Anthony Green -Date: Fri Feb 8 16:12:19 2013 -0500 - - Fix small struct passing on ppc - -commit 63ba1fa79f7c4ce42de848debe233aab31aecb51 -Author: Anthony Green -Date: Fri Feb 8 15:18:19 2013 -0500 - - Remove xfail for arm*-*-*. - -commit 24fbca4c1d57d4ea628c0a8ba643684daf54a37e -Author: Anthony Green -Date: Fri Feb 8 14:19:56 2013 -0500 - - Fix typo - -commit b0fa11cb0a94ce6baca058eab9b10e40475e71d6 -Author: Anthony Green -Date: Fri Feb 8 14:17:13 2013 -0500 - - More man page cleanup - -commit 8bd15d139a58a6e46dc90a1cb2d89f59f32f06c7 -Author: Anthony Green -Date: Fri Feb 8 13:56:37 2013 -0500 - - Fix many.c testcase for ppc - -commit 7aab825cf198be85490d3cd80e778d415d85ad9b -Author: Anthony Green -Date: Fri Feb 8 13:26:21 2013 -0500 - - Add missing files to dist - -commit cb03ea8f4eb08024e44abe4392edc77b89fbfbad -Author: Anthony Green -Date: Fri Feb 8 12:25:18 2013 -0500 - - sparc v9 fixes for sun tools - -commit 35ee8d44f31dd3d3b88083c837dc351593e13cc2 -Author: Anthony Green -Date: Fri Feb 8 07:12:41 2013 -0500 - - Fix microblaze big-endian struct issue - -commit 9db7e1a958fc484ba149efe027008b9a170395fb -Author: Anthony Green -Date: Thu Feb 7 21:06:08 2013 -0500 - - Fix botched sparc patch. Update version. - -commit ce0138e61455f268af326e26908b9680ec2c4bea -Author: Anthony Green -Date: Thu Feb 7 18:04:01 2013 -0500 - - Update bug report address. rc2. - -commit fd07c9e40451e0ec1d0475cd54a83d45ccaea2c0 -Author: Anthony Green -Date: Thu Feb 7 18:00:36 2013 -0500 - - Add cache flushing routine for sun compiler on sparc solaris 2.8 - -commit ed6ae9501b2bab45daf93b4935eb0c977635b763 -Author: Anthony Green -Date: Thu Feb 7 16:43:36 2013 -0500 - - Add libtool-ldflags. Define toolexeclibdir for non-GCC builds. - -commit ffef2e046aaec853be356f0b8770a335185ea9cf -Author: Anthony Green -Date: Thu Feb 7 15:47:01 2013 -0500 - - x32 and libtool fixes - -commit 95eecebb2858dc6f1495a61072ff36d0a8127144 -Author: Anthony Green -Date: Thu Feb 7 15:32:46 2013 -0500 - - Remove a.out cruft from dist - -commit 176aa9d2e23d9cd57d6f250692d910b408f9a651 -Author: Anthony Green -Date: Thu Feb 7 15:29:22 2013 -0500 - - Fix GCC usage test and update README - -commit f3a4f3fdde89b04d66983a42a25d09161c5d4d54 -Author: Anthony Green -Date: Thu Feb 7 09:57:20 2013 -0500 - - Fixes for AIX xlc compiler. - -commit 522f8fef49848927482bc63c94afaea5b84e5ec1 -Author: Anthony Green -Date: Wed Feb 6 20:31:31 2013 -0500 - - Fix man page. Clean out junk. - -commit c4dfa259eb4e8e6f4c397868d7fee80aa0bb6a12 -Author: Anthony Green -Date: Wed Feb 6 17:43:24 2013 -0500 - - Bump soversion - -commit f62bd63fe6123cadedb8b2b2c72eb549c40fbce9 -Author: Anthony Green -Date: Wed Feb 6 17:38:32 2013 -0500 - - Release candidate 1 - -commit f7cd61e9e68a4a51147df04d75bfe5b91b9d9286 -Author: Anthony Green -Date: Wed Feb 6 17:38:04 2013 -0500 - - Fix pkgconfig install bits - -commit 6a790129427121f7db2d876e7218a3104e6d2741 -Author: Anthony Green -Date: Wed Feb 6 17:37:15 2013 -0500 - - Work around LLVM ABI problem on x86-64 - -commit 370112938e705128fd5dd4017fc1a1210bd0271a -Merge: bada2e3 bcc0c28 -Author: Anthony Green -Date: Sun Jan 27 05:09:04 2013 -0800 - - Merge pull request #28 from jralls/master - - Reorder x86_64 checks - -commit bcc0c28001b6d427d5cd8037d2e3c892babc6b4c -Author: John Ralls -Date: Sat Jan 26 15:21:14 2013 -0800 - - Reorder x86_64 tests - - So that darwin and cygwin/mingw are tested before the generic check -- - which allows them to actually be set. - -commit bada2e326d9a9acf3ae40cfa4f5d7a9ba97b2ea8 -Author: Anthony Green -Date: Mon Jan 21 08:02:07 2013 -0500 - - Update README - -commit 655bb8f3690feba8e840a5f1854b1d78ed08f692 -Merge: 1035ffb 840f975 -Author: Anthony Green -Date: Mon Jan 21 08:01:24 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit 1035ffb2f468e1a1c401d58cff7e7abb69838e68 -Merge: aeb8719 4086024 -Author: Anthony Green -Date: Mon Jan 21 07:55:53 2013 -0500 - - Update README - -commit 840f975866052fdd91b2c224d56e01ae5900b60d -Merge: aeb8719 4086024 -Author: Anthony Green -Date: Mon Jan 21 07:55:53 2013 -0500 - - Merge branch 'master' of github.com:/atgreen/libffi - -commit aeb8719a34756969970603fca4568530d56708af -Author: Anthony Green -Date: Mon Jan 21 07:37:30 2013 -0500 - - New microblaze support - -commit 40860245a4fd91a1b88adc9171ec993c549e45d5 -Author: Anthony Green -Date: Mon Jan 21 07:37:30 2013 -0500 - - New microblaze support - -commit 20cae32b152b43679ae65a85db9a1c6bb8a143dd -Author: Anthony Green -Date: Mon Jan 21 07:07:38 2013 -0500 - - Xtensa support - -commit 9742f91782faef4a15941508a22c408fb7d1d227 -Author: Anthony Green -Date: Mon Jan 21 07:03:41 2013 -0500 - - Mention IBM XL compiler support on AIX. - -commit f03eab08248f122ce3b623a18df9e19fae1b6e98 -Author: Anthony Green -Date: Fri Jan 11 17:14:11 2013 -0500 - - Remove obsolete inline test functions - -commit 05fbe1faedc7b2580d5f14010d00e9e3cee73951 -Author: Anthony Green -Date: Fri Jan 11 16:54:40 2013 -0500 - - xlc compiler support - -commit 0b4986a7889ed1864674192228f1162c1b5770a8 -Author: Anthony Green -Date: Fri Jan 11 11:19:52 2013 -0500 - - [travis] install dejagnu with sudo - -commit 3c337eef51ab9a4993fc875bfa26289dd6a08881 -Author: Anthony Green -Date: Fri Jan 11 11:18:14 2013 -0500 - - [travis] install dejagnu - -commit 90720962ce1baf9fc35d1bde1738102bcd5bd5ed -Author: Anthony Green -Date: Fri Jan 11 10:57:30 2013 -0500 - - Add first travis config file - -commit bff052d9cd5be41ba9e47c76114054af487d3c30 -Author: Anthony Green -Date: Fri Jan 11 10:24:32 2013 -0500 - - 32-bit x86 fix and more - -commit cd41aeab6176f839167955c016ecc19f65f75df3 -Author: Anthony Green -Date: Thu Jan 10 17:25:45 2013 -0500 - - Add compiler column to table - -commit 8bf987d4df7c4d21435b9211f6cc86abf5904b42 -Author: Anthony Green -Date: Thu Jan 10 17:24:51 2013 -0500 - - Fix for sunpro compiler on Solaris - -commit 3ee74fd6dc8ccd32b608bbff73526838fc34f70b -Author: Anthony Green -Date: Thu Jan 10 17:15:03 2013 -0500 - - Update documentation version. - -commit 13e2d7b92557a9511a0414df82bf2df3edc55cba -Author: Anthony Green -Date: Thu Jan 10 10:52:02 2013 -0500 - - Handle both 32 and 64-bit x86 builds regardless of target triple - -commit 5141543000fc86a3d49a907a2313713ee79e504d -Author: Anthony Green -Date: Thu Jan 10 07:35:53 2013 -0500 - - Don't run EH tests with non-GNU compiler - -commit 56ba8d86f47937a0afb81a2b9e77c9d235d9db45 -Author: Anthony Green -Date: Thu Jan 10 07:25:10 2013 -0500 - - Don't use warning checking macro with sun compiler - -commit 6a028caec1b2c7904feb4c4f9cb7e1125e1d1b60 -Author: Anthony Green -Date: Thu Jan 10 01:19:43 2013 -0500 - - Don't use GCCisms to define types when - + building with the SUNPRO compiler. - -commit 2d9b3939751b3ef9739049509d353ade10b32a8f -Author: Anthony Green -Date: Wed Jan 9 21:14:54 2013 -0500 - - Fix for closures with sunpro compiler - -commit 8308984e479e3274a36e98e8272b5adbb6b774c2 -Author: Anthony Green -Date: Tue Jan 8 15:14:21 2013 -0500 - - Make sure we're running dejagnu tests with the right compiler. - -commit f26c7ca67147450db2fe25ea932944e6cf145d5c -Author: Anthony Green -Date: Tue Jan 8 14:47:05 2013 -0500 - - Make compiler options in dejagnu runs compiler specific - -commit 74c776e21907fc2e59257c021f23077f8b7966cb -Author: Anthony Green -Date: Tue Jan 8 12:25:54 2013 -0500 - - Switch x86 Solaris to X86 from X86_64 - -commit 8962c8c8d06803e310bac0ffc8e84ea15daeff3f -Author: Anthony Green -Date: Tue Jan 8 12:22:24 2013 -0500 - - Fix read-only eh_frame test - -commit 35ddb69c2b49746d940e919ca226ecc1be94f14a -Author: Anthony Green -Date: Tue Jan 8 07:53:37 2013 -0500 - - Only emit DWARF unwind info when building with GCC - -commit f7879bc3f3a8d0bbfcc38771732c160a58ba9cd8 -Author: Anthony Green -Date: Tue Jan 8 07:30:28 2013 -0500 - - Testsuite fix for Solaris vendor compiler - -commit 67cea90fc0897021466fd102671019d30db474cd -Author: Anthony Green -Date: Mon Jan 7 06:30:24 2013 -0500 - - mend - -commit 0de3277b18cf54be3b81d509b9be9b47d9bc1e82 -Author: Thorsten Glaser -Date: Mon Dec 3 00:02:31 2012 +0000 - - Testsuite fixes (was Re: [PATCH] Fix libffi on m68k-linux-gnu, completely) - - Dixi quod… - - >although I believe some 3.0.11 checks to be broken: - - And indeed, with a few minor changes on top of git master, - I still get a full run of PASS plus one XPASS on amd64-linux! - - With the other patches (from this message’s parent) and - these applied, I get a full PASS on m68k-linux as well. - - So, please git am these three diffs ☺ - - bye, - //mirabilos - -- - FWIW, I'm quite impressed with mksh interactively. I thought it was much - *much* more bare bones. But it turns out it beats the living hell out of - ksh93 in that respect. I'd even consider it for my daily use if I hadn't - wasted half my life on my zsh setup. :-) -- Frank Terbeck in #!/bin/mksh - From 5cb15a3bad1f0fb360520dd48bfc938c821cdcca Mon Sep 17 00:00:00 2001 - From: Thorsten Glaser - Date: Sun, 2 Dec 2012 23:20:56 +0000 - Subject: [PATCH 1/2] Fix tests writing to a closure retval via pointer casts - - As explained in - all other tests that do the same cast to an ffi_arg pointer instead. - - PASS on amd64-linux (Xen domU) and m68k-linux (ARAnyM) - - Signed-off-by: Thorsten Glaser - -commit 8f4772f383abd71cfa141c8a70ba11c1aa4ebe2c -Author: Anthony Green -Date: Mon Jan 7 06:14:53 2013 -0500 - - m68k fixes for signed 8 and 16-bit calls. - -commit ea7f8440d58afbebb181e295ff564fdf3d6590a0 -Author: Anthony Green -Date: Fri Jan 4 09:09:32 2013 -0500 - - remove gcc-ism - -commit f06c0f10377ac04eeba5e632dbe5c62c629df4e6 -Author: Anthony Green -Date: Wed Jan 2 09:39:17 2013 -0500 - - Add missing ChangeLog entry and generated files. - -commit 1f8675d4c101d19d67ca0a55ff2ba973349558ad -Merge: 335f419 f6b58d2 -Author: Anthony Green -Date: Wed Jan 2 06:34:38 2013 -0800 - - Merge pull request #26 from rofl0r/master - - fix build error on ppc when long double == double - -commit 335f419a86090cda9f215d149572f9481c3ad034 -Merge: 53236d5 6d6f711 -Author: Anthony Green -Date: Wed Jan 2 06:30:03 2013 -0800 - - Merge pull request #23 from rurban/master - - cygwin/mingw shared libs need libtool LDFLAGS = -no-undefined - -commit 53236d5061034cc0a7f4647fc1bd05ba1aeb3d2a -Author: Anthony Green -Date: Wed Jan 2 09:24:55 2013 -0500 - - Regenerate files - -commit 72222ca3fbe560e13c8dc89ca441b28b7cc74daf -Author: Anthony Green -Date: Wed Jan 2 09:06:38 2013 -0500 - - Update texinfo.tex - -commit 1e326c95431fc9896422fa36659f3e833852579c -Author: Anthony Green -Date: Wed Jan 2 09:05:02 2013 -0500 - - Update config.guess and config.sub - -commit cb6671f5b8a9596ff968c6b6c304f70adf71b368 -Author: Anthony Green -Date: Wed Jan 2 08:56:07 2013 -0500 - - Missing .gitignore changes for xcode support - -commit ebbe77966855395a2a47ed2c09a38f93eb0481cf -Author: Anthony Green -Date: Wed Jan 2 08:54:05 2013 -0500 - - missed x32 libtool patch. - -commit 4394096da0aca0dd422b479a043c18b4f05c5770 -Author: Anthony Green -Date: Wed Jan 2 08:51:35 2013 -0500 - - missed trampoline_table patch. Move to GCC. - -commit ed7a59c3ff7c84bd95c374a5aff21599f705e6dc -Author: Anthony Green -Date: Wed Jan 2 08:48:01 2013 -0500 - - Windows symbol export fix. Move to GCC. - -commit ccee09a4ff843b11c7d8b6819776f57d187305c7 -Author: Anthony Green -Date: Wed Jan 2 08:41:55 2013 -0500 - - +2012-03-21 Peter Rosin - + - + * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - + (set_ld_library_path_env_vars): Add the library search dir to PATH - + (and save PATH for later). - + (restore_ld_library_path_env_vars): Restore PATH. - -commit 089dbce7cc0889eb26444d89ae062c73c69f26f0 -Author: Anthony Green -Date: Wed Jan 2 08:37:35 2013 -0500 - - med - -commit 980a334c42b4b0eff32e55929ec6727d1326b05d -Author: Anthony Green -Date: Wed Jan 2 07:36:42 2013 -0500 - - Test GCC update - -commit 8bad679ade5000e57cdc9cacde22e8b99840930f -Author: Anthony Green -Date: Wed Jan 2 08:28:35 2013 -0500 - - New stand-alone patch - -commit 981c32ee115e9f0d6546a74592875e138222a9d1 -Author: Anthony Green -Date: Wed Jan 2 07:34:03 2013 -0500 - - Merge with GCC. Eliminate quilt bits. - -commit 61a054929517fb80c437ba71c91f3e20cfff581a -Author: Anthony Green -Date: Wed Nov 28 06:07:41 2012 -0500 - - Refresh config.guess and config.sub - -commit f6b58d2bdc0a24ce94dedce59802f091979df265 -Author: rofl0r -Date: Thu Nov 22 16:26:21 2012 +0100 - - fix build on ppc when long double == double - -commit 69da33a0761aeac73f9e9646269da61c906d6020 -Author: Anthony Green -Date: Mon Nov 12 15:25:47 2012 -0500 - - Pull in config.sub for aarch64 support and more - -commit f680b598b7bdde325ac9349e8c35151c228bf2df -Author: Anthony Green -Date: Tue Nov 6 16:00:40 2012 -0500 - - Add missing aarch64 configury bits - -commit dfadfb19853c57c8623c436d0ef2bdafab24b433 -Author: Anthony Green -Date: Wed Oct 31 06:46:41 2012 -0400 - - Rebase for ppc64 fix - -commit e944b8c7eb1e2eeb9c0f3b9742b4d7f476860ce1 -Author: Anthony Green -Date: Tue Oct 30 14:06:09 2012 -0400 - - Add PaX work-around - -commit 9ccd51be1fdeb99f8b4f42f905166c2abbba8ac0 -Merge: f342996 fa5d747 -Author: Anthony Green -Date: Tue Oct 30 13:37:37 2012 -0400 - - Fix commit conflicts - -commit f342996cb50eb23b868afcff5ac0cdbb6b505d63 -Author: Anthony Green -Date: Tue Oct 30 07:42:27 2012 -0400 - - Darwin12 fix - -commit 58e8b66f70cef2e3c9b0e5a707b45d634cbbf5d9 -Author: Anthony Green -Date: Tue Oct 30 07:07:19 2012 -0400 - - AArch64 port - -commit fa5d747905472571fd472c07d4726017624f66b3 -Author: Anthony Green -Date: Tue Oct 30 07:07:19 2012 -0400 - - AArch64 port - -commit 6993a6686f43f2313b18142c1e96189a27db2aa3 -Author: Anthony Green -Date: Tue Oct 30 06:59:32 2012 -0400 - - Fix autoconf macros - -commit 70084e70ddb13b29dd05c751b1904de206bbe790 -Author: Anthony Green -Date: Fri Oct 12 23:55:06 2012 -0400 - - Update Tile* port info - -commit 9c00a3f6742d61404b31268cc773e7130ff43331 -Author: Anthony Green -Date: Fri Oct 12 16:46:06 2012 -0400 - - TILE-Gx/TILEPro support - -commit 048d2f41c3a6664b4b64bf21e804686662da4160 -Author: Anthony Green -Date: Thu Oct 11 10:55:25 2012 -0400 - - Rebase - -commit 6d6f71108064f5069edd7bf771059d3b82640135 -Author: Reini Urban -Date: Sat Jul 7 12:42:00 2012 -0500 - - cygwin/mingw shared libs need libtool LDFLAGS = -no-undefined - - otherwise only static libs are created. - -commit d330f19292da8f39a78a9e2b0ba08df8094e3bc5 -Author: Nicolas Lelong -Date: Sat May 5 09:37:02 2012 -0400 - - iOS build fixes. - -commit 09b23cfc1d6d15361eee18818851fd3cacb26559 -Author: Anthony Green -Date: Fri Apr 27 08:29:48 2012 -0400 - - Update README with Blackfin/uClinux support - -commit 213ed15c70e72d666154c08e2b41dae3f61f20d3 -Author: Anthony Green -Date: Fri Apr 27 01:34:15 2012 -0400 - - Add blackfin supprt from Alexandre Keunecke. - -commit ff3d76fd427382ce7d2b2ed54acdd0bce470ca4f -Author: Anthony Green -Date: Wed Apr 11 23:16:48 2012 -0400 - - 3.0.11 - -commit 7e0a412c4fd9cbe77b467a9bf86f56aea62632c3 -Author: Anthony Green -Date: Wed Apr 11 22:47:44 2012 -0400 - - Update files to ship - -commit 39e6a5860416f7bad992149817e1da1ba7c460d4 -Author: Zachary Waldowski -Date: Wed Apr 11 22:39:46 2012 -0400 - - More mac/ios build improvements - -commit 853cc722a16f8d1254573ef3bb73c7b8f3d8a110 -Author: Anthony Green -Date: Tue Apr 10 06:33:33 2012 -0400 - - Fix typo for darwin targets - -commit 3f5023068cda07a3dd6dacbaa875a5b5fc96d4bb -Author: Anthony Green -Date: Fri Apr 6 20:34:51 2012 -0400 - - mend - -commit ebb8e8945681ce0af7a5c47a980287e8ece84b84 -Author: Mike Lewis -Date: Fri Apr 6 20:02:08 2012 -0400 - - Build iOS library with xcode - -commit a098b44f4c592c2192fcdef4fad6108eb3f4301c -Author: Anthony Green -Date: Fri Apr 6 17:04:35 2012 -0400 - - Reapply missing testsuite changes for arm - -commit 10d1e51393f08c14045db85843208f44f9f1e9ba -Author: Anthony Green -Date: Fri Apr 6 11:57:14 2012 -0400 - - Update to rc4. Upgrade autoconf version. - -commit 9bcc884276dc0a807b2605e510b11b1740dd9aa2 -Author: Anthony Green -Date: Fri Apr 6 11:53:07 2012 -0400 - - Fix Linux/x32 reference in README - -commit a044a56b1cd2a0924f5ec0d6b5a5089d14fcd1a1 -Author: Anthony Green -Date: Fri Apr 6 10:39:10 2012 -0400 - - Linux/x32 libtool fix - -commit 59bb61a36661b972e8443531d3b7bc736e131a4b -Author: Anthony Green -Date: Fri Apr 6 08:26:14 2012 -0400 - - Update libtool version, README, tests dists - -commit f2981454cbe25cf9411b710f46c5f5552003a123 -Author: Anthony Green -Date: Thu Apr 5 15:45:19 2012 -0400 - - Revert debug code changes - -commit 39dccddb606f6fdb8dcb177d416e884041da6e30 -Author: Zachary Waldowski -Date: Thu Apr 5 12:32:41 2012 -0400 - - Fix building with Clang for Darwin (OS X 10.6+ and iOS - 4.0+) - -commit 3afaa9a34a81a305227ae8cf4f12b9d0484d055e -Author: Peter Rosin -Date: Tue Apr 3 07:40:31 2012 -0400 - - Fix return_uc.c test case on windows. - -commit 65f40c35a2873d8328359ec4512bd0736dbe32c7 -Author: Anthony Green -Date: Tue Apr 3 07:35:59 2012 -0400 - - Repair ppc build regression. - -commit 0a1ab12a8d15caa894116a82249551f23ef65612 -Author: Peter Rosin -Date: Fri Mar 30 08:14:08 2012 -0400 - - Various MSVC-related changes. - -commit e1539266e6c6dde3c99832323586f33f977d1dc0 -Author: Anthony Green -Date: Fri Mar 30 00:40:18 2012 -0400 - - ARM VFP fix for old toolchains - -commit 7c5e60b5f47d725036a72162f136272bc407e3a1 -Author: Anthony Green -Date: Thu Mar 29 08:48:22 2012 -0400 - - Rebase on fixed GCC sources - -commit e72ed5eeaa9cfb0fdc86f6b3422734177b659f96 -Author: Anthony Green -Date: Wed Mar 21 09:52:28 2012 -0400 - - Fix vararg float test - -commit bd78c9c3311244dd5f877c915b0dff91621dd253 -Author: Anthony Green -Date: Wed Mar 21 08:09:30 2012 -0400 - - More cygwin fixes - -commit 84d3253f86dad6b4f261231935675d35fd964b05 -Author: Anthony Green -Date: Mon Mar 19 23:07:35 2012 -0400 - - Rebase post GCC merge - -commit 964c5b93f80dcaacf73056b7d15a4d2b4b7a217c -Author: Anthony Green -Date: Sat Mar 3 14:46:20 2012 -0500 - - abi check fixes and Linux/x32 support - -commit 6c194233a5f6f1d274669afc5924a9e1f69d4876 -Author: Anthony Green -Date: Sat Mar 3 14:17:54 2012 -0500 - - Add -no-undefined for both 32- and 64-bit x86 - windows-like hosts. - -commit 8360bf1cd0aba8db5582266da70467de7e89a57a -Author: Anthony Green -Date: Thu Feb 23 07:01:13 2012 -0500 - - Ensure that users don't include ffitarget.h directly - -commit d578b89619cf3d2baff027b203619dc307fc12e3 -Author: Anthony Green -Date: Wed Feb 15 00:18:18 2012 -0500 - - Fix ABI check regression - -commit dee20f8e45c486f5018f31e09bb362992aa498c3 -Author: Anthony Green -Date: Fri Feb 10 13:06:46 2012 -0500 - - Rebased from gcc - -commit 4130e1972d001143e5e9f3c6b65f2a6f9524169e -Author: Anthony Green -Date: Fri Feb 3 13:18:27 2012 -0600 - - Refresh autoconf-archive m4 scripts - -commit 1ff9c604bb214b5a305064af1049577ef783730a -Author: Anthony Green -Date: Wed Feb 1 16:34:30 2012 -0600 - - Rebase from GCC - -commit 211060eb8f714af0e935430efa6bb45e8e3ffc5d -Author: Anthony Green -Date: Mon Jan 23 14:24:01 2012 -0500 - - Alpha fix - -commit 78d9c638ba0de6edfbc603fd65d19c6562663248 -Author: Anthony Green -Date: Mon Jan 23 14:17:24 2012 -0500 - - mend - -commit afaf3381604bd81803d8a5f3bf4d462299f1aac3 -Author: Anthony Green -Date: Mon Jan 23 14:17:13 2012 -0500 - - mend - -commit 9e9c4aeb77de5608d602109f22100c1c0c79faad -Author: Anthony Green -Date: Mon Jan 23 14:11:23 2012 -0500 - - Add Amiga support - -commit 8efc0b1f4027d5a3cbf205e55d422d94e60f3226 -Author: Anthony Green -Date: Mon Jan 23 13:47:38 2012 -0500 - - Unlikely fixes - -commit 1df51398ae183dc208ba4599ee867278b04d13d3 -Author: Anthony Green -Date: Mon Jan 23 13:43:59 2012 -0500 - - mend - -commit cd2277cc796b96b149cd284ae85326529fe7fb9c -Author: Anthony Green -Date: Mon Jan 23 13:43:38 2012 -0500 - - mend - -commit 164e6fe04b189746c8bd5810c6e3e919770bb9d4 -Author: Anthony Green -Date: Mon Jan 23 12:41:06 2012 -0500 - - m68k fixes - -commit c365ee7577bef00cb3c2c0b5224147aea04138d8 -Author: Anthony Green -Date: Mon Jan 23 11:13:18 2012 -0500 - - Refresh - -commit f22c38bbd93bcc0c04bf26c3e414556b3177c385 -Author: Anthony Green -Date: Fri Nov 18 15:13:41 2011 -0500 - - Update variadic patch - -commit 03e9ee321a3c208f88d2432587ce40b2bb2430ba -Author: Anthony Green -Date: Fri Nov 18 15:13:00 2011 -0500 - - Fix cls_double_va.c and update docs - -commit 95f31151ec792809cfb80d385350f9f56d95aa25 -Author: Anthony Green -Date: Sat Nov 12 23:46:05 2011 -0500 - - Rerun automake - -commit 198ed1ef85cf18342627f8d44bc3f12c9975a49d -Author: Anthony Green -Date: Sat Nov 12 23:45:20 2011 -0500 - - Update version number - -commit 4f17e1f142e805b13959ba2594ee735eae439f4e -Author: Anthony Green -Date: Sat Nov 12 17:22:24 2011 -0500 - - Fix last patch - -commit ff9454da44859716a5bd4eaa344499288c79694f -Author: Anthony Green -Date: Sat Nov 12 17:18:51 2011 -0500 - - Add David Gilbert's variadic function call support - -commit ea14ae85e8f54ff046b7fb8a9cfe349475272044 -Author: Anthony Green -Date: Sat Nov 12 16:36:59 2011 -0500 - - clean up - -commit 52891f8a93f9b8de801cca4cf05639422dc9773e -Author: Anthony Green -Date: Sat Nov 12 16:35:55 2011 -0500 - - Add powerpc soft float support - -commit c8f1bde8e2566c5a87474b4d08aa934d6d28ee75 -Author: Anthony Green -Date: Sat Nov 12 16:21:02 2011 -0500 - - Remove junk file - -commit 6a6e7f862f3cc677e19131587caa619e7f9c7ffd -Author: Anthony Green -Date: Sat Nov 12 16:20:42 2011 -0500 - - Fix kfreebsd - -commit d52fbed05ccbdee9ed8b9c911cbb4f85b0ff0f2a -Author: Anthony Green -Date: Sat Nov 12 16:13:41 2011 -0500 - - Add missing ChangeLog entry - -commit 322052ce65c4fdac85bedc24726fd0e0094ba521 -Author: Anthony Green -Date: Sat Nov 12 16:11:49 2011 -0500 - - Fix arm wince alignment issue - -commit af18df2bc2f52df81e7b5c619bd86db8489dc873 -Author: Anthony Green -Date: Sat Nov 12 15:52:08 2011 -0500 - - Remove use of ppc string instructions - -commit 236c9391321f83ad40daf03f40c35c9ebc1da6b3 -Author: Anthony Green -Date: Sat Nov 12 07:37:40 2011 -0500 - - Fix darwin11 build problem - -commit c411f140f305ebb00d33c92b7cb2742bcd241b6a -Author: Anthony Green -Date: Sat Nov 12 07:32:36 2011 -0500 - - Fix ax_enable_builddir macro on BSD systems - -commit 3d56106b07735abef6ae9f032e94f560a0ed2f30 -Author: Anthony Green -Date: Sat Nov 12 07:20:24 2011 -0500 - - Rebase - -commit 8c01954c50bf8ef2e00a3db166060a1b8f83a20d -Author: Anthony Green -Date: Tue Sep 6 14:26:32 2011 -0400 - - Build assembly files with debug info - -commit fed646a2078969f4ce89c29107f1e72e03f4a977 -Author: Anthony Green -Date: Tue Sep 6 09:50:20 2011 -0400 - - Regenerate configury with missing m4 macros - -commit d76441cf71216f8f1e62e7ec852a7f4e21371ec8 -Author: Anthony Green -Date: Wed Aug 24 10:14:23 2011 -0400 - - Update list of supported OpenBSD systems - -commit ee6696fdf4768ba6dd037fb6dd99435afa13816e -Author: Anthony Green -Date: Tue Aug 23 12:30:29 2011 -0400 - - 3.0.11-rc1. soname bump. - -commit c6265c36a91eab8175d0e72db84d8225418f2379 -Author: Anthony Green -Date: Tue Aug 23 10:31:33 2011 -0400 - - Version 3.0.10 - -commit cc5e41bf32d18a14dbdd653d52eacdbdc934c392 -Author: Anthony Green -Date: Mon Aug 22 16:34:24 2011 -0400 - - Fix use of autoconf macros - -commit 049d8386ff52399e69a530b55b9feedc8a2589d2 -Author: Anthony Green -Date: Mon Aug 22 14:50:10 2011 -0400 - - Many new patches - -commit 3b7efa4e74f0dcebf70b447391987aedd3473306 -Author: Anthony Green -Date: Mon Aug 15 13:25:13 2011 -0400 - - Revert remove-debug-code patch temporarily (for ARM Fedora release) - -commit d992ac54a2a9e7e064ffebcb91e05e7cb86185c7 -Author: Anthony Green -Date: Fri Jul 29 17:32:53 2011 -0400 - - Refresh from GCC - -commit 2d3fb36420e09304220ee6c0652bae5eccdb965d -Author: Anthony Green -Date: Wed Mar 30 16:54:42 2011 -0400 - - Fix darwin EH - -commit 30ff28e1d8cd9ed5319f1fbe9c7cccacc8161fb3 -Author: Anthony Green -Date: Mon Feb 28 15:36:23 2011 -0500 - - Fix permissions - -commit 09f8f310f4f53a24289682d3d28f4399d7bafc3b -Author: Anthony Green -Date: Mon Feb 28 15:36:07 2011 -0500 - - More AIX fixes. rc9. - -commit 53d7b165642c220aa5166ba350b490802f359b54 -Merge: 18dd85d 3000dc2 -Author: Anthony Green -Date: Mon Feb 28 15:23:31 2011 -0500 - - Merge branch 'master' of https://github.com/landonf/libffi-ios - -commit 18dd85d6cb9f3f3eea2a3b70eb4e150045905c55 -Author: Anthony Green -Date: Fri Feb 25 16:23:04 2011 -0500 - - rc8. fix last patch. - -commit 74ee6ea8b42e60d44a3ae8938b1e42a38c1e66b4 -Author: Anthony Green -Date: Fri Feb 25 15:52:14 2011 -0500 - - rc7. More AIX fixes. - -commit 2541679dbd3db0014890f42192dbf8008ab923fa -Author: Anthony Green -Date: Fri Feb 25 15:09:13 2011 -0500 - - Fix ppc32 bug - -commit cbb062cc35c518004f1ab45c847f8ec4f66069ad -Author: Anthony Green -Date: Thu Feb 17 20:39:21 2011 -0500 - - Another non-GCC configury fix - -commit 8cf8878425e9971866fa6b27a3e4914729ad3960 -Author: Anthony Green -Date: Tue Feb 15 15:19:49 2011 -0500 - - Fix ax_cc_maxopt.m4 - -commit 24b72070c0937f9000744c77a636f07e04786b6a -Author: Anthony Green -Date: Mon Feb 14 15:30:57 2011 -0500 - - Fix warning and msvcc patches - -commit d72c49e556a8c516e97f6722d1be2f1209c21207 -Author: Anthony Green -Date: Sun Feb 13 11:41:05 2011 -0500 - - Add missing msvcc.sh - -commit 3000dc237f6017a7445d8404097a4f46b73fdd29 -Merge: 55e4a5a 1fbf9dc -Author: Landon Fuller -Date: Sun Feb 13 08:55:53 2011 -0500 - - Merge remote branch 'upstream/master' - -commit 1fbf9dc44feea564e84ad7406d17c5d5906ce0e0 -Author: Anthony Green -Date: Sun Feb 13 08:06:39 2011 -0500 - - Fix bad_abi test. rc5. - -commit 90af15ef5c1614b76370c4d13954586fabf9e8e3 -Author: Anthony Green -Date: Sat Feb 12 12:29:36 2011 -0500 - - iOS fixes - -commit 55e4a5aa1568558a04aa40f16fc022e459af53e3 -Author: Landon Fuller -Date: Sat Feb 12 12:13:46 2011 -0500 - - Add support for building a full armv6/armv7/i386 universal iOS library - -commit a0c80f279b8733d001cb5e5c5a3289ecb7a6e56a -Author: Landon Fuller -Date: Sat Feb 12 11:43:49 2011 -0500 - - Update my e-mail address. - -commit 8195e0e11df7a53fa474caa9375f73ca1136ed66 -Author: Landon Fuller -Date: Sat Feb 12 11:27:00 2011 -0500 - - Fix symbol prefixes on Darwin. - -commit 56b3f8cef0f28cefaa0f40fe0cf7c524adef131d -Author: Landon Fuller -Date: Sat Feb 12 11:14:54 2011 -0500 - - Modify the ffi_closure structures to hold table/table entry pointers instead of a code buffer. - - This re-integrates commit da2773e02ab26cc11a7f. - -commit 28a00f61ff3f64c4eb2269ce2aea3d493274469e -Author: Landon Fuller -Date: Sat Feb 12 11:01:48 2011 -0500 - - Apple assembler support; fixed most gas/ELF-isms. - -commit 7f2ea33a80bfced5e48ed7292f3b8f057d54ff8f -Author: Landon Fuller -Date: Sat Feb 12 10:39:18 2011 -0500 - - Replace RETLDM macro. - - The macro is incompatible with Apple's assembler; switch to - a simple inline version. - -commit 92ff23e77fa586455b427b71f49e1d9502470e6e -Author: Landon Fuller -Date: Sat Feb 12 10:24:49 2011 -0500 - - Switch to the current iOS 4.2 SDK. - -commit 58fb8ca2dfb89ad70284bb9678d3d4dbb658c8a7 -Merge: cc3fbd9 71c792f -Author: Landon Fuller -Date: Sat Feb 12 10:23:19 2011 -0500 - - Merge remote branch 'upstream/master' - -commit cc3fbd975ce9366d4c40a6ff6c108f664867bd7c -Merge: e449a43 f6ab3ed -Author: Landon Fuller -Date: Sat Feb 12 10:21:02 2011 -0500 - - Merge branch 'master' of github.com:landonf/libffi-ios - -commit e449a43bbe12f8119399928db1ae26adc71dde14 -Author: Landon Fuller -Date: Sat Feb 12 10:20:42 2011 -0500 - - Allow specification of the minimum supported iOS version. - -commit 71c792f51bcf3e2f334e5ea1fb1a8b667cb3aedb -Author: Anthony Green -Date: Sat Feb 12 09:33:11 2011 -0500 - - rc4 - -commit 7c7c9f327299331022f6000603a35f2310dfe308 -Author: Anthony Green -Date: Sat Feb 12 09:29:29 2011 -0500 - - ungccify parts of the build - -commit ed62e48b95a0fa60b685f647cb73c9e190eec35c -Author: Anthony Green -Date: Fri Feb 11 12:23:58 2011 -0500 - - Fix permissions - -commit 17d9e9e68ddb1b915a0b9751713033861b598575 -Author: Anthony Green -Date: Fri Feb 11 12:23:20 2011 -0500 - - Use newer autotools. Only build debug.c when --enable-debug. - -commit 6972a4ffda75761eaab7dfbe0fb1516b255e8e0c -Author: Anthony Green -Date: Fri Feb 11 07:32:51 2011 -0500 - - Fix xlc build on AIX - -commit 1833aa0fb9831eb0725b63e35886c0f6d35df480 -Author: Anthony Green -Date: Fri Feb 11 07:11:04 2011 -0500 - - sparc ABI test fix. - -commit f1fb139b4e283fffdcf205a903943d5e9d2bb2a2 -Author: Anthony Green -Date: Wed Feb 9 18:30:02 2011 -0500 - - Fix tests - -commit 5cb470331d181c84d5d621e88868327a324a5898 -Author: Anthony Green -Date: Wed Feb 9 15:23:06 2011 -0500 - - Fix permissions - -commit 269deef6dbbb426695919d3398357fada3bb288c -Author: Anthony Green -Date: Wed Feb 9 15:22:23 2011 -0500 - - rc3 - -commit 42695e72504f647444b8e8e9b90bd24f1e3220e1 -Author: Anthony Green -Date: Wed Feb 9 15:12:35 2011 -0500 - - Fix IRIX support - -commit a6e56b97f62a3feeb3301c24a2e4cae55e546021 -Author: Anthony Green -Date: Wed Feb 9 15:00:42 2011 -0500 - - Add powerpc64-*-darwin* support - -commit 747d6c32d4abb07c10c3a1f93579c3929aaa2487 -Author: Anthony Green -Date: Wed Feb 9 14:56:23 2011 -0500 - - Add Interix support - -commit eab6e41cde382aa07de6c011d514a14c0d62eb47 -Author: Anthony Green -Date: Wed Feb 9 10:15:02 2011 -0500 - - Remove README.markdown form libffi-ios - -commit 69dbe845f4ee3e6ce8999f17a1e4f2179ef7da89 -Author: Anthony Green -Date: Wed Feb 9 07:38:43 2011 -0500 - - Fix xfails - -commit f498318c07b95137fe259d86bdbe15347588b84a -Author: Anthony Green -Date: Wed Feb 9 06:26:46 2011 -0500 - - Update README for iOS again - -commit 630b9c0ac43c7edcbfd892e23c09fb26724f4ac0 -Author: Anthony Green -Date: Wed Feb 9 06:24:23 2011 -0500 - - Update to rc2 - -commit 0cad4386fa4c9ea5f8ca88b16247db4e5c8fea90 -Author: Anthony Green -Date: Wed Feb 9 06:11:46 2011 -0500 - - Add ChangeLog entry. Fix copyright headers. - -commit 09cb76f2645bd2c151846e9249d8ea707ba01e8c -Author: Anthony Green -Date: Tue Feb 8 20:39:51 2011 -0500 - - Add missing change - -commit 2e3a48ccdd54340983c46a29a0b41985e3e789ac -Author: Anthony Green -Date: Tue Feb 8 20:37:26 2011 -0500 - - Fix make dist - -commit 5e4814d9928e236a2a4afe84d6e1d4fdaa473206 -Author: Anthony Green -Date: Tue Feb 8 19:46:28 2011 -0500 - - fix permissions - -commit 5c0cc6f1536aa1738795a97303810a823c7fa2cb -Author: Anthony Green -Date: Tue Feb 8 19:45:59 2011 -0500 - - 3.0.10rc1 - -commit 857fe3de46d2286afa2fe772920ecf4aefa1688f -Author: Anthony Green -Date: Tue Feb 8 19:39:20 2011 -0500 - - Clean ups - -commit e2214f8adb5577c247452e2cc9f4cbe304d7ca9f -Author: Anthony Green -Date: Tue Feb 8 19:22:56 2011 -0500 - - Update README - -commit 1106229a5721a659da5c231ec0e8211119615394 -Merge: bc9d0be f6ab3ed -Author: Anthony Green -Date: Tue Feb 8 19:20:09 2011 -0500 - - Add iOS support - -commit bc9d0be2958ce475757f34dd2c878948aa77a39f -Author: Anthony Green -Date: Tue Feb 8 17:04:26 2011 -0500 - - 3.0.10rc0 changes - -commit 3b836249feae6d08d3e6887486e4b9961ddafa09 -Author: Anthony Green -Date: Tue Feb 8 14:28:59 2011 -0500 - - Rebase from GCC - -commit a26e3940619faeba6de54824c9540c90b1aab513 -Author: Anthony Green -Date: Tue Feb 8 13:56:12 2011 -0500 - - copyright updates patch - -commit b8099539f00e224107594101e9760b6dc081a056 -Author: Anthony Green -Date: Tue Feb 8 13:50:43 2011 -0500 - - Fix msvcc.sh botch - -commit dc411e8f99113a34656bfd2d3ae51259972488cc -Author: Anthony Green -Date: Tue Feb 8 10:49:29 2011 -0500 - - Fix HP-UX build - -commit 404585d1348e30ac58203bbd876d9131e5aed874 -Author: Anthony Green -Date: Tue Feb 8 10:44:36 2011 -0500 - - Fix sparc v8 aggregate type returns for sun's compiler - -commit 19ce713188e193e4522740d24c20170411883d2d -Author: Anthony Green -Date: Tue Feb 8 10:34:23 2011 -0500 - - grammar fix - -commit 89284fe55f1a8ad3bddbea796ee00d0e3ba411ce -Author: Anthony Green -Date: Tue Feb 8 10:19:19 2011 -0500 - - Fix AIX build with IBM XLC - -commit ba022c338af97cb18d9f8ed5a607fd483a61c09c -Author: Anthony Green -Date: Tue Feb 8 10:12:48 2011 -0500 - - fix win64-underscore patch - -commit 097e5f3924ee92a3ba6cd72f787da8a3eb14fea3 -Author: Anthony Green -Date: Tue Feb 8 10:11:00 2011 -0500 - - x86 pcrel test part 2 - -commit ed2c518d960b91d444be74e5a55779a9c4602f3b -Author: Anthony Green -Date: Tue Feb 8 10:10:07 2011 -0500 - - x86 pcrel test - -commit 0e5843995f46900ef212531281e08b224464f413 -Author: Anthony Green -Date: Tue Feb 8 07:52:40 2011 -0500 - - Refresh from GCC - -commit 5b9cd52784339a42e417174a55e310e214d435f9 -Author: Anthony Green -Date: Mon Nov 22 15:19:57 2010 -0500 - - win64-underscore patch - -commit 2db72615b50eb5c0f29725c02c740a2f0d7fc7d9 -Author: Anthony Green -Date: Sun Nov 21 10:50:56 2010 -0500 - - Rebase - -commit f6ab3edc23dc8fc7c47a31c896044150c23f04b5 -Author: Landon Fuller -Date: Wed Oct 27 19:34:51 2010 -0400 - - Include the license header in the generated output. - -commit cef619462887fa0f360e3ee702d1e04f112b5b38 -Author: Landon Fuller -Date: Wed Oct 27 13:59:30 2010 -0400 - - Add missing copyright/license header. - -commit 53f387b203413c9aa6e31f49dbb70d37d816330b -Author: Landon Fuller -Date: Sun Sep 19 19:57:17 2010 -0700 - - Minor README fix. - -commit 4fbcb5b5fbce11f4b168060e00639db33c85b75b -Author: Landon Fuller -Date: Sun Sep 19 19:50:37 2010 -0700 - - Minor README fix. - -commit 8e7652ef6acab5db7a29f786686a54f05cdbdc7d -Author: Landon Fuller -Date: Sun Sep 19 19:49:39 2010 -0700 - - Add a libffi-ios-specific github README. - -commit 83038cf24aa1a92b62b91ffee1dcc25d79243484 -Author: Landon Fuller -Date: Sun Sep 19 14:36:45 2010 -0700 - - Implement FFI_EXEC_TRAMPOLINE_TABLE allocator for iOS/ARM. - - This provides working closure support on iOS/ARM devices where - PROT_WRITE|PROT_EXEC is not permitted. The code passes basic - smoke tests, but requires further review. - -commit b00ff3e98fdde622cef617030e14d5356dff988f -Author: Landon Fuller -Date: Sun Sep 19 14:22:26 2010 -0700 - - Rename the generated symbol - -commit da2773e02ab26cc11a7fe87e985599f35cdf0649 -Author: Landon Fuller -Date: Sun Sep 19 14:21:37 2010 -0700 - - Modify the ffi_closure structures to hold table/table entry pointers instead of a code buffer. - -commit 01d71b7bed41844f80cb9feef20dcc5ece5ba2d0 -Author: Landon Fuller -Date: Sun Sep 19 14:21:14 2010 -0700 - - Regenerated the autoconf script - -commit 19afda0069c42e51c81dca7b10a5cf884b4cdce0 -Author: Landon Fuller -Date: Sun Sep 19 14:20:52 2010 -0700 - - Enable AC_SUBST for FFI_EXEC_TRAMPOLINE_TABLE - -commit 9e1196444e78aef20028c18891f44ebe39a815fd -Author: Landon Fuller -Date: Sun Sep 19 10:43:06 2010 -0700 - - Add a hard-coded FFI_EXEC_TRAMPOLINE_TABLE arm implementation. - - This implements support for re-mapping a shared table of executable - trampolines directly in front of a writable configuration page, working - around PROT_WRITE restrictions for sandboxed applications on Apple's - iOS. - - This implementation is for testing purposes; a proper allocator is still - necessary, and ARM-specific code needs to be moved out of - src/closures.c. - -commit f38364b399184e682fc3e785084bd497827bc5af -Author: Landon Fuller -Date: Sun Sep 19 10:42:36 2010 -0700 - - Fix symbol prefix for ffi_closure_SYSV_inner on Darwin. - -commit 36849e7716b77aa25e4175d1f4be1b93dbf47aac -Author: Landon Fuller -Date: Sun Sep 19 09:35:04 2010 -0700 - - Whitespace/comment fixes. - -commit b764162526854686e579a48b6ac5981f4eb886a3 -Author: Landon Fuller -Date: Sun Sep 19 09:04:34 2010 -0700 - - Fix the script name (build-iphone.sh -> build-ios.sh) - -commit a3d9aa85013341451ea97766485b7a11852d32b2 -Author: Landon Fuller -Date: Sun Sep 19 09:03:52 2010 -0700 - - Update the autogenerated autoconf/automake files. - -commit c71480eaf839f26bbdfcd8965f65ac4d8defddc0 -Author: Landon Fuller -Date: Sun Sep 19 09:02:05 2010 -0700 - - Update automake/autoconf to conditionally build src/arm/trampoline.S if FFI_EXEC_TRAMPOLINE_TABLE is enabled. - -commit 9af9291b73bc5e27ecd949bec8157f20426d65b8 -Author: Landon Fuller -Date: Sun Sep 19 08:52:33 2010 -0700 - - Add the trampoline table generated by gentramp.sh - -commit 68ce0c383ece84f69945d1c8c3fed03f7f9cb5d6 -Author: Landon Fuller -Date: Sun Sep 19 08:38:19 2010 -0700 - - Add a shell script that generates the ARM trampoline page. - - This generates a page of 340 trampolines, aligned within one page. The - trampolines use pc-relative addressing to reference config data - (context, jump address) from a page placed directly prior to the - trampoline page. This can be used on systems -- such as iOS -- that do not - support writable, executable memory by remapping the executable page - containing the trampolines directly above a newly allocated writable - config page. - -commit 75af086be8830a8eafe9b1ebda199d788bcb0c62 -Author: Landon Fuller -Date: Sat Sep 18 18:12:19 2010 -0700 - - Update autoconf files - -commit 1ac92cca9b02ef8d6a769f0de1adccd5c9630355 -Author: Landon Fuller -Date: Sat Sep 18 18:08:14 2010 -0700 - - Add autoconf check for W^X platforms that require a trampoline table. - - This adds the FFI_EXEC_TRAMPOLINE_TABLE. The flag is enabled for - arm-apple-darwin, where PROT_EXEC on writable (or formerly writable) pages is - not permitted for sandboxed binaries. - -commit be72fbab29b7190c702d8e1ac3d149855e95879d -Author: Landon Fuller -Date: Sat Sep 18 18:02:25 2010 -0700 - - Use the correct host triple for arm/darwin - -commit 70150bdf4509269965c72f2032bf74f285767afe -Author: Landon Fuller -Date: Sat Sep 18 16:38:03 2010 -0700 - - Add missing UNWIND entry; disables .pad on non-EABI targets. - -commit 6b452bafaec498df975ba8ac4c99de174e5f74f7 -Author: Landon Fuller -Date: Sat Sep 18 16:21:32 2010 -0700 - - Apple assembler support; fixed most gas/ELF-isms. - -commit 8ddac835b6f8b54ede764d0ea977dee4c82e2d67 -Author: Landon Fuller -Date: Sat Sep 18 15:38:06 2010 -0700 - - Fix placement of the __APPLE__ macro. - -commit 69043d02936bb0579ac59b4ee1ed8dec38c38db7 -Author: Landon Fuller -Date: Sat Sep 18 15:32:08 2010 -0700 - - Work-around libffi's FP ABI detection. - - On iOS, we must use the AAPCS floating point return value calling - conventions. libffi's ARM implementation will only use these conventions - if __SOFTFP__ is defined, which is not the case when GCC's - -mfloat-abi defaults to 'softfp' instead of 'soft'. To work around this - we manually define __SOFTFP__ for Apple platforms in the ARM-specific - sysv.S. - - See also: - http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iPhoneOSABIReference/Introduction/Introduction.html - http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf - -commit a82e6c354ea805114642a6e440abd0832cb1d23f -Author: Landon Fuller -Date: Sat Sep 18 14:44:24 2010 -0700 - - Add a stub iOS build script to drive autoconf - -commit 84e8de6e9fc19388f6f1102c013b7d0d52940ecc -Author: Anthony Green -Date: Fri Aug 6 01:35:12 2010 -0400 - - Restore execute permissions - -commit 3aeecc9eb1a6feba6549849cdd335c926415a4fc -Author: Anthony Green -Date: Thu Aug 5 15:19:00 2010 -0400 - - Fix win64-struct-args patch - -commit 00d0b59cd13f89ab8b44bd894eb7f0a131fcb472 -Author: Anthony Green -Date: Thu Aug 5 14:56:53 2010 -0400 - - Fix debug build for windows - -commit bda487e87064f27965155459a62dc52a744778d0 -Author: Anthony Green -Date: Thu Aug 5 09:02:41 2010 -0400 - - Don't use -safeseh with ml64 - -commit c1d28ba8d5029795af313ffeb81c97efc6d4c847 -Author: Anthony Green -Date: Thu Aug 5 08:48:16 2010 -0400 - - stdcall-x86-closure-fix - -commit 5feacad4a56c85b3f23a267a30b2cf424cd59548 -Author: Anthony Green -Date: Thu Aug 5 08:30:04 2010 -0400 - - define generic symbols carefully - -commit 10ea848900bc3018ac213cef52b44cacbe5cbebc -Author: Anthony Green -Date: Thu Aug 5 08:24:27 2010 -0400 - - don't copy win64 struct args - -commit d14178be4c49c3ada44a9fe9efe11d444372ddab -Author: Anthony Green -Date: Fri Jul 23 09:14:00 2010 -0400 - - FFI_LAST_ABI fix - -commit 3f5b1375ab1e2b8e3d593e21b27097a4a50f9b83 -Author: Anthony Green -Date: Mon Jul 12 14:39:18 2010 -0400 - - rebase - -commit eaf444eabc4c78703c0f98ac0197b1619c1b1bef -Author: Anthony Green -Date: Sat Jul 10 08:59:09 2010 -0400 - - Fix selinux test - -commit 630974152247f100ece4d44f10c3721bb4599fbf -Author: Anthony Green -Date: Wed May 5 20:14:56 2010 -0400 - - Micharl Kohler's spelling fixes - -commit 9dc9a293f3d4589fcaf02dd4288c8cebaefa508e -Author: Anthony Green -Date: Tue Apr 13 10:33:52 2010 -0400 - - Rebase to latest GCC sources - -commit f2c2a4fce9b3eca9f39b4f3545118bc256da4a73 -Author: Anthony Green -Date: Tue Apr 13 10:19:28 2010 -0400 - - Remove warnings and add OS/2 support - -commit c0b69e57d529e33d18b658cc5572a21e3663247c -Author: Anthony Green -Date: Tue Mar 30 08:30:22 2010 -0400 - - Dan Witte's windows build fixes. - -commit 59a259f4d348f593b45f452309f4d020a28051c4 -Author: Anthony Green -Date: Mon Mar 15 05:57:51 2010 -0400 - - Remove junk file - -commit 3de1eb36d37a66829e606421939874d0d60d816d -Author: Anthony Green -Date: Mon Mar 15 05:57:24 2010 -0400 - - fix-comments patch - -commit c3813b6d7f8a777700f4c5862190c0db148d4de8 -Author: Anthony Green -Date: Tue Jan 26 16:48:56 2010 -0500 - - Rebuild Makefiles with automake 1.11.1 for CVE-2009-4029. - -commit 8d27f68baa365bf883b6053c5f6bc819646d5434 -Author: Anthony Green -Date: Fri Jan 15 11:35:37 2010 -0500 - - Mention recent changes in README - -commit ff3cd68b8cf2d9a28cad7aa9beff46236eacec8c -Author: Anthony Green -Date: Fri Jan 15 11:27:24 2010 -0500 - - Add msvc.sh wrapper - -commit cadeba6cb53414a1253582f1719c286665de7b6c -Author: Anthony Green -Date: Fri Jan 15 10:46:51 2010 -0500 - - Microsoft Visual C port - -commit 0739e7dc00db766eb64f502ec4137b817638c9a1 -Author: Anthony Green -Date: Fri Jan 15 09:48:33 2010 -0500 - - Add x86 Sun Studio compiler support - -commit edfdfd2e85b8d01d2455934f1d7f4d7eb2f3cf1c -Author: Anthony Green -Date: Wed Jan 13 02:56:19 2010 -0500 - - Add closure example doc - -commit 7b7a42f221cf171e8d09df34cac6dc1fd8458cc3 -Author: Anthony Green -Date: Tue Jan 12 09:14:14 2010 -0500 - - Rebase from GCC - -commit 4b18d1f73dc7733137869e4ab5725cb90c1c8fde -Author: Anthony Green -Date: Fri Jan 1 10:24:27 2010 -0500 - - Add x86-64 MingW to README - -commit c3042afaf3f84abbbe9c91bf9bc9896b0d9eb003 -Author: Anthony Green -Date: Fri Jan 1 08:08:02 2010 -0500 - - Reset quilt patches post 3.0.9 merge with GCC - -commit b0304e9679bdfec6ac45a57b5c96542697249418 -Author: Anthony Green -Date: Thu Dec 31 11:32:40 2009 -0500 - - Update version - -commit 2e7e03d014d9c9bf40e97ce75cba089ad052fa6b -Author: Anthony Green -Date: Thu Dec 31 07:43:22 2009 -0500 - - Final updates before 3.0.9 - -commit aea706c52825c8eee677ffa7fdbdd3aed1725492 -Author: Anthony Green -Date: Tue Dec 29 10:09:31 2009 -0500 - - really 3.0.9rc12 - -commit 0cfe60e9d13f132b88995cfee41f2156344f6fa2 -Author: Anthony Green -Date: Tue Dec 29 10:06:04 2009 -0500 - - 3.0.9rc12 - -commit 14e2e92e8645804b6940b3e96c98e9f7f384a6b2 -Author: Anthony Green -Date: Sun Dec 27 21:03:33 2009 -0500 - - 3.0.9rc11 - -commit 884402787bf8eaf7ec207085037cf8ace2f660ec -Author: Anthony Green -Date: Sat Dec 26 12:57:23 2009 -0500 - - HPUX support and avr32 test fixes. - -commit 01c78756aff22efb1f122f8e93e068d7bf2185c7 -Author: Anthony Green -Date: Sat Dec 26 10:05:18 2009 -0500 - - 3.0.9rc9 - -commit 70868464651320268d79c6894db5a50fdc11032a -Author: Anthony Green -Date: Sat Dec 26 09:58:03 2009 -0500 - - Remove xfails for mips and arm - -commit 838d4ad920ec85cf5ca3b511221d67f6d9a99024 -Author: Anthony Green -Date: Sat Dec 26 09:57:27 2009 -0500 - - Remove a bunch of xfails. - -commit 7e37eaaf772f48906e69618c773b0a36c3927de9 -Author: Anthony Green -Date: Sat Dec 26 07:46:50 2009 -0500 - - Fix huge_struct for solaris - -commit 07cc7a37194bc34064ebed7f2724333a798411c8 -Author: Anthony Green -Date: Sat Dec 26 07:23:04 2009 -0500 - - 3.0.9rc8 - -commit 2b9be16ffabc81326128bc1bbdddff8ddc5d13d3 -Author: Anthony Green -Date: Sat Dec 26 07:04:45 2009 -0500 - - 3.0.9rc8 - -commit 9458d88f676e9a21ab8993a54e16754b11687419 -Author: Anthony Green -Date: Sat Dec 26 07:02:27 2009 -0500 - - Rebase from GCC - -commit 6a3412417593f068a04dc6163f4269cb295ad5ca -Author: Anthony Green -Date: Sat Dec 26 06:51:33 2009 -0500 - - Add Andreas Schwab's powerpc fix - -commit 39c8792ece1043f41f4c395a2ce71f4cf0ff4674 -Author: Anthony Green -Date: Fri Dec 25 21:52:28 2009 -0500 - - 3.0.9rc7 - -commit 1d04af52e3e24db69f742064694c22f8df5cc70e -Author: Anthony Green -Date: Fri Dec 25 09:50:36 2009 -0500 - - Updated some mips XFAILs - -commit 26e9509c9b7929bc4fcf697071699051a652b1fd -Author: Anthony Green -Date: Fri Dec 25 02:19:23 2009 -0500 - - Clean up ChangeLog.libffi for older patches. - -commit 9c157d3215e4393777f83eb6fa801df6528f40d7 -Author: Anthony Green -Date: Fri Dec 25 02:15:40 2009 -0500 - - Clean up undefine_AC_ARG_VAR_PRECIOUS patch. - -commit d22de05b0bfc480766bc1240615ce2830eee71b8 -Author: Anthony Green -Date: Fri Dec 25 02:04:23 2009 -0500 - - Fix patches - -commit 1fe3dc7c20dc4dbd8fed0d19c8618027d44ed971 -Author: Anthony Green -Date: Fri Dec 25 01:39:00 2009 -0500 - - Add windows support patch. - -commit f7c0bc613a88f7dbc2d18b345c10fa438833c170 -Author: Anthony Green -Date: Fri Dec 25 01:22:11 2009 -0500 - - 3.0.9rc6 - -commit c7fa2da8260258c11ab1dc7ac06fb611a2c1b50f -Author: Anthony Green -Date: Thu Dec 24 07:22:44 2009 -0500 - - 3.0.9rc6 - -commit da11bece0fde66fc0268db3a01207dda857e25d2 -Author: Anthony Green -Date: Thu Dec 24 05:34:46 2009 -0500 - - Release 3.0.9rc5 - -commit e3399b11edeab546b066bfc18574f3edb905d0dc -Author: Anthony Green -Date: Thu Dec 24 01:09:32 2009 -0500 - - Update README - -commit 115ab36fceee69740a01ce49bc27e1908cc237b1 -Author: Anthony Green -Date: Thu Dec 24 00:22:00 2009 -0500 - - Update missing changes for 3.0.9r4. - -commit f8c7a245bf5a80bd7e730ec03fcad17c8dcfcb07 -Author: Anthony Green -Date: Wed Dec 23 23:46:22 2009 -0500 - - Switch to quilt. Rebase to latest GCC. - -commit ce806772f02387b9a74f6496a263a368bccd5d59 -Merge: cd98813 dcc1f6b -Author: Anthony Green -Date: Mon Oct 5 00:41:35 2009 -0400 - - Merge branch 'master' of git@github.com:atgreen/libffi - -commit dcc1f6b4f1ffd2713bf68b791a13f85d455c8b1b -Author: Anthony Green -Date: Mon Oct 5 00:29:33 2009 -0400 - - More clean up. - -commit 2829f5941a223b9d851d8ab6318318e6197d7e01 -Author: Anthony Green -Date: Mon Oct 5 00:28:03 2009 -0400 - - Clean up - -commit cd98813de517ea64041637e3e78d27a001d6d3b4 -Author: Anthony Green -Date: Mon Oct 5 00:25:29 2009 -0400 - - From Jens Rehsack. Fix for 64-bit AIX. - -commit e4a91de766acc47f6c50f13cc11719a65e23ecba -Author: Anthony Green -Date: Mon Oct 5 00:16:17 2009 -0400 - - From Abdulaziz Ghuloum. Adds special case for Snow Leopard. - -commit 3425a763bcdaadb8b430226f427ec833afdcc96a -Author: Anthony Green -Date: Sun Oct 4 23:57:29 2009 -0400 - - Fix detection of free/openbsd. From Alexis Ballier. - -commit 2340e7a777902de61499d47823ad8d5e0eeb6203 -Author: Anthony Green -Date: Sun Oct 4 23:53:17 2009 -0400 - - AVR support - -commit 5cbe2058c128e848446ae79fe15ee54260a90559 -Author: Anthony Green -Date: Sun Oct 4 23:53:11 2009 -0400 - - Initial stand-alone patch. - -commit c6dddbd02bad9654ed58cdb0feb360934d105dec -Author: Anthony Green -Date: Sun Oct 4 08:11:33 2009 -0400 - - Initial commit - -commit 5ffc0c37486fb1538bccc0ca7acc807d4f1af932 -Author: Anthony Green -Date: Sun Oct 4 07:58:22 2009 -0400 - - Update version to 3.0.9rc1. Add more useful things to .gitignore. - -commit bd29f83ee9f6fa6b65adee9d3f57834f364d9887 -Author: Anthony Green -Date: Tue Sep 29 12:07:26 2009 -0400 - - Add .gitignore - -commit 9474f853f83e3f0167c1b306177321bfcc93e56d -Author: Anthony Green -Date: Tue Sep 29 11:13:02 2009 -0400 - - Remove old CVSROOT files. - -commit 0c25275ec24bfe2c2c25a000465f0950ef9dd51b -Author: twall -Date: Wed Aug 19 12:57:34 2009 +0000 - - Apply Dave Korn's cygwin/GCC changes - -commit 39228c27ed3f677a95b46380a8d31602b5777e1a -Author: aph -Date: Tue Jun 16 18:00:47 2009 +0000 - - 2009-06-16 Wim Lewis - - * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are - supposed to be callee-saved. - * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of - return buffer for odd-size structs. - -commit 5e93cc704d127c2c8ae7f5d2cef621145d43e777 -Author: aph -Date: Tue Jun 16 17:41:47 2009 +0000 - - 2009-06-16 Andreas Tobler - - PR libffi/40444 - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add - allow_stack_execute for Darwin. - -commit b509af8959dc371b92392c623522ea6f4946a71d -Author: aph -Date: Tue Jun 16 16:17:52 2009 +0000 - - 2009-06-16 Andrew Haley - - * configure.ac (TARGETDIR): Add missing blank lines. - * configure: Regenerate. - -commit d57e96dc56ee76fbbb9b59d73aeaa92354db5ecb -Author: aph -Date: Tue Jun 16 09:59:02 2009 +0000 - - 2009-06-16 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. - * testsuite/libffi.call/float2.c: Fix dg-excess-errors. - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. - -commit b01d6d1982c9e020507029bfd5a58a8c60d111fa -Author: aph -Date: Tue Jun 16 09:44:54 2009 +0000 - - 2009-06-16 Andrew Haley - - * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. - * testsuite/libffi.call/err_bad_abi.c: Likewise. - -commit 35b6ded138591900a88055a8a8ac1fadc29a76d6 -Author: aph -Date: Fri Jun 12 15:29:20 2009 +0000 - - 2009-06-11 Kaz Kojima - - * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. - * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - -commit acc46605f2d95d67d69398e7644610f10a157ce3 -Author: aph -Date: Fri Jun 12 14:21:28 2009 +0000 - - 2009-06-12 Andrew Haley - - * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - testsuite/libffi.special/unwindtest.cc: include stdint.h. - -commit 16d1996ed0797bd7c11aca2b0fe7e7748751aaf6 -Author: twall -Date: Thu Jun 11 14:27:42 2009 +0000 - - update changelog - -commit 92a515c33efe91be3cb0258f01c63aff208489c7 -Author: twall -Date: Thu Jun 11 14:27:28 2009 +0000 - - use ffi_closure_alloc instead of stack-based closure - -commit e4363160ba9e50167f9ca0a7399d537a1d2cd0ce -Author: twall -Date: Thu Jun 11 14:26:23 2009 +0000 - - remove unused extern - -commit 1dc2781d2ba38f5f000ff70069d617fb21e1d2af -Author: twall -Date: Thu Jun 11 11:36:16 2009 +0000 - - remove not-yet-applied changelog entries - -commit bb27735fe689dac97ec0dc847ed8d3d519620109 -Author: twall -Date: Wed Jun 10 10:42:36 2009 +0000 - - add win64 support - -commit b2a54c100c74854a409820817d54617fdda39eb8 -Author: aph -Date: Mon Jun 8 16:50:49 2009 +0000 - - 2009-06-08 Andrew Haley - - * testsuite/libffi.call/err_bad_abi.c: Add xfails. - * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. - * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. - * testsuite/libffi.call/err_bad_typedef.c: Add xfails. - - * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - -commit 25723e7141f73d3736d7244b980c89d97db852b6 -Author: aph -Date: Fri Jun 5 13:03:40 2009 +0000 - - 2009-06-05 Andrew Haley - - * src/x86/win32.S (_ffi_closure_STDCALL): Import from gcc. - -commit 70758199c7cd41f411987360ccb302b497a56dc9 -Author: aph -Date: Thu Jun 4 16:29:58 2009 +0000 - - 2009-06-04 Andrew Haley - - * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. - -commit e8bb12563f9aa23ddf36fa6a5b92b16b5c3e1a7f -Author: aph -Date: Thu Jun 4 14:59:18 2009 +0000 - - 2009-06-04 Andrew Haley - - * src/mips/o32.S, - src/mips/n32.S: Fix licence formatting. - -commit d66a8e32c3671479e3ce0f6819673e5932ba6b7f -Author: aph -Date: Thu Jun 4 14:43:40 2009 +0000 - - 2009-06-04 Andrew Haley - - * src/x86/darwin.S: Fix licence formatting. - src/x86/win32.S: Likewise. - src/sh64/sysv.S: Likewise. - src/sh/sysv.S: Likewise. - -commit 7c3b7fd6b5db746b5b09a718f3044f811372f941 -Author: aph -Date: Thu Jun 4 14:39:20 2009 +0000 - - 2009-06-04 Andrew Haley - - * src/sh64/ffi.c: Remove lint directives. Was missing from merge - of Andreas Tobler's patch from 2006-04-22. - -commit 1a2f93a8b362db13638afd9fcb3f2650180bfa17 -Author: aph -Date: Thu Jun 4 10:45:51 2009 +0000 - - 2009-06-04 Andrew Haley - - * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of - 2007-03-07. - -commit 944c95cf7aaaaf7c5fa368cda4673dd38f45020e -Author: aph -Date: Wed Jun 3 17:42:56 2009 +0000 - - 2009-05-22 Dave Korn - - * src/x86/win32.S (_ffi_closure_STDCALL): New function. - (.eh_frame): Add FDE for it. - - 2009-05-22 Dave Korn - - * configure.ac: Also check if assembler supports pc-relative - relocs on X86_WIN32 targets. - * configure: Regenerate. - * src/x86/win32.S (ffi_prep_args): Declare extern, not global. - (_ffi_call_SYSV): Add missing function type symbol .def and - add EH markup labels. - (_ffi_call_STDCALL): Likewise. - (_ffi_closure_SYSV): Likewise. - (_ffi_closure_raw_SYSV): Likewise. - (.eh_frame): Add hand-crafted EH data. - - 2008-11-21 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for - signed/unsigned int8/16 return values. - * src/sparc/v8.S (ffi_call_v8): Likewise. - (ffi_closure_v8): Likewise. - - 2008-03-26 Kaz Kojima - - * src/sh/sysv.S: Add .note.GNU-stack on Linux. - * src/sh64/sysv.S: Likewise. - - 2008-03-26 Daniel Jacobowitz - - * src/arm/sysv.S: Fix ARM comment marker. - -commit 00fa972430bb1535a4b34bf029ebcad500027b0c -Author: twall -Date: Sat Dec 27 16:59:05 2008 +0000 - - properly glob-match - -commit f5179e6794ac35af26fe86e468b8508a7a570c55 -Author: twall -Date: Fri Dec 26 19:06:28 2008 +0000 - - Mark XFAIL on longdouble tests for x86_64/mingw - -commit 80e2b5a749208c8a18f994ec5bee84594d051cc8 -Author: twall -Date: Mon Dec 22 15:21:15 2008 +0000 - - clean up tests for win64 use - -commit 7063d9996f742576095c7b0eb5016c0f9a670aec -Author: green -Date: Fri Dec 19 16:13:46 2008 +0000 - - Version 3.0.8 with x86-solaris support - -commit bdfeb13f0df0a63b19d62597517237b54d92228b -Author: green -Date: Fri Dec 19 15:47:44 2008 +0000 - - Bump to 3.0.7 - -commit 69205de17d6ac4c11d4ba92d6a5b40a0c5f246b2 -Author: green -Date: Thu Jul 24 18:03:48 2008 +0000 - - Many test fixes (failures due to excessive compiler warnings). - -commit 260d513fea00b3613fe957a44a157fe72c4ca29e -Author: green -Date: Thu Jul 17 13:13:52 2008 +0000 - - Version 3.0.6. sh/sh64 fixes. - -commit 3704031875feabb74e3655ed03cff4c2b3c76ac6 -Author: green -Date: Thu Apr 3 18:57:57 2008 +0000 - - Rev 3.0.5. - -commit 8406f5f48f7f58a1c982a93a95d521cf82b3241f -Author: green -Date: Thu Apr 3 18:57:34 2008 +0000 - - 3.0.5 - -commit 23a9e73212b62f9684cedb0ce70e92c59cfdaffa -Author: green -Date: Wed Mar 5 00:07:02 2008 +0000 - - 2008-03-04 Anthony Green - Blake Chaffin - hos@tamanegi.org - - * testsuite/libffi.call/cls_align_longdouble_split2.c - testsuite/libffi.call/cls_align_longdouble_split.c - testsuite/libffi.call/cls_dbls_struct.c - testsuite/libffi.call/cls_double_va.c - testsuite/libffi.call/cls_longdouble.c - testsuite/libffi.call/cls_longdouble_va.c - testsuite/libffi.call/cls_pointer.c - testsuite/libffi.call/cls_pointer_stack.c - testsuite/libffi.call/err_bad_abi.c - testsuite/libffi.call/err_bad_typedef.c - testsuite/libffi.call/huge_struct.c - testsuite/libffi.call/stret_large2.c - testsuite/libffi.call/stret_large.c - testsuite/libffi.call/stret_medium2.c - testsuite/libffi.call/stret_medium.c: New tests from Apple. - -commit 429e37d3ad653e52e75bf725c883ab79e859f89a -Author: green -Date: Thu Feb 28 04:50:19 2008 +0000 - - clicky - -commit 51e79c428348c033314f54bcb30f7e388c59e347 -Author: green -Date: Thu Feb 28 04:47:35 2008 +0000 - - getclicky - -commit affcab04e280efeace45a72c4dc6152c0e4f1b7f -Author: green -Date: Tue Feb 26 19:01:53 2008 +0000 - - 2008-02-26 Jakub Jelinek - Anthony Green - - * src/alpha/osf.S: Add .note.GNU-stack on Linux. - * src/s390/sysv.S: Likewise. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - * src/x86/unix64.S: Likewise. - * src/x86/sysv.S: Likewise. - * src/sparc/v8.S: Likewise. - * src/sparc/v9.S: Likewise. - * src/m68k/sysv.S: Likewise. - * src/ia64/unix.S: Likewise. - * src/arm/sysv.S: Likewise. - -commit 59689d5522c159a3ac967adb6b891cf5f22c890f -Author: green -Date: Tue Feb 26 17:40:51 2008 +0000 - - 2008-02-26 Anthony Green - Thomas Heller - - * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C - comment. - -commit b13c84cf4668828ff8429ba4a2f94cd1eb574ae0 -Author: green -Date: Tue Feb 26 17:38:15 2008 +0000 - - 2008-02-26 Anthony Green - Thomas Heller - - * include/ffi.h.in: Change void (*)() to void (*)(void). - -commit 265289f679ffd24a88ae1aa2cef0e4aa14703cd8 -Author: green -Date: Tue Feb 26 17:34:36 2008 +0000 - - 2008-02-26 Anthony Green - - * src/alpha/ffi.c: Change void (*)() to void (*)(void). - src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, - src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, - src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, - src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, - src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,> src/x86/ffi64.c: Ditto. - -commit fb5036cd6d0f909918e90f7d2d9fd80d46682d5d -Author: green -Date: Sun Feb 24 17:25:25 2008 +0000 - - fix date - -commit 40bec108e7d0181e6c9928aa7a33187bcc0f3d6f -Author: green -Date: Sun Feb 24 17:25:02 2008 +0000 - - New release - -commit b922048fa82ea109a4af269ee47bbc2a586bbac2 -Author: green -Date: Sun Feb 24 17:24:00 2008 +0000 - - 2008-02-24 Anthony Green - - * configure.ac: Accept openbsd*, not just openbsd. - Bump version to 3.0.4. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -commit affca4b92d06e5554784c7e9b233029ef83f7d8a -Author: green -Date: Fri Feb 22 21:53:29 2008 +0000 - - sync readme with web page. - -commit 3e53d8752ea74859b4c64fbbf935e62a937c4d78 -Author: green -Date: Fri Feb 22 21:52:38 2008 +0000 - - New release - -commit 4d92f6c8e78fe084be65f3e8b58b859901ba796d -Author: green -Date: Fri Feb 22 21:49:46 2008 +0000 - - 2008-02-22 Anthony Green - - * configure.ac: Bump version to 3.0.3. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. Clean up test docs. - -commit 0e185fa11a01f816824ba2687ed3715ab6219bef -Author: green -Date: Fri Feb 22 21:43:18 2008 +0000 - - Update configure script. - -commit f73986bd211cfbbaa593d1309504d0dc68626191 -Author: green -Date: Fri Feb 22 21:40:53 2008 +0000 - - 2008-02-22 Bjoern Koenig - Andreas Tobler - - * configure.ac: Add amd64-*-freebsd* target. - * configure: Regenerate. - -commit 0208f68fe5de30c33e7f70ebc281635917013f5a -Author: green -Date: Fri Feb 22 21:15:44 2008 +0000 - - 2008-02-22 Thomas Heller - - * configure.ac: Add x86 OpenBSD support. - * configure: Rebuilt. - -commit 01adb0e638a86cf0d5e668ed8e08be9b0cd2505f -Author: green -Date: Thu Feb 21 16:17:26 2008 +0000 - - Fix README. - -commit 1edd4563225981a14f7d4fb9919b1ed88e38082f -Author: green -Date: Thu Feb 21 13:39:01 2008 +0000 - - 3.0.2 - -commit c9b542800864e2204db6e83f3843a17813ba6165 -Author: green -Date: Thu Feb 21 13:36:43 2008 +0000 - - add missing file - -commit d5fa5633d5c8d3c212a2267cfa38fba4091baa2c -Author: green -Date: Thu Feb 21 13:36:19 2008 +0000 - - 2008-02-21 Anthony Green - - * configure.ac: Bump version to 3.0.2. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - - 2008-02-21 Björn König - - * src/x86/freebsd.S: New file. - * configure.ac: Add x86 FreeBSD support. - * Makefile.am: Ditto. - -commit ac35bfc6fcadd8880c1efce36724820f9074b318 -Author: green -Date: Sat Feb 16 01:03:56 2008 +0000 - - Updated - -commit f7942975fee7b0162647dd79e2652615b737e98e -Author: green -Date: Sat Feb 16 01:02:00 2008 +0000 - - 2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.1. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - - 2008-02-15 David Daney - - * src/mips/ffi.c: Remove extra '>' from include directive. - (ffi_prep_closure_loc): Use clear_location instead of tramp. - -commit 59aa6bb1bfc86a610ac1a8b123443efd75854dd1 -Author: green -Date: Fri Feb 15 20:52:26 2008 +0000 - - Add more platforms. - -commit 45a45ab99074448be0ae1a8d2ade50d28b60f8de -Author: green -Date: Fri Feb 15 19:16:36 2008 +0000 - - 3.0 notes - -commit 4db74cbea888c9f1251b85baf00d99b83d3b994d -Author: green -Date: Fri Feb 15 19:10:26 2008 +0000 - - Update - -commit c3e1101ffabf44d8a2ee46e03ba9ab582050a825 -Author: green -Date: Fri Feb 15 18:43:40 2008 +0000 - - 2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.0, - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - - 2008-02-15 David Daney - - * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): - Define (conditionally), and use it to include cachectl.h. - (ffi_prep_closure_loc): Fix cache flushing. - * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. - -commit 7e0cc12e9233ad285db41ce8dbdda61ed2a7fb06 -Author: green -Date: Fri Feb 15 15:51:03 2008 +0000 - - New release - -commit 2d7dc885ec40d53866f29984d595511942c8b686 -Author: green -Date: Fri Feb 15 15:30:26 2008 +0000 - - * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: - Update dates and remove all references to ffi_prep_closure. - * configure.ac: Bump version to 2.99.9. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -commit a0525f03eeaaed33b1eac80e0c016455cee3615d -Author: green -Date: Fri Feb 15 15:14:30 2008 +0000 - - New release. - -commit 2b30dfb3146ee26ad956d00ee05eb835ca1a95b4 -Author: green -Date: Fri Feb 15 15:12:43 2008 +0000 - - * man/ffi_prep_closure.3: Delete. - * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. - (man_MANS): Ditto. - * man/Makefile.in: Rebuilt. - * configure.ac: Bump version to 2.99.8. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -commit bf41e64840ebcb6cc31a6f028253c1fde82705d8 -Author: green -Date: Fri Feb 15 01:56:50 2008 +0000 - - Update. - -commit 4d39ddee677bbb61d621893b91e11eac5e7c4af7 -Author: green -Date: Fri Feb 15 01:24:06 2008 +0000 - - * configure.ac: Bump version to 2.99.7. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * include/ffi.h.in LICENSE src/debug.c src/closures.c - src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h - src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c - src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S - src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c - src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c - src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S - src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h - src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c - src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S - src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h - src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h - src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S - src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h - src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S - src/arm/ffitarget.h src/prep_cif.c: Update license text. - -commit d58b032b41a12bd3d72148da6822ab59dd698ff9 -Author: green -Date: Fri Feb 15 00:59:25 2008 +0000 - - New release - -commit 91e5478df6d5ac63efbb10f025807b4606afab56 -Author: green -Date: Fri Feb 15 00:50:30 2008 +0000 - - Update supported platforms. Bump version. - -commit bd0768f877c8f7fd0d36af2191b203d4d057b1ce -Author: green -Date: Fri Feb 15 00:45:33 2008 +0000 - - * configure.ac: Bump version to 2.99.5. - * configure: Rebuilt. - * Makefile.am (EXTRA_DIST): Add darwin64.S - * Makefile.in: Rebuilt. - * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. - * LICENSE: Update WARRANTY. - -commit 49d345f767bd2cfee951bceaab6a1a07986cf293 -Author: green -Date: Thu Feb 14 23:43:27 2008 +0000 - - update license reference - -commit 12ac48fc79b515db7c9accd9fcaa87b0dcefccdb -Author: green -Date: Thu Feb 14 23:42:08 2008 +0000 - - Update WARRANTY - -commit 6b91c41da87e78552f2990dfc504a0a3349f340b -Author: green -Date: Thu Feb 14 23:38:27 2008 +0000 - - fix tarball reference - -commit 2b59579e3533334bee4788e076b4e520c2ab518c -Author: green -Date: Thu Feb 14 23:35:58 2008 +0000 - - First update in 5 years! - -commit 6cbdf3f3a3777a93382a2d508ddef1c353ff0955 -Author: green -Date: Thu Feb 14 22:44:06 2008 +0000 - - Fix .pc file bug and bump version - -commit 1d1dc81104b209df3cfef0840735c59efae2f655 -Author: green -Date: Thu Feb 14 22:03:37 2008 +0000 - - Add man files and info file. Update README. Tag as 2.99.3. - -commit f045a2367f793fa8b01534cf2e25bcc46afc8fa1 -Author: tromey -Date: Thu Feb 14 20:46:57 2008 +0000 - - Move entry from ChangeLog to ChangeLog.libffi - -commit 6257f07d1a9efd27fa83639cfba281f5d3188731 -Author: tromey -Date: Thu Feb 14 20:33:17 2008 +0000 - - * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. - * mdate-sh, texinfo.tex: New files. - * Makefile.am (info_TEXINFOS): New variable. - * doc/libffi.texi: New file. - * doc/version.texi: Likewise. - -commit 4232af563c5509c3760a33e3684a2b958be755e1 -Author: green -Date: Thu Feb 14 16:19:21 2008 +0000 - - * Makefile.am (AM_CFLAGS): Don't compile with -D. - (lib_LTLIBRARIES): Define. - (toolexeclib_LIBRARIES): Undefine. - * Makefile.in: Rebuilt. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - -commit 961543615c31f092b578a4b4cda914db64f9d0fa -Author: green -Date: Thu Feb 14 15:57:40 2008 +0000 - - Fix typo. - -commit aeb0abab87222f637fbf352d4effd3b76b52ed26 -Author: green -Date: Thu Feb 14 15:54:27 2008 +0000 - - * libffi.pc.in: Usse @PACKAGE_NAME@ and @PACKAGE_VERSION@. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. - * Makefile.in: Rebuilt. - * LICENSE: Update copyright notice. - -commit 77fe243556433eae119d8bd7469bfccdd5bd8a1a -Author: green -Date: Thu Feb 14 15:37:00 2008 +0000 - - Fix make dist again - -commit d4970cf4529459bf0f0e43c602cac396786c6802 -Author: green -Date: Thu Feb 14 15:18:56 2008 +0000 - - Fix make dist - -commit f0b1462f2d3024922ad71421bd5c4311fcb16da5 -Author: green -Date: Thu Feb 14 15:01:41 2008 +0000 - - Use pkgconfig. Increment libtool CURRENT version. - -commit 27e52f33baa069012a5adb2a3807f9ca1f2165ab -Author: green -Date: Sun Feb 3 13:59:48 2008 +0000 - - Fix header installs when using DESTDIR. - -commit fadab28eb6e33fb6dcdd7b9323e147142216d548 -Author: twall -Date: Sun Feb 3 12:32:22 2008 +0000 - - update changelog - -commit b5e44c8dfa92c87b99762c303cf5574a16db8f27 -Author: twall -Date: Sun Feb 3 01:12:32 2008 +0000 - - offset from code base address, not data base address - -commit f359848d1a995c0e44566d815f218729dc996e22 -Author: green -Date: Fri Feb 1 21:29:43 2008 +0000 - - Fix header installs. - -commit c30df49e157c7bfc8e19e3f8a72b9464fe225e54 -Author: green -Date: Fri Feb 1 21:13:55 2008 +0000 - - Revert my broken changes to twall's patch. - -commit 675561bb9aa0732c76698df10dd3007b5d0ec759 -Author: green -Date: Thu Jan 31 13:44:25 2008 +0000 - - Fix make dist . - -commit abc0bbf3813dc43e23d4c23e6fe794dbf287639b -Author: green -Date: Thu Jan 31 11:58:57 2008 +0000 - - Add Tim Wall's x86 windows patch. - -commit e332366d15a31198735b593ec8f7fc0558d783b8 -Author: green -Date: Wed Jan 30 13:21:02 2008 +0000 - - Add HJ's -fomit-frame-pointer struct return fix - -commit d4204240392af5b7750a08671b08e9c22dff5e93 -Author: green -Date: Wed Jan 30 12:42:34 2008 +0000 - - Clean up for new automake. - -commit f4932dd020df574637c9fb3fc1bb18e5a8f304cc -Author: green -Date: Wed Jan 30 12:40:25 2008 +0000 - - Fixes to run testsuite - -commit 085520ddc8db6a916bfc416b871fcb2d00074d40 -Author: green -Date: Tue Jan 29 15:16:43 2008 +0000 - - New files from gcc tree. - -commit 77175b3f7234e4875a4ef554ed1fe9fdc4133794 -Author: green -Date: Tue Jan 29 15:15:20 2008 +0000 - - Latest gcc svn sources - -commit 2544e45a0b2b634053df02da3a2ed9680eeed2a1 -Author: green -Date: Tue Jan 29 14:28:13 2008 +0000 - - Install ffitarget.h in $prefix/include. - -commit 6002211b1cc4daeb587d054b4f83968bda2c981e -Author: green -Date: Tue Jan 29 12:30:10 2008 +0000 - - Add new files. - -commit ccabd2b16be883cd03e5f0cd88ccfdd6ca39239d -Author: green -Date: Tue Jan 29 12:28:15 2008 +0000 - - Merge from gcc - -commit e680ecfbfca1da8d1823e48bc89b8375e66e128b -Author: tromey -Date: Sun Dec 24 23:12:15 2006 +0000 - - Pulled in libffi from gcc trunk. - Fixed build and install for standalone use. - -commit e7ba08965942ce872fdbc69f70f9848cc3d0bad6 -Author: root -Date: Sun Jun 4 23:22:24 2006 +0000 - - sourcware.org - -commit 0cd4aa24e21aaa964dfbdebc25ec5c8188049375 -Author: root -Date: Sun May 30 01:51:57 2004 +0000 - - Add LockDir - -commit 5826120fbd940d26cca76ed2522187505581e1ed -Author: green -Date: Tue Nov 4 06:09:08 2003 +0000 - - Add link to Gianni's web site. - -commit 220aa4b27db42d7ffaac5056000d5179f00d5ea3 -Author: jsm -Date: Tue Jan 21 08:07:42 2003 +0000 - - Newer, better, increased from before! (list of acceptable anon usernames) - -commit 1c3adc892cc1403dc4d3d7003a2385899836612e -Author: green -Date: Fri Dec 6 01:28:03 2002 +0000 - - Fixed Cygnus references. - -commit 4af66bb62fab9a8e318af3bf01e5486596a0c8d4 -Author: green -Date: Sun Oct 21 19:18:42 2001 +0000 - - Testsuite fixes. - -commit 5435965f9015ce40584c98d3816c3d05e7de1d21 -Author: green -Date: Mon Apr 23 00:32:03 2001 +0000 - - * include/ffi_common.h: Delete, after moving contents to... - * include/ffi_private.h: Subsume contents of ffi_common.h. - * include/Makefile.am (noinst_HEADERS): Remove ffi_common.h. - * include/Makefile.in: Rebuilt. - * arm/ffi.c, m68k/ffi.c, mips/ffi.c, powerpc/ffi.c, s390/ffi.c, - ia64/ffi.c: Include ffi_private.h, not ffi_common.h. - * alpha/ffi.c, sparc/ffi.c, x86/ffi.c: Don't include ffi_common.h. - * types.c, raw_api.c, java_raw_api.c, prep_cif.c: Don't include - ffi_common.h. - * debug.c: Include ffi_private.h instead of ffi_common.h. - - * mips/ffi.c (calc_n32_struct_flags): Make static. - (FIX_ARGP): Remove call to debugging routine ffi_stop_here. - - * mips/n32.S: Include ffi_private.h. - * mips/o32.S: Include ffi_private.h. - -commit 6fdb7de0fe3b7385e1fd78812ae69d9b3069d994 -Author: green -Date: Sun Apr 22 19:38:34 2001 +0000 - - * README: Update some comments. - - * Makefile.am (SUBDIRS): Add include so ffi.h gets installed. - * Makefile.in: Rebuilt. - - * include/ffi.h: Change ALPHA to __alpha__ and SPARC to __sparc__. - * types.c: Ditto. - * prep_cif.c (ffi_prep_cif): Ditto. - - * alpha/ffi.c, alpha/osf.S, sparc/ffi.c, sparc/v8.S, sparc/v9.S: - Include ffi_private.h. - - * include/ffi_private.h (FFI_TYPE_LAST): Define. - -commit bc7144b01b9707ef35f1a2e3e6996e005e82953a -Author: green -Date: Sun Apr 22 18:28:36 2001 +0000 - - Moved files from old home - -commit e57279831e20368c1aa1d2b35462b8629be73959 -Author: green -Date: Sun Apr 22 18:23:47 2001 +0000 - - These are dead. - -commit 7247436b5fe71767b29dc02b4da0fe18b08082e6 -Author: green -Date: Sun Apr 22 18:22:43 2001 +0000 - - All these files live somewhere else now. - -commit a8b0d40ff908e275028f676870c31d0d70274a98 -Author: green -Date: Sun Apr 22 18:17:14 2001 +0000 - - Many changes. Not quite there yet. - -commit f893d2273355710a290a26faebf5f12c3a34d0e3 -Author: green -Date: Sun Apr 22 18:13:22 2001 +0000 - - Moved m68k files - -commit 688ddfeced89cbb9d37b53005e1f7f2b9c78a8d7 -Author: green -Date: Sun Apr 22 18:12:33 2001 +0000 - - New, target indepentent, header - -commit f9e40776d488d5ecf43b3ae21444a1a2f6eca528 -Author: green -Date: Sun Apr 22 18:11:57 2001 +0000 - - Many changes. - -commit 8c1d2eb47f6bc314c431b75c85c107e8e43c4a76 -Author: green -Date: Sun Apr 22 18:10:47 2001 +0000 - - Many changes - -commit 1359dfc6582680a158b3caa3efb7a368da4aa12d -Author: green -Date: Sun Apr 22 18:10:20 2001 +0000 - - Moved ia64 files - -commit 6e2de5eee316a4579869aff50c7c5f6f478582d8 -Author: green -Date: Sun Apr 22 18:08:11 2001 +0000 - - Moved arm files - -commit 8807355af34cba8ffe87aee51152dfccec2771fa -Author: green -Date: Mon Apr 9 00:58:38 2001 +0000 - - Many many updates. Merge from gcc and then some. - -commit f7e9f91adec4ff1c2e7a13b3de81d2c5a3f55e7e -Author: green -Date: Mon Apr 17 03:32:37 2000 +0000 - - Mnay fixes. - -commit c4860de618f4956283f5c8230a2544e403dfe390 -Author: green -Date: Mon Apr 17 03:18:46 2000 +0000 - - Merge from libgcj. Merged patches from net. See ChangeLog for details. - -commit c578b58314990c3853429297c38ba14015fec5fa -Author: jsm -Date: Sat Oct 9 20:18:16 1999 +0000 - - 1999-10-09 Jason Molenda (jsm@bugshack.cygnus.com) - - * CVSROOT/auto_checkout, CVSROOT/commit_prep, CVSROOT/log_accum: - Deleted; generic versions now used for all repositories. - - * CVSROOT/commitinfo, CVSROOT/loginfo: Change pathnames to - generic versions. - - * CVSROOT/checkoutlist: Don't try to check out the removed - files any longer. - -commit acdb20051207fed7652dd9f122f65de5458c474c -Author: jsm -Date: Sat Oct 9 20:18:15 1999 +0000 - - 1999-10-09 Jason Molenda (jsm@bugshack.cygnus.com) - - * CVSROOT/auto_checkout, CVSROOT/commit_prep, CVSROOT/log_accum: - Deleted; generic versions now used for all repositories. - - * CVSROOT/commitinfo, CVSROOT/loginfo: Change pathnames to - generic versions. - - * CVSROOT/checkoutlist: Don't try to check out the removed - files any longer. - -commit e75be655ceedf7ab24c4e99d75eec9efeb979bc7 -Author: green -Date: Sun Aug 8 13:16:41 1999 +0000 - - New configury - -commit d6669a0dd5b266005325bbf6d5a8ff34574d809e -Author: green -Date: Sun Aug 8 13:05:12 1999 +0000 - - * include/ffi.h.in: Try to work around messy header problem - with PACKAGE and VERSION. - - * configure: Rebuilt. - * configure.in: Change version to 2.00-beta. - - * fficonfig.h.in: Rebuilt. - * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. - - * src/x86/ffi.c (ffi_raw_call): Rename. - -commit 4819d52b007934a40d6d29a75ee30e857c4a93ae -Author: green -Date: Wed Aug 4 18:02:34 1999 +0000 - - New file for Kresten's closure work - -commit 2dbf801eb427cbf5021a9e1e512b5fc523524700 -Author: green -Date: Wed Aug 4 18:00:05 1999 +0000 - - Kresten's closure work. Initial checkin. - -commit d170961701b0f2bf7e824d7caba2ebe10002ed84 -Author: green -Date: Thu Jul 8 14:36:52 1999 +0000 - - * configure.in: Add x86 and powerpc BeOS configurations. - From Makoto Kato . - -commit c7747d976924ec6f2229cbcfbbdb98d364e10de9 -Author: jsm -Date: Wed May 12 23:32:16 1999 +0000 - - 1999-05-12 Jason Molenda (jsm@bugshack.cygnus.com) - * index.html: Add links to libffi* mail list archives. - -commit dd2aa9a8de22e26df3bbc85d068358641f6202f7 -Author: green -Date: Thu May 6 05:34:36 1999 +0000 - - * configure.in: Add warning about this being beta code. - Remove src/Makefile.am from the picture. - * configure: Rebuilt. - * Makefile.am: Move logic from src/Makefile.am. Add changes - to support libffi as a target library. - * Makefile.in: Rebuilt. - * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: - Upgraded to new autoconf, automake, libtool. - * README: Tweaks. - * LICENSE: Update copyright date. - * src/Makefile.am, src/Makefile.in: Removed. - -commit 4e9452abed58a3058ccdb446f96a29d50dda1f34 -Author: green -Date: Wed May 5 22:06:13 1999 +0000 - - Updated to new automake, libtool, autoconf - nothing works :-) - -commit 6d3b2bddaf4967fba8b8656c01bfc77ec0f2800c -Author: jsm -Date: Mon Apr 26 15:55:28 1999 +0000 - - 1999-04-26 Jason Molenda (jsm@bugshack.cygnus.com) - * index.html: Missed a reference to libffi-discuss@cygnus.com. Fixed. - -commit ebc6a9c28af831d3d187af8ff17319f0f309bd98 -Author: jsm -Date: Mon Apr 26 15:53:29 1999 +0000 - - 1999-04-26 Jason Molenda (jsm@bugshack.cygnus.com) - * index.html: Change links to ftp directory to point to sourceware - directory. - Change mailing list subscription forms to point to sourceware lists. - -commit 78ffc52a8b257061348c576ccb6fbbf8b48b0fff -Author: jsm -Date: Sun Apr 18 01:33:21 1999 +0000 - - Standard sourceware setup. - -commit b4d77e827d7ebef7e57ebcd71e71c15c62f1e0a8 -Author: jsm -Date: Mon Nov 30 11:11:25 1998 +0000 - - Small typeo. (I wouldn't bother except that it made the sentence hard - for me to parse on a casual read.) - -commit bfb73f08fdc987e37070c5fb0b196fbd28872888 -Author: jsm -Date: Mon Nov 30 10:44:55 1998 +0000 - - A few cleanups. Most notably, point to the correct subscribe cgi-bin - script. - -commit af8b7f037ccee3b7939ee226a1a2bbc2f057b35c -Author: green -Date: Mon Nov 30 06:20:05 1998 +0000 - - * index.html: Reformatted and updated to reflect hosting on - sourceware.cygnus.com (new mailing lists, etc). - -commit 334f0b060942aff8d26badaf7dde7830450dc5da -Author: green -Date: Sun Nov 29 16:56:12 1998 +0000 - - initial snapshot of documentation - -commit 3ab5cb4a1dcc7ecd7e773c97582b0099976c4753 -Author: green -Date: Sun Nov 29 16:56:10 1998 +0000 - - Initial revision - -commit d2a9eb5a8b7cbc8b769809cad59c82b975c178e2 -Merge: d3782ec bc75c54 -Author: green -Date: Sun Nov 29 16:48:16 1998 +0000 - - This commit was generated by cvs2svn to compensate for changes in r7, which - included commits to RCS files with non-trunk default branches. - -commit bc75c54bd311658005b065f1bf201b204c81cbca -Author: green -Date: Sun Nov 29 16:48:16 1998 +0000 - - Import of v1 code. - -commit d3782ec8160c644421dcea17b605fec6e328f14e -Author: jsm -Date: Fri Nov 20 20:18:00 1998 +0000 - - Send commit messages to mailing lists. - -commit 8d8d3843c484c2bb70d8375b2b799f75eb03f709 -Author: jsm -Date: Thu Oct 1 22:08:36 1998 +0000 - - initial checkin - -commit 49634f3bf221cc1939abafc788f7e4e31293fe73 -Author: jsm -Date: Thu Oct 1 22:08:35 1998 +0000 - - Add standard setup. - -commit c64a84c7693f8cd400fb94bba3c9bcfd9ad1fc36 -Author: jsm -Date: Thu Oct 1 22:08:34 1998 +0000 - - Add readers and standard modules file. - -commit 9813273b07fd082da573b3b6bfb8d23809b59eea -Author: jsm -Date: Thu Oct 1 22:08:33 1998 +0000 - - initial checkin diff --git a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi b/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi deleted file mode 100644 index 49ba8dad3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi +++ /dev/null @@ -1,584 +0,0 @@ -2011-02-08 Andreas Tobler - - * testsuite/lib/libffi.exp: Tweak for stand-alone mode. - -2009-12-25 Samuli Suominen - - * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - -2009-06-16 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. - * testsuite/libffi.call/float2.c: Fix dg-excess-errors. - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. - -2009-06-12 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - testsuite/libffi.special/unwindtest.cc: include stdint.h. - -2009-06-11 Timothy Wall - - * Makefile.am, - configure.ac, - include/ffi.h.in, - include/ffi_common.h, - src/closures.c, - src/dlmalloc.c, - src/x86/ffi.c, - src/x86/ffitarget.h, - src/x86/win64.S (new), - README: Added win64 support (mingw or MSVC) - * Makefile.in, - include/Makefile.in, - man/Makefile.in, - testsuite/Makefile.in, - configure, - aclocal.m4: Regenerated - * ltcf-c.sh: properly escape cygwin/w32 path - * man/ffi_call.3: Clarify size requirements for return value. - * src/x86/ffi64.c: Fix filename in comment. - * src/x86/win32.S: Remove unused extern. - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/err_bad_abi.c, - testsuite/libffi.call/err_bad_typedef.c, - testsuite/libffi.call/float2.c, - testsuite/libffi.call/huge_struct.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/return_ldl.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead - of checking for MMAP. Use intptr_t instead of long casts. - -2009-06-04 Andrew Haley - - * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. - -2009-06-04 Andrew Haley - - * src/mips/o32.S, - src/mips/n32.S: Fix licence formatting. - -2009-06-04 Andrew Haley - - * src/x86/darwin.S: Fix licence formatting. - src/x86/win32.S: Likewise. - src/sh64/sysv.S: Likewise. - src/sh/sysv.S: Likewise. - -2009-06-04 Andrew Haley - - * src/sh64/ffi.c: Remove lint directives. Was missing from merge - of Andreas Tobler's patch from 2006-04-22. - -2009-06-04 Andrew Haley - - * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of - 2007-03-07. - -2008-12-26 Timothy Wall - - * testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected - failures on x86_64 cygwin/mingw. - -2008-12-22 Timothy Wall - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_loc_fn0.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: use portable cast from - pointer to integer (intptr_t). - * testsuite/libffi.call/cls_longdouble.c: disable for win64. - -2008-12-19 Anthony Green - - * configure.ac: Bump version to 3.0.8. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-11-11 Anthony Green - - * configure.ac: Bump version to 3.0.7. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-08-25 Andreas Tobler - - * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and - FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. - Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. - Adjust copyright notice. - * src/powerpc/ffi.c: Add two new flags to indicate if we have one - register or two register to use for FFI_SYSV structs. - (ffi_prep_cif_machdep): Pass the right register flag introduced above. - (ffi_closure_helper_SYSV): Fix the return type for - FFI_SYSV_TYPE_SMALL_STRUCT. Comment. - Adjust copyright notice. - -2008-07-24 Anthony Green - - * testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/err_bad_abi.c: Clean up failures from - compiler warnings. - -2008-07-17 Anthony Green - - * configure.ac: Bump version to 3.0.6. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. Add documentation. - * README: Update for new release. - -2008-07-16 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned - int. - -2008-07-16 Kaz Kojima - - * src/sh/sysv.S: Add .note.GNU-stack on Linux. - * src/sh64/sysv.S: Likewise. - -2008-04-03 Anthony Green - - * libffi.pc.in (Libs): Add -L${libdir}. - * configure.ac: Bump version to 3.0.5. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-04-03 Anthony Green - Xerces Ranby - - * include/ffi.h.in: Wrap definition of target architecture to - protect from double definitions. - -2008-03-22 Moriyoshi Koizumi - - * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in - closure_loc_fn0.c. - * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0): - New test. - -2008-03-04 Anthony Green - Blake Chaffin - hos@tamanegi.org - - * testsuite/libffi.call/cls_align_longdouble_split2.c - testsuite/libffi.call/cls_align_longdouble_split.c - testsuite/libffi.call/cls_dbls_struct.c - testsuite/libffi.call/cls_double_va.c - testsuite/libffi.call/cls_longdouble.c - testsuite/libffi.call/cls_longdouble_va.c - testsuite/libffi.call/cls_pointer.c - testsuite/libffi.call/cls_pointer_stack.c - testsuite/libffi.call/err_bad_abi.c - testsuite/libffi.call/err_bad_typedef.c - testsuite/libffi.call/huge_struct.c - testsuite/libffi.call/stret_large2.c - testsuite/libffi.call/stret_large.c - testsuite/libffi.call/stret_medium2.c - testsuite/libffi.call/stret_medium.c: New tests from Apple. - -2008-02-26 Jakub Jelinek - Anthony Green - - * src/alpha/osf.S: Add .note.GNU-stack on Linux. - * src/s390/sysv.S: Likewise. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - * src/x86/unix64.S: Likewise. - * src/x86/sysv.S: Likewise. - * src/sparc/v8.S: Likewise. - * src/sparc/v9.S: Likewise. - * src/m68k/sysv.S: Likewise. - * src/ia64/unix.S: Likewise. - * src/arm/sysv.S: Likewise. - -2008-02-26 Anthony Green - Thomas Heller - - * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C - comment. - -2008-02-26 Anthony Green - Thomas Heller - - * include/ffi.h.in: Change void (*)() to void (*)(void). - -2008-02-26 Anthony Green - Thomas Heller - - * src/alpha/ffi.c: Change void (*)() to void (*)(void). - src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, - src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, - src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, - src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, - src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S, - src/x86/ffi64.c: Ditto. - -2008-02-24 Anthony Green - - * configure.ac: Accept openbsd*, not just openbsd. - Bump version to 3.0.4. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-22 Anthony Green - - * README: Clean up list of tested platforms. - -2008-02-22 Anthony Green - - * configure.ac: Bump version to 3.0.3. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. Clean up test docs. - -2008-02-22 Bjoern Koenig - Andreas Tobler - - * configure.ac: Add amd64-*-freebsd* target. - * configure: Regenerate. - -2008-02-22 Thomas Heller - - * configure.ac: Add x86 OpenBSD support. - * configure: Rebuilt. - -2008-02-21 Thomas Heller - - * README: Change "make test" to "make check". - -2008-02-21 Anthony Green - - * configure.ac: Bump version to 3.0.2. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-21 Björn König - - * src/x86/freebsd.S: New file. - * configure.ac: Add x86 FreeBSD support. - * Makefile.am: Ditto. - -2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.1. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-15 David Daney - - * src/mips/ffi.c: Remove extra '>' from include directive. - (ffi_prep_closure_loc): Use clear_location instead of tramp. - -2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.0. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-15 David Daney - - * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): - Define (conditionally), and use it to include cachectl.h. - (ffi_prep_closure_loc): Fix cache flushing. - * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. - -2008-02-15 Anthony Green - - * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: - Update dates and remove all references to ffi_prep_closure. - * configure.ac: Bump version to 2.99.9. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-15 Anthony Green - - * man/ffi_prep_closure.3: Delete. - * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. - (man_MANS): Ditto. - * man/Makefile.in: Rebuilt. - * configure.ac: Bump version to 2.99.8. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-14 Anthony Green - - * configure.ac: Bump version to 2.99.7. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * include/ffi.h.in LICENSE src/debug.c src/closures.c - src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h - src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c - src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S - src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c - src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c - src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S - src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h - src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c - src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S - src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h - src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h - src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S - src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h - src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S - src/arm/ffitarget.h src/prep_cif.c: Update license text. - -2008-02-14 Anthony Green - - * README: Update tested platforms. - * configure.ac: Bump version to 2.99.6. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * configure.ac: Bump version to 2.99.5. - * configure: Rebuilt. - * Makefile.am (EXTRA_DIST): Add darwin64.S - * Makefile.in: Rebuilt. - * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. - * LICENSE: Update WARRANTY. - -2008-02-14 Anthony Green - - * libffi.pc.in (libdir): Fix libdir definition. - * configure.ac: Bump version to 2.99.4. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * README: Update. - * libffi.info: New file. - * doc/stamp-vti: New file. - * configure.ac: Bump version to 2.99.3. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * Makefile.am (SUBDIRS): Add man dir. - * Makefile.in: Rebuilt. - * configure.ac: Create Makefile. - * configure: Rebuilt. - * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3 - man/Makefile.am man/Makefile.in: New files. - -2008-02-14 Tom Tromey - - * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. - * mdate-sh, texinfo.tex: New files. - * Makefile.am (info_TEXINFOS): New variable. - * doc/libffi.texi: New file. - * doc/version.texi: Likewise. - -2008-02-14 Anthony Green - - * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET). - (lib_LTLIBRARIES): Define. - (toolexeclib_LIBRARIES): Undefine. - * Makefile.in: Rebuilt. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - -2008-02-14 Anthony Green - - * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. - * Makefile.in: Rebuilt. - * LICENSE: Update copyright notice. - -2008-02-14 Anthony Green - - * include/Makefile.am (nodist_includes_HEADERS): Define. Don't - distribute ffitarget.h or ffi.h from the build include dir. - * Makefile.in: Rebuilt. - -2008-02-14 Anthony Green - - * include/Makefile.am (includesdir): Install headers under libdir. - (pkgconfigdir): Define. Install libffi.pc. - * include/Makefile.in: Rebuilt. - * libffi.pc.in: Create. - * libtool-version: Increment CURRENT - * configure.ac: Add libffi.pc.in - * configure: Rebuilt. - -2008-02-03 Anthony Green - - * include/Makefile.am (includesdir): Fix header install with - DESTDIR. - * include/Makefile.in: Rebuilt. - -2008-02-03 Timothy Wall - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return - offset based on code pointer, not data pointer. - -2008-02-01 Anthony Green - - * include/Makefile.am: Fix header installs. - * Makefile.am: Ditto. - * include/Makefile.in: Rebuilt. - * Makefile.in: Ditto. - -2008-02-01 Anthony Green - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL, - FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last - patch. - -2008-01-31 Anthony Green - - * Makefile.am (EXTRA_DIST): Add missing files. - * testsuite/Makefile.am: Ditto. - * Makefile.in, testsuite/Makefile.in: Rebuilt. - -2008-01-31 Timothy Wall - - * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall - closures. - * src/x86/ffitarget.h: Increase size of trampoline for stdcall - closures. - * src/x86/win32.S: Add assembly for stdcall closure. - * src/x86/ffi.c: Initialize stdcall closure trampoline. - -2008-01-30 H.J. Lu - - PR libffi/34612 - * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when - returning struct. - - * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" - tests. - -2008-01-30 Anthony Green - - * Makefile.am, include/Makefile.am: Move headers to - libffi_la_SOURCES for new automake. - * Makefile.in, include/Makefile.in: Rebuilt. - - * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for - execution outside of gcc tree. - * testsuite/lib/target-libpath.exp: Ditto. - - * testsuite/lib/libffi-dg.exp: Many changes to allow for execution - outside of gcc tree. - diff --git a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi-3.1 b/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi-3.1 deleted file mode 100644 index 8f7f50d6f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libffi-3.1 +++ /dev/null @@ -1,6000 +0,0 @@ -2014-03-16 Josh Triplett - - * ChangeLog: Archive to ChangeLog.libffi-3.1 and delete. Future - changelogs will come from git, with autogenerated snapshots shipped in - distributed tarballs. - -2014-03-16 Josh Triplett - - Add support for stdcall, thiscall, and fastcall on non-Windows - x86-32. - - Linux supports the stdcall calling convention, either via - functions explicitly declared with the stdcall attribute, or via - code compiled with -mrtd which effectively makes stdcall the - default. - - This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on - non-Windows x86-32 platforms, as non-default calling conventions. - - * Makefile.am: Compile in src/x86/win32.S on non-Windows x86-32. - * src/x86/ffitarget.h: Add FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32. Increase trampoline size to - accomodate these calling conventions, and unify some ifdeffery. - * src/x86/ffi.c: Add support for FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32 platforms; update ifdeffery. - * src/x86/win32.S: Support compiling on non-Windows x86-32 - platforms. On those platforms, avoid redefining the SYSV symbols - already provided by src/x86/sysv.S. - * testsuite/libffi.call/closure_stdcall.c: Run on non-Windows. - #define __stdcall if needed. - * testsuite/libffi.call/closure_thiscall.c: Run on non-Windows. - #define __fastcall if needed. - * testsuite/libffi.call/fastthis1_win32.c: Run on non-Windows. - * testsuite/libffi.call/fastthis2_win32.c: Ditto. - * testsuite/libffi.call/fastthis3_win32.c: Ditto. - * testsuite/libffi.call/many2_win32.c: Ditto. - * testsuite/libffi.call/many_win32.c: Ditto. - * testsuite/libffi.call/strlen2_win32.c: Ditto. - * testsuite/libffi.call/strlen_win32.c: Ditto. - * testsuite/libffi.call/struct1_win32.c: Ditto. - * testsuite/libffi.call/struct2_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * prep_cif.c: Remove unnecessary ifdef for X86_WIN32. - ffi_prep_cif_core had a special case for X86_WIN32, checking for - FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI - range before returning FFI_BAD_ABI. However, on X86_WIN32, - FFI_THISCALL already falls in that range, making the special case - unnecessary. Remove it. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/closure_thiscall.c: Remove fragile stack - pointer checks. These files included inline assembly to save the - stack pointer before and after the call, and compare the values. - However, compilers can and do leave the stack in different states - for these two pieces of inline assembly, such as by saving a - temporary value on the stack across the call; observed with gcc - -Os, and verified as spurious through careful inspection of - disassembly. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/many.c: Avoid spurious failure due to - excess floating-point precision. - * testsuite/libffi.call/many_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * libtool-ldflags: Re-add. - -2014-03-16 Josh Triplett - - * Makefile.in, aclocal.m4, compile, config.guess, config.sub, - configure, depcomp, include/Makefile.in, install-sh, - libtool-ldflags, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, - m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, - man/Makefile.in, mdate-sh, missing, testsuite/Makefile.in: Delete - autogenerated files from version control. - * .gitignore: Add autogenerated files. - * autogen.sh: New script to generate the autogenerated files. - * README: Document requirement to run autogen.sh when building - directly from version control. - * .travis.yml: Run autogen.sh - -2014-03-14 Anthony Green - - * configure, Makefile.in: Rebuilt. - -2014-03-10 Mike Hommey - - * configure.ac: Allow building for mipsel with Android NDK r8. - * Makefile.am (AM_MAKEFLAGS): Replace double quotes with single - quotes. - -2014-03-10 Landry Breuil - - * configure.ac: Ensure the linker supports @unwind sections in libffi. - -2014-03-01 Anthony Green - - * Makefile.am (EXTRA_DIST): Replace old scripts with - generate-darwin-source-and-headers.py. - * Makefile.in: Rebuilt. - -2014-02-28 Anthony Green - - * Makefile.am (AM_CFLAGS): Reintroduce missing -DFFI_DEBUG for - --enable-debug builds. - * Makefile.in: Rebuilt. - -2014-02-28 Makoto Kato - - * src/closures.c: Fix build failure when using clang for Android. - -2014-02-28 Marcin Wojdyr - - * libffi.pc.in (toolexeclibdir): use -L${toolexeclibdir} instead - of -L${libdir}. - -2014-02-28 Paulo Pizarro - - * src/bfin/sysv.S: Calling functions in shared libraries requires - considering the GOT. - -2014-02-28 Josh Triplett - - * src/x86/ffi64.c (classify_argument): Handle case where - FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE. - -2014-02-28 Anthony Green - - * ltmain.sh: Generate with libtool-2.4.2.418. - * m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4: Ditto. - * configure: Rebuilt. - -2014-02-28 Dominik Vogt - - * configure.ac (AC_ARG_ENABLE struct): Fix typo in help - message. - (AC_ARG_ENABLE raw_api): Ditto. - * configure, fficonfig.h.in: Rebuilt. - -2014-02-28 Will Newton - - * src/arm/sysv.S: Initialize IP register with FP. - -2014-02-28 Yufeng Zhang - - * src/aarch64/sysv.S (ffi_closure_SYSV): Use x29 as the - main CFA reg; update cfi_rel_offset. - -2014-02-15 Marcus Comstedt - - * src/powerpc/ffi_linux64.c, src/powerpc/linux64_closure.S: Remove - assumption on contents of r11 in closure. - -2014-02-09 Heiher - - * src/mips/n32.S: Fix call floating point va function. - -2014-01-21 Zachary Waldowski - - * src/aarch64/ffi.c: Fix missing semicolons on assertions under - debug mode. - -2013-12-30 Zachary Waldowski - - * .gitignore: Exclude darwin_* generated source and build_* trees. - * src/aarch64/ffi.c, src/arm/ffi.c, src/x86/ffi.c: Inhibit Clang - previous prototype warnings. - * src/arm/ffi.c: Prevent NULL dereference, fix short type warning - * src/dlmalloc.c: Fix warnings from set_segment_flags return type, - and the native use of size_t for malloc on platforms - * src/arm/sysv.S: Use unified syntax. Clang clean-ups for - ARM_FUNC_START. - * generate-osx-source-and-headers.py: Remove. - * build-ios.sh: Remove. - * libffi.xcodeproj/project.pbxproj: Rebuild targets. Include - x86_64+aarch64 pieces in library. Export headers properly. - * src/x86/ffi64.c: More Clang warning clean-ups. - * src/closures.c (open_temp_exec_file_dir): Use size_t. - * src/prep_cif.c (ffi_prep_cif_core): Cast ALIGN result. - * 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 - from Clang warnings. Use Clang cache invalidation builtin. Use - size_t in place of unsigned in many places. Accommodate for - differences in Apple AArch64 ABI. - -2013-12-02 Daniel Rodríguez Troitiño - - * generate-darwin-source-and-headers.py: Clean up, modernize, - merged version of previous scripts. - -2013-11-21 Anthony Green - - * configure, Makefile.in, include/Makefile.in, include/ffi.h.in, - man/Makefile.in, testsuite/Makefile.in, fficonfig.h.in: Rebuilt. - -2013-11-21 Alan Modra - - * Makefile.am (EXTRA_DIST): Add new src/powerpc files. - (nodist_libffi_la_SOURCES ): Likewise. - * configure.ac (HAVE_LONG_DOUBLE_VARIANT): Define for powerpc. - * include/ffi.h.in (ffi_prep_types): Declare. - * src/prep_cif.c (ffi_prep_cif_core): Call ffi_prep_types. - * src/types.c (FFI_NONCONST_TYPEDEF): Define and use for - HAVE_LONG_DOUBLE_VARIANT. - * src/powerpc/ffi_powerpc.h: New file. - * src/powerpc/ffi.c: Split into.. - * src/powerpc/ffi_sysv.c: ..new file, and.. - * src/powerpc/ffi_linux64.c: ..new file, rewriting parts. - * src/powerpc/ffitarget.h (enum ffi_abi): Rewrite powerpc ABI - selection as bits controlling features. - * src/powerpc/linux64.S: For consistency, use POWERPC64 rather - than __powerpc64__. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. Move .note.FNU-stack - inside guard. - * src/powerpc/sysv.S: Likewise. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * Makefile.in: Regenerate. - -2013-11-20 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use - NUM_FPR_ARG_REGISTERS64 and NUM_GPR_ARG_REGISTERS64 not their - 32-bit versions for 64-bit code. - * src/powerpc/linux64_closure.S: Don't use the return value area - as a parameter save area on ELFv2. - -2013-11-18 Iain Sandoe - - * src/powerpc/darwin.S (EH): Correct use of pcrel FDE encoding. - * src/powerpc/darwin_closure.S (EH): Likewise. Modernise picbase - labels. - -2013-11-18 Anthony Green - - * src/arm/ffi.c (ffi_call): Hoist declaration of temp to top of - function. - * src/arm/ffi.c (ffi_closure_inner): Moderize function declaration - to appease compiler. - Thanks for Gregory P. Smith . - -2013-11-18 Anthony Green - - * README (tested): Mention PowerPC ELFv2. - -2013-11-16 Alan Modra - - * src/powerpc/ppc_closure.S: Move errant #endif to where it belongs. - Don't bl .Luint128. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use #if _CALL_ELF - test to select parameter save sizing for ELFv2 vs. ELFv1. - * src/powerpc/ffitarget.h (FFI_V2_TYPE_FLOAT_HOMOG, - FFI_V2_TYPE_DOUBLE_HOMOG, FFI_V2_TYPE_SMALL_STRUCT): Define. - (FFI_TRAMPOLINE_SIZE): Define variant for ELFv2. - * src/powerpc/ffi.c (FLAG_ARG_NEEDS_PSAVE): Define. - (discover_homogeneous_aggregate): New function. - (ffi_prep_args64): Adjust start of param save area for ELFv2. - Handle homogenous floating point struct parms. - (ffi_prep_cif_machdep_core): Adjust space calculation for ELFv2. - Handle ELFv2 return values. Set FLAG_ARG_NEEDS_PSAVE. Handle - homogenous floating point structs. - (ffi_call): Increase size of smst_buffer for ELFv2. Handle ELFv2. - (flush_icache): Compile for ELFv2. - (ffi_prep_closure_loc): Set up ELFv2 trampoline. - (ffi_closure_helper_LINUX64): Don't return all structs directly - to caller. Handle homogenous floating point structs. Handle - ELFv2 struct return values. - * src/powerpc/linux64.S (ffi_call_LINUX64): Set up r2 for - ELFv2. Adjust toc save location. Call function pointer using - r12. Handle FLAG_RETURNS_SMST. Don't predict branches. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Set up r2 - for ELFv2. Define ELFv2 versions of STACKFRAME, PARMSAVE, and - RETVAL. Handle possibly missing parameter save area. Handle - ELFv2 return values. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Revert 2013-02-08 - change. Do not consume an int arg when returning a small struct - for FFI_SYSV ABI. - (ffi_call): Only use bounce buffer when FLAG_RETURNS_SMST. - Properly copy bounce buffer to destination. - * src/powerpc/sysv.S: Revert 2013-02-08 change. - * src/powerpc/ppc_closure.S: Remove stray '+'. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args64): Align struct parameters - according to __STRUCT_PARM_ALIGN__. - (ffi_prep_cif_machdep_core): Likewise. - (ffi_closure_helper_LINUX64): Likewise. - -2013-11-16 Alan Modra - - * src/powerpc/linux64.S (ffi_call_LINUX64): Tweak restore of r28. - (.note.GNU-stack): Move inside outer #ifdef. - * src/powerpc/linux64_closure.S (STACKFRAME, PARMSAVE, - RETVAL): Define and use throughout. - (ffi_closure_LINUX64): Save fprs before buying stack. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. - (FFI_EXTRA_CIF_FIELDS): Define. - * src/powerpc/ffi.c (ffi_prep_args64): Save fprs as per the - ABI, not to both fpr and param save area. - (ffi_prep_cif_machdep_core): Renamed from ffi_prep_cif_machdep. - Keep initial flags. Formatting. Remove dead FFI_LINUX_SOFT_FLOAT - code. - (ffi_prep_cif_machdep, ffi_prep_cif_machdep_var): New functions. - (ffi_closure_helper_LINUX64): Pass floating point as per ABI, - not to both fpr and parameter save areas. - - * libffi/testsuite/libffi.call/cls_double_va.c (main): Correct - function cast and don't call ffi_prep_cif. - * libffi/testsuite/libffi.call/cls_longdouble_va.c (main): Likewise. - -2013-11-15 Andrew Haley - - * doc/libffi.texi (Closure Example): Fix the sample code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-15 Andrew Haley - - * testsuite/libffi.call/va_struct1.c (main): Fix broken test. - * testsuite/libffi.call/cls_uint_va.c (cls_ret_T_fn): Likewise - * testsuite/libffi.call/cls_struct_va1.c (test_fn): Likewise. - * testsuite/libffi.call/va_1.c (main): Likewise. - -2013-11-14 David Schneider - - * src/arm/ffi.c: Fix register allocation for mixed float and - doubles. - * testsuite/libffi.call/cls_many_mixed_float_double.c: Testcase - for many mixed float and double arguments. - -2013-11-13 Alan Modra - - * doc/libffi.texi (Simple Example): Correct example code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-13 Anthony Green - - * include/ffi_common.h: Respect HAVE_ALLOCA_H for GNU compiler - based build. (Thanks to tmr111116 on github) - -2013-11-09 Anthony Green - - * m4/libtool.m4: Refresh. - * configure, Makefile.in: Rebuilt. - * README: Add more notes about next release. - -2013-11-09 Shigeharu TAKENO - - * m4/ax_gcc_archflag.m4 (ax_gcc_arch): Don't recognize - UltraSPARC-IIi as ultrasparc3. - -2013-11-06 Mark Kettenis - - * src/x86/freebsd.S (ffi_call_SYSV): Align the stack pointer to - 16-bytes. - -2013-11-06 Konstantin Belousov - - * src/x86/freebsd.S (ffi_closure_raw_SYSV): Mark the assembler - source as not requiring executable stack. - -2013-11-02 Anthony Green - - * doc/libffi.texi (The Basics): Clarify return value buffer size - requirements. Also, NULL result buffer pointers are no longer - supported. - * doc/libffi.info: Rebuilt. - -2013-11-02 Mischa Jonker - - * Makefile.am (nodist_libffi_la_SOURCES): Fix build error. - * Makefile.in: Rebuilt. - -2013-11-02 David Schneider - - * src/arm/ffi.c: more robust argument handling for closures on arm hardfloat - * testsuite/libffi.call/many_mixed.c: New file. - * testsuite/libffi.call/cls_many_mixed_args.c: More tests. - -2013-11-02 Vitaly Budovski - - * src/x86/ffi.c (ffi_prep_cif_machdep): Don't align stack for win32. - -2013-10-23 Mark H Weaver - - * src/mips/ffi.c: Fix handling of uint32_t arguments on the - MIPS N32 ABI. - -2013-10-13 Sandra Loosemore - - * README: Add Nios II to table of supported platforms. - * Makefile.am (EXTRA_DIST): Add nios2 files. - (nodist_libffi_la_SOURCES): Likewise. - * Makefile.in: Regenerated. - * configure.ac (nios2*-linux*): New host. - (NIOS2): Add AM_CONDITIONAL. - * configure: Regenerated. - * src/nios2/ffi.c: New. - * src/nios2/ffitarget.h: New. - * src/nios2/sysv.S: New. - * src/prep_cif.c (initialize_aggregate): Handle extra structure - alignment via FFI_AGGREGATE_ALIGNMENT. - (ffi_prep_cif_core): Conditionalize structure return for NIOS2. - -2013-10-10 Sandra Loosemore - - * testsuite/libffi.call/cls_many_mixed_args.c (cls_ret_double_fn): - Fix uninitialized variable. - -2013-10-11 Marcus Shawcroft - - * testsuite/libffi.call/many.c (many): Replace * with +. - -2013-10-08 Ondřej Bílka - - * src/aarch64/ffi.c, src/aarch64/sysv.S, src/arm/ffi.c, - src/arm/gentramp.sh, src/bfin/sysv.S, src/closures.c, - src/dlmalloc.c, src/ia64/ffi.c, src/microblaze/ffi.c, - src/microblaze/sysv.S, src/powerpc/darwin_closure.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/sh/ffi.c, - src/tile/tile.S, testsuite/libffi.call/nested_struct11.c: Fix - spelling errors. - -2013-10-08 Anthony Green - - * aclocal.m4, compile, config.guess, config.sub, depcomp, - install-sh, mdate-sh, missing, texinfo.tex: Update from upstream. - * configure.ac: Update version to 3.0.14-rc0. - * Makefile.in, configure, Makefile.in, include/Makefile.in, - man/Makefile.in, testsuite/Makefile.in: Rebuilt. - * README: Mention M88K and VAX. - -2013-07-15 Miod Vallat - - * Makefile.am, - configure.ac, - src/m88k/ffi.c, - src/m88k/ffitarget.h, - src/m88k/obsd.S, - src/vax/elfbsd.S, - src/vax/ffi.c, - src/vax/ffitarget.h: Add m88k and vax support. - -2013-06-24 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration - before statements. - (ffi_prep_args64): Support little-endian. - (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. - -2013-06-12 Mischa Jonker - - * configure.ac: Add support for ARC. - * Makefile.am: Likewise. - * README: Add ARC details. - * src/arc/arcompact.S: New. - * src/arc/ffi.c: Likewise. - * src/arc/ffitarget.h: Likewise. - -2013-03-28 David Schneider - - * src/arm/ffi.c: Fix support for ARM hard-float calling convention. - * src/arm/sysv.S: call different methods for SYSV and VFP ABIs. - * testsuite/libffi.call/cls_many_mixed_args.c: testcase for a closure with - mixed arguments, many doubles. - * testsuite/libffi.call/many_double.c: testcase for calling a function using - more than 8 doubles. - * testcase/libffi.call/many.c: use absolute value to check result against an - epsilon - -2013-03-17 Anthony Green - - * README: Update for 3.0.13. - * configure.ac: Ditto. - * configure: Rebuilt. - * doc/*: Update version. - -2013-03-17 Dave Korn - - * src/closures.c (is_emutramp_enabled - [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside - enclosing #if scope. - -2013-03-17 Anthony Green - - * configure.ac: Only modify toolexecdir in certain cases. - * configure: Rebuilt. - -2013-03-16 Gilles Talis - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use - fparg_count,etc on __NO_FPRS__ targets. - -2013-03-16 Alan Hourihane - - * src/m68k/sysv.S (epilogue): Don't use extb instruction on - m680000 machines. - -2013-03-16 Alex Gaynor - - * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. - -2013-03-13 Markos Chandras - - * configure.ac: Add support for Imagination Technologies Meta. - * Makefile.am: Likewise. - * README: Add Imagination Technologies Meta details. - * src/metag/ffi.c: New. - * src/metag/ffitarget.h: Likewise. - * src/metag/sysv.S: Likewise. - -2013-02-24 Andreas Schwab - - * doc/libffi.texi (Structures): Fix missing category argument of - @deftp. - -2013-02-11 Anthony Green - - * configure.ac: Update release number to 3.0.12. - * configure: Rebuilt. - * README: Update release info. - -2013-02-10 Anthony Green - - * README: Add Moxie. - * src/moxie/ffi.c: Created. - * src/moxie/eabi.S: Created. - * src/moxie/ffitarget.h: Created. - * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. - * Makefile.in: Rebuilt. - * configure.ac: Add Moxie. - * configure: Rebuilt. - * testsuite/libffi.call/huge_struct.c: Disable format string - warnings for moxie*-*-elf tests. - -2013-02-10 Anthony Green - - * Makefile.am (LTLDFLAGS): Fix reference. - * Makefile.in: Rebuilt. - -2013-02-10 Anthony Green - - * README: Update supported platforms. Update test results link. - -2013-02-09 Anthony Green - - * testsuite/libffi.call/negint.c: Remove forced -O2. - * testsuite/libffi.call/many2.c (foo): Remove GCCism. - * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. - - * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong - closure return type fix developed by Martin v. Löwis for cpython - fork. - -2013-02-08 Andreas Tobler - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct - support. - * src/powerpc/sysv.S: Ditto. - -2013-02-08 Anthony Green - - * testsuite/libffi.call/cls_longdouble.c: Remove xfail for - arm*-*-*. - -2013-02-08 Anthony Green - - * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. - -2013-02-08 Matthias Klose - - * man/ffi_prep_cif.3: Clean up for debian linter. - -2013-02-08 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed - on the stack. - -2013-02-08 Anthony Green - - * Makefile.am (EXTRA_DIST): Add missing files. - * testsuite/Makefile.am (EXTRA_DIST): Ditto. - * Makefile.in: Rebuilt. - -2013-02-08 Anthony Green - - * configure.ac: Move sparc asm config checks to within functions - for compatibility with sun tools. - * configure: Rebuilt. - * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 - systems. - * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache - flusher. - -2013-02-08 Nathan Rossi - - * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of - small big-endian structures. - (ffi_prep_args): Ditto. - -2013-02-07 Anthony Green - - * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch - (effectively hiding ffi_call_v8). - -2013-02-07 Anthony Green - - * configure.ac: Update bug reporting address. - * configure.in: Rebuild. - - * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for - Sun compiler. - * src/sparc/ffi.c (ffi_call): Remove warning. - Call ffi_flush_icache for non-GCC builds. - (ffi_prep_closure_loc): Use ffi_flush_icache. - - * Makefile.am (EXTRA_DIST): Add libtool-ldflags. - * Makefile.in: Rebuilt. - * libtool-ldflags: New file. - -2013-02-07 Daniel Schepler - - * configure.ac: Correctly identify x32 systems as 64-bit. - * m4/libtool.m4: Remove libtool expr error. - * aclocal.m4, configure: Rebuilt. - -2013-02-07 Anthony Green - - * configure.ac: Fix GCC usage test. - * configure: Rebuilt. - * README: Mention LLVM/GCC x86_64 issue. - * testsuite/Makefile.in: Rebuilt. - -2013-02-07 Anthony Green - - * testsuite/libffi.call/cls_double_va.c (main): Replace // style - comments with /* */ for xlc compiler. - * testsuite/libffi.call/stret_large.c (main): Ditto. - * testsuite/libffi.call/stret_large2.c (main): Ditto. - * testsuite/libffi.call/nested_struct1.c (main): Ditto. - * testsuite/libffi.call/huge_struct.c (main): Ditto. - * testsuite/libffi.call/float_va.c (main): Ditto. - * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. - * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. - * testsuite/libffi.call/cls_pointer.c (main): Ditto. - * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. - -2013-02-06 Anthony Green - - * man/ffi_prep_cif.3: Clean up for debian lintian checker. - -2013-02-06 Anthony Green - - * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. - * Makefile.in: Rebuild. - -2013-02-02 Mark H Weaver - - * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed - via general purpose registers. - -2013-01-21 Nathan Rossi - - * README: Add MicroBlaze details. - * Makefile.am: Add MicroBlaze support. - * configure.ac: Likewise. - * src/microblaze/ffi.c: New. - * src/microblaze/ffitarget.h: Likewise. - * src/microblaze/sysv.S: Likewise. - -2013-01-21 Nathan Rossi - * testsuite/libffi.call/return_uc.c: Fixed issue. - -2013-01-21 Chris Zankel - - * README: Add Xtensa support. - * Makefile.am: Likewise. - * configure.ac: Likewise. - * Makefile.in Regenerate. - * configure: Likewise. - * src/prep_cif.c: Handle Xtensa. - * src/xtensa: New directory. - * src/xtensa/ffi.c: New file. - * src/xtensa/ffitarget.h: Ditto. - * src/xtensa/sysv.S: Ditto. - -2013-01-11 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style - comments with /* */ for xlc compiler. - * src/powerpc/aix.S (ffi_call_AIX): Ditto. - * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete - deprecated inline function. - * testsuite/libffi.special/ffitestcxx.h: Ditto. - * README: Add update for AIX support. - -2013-01-11 Anthony Green - - * configure.ac: Robustify pc relative reloc check. - * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI - changing option for 32-bit x86. - * aclocal.m4, configure: Rebuilt. - * README: Update supported target list. - -2013-01-10 Anthony Green - - * README (tested): Add Compiler column to table. - -2013-01-10 Anthony Green - - * src/x86/ffi64.c (struct register_args): Make sse array and array - of unions for sunpro compiler compatibility. - -2013-01-10 Anthony Green - - * configure.ac: Test target platform size_t size. Handle both 32 - and 64-bit builds for x86_64-* and i?86-* targets (allowing for - CFLAG option to change default settings). - * configure, aclocal.m4: Rebuilt. - -2013-01-10 Anthony Green - - * testsuite/libffi.special/special.exp: Only run exception - handling tests when using GNU compiler. - - * m4/ax_compiler_vendor.m4: New file. - * configure.ac: Test for compiler vendor and don't use - AX_CFLAGS_WARN_ALL with the sun compiler. - * aclocal.m4, configure: Rebuilt. - -2013-01-10 Anthony Green - - * include/ffi_common.h: Don't use GCCisms to define types when - building with the SUNPRO compiler. - -2013-01-10 Anthony Green - - * configure.ac: Put local.exp in the right place. - * configure: Rebuilt. - - * src/x86/ffi.c: Update comment about regparm function attributes. - * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires - that all function arguments be passed on the stack (no regparm - support). - -2013-01-08 Anthony Green - - * configure.ac: Generate local.exp. This sets CC_FOR_TARGET - when we are using the vendor compiler. - * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to - ../local.exp. - * configure, testsuite/Makefile.in: Rebuilt. - - * testsuite/libffi.call/call.exp: Run tests with different - options, depending on whether or not we are using gcc or the - vendor compiler. - * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on - whether or not we are building/testing with gcc. - -2013-01-08 Anthony Green - - * configure.ac: Switch x86 solaris target to X86 by default. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * configure.ac: Fix test for read-only eh_frame. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info - when building with the GNU toolchain. - * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor - compiler. - -2013-01-07 Thorsten Glaser - - * testsuite/libffi.call/cls_uchar_va.c, - testsuite/libffi.call/cls_ushort_va.c, - testsuite/libffi.call/va_1.c: Testsuite fixes. - -2013-01-07 Thorsten Glaser - - * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. - (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. - * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. - -2013-01-04 Anthony Green - - * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions - and -Wall. This is set in the configure script after testing for - GCC. - * Makefile.in: Rebuilt. - -2013-01-02 rofl0r - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc - when long double == double. - -2013-01-02 Reini Urban - - * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS - (required for shared libs on cygwin/mingw). - * Makefile.in: Rebuilt. - -2012-10-31 Alan Modra - - * src/powerpc/linux64_closure.S: Add new ABI support. - * src/powerpc/linux64.S: Likewise. - -2012-10-30 Magnus Granberg - Pavel Labushev - - * configure.ac: New options pax_emutramp - * configure, fficonfig.h.in: Regenerated - * src/closures.c: New function emutramp_enabled_check() and - checks. - -2012-10-30 Frederick Cheung - - * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain - lion) and future version. - * configure: Rebuild. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * README: Add details of aarch64 port. - * src/aarch64/ffi.c: New. - * src/aarch64/ffitarget.h: Likewise. - * src/aarch64/sysv.S: Likewise. - * Makefile.am: Support aarch64. - * configure.ac: Support aarch64. - * Makefile.in, configure: Rebuilt. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * testsuite/lib/libffi.exp: Add support for aarch64. - * testsuite/libffi.call/cls_struct_va1.c: New. - * testsuite/libffi.call/cls_uchar_va.c: Likewise. - * testsuite/libffi.call/cls_uint_va.c: Likewise. - * testsuite/libffi.call/cls_ulong_va.c: Likewise. - * testsuite/libffi.call/cls_ushort_va.c: Likewise. - * testsuite/libffi.call/nested_struct11.c: Likewise. - * testsuite/libffi.call/uninitialized.c: Likewise. - * testsuite/libffi.call/va_1.c: Likewise. - * testsuite/libffi.call/va_struct1.c: Likewise. - * testsuite/libffi.call/va_struct2.c: Likewise. - * testsuite/libffi.call/va_struct3.c: Likewise. - -2012-10-12 Walter Lee - - * Makefile.am: Add TILE-Gx/TILEPro support. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * configure: Likewise. - * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. - * src/tile: New directory. - * src/tile/ffi.c: New file. - * src/tile/ffitarget.h: Ditto. - * src/tile/tile.S: Ditto. - -2012-10-12 Matthias Klose - - * generate-osx-source-and-headers.py: Normalize whitespace. - -2012-09-14 David Edelsohn - - * configure: Regenerated. - -2012-08-26 Andrew Pinski - - PR libffi/53014 - * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with - soft-float. - -2012-08-08 Uros Bizjak - - * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - -2012-07-18 H.J. Lu - - PR libffi/53982 - PR libffi/53973 - * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. - (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. - -2012-05-16 H.J. Lu - - * configure: Regenerated. - -2012-05-05 Nicolas Lelong - - * libffi.xcodeproj/project.pbxproj: Fixes. - * README: Update for iOS builds. - -2012-04-23 Alexandre Keunecke I. de Mendonca - - * configure.ac: Add Blackfin/sysv support - * Makefile.am: Add Blackfin/sysv support - * src/bfin/ffi.c: Add Blackfin/sysv support - * src/bfin/ffitarget.h: Add Blackfin/sysv support - -2012-04-11 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new script. - * Makefile.in: Rebuilt. - -2012-04-11 Zachary Waldowski - - * generate-ios-source-and-headers.py, - libffi.xcodeproj/project.pbxproj: Support a Mac static library via - Xcode. Set iOS compatibility to 4.0. Move iOS trampoline - generation into an Xcode "run script" phase. Include both as - Xcode build scripts. Don't always regenerate config files. - -2012-04-10 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. - -2012-04-06 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. - * Makefile.in: Rebuilt. - -2012-04-06 Mike Lewis - - * generate-ios-source-and-headers.py: New file. - * libffi.xcodeproj/project.pbxproj: New file. - * README: Update instructions on building iOS binary. - * build-ios.sh: Delete. - -2012-04-06 Anthony Green - - * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU - compilers, then use it. - -2012-04-06 H.J. Lu - - * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. - -2012-04-06 Anthony Green - - * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. - * testsuite/Makefile.in: Rebuilt. - -2012-04-05 Zachary Waldowski - - * include/ffi.h.in: Add missing trampoline table fields. - * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references - in CNAME. - * src/x86/ffi.c: Wrap Windows specific code in ifdefs. - -2012-04-02 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. - Silence casting pointer to integer of different size warning. - Delete goto to previously deleted label. - (ffi_call): Silence possibly undefined warning. - (ffi_closure_helper_SYSV): Declare variable type. - -2012-04-02 Peter Rosin - - * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return - value in the Intel version as is already done for the AT&T version. - (ffi_closure_SYSV): Likewise. - (ffi_closure_raw_SYSV): Likewise. - (ffi_closure_STDCALL): Likewise. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame - generation, fix the ENDP label and remove the surplus third arg - from the 'lea' insn. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label - visible outside the PROC, so that ffi_closure_raw_THISCALL can see - it. Also instruct the assembler to add a frame to the function. - -2012-03-23 Peter Rosin - - * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. - * Makefile.in: Rebuilt. - * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations - to all data exports, when compiling libffi clients using MSVC. - -2012-03-29 Peter Rosin - - * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and - make it the default for MSVC. - (FFI_TYPE_MS_STRUCT): New structure return convention. - * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure - return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT - instead of an ordinary FFI_TYPE_STRUCT. - (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_call): Likewise. - (ffi_prep_incoming_args_SYSV): Likewise. - (ffi_raw_call): Likewise. - (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. - * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, - return a pointer to the result structure in eax and don't pop - that pointer from the stack, the caller takes care of it. - (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_closure_raw_SYSV): Likewise. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline - assembly version with Intel syntax. - * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. - -2012-03-23 Peter Rosin - - * testsuite/libffi.call/ffitest.h: Provide abstration of - __attribute__((fastcall)) in the form of a __FASTCALL__ - define. Define it to __fastcall for MSVC. - * testsuite/libffi.call/fastthis1_win32.c: Use the above. - * testsuite/libffi.call/fastthis2_win32.c: Likewise. - * testsuite/libffi.call/fastthis3_win32.c: Likewise. - * testsuite/libffi.call/strlen2_win32.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2_win32.c: Likewise. - -2012-03-22 Peter Rosin - - * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual - frame on function entry, MASM adds one automatically. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing - bits in the MSVC headers. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style - with no declarations after statements. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5_1_byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6_1_byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7_1_byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_dbls_struct.c: Likewise. - * testsuite/libffi.call/cls_pointer_stack.c: Likewise. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - * testsuite/libffi.call/huge_struct.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct10.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/nested_struct4.c: Likewise. - * testsuite/libffi.call/nested_struct5.c: Likewise. - * testsuite/libffi.call/nested_struct6.c: Likewise. - * testsuite/libffi.call/nested_struct7.c: Likewise. - * testsuite/libffi.call/nested_struct8.c: Likewise. - * testsuite/libffi.call/nested_struct9.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_medium2.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2.c: Likewise. - * testsuite/libffi.call/struct2_win32.c: Likewise. - * testsuite/libffi.call/struct3.c: Likewise. - * testsuite/libffi.call/struct4.c: Likewise. - * testsuite/libffi.call/struct5.c: Likewise. - * testsuite/libffi.call/struct6.c: Likewise. - * testsuite/libffi.call/struct7.c: Likewise. - * testsuite/libffi.call/struct8.c: Likewise. - * testsuite/libffi.call/struct9.c: Likewise. - * testsuite/libffi.call/testclosure.c: Likewise. - -2012-03-21 Peter Rosin - - * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when - printing doubles (%lf is for long doubles). - (main): Likewise. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-19 Alan Hourihane - - * src/m68k/ffi.c: Add MINT support. - * src/m68k/sysv.S: Ditto. - -2012-03-06 Chung-Lin Tang - - * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to - ffi_call_VFP(). - (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of - ffi_closure_VFP. - * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. - -2012-03-19 chennam - - * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure - support. - -2012-03-13 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. - -2012-03-09 David Edelsohn - - * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 - change to return value of ffi_closure_helper_DARWIN and load type - from return type. - -2012-03-03 H.J. Lu - - * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned - long. - (ffi_prep_closure_loc): Cast to 64bit address in trampoline. - (ffi_closure_unix64_inner): Cast return pointer to unsigned long - first. - - * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. - (ffi_arg): Set to unsigned long long for x32. - (ffi_sarg): Set to long long for x32. - -2012-03-03 H.J. Lu - - * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. - -2012-03-03 Andoni Morales Alastruey - - * configure.ac: Add -no-undefined for both 32- and 64-bit x86 - windows-like hosts. - * configure: Rebuilt. - -2012-02-27 Mikael Pettersson - - PR libffi/52223 - * Makefile.am (FLAGS_TO_PASS): Define. - * Makefile.in: Regenerate. - -2012-02-23 Anthony Green - - * src/*/ffitarget.h: Ensure that users never include ffitarget.h - directly. - -2012-02-23 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_closure_raw_THISCALL): New - prototype. - (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for - thiscall-convention. - (ffi_raw_call): Use ffi_prep_args_raw. - * src/x86/win32.S (ffi_closure_raw_THISCALL): Add - implementation for stub. - -2012-02-10 Kai Tietz - - * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 - windows target. - * configure: Regenerated. - -2012-02-08 Kai Tietz - - * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 - also FFI_THISCALL. - * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. - (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. - (ffi_prep_closure_loc): Add FFI_THISCALL support. - * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. - * src/x86/win32.S (ffi_closure_THISCALL): New closure code - for thiscall-calling convention. - * testsuite/libffi.call/closure_thiscall.c: New test. - -2012-01-28 Kai Tietz - - * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new - argument to prototype for specify calling-convention. - (ffi_call): Add support for stdcall/thiscall convention. - (ffi_prep_args): Likewise. - (ffi_raw_call): Likewise. - * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and - FFI_FASTCALL. - * src/x86/win32.S (_ffi_call_win32): Add support for - fastcall/thiscall calling-convention calls. - * testsuite/libffi.call/fastthis1_win32.c: New test. - * testsuite/libffi.call/fastthis2_win32.c: New test. - * testsuite/libffi.call/fastthis3_win32.c: New test. - * testsuite/libffi.call/strlen2_win32.c: New test. - * testsuite/libffi.call/many2_win32.c: New test. - * testsuite/libffi.call/struct1_win32.c: New test. - * testsuite/libffi.call/struct2_win32.c: New test. - -2012-01-23 Uros Bizjak - - * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. - -2012-01-23 Anthony Green - Chris Young - - * configure.ac: Add Amiga support. - * configure: Rebuilt. - -2012-01-23 Dmitry Nadezhin - - * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. - -2012-01-23 Andreas Schwab - - * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain - mc68000. Test for __HAVE_68881__ in addition to __MC68881__. - -2012-01-19 Jakub Jelinek - - PR rtl-optimization/48496 - * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. - -2012-01-09 Rainer Orth - - * configure.ac (i?86-*-*): Set TARGET to X86_64. - * configure: Regenerate. - -2011-12-07 Andrew Pinski - - PR libffi/50051 - * src/mips/n32.S: Add ".set mips4". - -2011-11-21 Andreas Tobler - - * configure: Regenerate. - -2011-11-12 David Gilbert - - * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, - man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, - man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, - src/cris/ffi.c, src/prep_cif.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/float_va.c: Many changes to support variadic - function calls. - -2011-11-12 Kyle Moffett - - * src/powerpc/ffi.c, src/powerpc/ffitarget.h, - src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for - softfloat powerpc variants. - -2011-11-12 Petr Salinger - - * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. - * configure: Rebuilt. - -2011-11-12 Timothy Wall - - * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max - alignment of 4 for wince on ARM. - -2011-11-12 Kyle Moffett - Anthony Green - - * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string - instructions (not available on some cores, like the PPC440). - -2011-11-12 Kimura Wataru - - * m4/ax_enable_builddir: Change from string comparison to numeric - comparison for wc output. - * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS - X 10.7. - * configure: Rebuilt. - -2011-11-12 Anthony Green - - * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly - files with debug info. - * Makefile.in: Rebuilt. - -2011-11-12 Jasper Lievisse Adriaanse - - * README: Update list of supported OpenBSD systems. - -2011-11-12 Anthony Green - - * libtool-version: Update. - * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if - FFI_DEBUG. - (libffi_la_SOURCES): Remove src/debug.c - (EXTRA_DIST): Add src/debug.c - * Makefile.in: Rebuilt. - * README: Update for 3.0.11. - -2011-11-10 Richard Henderson - - * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. - * configure, aclocal.m4: Rebuild. - -2011-09-04 Iain Sandoe - - PR libffi/49594 - * src/powerpc/darwin_closure.S (stubs): Make the stub binding - helper reference track the architecture pointer size. - -2011-08-25 Andrew Haley - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly - instructions. - * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. - -2011-07-11 Andrew Haley - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. - -2011-06-29 Rainer Orth - - * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. - * testsuite/libffi.call/cls_longdouble_va.c: Likewise. - -2011-06-29 Rainer Orth - - PR libffi/46660 - * testsuite/libffi.call/cls_double_va.c: xfail dg-output on - mips-sgi-irix6*. - * testsuite/libffi.call/cls_longdouble_va.c: Likewise. - -2011-06-14 Rainer Orth - - * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, - PRId8 instead of %hhu, %hhd. - * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, - PRIu8): Define. - [__sgi__] (PRId8, PRIu8): Define. - -2011-04-29 Rainer Orth - - * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): - Define. - Use them to handle ELF vs. ECOFF differences. - [__osf__] (_GLOBAL__F_ffi_call_osf): Define. - -2011-03-30 Timothy Wall - - * src/powerpc/darwin.S: Fix unknown FDE encoding. - * src/powerpc/darwin_closure.S: ditto. - -2011-02-25 Anthony Green - - * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more - 32-bit ABIs. - -2011-02-15 Anthony Green - - * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. - * configure: Rebuilt. - -2011-02-13 Ralf Wildenhues - - * configure: Regenerate. - -2011-02-13 Anthony Green - - * include/ffi_common.h (UNLIKELY, LIKELY): Define. - * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. - * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. - - * src/prep_cif.c (initialize_aggregate): Convert assertion into - FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. - - * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. - * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. - * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. - * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. - * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. - -2011-02-11 Anthony Green - - * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - -2012-02-11 Eric Botcazou - - * src/sparc/v9.S (STACKFRAME): Bump to 176. - -2011-02-09 Stuart Shelton - - http://bugs.gentoo.org/show_bug.cgi?id=286911 - * src/mips/ffitarget.h: Clean up error messages. - * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to - ffi_raw*. - * include/ffi.h.in: Add pragma for SGI compiler. - -2011-02-09 Anthony Green - - * configure.ac: Add powerpc64-*-darwin* support. - -2011-02-09 Anthony Green - - * README: Mention Interix. - -2011-02-09 Jonathan Callen - - * configure.ac: Add Interix to win32/cygwin/mingw case. - * configure: Ditto. - * src/closures.c: Treat Interix like Cygwin, instead of as a - generic win32. - -2011-02-09 Anthony Green - - * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. - * testsuite/libffi.call/err_bad_abi.c: Remove xfail. - * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. - (ffi_prep_closure_loc): Check for bad ABI. - * src/prep_cif.c (UNLIKELY, LIKELY): Define. - (initialize_aggregate): Check for bad types. - -2011-02-09 Landon Fuller - - * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, - src/arm/trampoline.S. - (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. - * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. - * src/arm/ffi.c (ffi_trampoline_table) - (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) - (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) - (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) - (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): - Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). - (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case - separately. - * src/arm/sysv.S: Handle Apple iOS host. - * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. - * build-ios.sh: New file. - * fficonfig.h.in, configure, Makefile.in: Rebuilt. - * README: Mention ARM iOS. - -2011-02-08 Oren Held - - * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid - redefinition of mallinfo on HP-UX. - -2011-02-08 Ginn Chen - - * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio - aggregate return ABI. Flush cache. - (ffi_prep_closure_loc): Flush cache. - -2011-02-11 Anthony Green - - From Tom Honermann : - * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on - AIX. Declare .ffi_prep_args. Insert nops after branch - instructions so that the AIX linker can insert TOC reload - instructions. - * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. - -2011-02-08 Ed - - * src/powerpc/asm.h: Fix grammar nit in comment. - -2011-02-08 Uli Link - - * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. - -2011-02-09 Rainer Orth - - PR libffi/46661 - * testsuite/libffi.call/cls_pointer.c (main): Cast void * to - uintptr_t first. - * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. - -2011-02-08 Rafael Avila de Espindola - - * configure.ac: Fix x86 test for pc related relocs. - * configure: Rebuilt. - -2011-02-07 Joel Sherrill - - * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. - Handle case when CPU variant does not have long double support. - * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, - and cores with soft floating point. - -2011-02-07 Joel Sherrill - - * configure.ac: Add mips*-*-rtems* support. - * configure: Regenerate. - * src/mips/ffitarget.h: Ensure needed constants are available - for targets which do not have sgidefs.h. - -2011-01-26 Dave Korn - - PR target/40125 - * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. - * configure: Regenerate. - -2010-12-18 Iain Sandoe - - PR libffi/29152 - PR libffi/42378 - * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, - update comments. - * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, - (FFI_TRAMPOLINE_SIZE): Update for Darwin64. - * src/powerpc/darwin.S: Provide Darwin64 implementation, - update comments. - * src/powerpc/ffi_darwin.c: Likewise. - -2010-12-06 Rainer Orth - - * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double - backslashes. - (libffi_cv_as_string_pseudo_op): Likewise. - * configure: Regenerate. - -2010-12-03 Chung-Lin Tang - - * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. - (ffi_closure_VFP): Same. - (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' - directive. - -2010-12-01 Rainer Orth - - * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. - (PRIuPTR): Define. - -2010-11-29 Richard Henderson - Rainer Orth - - * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. - (.eh_frame): Use FDE_ENCODING. - (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. - -2010-11-22 Jacek Caban - - * configure.ac: Check for symbol underscores on mingw-w64. - * configure: Rebuilt. - * src/x86/win64.S: Correctly access extern symbols in respect to - underscores. - -2010-11-15 Rainer Orth - - * testsuite/lib/libffi-dg.exp: Rename ... - * testsuite/lib/libffi.exp: ... to this. - * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. - * libffi/testsuite/libffi.special/special.exp: Likewise. - -2010-10-28 Chung-Lin Tang - - * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling - code, new parameter, and return value. Update comments. - (ffi_prep_cif_machdep): Add case for VFP struct return values. Add - call to layout_vfp_args(). - (ffi_call_SYSV): Update declaration. - (ffi_call_VFP): New declaration. - (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() - when ABI is FFI_VFP. - (ffi_closure_VFP): New declaration. - (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to - ffi_prep_incoming_args_SYSV(). - (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument - case handling. - (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline - construction under VFP hard-float. - (rec_vfp_type_p): New function. - (vfp_type_p): Same. - (place_vfp_arg): Same. - (layout_vfp_args): Same. - * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI - based on __ARM_PCS_VFP. - (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific - fields. - (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. - (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. - * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to - direct call. Move function pointer load upwards. - (ffi_call_VFP): New function. - (ffi_closure_VFP): Same. - - * testsuite/lib/libffi-dg.exp (check-flags): New function. - (dg-skip-if): New function. - * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* - and compiler options include -mfloat-abi=hard. - * testsuite/libffi.call/cls_longdouble_va.c: Same. - -2010-10-01 Jakub Jelinek - - PR libffi/45677 - * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is - a multiple of 8. - * testsuite/libffi.call/many2.c: New test. - -2010-08-20 Mark Wielaard - - * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r - returns NULL. - -2010-08-09 Andreas Tobler - - * configure.ac: Add target powerpc64-*-freebsd*. - * configure: Regenerate. - * testsuite/libffi.call/cls_align_longdouble_split.c: Pass - -mlong-double-128 only to linux targets. - * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. - * testsuite/libffi.call/cls_longdouble.c: Likewise. - * testsuite/libffi.call/huge_struct.c: Likewise. - -2010-08-05 Dan Witte - - * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the - debug CRT when --enable-debug is given. - * configure.ac: Define it. - * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. - -2010-08-04 Dan Witte - - * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 - platforms. - * src/x86/ffi.c: Remove redundant ifdef checks. - * src/prep_cif.c: Push stack space computation into src/x86/ffi.c - for X86_ANY so return value space doesn't get added twice. - -2010-08-03 Neil Rashbrooke - - * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. - -2010-07-22 Dan Witte - - * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. - * src/prep_cif.c: Fix ABI assertion. - * src/cris/ffi.c: Ditto. - -2010-07-10 Evan Phoenix - - * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. - -2010-07-07 Dan Horák - - * include/ffi.h.in: Protect #define with #ifndef. - * src/powerpc/ffitarget.h: Ditto. - * src/s390/ffitarget.h: Ditto. - * src/sparc/ffitarget.h: Ditto. - -2010-07-07 Neil Roberts - - * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to - 16-bytes. - -2010-07-02 Jakub Jelinek - - * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. - * Makefile.in: Regenerated. - -2010-05-19 Rainer Orth - - * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as - output, too. - (libffi_cv_as_ascii_pseudo_op): Check for .ascii. - (libffi_cv_as_string_pseudo_op): Check for .string. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. - -2010-05-11 Dan Witte - - * doc/libffi.tex: Document previous change. - -2010-05-11 Makoto Kato - - * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. - -2010-05-05 Michael Kohler - - * src/dlmalloc.c (dlfree): Fix spelling. - * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. - * configure.ac: Ditto. - * configure: Rebuilt. - -2010-04-13 Dan Witte - - * msvcc.sh: Build with -W3 instead of -Wall. - * src/powerpc/ffi_darwin.c: Remove build warnings. - * src/x86/ffi.c: Ditto. - * src/x86/ffitarget.h: Ditto. - -2010-04-12 Dan Witte - Walter Meinl - - * configure.ac: Add OS/2 support. - * configure: Rebuilt. - * src/closures.c: Ditto. - * src/dlmalloc.c: Ditto. - * src/x86/win32.S: Ditto. - -2010-04-07 Jakub Jelinek - - * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. - -2010-04-02 Ralf Wildenhues - - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2010-03-30 Dan Witte - - * msvcc.sh: Disable build warnings. - * README (tested): Clarify windows build procedure. - -2010-03-15 Rainer Orth - - * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * libffi/src/x86/unix64.S (.eh_frame) - [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. - -2010-03-14 Matthias Klose - - * src/x86/ffi64.c: Fix typo in comment. - * src/x86/ffi.c: Use /* ... */ comment style. - -2010-02-24 Rainer Orth - - * doc/libffi.texi (The Closure API): Fix typo. - * doc/libffi.info: Remove. - -2010-02-15 Matthias Klose - - * src/arm/sysv.S (__ARM_ARCH__): Define for processor - __ARM_ARCH_7EM__. - -2010-01-15 Anthony Green - - * README: Add notes on building with Microsoft Visual C++. - -2010-01-15 Daniel Witte - - * msvcc.sh: New file. - - * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. - * src/x86/ffi.c: Tweak function declaration and remove excess - parens. - * include/ffi.h.in: Add __declspec(align(8)) to typedef struct - ffi_closure. - - * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new - function ffi_call_win32 on X86_WIN32. - * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. - (ffi_call_STDCALL): Remove. - - * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code - to ffi_prep_cif_machdep for x86. - * src/x86/ffi.c (ffi_prep_cif_machdep): To here. - -2010-01-15 Oliver Kiddle - - * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for - Sun Studio compiler compatibility. - -2010-01-12 Conrad Irwin - - * doc/libffi.texi: Add closure example. - -2010-01-07 Rainer Orth - - PR libffi/40701 - * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, - PRIuLL, PRId64, PRIu64, PRIuPTR): Define. - * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on - alpha*-dec-osf*. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/return_ll1.c: Likewise. - * testsuite/libffi.call/stret_medium2.c: Likewise. - * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast - MAP_FAILED to char *. - -2010-01-06 Rainer Orth - - * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. - -2009-12-31 Anthony Green - - * README: Update for libffi 3.0.9. - -2009-12-27 Matthias Klose - - * configure.ac (HAVE_LONG_DOUBLE): Define for mips when - appropriate. - * configure: Rebuilt. - -2009-12-26 Anthony Green - - * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for - avr32*-*-*. - * testsuite/libffi.call/cls_double_va.c: Ditto. - -2009-12-26 Andreas Tobler - - * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h - and inttypes.h. - * testsuite/libffi.special/unwindtest.cc: Ditto. - -2009-12-26 Andreas Tobler - - * configure.ac: Add amd64-*-openbsd*. - * configure: Rebuilt. - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link - openbsd programs with -lpthread. - -2009-12-26 Anthony Green - - * testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for - mips*-*-* and arm*-*-*. - * testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. - -2009-12-31 Kay Tietz - - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix - definitions. - -2009-12-31 Carlo Bramini - - * configure.ac (AM_LTLDFLAGS): Define for windows hosts. - * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. - * configure: Rebuilt. - * Makefile.in: Rebuilt. - -2009-12-31 Anthony Green - Blake Chaffin. - - * testsuite/libffi.call/huge_struct.c: New test case from Blake - Chaffin @ Apple. - -2009-12-28 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to - local variables. - (aix_adjust_aggregate_sizes): New function. - (ffi_prep_cif_machdep): Call it. - -2009-12-26 Andreas Tobler - - * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. - * configure: Regenerate. - * fficonfig.h.in: Likewise. - * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for - Solaris/x86. - -2009-12-26 Andreas Schwab - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count - when a float arguments is passed in memory. - (ffi_closure_helper_SYSV): Mark general registers as used up when - a 64bit or soft-float long double argument is passed in memory. - -2009-12-25 Matthias Klose - - * man/ffi_call.3: Fix #include in examples. - * doc/libffi.texi: Add dircategory. - -2009-12-25 Frank Everdij - - * include/ffi.h.in: Placed '__GNUC__' ifdef around - '__attribute__((aligned(8)))' in ffi_closure, fixes compile for - IRIX MIPSPro c99. - * include/ffi_common.h: Added '__sgi' define to non - '__attribute__((__mode__()))' integer typedefs. - * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, - ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. - (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added - FFI_LONGDOUBLE support and alignment(N32 only). - * src/mips/ffitarget.h: Corrected '#include ' for IRIX and - fixed non '__attribute__((__mode__()))' integer typedefs. - * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' - since they are Linux/GNU Assembler specific. - -2009-12-25 Bradley Smith - - * configure.ac, Makefile.am, src/avr32/ffi.c, - src/avr32/ffitarget.h, - src/avr32/sysv.S: Add AVR32 port. - * configure, Makefile.in: Rebuilt. - -2009-12-21 Andreas Tobler - - * configure.ac: Make i?86 build on FreeBSD and OpenBSD. - * configure: Regenerate. - -2009-12-15 John David Anglin - - * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. - -2009-12-13 John David Anglin - - * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE - type on HP-UX. - -2012-02-13 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall - support for X86_WIN32. - (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. - -2009-12-11 Eric Botcazou - - * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long - double' arguments. - -2009-12-11 Eric Botcazou - - * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. - -2009-12-10 Rainer Orth - - PR libffi/40700 - * src/closures.c [X86_64 && __sun__ && __svr4__] - (FFI_MMAP_EXEC_WRIT): Define. - -2009-12-08 David Daney - - * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* - * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. - * testsuite/libffi.call/stret_large.c: Same. - * testsuite/libffi.call/cls_align_longdouble_split.c: Same. - * testsuite/libffi.call/stret_large2.c: Same. - * testsuite/libffi.call/stret_medium2.c: Same. - -2009-12-07 David Edelsohn - - * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump - typo. - -2009-12-05 David Edelsohn - - * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 - code. - * src/powerpc/aix_closure.S: Same. - -2009-12-05 Ralf Wildenhues - - * Makefile.in: Regenerate. - * configure: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2009-12-04 David Edelsohn - - * src/powerpc/aix_closure.S: Reorganize 64-bit code to match - linux64_closure.S. - -2009-12-04 Uros Bizjak - - PR libffi/41908 - * src/x86/ffi64.c (classify_argument): Update from - gcc/config/i386/i386.c. - (ffi_closure_unix64_inner): Do not use the address of two consecutive - SSE registers directly. - * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail - for x86_64 linux targets. - -2009-12-04 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment - pfr for long double split between fpr13 and stack. - -2009-12-03 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and - fparg_count twice for long double. - -2009-12-03 David Edelsohn - - PR libffi/42243 - * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. - -2009-12-03 Uros Bizjak - - * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. - Remove xfails for x86 linux targets. - -2009-12-02 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 - case. - -2009-12-01 David Edelsohn - - * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard - register usage. Call ffi_prep_args directly. Add long double - return value support. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment - applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. - Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. - (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit - mode. - (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp - into case. - * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. - Allocate result area between params and FPRs. - -2009-11-30 David Edelsohn - - PR target/35484 - * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and - AIX64. - * src/powerpc/aix.S: Implement AIX64 version. - * src/powerpc/aix_closure.S: Implement AIX64 version. - (ffi_closure_ASM): Use extsb, lha and displament addresses. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 - support. - (ffi_prep_cif_machdep): Same. - (ffi_call): Same. - (ffi_closure_helper_DARWIN): Same. - -2009-11-02 Andreas Tobler - - PR libffi/41908 - * testsuite/libffi.call/testclosure.c: New test. - -2009-09-28 Kai Tietz - - * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu - assembly version use of ___chkstk. - -2009-09-23 Matthias Klose - - PR libffi/40242, PR libffi/41443 - * src/arm/sysv.S (__ARM_ARCH__): Define for processors - __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, - __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. - Change the conditionals to __SOFTFP__ || __ARM_EABI__ - for -mfloat-abi=softfp to work. - -2009-09-17 Loren J. Rittle - - PR testsuite/32843 (strikes again) - * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to - enable proper extension on char and short. - -2009-09-15 David Daney - - * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special - handling for FFI_TYPE_POINTER. - * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, - FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, - FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, - FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. - (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. - (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. - * src/mips/n32.S (ffi_call_N32): Add handling for soft-float - structure and pointer returns. - (ffi_closure_N32): Add handling for pointer returns. - * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, - calc_n32_return_struct_flags): Handle soft-float. - (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. - (ffi_call_N32): Declare proper argument types. - (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle - soft-float. - -2009-08-24 Ralf Wildenhues - - * configure.ac (AC_PREREQ): Bump to 2.64. - -2009-08-22 Ralf Wildenhues - - * Makefile.am (install-html, install-pdf): Remove. - * Makefile.in: Regenerate. - - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2011-08-22 Jasper Lievisse Adriaanse - - * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. - * configure: Rebuilt. - -2009-07-30 Ralf Wildenhues - - * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. - -2009-07-24 Dave Korn - - PR libffi/40807 - * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending - return types for X86_WIN32. - * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. - (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, - _ffi_closure_STDCALL): Likewise. - - * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. - (dlmmap, dlmunmap): Also use these functions on Cygwin. - -2009-07-11 Richard Sandiford - - PR testsuite/40699 - PR testsuite/40707 - PR testsuite/40709 - * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and - 2009-06-30 commits. - -2009-07-01 Richard Sandiford - - * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path - to "" before adding paths. (This reinstates an assignment that - was removed by my 2009-06-30 commit, but changes the initial - value from "." to "".) - -2009-07-01 H.J. Lu - - PR testsuite/40601 - * testsuite/lib/libffi-dg.exp (libffi-init): Properly set - gccdir. Adjust ld_library_path for gcc only if gccdir isn't - empty. - -2009-06-30 Richard Sandiford - - * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." - to ld_library_path. Use add_path. Add just find_libgcc_s - to ld_library_path, not every libgcc multilib directory. - -2009-06-16 Wim Lewis - - * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are - supposed to be callee-saved. - * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of - return buffer for odd-size structs. - -2009-06-16 Andreas Tobler - - PR libffi/40444 - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add - allow_stack_execute for Darwin. - -2009-06-16 Andrew Haley - - * configure.ac (TARGETDIR): Add missing blank lines. - * configure: Regenerate. - -2009-06-16 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. - -2009-06-15 Andrew Haley - - * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. - * testsuite/libffi.call/err_bad_abi.c: Likewise. - -2009-06-12 Andrew Haley - - * Makefile.am: Remove info_TEXINFOS. - -2009-06-12 Andrew Haley - - * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - testsuite/libffi.special/unwindtest.cc: include stdint.h. - -2009-06-11 Timothy Wall - - * Makefile.am, - configure.ac, - include/ffi.h.in, - include/ffi_common.h, - src/closures.c, - src/dlmalloc.c, - src/x86/ffi.c, - src/x86/ffitarget.h, - src/x86/win64.S (new), - README: Added win64 support (mingw or MSVC) - * Makefile.in, - include/Makefile.in, - man/Makefile.in, - testsuite/Makefile.in, - configure, - aclocal.m4: Regenerated - * ltcf-c.sh: properly escape cygwin/w32 path - * man/ffi_call.3: Clarify size requirements for return value. - * src/x86/ffi64.c: Fix filename in comment. - * src/x86/win32.S: Remove unused extern. - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/err_bad_abi.c, - testsuite/libffi.call/err_bad_typedef.c, - testsuite/libffi.call/float2.c, - testsuite/libffi.call/huge_struct.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/return_ldl.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead - of checking for MMAP. Use intptr_t instead of long casts. - -2009-06-11 Kaz Kojima - - * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. - * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - -2009-06-09 Andrew Haley - - * src/x86/freebsd.S: Add missing file. - -2009-06-08 Andrew Haley - - Import from libffi 3.0.8: - - * doc/libffi.texi: New file. - * doc/libffi.info: Likewise. - * doc/stamp-vti: Likewise. - * man/Makefile.am: New file. - * man/ffi_call.3: New file. - - * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, - src/dlmalloc.c. - (nodist_libffi_la_SOURCES): Add X86_FREEBSD. - - * configure.ac: Bump version to 3.0.8. - parisc*-*-linux*: Add. - i386-*-freebsd* | i386-*-openbsd*: Add. - powerpc-*-beos*: Add. - AM_CONDITIONAL X86_FREEBSD: Add. - AC_CONFIG_FILES: Add man/Makefile. - - * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). - -2009-06-08 Andrew Haley - - * README: Import from libffi 3.0.8. - -2009-06-08 Andrew Haley - - * testsuite/libffi.call/err_bad_abi.c: Add xfails. - * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. - * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. - * testsuite/libffi.call/err_bad_typedef.c: Add xfails. - - * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - -2008-12-26 Timothy Wall - - * testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected - failures on x86_64 cygwin/mingw. - -2008-12-22 Timothy Wall - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_loc_fn0.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: use portable cast from - pointer to integer (intptr_t). - * testsuite/libffi.call/cls_longdouble.c: disable for win64. - -2008-07-24 Anthony Green - - * testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/err_bad_abi.c: Clean up failures from - compiler warnings. - -2008-03-04 Anthony Green - Blake Chaffin - hos@tamanegi.org - - * testsuite/libffi.call/cls_align_longdouble_split2.c - testsuite/libffi.call/cls_align_longdouble_split.c - testsuite/libffi.call/cls_dbls_struct.c - testsuite/libffi.call/cls_double_va.c - testsuite/libffi.call/cls_longdouble.c - testsuite/libffi.call/cls_longdouble_va.c - testsuite/libffi.call/cls_pointer.c - testsuite/libffi.call/cls_pointer_stack.c - testsuite/libffi.call/err_bad_abi.c - testsuite/libffi.call/err_bad_typedef.c - testsuite/libffi.call/stret_large2.c - testsuite/libffi.call/stret_large.c - testsuite/libffi.call/stret_medium2.c - testsuite/libffi.call/stret_medium.c: New tests from Apple. - -2009-06-05 Andrew Haley - - * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from - libffi. - -2009-06-04 Andrew Haley - - * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out - stdcall changes. - -2008-02-26 Anthony Green - Thomas Heller - - * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C - comment. - -2008-02-03 Timothy Wall - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return - offset based on code pointer, not data pointer. - -2008-01-31 Timothy Wall - - * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall - closures. - * src/x86/ffitarget.h: Increase size of trampoline for stdcall - closures. - * src/x86/win32.S: Add assembly for stdcall closure. - * src/x86/ffi.c: Initialize stdcall closure trampoline. - -2009-06-04 Andrew Haley - - * include/ffi.h.in: Change void (*)() to void (*)(void). - * src/x86/ffi.c: Likewise. - -2009-06-04 Andrew Haley - - * src/powerpc/ppc_closure.S: Insert licence header. - * src/powerpc/linux64_closure.S: Likewise. - * src/m68k/sysv.S: Likewise. - - * src/sh64/ffi.c: Change void (*)() to void (*)(void). - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/m32r/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/x86/ffi64.c: Likewise. - * src/alpha/ffi.c: Likewise. - * src/alpha/osf.S: Likewise. - * src/frv/ffi.c: Likewise. - * src/s390/ffi.c: Likewise. - * src/pa/ffi.c: Likewise. - * src/pa/hpux32.S: Likewise. - * src/ia64/unix.S: Likewise. - * src/ia64/ffi.c: Likewise. - * src/sparc/ffi.c: Likewise. - * src/mips/ffi.c: Likewise. - * src/sh/ffi.c: Likewise. - -2008-02-15 David Daney - - * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): - Define (conditionally), and use it to include cachectl.h. - (ffi_prep_closure_loc): Fix cache flushing. - * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. - -2009-06-04 Andrew Haley - - include/ffi.h.in, - src/arm/ffitarget.h, - src/arm/ffi.c, - src/arm/sysv.S, - src/powerpc/ffitarget.h, - src/closures.c, - src/sh64/ffitarget.h, - src/sh64/ffi.c, - src/sh64/sysv.S, - src/types.c, - src/x86/ffi64.c, - src/x86/ffitarget.h, - src/x86/win32.S, - src/x86/darwin.S, - src/x86/ffi.c, - src/x86/sysv.S, - src/x86/unix64.S, - src/alpha/ffitarget.h, - src/alpha/ffi.c, - src/alpha/osf.S, - src/m68k/ffitarget.h, - src/frv/ffitarget.h, - src/frv/ffi.c, - src/s390/ffitarget.h, - src/s390/sysv.S, - src/cris/ffitarget.h, - src/pa/linux.S, - src/pa/ffitarget.h, - src/pa/ffi.c, - src/raw_api.c, - src/ia64/ffitarget.h, - src/ia64/unix.S, - src/ia64/ffi.c, - src/ia64/ia64_flags.h, - src/java_raw_api.c, - src/debug.c, - src/sparc/v9.S, - src/sparc/ffitarget.h, - src/sparc/ffi.c, - src/sparc/v8.S, - src/mips/ffitarget.h, - src/mips/n32.S, - src/mips/o32.S, - src/mips/ffi.c, - src/prep_cif.c, - src/sh/ffitarget.h, - src/sh/ffi.c, - src/sh/sysv.S: Update license text. - -2009-05-22 Dave Korn - - * src/x86/win32.S (_ffi_closure_STDCALL): New function. - (.eh_frame): Add FDE for it. - -2009-05-22 Dave Korn - - * configure.ac: Also check if assembler supports pc-relative - relocs on X86_WIN32 targets. - * configure: Regenerate. - * src/x86/win32.S (ffi_prep_args): Declare extern, not global. - (_ffi_call_SYSV): Add missing function type symbol .def and - add EH markup labels. - (_ffi_call_STDCALL): Likewise. - (_ffi_closure_SYSV): Likewise. - (_ffi_closure_raw_SYSV): Likewise. - (.eh_frame): Add hand-crafted EH data. - -2009-04-09 Jakub Jelinek - - * testsuite/lib/libffi-dg.exp: Change copyright header to refer to - version 3 of the GNU General Public License and to point readers - at the COPYING3 file and the FSF's license web page. - * testsuite/libffi.call/call.exp: Likewise. - * testsuite/libffi.special/special.exp: Likewise. - -2009-03-01 Ralf Wildenhues - - * configure: Regenerate. - -2008-12-18 Rainer Orth - - PR libffi/26048 - * configure.ac (HAVE_AS_X86_PCREL): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate - RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, - RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. - (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. - * src/x86/unix64.S (.Lstore_table): Move to .text section. - (.Lload_table): Likewise. - (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. - -2008-12-18 Ralf Wildenhues - - * configure: Regenerate. - -2008-11-21 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for - signed/unsigned int8/16 return values. - * src/sparc/v8.S (ffi_call_v8): Likewise. - (ffi_closure_v8): Likewise. - -2008-09-26 Peter O'Gorman - Steve Ellcey - - * configure: Regenerate for new libtool. - * Makefile.in: Ditto. - * include/Makefile.in: Ditto. - * aclocal.m4: Ditto. - -2008-08-25 Andreas Tobler - - * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and - FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. - Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. - Adjust copyright notice. - * src/powerpc/ffi.c: Add two new flags to indicate if we have one - register or two register to use for FFI_SYSV structs. - (ffi_prep_cif_machdep): Pass the right register flag introduced above. - (ffi_closure_helper_SYSV): Fix the return type for - FFI_SYSV_TYPE_SMALL_STRUCT. Comment. - Adjust copyright notice. - -2008-07-16 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned - int. - -2008-06-17 Ralf Wildenhues - - * configure: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2008-06-07 Joseph Myers - - * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, - powerpc-*-beos*): Remove. - * configure: Regenerate. - -2008-05-09 Julian Brown - - * Makefile.am (LTLDFLAGS): New. - (libffi_la_LDFLAGS): Use above. - * Makefile.in: Regenerate. - -2008-04-18 Paolo Bonzini - - PR bootstrap/35457 - * aclocal.m4: Regenerate. - * configure: Regenerate. - -2008-03-26 Kaz Kojima - - * src/sh/sysv.S: Add .note.GNU-stack on Linux. - * src/sh64/sysv.S: Likewise. - -2008-03-26 Daniel Jacobowitz - - * src/arm/sysv.S: Fix ARM comment marker. - -2008-03-26 Jakub Jelinek - - * src/alpha/osf.S: Add .note.GNU-stack on Linux. - * src/s390/sysv.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - * src/x86/unix64.S: Likewise. - * src/x86/sysv.S: Likewise. - * src/sparc/v8.S: Likewise. - * src/sparc/v9.S: Likewise. - * src/m68k/sysv.S: Likewise. - * src/arm/sysv.S: Likewise. - -2008-03-16 Ralf Wildenhues - - * aclocal.m4: Regenerate. - * configure: Likewise. - * Makefile.in: Likewise. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - -2008-02-12 Bjoern Koenig - Andreas Tobler - - * configure.ac: Add amd64-*-freebsd* target. - * configure: Regenerate. - -2008-01-30 H.J. Lu - - PR libffi/34612 - * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when - returning struct. - - * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" - tests. - -2008-01-24 David Edelsohn - - * configure: Regenerate. - -2008-01-06 Andreas Tobler - - * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. - -2008-01-05 Andreas Tobler - - PR testsuite/32843 - * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for - signed/unsigned int8/16 for X86_DARWIN. - Updated copyright info. - Handle one and two byte structs with special cif->flags. - * src/x86/ffitarget.h: Add special types for one and two byte structs. - Updated copyright info. - * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like - sysv.S - Remove code to pop args from the stack after call. - Special-case signed/unsigned for int8/16, one and two byte structs. - (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, - FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, - FFI_TYPE_SINT32. - Updated copyright info. - -2007-12-08 David Daney - - * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with - SUBU, add with ADDU and use smaller code sequences. - -2007-12-07 David Daney - - * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return - type. - -2007-12-06 David Daney - - * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already - defined. - (ffi_java_raw): New typedef. - (ffi_java_raw_call, ffi_java_ptrarray_to_raw, - ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to - ffi_java_raw. - (ffi_java_raw_closure) : Same. - (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change - parameter types. - * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with - FFI_SIZEOF_JAVA_RAW. - (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. - Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use - sizeof(ffi_java_raw) for alignment calculations. - (ffi_java_ptrarray_to_raw): Same. - (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER - if FFI_SIZEOF_JAVA_RAW == 4. - (ffi_java_raw_to_rvalue): Same. - (ffi_java_raw_call): Change type of raw to ffi_java_raw. - (ffi_java_translate_args): Same. - (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change - parameter types. - * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. - -2007-12-06 David Daney - - * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on - pointer values. - -2007-12-01 Andreas Tobler - - PR libffi/31937 - * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. - Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. - * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and - set the NUM_FPR_ARG_REGISTERS according to. - Add support for potential soft-float support under hard-float - architecture. - (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of - FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according - to the FFI_LINUX_SOFT_FLOAT ABI. - (ffi_prep_cif_machdep): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * src/powerpc/ppc_closure.S: Make sure not to store float/double - on archs where __NO_FPRS__ is true. - Add FFI_TYPE_UINT128 support. - * src/powerpc/sysv.S: Add support for soft-float long-double-128. - Adjust copyright notice. - -2007-11-25 Andreas Tobler - - * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... - * include/ffi_common.h: ... here. - Update copyright. - -2007-11-17 Andreas Tobler - - * src/powerpc/sysv.S: Load correct cr to compare if we have long double. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. - * testsuite/libffi.call/return_ldl.c: New test. - -2007-09-04 - - * src/arm/sysv.S (UNWIND): New. - (Whole file): Conditionally compile unwinder directives. - * src/arm/sysv.S: Add unwinder directives. - - * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. - Only treat r0 as a struct address if we're actually returning a - struct by address. - Only copy the bytes that are actually within a struct. - (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes - is returned in r0, not passed by address. - (ffi_call): Allocate a word-sized temporary for the case where - a composite is returned in r0. - (ffi_prep_incoming_args_SYSV): Align as necessary. - -2007-08-05 Steven Newbury - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of - directly using the sys_cacheflush syscall. - -2007-07-27 Andrew Haley - - * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. - -2007-09-03 Maciej W. Rozycki - - * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure: Likewise. - -2007-08-24 David Daney - - * testsuite/libffi.call/return_sl.c: New test. - -2007-08-10 David Daney - - * testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.special/unwindtest_ffi_call.cc, - testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. - -2007-08-10 David Daney - - PR libffi/28313 - * configure.ac: Don't treat mips64 as a special case. - * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. - * configure: Regenerate - * Makefile.in: Ditto. - * fficonfig.h.in: Ditto. - * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. - (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. - (FFI_DEFAULT_ABI): Set for n64 case. - (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. - * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. - (ffi_closure_N32): New function. - (.eh_frame): New section - * src/mips/o32.S: Clean up comments. - (ffi_closure_O32): Pass ffi_closure parameter in $12. - * src/mips/ffi.c: Use FFI_MIPS_N32 instead of - _MIPS_SIM == _ABIN32 throughout. - (FFI_MIPS_STOP_HERE): New, use in place of - ffi_stop_here. - (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite - to support n32/n64 ABIs. - (calc_n32_struct_flags): Rewrite. - (calc_n32_return_struct_flags): Remove unused variable. Reverse - position of flag bits. - (ffi_prep_cif_machdep): Rewrite n32 portion. - (ffi_call): Enable for n64. Add special handling for small structure - return values. - (ffi_prep_closure_loc): Add n32 and n64 support. - (ffi_closure_mips_inner_O32): Add cast to silence warning. - (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. - -2007-08-08 David Daney - - * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. - * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type - specifiers. - * testsuite/libffi.call/nested_struct1.c (main): Ditto. - * testsuite/libffi.call/cls_sint.c (main): Ditto. - * testsuite/libffi.call/nested_struct9.c (main): Ditto. - * testsuite/libffi.call/cls_20byte1.c (main): Ditto. - * testsuite/libffi.call/cls_9byte1.c (main): Ditto. - * testsuite/libffi.call/closure_fn1.c (main): Ditto. - * testsuite/libffi.call/closure_fn3.c (main): Ditto. - * testsuite/libffi.call/return_dbl2.c (main): Ditto. - * testsuite/libffi.call/cls_sshort.c (main): Ditto. - * testsuite/libffi.call/return_fl3.c (main): Ditto. - * testsuite/libffi.call/closure_fn5.c (main): Ditto. - * testsuite/libffi.call/nested_struct.c (main): Ditto. - * testsuite/libffi.call/nested_struct10.c (main): Ditto. - * testsuite/libffi.call/return_ll1.c (main): Ditto. - * testsuite/libffi.call/cls_8byte.c (main): Ditto. - * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. - * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. - * testsuite/libffi.call/cls_20byte.c (main): Ditto. - * testsuite/libffi.call/nested_struct2.c (main): Ditto. - * testsuite/libffi.call/cls_24byte.c (main): Ditto. - * testsuite/libffi.call/nested_struct6.c (main): Ditto. - * testsuite/libffi.call/cls_uint.c (main): Ditto. - * testsuite/libffi.call/cls_12byte.c (main): Ditto. - * testsuite/libffi.call/cls_16byte.c (main): Ditto. - * testsuite/libffi.call/closure_fn0.c (main): Ditto. - * testsuite/libffi.call/cls_9byte2.c (main): Ditto. - * testsuite/libffi.call/closure_fn2.c (main): Ditto. - * testsuite/libffi.call/return_dbl1.c (main): Ditto. - * testsuite/libffi.call/closure_fn4.c (main): Ditto. - * testsuite/libffi.call/closure_fn6.c (main): Ditto. - * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. - -2007-08-07 Andrew Haley - - * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous - checkin. - -2007-08-06 Andrew Haley - - PR testsuite/32843 - * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, - FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, - FFI_TYPE_SINT32. - -2007-08-02 David Daney - - * testsuite/libffi.call/return_ul.c (main): Define return type as - ffi_arg. Use proper printf conversion specifier. - -2007-07-30 Andrew Haley - - PR testsuite/32843 - * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for - signed/unsigned int8/16. - * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: - Use a jump table. - Remove code to pop args from the stack after call. - Special-case signed/unsigned int8/16. - * testsuite/libffi.call/return_sc.c (main): Revert. - -2007-07-26 Richard Guenther - - PR testsuite/32843 - * testsuite/libffi.call/return_sc.c (main): Verify call - result as signed char, not ffi_arg. - -2007-07-16 Rainer Orth - - * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. - * configure: Regenerate. - -2007-07-11 David Daney - - * src/mips/ffi.c: Don't include sys/cachectl.h. - (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of - cacheflush(). - -2007-05-18 Aurelien Jarno - - * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted - from (ffi_prep_closure): ... this. - (FFI_INIT_TRAMPOLINE): Adjust. - -2005-12-31 Phil Blundell - - * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, - ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. - * src/arm/sysv.S(ffi_closure_SYSV): Likewise. - * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_CLOSURES): Enable closure support. - -2007-07-03 Andrew Haley - - * testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.special/unwindtest_ffi_call.cc, - testsuite/libffi.special/unwindtest.cc: Enable for ARM. - -2007-07-05 H.J. Lu - - * aclocal.m4: Regenerated. - -2007-06-02 Paolo Bonzini - - * configure: Regenerate. - -2007-05-23 Steve Ellcey - - * Makefile.in: Regenerate. - * configure: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2007-05-10 Roman Zippel - - * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, - ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. - * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. - * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_CLOSURES): Enable closure support. - -2007-05-10 Roman Zippel - - * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, - CFI_OFFSET,CFI_DEF_CFA): New macros. - (ffi_call_SYSV): Add callframe annotation. - -2007-05-10 Roman Zippel - - * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix - numerous test suite failures. - * src/m68k/sysv.S (ffi_call_SYSV): Likewise. - -2007-04-11 Paolo Bonzini - - * Makefile.am (EXTRA_DIST): Bring up to date. - * Makefile.in: Regenerate. - * src/frv/eabi.S: Remove RCS keyword. - -2007-04-06 Richard Henderson - - * configure.ac: Tidy target case. - (HAVE_LONG_DOUBLE): Allow the target to override. - * configure: Regenerate. - * include/ffi.h.in: Don't define ffi_type_foo if - LIBFFI_HIDE_BASIC_TYPES is defined. - (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define - to ffi_type_double. - * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. - (FFI_TYPEDEF, ffi_type_void): Mark the data const. - (ffi_type_longdouble): Special case for Alpha. Don't define - if long double == double. - - * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. - (ffi_prep_cif_machdep): Handle it as the 128-bit type. - (ffi_call, ffi_closure_osf_inner): Likewise. - (ffi_closure_osf_inner): Likewise. Mark hidden. - (ffi_call_osf, ffi_closure_osf): Mark hidden. - * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. - * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. - (load_table): Handle 128-bit long double. - - * testsuite/libffi.call/float4.c: Add -mieee for alpha. - -2007-04-06 Tom Tromey - - PR libffi/31491: - * README: Fixed bug in example. - -2007-04-03 Jakub Jelinek - - * src/closures.c: Include sys/statfs.h. - (_GNU_SOURCE): Define on Linux. - (FFI_MMAP_EXEC_SELINUX): Define. - (selinux_enabled): New variable. - (selinux_enabled_check): New function. - (is_selinux_enabled): Define. - (dlmmap): Use it. - -2007-03-24 Uros Bizjak - - * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. - Use 'volatile float sum' to create sum of floats to avoid false - negative due to excess precision on ix86 targets. - (main): Ditto. - -2007-03-08 Alexandre Oliva - - * src/powerpc/ffi.c (flush_icache): Fix left-over from previous - patch. - (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. - -2007-03-07 Alexandre Oliva - - * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. - (ffi_prep_closure_loc): New. - (ffi_prep_raw_closure_loc): New. - (ffi_prep_java_raw_closure_loc): New. - * src/closures.c: New file. - * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): - Replace sflags with exec_offset. - [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, - sub_segment_exec_offset): New macros. - (get_segment_flags, set_segment_flags, check_segment_merge): New - macros. - (is_mmapped_segment, is_extern_segment): Use get_segment_flags. - (add_segment, sys_alloc, create_mspace, create_mspace_with_base, - destroy_mspace): Use new macros. - (sys_alloc): Silence warning. - * Makefile.am (libffi_la_SOURCES): Add src/closures.c. - * Makefile.in: Rebuilt. - * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in - terms of ffi_prep_closure_loc. - * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted - from... - (ffi_prep_raw_closure): ... this. Re-implement in terms of the - renamed version. - * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and - adjusted from... - (ffi_prep_java_raw_closure): ... this. Re-implement in terms of - the renamed version. - * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from - (ffi_prep_closure): ... this. - * src/pa/ffi.c: Likewise. - * src/cris/ffi.c: Likewise. Adjust. - * src/frv/ffi.c: Likewise. - * src/ia64/ffi.c: Likewise. - * src/mips/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/s390/ffi.c: Likewise. - * src/sh/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/sparc/ffi.c: Likewise. - * src/x86/ffi64.c: Likewise. - * src/x86/ffi.c: Likewise. - (FFI_INIT_TRAMPOLINE): Adjust. - (ffi_prep_raw_closure_loc): Renamed and adjusted from... - (ffi_prep_raw_closure): ... this. - * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from - (ffi_prep_closure): ... this. - (flush_icache): Adjust. - -2007-03-07 Alexandre Oliva - - * src/dlmalloc.c: New file, imported version 2.8.3 of Doug - Lea's malloc. - -2007-03-01 Brooks Moses - - * Makefile.am: Add dummy install-pdf target. - * Makefile.in: Regenerate - -2007-02-13 Andreas Krebbel - - * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, - ffi_closure_helper_SYSV): Add long double handling. - -2007-02-02 Jakub Jelinek - - * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 - immediately after bctrl instruction. - -2007-01-18 Alexandre Oliva - - * Makefile.am (all-recursive, install-recursive, - mostlyclean-recursive, clean-recursive, distclean-recursive, - maintainer-clean-recursive): Add missing targets. - * Makefile.in: Rebuilt. - -2006-12-14 Andreas Tobler - - * configure.ac: Add TARGET for x86_64-*-darwin*. - * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources - for X86_DARWIN. - * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. - * src/x86/darwin64.S: New file for x86_64-*-darwin* support. - * configure: Regenerate. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for - ffi_call only. - -2006-12-13 Andreas Tobler - - * aclocal.m4: Regenerate with aclocal -I .. as written in the - Makefile.am. - -2006-10-31 Geoffrey Keating - - * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. - (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for - Darwin. - * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. - * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. - -2006-10-10 Paolo Bonzini - Sandro Tolaini - - * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and - conditional. - * configure: Regenerated. - * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. - (EXTRA_DIST): Add src/x86/darwin.S. - * Makefile.in: Regenerated. - * include/Makefile.in: Regenerated. - * testsuite/Makefile.in: Regenerated. - - * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like - X86_WIN32, and additionally align stack to 16 bytes. - * src/x86/darwin.S: New, based on sysv.S. - * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. - -2006-09-12 David Daney - - PR libffi/23935 - * include/Makefile.am: Install both ffi.h and ffitarget.h in - $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. - * aclocal.m4: Regenerated for automake 1.9.6. - * Makefile.in: Regenerated. - * include/Makefile.in: Regenerated. - * testsuite/Makefile.in: Regenerated. - -2006-08-17 Andreas Tobler - - * include/ffi_common.h (struct): Revert accidental commit. - -2006-08-15 Andreas Tobler - - * include/ffi_common.h: Remove lint directives. - * include/ffi.h.in: Likewise. - -2006-07-25 Torsten Schoenfeld - - * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly - for 32-bit architectures. - * testsuite/libffi.call/return_ul.c: New test case. - -2006-07-19 David Daney - - * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, - xfail remains for mips64. - -2006-05-23 Carlos O'Donell - - * Makefile.am: Add install-html target. Add install-html to .PHONY - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2006-05-18 John David Anglin - - * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from - stack slot. - -2006-04-22 Andreas Tobler - - * README: Remove notice about 'Crazy Comments'. - * src/debug.c: Remove lint directives. Cleanup white spaces. - * src/java_raw_api.c: Likewise. - * src/prep_cif.c: Likewise. - * src/raw_api.c: Likewise. - * src/ffitest.c: Delete. No longer needed, all test cases migrated - to the testsuite. - * src/arm/ffi.c: Remove lint directives. - * src/m32r/ffi.c: Likewise. - * src/pa/ffi.c: Likewise. - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/sh/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/x86/ffi.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - -2006-04-13 Andreas Tobler - - * src/pa/hpux32.S: Correct unwind offset calculation for - ffi_closure_pa32. - * src/pa/linux.S: Likewise. - -2006-04-12 James E Wilson - - PR libgcj/26483 - * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. - (hfa_type_load): Call stf_spill. - (hfa_type_store): Call ldf_fill. - (ffi_call): Adjust calls to above routines. Add local temps for - macro result. - -2006-04-10 Matthias Klose - - * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib - directory names containing underscores. - -2006-04-07 James E Wilson - - * testsuite/libffi.call/float4.c: New testcase. - -2006-04-05 John David Anglin - Andreas Tobler - - * Makefile.am: Add PA_HPUX port. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure.ac: Add PA_HPUX rules. - * configure: Regenerate. - * src/pa/ffitarget.h: Rename linux target to PA_LINUX. - Add PA_HPUX and PA64_HPUX. - Rename FFI_LINUX ABI to FFI_PA32 ABI. - (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. - (FFI_TYPE_SMALL_STRUCT2): Define. - (FFI_TYPE_SMALL_STRUCT4): Likewise. - (FFI_TYPE_SMALL_STRUCT8): Likewise. - (FFI_TYPE_SMALL_STRUCT3): Redefine. - (FFI_TYPE_SMALL_STRUCT5): Likewise. - (FFI_TYPE_SMALL_STRUCT6): Likewise. - (FFI_TYPE_SMALL_STRUCT7): Likewise. - * src/pa/ffi.c (ROUND_DOWN): Delete. - (fldw, fstw, fldd, fstd): Use '__asm__'. - (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, - FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. - (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. - Simplify incrementing of stack slot variable. Change type of local - 'n' to unsigned int. - (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long - double on PA_HPUX. - (ffi_prep_cif_machdep): Likewise. - (ffi_call): Likewise. - (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change - return type to ffi_status. Simplify incrementing of stack slot - variable. Only copy floating point argument registers when PA_LINUX - is true. Reformat debug statement. - Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and - FFI_TYPE_SMALL_STRUCT8. - (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to - declaration. - (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. - Add nops to cache flush. Add trampoline for PA_HPUX. - * src/pa/hpux32.S: New file. - * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename - ffi_prep_args_LINUX to ffi_prep_args_pa32. - Localize labels. Add support for 2, 4 and 8-byte small structs. Handle - unaligned destinations in 3, 5, 6 and 7-byte small structs. Order - argument type checks so that common argument types appear first. - (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename - ffi_closure_inner_LINUX to ffi_closure_inner_pa32. - -2006-03-24 Alan Modra - - * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default - for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of - FFI_TYPE_LONGDOUBLE. - (ffi_prep_args64): Assert using IBM extended double. - (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. - Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. - (ffi_call): Handle FFI_LINUX. - (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs - gpr3 return pointer as for struct return. Handle FFI_LINUX - FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" - unnecessarily. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 - for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. - Don't use r6 as pointer to results, instead use sp offset. Don't - make a special call to load lr with case table address, instead - use offset from previous call. - * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. - * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double - return. - -2006-03-15 Kaz Kojima - - * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments - passed with FP registers correctly. - (ffi_closure_helper_SYSV): Likewise. - * src/sh64/sysv.S: Likewise. - -2006-03-01 Andreas Tobler - - * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, - args and userdata unused. - (closure_test_fn1): Mark cif and userdata unused. - (main): Remove unused res. - -2006-02-28 Andreas Tobler - - * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for - -O2, -O3, -Os and the warning flags -W -Wall. - * testsuite/libffi.special/special.exp: Likewise. - * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark - unused parameter unused for gcc or else do nothing. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif - and userdata unused. - * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. - * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. - * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. - * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. - * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. - * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. - * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. - * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. - * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. - * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. - * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. - * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. - * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. - * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. - * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. - * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. - * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. - * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. - * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. - * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. - * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. - * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. - * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. - * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast - void* to avoid compiler warning. - (main): Likewise. - (cls_struct_align_gn): Mark cif and userdata unused. - * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. - * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. - * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif - and data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif - and data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and - userdata unused. - (cls_ret_schar_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and - userdata unused. - (cls_ret_sint_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and - userdata unused. - (cls_ret_sshort_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and - userdata unused. - (cls_ret_uchar_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and - userdata unused. - (cls_ret_uint_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif - and userdata unused. - * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and - userdata unused. - (cls_ret_ushort_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/float.c (floating): Remove unused parameter e. - * testsuite/libffi.call/float1.c (main): Remove unused variable i. - Cleanup white spaces. - * testsuite/libffi.call/negint.c (checking): Remove unused variable i. - * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark - cif and userdata unused. - * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): - Likewise. - * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. - * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf - formatters to silence gcc. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct4.c: Mention related PR. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct6.c: Mention related PR. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. - * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. - * testsuite/libffi.call/problem1.c (stub): Likewise. - * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence - gcc. - * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned - in the last commit for this test case in the test case itself. - * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as - unused. - * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. - * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. - * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. - * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. - * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. - * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. - -2006-02-22 Kaz Kojima - - * src/sh/sysv.S: Fix register numbers in the FDE for - ffi_closure_SYSV. - -2006-02-20 Andreas Tobler - - * testsuite/libffi.call/return_fl2.c (return_fl): Remove static - declaration to avoid a false negative on ix86. See PR323. - -2006-02-18 Kaz Kojima - - * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable - and cast integer to void * if needed. Update the pointer to - the FP register saved area correctly. - -2006-02-17 Andreas Tobler - - * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 - is fixed. - * testsuite/libffi.call/nested_struct4.c: Likewise. - -2006-02-16 Andreas Tobler - - * testsuite/libffi.call/return_dbl.c: New test case. - * testsuite/libffi.call/return_dbl1.c: Likewise. - * testsuite/libffi.call/return_dbl2.c: Likewise. - * testsuite/libffi.call/return_fl.c: Likewise. - * testsuite/libffi.call/return_fl1.c: Likewise. - * testsuite/libffi.call/return_fl2.c: Likewise. - * testsuite/libffi.call/return_fl3.c: Likewise. - * testsuite/libffi.call/closure_fn6.c: Likewise. - - * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong - definition. - * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition - here to be used by other test cases too. - - * testsuite/libffi.call/nested_struct10.c: New test case. - * testsuite/libffi.call/nested_struct9.c: Likewise. - * testsuite/libffi.call/nested_struct8.c: Likewise. - * testsuite/libffi.call/nested_struct7.c: Likewise. - * testsuite/libffi.call/nested_struct6.c: Likewise. - * testsuite/libffi.call/nested_struct5.c: Likewise. - * testsuite/libffi.call/nested_struct4.c: Likewise. - -2006-01-21 Andreas Tobler - - * configure.ac: Enable libffi for sparc64-*-freebsd*. - * configure: Rebuilt. - -2006-01-18 Jakub Jelinek - - * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, - instead do the shifting inline. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 - shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 - and 8 byte structs, for the remaining struct sizes don't call - __lshrdi3, instead do the shifting inline. - -2005-12-07 Thiemo Seufer - - * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add - missing parentheses. - * src/mips/o32.S (ffi_call_O32): Code formatting. Define - and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. - (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, - A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, - V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, - FA_0_0_OFF2. - * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix - endianness bugs. - (ffi_prep_closure): Improve trampoline instruction scheduling. - (ffi_closure_mips_inner_O32): Fix endianness bugs. - -2005-12-03 Alan Modra - - * src/powerpc/ffi.c: Formatting. - (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. - (ffi_prep_args64): Likewise. - -2005-09-30 Geoffrey Keating - - * testsuite/lib/libffi-dg.exp (libffi_target_compile): For - darwin, use -shared-libgcc not -lgcc_s, and explain why. - -2005-09-26 Tom Tromey - - * testsuite/libffi.call/float1.c (value_type): New typedef. - (CANARY): New define. - (main): Check for result buffer overflow. - * src/powerpc/linux64.S: Handle linux64 long double returns. - * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. - (ffi_prep_cif_machdep): Handle linux64 long double returns. - -2005-08-25 Alan Modra - - PR target/23404 - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack - homed fp args. - (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. - -2005-08-11 Jakub Jelinek - - * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. - (AH_BOTTOM): Add FFI_HIDDEN definition. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - * src/powerpc/ffi.c (hidden): Remove. - (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, - ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, - .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. - * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, - add FFI_HIDDEN to its prototype. - (ffi_closure_SYSV_inner): New. - * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. - * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. - -2005-08-10 Alfred M. Szmidt - - PR libffi/21819: - * configure: Rebuilt. - * configure.ac: Handle i*86-*-gnu*. - -2005-08-09 Jakub Jelinek - - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use - DW_CFA_offset_extended_sf rather than - DW_CFA_GNU_negative_offset_extended. - * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. - -2005-07-22 SUGIOKA Toshinobu - - * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly - on sh3. - (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. - * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is - partially on register. - (ffi_closure_helper_SYSV): Likewise. - (ffi_prep_cif_machdep): Don't set too many cif->flags. - -2005-07-20 Kaz Kojima - - * src/sh/ffi.c (ffi_call): Handle small structures correctly. - Remove empty line. - * src/sh64/ffi.c (simple_type): Remove. - (return_type): Handle small structures correctly. - (ffi_prep_args): Likewise. - (ffi_call): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. - Emit position independent code if PIC and remove wrong datalabel - prefixes from EH data. - -2005-07-19 Andreas Tobler - - * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure.ac: Add POWERPC_FREEBSD rules. - * configure: Regenerate. - * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. - (FFI_SYSV_TYPE_SMALL_STRUCT): Define. - * src/powerpc/ffi.c: Add flags to handle small structure returns - in ffi_call_SYSV. - (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. - Aka FFI_SYSV. - (ffi_closure_helper_SYSV): Likewise. - * src/powerpc/ppc_closure.S: Add return types for small structures. - * src/powerpc/sysv.S: Add bits to handle small structures for - final SYSV 4 ABI. - -2005-07-10 Andreas Tobler - - * testsuite/libffi.call/cls_5_1_byte.c: New test file. - * testsuite/libffi.call/cls_6_1_byte.c: Likewise. - * testsuite/libffi.call/cls_7_1_byte.c: Likewise. - -2005-07-05 Randolph Chung - - * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 - as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte - structures. Kill compilation warnings. - (ffi_closure_inner_LINUX): Print return values as hex in debug - message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. - Properly handle 5-7 byte structure returns. - * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) - (FFI_TYPE_SMALL_STRUCT2): Remove. - (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) - (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. - * src/pa/linux.S: Mark source file as using PA1.1 assembly. - (checksmst1, checksmst2): Remove. - (checksmst3): Optimize handling of 3-byte struct returns. - (checksmst567): Properly handle 5-7 byte struct returns. - -2005-06-15 Rainer Orth - - PR libgcj/21943 - * src/mips/n32.S: Enforce PIC code. - * src/mips/o32.S: Likewise. - -2005-06-15 Rainer Orth - - * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. - * configure: Regenerate. - -2005-06-01 Alan Modra - - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET - to call ffi_closure_helper_SYSV. Append @local instead. - * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. - -2005-05-17 Kelley Cook - - * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. - Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. - * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. - * aclocal.m4, configure, fficonfig.h.in, Makefile.in, - include/Makefile.in, testsuite/Makefile.in: Regenerate. - -2005-05-09 Mike Stump - - * configure: Regenerate. - -2005-05-08 Richard Henderson - - PR libffi/21285 - * src/alpha/osf.S: Update unwind into to match code. - -2005-05-04 Andreas Degert - Richard Henderson - - * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in - bit 11 of flags. - (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. - (ffi_prep_closure): Set carry bit if sse-used flag set. - * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. - Only load sse registers if ssecount non-zero. - (ffi_closure_unix64): Only save sse registers if carry set on entry. - -2005-04-29 Ralf Corsepius - - * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, - powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. - * configure: Regenerate. - -2005-04-20 Hans-Peter Nilsson - - * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, - have Tcl8.3-compatible intermediate variable. - -2005-04-18 Simon Posnjak - Hans-Peter Nilsson - - * Makefile.am: Add CRIS support. - * configure.ac: Likewise. - * Makefile.in, configure, testsuite/Makefile.in, - include/Makefile.in: Regenerate. - * src/cris: New directory. - * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. - * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. - - * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with - \r?\n in output tests. - -2005-04-12 Mike Stump - - * configure: Regenerate. - -2005-03-30 Hans Boehm - - * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. - -2005-03-30 Steve Ellcey - - * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. - (ffi_sarg) Ditto. - * src/ia64/unix.S (ffi_closure_unix): Extend gp - to 64 bits in ILP32 mode. - Load 64 bits even for short data. - -2005-03-23 Mike Stump - - * src/powerpc/darwin.S: Update for -m64 multilib. - * src/powerpc/darwin_closure.S: Likewise. - -2005-03-21 Zack Weinberg - - * configure.ac: Do not invoke TL_AC_GCC_VERSION. - Do not set tool_include_dir. - * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: - Regenerate. - * include/Makefile.am: Set gcc_version and toollibffidir. - * include/Makefile.in: Regenerate. - -2005-02-22 Andrew Haley - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to - odd-numbered register pairs for 64-bit integer types. - -2005-02-23 Andreas Tobler - - PR libffi/20104 - * testsuite/libffi.call/return_ll1.c: New test case. - -2005-02-11 Janis Johnson - - * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. - * testsuite/libffi.call/float.c: Ditto. - * testsuite/libffi.call/float2.c: Ditto. - * testsuite/libffi.call/float3.c: Ditto. - -2005-02-08 Andreas Tobler - - * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. - -2005-01-12 Eric Botcazou - - * testsuite/libffi.special/special.exp (cxx_options): Add - -shared-libgcc. - -2004-12-31 Richard Henderson - - * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. - (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and - offset parameters with a type parameter; deduce size and structure - alignment. Update all users. - -2004-12-31 Richard Henderson - - * src/types.c (FFI_TYPE_POINTER): Define with sizeof. - (FFI_TYPE_LONGDOUBLE): Fix for ia64. - * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move - into ffi_prep_closure. - * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite - from scratch. - -2004-12-27 Richard Henderson - - * src/x86/unix64.S: Fix typo in unwind info. - -2004-12-25 Richard Henderson - - * src/x86/ffi64.c (struct register_args): Rename from stackLayout. - (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. - (merge_classes): Check for it. - (SSE_CLASS_P): New. - (classify_argument): Pass byte_offset by value; perform all updates - inside struct case. - (examine_argument): Add classes argument; handle - X86_64_COMPLEX_X87_CLASS. - (ffi_prep_args): Merge into ... - (ffi_call): ... here. Share stack frame with ffi_call_unix64. - (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. - (ffi_fill_return_value): Remove. - (ffi_prep_closure): Remove dead assert. - (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. - Rewrite to use struct register_args instead of va_list. Create - flags for handling structure returns. - * src/x86/unix64.S: Remove dead strings. - (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share - stack frame with ffi_call. Handle structure returns properly. - (float2sse, floatfloat2sse, double2sse): Remove. - (sse2float, sse2double, sse2floatfloat): Remove. - (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite - to handle structure returns properly. - -2004-12-08 David Edelsohn - - * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and - PICFLAG. - * Makefile.in: Regenerated. - -2004-12-02 Richard Sandiford - - * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. - * configure, aclocal.m4, Makefile.in: Regenerate. - * include/Makefile.in, testsuite/Makefile.in: Regenerate. - -2004-11-29 Kelley Cook - - * configure: Regenerate for libtool change. - -2004-11-25 Kelley Cook - - * configure: Regenerate for libtool reversion. - -2004-11-24 Kelley Cook - - * configure: Regenerate for libtool change. - -2004-11-23 John David Anglin - - * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. - -2004-11-23 Richard Sandiford - - * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead - of jal. Use an absolute encoding for the frame information. - -2004-11-23 Kelley Cook - - * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. - * acinclude.m4: Delete logic for sincludes. - * aclocal.m4, Makefile.in, configure: Regenerate. - * include/Makefile: Likewise. - * testsuite/Makefile: Likewise. - -2004-11-22 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers - on a 8-byte boundary. - * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. - -2004-10-27 Richard Earnshaw - - * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return - long long values. Round stack allocation to a multiple of 8 bytes - for ATPCS compatibility. - * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register - names. Handle returning long long types. Add Thumb and interworking - support. Improve soft-float code. - -2004-10-27 Richard Earnshaw - - * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. - (libffi_exit): New function. - (libffi_init): Build the testglue wrapper if needed. - -2004-10-25 Eric Botcazou - - PR other/18138 - * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. - -2004-10-25 Kazuhiro Inaoka - - * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. - -2004-10-20 Kaz Kojima - - * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. - * testsuite/libffi.call/float3.c: New test case. - -2004-10-18 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for - the function returning a structure pointed with R2. - * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to - the structure return value if T bit set. Emit position - independent code and EH data if PIC. - -2004-10-13 Kazuhiro Inaoka - - * Makefile.am: Add m32r support. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * confiugre: Regenerate. - * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF - (uint64, sint64, double, longdouble) - * src/m32r: New directory. - * src/m32r/ffi.c: New file. - * src/m32r/sysv.S: Likewise. - * src/m32r/ffitarget.h: Likewise. - -2004-10-02 Kaz Kojima - - * testsuite/libffi.call/negint.c: New test case. - -2004-09-14 H.J. Lu - - PR libgcj/17465 - * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. - Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, - LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and - DYLD_LIBRARY_PATH. - -2004-09-05 Andreas Tobler - - * testsuite/libffi.call/many_win32.c: Remove whitespaces. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup - whitespaces. - * testsuite/libffi.call/return_sc.c: Likewise. - * testsuite/libffi.call/return_uc.c: Likewise. - -2004-09-05 Andreas Tobler - - * src/powerpc/darwin.S: Fix comments and identation. - * src/powerpc/darwin_closure.S: Likewise. - -2004-09-02 Andreas Tobler - - * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. - (ffi_prep_args): Handle longdouble arguments. - (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for - longdouble. - (ffi_closure_helper_DARWIN): Add closure handling for longdouble. - * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble - values. - * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. - * src/types.c: Defined longdouble size and alignment for darwin. - -2004-09-02 Andreas Tobler - - * src/powerpc/aix.S: Remove whitespaces. - * src/powerpc/aix_closure.S: Likewise. - * src/powerpc/asm.h: Likewise. - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffitarget.h: Likewise. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - -2004-08-30 Anthony Green - - * Makefile.am: Add frv support. - * Makefile.in, testsuite/Makefile.in: Rebuilt. - * configure.ac: Read configure.host. - * configure.in: Read configure.host. - * configure.host: New file. frv-elf needs libgloss. - * include/ffi.h.in: Force ffi_closure to have a nice big (8) - alignment. This is needed to frv and shouldn't harm the others. - * include/ffi_common.h (ALIGN_DOWN): New macro. - * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. - -2004-08-24 David Daney - - * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_multi_schar.c: Likewise. - * testsuite/libffi.call/cls_multi_sshort.c: Likewise. - * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_uchar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushort.c: Likewise. - * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise and set return value - to zero. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - -2004-08-23 David Daney - - PR libgcj/13141 - * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. - * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. - (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point - parameters and return types. - (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. - (ffi_prep_closure): Ditto. - (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix - alignment calculations. - * src/mips/o32.S (ffi_closure_O32): Don't use floating point - instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. - -2004-08-14 Casey Marshall - - * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to - contain `FFI_TYPE_UINT64' as return type for any 64-bit - integer (O32 ABI only). - (ffi_prep_closure): new function. - (ffi_closure_mips_inner_O32): new function. - * src/mips/ffitarget.h: Define `FFI_CLOSURES' and - `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. - * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return - 64 bit integers correctly. - (ffi_closure_O32): new function. - Added DWARF-2 unwind info for both functions. - -2004-08-10 Andrew Haley - - * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. - -2004-08-01 Robert Millan - - * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. - * configure: Regenerate. - -2004-07-30 Maciej W. Rozycki - - * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for - and mmap() explicitly instead of relying on preset autoconf cache - variables. - * aclocal.m4: Regenerate. - * configure: Regenerate. - -2004-07-11 Ulrich Weigand - - * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. - (ffi_check_float_struct): Remove unused prototype. - -2004-06-30 Geoffrey Keating - - * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment - character on Darwin, use '\n\t' instead. - -2004-06-26 Matthias Klose - - * libtool-version: Fix typo in revision/age. - -2004-06-17 Matthias Klose - - * libtool-version: New. - * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. - * Makefile.in: Regenerate. - -2004-06-15 Paolo Bonzini - - * Makefile.am: Remove useless multilib rules. - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate with automake 1.8.5. - * configure.ac: Remove useless multilib configury. - * configure: Regenerate. - -2004-06-15 Paolo Bonzini - - * .cvsignore: New file. - -2004-06-10 Jakub Jelinek - - * src/ia64/unix.S (ffi_call_unix): Insert group barrier break - fp_done. - (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever - changed from 8. - -2004-06-06 Sean McNeil - - * configure.ac: Add x86_64-*-freebsd* support. - * configure: Regenerate. - -2004-04-26 Joe Buck - - Bug 15093 - * configure.ac: Test for existence of mmap and sys/mman.h before - checking blacklist. Fix suggested by Jim Wilson. - * configure: Regenerate. - -2004-04-26 Matt Austern - - * src/powerpc/darwin.S: Go through a non-lazy pointer for initial - FDE location. - * src/powerpc/darwin_closure.S: Likewise. - -2004-04-24 Andreas Tobler - - * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization - error. Reported by Thomas Heller . - * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. - * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. - -2004-03-20 Matthias Klose - - * src/pa/linux.S: Fix typo. - -2004-03-19 Matthias Klose - - * Makefile.am: Update. - * Makefile.in: Regenerate. - * src/pa/ffi.h.in: Remove. - * src/pa/ffitarget.h: New file. - -2004-02-10 Randolph Chung - - * Makefile.am: Add PA support. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * configure.ac: Add PA target. - * configure: Regenerate. - * src/pa/ffi.c: New file. - * src/pa/ffi.h.in: Add PA support. - * src/pa/linux.S: New file. - * prep_cif.c: Add PA support. - -2004-03-16 Hosaka Yuji - - * src/types.c: Fix alignment size of X86_WIN32 case int64 and - double. - * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type - with ecif->cif->flags. - (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type - with cif->flags. - (ffi_prep_cif_machdep): Add X86_WIN32 struct case. - (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. - * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, - sc_retstruct2b): Add for 1 or 2-bytes struct case. - -2004-03-15 Kelley Cook - - * configure.in: Rename file to ... - * configure.ac: ... this. - * fficonfig.h.in: Regenerate. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2004-03-12 Matt Austern - - * src/powerpc/darwin.S: Fix EH information so it corresponds to - changes in EH format resulting from addition of linkonce support. - * src/powerpc/darwin_closure.S: Likewise. - -2004-03-11 Andreas Tobler - Paolo Bonzini - - * Makefile.am (AUTOMAKE_OPTIONS): Set them. - Remove VPATH. Remove rules for object files. Remove multilib support. - (AM_CCASFLAGS): Add. - * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. - (AC_PREREQ): Bump version to 2.59. - (AC_INIT): Fill with version info and bug address. - (ORIGINAL_LD_FOR_MULTILIBS): Remove. - (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. - De-precious CC so that the right flags are passed down to multilibs. - (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. - (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. - (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. - * configure: Rebuilt. - * aclocal.m4: Likewise. - * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. - * fficonfig.h.in: Likewise. - -2004-03-11 Andreas Schwab - - * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point - arguments from fp registers only for the first 8 parameter slots. - Don't convert a float parameter when passed in memory. - -2004-03-09 Hans-Peter Nilsson - - * configure: Regenerate for config/accross.m4 correction. - -2004-02-25 Matt Kraai - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change - ecif->cif->bytes to bytes. - (ffi_prep_cif_machdep): Add braces around nested if statement. - -2004-02-09 Alan Modra - - * src/types.c (pointer): POWERPC64 has 8 byte pointers. - - * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. - (ffi_closure_helper_LINUX64): Fix typo. - * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 - for powerpc64-*-*. - * testsuite/libffi.call/float.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - -2004-02-08 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct - long double function return and long double arg handling. - (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. - Use "end_pfr" instead of "nf". Correct long double handling. - Localise "temp". - * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double - return value. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate - space for long double return value. Adjust stack frame and offsets. - Load f2 long double return. - -2004-02-07 Alan Modra - - * src/types.c: Use 16 byte long double for POWERPC64. - -2004-01-25 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array - when the structure return address is passed in %o0. - (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. - (ffi_v9_layout_struct): Align the field following a nested structure - on a word boundary. Use memmove instead of memcpy. - (ffi_call): Update call to ffi_V9_return_struct. - (ffi_prep_closure): Define 'ctx' only for V8. - (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 - and ffi_closure_sparc_inner_v9. - (ffi_closure_sparc_inner_v8): Return long doubles by reference. - Always skip the structure return address. For structures and long - doubles, copy the argument directly. - (ffi_closure_sparc_inner_v9): Skip the structure return address only - if required. Shift the maximum floating-point slot accordingly. For - big structures, copy the argument directly; otherwise, left-justify the - argument and call ffi_v9_layout_struct to lay out the structure on - the stack. - * src/sparc/v8.S: Undef STACKFRAME before defining it. - (ffi_closure_v8): Pass the structure return address. Update call to - ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. - Skip the 'unimp' insn when returning long doubles and structures. - * src/sparc/v9.S: Undef STACKFRAME before defining it. - (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit - FFI_TYPE_INT handling. Load structures both in integers and - floating-point registers on return. - * README: Update status of the SPARC port. - -2004-01-24 Andreas Tobler - - * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value - as of type ffi_arg. - * testsuite/libffi.call/struct3.c (main): Fix CHECK. - -2004-01-22 Ulrich Weigand - - * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result - value as of type ffi_arg, not unsigned int. - -2004-01-21 Michael Ritzert - - * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead - of the LHS. - -2004-01-12 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for - Solaris. - -2004-01-08 Rainer Orth - - * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED - to void *. - -2003-12-10 Richard Henderson - - * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to - size_t instead of int. - -2003-12-04 Hosaka Yuji - - * testsuite/libffi.call/many_win32.c: Include . - * testsuite/libffi.call/many_win32.c (main): Replace variable - int i with unsigned long ul. - - * testsuite/libffi.call/cls_align_uint64.c: New test case. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - -2003-12-02 Hosaka Yuji - - PR other/13221 - * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): - Align arguments to 32 bits. - -2003-12-01 Andreas Tobler - - PR other/13221 - * testsuite/libffi.call/cls_multi_sshort.c: New test case. - * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_uchar.c: Likewise. - * testsuite/libffi.call/cls_multi_schar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushort.c: Likewise. - - * testsuite/libffi.special/unwindtest.cc: Cosmetics. - -2003-11-26 Kaveh R. Ghazi - - * testsuite/libffi.call/ffitest.h: Include . - * testsuite/libffi.special/ffitestcxx.h: Likewise. - -2003-11-22 Andreas Tobler - - * Makefile.in: Rebuilt. - * configure: Likewise. - * testsuite/libffi.special/unwindtest.cc: Convert the mmap to - the right type. - -2003-11-21 Andreas Jaeger - Andreas Tobler - - * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. - * configure.in: Call AC_FUNC_MMAP_BLACKLIST. - * Makefile.in: Rebuilt. - * aclocal.m4: Likewise. - * configure: Likewise. - * fficonfig.h.in: Likewise. - * testsuite/lib/libffi-dg.exp: Add include dir. - * testsuite/libffi.call/ffitest.h: Add MMAP definitions. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality - for ffi_closure if available. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - -2003-11-20 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. - -2003-11-19 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. - Add -lgcc_s to additional flags. - -2003-11-12 Andreas Tobler - - * configure.in, include/Makefile.am: PR libgcj/11147, install - the ffitarget.h header file in a gcc versioned and target - dependent place. - * configure: Regenerated. - * Makefile.in, include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - -2003-11-09 Andreas Tobler - - * testsuite/libffi.call/closure_fn0.c: Print result and check - with dg-output to make debugging easier. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - - * testsuite/libffi.special/unwindtest.cc: Make ffi_closure - static. - -2003-11-08 Andreas Tobler - - * testsuite/libffi.call/cls_9byte2.c: New test case. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - -2003-11-08 Andreas Tobler - - * testsuite/libffi.call/cls_double.c: Do a check on the result. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. - -2003-11-06 Andreas Tobler - - * src/prep_cif.c (ffi_prep_cif): Move the validity check after - the initialization. - -2003-10-23 Andreas Tobler - - * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace - FFI_ASSERT(FALSE) with FFI_ASSERT(0). - -2003-10-22 David Daney - - * src/mips/ffitarget.h: Replace undefined UINT32 and friends with - __attribute__((__mode__(__SI__))) and friends. - -2003-10-22 Andreas Schwab - - * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. - -2003-10-21 Andreas Tobler - - * configure.in: AC_LINK_FILES(ffitarget.h). - * configure: Regenerate. - * Makefile.in: Likewise. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * fficonfig.h.in: Likewise. - -2003-10-21 Paolo Bonzini - Richard Henderson - - Avoid that ffi.h includes fficonfig.h. - - * Makefile.am (EXTRA_DIST): Include ffitarget.h files - (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. - (TARGET_SRC_MIPS_SGI): Removed. - (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. - (MIPS_SGI): Removed. - (CLEANFILES): Removed. - (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New - targets. - * acconfig.h: Removed. - * configure.in: Compute sizeofs only for double and long double. - Use them to define and subst HAVE_LONG_DOUBLE. Include comments - into AC_DEFINE instead of using acconfig.h. Create - include/ffitarget.h instead of include/fficonfig.h. Rename - MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. - AC_DEFINE EH_FRAME_FLAGS. - * include/Makefile.am (DISTCLEANFILES): New automake macro. - (hack_DATA): Add ffitarget.h. - * include/ffi.h.in: Remove all system specific definitions. - Declare raw API even if it is not installed, why bother? - Use limits.h instead of SIZEOF_* to define ffi_type_*. Do - not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include - ffitarget.h instead of fficonfig.h. Remove ALIGN macro. - (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. - * include/ffi_common.h (bool): Do not define. - (ffi_assert): Accept failed assertion. - (ffi_type_test): Return void and accept file/line. - (FFI_ASSERT): Pass stringized failed assertion. - (FFI_ASSERT_AT): New macro. - (FFI_ASSERT_VALID_TYPE): New macro. - (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, - UINT64, SINT64): Define here with gcc's __attribute__ macro - instead of in ffi.h - (FLOAT32, ALIGN): Define here instead of in ffi.h - * include/ffi-mips.h: Removed. Its content moved to - src/mips/ffitarget.h after separating assembly and C sections. - * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c - src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, - src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, - src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: - SIZEOF_ARG -> FFI_SIZEOF_ARG. - * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). - * src/debug.c (ffi_assert): Accept stringized failed assertion. - (ffi_type_test): Rewritten. - * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call - FFI_ASSERT_VALID_TYPE. - * src/alpha/ffitarget.h, src/arm/ffitarget.h, - src/ia64/ffitarget.h, src/m68k/ffitarget.h, - src/mips/ffitarget.h, src/powerpc/ffitarget.h, - src/s390/ffitarget.h, src/sh/ffitarget.h, - src/sh64/ffitarget.h, src/sparc/ffitarget.h, - src/x86/ffitarget.h: New files. - * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, - src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, - src/powerpc/aix.S, src/powerpc/darwin.S, - src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, - src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, - src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, - src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, - src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: - include fficonfig.h - -2003-10-20 Rainer Orth - - * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external - _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. - -2003-10-19 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. - Used when FFI_DEBUG = 1. - -2003-10-14 Alan Modra - - * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size - and align. - -2003-10-06 Rainer Orth - - * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, - FFI_MIPS_O32 for O32 ABI. - -2003-10-01 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for - SPARC64. Cleanup whitespaces. - -2003-09-19 Andreas Tobler - - * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, - strongarm, xscale. Cleanup whitespaces. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. - -2003-09-18 David Edelsohn - - * src/powerpc/aix.S: Cleanup whitespaces. - * src/powerpc/aix_closure.S: Likewise. - -2003-09-18 Andreas Tobler - - * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. - * src/powerpc/darwin_closure.S: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - -2003-09-18 Andreas Tobler - David Edelsohn - - * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. - * src/powerpc/aix_closure.S: Remove the pointer to the outgoing - parameter stack. - * src/powerpc/darwin_closure.S: Likewise. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures - according to the Darwin/AIX ABI. - (ffi_prep_cif_machdep): Likewise. - (ffi_closure_helper_DARWIN): Likewise. - Remove the outgoing parameter stack logic. Simplify the evaluation - of the different CASE types. - (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch - statement in the trampoline code. - -2003-09-18 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_args): Take account into the alignement - for the register size. - (ffi_closure_helper_SYSV): Handle the structure return value - address correctly. - (ffi_closure_helper_SYSV): Return the appropriate type when - the registers are used for the structure return value. - * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for - the 64-bit return value. Update copyright years. - -2003-09-17 Rainer Orth - - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in - srcdir for ffi_mips.h. - -2003-09-12 Alan Modra - - * src/prep_cif.c (initialize_aggregate): Include tail padding in - structure size. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct - placement of float result. - * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct - cast of "resp" for big-endian 64 bit machines. - -2003-09-11 Alan Modra - - * src/types.c (double, longdouble): Merge identical SH and ARM - typedefs, and add POWERPC64. - * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for - struct split over gpr and rest. - (ffi_prep_cif_machdep): Correct intarg_count for structures. - * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. - -2003-09-09 Andreas Tobler - - * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct - passing correctly. - -2003-09-09 Alan Modra - - * configure: Regenerate. - -2003-09-04 Andreas Tobler - - * Makefile.am: Remove build rules for ffitest. - * Makefile.in: Rebuilt. - -2003-09-04 Andreas Tobler - - * src/java_raw_api.c: Include to fix compiler warning - about implicit declaration of abort(). - -2003-09-04 Andreas Tobler - - * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. - * Makefile.in: Rebuilt. - * configure.in: Add dejagnu test framework. - * configure: Rebuilt. - - * testsuite/Makefile.am: New file. - * testsuite/Makefile.in: Built - * testsuite/lib/libffi-dg.exp: New file. - * testsuite/config/default.exp: Likewise. - * testsuite/libffi.call/call.exp: Likewise. - * testsuite/libffi.call/ffitest.h: Likewise. - * testsuite/libffi.call/closure_fn0.c: Likewise. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/float.c: Likewise. - * testsuite/libffi.call/float1.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - * testsuite/libffi.call/many.c: Likewise. - * testsuite/libffi.call/many_win32.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/pyobjc-tc.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/return_ll.c: Likewise. - * testsuite/libffi.call/return_sc.c: Likewise. - * testsuite/libffi.call/return_uc.c: Likewise. - * testsuite/libffi.call/strlen.c: Likewise. - * testsuite/libffi.call/strlen_win32.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - * testsuite/libffi.call/struct2.c: Likewise. - * testsuite/libffi.call/struct3.c: Likewise. - * testsuite/libffi.call/struct4.c: Likewise. - * testsuite/libffi.call/struct5.c: Likewise. - * testsuite/libffi.call/struct6.c: Likewise. - * testsuite/libffi.call/struct7.c: Likewise. - * testsuite/libffi.call/struct8.c: Likewise. - * testsuite/libffi.call/struct9.c: Likewise. - * testsuite/libffi.special/special.exp: New file. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - - -2003-08-13 Kaz Kojima - - * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update - copyright years. - -2003-08-02 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc - structure passing. - (ffi_closure_helper_LINUX64): Likewise. - * src/powerpc/linux64.S: Remove code writing to parm save area. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return - address in lr from ffi_closure_helper_LINUX64 call to calculate - table address. Optimize function tail. - -2003-07-28 Andreas Tobler - - * src/sparc/ffi.c: Handle all floating point registers. - * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. - -2003-07-11 Gerald Pfeifer - - * README: Note that libffi is not part of GCC. Update the project - URL and status. - -2003-06-19 Franz Sirl - - * src/powerpc/ppc_closure.S: Include ffi.h. - -2003-06-13 Rainer Orth - - * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. - Use C style comments. - -2003-06-13 Kaz Kojima - - * Makefile.am: Add SHmedia support. Fix a typo of SH support. - * Makefile.in: Regenerate. - * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. - * configure: Regenerate. - * include/ffi.h.in: Add SHmedia support. - * src/sh64/ffi.c: New file. - * src/sh64/sysv.S: New file. - -2003-05-16 Jakub Jelinek - - * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section - should be read-only. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - * include/ffi.h.in (EH_FRAME_FLAGS): Define. - * src/alpha/osf.S: Use EH_FRAME_FLAGS. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. - * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding - if -fpic/-fPIC/-mrelocatable. - * src/powerpc/powerpc_closure.S: Likewise. - * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include - #write in .eh_frame flags. - * src/sparc/v9.S: Likewise. - * src/x86/unix64.S: Use EH_FRAME_FLAGS. - * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. - * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. - -2003-05-07 Jeff Sturm - - Fixes PR bootstrap/10656 - * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler - support for .register pseudo-op. - * src/sparc/v8.S: Use it. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - -2003-04-18 Jakub Jelinek - - * include/ffi.h.in (POWERPC64): Define if 64-bit. - (enum ffi_abi): Add FFI_LINUX64 on POWERPC. - Make it the default on POWERPC64. - (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. - * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. - * configure: Rebuilt. - * src/powerpc/ffi.c (hidden): Define. - (ffi_prep_args_SYSV): Renamed from - ffi_prep_args. Cast pointers to unsigned long to shut up warnings. - (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, - ASM_NEEDS_REGISTERS64): New. - (ffi_prep_args64): New function. - (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. - (ffi_call): Likewise. - (ffi_prep_closure): Likewise. - (flush_icache): Surround by #ifndef POWERPC64. - (ffi_dblfl): New union type. - (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. - (ffi_closure_helper_LINUX64): New function. - * src/powerpc/ppc_closure.S: Surround whole file by #ifndef - __powerpc64__. - * src/powerpc/sysv.S: Likewise. - (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. - * src/powerpc/linux64.S: New file. - * src/powerpc/linux64_closure.S: New file. - * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and - src/powerpc/linux64_closure.S. - (TARGET_SRC_POWERPC): Likewise. - - * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, - closure_test_fn3): Fix result printing on big-endian 64-bit - machines. - (main): Print tst2_arg instead of uninitialized tst2_result. - - * src/ffitest.c (main): Hide what closure pointer really points to - from the compiler. - -2003-04-16 Richard Earnshaw - - * configure.in (arm-*-netbsdelf*): Add configuration. - (configure): Regenerated. - -2003-04-04 Loren J. Rittle - - * include/Makefile.in: Regenerate. - -2003-03-21 Zdenek Dvorak - - * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 - bit mode. - * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): - Receive closure pointer through parameter, read args using - __builtin_dwarf_cfa. - (FFI_INIT_TRAMPOLINE): Send closure reference through eax. - -2003-03-12 Andreas Schwab - - * configure.in: Avoid trailing /. in toolexeclibdir. - * configure: Rebuilt. - -2003-03-03 Andreas Tobler - - * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. - -2003-02-06 Andreas Tobler - - * libffi/src/powerpc/darwin_closure.S: - Fix alignement bug, allocate 8 bytes for the result. - * libffi/src/powerpc/aix_closure.S: - Likewise. - * libffi/src/powerpc/ffi_darwin.c: - Update stackframe description for aix/darwin_closure.S. - -2003-02-06 Jakub Jelinek - - * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility - attribute. - -2003-01-31 Christian Cornelssen , - Andreas Schwab - - * configure.in: Adjust command to source config-ml.in to account - for changes to the libffi_basedir definition. - (libffi_basedir): Remove ${srcdir} from value and include trailing - slash if nonempty. - - * configure: Regenerate. - -2003-01-29 Franz Sirl - - * src/powerpc/ppc_closure.S: Recode to fit shared libs. - -2003-01-28 Andrew Haley - - * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. - * src/x86/ffi64.c (ffi_prep_closure): New. - (ffi_closure_UNIX64_inner): New. - * src/x86/unix64.S (ffi_closure_UNIX64): New. - -2003-01-27 Alexandre Oliva - - * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. - Remove USE_LIBDIR conditional. - * Makefile.am (toolexecdir, toolexeclibdir): Don't override. - * Makefile.in, configure: Rebuilt. - -2003-01027 David Edelsohn - - * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. - * Makefile.in: Regenerate. - -2003-01-22 Andrew Haley - - * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to - unwind info. - -2003-01-21 Andreas Tobler - - * src/powerpc/darwin.S: Add unwind info. - * src/powerpc/darwin_closure.S: Likewise. - -2003-01-14 Andrew Haley - - * src/x86/ffi64.c (ffi_prep_args): Check for void retval. - (ffi_prep_cif_machdep): Likewise. - * src/x86/unix64.S: Add unwind info. - -2003-01-14 Andreas Jaeger - - * src/ffitest.c (main): Only use ffi_closures if those are - supported. - -2003-01-13 Andreas Tobler - - * libffi/src/ffitest.c - add closure testcases - -2003-01-13 Kevin B. Hendricks - - * libffi/src/powerpc/ffi.c - fix alignment bug for float (4 byte aligned iso 8 byte) - -2003-01-09 Geoffrey Keating - - * src/powerpc/ffi_darwin.c: Remove RCS version string. - * src/powerpc/darwin.S: Remove RCS version string. - -2003-01-03 Jeff Sturm - - * include/ffi.h.in: Add closure defines for SPARC, SPARC64. - * src/ffitest.c (main): Use static storage for closure. - * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. - * src/sparc/v8.S (ffi_closure_v8): New. - * src/sparc/v9.S (ffi_closure_v9): New. - -2002-11-10 Ranjit Mathew - - * include/ffi.h.in: Added FFI_STDCALL ffi_type - enumeration for X86_WIN32. - * src/x86/win32.S: Added ffi_call_STDCALL function - definition. - * src/x86/ffi.c (ffi_call/ffi_raw_call): Added - switch cases for recognising FFI_STDCALL and - calling ffi_call_STDCALL if target is X86_WIN32. - * src/ffitest.c (my_stdcall_strlen/stdcall_many): - stdcall versions of the "my_strlen" and "many" - test functions (for X86_WIN32). - Added test cases to test stdcall invocation using - these functions. - -2002-12-02 Kaz Kojima - - * src/sh/sysv.S: Add DWARF2 unwind info. - -2002-11-27 Ulrich Weigand - - * src/s390/sysv.S (.eh_frame section): Make section read-only. - -2002-11-26 Jim Wilson - - * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. - -2002-11-23 H.J. Lu - - * acinclude.m4: Add dummy AM_PROG_LIBTOOL. - Include ../config/accross.m4. - * aclocal.m4; Rebuild. - * configure: Likewise. - -2002-11-15 Ulrich Weigand - - * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. - -2002-11-11 DJ Delorie - - * configure.in: Look for common files in the right place. - -2002-10-08 Ulrich Weigand - - * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret - raw data as _Jv_word values, not ffi_raw. - (ffi_java_ptrarray_to_raw): Likewise. - (ffi_java_rvalue_to_raw): New function. - (ffi_java_raw_call): Call it. - (ffi_java_raw_to_rvalue): New function. - (ffi_java_translate_args): Call it. - * src/ffitest.c (closure_test_fn): Interpret return value - as ffi_arg, not int. - * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing - FFI_TYPE_POINTER case. - (ffi_closure_helper_SYSV): Likewise. Also, assume return - values extended to word size. - -2002-10-02 Andreas Jaeger - - * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. - -2002-10-01 Bo Thorsen - - * include/ffi.h.in: Fix i386 win32 compilation. - -2002-09-30 Ulrich Weigand - - * configure.in: Add s390x-*-linux-* target. - * configure: Regenerate. - * include/ffi.h.in: Define S390X for s390x targets. - (FFI_CLOSURES): Define for s390/s390x. - (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_NATIVE_RAW_API): Likewise. - * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. - * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. - * src/s390/ffi.c: Major rework of existing code. Add support for - s390x targets. Add closure support. - * src/s390/sysv.S: Likewise. - -2002-09-29 Richard Earnshaw - - * src/arm/sysv.S: Fix typo. - -2002-09-28 Richard Earnshaw - - * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor - has defined __USER_LABEL_PREFIX__, then use it in CNAME. - (ffi_call_SYSV): Handle soft-float. - -2002-09-27 Bo Thorsen - - * include/ffi.h.in: Fix multilib x86-64 support. - -2002-09-22 Kaveh R. Ghazi - - * Makefile.am (all-multi): Fix multilib parallel build. - -2002-07-19 Kaz Kojima - - * configure.in (sh[34]*-*-linux*): Add brackets. - * configure: Regenerate. - -2002-07-18 Kaz Kojima - - * Makefile.am: Add SH support. - * Makefile.in: Regenerate. - * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. - * configure: Regenerate. - * include/ffi.h.in: Add SH support. - * src/sh/ffi.c: New file. - * src/sh/sysv.S: New file. - * src/types.c: Add SH support. - -2002-07-16 Bo Thorsen - - * src/x86/ffi64.c: New file that adds x86-64 support. - * src/x86/unix64.S: New file that handles argument setup for - x86-64. - * src/x86/sysv.S: Don't use this on x86-64. - * src/x86/ffi.c: Don't use this on x86-64. - Remove unused vars. - * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation - for x86-64. - * src/ffitest.c (struct6): New test that tests a special case in - the x86-64 ABI. - (struct7): Likewise. - (struct8): Likewise. - (struct9): Likewise. - (closure_test_fn): Silence warning about this when it's not used. - (main): Add the new tests. - (main): Fix a couple of wrong casts and silence some compiler warnings. - * include/ffi.h.in: Add x86-64 ABI definition. - * fficonfig.h.in: Regenerate. - * Makefile.am: Add x86-64 support. - * configure.in: Likewise. - * Makefile.in: Regenerate. - * configure: Likewise. - -2002-06-24 Bo Thorsen - - * src/types.c: Merge settings for similar architectures. - Add x86-64 sizes and alignments. - -2002-06-23 Bo Thorsen - - * src/arm/ffi.c (ffi_prep_args): Remove unused vars. - * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. - * src/mips/ffi.c (ffi_prep_args): Likewise. - * src/m68k/ffi.c (ffi_prep_args): Likewise. - -2002-07-18 H.J. Lu (hjl@gnu.org) - - * Makefile.am (TARGET_SRC_MIPS_LINUX): New. - (libffi_la_SOURCES): Support MIPS_LINUX. - (libffi_convenience_la_SOURCES): Likewise. - * Makefile.in: Regenerated. - - * configure.in (mips64*-*): Skip. - (mips*-*-linux*): New. - * configure: Regenerated. - - * src/mips/ffi.c: Include . - -2002-06-06 Ulrich Weigand - - * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. - -2002-05-27 Roger Sayle - - * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. - -2002-05-27 Bo Thorsen - - * src/x86/ffi.c (ffi_prep_args): Remove unused variable and - fix formatting. - -2002-05-13 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at - beginning of function (for older apple cc). - -2002-05-08 Alexandre Oliva - - * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at - script entry, and set LD to it when configuring multilibs. - * configure: Rebuilt. - -2002-05-05 Jason Thorpe - - * configure.in (sparc64-*-netbsd*): Add target. - (sparc-*-netbsdelf*): Likewise. - * configure: Regenerate. - -2002-04-28 David S. Miller - - * configure.in, configure: Fix SPARC test in previous change. - -2002-04-29 Gerhard Tonn - - * Makefile.am: Add Linux for S/390 support. - * Makefile.in: Regenerate. - * configure.in: Add Linux for S/390 support. - * configure: Regenerate. - * include/ffi.h.in: Add Linux for S/390 support. - * src/s390/ffi.c: New file from libffi CVS tree. - * src/s390/sysv.S: New file from libffi CVS tree. - -2002-04-28 Jakub Jelinek - - * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working - %r_disp32(). - * src/sparc/v8.S: Use it. - * src/sparc/v9.S: Likewise. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - -2002-04-08 Hans Boehm - - * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE - correctly. - * src/ia64/unix.S: Add unwind information. Fix comments. - Save sp in a way that's compatible with unwind info. - (ffi_call_unix): Correctly restore sp in all cases. - * src/ia64/ffi.c: Add, fix comments. - -2002-04-08 Jakub Jelinek - - * src/sparc/v8.S: Make .eh_frame dependent on target word size. - -2002-04-06 Jason Thorpe - - * configure.in (alpha*-*-netbsd*): Add target. - * configure: Regenerate. - -2002-04-04 Jeff Sturm - - * src/sparc/v8.S: Add unwind info. - * src/sparc/v9.S: Likewise. - -2002-03-30 Krister Walfridsson - - * configure.in: Enable i*86-*-netbsdelf*. - * configure: Rebuilt. - -2002-03-29 David Billinghurst - - PR other/2620 - * src/mips/n32.s: Delete - * src/mips/o32.s: Delete - -2002-03-21 Loren J. Rittle - - * configure.in: Enable alpha*-*-freebsd*. - * configure: Rebuilt. - -2002-03-17 Bryce McKinlay - - * Makefile.am: libfficonvenience -> libffi_convenience. - * Makefile.in: Rebuilt. - - * Makefile.am: Define ffitest_OBJECTS. - * Makefile.in: Rebuilt. - -2002-03-07 Andreas Tobler - David Edelsohn - - * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. - (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. - (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. - * Makefile.in: Regenerate. - * include/ffi.h.in: Add AIX and Darwin closure definitions. - * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. - (flush_icache, flush_range): New functions. - (ffi_closure_helper_DARWIN): New function. - * src/powerpc/aix_closure.S: New file. - * src/powerpc/darwin_closure.S: New file. - -2002-02-24 Jeff Sturm - - * include/ffi.h.in: Add typedef for ffi_arg. - * src/ffitest.c (main): Declare rint with ffi_arg. - -2002-02-21 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate - number of GPRs for floating-point arguments. - -2002-01-31 Anthony Green - - * configure: Rebuilt. - * configure.in: Replace CHECK_SIZEOF and endian tests with - cross-compiler friendly macros. - * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New - macros. - -2002-01-18 David Edelsohn - - * src/powerpc/darwin.S (_ffi_call_AIX): New. - * src/powerpc/aix.S (ffi_call_DARWIN): New. - -2002-01-17 David Edelsohn - - * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. - (TARGET_SRC_POWERPC_AIX): New. - (POWERPC_AIX): New stanza. - * Makefile.in: Regenerate. - * configure.in: Add AIX case. - * configure: Regenerate. - * include/ffi.h.in (ffi_abi): Add FFI_AIX. - * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame - size. Fix "long double" support. - (ffi_call): Add FFI_AIX case. - * src/powerpc/aix.S: New. - -2001-10-09 John Hornkvist - - Implement Darwin PowerPC ABI. - * configure.in: Handle powerpc-*-darwin*. - * Makefile.am: Set source files for POWERPC_DARWIN. - * configure: Rebuilt. - * Makefile.in: Rebuilt. - * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for - POWERPC_DARWIN. - * src/powerpc/darwin.S: New file. - * src/powerpc/ffi_darwin.c: New file. - -2001-10-07 Joseph S. Myers - - * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". - -2001-07-16 Rainer Orth - - * src/x86/sysv.S: Avoid gas-only .balign directive. - Use C style comments. - -2001-07-16 Rainer Orth - - * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. - Fixes PR bootstrap/3563. - -2001-06-26 Rainer Orth - - * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. - -2001-06-25 Rainer Orth - - * configure.in: Recognize sparc*-sun-* host. - * configure: Regenerate. - -2001-06-06 Andrew Haley - - * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. - -2001-06-03 Andrew Haley - - * src/alpha/osf.S: Add unwind info. - * src/powerpc/sysv.S: Add unwind info. - * src/powerpc/ppc_closure.S: Likewise. - -2000-05-31 Jeff Sturm - - * configure.in: Fix AC_ARG_ENABLE usage. - * configure: Rebuilt. - -2001-05-06 Bryce McKinlay - - * configure.in: Remove warning about beta code. - * configure: Rebuilt. - -2001-04-25 Hans Boehm - - * src/ia64/unix.S: Restore stack pointer when returning from - ffi_closure_UNIX. - * src/ia64/ffi.c: Fix typo in comment. - -2001-04-18 Jim Wilson - - * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 - to eliminate RAW DV. - -2001-04-12 Bryce McKinlay - - * Makefile.am: Make a libtool convenience library. - * Makefile.in: Rebuilt. - -2001-03-29 Bryce McKinlay - - * configure.in: Use different syntax for subdirectory creation. - * configure: Rebuilt. - -2001-03-27 Jon Beniston - - * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). - * configure: Rebuilt. - * Makefile.am: Added X86_WIN32 target support. - * Makefile.in: Rebuilt. - - * include/ffi.h.in: Added X86_WIN32 target support. - - * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. - * src/types.c: Added X86_WIN32 target support. - - * src/x86/win32.S: New file. Based on sysv.S, but with EH - stuff removed and made to work with CygWin's gas. - -2001-03-26 Bryce McKinlay - - * configure.in: Make target subdirectory in build dir. - * Makefile.am: Override suffix based rules to specify correct output - subdirectory. - * Makefile.in: Rebuilt. - * configure: Rebuilt. - -2001-03-23 Kevin B Hendricks - - * src/powerpc/ppc_closure.S: New file. - * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug - involving long long and register pairs. - (ffi_prep_closure): New function. - (flush_icache): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * include/ffi.h.in (FFI_CLOSURES): Define on PPC. - (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_NATIVE_RAW_API): Likewise. - * Makefile.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. - (TARGET_SRC_POWERPC): Likewise. - -2001-03-19 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (ffitest_LDFLAGS): New macro. - -2001-03-02 Nick Clifton - - * include/ffi.h.in: Remove RCS ident string. - * include/ffi_mips.h: Remove RCS ident string. - * src/debug.c: Remove RCS ident string. - * src/ffitest.c: Remove RCS ident string. - * src/prep_cif.c: Remove RCS ident string. - * src/types.c: Remove RCS ident string. - * src/alpha/ffi.c: Remove RCS ident string. - * src/alpha/osf.S: Remove RCS ident string. - * src/arm/ffi.c: Remove RCS ident string. - * src/arm/sysv.S: Remove RCS ident string. - * src/mips/ffi.c: Remove RCS ident string. - * src/mips/n32.S: Remove RCS ident string. - * src/mips/o32.S: Remove RCS ident string. - * src/sparc/ffi.c: Remove RCS ident string. - * src/sparc/v8.S: Remove RCS ident string. - * src/sparc/v9.S: Remove RCS ident string. - * src/x86/ffi.c: Remove RCS ident string. - * src/x86/sysv.S: Remove RCS ident string. - -2001-02-08 Joseph S. Myers - - * include/ffi.h.in: Change sourceware.cygnus.com references to - gcc.gnu.org. - -2000-12-09 Richard Henderson - - * src/alpha/ffi.c (ffi_call): Simplify struct return test. - (ffi_closure_osf_inner): Index rather than increment avalue - and arg_types. Give ffi_closure_osf the raw return value type. - * src/alpha/osf.S (ffi_closure_osf): Handle return value type - promotion. - -2000-12-07 Richard Henderson - - * src/raw_api.c (ffi_translate_args): Fix typo. - (ffi_prep_closure): Likewise. - - * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and - FFI_TRAMPOLINE_SIZE. - * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal - cif->bytes for new ffi_call_osf implementation. - (ffi_prep_args): Absorb into ... - (ffi_call): ... here. Do all stack allocation here and - avoid a callback function. - (ffi_prep_closure, ffi_closure_osf_inner): New. - * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. - (ffi_closure_osf): New. - -2000-09-10 Alexandre Oliva - - * config.guess, config.sub, install-sh: Removed. - * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. - * Makefile.in: Rebuilt. - - * acinclude.m4: Include libtool macros from the top level. - * aclocal.m4, configure: Rebuilt. - -2000-08-22 Alexandre Oliva - - * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. - * configure: Rebuilt. - -2000-05-11 Scott Bambrough - - * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to - memory correctly. Use conditional instructions, not branches where - possible. - -2000-05-04 Tom Tromey - - * configure: Rebuilt. - * configure.in: Match `arm*-*-linux-*'. - From Chris Dornan . - -2000-04-28 Jakub Jelinek - - * Makefile.am (SUBDIRS): Define. - (AM_MAKEFLAGS): Likewise. - (Multilib support.): Add section. - * Makefile.in: Rebuilt. - * ltconfig (extra_compiler_flags, extra_compiler_flags_value): - New variables. Set for gcc using -print-multi-lib. Export them - to libtool. - (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. - * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options - for -shared links. - (extra_compiler_flags_value, extra_compiler_flags): Check these - for extra compiler options which need to be passed down in - compiler_flags. - -2000-04-16 Anthony Green - - * configure: Rebuilt. - * configure.in: Change i*86-pc-linux* to i*86-*-linux*. - -2000-04-14 Jakub Jelinek - - * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. - Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. - * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. - Replace all void * sizeofs with sizeof(int). - Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is - different than DOUBLE. - Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). - (ffi_prep_args_v9): New function. - (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. - (ffi_V9_return_struct): New function. - (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from - 32bit code (not yet cross-arch calls). - * src/sparc/v8.S: Add struct return delay nop. - Handle long long. - * src/sparc/v9.S: New file. - * src/prep_cif.c (ffi_prep_cif): Return structure pointer - is used on sparc64 only for structures larger than 32 bytes. - Pass by reference for structures is done for structure arguments - larger than 16 bytes. - * src/ffitest.c (main): Use 64bit rint on sparc64. - Run long long tests on sparc. - * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and - sparc64. - (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits - on sparc64. - * configure.in (sparc-*-linux*): New supported target. - (sparc64-*-linux*): Likewise. - * configure: Rebuilt. - * Makefile.am: Add v9.S to SPARC files. - * Makefile.in: Likewise. - (LINK): Surround $(CCLD) into double quotes, so that multilib - compiles work correctly. - -2000-04-04 Alexandre Petit-Bianco - - * configure: Rebuilt. - * configure.in: (i*86-*-solaris*): New libffi target. Patch - proposed by Bryce McKinlay. - -2000-03-20 Tom Tromey - - * Makefile.in: Hand edit for java_raw_api.lo. - -2000-03-08 Bryce McKinlay - - * config.guess, config.sub: Update from the gcc tree. - Fix for PR libgcj/168. - -2000-03-03 Tom Tromey - - * Makefile.in: Fixed ia64 by hand. - - * configure: Rebuilt. - * configure.in (--enable-multilib): New option. - (libffi_basedir): New subst. - (AC_OUTPUT): Added multilib code. - -2000-03-02 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as - directory name. - -2000-02-25 Hans Boehm - - * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New - files. - * src/raw_api.c (ffi_translate_args): Fixed typo in argument - list. - (ffi_prep_raw_closure): Use ffi_translate_args, not - ffi_closure_translate. - * src/java_raw_api.c: New file. - * src/ffitest.c (closure_test_fn): New function. - (main): Define `rint' as long long on IA64. Added new test when - FFI_CLOSURES is defined. - * include/ffi.h.in (ALIGN): Use size_t, not unsigned. - (ffi_abi): Recognize IA64. - (ffi_raw): Added `flt' field. - Added "Java raw API" code. - * configure.in: Recognize ia64. - * Makefile.am (TARGET_SRC_IA64): New macro. - (libffi_la_common_SOURCES): Added java_raw_api.c. - (libffi_la_SOURCES): Define in IA64 case. - -2000-01-04 Tom Tromey - - * Makefile.in: Rebuilt with newer automake. - -1999-12-31 Tom Tromey - - * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. - -1999-09-01 Tom Tromey - - * include/ffi.h.in: Removed PACKAGE and VERSION defines and - undefs. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. - Use AM_PROG_LIBTOOL (automake 1.4 compatibility). - * acconfig.h: Don't #undef PACKAGE or VERSION. - -1999-08-09 Anthony Green - - * include/ffi.h.in: Try to work around messy header problem - with PACKAGE and VERSION. - - * configure: Rebuilt. - * configure.in: Change version to 2.00-beta. - - * fficonfig.h.in: Rebuilt. - * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. - - * src/x86/ffi.c (ffi_raw_call): Rename. - -1999-08-02 Kresten Krab Thorup - - * src/x86/ffi.c (ffi_closure_SYSV): New function. - (ffi_prep_incoming_args_SYSV): Ditto. - (ffi_prep_closure): Ditto. - (ffi_closure_raw_SYSV): Ditto. - (ffi_prep_raw_closure): More ditto. - (ffi_call_raw): Final ditto. - - * include/ffi.h.in: Add definitions for closure and raw API. - - * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for - FFI_TYPE_UINT64. - - * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c - - * src/raw_api.c: New file. - - * include/ffi.h.in (ffi_raw): New type. - (UINT_ARG, SINT_ARG): New defines. - (ffi_closure, ffi_raw_closure): New types. - (ffi_prep_closure, ffi_prep_raw_closure): New declarations. - - * configure.in: Add check for endianness and sizeof void*. - - * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, - instead of directly. - - * configure: Rebuilt. - -Thu Jul 8 14:28:42 1999 Anthony Green - - * configure.in: Add x86 and powerpc BeOS configurations. - From Makoto Kato . - -1999-05-09 Anthony Green - - * configure.in: Add warning about this being beta code. - Remove src/Makefile.am from the picture. - * configure: Rebuilt. - - * Makefile.am: Move logic from src/Makefile.am. Add changes - to support libffi as a target library. - * Makefile.in: Rebuilt. - - * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: - Upgraded to new autoconf, automake, libtool. - - * README: Tweaks. - - * LICENSE: Update copyright date. - - * src/Makefile.am, src/Makefile.in: Removed. - -1998-11-29 Anthony Green - - * include/ChangeLog: Removed. - * src/ChangeLog: Removed. - * src/mips/ChangeLog: Removed. - * src/sparc/ChangeLog: Remboved. - * src/x86/ChangeLog: Removed. - - * ChangeLog.v1: Created. diff --git a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libgcj b/third_party/python/Modules/_ctypes/libffi/ChangeLog.libgcj deleted file mode 100644 index ea5d02f19..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ChangeLog.libgcj +++ /dev/null @@ -1,40 +0,0 @@ -2004-01-14 Kelley Cook - - * configure.in: Add in AC_PREREQ(2.13) - -2003-02-20 Alexandre Oliva - - * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to - config.status. - * configure: Rebuilt. - -2002-01-27 Alexandre Oliva - - * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. - Remove USE_LIBDIR conditional. - * Makefile.am (toolexecdir, toolexeclibdir): Don't override. - * Makefile.in, configure: Rebuilt. - -Mon Aug 9 18:33:38 1999 Rainer Orth - - * include/Makefile.in: Rebuilt. - * Makefile.in: Rebuilt - * Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native - builds. - Use USE_LIBDIR. - - * configure: Rebuilt. - * configure.in (USE_LIBDIR): Define for native builds. - Use lowercase in configure --help explanations. - -1999-08-08 Anthony Green - - * include/ffi.h.in (FFI_FN): Remove `...'. - -1999-08-08 Anthony Green - - * Makefile.in: Rebuilt. - * Makefile.am (AM_CFLAGS): Compile with -fexceptions. - - * src/x86/sysv.S: Add exception handling metadata. - diff --git a/third_party/python/Modules/_ctypes/libffi/ChangeLog.v1 b/third_party/python/Modules/_ctypes/libffi/ChangeLog.v1 deleted file mode 100644 index af3a37756..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ChangeLog.v1 +++ /dev/null @@ -1,764 +0,0 @@ -The libffi version 1 ChangeLog archive. - -Version 1 of libffi had per-directory ChangeLogs. Current and future -versions have a single ChangeLog file in the root directory. The -version 1 ChangeLogs have all been concatenated into this file for -future reference only. - ---- libffi ---------------------------------------------------------------- - -Mon Oct 5 02:17:50 1998 Anthony Green - - * configure.in: Boosted rev. - * configure, Makefile.in, aclocal.m4: Rebuilt. - * README: Boosted rev and updated release notes. - -Mon Oct 5 01:03:03 1998 Anthony Green - - * configure.in: Boosted rev. - * configure, Makefile.in, aclocal.m4: Rebuilt. - * README: Boosted rev and updated release notes. - -1998-07-25 Andreas Schwab - - * m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags. - Correctly handle small structures. - (ffi_prep_args): Also handle small structures. - (ffi_call): Pass size of return type to ffi_call_SYSV. - * m68k/sysv.S: Adjust for above changes. Correctly align small - structures in the return value. - - * types.c (uint64, sint64) [M68K]: Change alignment to 4. - -Fri Apr 17 17:26:58 1998 Anthony Green - - * configure.in: Boosted rev. - * configure,Makefile.in,aclocal.m4: Rebuilt. - * README: Boosted rev and added release notes. - -Sun Feb 22 00:50:41 1998 Geoff Keating - - * configure.in: Add PowerPC config bits. - -1998-02-14 Andreas Schwab - - * configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM - to AC_CANONICAL_HOST, this is not a compiler. Use $host instead - of $target. Remove AC_CHECK_SIZEOF(char), we already know the - result. Fix argument of AC_ARG_ENABLE. - * configure, fficonfig.h.in: Rebuilt. - -Tue Feb 10 20:53:40 1998 Richard Henderson - - * configure.in: Add Alpha config bits. - -Tue May 13 13:39:20 1997 Anthony Green - - * README: Updated dates and reworded Irix comments. - - * configure.in: Removed AC_PROG_RANLIB. - - * Makefile.in, aclocal.m4, config.guess, config.sub, configure, - ltmain.sh, */Makefile.in: libtoolized again and rebuilt with - automake and autoconf. - -Sat May 10 18:44:50 1997 Tom Tromey - - * configure, aclocal.m4: Rebuilt. - * configure.in: Don't compute EXTRADIST; now handled in - src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE. - Don't run AM_MAINTAINER_MODE. - -Thu May 8 14:34:05 1997 Anthony Green - - * missing, ltmain.sh, ltconfig.sh: Created. These are new files - required by automake and libtool. - - * README: Boosted rev to 1.14. Added notes. - - * acconfig.h: Moved PACKAGE and VERSION for new automake. - - * configure.in: Changes for libtool. - - * Makefile.am (check): make test now make check. Uses libtool now. - - * Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt. - -Thu May 1 16:27:07 1997 Anthony Green - - * missing: Added file required by new automake. - -Tue Nov 26 14:10:42 1996 Anthony Green - - * acconfig.h: Added USING_PURIFY flag. This is defined when - --enable-purify-safety was used at configure time. - - * configure.in (allsources): Added --enable-purify-safety switch. - (VERSION): Boosted rev to 1.13. - * configure: Rebuilt. - -Fri Nov 22 06:46:12 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.12. - Removed special CFLAGS hack for gcc. - * configure: Rebuilt. - - * README: Boosted rev to 1.12. Added notes. - - * Many files: Cygnus Support changed to Cygnus Solutions. - -Wed Oct 30 11:15:25 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.11. - * configure: Rebuilt. - - * README: Boosted rev to 1.11. Added notes about GNU make. - -Tue Oct 29 12:25:12 1996 Anthony Green - - * configure.in: Fixed -Wall trick. - (VERSION): Boosted rev. - * configure: Rebuilt - - * acconfig.h: Needed for --enable-debug configure switch. - - * README: Boosted rev to 1.09. Added more notes on building - libffi, and LCLint. - - * configure.in: Added --enable-debug switch. Boosted rev to - 1.09. - * configure: Rebuilt - -Tue Oct 15 13:11:28 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.08 - * configure: Rebuilt. - - * README: Added n32 bug fix notes. - - * Makefile.am: Added "make lint" production. - * Makefile.in: Rebuilt. - -Mon Oct 14 10:54:46 1996 Anthony Green - - * README: Added web page reference. - - * configure.in, README: Boosted rev to 1.05 - * configure: Rebuilt. - - * README: Fixed n32 sample code. - -Fri Oct 11 17:09:28 1996 Anthony Green - - * README: Added sparc notes. - - * configure.in, README: Boosted rev to 1.04. - * configure: Rebuilt. - -Thu Oct 10 10:31:03 1996 Anthony Green - - * configure.in, README: Boosted rev to 1.03. - * configure: Rebuilt. - - * README: Added struct notes. - - * Makefile.am (EXTRA_DIST): Added LICENSE to distribution. - * Makefile.in: Rebuilt. - - * README: Removed Linux section. No special notes now - because aggregates arg/return types work. - -Wed Oct 9 16:16:42 1996 Anthony Green - - * README, configure.in (VERSION): Boosted rev to 1.02 - * configure: Rebuilt. - -Tue Oct 8 11:56:33 1996 Anthony Green - - * README (NOTE): Added n32 notes. - - * Makefile.am: Added test production. - * Makefile: Rebuilt - - * README: spell checked! - - * configure.in (VERSION): Boosted rev to 1.01 - * configure: Rebuilt. - -Mon Oct 7 15:50:22 1996 Anthony Green - - * configure.in: Added nasty bit to support SGI tools. - * configure: Rebuilt. - - * README: Added SGI notes. Added note about automake bug. - -Mon Oct 7 11:00:28 1996 Anthony Green - - * README: Rewrote intro, and fixed examples. - -Fri Oct 4 10:19:55 1996 Anthony Green - - * configure.in: -D$TARGET is no longer used as a compiler switch. - It is now inserted into ffi.h at configure time. - * configure: Rebuilt. - - * FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status. - -Thu Oct 3 13:47:34 1996 Anthony Green - - * README, LICENSE: Created. Wrote some docs. - - * configure.in: Don't barf on i586-unknown-linuxaout. - Added EXTRADIST code for "make dist". - * configure: Rebuilt. - - * */Makefile.in: Rebuilt with patched automake. - -Tue Oct 1 17:12:25 1996 Anthony Green - - * Makefile.am, aclocal.m4, config.guess, config.sub, - configure.in, fficonfig.h.in, install-sh, mkinstalldirs, - stamp-h.in: Created - * Makefile.in, configure: Generated - ---- libffi/include -------------------------------------------------------- - -Tue Feb 24 13:09:36 1998 Anthony Green - - * ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on - ffi.h.in changes. This is a work-around for SGI's "simple" - assembler. - -Sun Feb 22 00:51:55 1998 Geoff Keating - - * ffi.h.in: PowerPC support. - -1998-02-14 Andreas Schwab - - * ffi.h.in: Add m68k support. - (FFI_TYPE_LONGDOUBLE): Make it a separate value. - -Tue Feb 10 20:55:16 1998 Richard Henderson - - * ffi.h.in (SIZEOF_ARG): Use a pointer type by default. - - * ffi.h.in: Alpha support. - -Fri Nov 22 06:48:45 1996 Anthony Green - - * ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions. - -Wed Nov 20 22:31:01 1996 Anthony Green - - * ffi.h.in: Added ffi_type_void definition. - -Tue Oct 29 12:22:40 1996 Anthony Green - - * Makefile.am (hack_DATA): Always install ffi_mips.h. - - * ffi.h.in: Removed FFI_DEBUG. It's now in the correct - place (acconfig.h). - Added #include for size_t definition. - -Tue Oct 15 17:23:35 1996 Anthony Green - - * ffi.h.in, ffi_common.h, ffi_mips.h: More clean up. - Commented out #define of FFI_DEBUG. - -Tue Oct 15 13:01:06 1996 Anthony Green - - * ffi_common.h: Added bool definition. - - * ffi.h.in, ffi_common.h: Clean up based on LCLint output. - Added funny /*@...@*/ comments to annotate source. - -Mon Oct 14 12:29:23 1996 Anthony Green - - * ffi.h.in: Interface changes based on feedback from Jim - Blandy. - -Fri Oct 11 16:49:35 1996 Anthony Green - - * ffi.h.in: Small change for sparc support. - -Thu Oct 10 14:53:37 1996 Anthony Green - - * ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for - special structure return types. - -Wed Oct 9 13:55:57 1996 Anthony Green - - * ffi.h.in: Added SIZEOF_ARG definition for X86 - -Tue Oct 8 11:40:36 1996 Anthony Green - - * ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings. - Use it to case your function pointers to the proper type. - - * ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug. - - * Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST. - * Makefile: Rebuilt. - - * ffi_mips.h: Created. Moved all common mips definitions here. - -Mon Oct 7 10:58:12 1996 Anthony Green - - * ffi.h.in: The SGI assember is very picky about parens. Redefined - some macros to avoid problems. - - * ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added - externs for pointer, and 64bit integral ffi_types. - -Fri Oct 4 09:51:37 1996 Anthony Green - - * ffi.h.in: Added FFI_ABI member to ffi_cif and changed - function prototypes accordingly. - Added #define @TARGET@. Now programs including ffi.h don't - have to specify this themselves. - -Thu Oct 3 15:36:44 1996 Anthony Green - - * ffi.h.in: Changed ffi_prep_cif's values from void* to void** - - * Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist" - to work. - * Makefile.in: Regenerated. - -Wed Oct 2 10:16:59 1996 Anthony Green - - * Makefile.am: Created - * Makefile.in: Generated - - * ffi_common.h: Added rcsid comment - -Tue Oct 1 17:13:51 1996 Anthony Green - - * ffi.h.in, ffi_common.h: Created - ---- libffi/src ------------------------------------------------------------ - -Mon Oct 5 02:17:50 1998 Anthony Green - - * arm/ffi.c, arm/sysv.S: Created. - - * Makefile.am: Added arm files. - * Makefile.in: Rebuilt. - -Mon Oct 5 01:41:38 1998 Anthony Green - - * Makefile.am (libffi_la_LDFLAGS): Incremented revision. - -Sun Oct 4 16:27:17 1998 Anthony Green - - * alpha/osf.S (ffi_call_osf): Patch for DU assembler. - - * ffitest.c (main): long long and long double return values work - for x86. - -Fri Apr 17 11:50:58 1998 Anthony Green - - * Makefile.in: Rebuilt. - - * ffitest.c (main): Floating point tests not executed for systems - with broken lond double (SunOS 4 w/ GCC). - - * types.c: Fixed x86 alignment info for long long types. - -Thu Apr 16 07:15:28 1998 Anthony Green - - * ffitest.c: Added more notes about GCC bugs under Irix 6. - -Wed Apr 15 08:42:22 1998 Anthony Green - - * ffitest.c (struct5): New test function. - (main): New test with struct5. - -Thu Mar 5 10:48:11 1998 Anthony Green - - * prep_cif.c (initialize_aggregate): Fix assertion for - nested structures. - -Tue Feb 24 16:33:41 1998 Anthony Green - - * prep_cif.c (ffi_prep_cif): Added long double support for sparc. - -Sun Feb 22 00:52:18 1998 Geoff Keating - - * powerpc/asm.h: New file. - * powerpc/ffi.c: New file. - * powerpc/sysv.S: New file. - * Makefile.am: PowerPC port. - * ffitest.c (main): Allow all tests to run even in presence of gcc - bug on PowerPC. - -1998-02-17 Anthony Green - - * mips/ffi.c: Fixed comment typo. - - * x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): - Fixed x86 long double return handling. - - * types.c: Fixed x86 long double alignment info. - -1998-02-14 Andreas Schwab - - * types.c: Add m68k support. - - * ffitest.c (floating): Add long double parameter. - (return_ll, ldblit): New functions to test long long and long - double return value. - (main): Fix type error in assignment of ts[1-4]_type.elements. - Add tests for long long and long double arguments and return - values. - - * prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for - struct value pointer. - - * m68k/ffi.c, m68k/sysv.S: New files. - * Makefile.am: Add bits for m68k port. Add kludge to work around - automake deficiency. - (test): Don't require "." in $PATH. - * Makefile.in: Rebuilt. - -Wed Feb 11 07:36:50 1998 Anthony Green - - * Makefile.in: Rebuilt. - -Tue Feb 10 20:56:00 1998 Richard Henderson - - * alpha/ffi.c, alpha/osf.S: New files. - * Makefile.am: Alpha port. - -Tue Nov 18 14:12:07 1997 Anthony Green - - * mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag - for n32. - -Tue Jun 3 17:18:20 1997 Anthony Green - - * ffitest.c (main): Added hack to get structure tests working - correctly. - -Sat May 10 19:06:42 1997 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Explicitly list all distributable - files in subdirs. - (VERSION, CC): Removed. - -Thu May 8 17:19:01 1997 Anthony Green - - * Makefile.am: Many changes for new automake and libtool. - * Makefile.in: Rebuilt. - -Fri Nov 22 06:57:56 1996 Anthony Green - - * ffitest.c (main): Fixed test case for non mips machines. - -Wed Nov 20 22:31:59 1996 Anthony Green - - * types.c: Added ffi_type_void declaration. - -Tue Oct 29 13:07:19 1996 Anthony Green - - * ffitest.c (main): Fixed character constants. - (main): Emit warning for structure test 3 failure on Sun. - - * Makefile.am (VPATH): Fixed VPATH def'n so automake won't - strip it out. - Moved distdir hack from libffi to automake. - (ffitest): Added missing -c for $(COMPILE) (change in automake). - * Makefile.in: Rebuilt. - -Tue Oct 15 13:08:20 1996 Anthony Green - - * Makefile.am: Added "make lint" production. - * Makefile.in: Rebuilt. - - * prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro. - Clean up based on LCLint output. Added funny /*@...@*/ comments to - annotate source. - - * ffitest.c, debug.c: Cleaned up code. - -Mon Oct 14 12:26:56 1996 Anthony Green - - * ffitest.c: Changes based on interface changes. - - * prep_cif.c (ffi_prep_cif): Cleaned up interface based on - feedback from Jim Blandy. - -Fri Oct 11 15:53:18 1996 Anthony Green - - * ffitest.c: Reordered tests while porting to sparc. - Made changes to handle lame structure passing for sparc. - Removed calls to fflush(). - - * prep_cif.c (ffi_prep_cif): Added special case for sparc - aggregate type arguments. - -Thu Oct 10 09:56:51 1996 Anthony Green - - * ffitest.c (main): Added structure passing/returning tests. - - * prep_cif.c (ffi_prep_cif): Perform proper initialization - of structure return types if needed. - (initialize_aggregate): Bug fix - -Wed Oct 9 16:04:20 1996 Anthony Green - - * types.c: Added special definitions for x86 (double doesn't - need double word alignment). - - * ffitest.c: Added many tests - -Tue Oct 8 09:19:22 1996 Anthony Green - - * prep_cif.c (ffi_prep_cif): Fixed assertion. - - * debug.c (ffi_assert): Must return a non void now. - - * Makefile.am: Added test production. - * Makefile: Rebuilt. - - * ffitest.c (main): Created. - - * types.c: Created. Stripped common code out of */ffi.c. - - * prep_cif.c: Added missing stdlib.h include. - - * debug.c (ffi_type_test): Used "a" to eliminate compiler - warnings in non-debug builds. Included ffi_common.h. - -Mon Oct 7 15:36:42 1996 Anthony Green - - * Makefile.am: Added a rule for .s -> .o - This is required by the SGI compiler. - * Makefile: Rebuilt. - -Fri Oct 4 09:51:08 1996 Anthony Green - - * prep_cif.c (initialize_aggregate): Moved abi specification - to ffi_prep_cif(). - -Thu Oct 3 15:37:37 1996 Anthony Green - - * prep_cif.c (ffi_prep_cif): Changed values from void* to void**. - (initialize_aggregate): Fixed aggregate type initialization. - - * Makefile.am (EXTRA_DIST): Added support code for "make dist". - * Makefile.in: Regenerated. - -Wed Oct 2 11:41:57 1996 Anthony Green - - * debug.c, prep_cif: Created. - - * Makefile.am: Added debug.o and prep_cif.o to OBJ. - * Makefile.in: Regenerated. - - * Makefile.am (INCLUDES): Added missing -I../include - * Makefile.in: Regenerated. - -Tue Oct 1 17:11:51 1996 Anthony Green - - * error.c, Makefile.am: Created. - * Makefile.in: Generated. - ---- libffi/src/x86 -------------------------------------------------------- - -Sun Oct 4 16:27:17 1998 Anthony Green - - * sysv.S (retlongdouble): Fixed long long return value support. - * ffi.c (ffi_prep_cif_machdep): Ditto. - -Wed May 13 04:30:33 1998 Anthony Green - - * ffi.c (ffi_prep_cif_machdep): Fixed long double return value - support. - -Wed Apr 15 08:43:20 1998 Anthony Green - - * ffi.c (ffi_prep_args): small struct support was missing. - -Thu May 8 16:53:58 1997 Anthony Green - - * objects.mak: Removed. - -Mon Dec 2 15:12:58 1996 Tom Tromey - - * sysv.S: Use .balign, for a.out Linux boxes. - -Tue Oct 15 13:06:50 1996 Anthony Green - - * ffi.c: Clean up based on LCLint output. - Added funny /*@...@*/ comments to annotate source. - -Fri Oct 11 16:43:38 1996 Anthony Green - - * ffi.c (ffi_call): Added assertion for bad ABIs. - -Wed Oct 9 13:57:27 1996 Anthony Green - - * sysv.S (retdouble): Fixed double return problems. - - * ffi.c (ffi_call): Corrected fn arg definition. - (ffi_prep_cif_machdep): Fixed double return problems - -Tue Oct 8 12:12:49 1996 Anthony Green - - * ffi.c: Moved ffi_type definitions to types.c. - (ffi_prep_args): Fixed type promotion bug. - -Mon Oct 7 15:53:06 1996 Anthony Green - - * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' - -Fri Oct 4 09:54:53 1996 Anthony Green - - * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped - remaining args. - -Wed Oct 2 10:07:05 1996 Anthony Green - - * ffi.c, sysv.S, objects.mak: Created. - (ffi_prep_cif): cif->rvalue no longer initialized to NULL. - (ffi_prep_cif_machdep): Moved machine independent cif processing - to src/prep_cif.c. Introduced ffi_prep_cif_machdep(). - ---- libffi/src/mips ------------------------------------------------------- - -Tue Feb 17 17:18:07 1998 Anthony Green - - * o32.S: Fixed typo in comment. - - * ffi.c (ffi_prep_cif_machdep): Fixed argument processing. - -Thu May 8 16:53:58 1997 Anthony Green - - * o32.s, n32.s: Wrappers for SGI tool support. - - * objects.mak: Removed. - -Tue Oct 29 14:37:45 1996 Anthony Green - - * ffi.c (ffi_prep_args): Changed int z to size_t z. - -Tue Oct 15 13:17:25 1996 Anthony Green - - * n32.S: Fixed bad stack munging. - - * ffi.c: Moved prototypes for ffi_call_?32() to here from - ffi_mips.h because extended_cif is not defined in ffi_mips.h. - -Mon Oct 14 12:42:02 1996 Anthony Green - - * ffi.c: Interface changes based on feedback from Jim Blandy. - -Thu Oct 10 11:22:16 1996 Anthony Green - - * n32.S, ffi.c: Lots of changes to support passing and - returning structures with the n32 calling convention. - - * n32.S: Fixed fn pointer bug. - - * ffi.c (ffi_prep_cif_machdep): Fix for o32 structure - return values. - (ffi_prep_args): Fixed n32 structure passing when structures - partially fit in registers. - -Wed Oct 9 13:49:25 1996 Anthony Green - - * objects.mak: Added n32.o. - - * n32.S: Created. - - * ffi.c (ffi_prep_args): Added magic to support proper - n32 processing. - -Tue Oct 8 10:37:35 1996 Anthony Green - - * ffi.c: Moved ffi_type definitions to types.c. - (ffi_prep_args): Fixed type promotion bug. - - * o32.S: This code is only built for o32 compiles. - A lot of the #define cruft has moved to ffi_mips.h. - - * ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg - is only processed if the first is either a float or double. - -Mon Oct 7 15:33:59 1996 Anthony Green - - * o32.S: Modified to compile under each of o32, n32 and n64. - - * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' - -Fri Oct 4 09:53:25 1996 Anthony Green - - * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped - remaining args. - -Wed Oct 2 17:41:22 1996 Anthony Green - - * o32.S: Removed crufty definitions. - -Wed Oct 2 12:53:42 1996 Anthony Green - - * ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL. - (ffi_prep_cif_machdep): Moved all machine independent cif processing - to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types - of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT. - -Tue Oct 1 17:11:02 1996 Anthony Green - - * ffi.c, o32.S, object.mak: Created - ---- libffi/src/sparc ------------------------------------------------------ - -Tue Feb 24 16:33:18 1998 Anthony Green - - * ffi.c (ffi_prep_args): Added long double support. - -Thu May 8 16:53:58 1997 Anthony Green - - * objects.mak: Removed. - -Thu May 1 16:07:56 1997 Anthony Green - - * v8.S: Fixed minor portability problem reported by - Russ McManus . - -Tue Nov 26 14:12:43 1996 Anthony Green - - * v8.S: Used STACKFRAME define elsewhere. - - * ffi.c (ffi_prep_args): Zero out space when USING_PURIFY - is set. - (ffi_prep_cif_machdep): Allocate the correct stack frame - space for functions with < 6 args. - -Tue Oct 29 15:08:55 1996 Anthony Green - - * ffi.c (ffi_prep_args): int z is now size_t z. - -Mon Oct 14 13:31:24 1996 Anthony Green - - * v8.S (ffi_call_V8): Gordon rewrites this again. It looks - great now. - - * ffi.c (ffi_call): The comment about hijacked registers - is no longer valid after gordoni hacked v8.S. - - * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler. - - * v8.S, ffi.c: ffi_call() had changed to accept more than - two args, so v8.S had to change (because it hijacks incoming - arg registers). - - * ffi.c: Interface changes based on feedback from Jim Blandy. - -Thu Oct 10 17:48:16 1996 Anthony Green - - * ffi.c, v8.S, objects.mak: Created. - - diff --git a/third_party/python/Modules/_ctypes/libffi/LICENSE b/third_party/python/Modules/_ctypes/libffi/LICENSE deleted file mode 100644 index a66fab4f2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others. -See source files for details. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/third_party/python/Modules/_ctypes/libffi/Makefile.am b/third_party/python/Modules/_ctypes/libffi/Makefile.am deleted file mode 100644 index 1dcdc8110..000000000 --- a/third_party/python/Modules/_ctypes/libffi/Makefile.am +++ /dev/null @@ -1,254 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS = foreign subdir-objects - -ACLOCAL_AMFLAGS = -I m4 - -SUBDIRS = include testsuite man - -EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ - src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ - 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 \ - src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ - src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ - src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ - src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ - src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ - src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ - src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ - src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ - src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h \ - src/microblaze/ffi.c src/microblaze/sysv.S \ - src/microblaze/ffitarget.h \ - src/nios2/ffi.c src/nios2/ffitarget.h src/nios2/sysv.S \ - src/powerpc/ffi.c src/powerpc/ffi_powerpc.h \ - src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ - src/powerpc/sysv.S src/powerpc/linux64.S \ - src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ - src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ - src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ - src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ - src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ - src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ - src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ - src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ - src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ - src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ - src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ - src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ - src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ - src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ - src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ - src/tile/ffitarget.h src/tile/tile.S libtool-version \ - src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S \ - src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ - ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ - libtool-ldflags ChangeLog.libffi-3.1 - -info_TEXINFOS = doc/libffi.texi - -## ################################################################ - -## -## This section is for make and multilib madness. -## - -# Work around what appears to be a GNU make bug handling MAKEFLAGS -# values defined in terms of make variables, as is the case for CC and -# friends when we are called from the top level Makefile. -AM_MAKEFLAGS = \ - 'AR_FLAGS=$(AR_FLAGS)' \ - 'CC_FOR_BUILD=$(CC_FOR_BUILD)' \ - 'CFLAGS=$(CFLAGS)' \ - 'CXXFLAGS=$(CXXFLAGS)' \ - 'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \ - 'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \ - 'INSTALL=$(INSTALL)' \ - 'INSTALL_DATA=$(INSTALL_DATA)' \ - 'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \ - 'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \ - 'JC1FLAGS=$(JC1FLAGS)' \ - 'LDFLAGS=$(LDFLAGS)' \ - 'LIBCFLAGS=$(LIBCFLAGS)' \ - 'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \ - 'MAKE=$(MAKE)' \ - 'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \ - 'PICFLAG=$(PICFLAG)' \ - 'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \ - 'RUNTESTFLAGS=$(RUNTESTFLAGS)' \ - 'SHELL=$(SHELL)' \ - 'exec_prefix=$(exec_prefix)' \ - 'infodir=$(infodir)' \ - 'libdir=$(libdir)' \ - 'mandir=$(mandir)' \ - 'prefix=$(prefix)' \ - 'AR=$(AR)' \ - 'AS=$(AS)' \ - 'CC=$(CC)' \ - 'CXX=$(CXX)' \ - 'LD=$(LD)' \ - 'NM=$(NM)' \ - 'RANLIB=$(RANLIB)' \ - 'DESTDIR=$(DESTDIR)' - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) - -MAKEOVERRIDES= - -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la - -libffi_la_SOURCES = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc - -nodist_libffi_la_SOURCES = - -if FFI_DEBUG -nodist_libffi_la_SOURCES += src/debug.c -endif - -if MIPS -nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S -endif -if BFIN -nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S -endif -if X86 -nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S src/x86/win32.S -endif -if X86_FREEBSD -nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S src/x86/win32.S -endif -if X86_WIN32 -nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S -endif -if X86_WIN64 -nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S -endif -if X86_DARWIN -nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S -if X86_DARWIN32 -nodist_libffi_la_SOURCES += src/x86/win32.S -endif -endif -if SPARC -nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S -endif -if ALPHA -nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S -endif -if IA64 -nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S -endif -if M32R -nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c -endif -if M68K -nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S -endif -if M88K -nodist_libffi_la_SOURCES += src/m88k/ffi.c src/m88k/obsd.S -endif -if MOXIE -nodist_libffi_la_SOURCES += src/moxie/ffi.c src/moxie/eabi.S -endif -if MICROBLAZE -nodist_libffi_la_SOURCES += src/microblaze/ffi.c src/microblaze/sysv.S -endif -if NIOS2 -nodist_libffi_la_SOURCES += src/nios2/sysv.S src/nios2/ffi.c -endif -if POWERPC -nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S -endif -if POWERPC_AIX -nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S -endif -if POWERPC_DARWIN -nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S -endif -if POWERPC_FREEBSD -nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/sysv.S src/powerpc/ppc_closure.S -endif -if AARCH64 -nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c -endif -if ARC -nodist_libffi_la_SOURCES += src/arc/arcompact.S src/arc/ffi.c -endif -if ARM -nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c -if FFI_EXEC_TRAMPOLINE_TABLE -nodist_libffi_la_SOURCES += src/arm/trampoline.S -endif -endif -if AVR32 -nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c -endif -if LIBFFI_CRIS -nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c -endif -if FRV -nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c -endif -if S390 -nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c -endif -if X86_64 -nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S -endif -if SH -nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c -endif -if SH64 -nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c -endif -if PA_LINUX -nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c -endif -if PA_HPUX -nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c -endif -if TILE -nodist_libffi_la_SOURCES += src/tile/tile.S src/tile/ffi.c -endif -if XTENSA -nodist_libffi_la_SOURCES += src/xtensa/sysv.S src/xtensa/ffi.c -endif -if METAG -nodist_libffi_la_SOURCES += src/metag/sysv.S src/metag/ffi.c -endif -if VAX -nodist_libffi_la_SOURCES += src/vax/elfbsd.S src/vax/ffi.c -endif - -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) - -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) - -AM_CFLAGS = -if FFI_DEBUG -# Build debug. Define FFI_DEBUG on the commandline so that, when building with -# MSVC, it can link against the debug CRT. -AM_CFLAGS += -DFFI_DEBUG -endif - -libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) - -AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -AM_CCASFLAGS = $(AM_CPPFLAGS) - -dist-hook: - if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog diff --git a/third_party/python/Modules/_ctypes/libffi/Makefile.in b/third_party/python/Modules/_ctypes/libffi/Makefile.in deleted file mode 100644 index 4a57abd3c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/Makefile.in +++ /dev/null @@ -1,2156 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -@FFI_DEBUG_TRUE@am__append_1 = src/debug.c -@MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S -@BFIN_TRUE@am__append_3 = src/bfin/ffi.c src/bfin/sysv.S -@X86_TRUE@am__append_4 = src/x86/ffi.c src/x86/sysv.S src/x86/win32.S -@X86_FREEBSD_TRUE@am__append_5 = src/x86/ffi.c src/x86/freebsd.S src/x86/win32.S -@X86_WIN32_TRUE@am__append_6 = src/x86/ffi.c src/x86/win32.S -@X86_WIN64_TRUE@am__append_7 = src/x86/ffi.c src/x86/win64.S -@X86_DARWIN_TRUE@am__append_8 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S -@X86_DARWIN32_TRUE@@X86_DARWIN_TRUE@am__append_9 = src/x86/win32.S -@SPARC_TRUE@am__append_10 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S -@ALPHA_TRUE@am__append_11 = src/alpha/ffi.c src/alpha/osf.S -@IA64_TRUE@am__append_12 = src/ia64/ffi.c src/ia64/unix.S -@M32R_TRUE@am__append_13 = src/m32r/sysv.S src/m32r/ffi.c -@M68K_TRUE@am__append_14 = src/m68k/ffi.c src/m68k/sysv.S -@M88K_TRUE@am__append_15 = src/m88k/ffi.c src/m88k/obsd.S -@MOXIE_TRUE@am__append_16 = src/moxie/ffi.c src/moxie/eabi.S -@MICROBLAZE_TRUE@am__append_17 = src/microblaze/ffi.c src/microblaze/sysv.S -@NIOS2_TRUE@am__append_18 = src/nios2/sysv.S src/nios2/ffi.c -@POWERPC_TRUE@am__append_19 = src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S -@POWERPC_AIX_TRUE@am__append_20 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S -@POWERPC_DARWIN_TRUE@am__append_21 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S -@POWERPC_FREEBSD_TRUE@am__append_22 = src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/sysv.S src/powerpc/ppc_closure.S -@AARCH64_TRUE@am__append_23 = src/aarch64/sysv.S src/aarch64/ffi.c -@ARC_TRUE@am__append_24 = src/arc/arcompact.S src/arc/ffi.c -@ARM_TRUE@am__append_25 = src/arm/sysv.S src/arm/ffi.c -@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_26 = src/arm/trampoline.S -@AVR32_TRUE@am__append_27 = src/avr32/sysv.S src/avr32/ffi.c -@LIBFFI_CRIS_TRUE@am__append_28 = src/cris/sysv.S src/cris/ffi.c -@FRV_TRUE@am__append_29 = src/frv/eabi.S src/frv/ffi.c -@S390_TRUE@am__append_30 = src/s390/sysv.S src/s390/ffi.c -@X86_64_TRUE@am__append_31 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S -@SH_TRUE@am__append_32 = src/sh/sysv.S src/sh/ffi.c -@SH64_TRUE@am__append_33 = src/sh64/sysv.S src/sh64/ffi.c -@PA_LINUX_TRUE@am__append_34 = src/pa/linux.S src/pa/ffi.c -@PA_HPUX_TRUE@am__append_35 = src/pa/hpux32.S src/pa/ffi.c -@TILE_TRUE@am__append_36 = src/tile/tile.S src/tile/ffi.c -@XTENSA_TRUE@am__append_37 = src/xtensa/sysv.S src/xtensa/ffi.c -@METAG_TRUE@am__append_38 = src/metag/sysv.S src/metag/ffi.c -@VAX_TRUE@am__append_39 = src/vax/elfbsd.S src/vax/ffi.c -# Build debug. Define FFI_DEBUG on the commandline so that, when building with -# MSVC, it can link against the debug CRT. -@FFI_DEBUG_TRUE@am__append_40 = -DFFI_DEBUG -subdir = . -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/fficonfig.h.in $(srcdir)/libffi.pc.in depcomp \ - mdate-sh $(srcdir)/doc/version.texi $(srcdir)/doc/stamp-vti \ - texinfo.tex README compile config.guess config.sub install-sh \ - missing ltmain.sh -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/m4/ax_compiler_vendor.m4 \ - $(top_srcdir)/m4/ax_configure_args.m4 \ - $(top_srcdir)/m4/ax_enable_builddir.m4 \ - $(top_srcdir)/m4/ax_gcc_archflag.m4 \ - $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = fficonfig.h -CONFIG_CLEAN_FILES = libffi.pc -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" \ - "$(DESTDIR)$(pkgconfigdir)" -LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) -libffi_la_LIBADD = -am__dirstamp = $(am__leading_dot)dirstamp -am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo -@FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo -@MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \ -@MIPS_TRUE@ src/mips/n32.lo -@BFIN_TRUE@am__objects_3 = src/bfin/ffi.lo src/bfin/sysv.lo -@X86_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/sysv.lo \ -@X86_TRUE@ src/x86/win32.lo -@X86_FREEBSD_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/freebsd.lo \ -@X86_FREEBSD_TRUE@ src/x86/win32.lo -@X86_WIN32_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win32.lo -@X86_WIN64_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/win64.lo -@X86_DARWIN_TRUE@am__objects_8 = src/x86/ffi.lo src/x86/darwin.lo \ -@X86_DARWIN_TRUE@ src/x86/ffi64.lo src/x86/darwin64.lo -@X86_DARWIN32_TRUE@@X86_DARWIN_TRUE@am__objects_9 = src/x86/win32.lo -@SPARC_TRUE@am__objects_10 = src/sparc/ffi.lo src/sparc/v8.lo \ -@SPARC_TRUE@ src/sparc/v9.lo -@ALPHA_TRUE@am__objects_11 = src/alpha/ffi.lo src/alpha/osf.lo -@IA64_TRUE@am__objects_12 = src/ia64/ffi.lo src/ia64/unix.lo -@M32R_TRUE@am__objects_13 = src/m32r/sysv.lo src/m32r/ffi.lo -@M68K_TRUE@am__objects_14 = src/m68k/ffi.lo src/m68k/sysv.lo -@M88K_TRUE@am__objects_15 = src/m88k/ffi.lo src/m88k/obsd.lo -@MOXIE_TRUE@am__objects_16 = src/moxie/ffi.lo src/moxie/eabi.lo -@MICROBLAZE_TRUE@am__objects_17 = src/microblaze/ffi.lo \ -@MICROBLAZE_TRUE@ src/microblaze/sysv.lo -@NIOS2_TRUE@am__objects_18 = src/nios2/sysv.lo src/nios2/ffi.lo -@POWERPC_TRUE@am__objects_19 = src/powerpc/ffi.lo \ -@POWERPC_TRUE@ src/powerpc/ffi_sysv.lo \ -@POWERPC_TRUE@ src/powerpc/ffi_linux64.lo src/powerpc/sysv.lo \ -@POWERPC_TRUE@ src/powerpc/ppc_closure.lo \ -@POWERPC_TRUE@ src/powerpc/linux64.lo \ -@POWERPC_TRUE@ src/powerpc/linux64_closure.lo -@POWERPC_AIX_TRUE@am__objects_20 = src/powerpc/ffi_darwin.lo \ -@POWERPC_AIX_TRUE@ src/powerpc/aix.lo \ -@POWERPC_AIX_TRUE@ src/powerpc/aix_closure.lo -@POWERPC_DARWIN_TRUE@am__objects_21 = src/powerpc/ffi_darwin.lo \ -@POWERPC_DARWIN_TRUE@ src/powerpc/darwin.lo \ -@POWERPC_DARWIN_TRUE@ src/powerpc/darwin_closure.lo -@POWERPC_FREEBSD_TRUE@am__objects_22 = src/powerpc/ffi.lo \ -@POWERPC_FREEBSD_TRUE@ src/powerpc/ffi_sysv.lo \ -@POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \ -@POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo -@AARCH64_TRUE@am__objects_23 = src/aarch64/sysv.lo src/aarch64/ffi.lo -@ARC_TRUE@am__objects_24 = src/arc/arcompact.lo src/arc/ffi.lo -@ARM_TRUE@am__objects_25 = src/arm/sysv.lo src/arm/ffi.lo -@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_26 = src/arm/trampoline.lo -@AVR32_TRUE@am__objects_27 = src/avr32/sysv.lo src/avr32/ffi.lo -@LIBFFI_CRIS_TRUE@am__objects_28 = src/cris/sysv.lo src/cris/ffi.lo -@FRV_TRUE@am__objects_29 = src/frv/eabi.lo src/frv/ffi.lo -@S390_TRUE@am__objects_30 = src/s390/sysv.lo src/s390/ffi.lo -@X86_64_TRUE@am__objects_31 = src/x86/ffi64.lo src/x86/unix64.lo \ -@X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo -@SH_TRUE@am__objects_32 = src/sh/sysv.lo src/sh/ffi.lo -@SH64_TRUE@am__objects_33 = src/sh64/sysv.lo src/sh64/ffi.lo -@PA_LINUX_TRUE@am__objects_34 = src/pa/linux.lo src/pa/ffi.lo -@PA_HPUX_TRUE@am__objects_35 = src/pa/hpux32.lo src/pa/ffi.lo -@TILE_TRUE@am__objects_36 = src/tile/tile.lo src/tile/ffi.lo -@XTENSA_TRUE@am__objects_37 = src/xtensa/sysv.lo src/xtensa/ffi.lo -@METAG_TRUE@am__objects_38 = src/metag/sysv.lo src/metag/ffi.lo -@VAX_TRUE@am__objects_39 = src/vax/elfbsd.lo src/vax/ffi.lo -nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - $(am__objects_3) $(am__objects_4) $(am__objects_5) \ - $(am__objects_6) $(am__objects_7) $(am__objects_8) \ - $(am__objects_9) $(am__objects_10) $(am__objects_11) \ - $(am__objects_12) $(am__objects_13) $(am__objects_14) \ - $(am__objects_15) $(am__objects_16) $(am__objects_17) \ - $(am__objects_18) $(am__objects_19) $(am__objects_20) \ - $(am__objects_21) $(am__objects_22) $(am__objects_23) \ - $(am__objects_24) $(am__objects_25) $(am__objects_26) \ - $(am__objects_27) $(am__objects_28) $(am__objects_29) \ - $(am__objects_30) $(am__objects_31) $(am__objects_32) \ - $(am__objects_33) $(am__objects_34) $(am__objects_35) \ - $(am__objects_36) $(am__objects_37) $(am__objects_38) \ - $(am__objects_39) -libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ - $(nodist_libffi_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ -libffi_convenience_la_LIBADD = -am__objects_40 = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo -am_libffi_convenience_la_OBJECTS = $(am__objects_40) -am__objects_41 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ - $(am__objects_4) $(am__objects_5) $(am__objects_6) \ - $(am__objects_7) $(am__objects_8) $(am__objects_9) \ - $(am__objects_10) $(am__objects_11) $(am__objects_12) \ - $(am__objects_13) $(am__objects_14) $(am__objects_15) \ - $(am__objects_16) $(am__objects_17) $(am__objects_18) \ - $(am__objects_19) $(am__objects_20) $(am__objects_21) \ - $(am__objects_22) $(am__objects_23) $(am__objects_24) \ - $(am__objects_25) $(am__objects_26) $(am__objects_27) \ - $(am__objects_28) $(am__objects_29) $(am__objects_30) \ - $(am__objects_31) $(am__objects_32) $(am__objects_33) \ - $(am__objects_34) $(am__objects_35) $(am__objects_36) \ - $(am__objects_37) $(am__objects_38) $(am__objects_39) -nodist_libffi_convenience_la_OBJECTS = $(am__objects_41) -libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ - $(nodist_libffi_convenience_la_OBJECTS) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CCASFLAGS) $(CCASFLAGS) -AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) -am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) -am__v_CPPAS_0 = @echo " CPPAS " $@; -am__v_CPPAS_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ - $(libffi_convenience_la_SOURCES) \ - $(nodist_libffi_convenience_la_SOURCES) -DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) -AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) -am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) -am__v_DVIPS_0 = @echo " DVIPS " $@; -am__v_DVIPS_1 = -AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) -am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) -am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; -am__v_MAKEINFO_1 = -AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) -am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) -am__v_INFOHTML_0 = @echo " INFOHTML" $@; -am__v_INFOHTML_1 = -AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) -am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) -am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; -am__v_TEXI2DVI_1 = -AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) -am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) -am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; -am__v_TEXI2PDF_1 = -AM_V_texinfo = $(am__v_texinfo_@AM_V@) -am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) -am__v_texinfo_0 = -q -am__v_texinfo_1 = -AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) -am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) -am__v_texidevnull_0 = > /dev/null -am__v_texidevnull_1 = -INFO_DEPS = $(srcdir)/doc/libffi.info -am__TEXINFO_TEX_DIR = $(srcdir) -DVIS = doc/libffi.dvi -PDFS = doc/libffi.pdf -PSS = doc/libffi.ps -HTMLS = doc/libffi.html -TEXINFOS = doc/libffi.texi -TEXI2DVI = texi2dvi -TEXI2PDF = $(TEXI2DVI) --pdf --batch -MAKEINFOHTML = $(MAKEINFO) --html -AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) -DVIPS = dvips -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(pkgconfig_DATA) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)fficonfig.h.in -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -DIST_TARGETS = dist-gzip -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AM_LTLDFLAGS = @AM_LTLDFLAGS@ -AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ -HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PRTDIAG = @PRTDIAG@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TARGET = @TARGET@ -TARGETDIR = @TARGETDIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -ax_enable_builddir_sed = @ax_enable_builddir_sed@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sys_symbol_underscore = @sys_symbol_underscore@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -toolexecdir = @toolexecdir@ -toolexeclibdir = @toolexeclibdir@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = foreign subdir-objects -ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = include testsuite man -EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ - src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ - 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 \ - src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ - src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ - src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ - src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ - src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ - src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ - src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ - src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ - src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h \ - src/microblaze/ffi.c src/microblaze/sysv.S \ - src/microblaze/ffitarget.h \ - src/nios2/ffi.c src/nios2/ffitarget.h src/nios2/sysv.S \ - src/powerpc/ffi.c src/powerpc/ffi_powerpc.h \ - src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ - src/powerpc/sysv.S src/powerpc/linux64.S \ - src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ - src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ - src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ - src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ - src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ - src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ - src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ - src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ - src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ - src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ - src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ - src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ - src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ - src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ - src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ - src/tile/ffitarget.h src/tile/tile.S libtool-version \ - src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S \ - src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ - ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ - libtool-ldflags ChangeLog.libffi-3.1 - -info_TEXINFOS = doc/libffi.texi - -# Work around what appears to be a GNU make bug handling MAKEFLAGS -# values defined in terms of make variables, as is the case for CC and -# friends when we are called from the top level Makefile. -AM_MAKEFLAGS = \ - 'AR_FLAGS=$(AR_FLAGS)' \ - 'CC_FOR_BUILD=$(CC_FOR_BUILD)' \ - 'CFLAGS=$(CFLAGS)' \ - 'CXXFLAGS=$(CXXFLAGS)' \ - 'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \ - 'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \ - 'INSTALL=$(INSTALL)' \ - 'INSTALL_DATA=$(INSTALL_DATA)' \ - 'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \ - 'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \ - 'JC1FLAGS=$(JC1FLAGS)' \ - 'LDFLAGS=$(LDFLAGS)' \ - 'LIBCFLAGS=$(LIBCFLAGS)' \ - 'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \ - 'MAKE=$(MAKE)' \ - 'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \ - 'PICFLAG=$(PICFLAG)' \ - 'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \ - 'RUNTESTFLAGS=$(RUNTESTFLAGS)' \ - 'SHELL=$(SHELL)' \ - 'exec_prefix=$(exec_prefix)' \ - 'infodir=$(infodir)' \ - 'libdir=$(libdir)' \ - 'mandir=$(mandir)' \ - 'prefix=$(prefix)' \ - 'AR=$(AR)' \ - 'AS=$(AS)' \ - 'CC=$(CC)' \ - 'CXX=$(CXX)' \ - 'LD=$(LD)' \ - 'NM=$(NM)' \ - 'RANLIB=$(RANLIB)' \ - 'DESTDIR=$(DESTDIR)' - - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) -MAKEOVERRIDES = -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la -libffi_la_SOURCES = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc -nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ - $(am__append_3) $(am__append_4) $(am__append_5) \ - $(am__append_6) $(am__append_7) $(am__append_8) \ - $(am__append_9) $(am__append_10) $(am__append_11) \ - $(am__append_12) $(am__append_13) $(am__append_14) \ - $(am__append_15) $(am__append_16) $(am__append_17) \ - $(am__append_18) $(am__append_19) $(am__append_20) \ - $(am__append_21) $(am__append_22) $(am__append_23) \ - $(am__append_24) $(am__append_25) $(am__append_26) \ - $(am__append_27) $(am__append_28) $(am__append_29) \ - $(am__append_30) $(am__append_31) $(am__append_32) \ - $(am__append_33) $(am__append_34) $(am__append_35) \ - $(am__append_36) $(am__append_37) $(am__append_38) \ - $(am__append_39) -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) -AM_CFLAGS = $(am__append_40) -libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) -AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -AM_CCASFLAGS = $(AM_CPPFLAGS) -all: fficonfig.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -.SUFFIXES: .S .c .dvi .lo .o .obj .ps -am--refresh: Makefile - @: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): - -fficonfig.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi - -stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h -$(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f fficonfig.h stamp-h1 -libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ - } - -uninstall-toolexeclibLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ - done - -clean-toolexeclibLTLIBRARIES: - -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) - @list='$(toolexeclib_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -src/$(am__dirstamp): - @$(MKDIR_P) src - @: > src/$(am__dirstamp) -src/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/$(DEPDIR) - @: > src/$(DEPDIR)/$(am__dirstamp) -src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/mips/$(am__dirstamp): - @$(MKDIR_P) src/mips - @: > src/mips/$(am__dirstamp) -src/mips/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/mips/$(DEPDIR) - @: > src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/ffi.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/o32.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/n32.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/bfin/$(am__dirstamp): - @$(MKDIR_P) src/bfin - @: > src/bfin/$(am__dirstamp) -src/bfin/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/bfin/$(DEPDIR) - @: > src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(DEPDIR)/$(am__dirstamp) -src/x86/$(am__dirstamp): - @$(MKDIR_P) src/x86 - @: > src/x86/$(am__dirstamp) -src/x86/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/x86/$(DEPDIR) - @: > src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/ffi.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/sysv.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/win32.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/win64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/darwin.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/sparc/$(am__dirstamp): - @$(MKDIR_P) src/sparc - @: > src/sparc/$(am__dirstamp) -src/sparc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sparc/$(DEPDIR) - @: > src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/alpha/$(am__dirstamp): - @$(MKDIR_P) src/alpha - @: > src/alpha/$(am__dirstamp) -src/alpha/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/alpha/$(DEPDIR) - @: > src/alpha/$(DEPDIR)/$(am__dirstamp) -src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ - src/alpha/$(DEPDIR)/$(am__dirstamp) -src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ - src/alpha/$(DEPDIR)/$(am__dirstamp) -src/ia64/$(am__dirstamp): - @$(MKDIR_P) src/ia64 - @: > src/ia64/$(am__dirstamp) -src/ia64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/ia64/$(DEPDIR) - @: > src/ia64/$(DEPDIR)/$(am__dirstamp) -src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ - src/ia64/$(DEPDIR)/$(am__dirstamp) -src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ - src/ia64/$(DEPDIR)/$(am__dirstamp) -src/m32r/$(am__dirstamp): - @$(MKDIR_P) src/m32r - @: > src/m32r/$(am__dirstamp) -src/m32r/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m32r/$(DEPDIR) - @: > src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ - src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ - src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m68k/$(am__dirstamp): - @$(MKDIR_P) src/m68k - @: > src/m68k/$(am__dirstamp) -src/m68k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m68k/$(DEPDIR) - @: > src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ - src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ - src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m88k/$(am__dirstamp): - @$(MKDIR_P) src/m88k - @: > src/m88k/$(am__dirstamp) -src/m88k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m88k/$(DEPDIR) - @: > src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/moxie/$(am__dirstamp): - @$(MKDIR_P) src/moxie - @: > src/moxie/$(am__dirstamp) -src/moxie/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/moxie/$(DEPDIR) - @: > src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/microblaze/$(am__dirstamp): - @$(MKDIR_P) src/microblaze - @: > src/microblaze/$(am__dirstamp) -src/microblaze/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/microblaze/$(DEPDIR) - @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/nios2/$(am__dirstamp): - @$(MKDIR_P) src/nios2 - @: > src/nios2/$(am__dirstamp) -src/nios2/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/nios2/$(DEPDIR) - @: > src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/powerpc/$(am__dirstamp): - @$(MKDIR_P) src/powerpc - @: > src/powerpc/$(am__dirstamp) -src/powerpc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/powerpc/$(DEPDIR) - @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_linux64.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/aarch64/$(am__dirstamp): - @$(MKDIR_P) src/aarch64 - @: > src/aarch64/$(am__dirstamp) -src/aarch64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/aarch64/$(DEPDIR) - @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/arc/$(am__dirstamp): - @$(MKDIR_P) src/arc - @: > src/arc/$(am__dirstamp) -src/arc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/arc/$(DEPDIR) - @: > src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/arcompact.lo: src/arc/$(am__dirstamp) \ - src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/ffi.lo: src/arc/$(am__dirstamp) \ - src/arc/$(DEPDIR)/$(am__dirstamp) -src/arm/$(am__dirstamp): - @$(MKDIR_P) src/arm - @: > src/arm/$(am__dirstamp) -src/arm/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/arm/$(DEPDIR) - @: > src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/sysv.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/ffi.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/avr32/$(am__dirstamp): - @$(MKDIR_P) src/avr32 - @: > src/avr32/$(am__dirstamp) -src/avr32/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/avr32/$(DEPDIR) - @: > src/avr32/$(DEPDIR)/$(am__dirstamp) -src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/cris/$(am__dirstamp): - @$(MKDIR_P) src/cris - @: > src/cris/$(am__dirstamp) -src/cris/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/cris/$(DEPDIR) - @: > src/cris/$(DEPDIR)/$(am__dirstamp) -src/cris/sysv.lo: src/cris/$(am__dirstamp) \ - src/cris/$(DEPDIR)/$(am__dirstamp) -src/cris/ffi.lo: src/cris/$(am__dirstamp) \ - src/cris/$(DEPDIR)/$(am__dirstamp) -src/frv/$(am__dirstamp): - @$(MKDIR_P) src/frv - @: > src/frv/$(am__dirstamp) -src/frv/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/frv/$(DEPDIR) - @: > src/frv/$(DEPDIR)/$(am__dirstamp) -src/frv/eabi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(DEPDIR)/$(am__dirstamp) -src/frv/ffi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(DEPDIR)/$(am__dirstamp) -src/s390/$(am__dirstamp): - @$(MKDIR_P) src/s390 - @: > src/s390/$(am__dirstamp) -src/s390/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/s390/$(DEPDIR) - @: > src/s390/$(DEPDIR)/$(am__dirstamp) -src/s390/sysv.lo: src/s390/$(am__dirstamp) \ - src/s390/$(DEPDIR)/$(am__dirstamp) -src/s390/ffi.lo: src/s390/$(am__dirstamp) \ - src/s390/$(DEPDIR)/$(am__dirstamp) -src/x86/unix64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/sh/$(am__dirstamp): - @$(MKDIR_P) src/sh - @: > src/sh/$(am__dirstamp) -src/sh/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sh/$(DEPDIR) - @: > src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh/sysv.lo: src/sh/$(am__dirstamp) \ - src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh64/$(am__dirstamp): - @$(MKDIR_P) src/sh64 - @: > src/sh64/$(am__dirstamp) -src/sh64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sh64/$(DEPDIR) - @: > src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(DEPDIR)/$(am__dirstamp) -src/pa/$(am__dirstamp): - @$(MKDIR_P) src/pa - @: > src/pa/$(am__dirstamp) -src/pa/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/pa/$(DEPDIR) - @: > src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/linux.lo: src/pa/$(am__dirstamp) \ - src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ - src/pa/$(DEPDIR)/$(am__dirstamp) -src/tile/$(am__dirstamp): - @$(MKDIR_P) src/tile - @: > src/tile/$(am__dirstamp) -src/tile/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/tile/$(DEPDIR) - @: > src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/tile.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/ffi.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/xtensa/$(am__dirstamp): - @$(MKDIR_P) src/xtensa - @: > src/xtensa/$(am__dirstamp) -src/xtensa/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/xtensa/$(DEPDIR) - @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/metag/$(am__dirstamp): - @$(MKDIR_P) src/metag - @: > src/metag/$(am__dirstamp) -src/metag/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/metag/$(DEPDIR) - @: > src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/sysv.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/ffi.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/vax/$(am__dirstamp): - @$(MKDIR_P) src/vax - @: > src/vax/$(am__dirstamp) -src/vax/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/vax/$(DEPDIR) - @: > src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \ - src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/ffi.lo: src/vax/$(am__dirstamp) \ - src/vax/$(DEPDIR)/$(am__dirstamp) - -libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) - $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) - -libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -rm -f src/*.$(OBJEXT) - -rm -f src/*.lo - -rm -f src/aarch64/*.$(OBJEXT) - -rm -f src/aarch64/*.lo - -rm -f src/alpha/*.$(OBJEXT) - -rm -f src/alpha/*.lo - -rm -f src/arc/*.$(OBJEXT) - -rm -f src/arc/*.lo - -rm -f src/arm/*.$(OBJEXT) - -rm -f src/arm/*.lo - -rm -f src/avr32/*.$(OBJEXT) - -rm -f src/avr32/*.lo - -rm -f src/bfin/*.$(OBJEXT) - -rm -f src/bfin/*.lo - -rm -f src/cris/*.$(OBJEXT) - -rm -f src/cris/*.lo - -rm -f src/frv/*.$(OBJEXT) - -rm -f src/frv/*.lo - -rm -f src/ia64/*.$(OBJEXT) - -rm -f src/ia64/*.lo - -rm -f src/m32r/*.$(OBJEXT) - -rm -f src/m32r/*.lo - -rm -f src/m68k/*.$(OBJEXT) - -rm -f src/m68k/*.lo - -rm -f src/m88k/*.$(OBJEXT) - -rm -f src/m88k/*.lo - -rm -f src/metag/*.$(OBJEXT) - -rm -f src/metag/*.lo - -rm -f src/microblaze/*.$(OBJEXT) - -rm -f src/microblaze/*.lo - -rm -f src/mips/*.$(OBJEXT) - -rm -f src/mips/*.lo - -rm -f src/moxie/*.$(OBJEXT) - -rm -f src/moxie/*.lo - -rm -f src/nios2/*.$(OBJEXT) - -rm -f src/nios2/*.lo - -rm -f src/pa/*.$(OBJEXT) - -rm -f src/pa/*.lo - -rm -f src/powerpc/*.$(OBJEXT) - -rm -f src/powerpc/*.lo - -rm -f src/s390/*.$(OBJEXT) - -rm -f src/s390/*.lo - -rm -f src/sh/*.$(OBJEXT) - -rm -f src/sh/*.lo - -rm -f src/sh64/*.$(OBJEXT) - -rm -f src/sh64/*.lo - -rm -f src/sparc/*.$(OBJEXT) - -rm -f src/sparc/*.lo - -rm -f src/tile/*.$(OBJEXT) - -rm -f src/tile/*.lo - -rm -f src/vax/*.$(OBJEXT) - -rm -f src/vax/*.lo - -rm -f src/x86/*.$(OBJEXT) - -rm -f src/x86/*.lo - -rm -f src/xtensa/*.$(OBJEXT) - -rm -f src/xtensa/*.lo - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/arcompact.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/obsd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_linux64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/tile.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/elfbsd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/ffi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/sysv.Plo@am__quote@ - -.S.o: -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< - -.S.obj: -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.S.lo: -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $< - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -rm -rf src/.libs src/_libs - -rm -rf src/aarch64/.libs src/aarch64/_libs - -rm -rf src/alpha/.libs src/alpha/_libs - -rm -rf src/arc/.libs src/arc/_libs - -rm -rf src/arm/.libs src/arm/_libs - -rm -rf src/avr32/.libs src/avr32/_libs - -rm -rf src/bfin/.libs src/bfin/_libs - -rm -rf src/cris/.libs src/cris/_libs - -rm -rf src/frv/.libs src/frv/_libs - -rm -rf src/ia64/.libs src/ia64/_libs - -rm -rf src/m32r/.libs src/m32r/_libs - -rm -rf src/m68k/.libs src/m68k/_libs - -rm -rf src/m88k/.libs src/m88k/_libs - -rm -rf src/metag/.libs src/metag/_libs - -rm -rf src/microblaze/.libs src/microblaze/_libs - -rm -rf src/mips/.libs src/mips/_libs - -rm -rf src/moxie/.libs src/moxie/_libs - -rm -rf src/nios2/.libs src/nios2/_libs - -rm -rf src/pa/.libs src/pa/_libs - -rm -rf src/powerpc/.libs src/powerpc/_libs - -rm -rf src/s390/.libs src/s390/_libs - -rm -rf src/sh/.libs src/sh/_libs - -rm -rf src/sh64/.libs src/sh64/_libs - -rm -rf src/sparc/.libs src/sparc/_libs - -rm -rf src/tile/.libs src/tile/_libs - -rm -rf src/vax/.libs src/vax/_libs - -rm -rf src/x86/.libs src/x86/_libs - -rm -rf src/xtensa/.libs src/xtensa/_libs - -distclean-libtool: - -rm -f libtool config.lt -doc/$(am__dirstamp): - @$(MKDIR_P) doc - @: > doc/$(am__dirstamp) - -$(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi - $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ - am__cwd=`pwd` && $(am__cd) $(srcdir) && \ - rm -rf $$backupdir && mkdir $$backupdir && \ - if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ - for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ - if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ - done; \ - else :; fi && \ - cd "$$am__cwd"; \ - if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ - -o $@ $(srcdir)/doc/libffi.texi; \ - then \ - rc=0; \ - $(am__cd) $(srcdir); \ - else \ - rc=$$?; \ - $(am__cd) $(srcdir) && \ - $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ - fi; \ - rm -rf $$backupdir; exit $$rc - -doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) - $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ - MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ - $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ - `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi - -doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) - $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ - MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ - $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ - `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi - -doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) - $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) - $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ - -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \ - then \ - rm -rf $@; \ - if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ - mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ - else \ - if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ - rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ - exit 1; \ - fi -$(srcdir)/doc/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/doc/stamp-vti -$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure - test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp) - @(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \ - set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \ - echo "@set UPDATED $$1 $$2 $$3"; \ - echo "@set UPDATED-MONTH $$2 $$3"; \ - echo "@set EDITION $(VERSION)"; \ - echo "@set VERSION $(VERSION)") > vti.tmp - @cmp -s vti.tmp $(srcdir)/doc/version.texi \ - || (echo "Updating $(srcdir)/doc/version.texi"; \ - cp vti.tmp $(srcdir)/doc/version.texi) - -@rm -f vti.tmp - @cp $(srcdir)/doc/version.texi $@ - -mostlyclean-vti: - -rm -f vti.tmp - -maintainer-clean-vti: -@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi -.dvi.ps: - $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ - $(DVIPS) $(AM_V_texinfo) -o $@ $< - -uninstall-dvi-am: - @$(NORMAL_UNINSTALL) - @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ - rm -f "$(DESTDIR)$(dvidir)/$$f"; \ - done - -uninstall-html-am: - @$(NORMAL_UNINSTALL) - @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ - rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ - done - -uninstall-info-am: - @$(PRE_UNINSTALL) - @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - relfile=`echo "$$file" | sed 's|^.*/||'`; \ - echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ - if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ - then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ - done; \ - else :; fi - @$(NORMAL_UNINSTALL) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - relfile=`echo "$$file" | sed 's|^.*/||'`; \ - relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ - (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ - echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ - rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ - else :; fi); \ - done - -uninstall-pdf-am: - @$(NORMAL_UNINSTALL) - @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ - rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ - done - -uninstall-ps-am: - @$(NORMAL_UNINSTALL) - @list='$(PSS)'; test -n "$(psdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ - rm -f "$(DESTDIR)$(psdir)/$$f"; \ - done - -dist-info: $(INFO_DEPS) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - list='$(INFO_DEPS)'; \ - for base in $$list; do \ - case $$base in \ - $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ - esac; \ - if test -f $$base; then d=.; else d=$(srcdir); fi; \ - base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ - for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ - if test -f $$file; then \ - relfile=`expr "$$file" : "$$d/\(.*\)"`; \ - test -f "$(distdir)/$$relfile" || \ - cp -p $$file "$(distdir)/$$relfile"; \ - else :; fi; \ - done; \ - done - -mostlyclean-aminfo: - -rm -rf doc/libffi.t2d doc/libffi.t2p - -clean-aminfo: - -test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \ - || rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html - -maintainer-clean-aminfo: - @list='$(INFO_DEPS)'; for i in $$list; do \ - i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ - echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ - rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ - done -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-info dist-hook - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) - -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__post_remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -rm -f doc/$(am__dirstamp) - -rm -f src/$(DEPDIR)/$(am__dirstamp) - -rm -f src/$(am__dirstamp) - -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/aarch64/$(am__dirstamp) - -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) - -rm -f src/alpha/$(am__dirstamp) - -rm -f src/arc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/arc/$(am__dirstamp) - -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) - -rm -f src/arm/$(am__dirstamp) - -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) - -rm -f src/avr32/$(am__dirstamp) - -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) - -rm -f src/bfin/$(am__dirstamp) - -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) - -rm -f src/cris/$(am__dirstamp) - -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) - -rm -f src/frv/$(am__dirstamp) - -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/ia64/$(am__dirstamp) - -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m32r/$(am__dirstamp) - -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m68k/$(am__dirstamp) - -rm -f src/m88k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m88k/$(am__dirstamp) - -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) - -rm -f src/metag/$(am__dirstamp) - -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) - -rm -f src/microblaze/$(am__dirstamp) - -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) - -rm -f src/mips/$(am__dirstamp) - -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) - -rm -f src/moxie/$(am__dirstamp) - -rm -f src/nios2/$(DEPDIR)/$(am__dirstamp) - -rm -f src/nios2/$(am__dirstamp) - -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) - -rm -f src/pa/$(am__dirstamp) - -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/powerpc/$(am__dirstamp) - -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) - -rm -f src/s390/$(am__dirstamp) - -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sh/$(am__dirstamp) - -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sh64/$(am__dirstamp) - -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sparc/$(am__dirstamp) - -rm -f src/tile/$(DEPDIR)/$(am__dirstamp) - -rm -f src/tile/$(am__dirstamp) - -rm -f src/vax/$(DEPDIR)/$(am__dirstamp) - -rm -f src/vax/$(am__dirstamp) - -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) - -rm -f src/x86/$(am__dirstamp) - -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) - -rm -f src/xtensa/$(am__dirstamp) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-aminfo clean-generic clean-libtool \ - clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES \ - mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: $(DVIS) - -html: html-recursive - -html-am: $(HTMLS) - -info: info-recursive - -info-am: $(INFO_DEPS) - -install-data-am: install-info-am install-pkgconfigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: $(DVIS) - @$(NORMAL_INSTALL) - @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ - done -install-exec-am: install-toolexeclibLTLIBRARIES - -install-html: install-html-recursive - -install-html-am: $(HTMLS) - @$(NORMAL_INSTALL) - @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ - $(am__strip_dir) \ - d2=$$d$$p; \ - if test -d "$$d2"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ - $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ - echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ - $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ - else \ - list2="$$list2 $$d2"; \ - fi; \ - done; \ - test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ - done; } -install-info: install-info-recursive - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ - fi; \ - for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - esac; \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ - for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ - $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ - if test -f $$ifile; then \ - echo "$$ifile"; \ - else : ; fi; \ - done; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done - @$(POST_INSTALL) - @if $(am__can_run_installinfo); then \ - list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ - for file in $$list; do \ - relfile=`echo "$$file" | sed 's|^.*/||'`; \ - echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ - install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ - done; \ - else : ; fi -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: $(PDFS) - @$(NORMAL_INSTALL) - @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done -install-ps: install-ps-recursive - -install-ps-am: $(PSS) - @$(NORMAL_INSTALL) - @list='$(PSS)'; test -n "$(psdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-aminfo \ - maintainer-clean-generic maintainer-clean-vti - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool mostlyclean-vti - -pdf: pdf-recursive - -pdf-am: $(PDFS) - -ps: ps-recursive - -ps-am: $(PSS) - -uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ - uninstall-pdf-am uninstall-pkgconfigDATA uninstall-ps-am \ - uninstall-toolexeclibLTLIBRARIES - -.MAKE: $(am__recursive_targets) all install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-aminfo clean-cscope \ - clean-generic clean-libtool clean-noinstLTLIBRARIES \ - clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \ - ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ - dist-info dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags distcleancheck \ - distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-pkgconfigDATA \ - install-ps install-ps-am install-strip \ - install-toolexeclibLTLIBRARIES installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-aminfo maintainer-clean-generic \ - maintainer-clean-vti mostlyclean mostlyclean-aminfo \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - mostlyclean-vti pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-dvi-am uninstall-html-am \ - uninstall-info-am uninstall-pdf-am uninstall-pkgconfigDATA \ - uninstall-ps-am uninstall-toolexeclibLTLIBRARIES - - -dist-hook: - if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/third_party/python/Modules/_ctypes/libffi/README b/third_party/python/Modules/_ctypes/libffi/README deleted file mode 100644 index 84b942677..000000000 --- a/third_party/python/Modules/_ctypes/libffi/README +++ /dev/null @@ -1,428 +0,0 @@ -Status -====== - -libffi-3.1 was released on May 19, 2014. Check the libffi web page -for updates: . - - -What is libffi? -=============== - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling -convention". The "calling convention" is essentially a set of -assumptions made by the compiler about where function arguments will -be found on entry to a function. A "calling convention" also specifies -where the return value for a function is found. - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. Libffi can be used in such programs to provide a -bridge from the interpreter program to compiled code. - -The libffi library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -FFI stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code -written in one language to call code written in another language. The -libffi library really only provides the lowest, machine dependent -layer of a fully featured foreign function interface. A layer must -exist above libffi that handles type conversions for values passed -between the two languages. - - -Supported Platforms -=================== - -Libffi has been ported to many different platforms. -For specific configuration details and testing status, please -refer to the wiki page here: - - http://www.moxielogic.org/wiki/index.php?title=Libffi_3.1 - -At the time of release, the following basic configurations have been -tested: - -|-----------------+------------------+-------------------------| -| Architecture | Operating System | Compiler | -|-----------------+------------------+-------------------------| -| AArch64 (ARM64) | iOS | Clang | -| AArch64 | Linux | GCC | -| Alpha | Linux | GCC | -| Alpha | Tru64 | GCC | -| ARC | Linux | GCC | -| ARM | Linux | GCC | -| ARM | iOS | GCC | -| AVR32 | Linux | GCC | -| Blackfin | uClinux | GCC | -| HPPA | HPUX | GCC | -| IA-64 | Linux | GCC | -| M68K | FreeMiNT | GCC | -| M68K | Linux | GCC | -| M68K | RTEMS | GCC | -| M88K | OpenBSD/mvme88k | GCC | -| Meta | Linux | GCC | -| MicroBlaze | Linux | GCC | -| MIPS | IRIX | GCC | -| MIPS | Linux | GCC | -| MIPS | RTEMS | GCC | -| MIPS64 | Linux | GCC | -| Moxie | Bare metal | GCC | -| Nios II | Linux | GCC | -| PowerPC 32-bit | AIX | IBM XL C | -| PowerPC 64-bit | AIX | IBM XL C | -| PowerPC | AMIGA | GCC | -| PowerPC | Linux | GCC | -| PowerPC | Mac OSX | GCC | -| PowerPC | FreeBSD | GCC | -| PowerPC 64-bit | FreeBSD | GCC | -| PowerPC 64-bit | Linux ELFv1 | GCC | -| PowerPC 64-bit | Linux ELFv2 | GCC | -| S390 | Linux | GCC | -| S390X | Linux | GCC | -| SPARC | Linux | GCC | -| SPARC | Solaris | GCC | -| SPARC | Solaris | Oracle Solaris Studio C | -| SPARC64 | Linux | GCC | -| SPARC64 | FreeBSD | GCC | -| SPARC64 | Solaris | Oracle Solaris Studio C | -| TILE-Gx/TILEPro | Linux | GCC | -| VAX | OpenBSD/vax | GCC | -| X86 | FreeBSD | GCC | -| X86 | GNU HURD | GCC | -| X86 | Interix | GCC | -| X86 | kFreeBSD | GCC | -| X86 | Linux | GCC | -| X86 | Mac OSX | GCC | -| X86 | OpenBSD | GCC | -| X86 | OS/2 | GCC | -| X86 | Solaris | GCC | -| X86 | Solaris | Oracle Solaris Studio C | -| X86 | Windows/Cygwin | GCC | -| X86 | Windows/MingW | GCC | -| X86-64 | FreeBSD | GCC | -| X86-64 | Linux | GCC | -| X86-64 | Linux/x32 | GCC | -| X86-64 | OpenBSD | GCC | -| X86-64 | Solaris | Oracle Solaris Studio C | -| X86-64 | Windows/MingW | GCC | -| Xtensa | Linux | GCC | -|-----------------+------------------+-------------------------| - -Please send additional platform test results to -libffi-discuss@sourceware.org and feel free to update the wiki page -above. - -Installing libffi -================= - -First you must configure the distribution for your particular -system. Go to the directory you wish to build libffi in and run the -"configure" program found in the root directory of the libffi source -distribution. - -If you're building libffi directly from version control, configure won't -exist yet; run ./autogen.sh first. - -You may want to tell configure where to install the libffi library and -header files. To do that, use the --prefix configure switch. Libffi -will install under /usr/local by default. - -If you want to enable extra run-time debugging checks use the the ---enable-debug configure switch. This is useful when your program dies -mysteriously while using libffi. - -Another useful configure switch is --enable-purify-safety. Using this -will add some extra code which will suppress certain warnings when you -are using Purify with libffi. Only use this switch when using -Purify, as it will slow down the library. - -It's also possible to build libffi on Windows platforms with -Microsoft's Visual C++ compiler. In this case, use the msvcc.sh -wrapper script during configuration like so: - -path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\" - -For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64" and -CXX="path/to/msvcc.sh -m64". You may also need to specify --build -appropriately. - -When building with MSVC under a MingW environment, you may need to -remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath' -command. ('cygpath' is not present in MingW, and is not required when -using MingW-style paths.) - -For iOS builds, the 'libffi.xcodeproj' Xcode project is available. - -Configure has many other options. Use "configure --help" to see them all. - -Once configure has finished, type "make". Note that you must be using -GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make . - -To ensure that libffi is working as advertised, type "make check". -This will require that you have DejaGNU installed. - -To install the library and header files, type "make install". - - -History -======= - -See the git log for details at http://github.com/atgreen/libffi. - -3.1 May-19-14 - Add AArch64 (ARM64) iOS support. - Add Nios II support. - Add m88k and DEC VAX support. - Add support for stdcall, thiscall, and fastcall on non-Windows - 32-bit x86 targets such as Linux. - Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi - fixes. - Make the testsuite more robust: eliminate several spurious - failures, and respect the $CC and $CXX environment variables. - Archive off the manually maintained ChangeLog in favor of git - log. - -3.0.13 Mar-17-13 - Add Meta support. - Add missing Moxie bits. - Fix stack alignment bug on 32-bit x86. - Build fix for m68000 targets. - Build fix for soft-float Power targets. - Fix the install dir location for some platforms when building - with GCC (OS X, Solaris). - Fix Cygwin regression. - -3.0.12 Feb-11-13 - Add Moxie support. - Add AArch64 support. - Add Blackfin support. - Add TILE-Gx/TILEPro support. - Add MicroBlaze support. - Add Xtensa support. - Add support for PaX enabled kernels with MPROTECT. - Add support for native vendor compilers on - Solaris and AIX. - Work around LLVM/GCC interoperability issue on x86_64. - -3.0.11 Apr-11-12 - Lots of build fixes. - Add support for variadic functions (ffi_prep_cif_var). - Add Linux/x32 support. - Add thiscall, fastcall and MSVC cdecl support on Windows. - Add Amiga and newer MacOS support. - Add m68k FreeMiNT support. - Integration with iOS' xcode build tools. - Fix Octeon and MC68881 support. - Fix code pessimizations. - -3.0.10 Aug-23-11 - Add support for Apple's iOS. - Add support for ARM VFP ABI. - Add RTEMS support for MIPS and M68K. - Fix instruction cache clearing problems on - ARM and SPARC. - Fix the N64 build on mips-sgi-irix6.5. - Enable builds with Microsoft's compiler. - Enable x86 builds with Oracle's Solaris compiler. - Fix support for calling code compiled with Oracle's Sparc - Solaris compiler. - Testsuite fixes for Tru64 Unix. - Additional platform support. - -3.0.9 Dec-31-09 - Add AVR32 and win64 ports. Add ARM softfp support. - Many fixes for AIX, Solaris, HP-UX, *BSD. - Several PowerPC and x86-64 bug fixes. - Build DLL for windows. - -3.0.8 Dec-19-08 - Add *BSD, BeOS, and PA-Linux support. - -3.0.7 Nov-11-08 - Fix for ppc FreeBSD. - (thanks to Andreas Tobler) - -3.0.6 Jul-17-08 - Fix for closures on sh. - Mark the sh/sh64 stack as non-executable. - (both thanks to Kaz Kojima) - -3.0.5 Apr-3-08 - Fix libffi.pc file. - Fix #define ARM for IcedTea users. - Fix x86 closure bug. - -3.0.4 Feb-24-08 - Fix x86 OpenBSD configury. - -3.0.3 Feb-22-08 - Enable x86 OpenBSD thanks to Thomas Heller, and - x86-64 FreeBSD thanks to Björn König and Andreas Tobler. - Clean up test instruction in README. - -3.0.2 Feb-21-08 - Improved x86 FreeBSD support. - Thanks to Björn König. - -3.0.1 Feb-15-08 - Fix instruction cache flushing bug on MIPS. - Thanks to David Daney. - -3.0.0 Feb-15-08 - Many changes, mostly thanks to the GCC project. - Cygnus Solutions is now Red Hat. - - [10 years go by...] - -1.20 Oct-5-98 - Raffaele Sena produces ARM port. - -1.19 Oct-5-98 - Fixed x86 long double and long long return support. - m68k bug fixes from Andreas Schwab. - Patch for DU assembler compatibility for the Alpha from Richard - Henderson. - -1.18 Apr-17-98 - Bug fixes and MIPS configuration changes. - -1.17 Feb-24-98 - Bug fixes and m68k port from Andreas Schwab. PowerPC port from - Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. - -1.16 Feb-11-98 - Richard Henderson produces Alpha port. - -1.15 Dec-4-97 - Fixed an n32 ABI bug. New libtool, auto* support. - -1.14 May-13-97 - libtool is now used to generate shared and static libraries. - Fixed a minor portability problem reported by Russ McManus - . - -1.13 Dec-2-96 - Added --enable-purify-safety to keep Purify from complaining - about certain low level code. - Sparc fix for calling functions with < 6 args. - Linux x86 a.out fix. - -1.12 Nov-22-96 - Added missing ffi_type_void, needed for supporting void return - types. Fixed test case for non MIPS machines. Cygnus Support - is now Cygnus Solutions. - -1.11 Oct-30-96 - Added notes about GNU make. - -1.10 Oct-29-96 - Added configuration fix for non GNU compilers. - -1.09 Oct-29-96 - Added --enable-debug configure switch. Clean-ups based on LCLint - feedback. ffi_mips.h is always installed. Many configuration - fixes. Fixed ffitest.c for sparc builds. - -1.08 Oct-15-96 - Fixed n32 problem. Many clean-ups. - -1.07 Oct-14-96 - Gordon Irlam rewrites v8.S again. Bug fixes. - -1.06 Oct-14-96 - Gordon Irlam improved the sparc port. - -1.05 Oct-14-96 - Interface changes based on feedback. - -1.04 Oct-11-96 - Sparc port complete (modulo struct passing bug). - -1.03 Oct-10-96 - Passing struct args, and returning struct values works for - all architectures/calling conventions. Expanded tests. - -1.02 Oct-9-96 - Added SGI n32 support. Fixed bugs in both o32 and Linux support. - Added "make test". - -1.01 Oct-8-96 - Fixed float passing bug in mips version. Restructured some - of the code. Builds cleanly with SGI tools. - -1.00 Oct-7-96 - First release. No public announcement. - - -Authors & Credits -================= - -libffi was originally written by Anthony Green . - -The developers of the GNU Compiler Collection project have made -innumerable valuable contributions. See the ChangeLog file for -details. - -Some of the ideas behind libffi were inspired by Gianni Mariani's free -gencall library for Silicon Graphics machines. - -The closure mechanism was designed and implemented by Kresten Krab -Thorup. - -Major processor architecture ports were contributed by the following -developers: - -aarch64 Marcus Shawcroft, James Greenhalgh -alpha Richard Henderson -arm Raffaele Sena -blackfin Alexandre Keunecke I. de Mendonca -cris Simon Posnjak, Hans-Peter Nilsson -frv Anthony Green -ia64 Hans Boehm -m32r Kazuhiro Inaoka -m68k Andreas Schwab -m88k Miod Vallat -microblaze Nathan Rossi -mips Anthony Green, Casey Marshall -mips64 David Daney -moxie Anthony Green -nios ii Sandra Loosemore -pa Randolph Chung, Dave Anglin, Andreas Tobler -powerpc Geoffrey Keating, Andreas Tobler, - David Edelsohn, John Hornkvist -powerpc64 Jakub Jelinek -s390 Gerhard Tonn, Ulrich Weigand -sh Kaz Kojima -sh64 Kaz Kojima -sparc Anthony Green, Gordon Irlam -tile-gx/tilepro Walter Lee -vax Miod Vallat -x86 Anthony Green, Jon Beniston -x86-64 Bo Thorsen -xtensa Chris Zankel - -Jesper Skov and Andrew Haley both did more than their fair share of -stepping through the code and tracking down bugs. - -Thanks also to Tom Tromey for bug fixes, documentation and -configuration help. - -Thanks to Jim Blandy, who provided some useful feedback on the libffi -interface. - -Andreas Tobler has done a tremendous amount of work on the testsuite. - -Alex Oliva solved the executable page problem for SElinux. - -The list above is almost certainly incomplete and inaccurate. I'm -happy to make corrections or additions upon request. - -If you have a problem, or have found a bug, please send a note to the -author at green@moxielogic.com, or the project mailing list at -libffi-discuss@sourceware.org. diff --git a/third_party/python/Modules/_ctypes/libffi/acinclude.m4 b/third_party/python/Modules/_ctypes/libffi/acinclude.m4 deleted file mode 100644 index 3e8f8ba57..000000000 --- a/third_party/python/Modules/_ctypes/libffi/acinclude.m4 +++ /dev/null @@ -1,92 +0,0 @@ -# mmap(2) blacklisting. Some platforms provide the mmap library routine -# but don't support all of the features we need from it. -AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], -[ -AC_CHECK_HEADER([sys/mman.h], - [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) -AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) -if test "$libffi_header_sys_mman_h" != yes \ - || test "$libffi_func_mmap" != yes; then - ac_cv_func_mmap_file=no - ac_cv_func_mmap_dev_zero=no - ac_cv_func_mmap_anon=no -else - AC_CACHE_CHECK([whether read-only mmap of a plain file works], - ac_cv_func_mmap_file, - [# Add a system to this blacklist if - # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a - # memory area containing the same data that you'd get if you applied - # read() to the same fd. The only system known to have a problem here - # is VMS, where text files have record structure. - case "$host_os" in - vms* | ultrix*) - ac_cv_func_mmap_file=no ;; - *) - ac_cv_func_mmap_file=yes;; - esac]) - AC_CACHE_CHECK([whether mmap from /dev/zero works], - ac_cv_func_mmap_dev_zero, - [# Add a system to this blacklist if it has mmap() but /dev/zero - # does not exist, or if mmapping /dev/zero does not give anonymous - # zeroed pages with both the following properties: - # 1. If you map N consecutive pages in with one call, and then - # unmap any subset of those pages, the pages that were not - # explicitly unmapped remain accessible. - # 2. If you map two adjacent blocks of memory and then unmap them - # both at once, they must both go away. - # Systems known to be in this category are Windows (all variants), - # VMS, and Darwin. - case "$host_os" in - vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) - ac_cv_func_mmap_dev_zero=no ;; - *) - ac_cv_func_mmap_dev_zero=yes;; - esac]) - - # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. - AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, - [AC_TRY_COMPILE( -[#include -#include -#include - -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif -], -[int n = MAP_ANONYMOUS;], - ac_cv_decl_map_anon=yes, - ac_cv_decl_map_anon=no)]) - - if test $ac_cv_decl_map_anon = no; then - ac_cv_func_mmap_anon=no - else - AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], - ac_cv_func_mmap_anon, - [# Add a system to this blacklist if it has mmap() and MAP_ANON or - # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - # doesn't give anonymous zeroed pages with the same properties listed - # above for use of /dev/zero. - # Systems known to be in this category are Windows, VMS, and SCO Unix. - case "$host_os" in - vms* | cygwin* | pe | mingw* | sco* | udk* ) - ac_cv_func_mmap_anon=no ;; - *) - ac_cv_func_mmap_anon=yes;; - esac]) - fi -fi - -if test $ac_cv_func_mmap_file = yes; then - AC_DEFINE(HAVE_MMAP_FILE, 1, - [Define if read-only mmap of a plain file works.]) -fi -if test $ac_cv_func_mmap_dev_zero = yes; then - AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, - [Define if mmap of /dev/zero works.]) -fi -if test $ac_cv_func_mmap_anon = yes; then - AC_DEFINE(HAVE_MMAP_ANON, 1, - [Define if mmap with MAP_ANON(YMOUS) works.]) -fi -]) diff --git a/third_party/python/Modules/_ctypes/libffi/aclocal.m4 b/third_party/python/Modules/_ctypes/libffi/aclocal.m4 deleted file mode 100644 index 6292fbab7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/aclocal.m4 +++ /dev/null @@ -1,1961 +0,0 @@ -# generated automatically by aclocal 1.13.4 -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. - -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) - -# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- -# -# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. -# Written by Thomas Tanner, 1999 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 18 LTDL_INIT - -# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) -# ------------------------------------------ -# DIRECTORY contains the libltdl sources. It is okay to call this -# function multiple times, as long as the same DIRECTORY is always given. -AC_DEFUN([LT_CONFIG_LTDL_DIR], -[AC_BEFORE([$0], [LTDL_INIT]) -_$0($*) -])# LT_CONFIG_LTDL_DIR - -# We break this out into a separate macro, so that we can call it safely -# internally without being caught accidentally by the sed scan in libtoolize. -m4_defun([_LT_CONFIG_LTDL_DIR], -[dnl remove trailing slashes -m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) -m4_case(_LTDL_DIR, - [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.' - m4_if(_ARG_DIR, [.], - [], - [m4_define([_LTDL_DIR], _ARG_DIR) - _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], - [m4_if(_ARG_DIR, _LTDL_DIR, - [], - [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])]) -m4_popdef([_ARG_DIR]) -])# _LT_CONFIG_LTDL_DIR - -# Initialise: -m4_define([_LTDL_DIR], []) - - -# _LT_BUILD_PREFIX -# ---------------- -# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise -# to `${top_builddir}/'. -m4_define([_LT_BUILD_PREFIX], -[m4_ifdef([AC_AUTOCONF_VERSION], - [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), - [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], - [${top_build_prefix}], - [${top_builddir}/])], - [${top_build_prefix}])], - [${top_builddir}/])[]dnl -]) - - -# LTDL_CONVENIENCE -# ---------------- -# sets LIBLTDL to the link flags for the libltdl convenience library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with -# '${top_build_prefix}' if available, otherwise with '${top_builddir}/', -# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single -# quotes!). If your package is not flat and you're not using automake, -# define top_build_prefix, top_builddir, and top_srcdir appropriately -# in your Makefiles. -AC_DEFUN([LTDL_CONVENIENCE], -[AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -])# LTDL_CONVENIENCE - -# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, -# now we have LT_CONFIG_LTDL_DIR: -AU_DEFUN([AC_LIBLTDL_CONVENIENCE], -[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) - - -# _LTDL_CONVENIENCE -# ----------------- -# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). -m4_defun([_LTDL_CONVENIENCE], -[case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; -esac -LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" -LTDLDEPS=$LIBLTDL -LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" - -AC_SUBST([LIBLTDL]) -AC_SUBST([LTDLDEPS]) -AC_SUBST([LTDLINCL]) - -# For backwards non-gettext consistent compatibility... -INCLTDL="$LTDLINCL" -AC_SUBST([INCLTDL]) -])# _LTDL_CONVENIENCE - - -# LTDL_INSTALLABLE -# ---------------- -# sets LIBLTDL to the link flags for the libltdl installable library -# and LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl -# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if -# available, otherwise with '${top_builddir}/', and LTDLINCL will be -# prefixed with '${top_srcdir}/' (note the single quotes!). If your -# package is not flat and you're not using automake, define top_build_prefix, -# top_builddir, and top_srcdir appropriately in your Makefiles. -# In the future, this macro may have to be called after LT_INIT. -AC_DEFUN([LTDL_INSTALLABLE], -[AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -])# LTDL_INSTALLABLE - -# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, -# now we have LT_CONFIG_LTDL_DIR: -AU_DEFUN([AC_LIBLTDL_INSTALLABLE], -[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) - - -# _LTDL_INSTALLABLE -# ----------------- -# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). -m4_defun([_LTDL_INSTALLABLE], -[if test -f $prefix/lib/libltdl.la; then - lt_save_LDFLAGS="$LDFLAGS" - LDFLAGS="-L$prefix/lib $LDFLAGS" - AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) - LDFLAGS="$lt_save_LDFLAGS" - if test x"${lt_lib_ltdl-no}" = xyes; then - if test x"$enable_ltdl_install" != xyes; then - # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install - AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install']) - enable_ltdl_install=no - fi - elif test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - fi -fi - -# If configure.ac declared an installable ltdl, and the user didn't override -# with --disable-ltdl-install, we will install the shipped libltdl. -case $enable_ltdl_install in - no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLDEPS= - LTDLINCL= - ;; - *) enable_ltdl_install=yes - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" - LTDLDEPS=$LIBLTDL - LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" - ;; -esac - -AC_SUBST([LIBLTDL]) -AC_SUBST([LTDLDEPS]) -AC_SUBST([LTDLINCL]) - -# For backwards non-gettext consistent compatibility... -INCLTDL="$LTDLINCL" -AC_SUBST([INCLTDL]) -])# LTDL_INSTALLABLE - - -# _LTDL_MODE_DISPATCH -# ------------------- -m4_define([_LTDL_MODE_DISPATCH], -[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself: -m4_if(_LTDL_DIR, [], - [], - dnl if _LTDL_MODE was not set already, the default value is `subproject': - [m4_case(m4_default(_LTDL_MODE, [subproject]), - [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) - _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], - [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], - [recursive], [], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl -dnl Be careful not to expand twice: -m4_define([$0], []) -])# _LTDL_MODE_DISPATCH - - -# _LT_LIBOBJ(MODULE_NAME) -# ----------------------- -# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead -# of into LIBOBJS. -AC_DEFUN([_LT_LIBOBJ], [ - m4_pattern_allow([^_LT_LIBOBJS$]) - _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" -])# _LT_LIBOBJS - - -# LTDL_INIT([OPTIONS]) -# -------------------- -# Clients of libltdl can use this macro to allow the installer to -# choose between a shipped copy of the ltdl sources or a preinstalled -# version of the library. If the shipped ltdl sources are not in a -# subdirectory named libltdl, the directory name must be given by -# LT_CONFIG_LTDL_DIR. -AC_DEFUN([LTDL_INIT], -[dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -dnl We need to keep our own list of libobjs separate from our parent project, -dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while -dnl we look for our own LIBOBJs. -m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) -m4_pushdef([AC_LIBSOURCES]) - -dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: -m4_if(_LTDL_MODE, [], - [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) - m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) - -AC_ARG_WITH([included_ltdl], - [AS_HELP_STRING([--with-included-ltdl], - [use the GNU ltdl sources included here])]) - -if test "x$with_included_ltdl" != xyes; then - # We are not being forced to use the included libltdl sources, so - # decide whether there is a useful installed version we can use. - AC_CHECK_HEADER([ltdl.h], - [AC_CHECK_DECL([lt_dlinterface_register], - [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], - [with_included_ltdl=no], - [with_included_ltdl=yes])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT - #include ])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT] - ) -fi - -dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE -dnl was called yet, then for old times' sake, we assume libltdl is in an -dnl eponymous directory: -AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) - -AC_ARG_WITH([ltdl_include], - [AS_HELP_STRING([--with-ltdl-include=DIR], - [use the ltdl headers installed in DIR])]) - -if test -n "$with_ltdl_include"; then - if test -f "$with_ltdl_include/ltdl.h"; then : - else - AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) - fi -else - with_ltdl_include=no -fi - -AC_ARG_WITH([ltdl_lib], - [AS_HELP_STRING([--with-ltdl-lib=DIR], - [use the libltdl.la installed in DIR])]) - -if test -n "$with_ltdl_lib"; then - if test -f "$with_ltdl_lib/libltdl.la"; then : - else - AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) - fi -else - with_ltdl_lib=no -fi - -case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in - ,yes,no,no,) - m4_case(m4_default(_LTDL_TYPE, [convenience]), - [convenience], [_LTDL_CONVENIENCE], - [installable], [_LTDL_INSTALLABLE], - [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) - ;; - ,no,no,no,) - # If the included ltdl is not to be used, then use the - # preinstalled libltdl we found. - AC_DEFINE([HAVE_LTDL], [1], - [Define this if a modern libltdl is already installed]) - LIBLTDL=-lltdl - LTDLDEPS= - LTDLINCL= - ;; - ,no*,no,*) - AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) - ;; - *) with_included_ltdl=no - LIBLTDL="-L$with_ltdl_lib -lltdl" - LTDLDEPS= - LTDLINCL="-I$with_ltdl_include" - ;; -esac -INCLTDL="$LTDLINCL" - -# Report our decision... -AC_MSG_CHECKING([where to find libltdl headers]) -AC_MSG_RESULT([$LTDLINCL]) -AC_MSG_CHECKING([where to find libltdl library]) -AC_MSG_RESULT([$LIBLTDL]) - -_LTDL_SETUP - -dnl restore autoconf definition. -m4_popdef([AC_LIBOBJ]) -m4_popdef([AC_LIBSOURCES]) - -AC_CONFIG_COMMANDS_PRE([ - _ltdl_libobjs= - _ltdl_ltlibobjs= - if test -n "$_LT_LIBOBJS"; then - # Remove the extension. - _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' - for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do - _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" - _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" - done - fi - AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) - AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) -]) - -# Only expand once: -m4_define([LTDL_INIT]) -])# LTDL_INIT - -# Old names: -AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) -AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) -AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIB_LTDL], []) -dnl AC_DEFUN([AC_WITH_LTDL], []) -dnl AC_DEFUN([LT_WITH_LTDL], []) - - -# _LTDL_SETUP -# ----------- -# Perform all the checks necessary for compilation of the ltdl objects -# -- including compiler checks and header checks. This is a public -# interface mainly for the benefit of libltdl's own configure.ac, most -# other users should call LTDL_INIT instead. -AC_DEFUN([_LTDL_SETUP], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_SYS_MODULE_EXT])dnl -AC_REQUIRE([LT_SYS_MODULE_PATH])dnl -AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl -AC_REQUIRE([LT_LIB_DLLOAD])dnl -AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl -AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl -AC_REQUIRE([gl_FUNC_ARGZ])dnl - -m4_require([_LT_CHECK_OBJDIR])dnl -m4_require([_LT_HEADER_DLFCN])dnl -m4_require([_LT_CHECK_DLPREOPEN])dnl -m4_require([_LT_DECL_SED])dnl - -dnl Don't require this, or it will be expanded earlier than the code -dnl that sets the variables it relies on: -_LT_ENABLE_INSTALL - -dnl _LTDL_MODE specific code must be called at least once: -_LTDL_MODE_DISPATCH - -# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS -# the user used. This is so that ltdl.h can pick up the parent projects -# config.h file, The first file in AC_CONFIG_HEADERS must contain the -# definitions required by ltdl.c. -# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). -AC_CONFIG_COMMANDS_PRE([dnl -m4_pattern_allow([^LT_CONFIG_H$])dnl -m4_ifset([AH_HEADER], - [LT_CONFIG_H=AH_HEADER], - [m4_ifset([AC_LIST_HEADERS], - [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], - [])])]) -AC_SUBST([LT_CONFIG_H]) - -AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], - [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) -AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) - -m4_pattern_allow([LT_LIBEXT])dnl -AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) - -name= -eval "lt_libprefix=\"$libname_spec\"" -m4_pattern_allow([LT_LIBPREFIX])dnl -AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) - -name=ltdl -eval "LTDLOPEN=\"$libname_spec\"" -AC_SUBST([LTDLOPEN]) -])# _LTDL_SETUP - - -# _LT_ENABLE_INSTALL -# ------------------ -m4_define([_LT_ENABLE_INSTALL], -[AC_ARG_ENABLE([ltdl-install], - [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) - -case ,${enable_ltdl_install},${enable_ltdl_convenience} in - *yes*) ;; - *) enable_ltdl_convenience=yes ;; -esac - -m4_ifdef([AM_CONDITIONAL], -[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) - AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)]) -])# _LT_ENABLE_INSTALL - - -# LT_SYS_DLOPEN_DEPLIBS -# --------------------- -AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CACHE_CHECK([whether deplibs are loaded by dlopen], - [lt_cv_sys_dlopen_deplibs], - [# PORTME does your system automatically load deplibs for dlopen? - # or its logical equivalent (e.g. shl_load for HP-UX < 11) - # For now, we just catch OSes we know something about -- in the - # future, we'll try test this programmatically. - lt_cv_sys_dlopen_deplibs=unknown - case $host_os in - aix3*|aix4.1.*|aix4.2.*) - # Unknown whether this is true for these versions of AIX, but - # we want this `case' here to explicitly catch those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - aix[[4-9]]*) - lt_cv_sys_dlopen_deplibs=yes - ;; - amigaos*) - case $host_cpu in - powerpc) - lt_cv_sys_dlopen_deplibs=no - ;; - esac - ;; - darwin*) - # Assuming the user has installed a libdl from somewhere, this is true - # If you are looking for one http://www.opendarwin.org/projects/dlcompat - lt_cv_sys_dlopen_deplibs=yes - ;; - freebsd* | dragonfly*) - lt_cv_sys_dlopen_deplibs=yes - ;; - gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) - # GNU and its variants, using gnu ld.so (Glibc) - lt_cv_sys_dlopen_deplibs=yes - ;; - hpux10*|hpux11*) - lt_cv_sys_dlopen_deplibs=yes - ;; - interix*) - lt_cv_sys_dlopen_deplibs=yes - ;; - irix[[12345]]*|irix6.[[01]]*) - # Catch all versions of IRIX before 6.2, and indicate that we don't - # know how it worked for any of those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - irix*) - # The case above catches anything before 6.2, and it's known that - # at 6.2 and later dlopen does load deplibs. - lt_cv_sys_dlopen_deplibs=yes - ;; - netbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - openbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - osf[[1234]]*) - # dlopen did load deplibs (at least at 4.x), but until the 5.x series, - # it did *not* use an RPATH in a shared library to find objects the - # library depends on, so we explicitly say `no'. - lt_cv_sys_dlopen_deplibs=no - ;; - osf5.0|osf5.0a|osf5.1) - # dlopen *does* load deplibs and with the right loader patch applied - # it even uses RPATH in a shared library to search for shared objects - # that the library depends on, but there's no easy way to know if that - # patch is installed. Since this is the case, all we can really - # say is unknown -- it depends on the patch being installed. If - # it is, this changes to `yes'. Without it, it would be `no'. - lt_cv_sys_dlopen_deplibs=unknown - ;; - osf*) - # the two cases above should catch all versions of osf <= 5.1. Read - # the comments above for what we know about them. - # At > 5.1, deplibs are loaded *and* any RPATH in a shared library - # is used to find them so we can finally say `yes'. - lt_cv_sys_dlopen_deplibs=yes - ;; - qnx*) - lt_cv_sys_dlopen_deplibs=yes - ;; - solaris*) - lt_cv_sys_dlopen_deplibs=yes - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - libltdl_cv_sys_dlopen_deplibs=yes - ;; - esac - ]) -if test "$lt_cv_sys_dlopen_deplibs" != yes; then - AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], - [Define if the OS needs help to load dependent libraries for dlopen().]) -fi -])# LT_SYS_DLOPEN_DEPLIBS - -# Old name: -AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) - - -# LT_SYS_MODULE_EXT -# ----------------- -AC_DEFUN([LT_SYS_MODULE_EXT], -[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which extension is used for runtime loadable modules], - [libltdl_cv_shlibext], -[ -module=yes -eval libltdl_cv_shlibext=$shrext_cmds -module=no -eval libltdl_cv_shrext=$shrext_cmds - ]) -if test -n "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_MODULE_EXT])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], - [Define to the extension used for runtime loadable modules, say, ".so".]) -fi -if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_SHARED_EXT])dnl - AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], - [Define to the shared library suffix, say, ".dylib".]) -fi -])# LT_SYS_MODULE_EXT - -# Old name: -AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) - - -# LT_SYS_MODULE_PATH -# ------------------ -AC_DEFUN([LT_SYS_MODULE_PATH], -[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which variable specifies run-time module search path], - [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) -if test -n "$lt_cv_module_path_var"; then - m4_pattern_allow([LT_MODULE_PATH_VAR])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], - [Define to the name of the environment variable that determines the run-time module search path.]) -fi -])# LT_SYS_MODULE_PATH - -# Old name: -AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) - - -# LT_SYS_DLSEARCH_PATH -# -------------------- -AC_DEFUN([LT_SYS_DLSEARCH_PATH], -[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([for the default library search path], - [lt_cv_sys_dlsearch_path], - [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) -if test -n "$lt_cv_sys_dlsearch_path"; then - sys_dlsearch_path= - for dir in $lt_cv_sys_dlsearch_path; do - if test -z "$sys_dlsearch_path"; then - sys_dlsearch_path="$dir" - else - sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" - fi - done - m4_pattern_allow([LT_DLSEARCH_PATH])dnl - AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], - [Define to the system default library search path.]) -fi -])# LT_SYS_DLSEARCH_PATH - -# Old name: -AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) - - -# _LT_CHECK_DLPREOPEN -# ------------------- -m4_defun([_LT_CHECK_DLPREOPEN], -[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], - [libltdl_cv_preloaded_symbols], - [if test -n "$lt_cv_sys_global_symbol_pipe"; then - libltdl_cv_preloaded_symbols=yes - else - libltdl_cv_preloaded_symbols=no - fi - ]) -if test x"$libltdl_cv_preloaded_symbols" = xyes; then - AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], - [Define if libtool can extract symbol lists from object files.]) -fi -])# _LT_CHECK_DLPREOPEN - - -# LT_LIB_DLLOAD -# ------------- -AC_DEFUN([LT_LIB_DLLOAD], -[m4_pattern_allow([^LT_DLLOADERS$]) -LT_DLLOADERS= -AC_SUBST([LT_DLLOADERS]) - -AC_LANG_PUSH([C]) - -LIBADD_DLOPEN= -AC_SEARCH_LIBS([dlopen], [dl], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - if test "$ac_cv_search_dlopen" != "none required" ; then - LIBADD_DLOPEN="-ldl" - fi - libltdl_cv_lib_dl_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H -# include -#endif - ]], [[dlopen(0, 0);]])], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_CHECK_LIB([svld], [dlopen], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) -if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes -then - lt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - AC_CHECK_FUNCS([dlerror]) - LIBS="$lt_save_LIBS" -fi -AC_SUBST([LIBADD_DLOPEN]) - -LIBADD_SHL_LOAD= -AC_CHECK_FUNC([shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], - [AC_CHECK_LIB([dld], [shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" - LIBADD_SHL_LOAD="-ldld"])]) -AC_SUBST([LIBADD_SHL_LOAD]) - -case $host_os in -darwin[[1567]].*) -# We only want this for pre-Mac OS X 10.4. - AC_CHECK_FUNC([_dyld_func_lookup], - [AC_DEFINE([HAVE_DYLD], [1], - [Define if you have the _dyld_func_lookup function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) - ;; -beos*) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" - ;; -cygwin* | mingw* | os2* | pw32*) - AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" - ;; -esac - -AC_CHECK_LIB([dld], [dld_link], - [AC_DEFINE([HAVE_DLD], [1], - [Define if you have the GNU dld library.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) -AC_SUBST([LIBADD_DLD_LINK]) - -m4_pattern_allow([^LT_DLPREOPEN$]) -LT_DLPREOPEN= -if test -n "$LT_DLLOADERS" -then - for lt_loader in $LT_DLLOADERS; do - LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " - done - AC_DEFINE([HAVE_LIBDLLOADER], [1], - [Define if libdlloader will be built on this platform]) -fi -AC_SUBST([LT_DLPREOPEN]) - -dnl This isn't used anymore, but set it for backwards compatibility -LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" -AC_SUBST([LIBADD_DL]) - -AC_LANG_POP -])# LT_LIB_DLLOAD - -# Old name: -AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_DLLIB], []) - - -# LT_SYS_SYMBOL_USCORE -# -------------------- -# does the compiler prefix global symbols with an underscore? -AC_DEFUN([LT_SYS_SYMBOL_USCORE], -[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([for _ prefix in compiled symbols], - [lt_cv_sys_symbol_underscore], - [lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.c >&AS_MESSAGE_LOG_FD - fi - rm -rf conftest* - ]) - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - AC_SUBST([sys_symbol_underscore]) -])# LT_SYS_SYMBOL_USCORE - -# Old name: -AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) - - -# LT_FUNC_DLSYM_USCORE -# -------------------- -AC_DEFUN([LT_FUNC_DLSYM_USCORE], -[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -if test x"$lt_cv_sys_symbol_underscore" = xyes; then - if test x"$libltdl_cv_func_dlopen" = xyes || - test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then - AC_CACHE_CHECK([whether we have to add an underscore for dlsym], - [libltdl_cv_need_uscore], - [libltdl_cv_need_uscore=unknown - save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - _LT_TRY_DLOPEN_SELF( - [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], - [], [libltdl_cv_need_uscore=cross]) - LIBS="$save_LIBS" - ]) - fi -fi - -if test x"$libltdl_cv_need_uscore" = xyes; then - AC_DEFINE([NEED_USCORE], [1], - [Define if dlsym() requires a leading underscore in symbol names.]) -fi -])# LT_FUNC_DLSYM_USCORE - -# Old name: -AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) - -# Copyright (C) 2002-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.13' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.13.4], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.13.4])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# Figure out how to run the assembler. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_AS -# ---------- -AC_DEFUN([AM_PROG_AS], -[# By default we simply use the C compiler to build assembly code. -AC_REQUIRE([AC_PROG_CC]) -test "${CCAS+set}" = set || CCAS=$CC -test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS -AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) -AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) -_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl -]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST([install_sh])]) - -# Copyright (C) 2003-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- -# From Jim Meyering - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MAINTAINER_MODE([DEFAULT-MODE]) -# ---------------------------------- -# Control maintainer-specific portions of Makefiles. -# Default is to disable them, unless 'enable' is passed literally. -# For symmetry, 'disable' may be passed as well. Anyway, the user -# can override the default with the --enable/--disable switch. -AC_DEFUN([AM_MAINTAINER_MODE], -[m4_case(m4_default([$1], [disable]), - [enable], [m4_define([am_maintainer_other], [disable])], - [disable], [m4_define([am_maintainer_other], [enable])], - [m4_define([am_maintainer_other], [enable]) - m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) -AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode's default is 'disable' unless 'enable' is passed - AC_ARG_ENABLE([maintainer-mode], - [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], - am_maintainer_other[ make rules and dependencies not useful - (and sometimes confusing) to the casual installer])], - [USE_MAINTAINER_MODE=$enableval], - [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) - AC_MSG_RESULT([$USE_MAINTAINER_MODE]) - AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) - MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST([MAINT])dnl -] -) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) -fi -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# -------------------- -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) - -# _AM_SET_OPTIONS(OPTIONS) -# ------------------------ -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) - -# Copyright (C) 2009-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor 'install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -# -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], - - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done - rm -rf conftest.dir - - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - -m4_include([m4/asmcfi.m4]) -m4_include([m4/ax_append_flag.m4]) -m4_include([m4/ax_cc_maxopt.m4]) -m4_include([m4/ax_cflags_warn_all.m4]) -m4_include([m4/ax_check_compile_flag.m4]) -m4_include([m4/ax_compiler_vendor.m4]) -m4_include([m4/ax_configure_args.m4]) -m4_include([m4/ax_enable_builddir.m4]) -m4_include([m4/ax_gcc_archflag.m4]) -m4_include([m4/ax_gcc_x86_cpuid.m4]) -m4_include([m4/libtool.m4]) -m4_include([m4/ltoptions.m4]) -m4_include([m4/ltsugar.m4]) -m4_include([m4/ltversion.m4]) -m4_include([m4/lt~obsolete.m4]) -m4_include([acinclude.m4]) diff --git a/third_party/python/Modules/_ctypes/libffi/compile b/third_party/python/Modules/_ctypes/libffi/compile deleted file mode 100755 index 531136b06..000000000 --- a/third_party/python/Modules/_ctypes/libffi/compile +++ /dev/null @@ -1,347 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2012-10-14.11; # UTC - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/config.guess b/third_party/python/Modules/_ctypes/libffi/config.guess deleted file mode 100755 index b79252d6b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/config.guess +++ /dev/null @@ -1,1558 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. - -timestamp='2013-06-10' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD -# -# Please send patches with a ChangeLog entry to config-patches@gnu.org. - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case "${UNAME_SYSTEM}" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - eval $set_cc_for_build - cat <<-EOF > $dummy.c - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi - else - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:Linux:*:*) - echo ${UNAME_MACHINE}-pc-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-${LIBC} - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-${LIBC} - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-${LIBC} - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux-${LIBC} - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval $set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc - fi - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - fi - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; -esac - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/config.sub b/third_party/python/Modules/_ctypes/libffi/config.sub deleted file mode 100755 index c765b34b7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/config.sub +++ /dev/null @@ -1,1788 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2013 Free Software Foundation, Inc. - -timestamp='2013-04-24' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches with a ChangeLog entry to config-patches@gnu.org. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2013 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* | -plan9* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or1k-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/configure b/third_party/python/Modules/_ctypes/libffi/configure deleted file mode 100755 index 75f62a7c4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/configure +++ /dev/null @@ -1,21691 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libffi 3.1. -# -# Report bugs to . -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: http://github.com/atgreen/libffi/issues about your -$0: system, including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='libffi' -PACKAGE_TARNAME='libffi' -PACKAGE_VERSION='3.1' -PACKAGE_STRING='libffi 3.1' -PACKAGE_BUGREPORT='http://github.com/atgreen/libffi/issues' -PACKAGE_URL='' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -toolexeclibdir -toolexecdir -FFI_DEBUG_FALSE -FFI_DEBUG_TRUE -TARGETDIR -TARGET -FFI_EXEC_TRAMPOLINE_TABLE -FFI_EXEC_TRAMPOLINE_TABLE_FALSE -FFI_EXEC_TRAMPOLINE_TABLE_TRUE -sys_symbol_underscore -HAVE_LONG_DOUBLE_VARIANT -HAVE_LONG_DOUBLE -ALLOCA -XTENSA_FALSE -XTENSA_TRUE -VAX_FALSE -VAX_TRUE -TILE_FALSE -TILE_TRUE -PA64_HPUX_FALSE -PA64_HPUX_TRUE -PA_HPUX_FALSE -PA_HPUX_TRUE -PA_LINUX_FALSE -PA_LINUX_TRUE -SH64_FALSE -SH64_TRUE -SH_FALSE -SH_TRUE -X86_64_FALSE -X86_64_TRUE -S390_FALSE -S390_TRUE -FRV_FALSE -FRV_TRUE -LIBFFI_CRIS_FALSE -LIBFFI_CRIS_TRUE -AVR32_FALSE -AVR32_TRUE -ARM_FALSE -ARM_TRUE -ARC_FALSE -ARC_TRUE -AARCH64_FALSE -AARCH64_TRUE -POWERPC_FREEBSD_FALSE -POWERPC_FREEBSD_TRUE -POWERPC_DARWIN_FALSE -POWERPC_DARWIN_TRUE -POWERPC_AIX_FALSE -POWERPC_AIX_TRUE -POWERPC_FALSE -POWERPC_TRUE -NIOS2_FALSE -NIOS2_TRUE -MOXIE_FALSE -MOXIE_TRUE -METAG_FALSE -METAG_TRUE -MICROBLAZE_FALSE -MICROBLAZE_TRUE -M88K_FALSE -M88K_TRUE -M68K_FALSE -M68K_TRUE -M32R_FALSE -M32R_TRUE -IA64_FALSE -IA64_TRUE -ALPHA_FALSE -ALPHA_TRUE -X86_DARWIN64_FALSE -X86_DARWIN64_TRUE -X86_DARWIN32_FALSE -X86_DARWIN32_TRUE -X86_DARWIN_FALSE -X86_DARWIN_TRUE -X86_WIN64_FALSE -X86_WIN64_TRUE -X86_WIN32_FALSE -X86_WIN32_TRUE -X86_FREEBSD_FALSE -X86_FREEBSD_TRUE -X86_FALSE -X86_TRUE -SPARC_FALSE -SPARC_TRUE -BFIN_FALSE -BFIN_TRUE -MIPS_FALSE -MIPS_TRUE -AM_LTLDFLAGS -AM_RUNTESTFLAGS -TESTSUBDIR_FALSE -TESTSUBDIR_TRUE -MAINT -MAINTAINER_MODE_FALSE -MAINTAINER_MODE_TRUE -PRTDIAG -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -LIBTOOL -am__fastdepCCAS_FALSE -am__fastdepCCAS_TRUE -CCASDEPMODE -CCASFLAGS -CCAS -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -ax_enable_builddir_sed -target_os -target_vendor -target_cpu -target -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_builddir -enable_silent_rules -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -enable_portable_binary -with_gcc_arch -enable_maintainer_mode -enable_pax_emutramp -enable_debug -enable_structs -enable_raw_api -enable_purify_safety -' - ac_precious_vars='build_alias -host_alias -target_alias -CCAS -CCASFLAGS -CPP -CPPFLAGS -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures libffi 3.1 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/libffi] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of libffi 3.1:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-builddir disable automatic build in subdir of sources - - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-portable-binary - disable compiler optimizations that would produce - unportable binaries - --enable-maintainer-mode - enable make rules and dependencies not useful (and - sometimes confusing) to the casual installer - --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC - --enable-debug debugging mode - --disable-structs omit code for struct support - --disable-raw-api make the raw api unavailable - --enable-purify-safety purify-safe mode - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot[=DIR] Search for dependent libraries within DIR (or the - compiler's sysroot if not specified). - --with-gcc-arch= use architecture for gcc -march/-mtune, - instead of guessing - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CCAS assembler compiler command (defaults to CC) - CCASFLAGS assembler compiler flags (defaults to CFLAGS) - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -libffi configure 3.1 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_cxx_try_cpp LINENO -# ------------------------ -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_try_link LINENO -# ------------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 &5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ------------------------------------------------------ ## -## Report this to http://github.com/atgreen/libffi/issues ## -## ------------------------------------------------------ ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by libffi $as_me 3.1, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_config_headers="$ac_config_headers fficonfig.h" - - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if ${ac_cv_target+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -target_alias=${target_alias-$host_alias} - -case "${host}" in - frv*-elf) - LDFLAGS=`echo $LDFLAGS | sed "s/\-B^ *libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ - ;; -esac - - - # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args - if test "${ac_configure_args+set}" != "set" ; then - ac_configure_args= - for ac_arg in ${1+"$@"}; do - ac_configure_args="$ac_configure_args '$ac_arg'" - done - fi - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - - -ax_enable_builddir="." -# Check whether --enable-builddir was given. -if test "${enable_builddir+set}" = set; then : - enableval=$enable_builddir; ax_enable_builddir="$enableval" -else - ax_enable_builddir="auto" -fi - -if test ".$ac_srcdir_defaulted" != ".no" ; then -if test ".$srcdir" = ".." ; then - if test -f config.status ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5 -$as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;} - else - test ".$ax_enable_builddir" = "." && ax_enable_builddir="." - test ".$ax_enable_builddir" = ".no" && ax_enable_builddir="." - test ".$TARGET" = "." && TARGET="$target" - test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET" - if test ".$ax_enable_builddir" != ".." ; then # we know where to go and - as_dir=$ax_enable_builddir; as_fn_mkdir_p - echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp - cd $ax_enable_builddir - if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then - rm conftest.tmp - { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5 -$as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; } - else - as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5 - fi - srcdir=`echo "$ax_enable_builddir" | - sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'` - # going to restart from subdirectory location - test -f $srcdir/config.log && mv $srcdir/config.log . - test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . - test -f $srcdir/conftest.log && mv $srcdir/conftest.log . - test -f $srcdir/$cache_file && mv $srcdir/$cache_file . - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5 -$as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; } - case "$0" in # restart - /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; - *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; - esac ; exit $? - fi - fi -fi fi -test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="." -# Extract the first word of "gsed sed", so it can be a program name with args. -set dummy gsed sed; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ax_enable_builddir_sed+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ax_enable_builddir_sed in - [\\/]* | ?:[\\/]*) - ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed" - ;; -esac -fi -ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed -if test -n "$ax_enable_builddir_sed"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5 -$as_echo "$ax_enable_builddir_sed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -ax_enable_builddir_auxdir="$am_aux_dir" -ac_config_commands="$ac_config_commands buildir" - - -am__api_version='1.13' - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='libffi' - VERSION='3.1' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - - -# The same as in boehm-gc and libstdc++. Have to borrow it from there. -# We must force CC to /not/ be precious variables; otherwise -# the wrong, non-multilib-adjusted value will be used in multilibs. -# As a side effect, we have to subst CFLAGS ourselves. -# Also save and restore CFLAGS, since AC_PROG_CC will come up with -# defaults of its own if none are provided. - - - -save_CFLAGS=$CFLAGS -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -CFLAGS=$save_CFLAGS - - - - - -# By default we simply use the C compiler to build assembly code. - -test "${CCAS+set}" = set || CCAS=$CC -test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS - - - -depcc="$CCAS" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CCAS_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CCAS_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CCAS_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } -CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then - am__fastdepCCAS_TRUE= - am__fastdepCCAS_FALSE='#' -else - am__fastdepCCAS_TRUE='#' - am__fastdepCCAS_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2.418' -macro_revision='2.4.2.418' - - - - - - - - - - - - - -ltmain=$ac_aux_dir/ltmain.sh - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM=$NM -else - lt_nm_to_check=${ac_tool_prefix}nm - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/$lt_tmp_nm - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the 'sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break 2 - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break 2 - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS=$lt_save_ifs - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test no != "$lt_cv_path_NM"; then - NM=$lt_cv_path_NM -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols -headers" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test : != "$DUMPBIN"; then - NM=$DUMPBIN - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring=ABCD - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test X`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test 17 != "$i" # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test yes != "$GCC"; then - reload_cmds=false - fi - ;; - darwin*) - if test yes = "$GCC"; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# 'unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# that responds to the $file_magic_cmd with a given extended regex. -# If you have 'file' or equivalent on your system and you're not sure -# whether 'pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd* | bitrig*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh; - # decide which one to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd=$ECHO - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -eq "$ac_status"; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -ne "$ac_status"; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test no = "$lt_cv_ar_at_file"; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test ia64 = "$host_cpu"; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Gets list of data symbols to import. - lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" - # Adjust the below global symbol transforms to fixup imported variables. - lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" - lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" - lt_c_name_lib_hook="\ - -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ - -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" -else - # Disable hooks by default. - lt_cv_sys_global_symbol_to_import= - lt_cdecl_hook= - lt_c_name_hook= - lt_c_name_lib_hook= -fi - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n"\ -$lt_cdecl_hook\ -" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ -$lt_c_name_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" - -# Transform an extracted symbol line into symbol name with lib prefix and -# symbol address. -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ -$lt_c_name_lib_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function, - # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ -" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ -" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ -" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ -" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS=conftstm.$ac_objext - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest$ac_exeext; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test yes = "$pipe_works"; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case $with_sysroot in #( - yes) - if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test no = "$enable_libtool_lock" || enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out what ABI is being produced by ac_compile, and set mode - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE=32 - ;; - *ELF-64*) - HPUX_IA64_MODE=64 - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test yes = "$lt_cv_prog_gnu_ld"; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -mips64*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - emul=elf - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - emul="${emul}32" - ;; - *64-bit*) - emul="${emul}64" - ;; - esac - case `/usr/bin/file conftest.$ac_objext` in - *MSB*) - emul="${emul}btsmip" - ;; - *LSB*) - emul="${emul}ltsmip" - ;; - esac - case `/usr/bin/file conftest.$ac_objext` in - *N32*) - emul="${emul}n32" - ;; - esac - LD="${LD-ld} -m $emul" - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. Note that the listed cases only cover the - # situations where additional linker options are needed (such as when - # doing 32-bit compilation for a host where ld defaults to 64-bit, or - # vice versa); the common cases where no linker options are needed do - # not appear in the list. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - case `/usr/bin/file conftest.o` in - *x86-64*) - LD="${LD-ld} -m elf32_x86_64" - ;; - *) - LD="${LD-ld} -m elf_i386" - ;; - esac - ;; - powerpc64le-*linux*) - LD="${LD-ld} -m elf32lppclinux" - ;; - powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - powerpcle-*linux*) - LD="${LD-ld} -m elf64lppc" - ;; - powerpc-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test yes != "$lt_cv_cc_needs_belf"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS=$SAVE_CFLAGS - fi - ;; -*-*solaris*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*|x86_64-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD=${LD-ld}_sol2 - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks=$enable_libtool_lock - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test yes != "$lt_cv_path_mainfest_tool"; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "$LT_MULTI_MODULE"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test 0 = "$_lt_result"; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test yes = "$lt_cv_apple_cc_single_mod"; then - _lt_dar_single_mod='$single_module' - fi - if test yes = "$lt_cv_ld_exported_symbols_list"; then - _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' - fi - if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - -func_stripname_cnf () -{ - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for lt_pkg in $withval; do - IFS=$lt_save_ifs - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - pic_mode=default -fi - - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS=$ltmain - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld=$lt_cv_prog_gnu_ld - -old_CC=$CC -old_CFLAGS=$CFLAGS - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/${ac_tool_prefix}file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi - -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi - -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC=$CC -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test yes = "$GCC"; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test yes = "$GCC"; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - lt_prog_compiler_pic='-fPIC' - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - case $cc_basename in - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='$wl-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64, which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test yes = "$lt_cv_prog_compiler_pic_works"; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test yes = "$lt_cv_prog_compiler_static_works"; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links=nottested -if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ' (' and ')$', so one must not match beginning or - # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', - # as well as any symbol that contains 'd'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test yes != "$GCC"; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test yes = "$with_gnu_ld"; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test yes = "$lt_use_gnu_ld_interface"; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='$wl' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - export_dynamic_flag_spec='$wl--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test ia64 != "$host_cpu"; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='$wl--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test linux-dietlibc = "$host_os"; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test no = "$tmp_diet" - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - nagfor*) # NAGFOR 5.3 - tmp_sharedflag='-Wl,-shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test no = "$ld_shlibs"; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='$wl-f,' - - if test yes = "$GCC"; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag="$shared_flag "'$wl-G' - fi - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test yes = "$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' $wl-bernotok' - allow_undefined_flag=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $wl-bnoentry $compiler_flags $wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test yes = "$lt_cv_ld_force_load"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test yes = "$GCC"; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='$wl-E' - ;; - - hpux10*) - if test yes,no = "$GCC,$with_gnu_ld"; then - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test yes,no = "$GCC,$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test yes = "$lt_cv_prog_compiler__b"; then - archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test yes = "$GCC"; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test yes = "$lt_cv_irix_exported_symbol"; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - else - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test yes = "$GCC"; then - wlarc='$wl' - archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='$wl' - archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. GCC discards it without '$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test yes = "$GCC"; then - whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test sequent = "$host_vendor"; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='$wl-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='$wl-z,text' - allow_undefined_flag='$wl-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test sni = "$host_vendor"; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='$wl-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test no = "$ld_shlibs" && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test yes,yes = "$GCC,$enable_shared"; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test yes = "$GCC"; then - case $host_os in - darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; - *) lt_awk_arg='/^libraries:/' ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; - *) lt_sed_strip_eq='s|=/|/|g' ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary... - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path component already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). - case "$lt_multi_os_dir; $lt_search_path_spec " in - "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) - lt_multi_os_dir= - ;; - esac - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" - elif test -n "$lt_multi_os_dir"; then - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS = " "; FS = "/|\n";} { - lt_foo = ""; - lt_count = 0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo = "/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's|/\([A-Za-z]:\)|\1|g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test yes = "$aix_use_runtimelinking"; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - hardcode_libdir_flag_spec='-L$libdir' - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -os2*) - libname_spec='$name' - shrext_cmds=.dll - need_lib_prefix=no - library_names_spec='$libname$shared_ext $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test no = "$dynamic_linker" && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test yes = "$hardcode_automatic"; then - - # We can hardcode non-existent directories. - if test no != "$hardcode_direct" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && - test no != "$hardcode_minus_L"; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test relink = "$hardcode_action" || - test yes = "$inherit_rpath"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test yes != "$enable_dlopen"; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen=load_add_on - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen=LoadLibrary - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - - lt_cv_dlopen=dyld - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - tpf*) - # Don't try to run any link tests for TPF. We know it's impossible - # because TPF is a cross-compiler, and we know how we open DSOs. - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - lt_cv_dlopen_self=no - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test no = "$lt_cv_dlopen"; then - enable_dlopen=no - else - enable_dlopen=yes - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS=$CPPFLAGS - test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS=$LDFLAGS - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS=$LIBS - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test yes = "$lt_cv_dlopen_self"; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS - LIBS=$save_LIBS - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test no = "$can_build_shared" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test ia64 != "$host_cpu" && test no = "$aix_use_runtimelinking"; then - test yes = "$enable_shared" && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC - - if test -n "$CXX" && ( test no != "$CXX" && - ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || - (test g++ != "$CXX"))); then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test yes != "$_lt_caught_CXX_error"; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test yes = "$GXX"; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test yes = "$GXX"; then - # Set up default GNU C++ configuration - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test yes = "$with_gnu_ld"; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='$wl' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='$wl-f,' - - if test yes = "$GXX"; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag=$shared_flag' $wl-G' - fi - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test yes = "$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' $wl-bernotok' - allow_undefined_flag_CXX=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $wl-bnoentry $compiler_flags $wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='$wl--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test yes = "$lt_cv_ld_force_load"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - if test yes != "$lt_cv_apple_cc_single_mod"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" - archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='$wl-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='$wl-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='$wl-E' - whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' - archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes,no = "$GXX,$with_gnu_ld"; then - allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test yes,no = "$GXX,$with_gnu_ld"; then - no_undefined_flag_CXX=' $wl-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require '-G' NOT '-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='$wl-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='$wl-z,text' - allow_undefined_flag_CXX='$wl-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test no = "$ld_shlibs_CXX" && can_build_shared=no - - GCC_CXX=$GXX - LD_CXX=$LD - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case $prev$p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test x-L = "$p" || - test x-R = "$p"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test no = "$pre_test_object_deps_done"; then - case $prev in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX=$prev$p - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX=$prev$p - else - postdeps_CXX="${postdeps_CXX} $prev$p" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test no = "$pre_test_object_deps_done"; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX=$p - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX=$p - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test yes != "$solaris_use_stlport4"; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test yes != "$solaris_use_stlport4"; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test yes = "$GXX"; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - lt_prog_compiler_pic_CXX='-fPIC' - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='$wl-a ${wl}archive' - if test ia64 != "$host_cpu"; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='$wl-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64, which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links=nottested -if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX=$ltdll_cmds - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test no = "$ld_shlibs_CXX" && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test yes,yes = "$GCC,$enable_shared"; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test yes = "$aix_use_runtimelinking"; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - hardcode_libdir_flag_spec_CXX='-L$libdir' - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -os2*) - libname_spec='$name' - shrext_cmds=.dll - need_lib_prefix=no - library_names_spec='$libname$shared_ext $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test no = "$dynamic_linker" && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test yes = "$hardcode_automatic_CXX"; then - - # We can hardcode non-existent directories. - if test no != "$hardcode_direct_CXX" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && - test no != "$hardcode_minus_L_CXX"; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test relink = "$hardcode_action_CXX" || - test yes = "$inherit_rpath_CXX"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test yes != "$_lt_caught_CXX_error" - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - - -# Test for 64-bit build. -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 -$as_echo_n "checking size of size_t... " >&6; } -if ${ac_cv_sizeof_size_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_size_t" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (size_t) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_size_t=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 -$as_echo "$ac_cv_sizeof_size_t" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t -_ACEOF - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 -$as_echo_n "checking for C compiler vendor... " >&6; } -if ${ax_cv_c_compiler_vendor+:} false; then : - $as_echo_n "(cached) " >&6 -else - # note: don't check for gcc first since some other compilers define __GNUC__ - vendors="intel: __ICC,__ECC,__INTEL_COMPILER - ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ - pathscale: __PATHCC__,__PATHSCALE__ - clang: __clang__ - gnu: __GNUC__ - sun: __SUNPRO_C,__SUNPRO_CC - hp: __HP_cc,__HP_aCC - dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER - borland: __BORLANDC__,__TURBOC__ - comeau: __COMO__ - cray: _CRAYC - kai: __KCC - lcc: __LCC__ - sgi: __sgi,sgi - microsoft: _MSC_VER - metrowerks: __MWERKS__ - watcom: __WATCOMC__ - portland: __PGI - unknown: UNKNOWN" - for ventest in $vendors; do - case $ventest in - *:) vendor=$ventest; continue ;; - *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; - esac - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - #if !($vencpp) - thisisanerror; - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 -$as_echo "$ax_cv_c_compiler_vendor" >&6; } - - - - - - -# Check whether --enable-portable-binary was given. -if test "${enable_portable_binary+set}" = set; then : - enableval=$enable_portable_binary; acx_maxopt_portable=$enableval -else - acx_maxopt_portable=no -fi - - -# Try to determine "good" native compiler flags if none specified via CFLAGS -if test "$ac_test_CFLAGS" != "set"; then - CFLAGS="" - case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" - if test "x$acx_maxopt_portable" = xno; then - CFLAGS="$CFLAGS -arch host" - fi;; - - sun) CFLAGS="-native -fast -xO5 -dalign" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS -xarch=generic" - fi;; - - hp) CFLAGS="+Oall +Optrs_ansi +DSnative" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS +DAportable" - fi;; - - ibm) if test "x$acx_maxopt_portable" = xno; then - xlc_opt="-qarch=auto -qtune=auto" - else - xlc_opt="-qtune=auto" - fi - as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$xlc_opt" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5 -$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; } -if eval \${$as_CACHEVAR+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $xlc_opt" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_CACHEVAR=yes" -else - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : - CFLAGS="-O3 -qansialias -w $xlc_opt" -else - CFLAGS="-O3 -qansialias -w" - echo "******************************************************" - echo "* You seem to have the IBM C compiler. It is *" - echo "* recommended for best performance that you use: *" - echo "* *" - echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" - echo "* ^^^ ^^^ *" - echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" - echo "* CPU you have. (Set the CFLAGS environment var. *" - echo "* and re-run configure.) For more info, man cc. *" - echo "******************************************************" -fi - - ;; - - intel) CFLAGS="-O3 -ansi_alias" - if test "x$acx_maxopt_portable" = xno; then - icc_archflag=unknown - icc_flags="" - case $host_cpu in - i686*|x86_64*) - # icc accepts gcc assembly syntax, so these should work: - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 -$as_echo_n "checking for x86 cpuid 0 output... " >&6; } -if ${ax_cv_gcc_x86_cpuid_0+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ax_cv_gcc_x86_cpuid_0=unknown -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - int op = 0, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid -else - ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 -$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 -$as_echo_n "checking for x86 cpuid 1 output... " >&6; } -if ${ax_cv_gcc_x86_cpuid_1+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ax_cv_gcc_x86_cpuid_1=unknown -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - int op = 1, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid -else - ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 -$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG - *:756e6547:*:*) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";; - *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";; - *f??:*:*:*) icc_flags="-xN -xW -xK";; - esac ;; - esac ;; - esac - if test "x$icc_flags" != x; then - for flag in $icc_flags; do - as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -$as_echo_n "checking whether C compiler accepts $flag... " >&6; } -if eval \${$as_CACHEVAR+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_CACHEVAR=yes" -else - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : - icc_archflag=$flag; break -else - : -fi - - done - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5 -$as_echo_n "checking for icc architecture flag... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5 -$as_echo "$icc_archflag" >&6; } - if test "x$icc_archflag" != xunknown; then - CFLAGS="$CFLAGS $icc_archflag" - fi - fi - ;; - - gnu) - # default optimization flags for gcc on all systems - CFLAGS="-O3 -fomit-frame-pointer" - - # -malign-double for x86 systems - # LIBFFI -- DON'T DO THIS - CHANGES ABI - # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") - - # -fstrict-aliasing for gcc-2.95+ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 -$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } -if ${ax_cv_check_cflags___fstrict_aliasing+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -fstrict-aliasing" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___fstrict_aliasing=yes -else - ax_cv_check_cflags___fstrict_aliasing=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fstrict_aliasing" >&5 -$as_echo "$ax_cv_check_cflags___fstrict_aliasing" >&6; } -if test x"$ax_cv_check_cflags___fstrict_aliasing" = xyes; then : - CFLAGS="$CFLAGS -fstrict-aliasing" -else - : -fi - - - # note that we enable "unsafe" fp optimization with other compilers, too - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5 -$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; } -if ${ax_cv_check_cflags___ffast_math+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -ffast-math" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___ffast_math=yes -else - ax_cv_check_cflags___ffast_math=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___ffast_math" >&5 -$as_echo "$ax_cv_check_cflags___ffast_math" >&6; } -if test x"$ax_cv_check_cflags___ffast_math" = xyes; then : - CFLAGS="$CFLAGS -ffast-math" -else - : -fi - - - - - - -# Check whether --with-gcc-arch was given. -if test "${with_gcc_arch+set}" = set; then : - withval=$with_gcc_arch; ax_gcc_arch=$withval -else - ax_gcc_arch=yes -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 -$as_echo_n "checking for gcc architecture flag... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } -if ${ax_cv_gcc_archflag+:} false; then : - $as_echo_n "(cached) " >&6 -else - -ax_cv_gcc_archflag="unknown" - -if test "$GCC" = yes; then - -if test "x$ax_gcc_arch" = xyes; then -ax_gcc_arch="" -if test "$cross_compiling" = no; then -case $host_cpu in - i[3456]86*|x86_64*) # use cpuid codes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 -$as_echo_n "checking for x86 cpuid 0 output... " >&6; } -if ${ax_cv_gcc_x86_cpuid_0+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ax_cv_gcc_x86_cpuid_0=unknown -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - int op = 0, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid -else - ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 -$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 -$as_echo_n "checking for x86 cpuid 1 output... " >&6; } -if ${ax_cv_gcc_x86_cpuid_1+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ax_cv_gcc_x86_cpuid_1=unknown -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - int op = 1, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid -else - ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 -$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - case $ax_cv_gcc_x86_cpuid_0 in - *:756e6547:*:*) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; - *5??:*:*:*) ax_gcc_arch=pentium ;; - *0?6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6[9de]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; - *0?6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; - *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; - *1?6[aef]?:*:*:*|*2?6[5cef]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; - *1?6c?:*:*:*|*[23]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; - *2?6[ad]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; - *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; - ?000?f3[347]:*:*:*|?000?f41347:*:*:*|?000?f6?:*:*:*) - case $host_cpu in - x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; - *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; - esac ;; - ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; - esac ;; - *:68747541:*:*) # AMD - case $ax_cv_gcc_x86_cpuid_1 in - *5[67]?:*:*:*) ax_gcc_arch=k6 ;; - *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; - *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; - *60?:*:*:*) ax_gcc_arch=k7 ;; - *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;; - *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; - *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; - *6[68a]?:*:*:*) - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5 -$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; } -if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ax_cv_gcc_x86_cpuid_0x80000006=unknown -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - int op = 0x80000006, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid -else - ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5 -$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - # L2 cache size - case $ax_cv_gcc_x86_cpuid_0x80000006 in - *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256 - ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; - *) ax_gcc_arch="athlon-4 athlon k7" ;; - esac ;; - ?00??f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; - ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; - ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; - ?00??f??:*:*:*) ax_gcc_arch="k8" ;; - ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; - esac ;; - *:746e6543:*:*) # IDT - case $ax_cv_gcc_x86_cpuid_1 in - *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; - *58?:*:*:*) ax_gcc_arch=winchip2 ;; - *6[78]?:*:*:*) ax_gcc_arch=c3 ;; - *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; - esac ;; - esac - if test x"$ax_gcc_arch" = x; then # fallback - case $host_cpu in - i586*) ax_gcc_arch=pentium ;; - i686*) ax_gcc_arch=pentiumpro ;; - esac - fi - ;; - - sparc*) - # Extract the first word of "prtdiag", so it can be a program name with args. -set dummy prtdiag; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PRTDIAG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PRTDIAG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag" - ;; -esac -fi -PRTDIAG=$ac_cv_path_PRTDIAG -if test -n "$PRTDIAG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5 -$as_echo "$PRTDIAG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` - cputype=`echo "$cputype" | tr -d ' -' | sed 's/SPARCIIi/SPARCII/' | tr $as_cr_LETTERS $as_cr_letters` - case $cputype in - *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; - *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; - *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; - *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;; - *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;; - *cypress*) ax_gcc_arch=cypress ;; - esac ;; - - alphaev5) ax_gcc_arch=ev5 ;; - alphaev56) ax_gcc_arch=ev56 ;; - alphapca56) ax_gcc_arch="pca56 ev56" ;; - alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; - alphaev6) ax_gcc_arch=ev6 ;; - alphaev67) ax_gcc_arch=ev67 ;; - alphaev68) ax_gcc_arch="ev68 ev67" ;; - alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; - alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; - alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; - - powerpc*) - cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` - cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` - case $cputype in - *750*) ax_gcc_arch="750 G3" ;; - *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;; - *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;; - *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;; - *970*) ax_gcc_arch="970 G5 power4";; - *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; - *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; - 603ev|8240) ax_gcc_arch="$cputype 603e 603";; - *) ax_gcc_arch=$cputype ;; - esac - ax_gcc_arch="$ax_gcc_arch powerpc" - ;; -esac -fi # not cross-compiling -fi # guess arch - -if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then -for arch in $ax_gcc_arch; do - if test "x$acx_maxopt_portable" = xyes; then # if we require portable code - flags="-mtune=$arch" - # -mcpu=$arch and m$arch generate nonportable code on every arch except - # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. - case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac - else - flags="-march=$arch -mcpu=$arch -m$arch" - fi - for flag in $flags; do - as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -$as_echo_n "checking whether C compiler accepts $flag... " >&6; } -if eval \${$as_CACHEVAR+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_CACHEVAR=yes" -else - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : - ax_cv_gcc_archflag=$flag; break -else - : -fi - - done - test "x$ax_cv_gcc_archflag" = xunknown || break -done -fi - -fi # $GCC=yes - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 -$as_echo_n "checking for gcc architecture flag... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5 -$as_echo "$ax_cv_gcc_archflag" >&6; } -if test "x$ax_cv_gcc_archflag" = xunknown; then - : -else - CFLAGS="$CFLAGS $ax_cv_gcc_archflag" -fi - - ;; - esac - - if test -z "$CFLAGS"; then - echo "" - echo "********************************************************" - echo "* WARNING: Don't know the best CFLAGS for this system *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" - echo "********************************************************" - echo "" - CFLAGS="-O3" - fi - - as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$CFLAGS" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5 -$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; } -if eval \${$as_CACHEVAR+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $CFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_CACHEVAR=yes" -else - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : - : -else - - echo "" - echo "********************************************************" - echo "* WARNING: The guessed CFLAGS don't seem to work with *" - echo "* your compiler. *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "********************************************************" - echo "" - CFLAGS="" - -fi - - -fi - -# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro -# compiler. -if test "$ax_cv_c_compiler_vendor" != "sun"; then - if ${CFLAGS+:} false; then : - case " $CFLAGS " in - *" "*) - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains "; } >&5 - (: CFLAGS already contains ) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \""; } >&5 - (: CFLAGS="$CFLAGS ") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - CFLAGS="$CFLAGS " - ;; - esac -else - CFLAGS="" -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5 -$as_echo_n "checking CFLAGS for maximum warnings... " >&6; } -if ${ac_cv_cflags_warn_all+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_cflags_warn_all="no, unknown" -ac_save_CFLAGS="$CFLAGS" -for ac_arg in "-warn all % -warn all" "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" # -do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -CFLAGS="$ac_save_CFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5 -$as_echo "$ac_cv_cflags_warn_all" >&6; } - -case ".$ac_cv_cflags_warn_all" in - .ok|.ok,*) ;; - .|.no|.no,*) ;; - *) if ${CFLAGS+:} false; then : - case " $CFLAGS " in - *" $ac_cv_cflags_warn_all "*) - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_warn_all"; } >&5 - (: CFLAGS already contains $ac_cv_cflags_warn_all) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5 - (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" - ;; - esac -else - CFLAGS="$ac_cv_cflags_warn_all" -fi - ;; -esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -fexceptions" -fi - -cat > local.exp <&5 -$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } - # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then : - enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } - if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi - - MAINT=$MAINTAINER_MODE_TRUE - - - -for ac_header in sys/mman.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mman_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_MMAN_H 1 -_ACEOF - -fi - -done - -for ac_func in mmap -do : - ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" -if test "x$ac_cv_func_mmap" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_MMAP 1 -_ACEOF - -fi -done - - -ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mman_h" = xyes; then : - libffi_header_sys_mman_h=yes -else - libffi_header_sys_mman_h=no -fi - - -ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" -if test "x$ac_cv_func_mmap" = xyes; then : - libffi_func_mmap=yes -else - libffi_func_mmap=no -fi - -if test "$libffi_header_sys_mman_h" != yes \ - || test "$libffi_func_mmap" != yes; then - ac_cv_func_mmap_file=no - ac_cv_func_mmap_dev_zero=no - ac_cv_func_mmap_anon=no -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5 -$as_echo_n "checking whether read-only mmap of a plain file works... " >&6; } -if ${ac_cv_func_mmap_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Add a system to this blacklist if - # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a - # memory area containing the same data that you'd get if you applied - # read() to the same fd. The only system known to have a problem here - # is VMS, where text files have record structure. - case "$host_os" in - vms* | ultrix*) - ac_cv_func_mmap_file=no ;; - *) - ac_cv_func_mmap_file=yes;; - esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5 -$as_echo "$ac_cv_func_mmap_file" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5 -$as_echo_n "checking whether mmap from /dev/zero works... " >&6; } -if ${ac_cv_func_mmap_dev_zero+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Add a system to this blacklist if it has mmap() but /dev/zero - # does not exist, or if mmapping /dev/zero does not give anonymous - # zeroed pages with both the following properties: - # 1. If you map N consecutive pages in with one call, and then - # unmap any subset of those pages, the pages that were not - # explicitly unmapped remain accessible. - # 2. If you map two adjacent blocks of memory and then unmap them - # both at once, they must both go away. - # Systems known to be in this category are Windows (all variants), - # VMS, and Darwin. - case "$host_os" in - vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) - ac_cv_func_mmap_dev_zero=no ;; - *) - ac_cv_func_mmap_dev_zero=yes;; - esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5 -$as_echo "$ac_cv_func_mmap_dev_zero" >&6; } - - # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5 -$as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; } -if ${ac_cv_decl_map_anon+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif - -int -main () -{ -int n = MAP_ANONYMOUS; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_decl_map_anon=yes -else - ac_cv_decl_map_anon=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5 -$as_echo "$ac_cv_decl_map_anon" >&6; } - - if test $ac_cv_decl_map_anon = no; then - ac_cv_func_mmap_anon=no - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5 -$as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; } -if ${ac_cv_func_mmap_anon+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Add a system to this blacklist if it has mmap() and MAP_ANON or - # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - # doesn't give anonymous zeroed pages with the same properties listed - # above for use of /dev/zero. - # Systems known to be in this category are Windows, VMS, and SCO Unix. - case "$host_os" in - vms* | cygwin* | pe | mingw* | sco* | udk* ) - ac_cv_func_mmap_anon=no ;; - *) - ac_cv_func_mmap_anon=yes;; - esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5 -$as_echo "$ac_cv_func_mmap_anon" >&6; } - fi -fi - -if test $ac_cv_func_mmap_file = yes; then - -$as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h - -fi -if test $ac_cv_func_mmap_dev_zero = yes; then - -$as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h - -fi -if test $ac_cv_func_mmap_anon = yes; then - -$as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h - -fi - - - if test -d $srcdir/testsuite; then - TESTSUBDIR_TRUE= - TESTSUBDIR_FALSE='#' -else - TESTSUBDIR_TRUE='#' - TESTSUBDIR_FALSE= -fi - - -TARGETDIR="unknown" -HAVE_LONG_DOUBLE_VARIANT=0 -case "$host" in - aarch64*-*-*) - TARGET=AARCH64; TARGETDIR=aarch64 - ;; - - alpha*-*-*) - TARGET=ALPHA; TARGETDIR=alpha; - # Support 128-bit long double, changeable via command-line switch. - HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' - ;; - - arc*-*-*) - TARGET=ARC; TARGETDIR=arc - ;; - - arm*-*-*) - TARGET=ARM; TARGETDIR=arm - ;; - - amd64-*-freebsd* | amd64-*-openbsd*) - TARGET=X86_64; TARGETDIR=x86 - ;; - - amd64-*-freebsd*) - TARGET=X86_64; TARGETDIR=x86 - ;; - - amd64-*-freebsd*) - TARGET=X86_64; TARGETDIR=x86 - ;; - - avr32*-*-*) - TARGET=AVR32; TARGETDIR=avr32 - ;; - - bfin*) - TARGET=BFIN; TARGETDIR=bfin - ;; - - cris-*-*) - TARGET=LIBFFI_CRIS; TARGETDIR=cris - ;; - - frv-*-*) - TARGET=FRV; TARGETDIR=frv - ;; - - hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) - TARGET=PA_LINUX; TARGETDIR=pa - ;; - hppa*64-*-hpux*) - TARGET=PA64_HPUX; TARGETDIR=pa - ;; - hppa*-*-hpux*) - TARGET=PA_HPUX; TARGETDIR=pa - ;; - - i?86-*-freebsd* | i?86-*-openbsd*) - TARGET=X86_FREEBSD; TARGETDIR=x86 - ;; - i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*) - TARGET=X86_WIN32; TARGETDIR=x86 - # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. - # We must also check with_cross_host to decide if this is a native - # or cross-build and select where to install dlls appropriately. - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; - else - AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; - fi - ;; - i?86-*-darwin*) - TARGET=X86_DARWIN; TARGETDIR=x86 - ;; - i?86-*-solaris2.1[0-9]*) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - TARGET=X86; - else - TARGET=X86_64; - fi - ;; - - i*86-*-nto-qnx*) - TARGET=X86; TARGETDIR=x86 - ;; - - x86_64-*-darwin*) - TARGET=X86_DARWIN; TARGETDIR=x86 - ;; - - x86_64-*-cygwin* | x86_64-*-mingw*) - TARGET=X86_WIN64; TARGETDIR=x86 - # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. - # We must also check with_cross_host to decide if this is a native - # or cross-build and select where to install dlls appropriately. - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; - else - AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; - fi - ;; - - i?86-*-* | x86_64-*-*) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - case "$host" in - *-gnux32) - TARGET=X86_64 - ;; - *) - TARGET=X86 - ;; - esac - else - TARGET=X86_64; - fi - ;; - - ia64*-*-*) - TARGET=IA64; TARGETDIR=ia64 - ;; - - m32r*-*-*) - TARGET=M32R; TARGETDIR=m32r - ;; - - m68k-*-*) - TARGET=M68K; TARGETDIR=m68k - ;; - - m88k-*-*) - TARGET=M88K; TARGETDIR=m88k - ;; - - microblaze*-*-*) - TARGET=MICROBLAZE; TARGETDIR=microblaze - ;; - - moxie-*-*) - TARGET=MOXIE; TARGETDIR=moxie - ;; - - metag-*-*) - TARGET=METAG; TARGETDIR=metag - ;; - - mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) - TARGET=MIPS_IRIX; TARGETDIR=mips - ;; - mips*-*linux* | mips*-*-openbsd*) - # Support 128-bit long double for NewABI. - HAVE_LONG_DOUBLE='defined(__mips64)' - TARGET=MIPS_LINUX; TARGETDIR=mips - ;; - - nios2*-linux*) - TARGET=NIOS2; TARGETDIR=nios2 - ;; - - powerpc*-*-linux* | powerpc-*-sysv*) - TARGET=POWERPC; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpc-*-amigaos*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc-*-beos*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc-*-darwin* | powerpc64-*-darwin*) - TARGET=POWERPC_DARWIN; TARGETDIR=powerpc - ;; - powerpc-*-aix* | rs6000-*-aix*) - TARGET=POWERPC_AIX; TARGETDIR=powerpc - ;; - powerpc-*-freebsd* | powerpc-*-openbsd*) - TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpc64-*-freebsd*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc*-*-rtems*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - - s390-*-* | s390x-*-*) - TARGET=S390; TARGETDIR=s390 - ;; - - sh-*-* | sh[34]*-*-*) - TARGET=SH; TARGETDIR=sh - ;; - sh64-*-* | sh5*-*-*) - TARGET=SH64; TARGETDIR=sh64 - ;; - - sparc*-*-*) - TARGET=SPARC; TARGETDIR=sparc - ;; - - tile*-*) - TARGET=TILE; TARGETDIR=tile - ;; - - vax-*-*) - TARGET=VAX; TARGETDIR=vax - ;; - - xtensa*-*) - TARGET=XTENSA; TARGETDIR=xtensa - ;; - -esac - - - - -if test $TARGETDIR = unknown; then - as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5 -fi - - if expr x$TARGET : 'xMIPS' > /dev/null; then - MIPS_TRUE= - MIPS_FALSE='#' -else - MIPS_TRUE='#' - MIPS_FALSE= -fi - - if test x$TARGET = xBFIN; then - BFIN_TRUE= - BFIN_FALSE='#' -else - BFIN_TRUE='#' - BFIN_FALSE= -fi - - if test x$TARGET = xSPARC; then - SPARC_TRUE= - SPARC_FALSE='#' -else - SPARC_TRUE='#' - SPARC_FALSE= -fi - - if test x$TARGET = xX86; then - X86_TRUE= - X86_FALSE='#' -else - X86_TRUE='#' - X86_FALSE= -fi - - if test x$TARGET = xX86_FREEBSD; then - X86_FREEBSD_TRUE= - X86_FREEBSD_FALSE='#' -else - X86_FREEBSD_TRUE='#' - X86_FREEBSD_FALSE= -fi - - if test x$TARGET = xX86_WIN32; then - X86_WIN32_TRUE= - X86_WIN32_FALSE='#' -else - X86_WIN32_TRUE='#' - X86_WIN32_FALSE= -fi - - if test x$TARGET = xX86_WIN64; then - X86_WIN64_TRUE= - X86_WIN64_FALSE='#' -else - X86_WIN64_TRUE='#' - X86_WIN64_FALSE= -fi - - if test x$TARGET = xX86_DARWIN; then - X86_DARWIN_TRUE= - X86_DARWIN_FALSE='#' -else - X86_DARWIN_TRUE='#' - X86_DARWIN_FALSE= -fi - - if test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 4; then - X86_DARWIN32_TRUE= - X86_DARWIN32_FALSE='#' -else - X86_DARWIN32_TRUE='#' - X86_DARWIN32_FALSE= -fi - - if test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 8; then - X86_DARWIN64_TRUE= - X86_DARWIN64_FALSE='#' -else - X86_DARWIN64_TRUE='#' - X86_DARWIN64_FALSE= -fi - - if test x$TARGET = xALPHA; then - ALPHA_TRUE= - ALPHA_FALSE='#' -else - ALPHA_TRUE='#' - ALPHA_FALSE= -fi - - if test x$TARGET = xIA64; then - IA64_TRUE= - IA64_FALSE='#' -else - IA64_TRUE='#' - IA64_FALSE= -fi - - if test x$TARGET = xM32R; then - M32R_TRUE= - M32R_FALSE='#' -else - M32R_TRUE='#' - M32R_FALSE= -fi - - if test x$TARGET = xM68K; then - M68K_TRUE= - M68K_FALSE='#' -else - M68K_TRUE='#' - M68K_FALSE= -fi - - if test x$TARGET = xM88K; then - M88K_TRUE= - M88K_FALSE='#' -else - M88K_TRUE='#' - M88K_FALSE= -fi - - if test x$TARGET = xMICROBLAZE; then - MICROBLAZE_TRUE= - MICROBLAZE_FALSE='#' -else - MICROBLAZE_TRUE='#' - MICROBLAZE_FALSE= -fi - - if test x$TARGET = xMETAG; then - METAG_TRUE= - METAG_FALSE='#' -else - METAG_TRUE='#' - METAG_FALSE= -fi - - if test x$TARGET = xMOXIE; then - MOXIE_TRUE= - MOXIE_FALSE='#' -else - MOXIE_TRUE='#' - MOXIE_FALSE= -fi - - if test x$TARGET = xNIOS2; then - NIOS2_TRUE= - NIOS2_FALSE='#' -else - NIOS2_TRUE='#' - NIOS2_FALSE= -fi - - if test x$TARGET = xPOWERPC; then - POWERPC_TRUE= - POWERPC_FALSE='#' -else - POWERPC_TRUE='#' - POWERPC_FALSE= -fi - - if test x$TARGET = xPOWERPC_AIX; then - POWERPC_AIX_TRUE= - POWERPC_AIX_FALSE='#' -else - POWERPC_AIX_TRUE='#' - POWERPC_AIX_FALSE= -fi - - if test x$TARGET = xPOWERPC_DARWIN; then - POWERPC_DARWIN_TRUE= - POWERPC_DARWIN_FALSE='#' -else - POWERPC_DARWIN_TRUE='#' - POWERPC_DARWIN_FALSE= -fi - - if test x$TARGET = xPOWERPC_FREEBSD; then - POWERPC_FREEBSD_TRUE= - POWERPC_FREEBSD_FALSE='#' -else - POWERPC_FREEBSD_TRUE='#' - POWERPC_FREEBSD_FALSE= -fi - - if test x$TARGET = xAARCH64; then - AARCH64_TRUE= - AARCH64_FALSE='#' -else - AARCH64_TRUE='#' - AARCH64_FALSE= -fi - - if test x$TARGET = xARC; then - ARC_TRUE= - ARC_FALSE='#' -else - ARC_TRUE='#' - ARC_FALSE= -fi - - if test x$TARGET = xARM; then - ARM_TRUE= - ARM_FALSE='#' -else - ARM_TRUE='#' - ARM_FALSE= -fi - - if test x$TARGET = xAVR32; then - AVR32_TRUE= - AVR32_FALSE='#' -else - AVR32_TRUE='#' - AVR32_FALSE= -fi - - if test x$TARGET = xLIBFFI_CRIS; then - LIBFFI_CRIS_TRUE= - LIBFFI_CRIS_FALSE='#' -else - LIBFFI_CRIS_TRUE='#' - LIBFFI_CRIS_FALSE= -fi - - if test x$TARGET = xFRV; then - FRV_TRUE= - FRV_FALSE='#' -else - FRV_TRUE='#' - FRV_FALSE= -fi - - if test x$TARGET = xS390; then - S390_TRUE= - S390_FALSE='#' -else - S390_TRUE='#' - S390_FALSE= -fi - - if test x$TARGET = xX86_64; then - X86_64_TRUE= - X86_64_FALSE='#' -else - X86_64_TRUE='#' - X86_64_FALSE= -fi - - if test x$TARGET = xSH; then - SH_TRUE= - SH_FALSE='#' -else - SH_TRUE='#' - SH_FALSE= -fi - - if test x$TARGET = xSH64; then - SH64_TRUE= - SH64_FALSE='#' -else - SH64_TRUE='#' - SH64_FALSE= -fi - - if test x$TARGET = xPA_LINUX; then - PA_LINUX_TRUE= - PA_LINUX_FALSE='#' -else - PA_LINUX_TRUE='#' - PA_LINUX_FALSE= -fi - - if test x$TARGET = xPA_HPUX; then - PA_HPUX_TRUE= - PA_HPUX_FALSE='#' -else - PA_HPUX_TRUE='#' - PA_HPUX_FALSE= -fi - - if test x$TARGET = xPA64_HPUX; then - PA64_HPUX_TRUE= - PA64_HPUX_FALSE='#' -else - PA64_HPUX_TRUE='#' - PA64_HPUX_FALSE= -fi - - if test x$TARGET = xTILE; then - TILE_TRUE= - TILE_FALSE='#' -else - TILE_TRUE='#' - TILE_FALSE= -fi - - if test x$TARGET = xVAX; then - VAX_TRUE= - VAX_FALSE='#' -else - VAX_TRUE='#' - VAX_FALSE= -fi - - if test x$TARGET = xXTENSA; then - XTENSA_TRUE= - XTENSA_FALSE='#' -else - XTENSA_TRUE='#' - XTENSA_FALSE= -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_func in memcpy -do : - ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" -if test "x$ac_cv_func_memcpy" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_MEMCPY 1 -_ACEOF - -fi -done - -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 -$as_echo_n "checking for working alloca.h... " >&6; } -if ${ac_cv_working_alloca_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -char *p = (char *) alloca (2 * sizeof (int)); - if (p) return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_working_alloca_h=yes -else - ac_cv_working_alloca_h=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 -$as_echo "$ac_cv_working_alloca_h" >&6; } -if test $ac_cv_working_alloca_h = yes; then - -$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 -$as_echo_n "checking for alloca... " >&6; } -if ${ac_cv_func_alloca_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include -# define alloca _alloca -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -void *alloca (size_t); -# endif -# endif -# endif -# endif -#endif - -int -main () -{ -char *p = (char *) alloca (1); - if (p) return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_func_alloca_works=yes -else - ac_cv_func_alloca_works=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 -$as_echo "$ac_cv_func_alloca_works" >&6; } - -if test $ac_cv_func_alloca_works = yes; then - -$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h - -else - # The SVR3 libPW and SVR4 libucb both contain incompatible functions -# that cause trouble. Some versions do not even contain alloca or -# contain a buggy version. If you still want to use their alloca, -# use ar to extract alloca.o from them instead of compiling alloca.c. - -ALLOCA=\${LIBOBJDIR}alloca.$ac_objext - -$as_echo "#define C_ALLOCA 1" >>confdefs.h - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 -$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } -if ${ac_cv_os_cray+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then : - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 -$as_echo "$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi - - done -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 -$as_echo_n "checking stack direction for C alloca... " >&6; } -if ${ac_cv_c_stack_direction+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_c_stack_direction=0 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -find_stack_direction (int *addr, int depth) -{ - int dir, dummy = 0; - if (! addr) - addr = &dummy; - *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; - dir = depth ? find_stack_direction (addr, depth - 1) : 0; - return dir + dummy; -} - -int -main (int argc, char **argv) -{ - return find_stack_direction (0, argc + !argv + 20) < 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_stack_direction=1 -else - ac_cv_c_stack_direction=-1 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 -$as_echo "$ac_cv_c_stack_direction" >&6; } -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF - - -fi - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 -$as_echo_n "checking size of double... " >&6; } -if ${ac_cv_sizeof_double+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_double" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (double) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_double=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 -$as_echo "$ac_cv_sizeof_double" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_DOUBLE $ac_cv_sizeof_double -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 -$as_echo_n "checking size of long double... " >&6; } -if ${ac_cv_sizeof_long_double+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_long_double" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (long double) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_long_double=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 -$as_echo "$ac_cv_sizeof_long_double" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double -_ACEOF - - - -# Also AC_SUBST this variable for ffi.h. -if test -z "$HAVE_LONG_DOUBLE"; then - HAVE_LONG_DOUBLE=0 - if test $ac_cv_sizeof_long_double != 0; then - if test $HAVE_LONG_DOUBLE_VARIANT != 0; then - -$as_echo "#define HAVE_LONG_DOUBLE_VARIANT 1" >>confdefs.h - - HAVE_LONG_DOUBLE=1 - else - if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then - HAVE_LONG_DOUBLE=1 - -$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h - - fi - fi - fi -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; - -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h -;; #( - no) - ;; #( - universal) - -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - - ;; #( - *) - as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5 -$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; } -if ${gcc_cv_as_cfi_pseudo_op+:} false; then : - $as_echo_n "(cached) " >&6 -else - - gcc_cv_as_cfi_pseudo_op=unknown - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -asm (".cfi_startproc\n\t.cfi_endproc"); -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gcc_cv_as_cfi_pseudo_op=yes -else - gcc_cv_as_cfi_pseudo_op=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5 -$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; } - if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then - -$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h - - fi - - -if test x$TARGET = xSPARC; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5 -$as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; } -if ${libffi_cv_as_sparc_ua_pcrel+:} false; then : - $as_echo_n "(cached) " >&6 -else - - save_CFLAGS="$CFLAGS" - save_LDFLAGS="$LDFLAGS" - CFLAGS="$CFLAGS -fpic" - LDFLAGS="$LDFLAGS -shared" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text"); -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - libffi_cv_as_sparc_ua_pcrel=yes -else - libffi_cv_as_sparc_ua_pcrel=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - CFLAGS="$save_CFLAGS" - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_sparc_ua_pcrel" >&5 -$as_echo "$libffi_cv_as_sparc_ua_pcrel" >&6; } - if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then - -$as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5 -$as_echo_n "checking assembler .register pseudo-op support... " >&6; } -if ${libffi_cv_as_register_pseudo_op+:} false; then : - $as_echo_n "(cached) " >&6 -else - - libffi_cv_as_register_pseudo_op=unknown - # Check if we have .register - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -asm (".register %g2, #scratch"); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - libffi_cv_as_register_pseudo_op=yes -else - libffi_cv_as_register_pseudo_op=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_register_pseudo_op" >&5 -$as_echo "$libffi_cv_as_register_pseudo_op" >&6; } - if test "x$libffi_cv_as_register_pseudo_op" = xyes; then - -$as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h - - fi -fi - -if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5 -$as_echo_n "checking assembler supports pc related relocs... " >&6; } -if ${libffi_cv_as_x86_pcrel+:} false; then : - $as_echo_n "(cached) " >&6 -else - - libffi_cv_as_x86_pcrel=no - echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then - libffi_cv_as_x86_pcrel=yes - fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5 -$as_echo "$libffi_cv_as_x86_pcrel" >&6; } - if test "x$libffi_cv_as_x86_pcrel" = xyes; then - -$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5 -$as_echo_n "checking assembler .ascii pseudo-op support... " >&6; } -if ${libffi_cv_as_ascii_pseudo_op+:} false; then : - $as_echo_n "(cached) " >&6 -else - - libffi_cv_as_ascii_pseudo_op=unknown - # Check if we have .ascii - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -asm (".ascii \\"string\\""); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - libffi_cv_as_ascii_pseudo_op=yes -else - libffi_cv_as_ascii_pseudo_op=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5 -$as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; } - if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then - -$as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5 -$as_echo_n "checking assembler .string pseudo-op support... " >&6; } -if ${libffi_cv_as_string_pseudo_op+:} false; then : - $as_echo_n "(cached) " >&6 -else - - libffi_cv_as_string_pseudo_op=unknown - # Check if we have .string - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -asm (".string \\"string\\""); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - libffi_cv_as_string_pseudo_op=yes -else - libffi_cv_as_string_pseudo_op=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5 -$as_echo "$libffi_cv_as_string_pseudo_op" >&6; } - if test "x$libffi_cv_as_string_pseudo_op" = xyes; then - -$as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h - - fi -fi - -# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. -# Check whether --enable-pax_emutramp was given. -if test "${enable_pax_emutramp+set}" = set; then : - enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then - -$as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h - - fi -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 -$as_echo_n "checking for _ prefix in compiled symbols... " >&6; } -if ${lt_cv_sys_symbol_underscore+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&5 - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - fi - rm -rf conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 -$as_echo "$lt_cv_sys_symbol_underscore" >&6; } - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - - -if test "x$sys_symbol_underscore" = xyes; then - -$as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h - -fi - -FFI_EXEC_TRAMPOLINE_TABLE=0 -case "$target" in - *arm*-apple-darwin*) - FFI_EXEC_TRAMPOLINE_TABLE=1 - -$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h - - ;; - *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) - -$as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h - - ;; -esac - if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then - FFI_EXEC_TRAMPOLINE_TABLE_TRUE= - FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#' -else - FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' - FFI_EXEC_TRAMPOLINE_TABLE_FALSE= -fi - - - -if test x$TARGET = xX86_64; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking toolchain supports unwind section type" >&5 -$as_echo_n "checking toolchain supports unwind section type... " >&6; } -if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat > conftest1.s << EOF -.text -.globl foo -foo: -jmp bar -.section .eh_frame,"a",@unwind -bar: -EOF - - cat > conftest2.c << EOF -extern void foo(); -int main(){foo();} -EOF - - libffi_cv_as_x86_64_unwind_section_type=no - # we ensure that we can compile _and_ link an assembly file containing an @unwind section - # since the compiler can support it and not the linker (ie old binutils) - if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ - $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then - libffi_cv_as_x86_64_unwind_section_type=yes - fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5 -$as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; } - if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then - -$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h - - fi -fi - -if test "x$GCC" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5 -$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; } -if ${libffi_cv_ro_eh_frame+:} false; then : - $as_echo_n "(cached) " >&6 -else - - libffi_cv_ro_eh_frame=no - echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c - if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then - objdump -h conftest.o > conftest.dump 2>&1 - libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` - libffi_test_line=`expr $libffi_eh_frame_line + 1`p - sed -n $libffi_test_line conftest.dump > conftest.line - if grep READONLY conftest.line > /dev/null; then - libffi_cv_ro_eh_frame=yes - fi - fi - rm -f conftest.* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5 -$as_echo "$libffi_cv_ro_eh_frame" >&6; } - if test "x$libffi_cv_ro_eh_frame" = xyes; then - -$as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h - - -$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h - - else - -$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 -$as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; } -if ${libffi_cv_hidden_visibility_attribute+:} false; then : - $as_echo_n "(cached) " >&6 -else - - echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c - libffi_cv_hidden_visibility_attribute=no - if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - if grep '\.hidden.*foo' conftest.s >/dev/null; then - libffi_cv_hidden_visibility_attribute=yes - fi - fi - rm -f conftest.* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5 -$as_echo "$libffi_cv_hidden_visibility_attribute" >&6; } - if test $libffi_cv_hidden_visibility_attribute = yes; then - -$as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h - - fi -fi - - - - - - - - -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; if test "$enable_debug" = "yes"; then - -$as_echo "#define FFI_DEBUG 1" >>confdefs.h - - fi -fi - - if test "$enable_debug" = "yes"; then - FFI_DEBUG_TRUE= - FFI_DEBUG_FALSE='#' -else - FFI_DEBUG_TRUE='#' - FFI_DEBUG_FALSE= -fi - - -# Check whether --enable-structs was given. -if test "${enable_structs+set}" = set; then : - enableval=$enable_structs; if test "$enable_structs" = "no"; then - -$as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h - - fi -fi - - if test "$enable_debug" = "yes"; then - FFI_DEBUG_TRUE= - FFI_DEBUG_FALSE='#' -else - FFI_DEBUG_TRUE='#' - FFI_DEBUG_FALSE= -fi - - -# Check whether --enable-raw-api was given. -if test "${enable_raw_api+set}" = set; then : - enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then - -$as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h - - fi -fi - - -# Check whether --enable-purify-safety was given. -if test "${enable_purify_safety+set}" = set; then : - enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then - -$as_echo "#define USING_PURIFY 1" >>confdefs.h - - fi -fi - - -# These variables are only ever used when we cross-build to X86_WIN32. -# And we only support this with GCC, so... -if test "x$GCC" = "xyes"; then - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - toolexecdir='$(exec_prefix)/$(target_alias)' - toolexeclibdir='$(toolexecdir)/lib' - else - toolexecdir='$(libdir)/gcc-lib/$(target_alias)' - toolexeclibdir='$(libdir)' - fi - multi_os_directory=`$CC $CFLAGS -print-multi-os-directory` - case $multi_os_directory in - .) ;; # Avoid trailing /. - ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; - esac - -else - toolexeclibdir='$(libdir)' -fi - - -ac_config_commands="$ac_config_commands include" - -ac_config_commands="$ac_config_commands src" - - -ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h" - - -ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc" - - -ac_config_links="$ac_config_links include/ffi_common.h:include/ffi_common.h" - - -ac_config_files="$ac_config_files fficonfig.py" - - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then - as_fn_error $? "conditional \"TESTSUBDIR\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then - as_fn_error $? "conditional \"MIPS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BFIN_TRUE}" && test -z "${BFIN_FALSE}"; then - as_fn_error $? "conditional \"BFIN\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then - as_fn_error $? "conditional \"SPARC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then - as_fn_error $? "conditional \"X86\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then - as_fn_error $? "conditional \"X86_FREEBSD\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then - as_fn_error $? "conditional \"X86_WIN32\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then - as_fn_error $? "conditional \"X86_WIN64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then - as_fn_error $? "conditional \"X86_DARWIN\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_DARWIN32_TRUE}" && test -z "${X86_DARWIN32_FALSE}"; then - as_fn_error $? "conditional \"X86_DARWIN32\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_DARWIN64_TRUE}" && test -z "${X86_DARWIN64_FALSE}"; then - as_fn_error $? "conditional \"X86_DARWIN64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then - as_fn_error $? "conditional \"ALPHA\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then - as_fn_error $? "conditional \"IA64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then - as_fn_error $? "conditional \"M32R\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then - as_fn_error $? "conditional \"M68K\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${M88K_TRUE}" && test -z "${M88K_FALSE}"; then - as_fn_error $? "conditional \"M88K\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${MICROBLAZE_TRUE}" && test -z "${MICROBLAZE_FALSE}"; then - as_fn_error $? "conditional \"MICROBLAZE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${METAG_TRUE}" && test -z "${METAG_FALSE}"; then - as_fn_error $? "conditional \"METAG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then - as_fn_error $? "conditional \"MOXIE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${NIOS2_TRUE}" && test -z "${NIOS2_FALSE}"; then - as_fn_error $? "conditional \"NIOS2\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then - as_fn_error $? "conditional \"POWERPC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then - as_fn_error $? "conditional \"POWERPC_AIX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then - as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then - as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${AARCH64_TRUE}" && test -z "${AARCH64_FALSE}"; then - as_fn_error $? "conditional \"AARCH64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${ARC_TRUE}" && test -z "${ARC_FALSE}"; then - as_fn_error $? "conditional \"ARC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then - as_fn_error $? "conditional \"ARM\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then - as_fn_error $? "conditional \"AVR32\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then - as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then - as_fn_error $? "conditional \"FRV\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then - as_fn_error $? "conditional \"S390\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then - as_fn_error $? "conditional \"X86_64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then - as_fn_error $? "conditional \"SH\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then - as_fn_error $? "conditional \"SH64\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then - as_fn_error $? "conditional \"PA_LINUX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then - as_fn_error $? "conditional \"PA_HPUX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then - as_fn_error $? "conditional \"PA64_HPUX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${TILE_TRUE}" && test -z "${TILE_FALSE}"; then - as_fn_error $? "conditional \"TILE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${VAX_TRUE}" && test -z "${VAX_FALSE}"; then - as_fn_error $? "conditional \"VAX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${XTENSA_TRUE}" && test -z "${XTENSA_FALSE}"; then - as_fn_error $? "conditional \"XTENSA\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then - as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then - as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then - as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by libffi $as_me 3.1, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_links="$ac_config_links" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration links: -$config_links - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -libffi config.status 3.1 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -ax_enable_builddir_srcdir="$srcdir" # $srcdir -ax_enable_builddir_host="$HOST" # $HOST / $host -ax_enable_builddir_version="$VERSION" # $VERSION -ax_enable_builddir_package="$PACKAGE" # $PACKAGE -ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX -ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED -ax_enable_builddir="$ax_enable_builddir" # $SUB - -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_import \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -lt_cv_nm_interface \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' - -# See if we are running on zsh, and set the options that allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - RM='$RM' - ofile='$ofile' - - - - - -TARGETDIR="$TARGETDIR" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; - "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; - "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; - "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; - "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; - "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; - "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; - "include/ffi_common.h") CONFIG_LINKS="$CONFIG_LINKS include/ffi_common.h:include/ffi_common.h" ;; - "fficonfig.py") CONFIG_FILES="$CONFIG_FILES fficonfig.py" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - :L) - # - # CONFIG_LINK - # - - if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then - : - else - # Prefer the file from the source tree if names are identical. - if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then - ac_source=$srcdir/$ac_source - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 -$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} - - if test ! -r "$ac_source"; then - as_fn_error $? "$ac_source: file not found" "$LINENO" 5 - fi - rm -f "$ac_file" - - # Try a relative symlink, then a hard link, then a copy. - case $ac_source in - [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; - *) ac_rel_source=$ac_top_build_prefix$ac_source ;; - esac - ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || - ln "$ac_source" "$ac_file" 2>/dev/null || - cp -p "$ac_source" "$ac_file" || - as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 - fi - ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" - if test ".$ax_enable_builddir" = ".." ; then - if test -f "$top_srcdir/Makefile" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 -$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} - else - { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 -$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} - fi - else - if test -f "$ac_top_srcdir/Makefile" ; then - a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` - test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" - fi - if test -f "$ac_top_srcdir/Makefile" ; then - echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk - echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk - eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" - if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null - then rm $ac_top_srcdir/Makefile ; fi - cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING - fi - if test ! -f "$ac_top_srcdir/Makefile" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 -$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} - x='`' ; cat >$tmp/conftemp.sed <<_EOF -/^\$/n -x -/^\$/bS -x -/\\\\\$/{H;d;} -{H;s/.*//;x;} -bM -:S -x -/\\\\\$/{h;d;} -{h;s/.*//;x;} -:M -s/\\(\\n\\) /\\1 /g -/^ /d -/^[ ]*[\\#]/d -/^VPATH *=/d -s/^srcdir *=.*/srcdir = ./ -s/^top_srcdir *=.*/top_srcdir = ./ -/[:=]/!d -/^\\./d -/ = /b -/ .= /b -/:/!b -s/:.*/:/ -s/ / /g -s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g -s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ -s/ / /g -/^all all-all[ :]/i\\ -all-configured : all-all -s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g -/-all-all/d -a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done -/dist-all *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -/dist-[a-zA-Z0-9]*-all *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -/distclean-all *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ - ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ - ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile -_EOF - cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING - $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile - if test -f "$ac_top_srcdir/Makefile.mk" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 -$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} - cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile - fi ; xxxx="####" - echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile - # sanity check - if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 -$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} - $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ - >$ac_top_srcdir/Makefile~ - (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null - fi - else - xxxx="\\#\\#\\#\\#" - # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed - echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed - $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp - cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING - cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING - if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 -$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} - rm "$tmp/mkfile.tmp" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 -$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} - mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" - fi - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 -$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} - xxxx="####" - echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile - fi - ;; - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options that allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST - fi - - cfgfile=${ofile}T - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags='CXX ' - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm into a list of symbols to manually relocate. -global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# The name lister interface. -nm_interface=$lt_lt_cv_nm_interface - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and where our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \$shlibpath_var if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain=$ac_aux_dir/ltmain.sh - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \$shlibpath_var if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - "include":C) test -d include || mkdir include ;; - "src":C) -test -d src || mkdir src -test -d src/$TARGETDIR || mkdir src/$TARGETDIR - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/third_party/python/Modules/_ctypes/libffi/configure.ac b/third_party/python/Modules/_ctypes/libffi/configure.ac deleted file mode 100644 index 5c8885fa6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/configure.ac +++ /dev/null @@ -1,630 +0,0 @@ -dnl Process this with autoconf to create configure -# -# file from libffi - slightly patched for Python's ctypes -# - -AC_PREREQ(2.68) - -AC_INIT([libffi], [3.1], [http://github.com/atgreen/libffi/issues]) -AC_CONFIG_HEADERS([fficonfig.h]) - -AC_CANONICAL_SYSTEM -target_alias=${target_alias-$host_alias} - -case "${host}" in - frv*-elf) - LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ - ;; -esac - -AX_ENABLE_BUILDDIR - -AM_INIT_AUTOMAKE - -# The same as in boehm-gc and libstdc++. Have to borrow it from there. -# We must force CC to /not/ be precious variables; otherwise -# the wrong, non-multilib-adjusted value will be used in multilibs. -# As a side effect, we have to subst CFLAGS ourselves. -# Also save and restore CFLAGS, since AC_PROG_CC will come up with -# defaults of its own if none are provided. - -m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) -m4_define([_AC_ARG_VAR_PRECIOUS],[]) -save_CFLAGS=$CFLAGS -AC_PROG_CC -AC_PROG_CXX -CFLAGS=$save_CFLAGS -m4_undefine([_AC_ARG_VAR_PRECIOUS]) -m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) - -AC_SUBST(CFLAGS) - -AM_PROG_AS -AM_PROG_CC_C_O -AC_PROG_LIBTOOL -AC_CONFIG_MACRO_DIR([m4]) - -# Test for 64-bit build. -AC_CHECK_SIZEOF([size_t]) - -AX_COMPILER_VENDOR -AX_CC_MAXOPT -# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro -# compiler. -if test "$ax_cv_c_compiler_vendor" != "sun"; then - AX_CFLAGS_WARN_ALL -fi - -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -fexceptions" -fi - -cat > local.exp < /dev/null]) -AM_CONDITIONAL(BFIN, test x$TARGET = xBFIN) -AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) -AM_CONDITIONAL(X86, test x$TARGET = xX86) -AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD) -AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32) -AM_CONDITIONAL(X86_WIN64, test x$TARGET = xX86_WIN64) -AM_CONDITIONAL(X86_DARWIN, test x$TARGET = xX86_DARWIN) -AM_CONDITIONAL(X86_DARWIN32, test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 4) -AM_CONDITIONAL(X86_DARWIN64, test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 8) -AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA) -AM_CONDITIONAL(IA64, test x$TARGET = xIA64) -AM_CONDITIONAL(M32R, test x$TARGET = xM32R) -AM_CONDITIONAL(M68K, test x$TARGET = xM68K) -AM_CONDITIONAL(M88K, test x$TARGET = xM88K) -AM_CONDITIONAL(MICROBLAZE, test x$TARGET = xMICROBLAZE) -AM_CONDITIONAL(METAG, test x$TARGET = xMETAG) -AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE) -AM_CONDITIONAL(NIOS2, test x$TARGET = xNIOS2) -AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC) -AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) -AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) -AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD) -AM_CONDITIONAL(AARCH64, test x$TARGET = xAARCH64) -AM_CONDITIONAL(ARC, test x$TARGET = xARC) -AM_CONDITIONAL(ARM, test x$TARGET = xARM) -AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32) -AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS) -AM_CONDITIONAL(FRV, test x$TARGET = xFRV) -AM_CONDITIONAL(S390, test x$TARGET = xS390) -AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) -AM_CONDITIONAL(SH, test x$TARGET = xSH) -AM_CONDITIONAL(SH64, test x$TARGET = xSH64) -AM_CONDITIONAL(PA_LINUX, test x$TARGET = xPA_LINUX) -AM_CONDITIONAL(PA_HPUX, test x$TARGET = xPA_HPUX) -AM_CONDITIONAL(PA64_HPUX, test x$TARGET = xPA64_HPUX) -AM_CONDITIONAL(TILE, test x$TARGET = xTILE) -AM_CONDITIONAL(VAX, test x$TARGET = xVAX) -AM_CONDITIONAL(XTENSA, test x$TARGET = xXTENSA) - -AC_HEADER_STDC -AC_CHECK_FUNCS(memcpy) -AC_FUNC_ALLOCA - -AC_CHECK_SIZEOF(double) -AC_CHECK_SIZEOF(long double) - -# Also AC_SUBST this variable for ffi.h. -if test -z "$HAVE_LONG_DOUBLE"; then - HAVE_LONG_DOUBLE=0 - if test $ac_cv_sizeof_long_double != 0; then - if test $HAVE_LONG_DOUBLE_VARIANT != 0; then - AC_DEFINE(HAVE_LONG_DOUBLE_VARIANT, 1, [Define if you support more than one size of the long double type]) - HAVE_LONG_DOUBLE=1 - else - if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then - HAVE_LONG_DOUBLE=1 - AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double]) - fi - fi - fi -fi -AC_SUBST(HAVE_LONG_DOUBLE) -AC_SUBST(HAVE_LONG_DOUBLE_VARIANT) - -AC_C_BIGENDIAN - -GCC_AS_CFI_PSEUDO_OP - -if test x$TARGET = xSPARC; then - AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs], - libffi_cv_as_sparc_ua_pcrel, [ - save_CFLAGS="$CFLAGS" - save_LDFLAGS="$LDFLAGS" - CFLAGS="$CFLAGS -fpic" - LDFLAGS="$LDFLAGS -shared" - AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],, - [libffi_cv_as_sparc_ua_pcrel=yes], - [libffi_cv_as_sparc_ua_pcrel=no]) - CFLAGS="$save_CFLAGS" - LDFLAGS="$save_LDFLAGS"]) - if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then - AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1, - [Define if your assembler and linker support unaligned PC relative relocs.]) - fi - - AC_CACHE_CHECK([assembler .register pseudo-op support], - libffi_cv_as_register_pseudo_op, [ - libffi_cv_as_register_pseudo_op=unknown - # Check if we have .register - AC_TRY_COMPILE(,[asm (".register %g2, #scratch");], - [libffi_cv_as_register_pseudo_op=yes], - [libffi_cv_as_register_pseudo_op=no]) - ]) - if test "x$libffi_cv_as_register_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1, - [Define if your assembler supports .register.]) - fi -fi - -if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then - AC_CACHE_CHECK([assembler supports pc related relocs], - libffi_cv_as_x86_pcrel, [ - libffi_cv_as_x86_pcrel=no - echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then - libffi_cv_as_x86_pcrel=yes - fi - ]) - if test "x$libffi_cv_as_x86_pcrel" = xyes; then - AC_DEFINE(HAVE_AS_X86_PCREL, 1, - [Define if your assembler supports PC relative relocs.]) - fi - - AC_CACHE_CHECK([assembler .ascii pseudo-op support], - libffi_cv_as_ascii_pseudo_op, [ - libffi_cv_as_ascii_pseudo_op=unknown - # Check if we have .ascii - AC_TRY_COMPILE(,[asm (".ascii \\"string\\"");], - [libffi_cv_as_ascii_pseudo_op=yes], - [libffi_cv_as_ascii_pseudo_op=no]) - ]) - if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1, - [Define if your assembler supports .ascii.]) - fi - - AC_CACHE_CHECK([assembler .string pseudo-op support], - libffi_cv_as_string_pseudo_op, [ - libffi_cv_as_string_pseudo_op=unknown - # Check if we have .string - AC_TRY_COMPILE(,[asm (".string \\"string\\"");], - [libffi_cv_as_string_pseudo_op=yes], - [libffi_cv_as_string_pseudo_op=no]) - ]) - if test "x$libffi_cv_as_string_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, - [Define if your assembler supports .string.]) - fi -fi - -# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. -AC_ARG_ENABLE(pax_emutramp, - [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], - if test "$enable_pax_emutramp" = "yes"; then - AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, - [Define this if you want to enable pax emulated trampolines]) - fi) - -LT_SYS_SYMBOL_USCORE -if test "x$sys_symbol_underscore" = xyes; then - AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) -fi - -FFI_EXEC_TRAMPOLINE_TABLE=0 -case "$target" in - *arm*-apple-darwin*) - FFI_EXEC_TRAMPOLINE_TABLE=1 - AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, - [Cannot use PROT_EXEC on this target, so, we revert to - alternative means]) - ;; - *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) - AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, - [Cannot use malloc on this target, so, we revert to - alternative means]) - ;; -esac -AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) -AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) - -if test x$TARGET = xX86_64; then - AC_CACHE_CHECK([toolchain supports unwind section type], - libffi_cv_as_x86_64_unwind_section_type, [ - cat > conftest1.s << EOF -.text -.globl foo -foo: -jmp bar -.section .eh_frame,"a",@unwind -bar: -EOF - - cat > conftest2.c << EOF -extern void foo(); -int main(){foo();} -EOF - - libffi_cv_as_x86_64_unwind_section_type=no - # we ensure that we can compile _and_ link an assembly file containing an @unwind section - # since the compiler can support it and not the linker (ie old binutils) - if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ - $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then - libffi_cv_as_x86_64_unwind_section_type=yes - fi - ]) - if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then - AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, - [Define if your assembler supports unwind section type.]) - fi -fi - -if test "x$GCC" = "xyes"; then - AC_CACHE_CHECK([whether .eh_frame section should be read-only], - libffi_cv_ro_eh_frame, [ - libffi_cv_ro_eh_frame=no - echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c - if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then - objdump -h conftest.o > conftest.dump 2>&1 - libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` - libffi_test_line=`expr $libffi_eh_frame_line + 1`p - sed -n $libffi_test_line conftest.dump > conftest.line - if grep READONLY conftest.line > /dev/null; then - libffi_cv_ro_eh_frame=yes - fi - fi - rm -f conftest.* - ]) - if test "x$libffi_cv_ro_eh_frame" = xyes; then - AC_DEFINE(HAVE_RO_EH_FRAME, 1, - [Define if .eh_frame sections should be read-only.]) - AC_DEFINE(EH_FRAME_FLAGS, "a", - [Define to the flags needed for the .section .eh_frame directive. ]) - else - AC_DEFINE(EH_FRAME_FLAGS, "aw", - [Define to the flags needed for the .section .eh_frame directive. ]) - fi - - AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], - libffi_cv_hidden_visibility_attribute, [ - echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c - libffi_cv_hidden_visibility_attribute=no - if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then - if grep '\.hidden.*foo' conftest.s >/dev/null; then - libffi_cv_hidden_visibility_attribute=yes - fi - fi - rm -f conftest.* - ]) - if test $libffi_cv_hidden_visibility_attribute = yes; then - AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, - [Define if __attribute__((visibility("hidden"))) is supported.]) - fi -fi - -AH_BOTTOM([ -#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -#ifdef LIBFFI_ASM -#define FFI_HIDDEN(name) .hidden name -#else -#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) -#endif -#else -#ifdef LIBFFI_ASM -#define FFI_HIDDEN(name) -#else -#define FFI_HIDDEN -#endif -#endif -]) - -AC_SUBST(TARGET) -AC_SUBST(TARGETDIR) - -AC_SUBST(SHELL) - -AC_ARG_ENABLE(debug, -[ --enable-debug debugging mode], - if test "$enable_debug" = "yes"; then - AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) - fi) -AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") - -AC_ARG_ENABLE(structs, -[ --disable-structs omit code for struct support], - if test "$enable_structs" = "no"; then - AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.]) - fi) -AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") - -AC_ARG_ENABLE(raw-api, -[ --disable-raw-api make the raw api unavailable], - if test "$enable_raw_api" = "no"; then - AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.]) - fi) - -AC_ARG_ENABLE(purify-safety, -[ --enable-purify-safety purify-safe mode], - if test "$enable_purify_safety" = "yes"; then - AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) - fi) - -# These variables are only ever used when we cross-build to X86_WIN32. -# And we only support this with GCC, so... -if test "x$GCC" = "xyes"; then - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - toolexecdir='$(exec_prefix)/$(target_alias)' - toolexeclibdir='$(toolexecdir)/lib' - else - toolexecdir='$(libdir)/gcc-lib/$(target_alias)' - toolexeclibdir='$(libdir)' - fi - multi_os_directory=`$CC $CFLAGS -print-multi-os-directory` - case $multi_os_directory in - .) ;; # Avoid trailing /. - ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; - esac - AC_SUBST(toolexecdir) -else - toolexeclibdir='$(libdir)' -fi -AC_SUBST(toolexeclibdir) - -AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) -AC_CONFIG_COMMANDS(src, [ -test -d src || mkdir src -test -d src/$TARGETDIR || mkdir src/$TARGETDIR -], [TARGETDIR="$TARGETDIR"]) - -AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h) - -AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc) - -AC_CONFIG_LINKS(include/ffi_common.h:include/ffi_common.h) - -AC_CONFIG_FILES(fficonfig.py) - -AC_OUTPUT diff --git a/third_party/python/Modules/_ctypes/libffi/depcomp b/third_party/python/Modules/_ctypes/libffi/depcomp deleted file mode 100755 index 4ebd5b3a2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/depcomp +++ /dev/null @@ -1,791 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2013-05-30.07; # UTC - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by 'PROGRAMS ARGS'. - object Object file output by 'PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputting dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -# Get the directory component of the given path, and save it in the -# global variables '$dir'. Note that this directory component will -# be either empty or ending with a '/' character. This is deliberate. -set_dir_from () -{ - case $1 in - */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; - *) dir=;; - esac -} - -# Get the suffix-stripped basename of the given path, and save it the -# global variable '$base'. -set_base_from () -{ - base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` -} - -# If no dependency file was actually created by the compiler invocation, -# we still have to create a dummy depfile, to avoid errors with the -# Makefile "include basename.Plo" scheme. -make_dummy_depfile () -{ - echo "#dummy" > "$depfile" -} - -# Factor out some common post-processing of the generated depfile. -# Requires the auxiliary global variable '$tmpdepfile' to be set. -aix_post_process_depfile () -{ - # If the compiler actually managed to produce a dependency file, - # post-process it. - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependency.h'. - # Do two passes, one to just change these to - # $object: dependency.h - # and one to simply output - # dependency.h: - # which is needed to avoid the deleted-header problem. - { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" - sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" - } > "$depfile" - rm -f "$tmpdepfile" - else - make_dummy_depfile - fi -} - -# A tabulation character. -tab=' ' -# A newline character. -nl=' -' -# Character ranges might be problematic outside the C locale. -# These definitions help. -upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ -lower=abcdefghijklmnopqrstuvwxyz -digits=0123456789 -alpha=${upper}${lower} - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Avoid interferences from the environment. -gccflag= dashmflag= - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp -fi - -if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 -fi - -if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. - gccflag=-qmakedep=gcc,-MF - depmode=gcc -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. -## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. -## (see the conditional assignment to $gccflag above). -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). Also, it might not be -## supported by the other compilers which use the 'gcc' depmode. -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The second -e expression handles DOS-style file names with drive - # letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the "deleted header file" problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. -## Some versions of gcc put a space before the ':'. On the theory -## that the space means something, we add a space to the output as -## well. hp depmode also adds that space, but also prefixes the VPATH -## to the object. Take care to not repeat it in the output. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like '#:fec' to the end of the - # dependency line. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ - | tr "$nl" ' ' >> "$depfile" - echo >> "$depfile" - # The second pass generates a dummy entry for each header file. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" - ;; - -xlc) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts '$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - aix_post_process_depfile - ;; - -tcc) - # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 - # FIXME: That version still under development at the moment of writing. - # Make that this statement remains true also for stable, released - # versions. - # It will wrap lines (doesn't matter whether long or short) with a - # trailing '\', as in: - # - # foo.o : \ - # foo.c \ - # foo.h \ - # - # It will put a trailing '\' even on the last line, and will use leading - # spaces rather than leading tabs (at least since its commit 0394caf7 - # "Emit spaces for -MD"). - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. - # We have to change lines of the first kind to '$object: \'. - sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" - # And for each line of the second kind, we have to emit a 'dep.h:' - # dummy dependency, to avoid the deleted-header problem. - sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" - rm -f "$tmpdepfile" - ;; - -## The order of this option in the case statement is important, since the -## shell code in configure will try each of these formats in the order -## listed in this file. A plain '-MD' option would be understood by many -## compilers, so we must ensure this comes after the gcc and icc options. -pgcc) - # Portland's C compiler understands '-MD'. - # Will always output deps to 'file.d' where file is the root name of the - # source file under compilation, even if file resides in a subdirectory. - # The object file name does not affect the name of the '.d' file. - # pgcc 10.2 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\' : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - set_dir_from "$object" - # Use the source, not the object, to determine the base name, since - # that's sadly what pgcc will do too. - set_base_from "$source" - tmpdepfile=$base.d - - # For projects that build the same source file twice into different object - # files, the pgcc approach of using the *source* file root name can cause - # problems in parallel builds. Use a locking strategy to avoid stomping on - # the same $tmpdepfile. - lockdir=$base.d-lock - trap " - echo '$0: caught signal, cleaning up...' >&2 - rmdir '$lockdir' - exit 1 - " 1 2 13 15 - numtries=100 - i=$numtries - while test $i -gt 0; do - # mkdir is a portable test-and-set. - if mkdir "$lockdir" 2>/dev/null; then - # This process acquired the lock. - "$@" -MD - stat=$? - # Release the lock. - rmdir "$lockdir" - break - else - # If the lock is being held by a different process, wait - # until the winning process is done or we timeout. - while test -d "$lockdir" && test $i -gt 0; do - sleep 1 - i=`expr $i - 1` - done - fi - i=`expr $i - 1` - done - trap - 1 2 13 15 - if test $i -le 0; then - echo "$0: failed to acquire lock after $numtries attempts" >&2 - echo "$0: check lockdir '$lockdir'" >&2 - exit 1 - fi - - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" - # Add 'dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - set_dir_from "$object" - set_base_from "$object" - - if test "$libtool" = yes; then - # Libtool generates 2 separate objects for the 2 libraries. These - # two compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir$base.o.d # libtool 1.5 - tmpdepfile2=$dir.libs/$base.o.d # Likewise. - tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - # Same post-processing that is required for AIX mode. - aix_post_process_depfile - ;; - -msvc7) - if test "$libtool" = yes; then - showIncludes=-Wc,-showIncludes - else - showIncludes=-showIncludes - fi - "$@" $showIncludes > "$tmpdepfile" - stat=$? - grep -v '^Note: including file: ' "$tmpdepfile" - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The first sed program below extracts the file names and escapes - # backslashes for cygpath. The second sed program outputs the file - # name when reading, but also accumulates all include files in the - # hold buffer in order to output them again at the end. This only - # works with sed implementations that can handle large buffers. - sed < "$tmpdepfile" -n ' -/^Note: including file: *\(.*\)/ { - s//\1/ - s/\\/\\\\/g - p -}' | $cygpath_u | sort -u | sed -n ' -s/ /\\ /g -s/\(.*\)/'"$tab"'\1 \\/p -s/.\(.*\) \\/\1:/ -H -$ { - s/.*/'"$tab"'/ - G - p -}' >> "$depfile" - echo >> "$depfile" # make sure the fragment doesn't end with a backslash - rm -f "$tmpdepfile" - ;; - -msvc7msys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for ':' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. - "$@" $dashmflag | - sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this sed invocation - # correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - # makedepend may prepend the VPATH from the source file name to the object. - # No need to regex-escape $object, excess matching of '.' is harmless. - sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process the last invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed '1,2d' "$tmpdepfile" \ - | tr ' ' "$nl" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E \ - | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - | sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" - echo "$tab" >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/doc/libffi.info b/third_party/python/Modules/_ctypes/libffi/doc/libffi.info deleted file mode 100644 index 399093947..000000000 --- a/third_party/python/Modules/_ctypes/libffi/doc/libffi.info +++ /dev/null @@ -1,618 +0,0 @@ -This is libffi.info, produced by makeinfo version 5.1 from libffi.texi. - -This manual is for Libffi, a portable foreign-function interface -library. - - Copyright (C) 2008, 2010, 2011 Red Hat, Inc. - - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, or (at - your option) any later version. A copy of the license is included - in the section entitled "GNU General Public License". - -INFO-DIR-SECTION Development -START-INFO-DIR-ENTRY -* libffi: (libffi). Portable foreign-function interface library. -END-INFO-DIR-ENTRY - - -File: libffi.info, Node: Top, Next: Introduction, Up: (dir) - -libffi -****** - -This manual is for Libffi, a portable foreign-function interface -library. - - Copyright (C) 2008, 2010, 2011 Red Hat, Inc. - - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, or (at - your option) any later version. A copy of the license is included - in the section entitled "GNU General Public License". - -* Menu: - -* Introduction:: What is libffi? -* Using libffi:: How to use libffi. -* Missing Features:: Things libffi can't do. -* Index:: Index. - - -File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top - -1 What is libffi? -***************** - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling convention". -The calling convention is a set of assumptions made by the compiler -about where function arguments will be found on entry to a function. A -calling convention also specifies where the return value for a function -is found. The calling convention is also sometimes called the "ABI" or -"Application Binary Interface". - - Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call a -given function. 'Libffi' can be used in such programs to provide a -bridge from the interpreter program to compiled code. - - The 'libffi' library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run time. - - FFI stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code written -in one language to call code written in another language. The 'libffi' -library really only provides the lowest, machine dependent layer of a -fully featured foreign function interface. A layer must exist above -'libffi' that handles type conversions for values passed between the two -languages. - - -File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top - -2 Using libffi -************** - -* Menu: - -* The Basics:: The basic libffi API. -* Simple Example:: A simple example. -* Types:: libffi type descriptions. -* Multiple ABIs:: Different passing styles on one platform. -* The Closure API:: Writing a generic function. -* Closure Example:: A closure example. - - -File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi - -2.1 The Basics -============== - -'Libffi' assumes that you have a pointer to the function you wish to -call and that you know the number and types of arguments to pass it, as -well as the return type of the function. - - The first thing you must do is create an 'ffi_cif' object that -matches the signature of the function you wish to call. This is a -separate step because it is common to make multiple calls using a single -'ffi_cif'. The "cif" in 'ffi_cif' stands for Call InterFace. To -prepare a call interface object, use the function 'ffi_prep_cif'. - - -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI, - unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES) - This initializes CIF according to the given parameters. - - ABI is the ABI to use; normally 'FFI_DEFAULT_ABI' is what you want. - *note Multiple ABIs:: for more information. - - NARGS is the number of arguments that this function accepts. - - RTYPE is a pointer to an 'ffi_type' structure that describes the - return type of the function. *Note Types::. - - ARGTYPES is a vector of 'ffi_type' pointers. ARGTYPES must have - NARGS elements. If NARGS is 0, this argument is ignored. - - 'ffi_prep_cif' returns a 'libffi' status code, of type - 'ffi_status'. This will be either 'FFI_OK' if everything worked - properly; 'FFI_BAD_TYPEDEF' if one of the 'ffi_type' objects is - incorrect; or 'FFI_BAD_ABI' if the ABI parameter is invalid. - - If the function being called is variadic (varargs) then -'ffi_prep_cif_var' must be used instead of 'ffi_prep_cif'. - - -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi varabi, - unsigned int NFIXEDARGS, unsigned int varntotalargs, ffi_type - *RTYPE, ffi_type **ARGTYPES) - This initializes CIF according to the given parameters for a call - to a variadic function. In general it's operation is the same as - for 'ffi_prep_cif' except that: - - NFIXEDARGS is the number of fixed arguments, prior to any variadic - arguments. It must be greater than zero. - - NTOTALARGS the total number of arguments, including variadic and - fixed arguments. - - Note that, different cif's must be prepped for calls to the same - function when different numbers of arguments are passed. - - Also note that a call to 'ffi_prep_cif_var' with - NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to - 'ffi_prep_cif'. - - To call a function using an initialized 'ffi_cif', use the 'ffi_call' -function: - - -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void - **AVALUES) - This calls the function FN according to the description given in - CIF. CIF must have already been prepared using 'ffi_prep_cif'. - - RVALUE is a pointer to a chunk of memory that will hold the result - of the function call. This must be large enough to hold the - result, no smaller than the system register size (generally 32 or - 64 bits), and must be suitably aligned; it is the caller's - responsibility to ensure this. If CIF declares that the function - returns 'void' (using 'ffi_type_void'), then RVALUE is ignored. - - AVALUES is a vector of 'void *' pointers that point to the memory - locations holding the argument values for a call. If CIF declares - that the function has no arguments (i.e., NARGS was 0), then - AVALUES is ignored. Note that argument values may be modified by - the callee (for instance, structs passed by value); the burden of - copying pass-by-value arguments is placed on the caller. - - -File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi - -2.2 Simple Example -================== - -Here is a trivial example that calls 'puts' a few times. - - #include - #include - - int main() - { - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - ffi_arg rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - { - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - } - - return 0; - } - - -File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi - -2.3 Types -========= - -* Menu: - -* Primitive Types:: Built-in types. -* Structures:: Structure types. -* Type Example:: Structure type example. - - -File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types - -2.3.1 Primitive Types ---------------------- - -'Libffi' provides a number of built-in type descriptors that can be used -to describe argument and return types: - -'ffi_type_void' - The type 'void'. This cannot be used for argument types, only for - return values. - -'ffi_type_uint8' - An unsigned, 8-bit integer type. - -'ffi_type_sint8' - A signed, 8-bit integer type. - -'ffi_type_uint16' - An unsigned, 16-bit integer type. - -'ffi_type_sint16' - A signed, 16-bit integer type. - -'ffi_type_uint32' - An unsigned, 32-bit integer type. - -'ffi_type_sint32' - A signed, 32-bit integer type. - -'ffi_type_uint64' - An unsigned, 64-bit integer type. - -'ffi_type_sint64' - A signed, 64-bit integer type. - -'ffi_type_float' - The C 'float' type. - -'ffi_type_double' - The C 'double' type. - -'ffi_type_uchar' - The C 'unsigned char' type. - -'ffi_type_schar' - The C 'signed char' type. (Note that there is not an exact - equivalent to the C 'char' type in 'libffi'; ordinarily you should - either use 'ffi_type_schar' or 'ffi_type_uchar' depending on - whether 'char' is signed.) - -'ffi_type_ushort' - The C 'unsigned short' type. - -'ffi_type_sshort' - The C 'short' type. - -'ffi_type_uint' - The C 'unsigned int' type. - -'ffi_type_sint' - The C 'int' type. - -'ffi_type_ulong' - The C 'unsigned long' type. - -'ffi_type_slong' - The C 'long' type. - -'ffi_type_longdouble' - On platforms that have a C 'long double' type, this is defined. On - other platforms, it is not. - -'ffi_type_pointer' - A generic 'void *' pointer. You should use this for all pointers, - regardless of their real type. - - Each of these is of type 'ffi_type', so you must take the address -when passing to 'ffi_prep_cif'. - - -File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types - -2.3.2 Structures ----------------- - -Although 'libffi' has no special support for unions or bit-fields, it is -perfectly happy passing structures back and forth. You must first -describe the structure to 'libffi' by creating a new 'ffi_type' object -for it. - - -- Data type: ffi_type - The 'ffi_type' has the following members: - 'size_t size' - This is set by 'libffi'; you should initialize it to zero. - - 'unsigned short alignment' - This is set by 'libffi'; you should initialize it to zero. - - 'unsigned short type' - For a structure, this should be set to 'FFI_TYPE_STRUCT'. - - 'ffi_type **elements' - This is a 'NULL'-terminated array of pointers to 'ffi_type' - objects. There is one element per field of the struct. - - -File: libffi.info, Node: Type Example, Prev: Structures, Up: Types - -2.3.3 Type Example ------------------- - -The following example initializes a 'ffi_type' object representing the -'tm' struct from Linux's 'time.h'. - - Here is how the struct is defined: - - struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; - }; - - Here is the corresponding code to describe this struct to 'libffi': - - { - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.type = FFI_TYPE_STRUCT; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - } - - -File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi - -2.4 Multiple ABIs -================= - -A given platform may provide multiple different ABIs at once. For -instance, the x86 platform has both 'stdcall' and 'fastcall' functions. - - 'libffi' provides some support for this. However, this is -necessarily platform-specific. - - -File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi - -2.5 The Closure API -=================== - -'libffi' also provides a way to write a generic function - a function -that can accept and decode any combination of arguments. This can be -useful when writing an interpreter, or to provide wrappers for arbitrary -functions. - - This facility is called the "closure API". Closures are not supported -on all platforms; you can check the 'FFI_CLOSURES' define to determine -whether they are supported on the current platform. - - Because closures work by assembling a tiny function at runtime, they -require special allocation on platforms that have a non-executable heap. -Memory management for closures is handled by a pair of functions: - - -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE) - Allocate a chunk of memory holding SIZE bytes. This returns a - pointer to the writable address, and sets *CODE to the - corresponding executable address. - - SIZE should be sufficient to hold a 'ffi_closure' object. - - -- Function: void ffi_closure_free (void *WRITABLE) - Free memory allocated using 'ffi_closure_alloc'. The argument is - the writable address that was returned. - - Once you have allocated the memory for a closure, you must construct -a 'ffi_cif' describing the function call. Finally you can prepare the -closure function: - - -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE, - ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void - **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC) - Prepare a closure function. - - CLOSURE is the address of a 'ffi_closure' object; this is the - writable address returned by 'ffi_closure_alloc'. - - CIF is the 'ffi_cif' describing the function parameters. - - USER_DATA is an arbitrary datum that is passed, uninterpreted, to - your closure function. - - CODELOC is the executable address returned by 'ffi_closure_alloc'. - - FUN is the function which will be called when the closure is - invoked. It is called with the arguments: - CIF - The 'ffi_cif' passed to 'ffi_prep_closure_loc'. - - RET - A pointer to the memory used for the function's return value. - FUN must fill this, unless the function is declared as - returning 'void'. - - ARGS - A vector of pointers to memory holding the arguments to the - function. - - USER_DATA - The same USER_DATA that was passed to 'ffi_prep_closure_loc'. - - 'ffi_prep_closure_loc' will return 'FFI_OK' if everything went ok, - and something else on error. - - After calling 'ffi_prep_closure_loc', you can cast CODELOC to the - appropriate pointer-to-function type. - - You may see old code referring to 'ffi_prep_closure'. This function -is deprecated, as it cannot handle the need for separate writable and -executable addresses. - - -File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi - -2.6 Closure Example -=================== - -A trivial example that creates a new 'puts' by binding 'fputs' with -'stdout'. - - #include - #include - - /* Acts like puts with the file given at time of enclosure. */ - void puts_binding(ffi_cif *cif, void *ret, void* args[], - void *stream) - { - *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream); - } - - typedef int (*puts_t)(char *); - - int main() - { - ffi_cif cif; - ffi_type *args[1]; - ffi_closure *closure; - - void *bound_puts; - int rc; - - /* Allocate closure and bound_puts */ - closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); - - if (closure) - { - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - { - /* Initialize the closure, setting stream to stdout */ - if (ffi_prep_closure_loc(closure, &cif, puts_binding, - stdout, bound_puts) == FFI_OK) - { - rc = ((puts_t)bound_puts)("Hello World!"); - /* rc now holds the result of the call to fputs */ - } - } - } - - /* Deallocate both closure, and bound_puts */ - ffi_closure_free(closure); - - return 0; - } - - -File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top - -3 Missing Features -****************** - -'libffi' is missing a few features. We welcome patches to add support -for these. - - * Variadic closures. - - * There is no support for bit fields in structures. - - * The closure API is - - * The "raw" API is undocumented. - - Note that variadic support is very new and tested on a relatively -small number of platforms. - - -File: libffi.info, Node: Index, Prev: Missing Features, Up: Top - -Index -***** - -[index] -* Menu: - -* ABI: Introduction. (line 13) -* Application Binary Interface: Introduction. (line 13) -* calling convention: Introduction. (line 13) -* cif: The Basics. (line 14) -* closure API: The Closure API. (line 13) -* closures: The Closure API. (line 13) -* FFI: Introduction. (line 31) -* ffi_call: The Basics. (line 62) -* FFI_CLOSURES: The Closure API. (line 13) -* ffi_closure_alloc: The Closure API. (line 19) -* ffi_closure_free: The Closure API. (line 26) -* ffi_prep_cif: The Basics. (line 16) -* ffi_prep_cif_var: The Basics. (line 39) -* ffi_prep_closure_loc: The Closure API. (line 34) -* ffi_status: The Basics. (line 16) -* ffi_status <1>: The Basics. (line 39) -* ffi_status <2>: The Closure API. (line 34) -* ffi_type: Structures. (line 11) -* ffi_type <1>: Structures. (line 11) -* ffi_type_double: Primitive Types. (line 41) -* ffi_type_float: Primitive Types. (line 38) -* ffi_type_longdouble: Primitive Types. (line 71) -* ffi_type_pointer: Primitive Types. (line 75) -* ffi_type_schar: Primitive Types. (line 47) -* ffi_type_sint: Primitive Types. (line 62) -* ffi_type_sint16: Primitive Types. (line 23) -* ffi_type_sint32: Primitive Types. (line 29) -* ffi_type_sint64: Primitive Types. (line 35) -* ffi_type_sint8: Primitive Types. (line 17) -* ffi_type_slong: Primitive Types. (line 68) -* ffi_type_sshort: Primitive Types. (line 56) -* ffi_type_uchar: Primitive Types. (line 44) -* ffi_type_uint: Primitive Types. (line 59) -* ffi_type_uint16: Primitive Types. (line 20) -* ffi_type_uint32: Primitive Types. (line 26) -* ffi_type_uint64: Primitive Types. (line 32) -* ffi_type_uint8: Primitive Types. (line 14) -* ffi_type_ulong: Primitive Types. (line 65) -* ffi_type_ushort: Primitive Types. (line 53) -* ffi_type_void: Primitive Types. (line 10) -* Foreign Function Interface: Introduction. (line 31) -* void: The Basics. (line 62) -* void <1>: The Closure API. (line 19) -* void <2>: The Closure API. (line 26) - - - -Tag Table: -Node: Top682 -Node: Introduction1429 -Node: Using libffi3061 -Node: The Basics3547 -Node: Simple Example7198 -Node: Types8229 -Node: Primitive Types8512 -Node: Structures10333 -Node: Type Example11207 -Node: Multiple ABIs12473 -Node: The Closure API12844 -Node: Closure Example15788 -Node: Missing Features17397 -Node: Index17850 - -End Tag Table diff --git a/third_party/python/Modules/_ctypes/libffi/doc/libffi.texi b/third_party/python/Modules/_ctypes/libffi/doc/libffi.texi deleted file mode 100644 index a2b124280..000000000 --- a/third_party/python/Modules/_ctypes/libffi/doc/libffi.texi +++ /dev/null @@ -1,625 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename libffi.info -@settitle libffi -@setchapternewpage off -@c %**end of header - -@c Merge the standard indexes into a single one. -@syncodeindex fn cp -@syncodeindex vr cp -@syncodeindex ky cp -@syncodeindex pg cp -@syncodeindex tp cp - -@include version.texi - -@copying - -This manual is for Libffi, a portable foreign-function interface -library. - -Copyright @copyright{} 2008, 2010, 2011 Red Hat, Inc. - -@quotation -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. A copy of the license is included in the -section entitled ``GNU General Public License''. - -@end quotation -@end copying - -@dircategory Development -@direntry -* libffi: (libffi). Portable foreign-function interface library. -@end direntry - -@titlepage -@title Libffi -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - - -@ifnottex -@node Top -@top libffi - -@insertcopying - -@menu -* Introduction:: What is libffi? -* Using libffi:: How to use libffi. -* Missing Features:: Things libffi can't do. -* Index:: Index. -@end menu - -@end ifnottex - - -@node Introduction -@chapter What is libffi? - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the @dfn{calling -convention}. The calling convention is a set of assumptions made by -the compiler about where function arguments will be found on entry to -a function. A calling convention also specifies where the return -value for a function is found. The calling convention is also -sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}. -@cindex calling convention -@cindex ABI -@cindex Application Binary Interface - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. @samp{Libffi} can be used in such programs to -provide a bridge from the interpreter program to compiled code. - -The @samp{libffi} library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -@acronym{FFI} stands for Foreign Function Interface. A foreign -function interface is the popular name for the interface that allows -code written in one language to call code written in another language. -The @samp{libffi} library really only provides the lowest, machine -dependent layer of a fully featured foreign function interface. A -layer must exist above @samp{libffi} that handles type conversions for -values passed between the two languages. -@cindex FFI -@cindex Foreign Function Interface - - -@node Using libffi -@chapter Using libffi - -@menu -* The Basics:: The basic libffi API. -* Simple Example:: A simple example. -* Types:: libffi type descriptions. -* Multiple ABIs:: Different passing styles on one platform. -* The Closure API:: Writing a generic function. -* Closure Example:: A closure example. -@end menu - - -@node The Basics -@section The Basics - -@samp{Libffi} assumes that you have a pointer to the function you wish -to call and that you know the number and types of arguments to pass -it, as well as the return type of the function. - -The first thing you must do is create an @code{ffi_cif} object that -matches the signature of the function you wish to call. This is a -separate step because it is common to make multiple calls using a -single @code{ffi_cif}. The @dfn{cif} in @code{ffi_cif} stands for -Call InterFace. To prepare a call interface object, use the function -@code{ffi_prep_cif}. -@cindex cif - -@findex ffi_prep_cif -@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) -This initializes @var{cif} according to the given parameters. - -@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what -you want. @ref{Multiple ABIs} for more information. - -@var{nargs} is the number of arguments that this function accepts. - -@var{rtype} is a pointer to an @code{ffi_type} structure that -describes the return type of the function. @xref{Types}. - -@var{argtypes} is a vector of @code{ffi_type} pointers. -@var{argtypes} must have @var{nargs} elements. If @var{nargs} is 0, -this argument is ignored. - -@code{ffi_prep_cif} returns a @code{libffi} status code, of type -@code{ffi_status}. This will be either @code{FFI_OK} if everything -worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type} -objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter -is invalid. -@end defun - -If the function being called is variadic (varargs) then -@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}. - -@findex ffi_prep_cif_var -@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi var{abi}, unsigned int @var{nfixedargs}, unsigned int var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) -This initializes @var{cif} according to the given parameters for -a call to a variadic function. In general it's operation is the -same as for @code{ffi_prep_cif} except that: - -@var{nfixedargs} is the number of fixed arguments, prior to any -variadic arguments. It must be greater than zero. - -@var{ntotalargs} the total number of arguments, including variadic -and fixed arguments. - -Note that, different cif's must be prepped for calls to the same -function when different numbers of arguments are passed. - -Also note that a call to @code{ffi_prep_cif_var} with -@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to -@code{ffi_prep_cif}. - -@end defun - - -To call a function using an initialized @code{ffi_cif}, use the -@code{ffi_call} function: - -@findex ffi_call -@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues}) -This calls the function @var{fn} according to the description given in -@var{cif}. @var{cif} must have already been prepared using -@code{ffi_prep_cif}. - -@var{rvalue} is a pointer to a chunk of memory that will hold the -result of the function call. This must be large enough to hold the -result, no smaller than the system register size (generally 32 or 64 -bits), and must be suitably aligned; it is the caller's responsibility -to ensure this. If @var{cif} declares that the function returns -@code{void} (using @code{ffi_type_void}), then @var{rvalue} is -ignored. - -@var{avalues} is a vector of @code{void *} pointers that point to the -memory locations holding the argument values for a call. If @var{cif} -declares that the function has no arguments (i.e., @var{nargs} was 0), -then @var{avalues} is ignored. Note that argument values may be -modified by the callee (for instance, structs passed by value); the -burden of copying pass-by-value arguments is placed on the caller. -@end defun - - -@node Simple Example -@section Simple Example - -Here is a trivial example that calls @code{puts} a few times. - -@example -#include -#include - -int main() -@{ - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - ffi_arg rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - @{ - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - @} - - return 0; -@} -@end example - - -@node Types -@section Types - -@menu -* Primitive Types:: Built-in types. -* Structures:: Structure types. -* Type Example:: Structure type example. -@end menu - -@node Primitive Types -@subsection Primitive Types - -@code{Libffi} provides a number of built-in type descriptors that can -be used to describe argument and return types: - -@table @code -@item ffi_type_void -@tindex ffi_type_void -The type @code{void}. This cannot be used for argument types, only -for return values. - -@item ffi_type_uint8 -@tindex ffi_type_uint8 -An unsigned, 8-bit integer type. - -@item ffi_type_sint8 -@tindex ffi_type_sint8 -A signed, 8-bit integer type. - -@item ffi_type_uint16 -@tindex ffi_type_uint16 -An unsigned, 16-bit integer type. - -@item ffi_type_sint16 -@tindex ffi_type_sint16 -A signed, 16-bit integer type. - -@item ffi_type_uint32 -@tindex ffi_type_uint32 -An unsigned, 32-bit integer type. - -@item ffi_type_sint32 -@tindex ffi_type_sint32 -A signed, 32-bit integer type. - -@item ffi_type_uint64 -@tindex ffi_type_uint64 -An unsigned, 64-bit integer type. - -@item ffi_type_sint64 -@tindex ffi_type_sint64 -A signed, 64-bit integer type. - -@item ffi_type_float -@tindex ffi_type_float -The C @code{float} type. - -@item ffi_type_double -@tindex ffi_type_double -The C @code{double} type. - -@item ffi_type_uchar -@tindex ffi_type_uchar -The C @code{unsigned char} type. - -@item ffi_type_schar -@tindex ffi_type_schar -The C @code{signed char} type. (Note that there is not an exact -equivalent to the C @code{char} type in @code{libffi}; ordinarily you -should either use @code{ffi_type_schar} or @code{ffi_type_uchar} -depending on whether @code{char} is signed.) - -@item ffi_type_ushort -@tindex ffi_type_ushort -The C @code{unsigned short} type. - -@item ffi_type_sshort -@tindex ffi_type_sshort -The C @code{short} type. - -@item ffi_type_uint -@tindex ffi_type_uint -The C @code{unsigned int} type. - -@item ffi_type_sint -@tindex ffi_type_sint -The C @code{int} type. - -@item ffi_type_ulong -@tindex ffi_type_ulong -The C @code{unsigned long} type. - -@item ffi_type_slong -@tindex ffi_type_slong -The C @code{long} type. - -@item ffi_type_longdouble -@tindex ffi_type_longdouble -On platforms that have a C @code{long double} type, this is defined. -On other platforms, it is not. - -@item ffi_type_pointer -@tindex ffi_type_pointer -A generic @code{void *} pointer. You should use this for all -pointers, regardless of their real type. -@end table - -Each of these is of type @code{ffi_type}, so you must take the address -when passing to @code{ffi_prep_cif}. - - -@node Structures -@subsection Structures - -Although @samp{libffi} has no special support for unions or -bit-fields, it is perfectly happy passing structures back and forth. -You must first describe the structure to @samp{libffi} by creating a -new @code{ffi_type} object for it. - -@tindex ffi_type -@deftp {Data type} ffi_type -The @code{ffi_type} has the following members: -@table @code -@item size_t size -This is set by @code{libffi}; you should initialize it to zero. - -@item unsigned short alignment -This is set by @code{libffi}; you should initialize it to zero. - -@item unsigned short type -For a structure, this should be set to @code{FFI_TYPE_STRUCT}. - -@item ffi_type **elements -This is a @samp{NULL}-terminated array of pointers to @code{ffi_type} -objects. There is one element per field of the struct. -@end table -@end deftp - - -@node Type Example -@subsection Type Example - -The following example initializes a @code{ffi_type} object -representing the @code{tm} struct from Linux's @file{time.h}. - -Here is how the struct is defined: - -@example -struct tm @{ - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; -@}; -@end example - -Here is the corresponding code to describe this struct to -@code{libffi}: - -@example - @{ - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.type = FFI_TYPE_STRUCT; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - @} -@end example - - -@node Multiple ABIs -@section Multiple ABIs - -A given platform may provide multiple different ABIs at once. For -instance, the x86 platform has both @samp{stdcall} and @samp{fastcall} -functions. - -@code{libffi} provides some support for this. However, this is -necessarily platform-specific. - -@c FIXME: document the platforms - -@node The Closure API -@section The Closure API - -@code{libffi} also provides a way to write a generic function -- a -function that can accept and decode any combination of arguments. -This can be useful when writing an interpreter, or to provide wrappers -for arbitrary functions. - -This facility is called the @dfn{closure API}. Closures are not -supported on all platforms; you can check the @code{FFI_CLOSURES} -define to determine whether they are supported on the current -platform. -@cindex closures -@cindex closure API -@findex FFI_CLOSURES - -Because closures work by assembling a tiny function at runtime, they -require special allocation on platforms that have a non-executable -heap. Memory management for closures is handled by a pair of -functions: - -@findex ffi_closure_alloc -@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code}) -Allocate a chunk of memory holding @var{size} bytes. This returns a -pointer to the writable address, and sets *@var{code} to the -corresponding executable address. - -@var{size} should be sufficient to hold a @code{ffi_closure} object. -@end defun - -@findex ffi_closure_free -@defun void ffi_closure_free (void *@var{writable}) -Free memory allocated using @code{ffi_closure_alloc}. The argument is -the writable address that was returned. -@end defun - - -Once you have allocated the memory for a closure, you must construct a -@code{ffi_cif} describing the function call. Finally you can prepare -the closure function: - -@findex ffi_prep_closure_loc -@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc}) -Prepare a closure function. - -@var{closure} is the address of a @code{ffi_closure} object; this is -the writable address returned by @code{ffi_closure_alloc}. - -@var{cif} is the @code{ffi_cif} describing the function parameters. - -@var{user_data} is an arbitrary datum that is passed, uninterpreted, -to your closure function. - -@var{codeloc} is the executable address returned by -@code{ffi_closure_alloc}. - -@var{fun} is the function which will be called when the closure is -invoked. It is called with the arguments: -@table @var -@item cif -The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}. - -@item ret -A pointer to the memory used for the function's return value. -@var{fun} must fill this, unless the function is declared as returning -@code{void}. -@c FIXME: is this NULL for void-returning functions? - -@item args -A vector of pointers to memory holding the arguments to the function. - -@item user_data -The same @var{user_data} that was passed to -@code{ffi_prep_closure_loc}. -@end table - -@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything -went ok, and something else on error. -@c FIXME: what? - -After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc} -to the appropriate pointer-to-function type. -@end defun - -You may see old code referring to @code{ffi_prep_closure}. This -function is deprecated, as it cannot handle the need for separate -writable and executable addresses. - -@node Closure Example -@section Closure Example - -A trivial example that creates a new @code{puts} by binding -@code{fputs} with @code{stdout}. - -@example -#include -#include - -/* Acts like puts with the file given at time of enclosure. */ -void puts_binding(ffi_cif *cif, void *ret, void* args[], - void *stream) -@{ - *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream); -@} - -typedef int (*puts_t)(char *); - -int main() -@{ - ffi_cif cif; - ffi_type *args[1]; - ffi_closure *closure; - - void *bound_puts; - int rc; - - /* Allocate closure and bound_puts */ - closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); - - if (closure) - @{ - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - @{ - /* Initialize the closure, setting stream to stdout */ - if (ffi_prep_closure_loc(closure, &cif, puts_binding, - stdout, bound_puts) == FFI_OK) - @{ - rc = ((puts_t)bound_puts)("Hello World!"); - /* rc now holds the result of the call to fputs */ - @} - @} - @} - - /* Deallocate both closure, and bound_puts */ - ffi_closure_free(closure); - - return 0; -@} - -@end example - - -@node Missing Features -@chapter Missing Features - -@code{libffi} is missing a few features. We welcome patches to add -support for these. - -@itemize @bullet -@item -Variadic closures. - -@item -There is no support for bit fields in structures. - -@item -The closure API is - -@c FIXME: ... - -@item -The ``raw'' API is undocumented. -@c argument promotion? -@c unions? -@c anything else? -@end itemize - -Note that variadic support is very new and tested on a relatively -small number of platforms. - -@node Index -@unnumbered Index - -@printindex cp - -@bye diff --git a/third_party/python/Modules/_ctypes/libffi/doc/stamp-vti b/third_party/python/Modules/_ctypes/libffi/doc/stamp-vti deleted file mode 100644 index 378595332..000000000 --- a/third_party/python/Modules/_ctypes/libffi/doc/stamp-vti +++ /dev/null @@ -1,4 +0,0 @@ -@set UPDATED 25 April 2014 -@set UPDATED-MONTH April 2014 -@set EDITION 3.1 -@set VERSION 3.1 diff --git a/third_party/python/Modules/_ctypes/libffi/doc/version.texi b/third_party/python/Modules/_ctypes/libffi/doc/version.texi deleted file mode 100644 index 378595332..000000000 --- a/third_party/python/Modules/_ctypes/libffi/doc/version.texi +++ /dev/null @@ -1,4 +0,0 @@ -@set UPDATED 25 April 2014 -@set UPDATED-MONTH April 2014 -@set EDITION 3.1 -@set VERSION 3.1 diff --git a/third_party/python/Modules/_ctypes/libffi/fficonfig.h.in b/third_party/python/Modules/_ctypes/libffi/fficonfig.h.in deleted file mode 100644 index cdef91b88..000000000 --- a/third_party/python/Modules/_ctypes/libffi/fficonfig.h.in +++ /dev/null @@ -1,210 +0,0 @@ -/* fficonfig.h.in. Generated from configure.ac by autoheader. */ - -/* Define if building universal (internal helper macro) */ -#undef AC_APPLE_UNIVERSAL_BUILD - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -#undef CRAY_STACKSEG_END - -/* Define to 1 if using `alloca.c'. */ -#undef C_ALLOCA - -/* Define to the flags needed for the .section .eh_frame directive. */ -#undef EH_FRAME_FLAGS - -/* Define this if you want extra debugging. */ -#undef FFI_DEBUG - -/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ -#undef FFI_EXEC_TRAMPOLINE_TABLE - -/* Define this if you want to enable pax emulated trampolines */ -#undef FFI_MMAP_EXEC_EMUTRAMP_PAX - -/* Cannot use malloc on this target, so, we revert to alternative means */ -#undef FFI_MMAP_EXEC_WRIT - -/* Define this if you do not want support for the raw API. */ -#undef FFI_NO_RAW_API - -/* Define this if you do not want support for aggregate types. */ -#undef FFI_NO_STRUCTS - -/* Define to 1 if you have `alloca', as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define to 1 if you have and it should be used (not on Ultrix). - */ -#undef HAVE_ALLOCA_H - -/* Define if your assembler supports .ascii. */ -#undef HAVE_AS_ASCII_PSEUDO_OP - -/* Define if your assembler supports .cfi_* directives. */ -#undef HAVE_AS_CFI_PSEUDO_OP - -/* Define if your assembler supports .register. */ -#undef HAVE_AS_REGISTER_PSEUDO_OP - -/* Define if your assembler and linker support unaligned PC relative relocs. - */ -#undef HAVE_AS_SPARC_UA_PCREL - -/* Define if your assembler supports .string. */ -#undef HAVE_AS_STRING_PSEUDO_OP - -/* Define if your assembler supports unwind section type. */ -#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE - -/* Define if your assembler supports PC relative relocs. */ -#undef HAVE_AS_X86_PCREL - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define if __attribute__((visibility("hidden"))) is supported. */ -#undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define if you have the long double type and it is bigger than a double */ -#undef HAVE_LONG_DOUBLE - -/* Define if you support more than one size of the long double type */ -#undef HAVE_LONG_DOUBLE_VARIANT - -/* Define to 1 if you have the `memcpy' function. */ -#undef HAVE_MEMCPY - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `mmap' function. */ -#undef HAVE_MMAP - -/* Define if mmap with MAP_ANON(YMOUS) works. */ -#undef HAVE_MMAP_ANON - -/* Define if mmap of /dev/zero works. */ -#undef HAVE_MMAP_DEV_ZERO - -/* Define if read-only mmap of a plain file works. */ -#undef HAVE_MMAP_FILE - -/* Define if .eh_frame sections should be read-only. */ -#undef HAVE_RO_EH_FRAME - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_MMAN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#undef LT_OBJDIR - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* The size of `double', as computed by sizeof. */ -#undef SIZEOF_DOUBLE - -/* The size of `long double', as computed by sizeof. */ -#undef SIZEOF_LONG_DOUBLE - -/* The size of `size_t', as computed by sizeof. */ -#undef SIZEOF_SIZE_T - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -#undef STACK_DIRECTION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if symbols are underscored. */ -#undef SYMBOL_UNDERSCORE - -/* Define this if you are using Purify and want to suppress spurious messages. - */ -#undef USING_PURIFY - -/* Version number of package */ -#undef VERSION - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -# undef WORDS_BIGENDIAN -# endif -#endif - -/* Define to `unsigned int' if does not define. */ -#undef size_t - - -#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -#ifdef LIBFFI_ASM -#define FFI_HIDDEN(name) .hidden name -#else -#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) -#endif -#else -#ifdef LIBFFI_ASM -#define FFI_HIDDEN(name) -#else -#define FFI_HIDDEN -#endif -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/fficonfig.py.in b/third_party/python/Modules/_ctypes/libffi/fficonfig.py.in deleted file mode 100644 index d10249866..000000000 --- a/third_party/python/Modules/_ctypes/libffi/fficonfig.py.in +++ /dev/null @@ -1,35 +0,0 @@ -ffi_sources = """ -src/prep_cif.c -src/closures.c -""".split() - -ffi_platforms = { - 'MIPS_IRIX': ['src/mips/ffi.c', 'src/mips/o32.S', 'src/mips/n32.S'], - 'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S'], - 'X86': ['src/x86/ffi.c', 'src/x86/sysv.S', 'src/x86/win32.S'], - 'X86_FREEBSD': ['src/x86/ffi.c', 'src/x86/freebsd.S'], - 'X86_WIN32': ['src/x86/ffi.c', 'src/x86/win32.S'], - 'SPARC': ['src/sparc/ffi.c', 'src/sparc/v8.S', 'src/sparc/v9.S'], - 'ALPHA': ['src/alpha/ffi.c', 'src/alpha/osf.S'], - 'IA64': ['src/ia64/ffi.c', 'src/ia64/unix.S'], - 'M32R': ['src/m32r/sysv.S', 'src/m32r/ffi.c'], - 'M68K': ['src/m68k/ffi.c', 'src/m68k/sysv.S'], - 'POWERPC': ['src/powerpc/ffi.c', 'src/powerpc/ffi_sysv.c', 'src/powerpc/ffi_linux64.c', 'src/powerpc/sysv.S', 'src/powerpc/ppc_closure.S', 'src/powerpc/linux64.S', 'src/powerpc/linux64_closure.S'], - 'POWERPC_AIX': ['src/powerpc/ffi_darwin.c', 'src/powerpc/aix.S', 'src/powerpc/aix_closure.S'], - 'POWERPC_FREEBSD': ['src/powerpc/ffi.c', 'src/powerpc/sysv.S', 'src/powerpc/ppc_closure.S'], - 'AARCH64': ['src/aarch64/sysv.S', 'src/aarch64/ffi.c'], - 'ARM': ['src/arm/sysv.S', 'src/arm/ffi.c'], - 'LIBFFI_CRIS': ['src/cris/sysv.S', 'src/cris/ffi.c'], - 'FRV': ['src/frv/eabi.S', 'src/frv/ffi.c'], - 'S390': ['src/s390/sysv.S', 'src/s390/ffi.c'], - 'X86_64': ['src/x86/ffi64.c', 'src/x86/unix64.S', 'src/x86/ffi.c', 'src/x86/sysv.S'], - 'SH': ['src/sh/sysv.S', 'src/sh/ffi.c'], - 'SH64': ['src/sh64/sysv.S', 'src/sh64/ffi.c'], - 'PA': ['src/pa/linux.S', 'src/pa/ffi.c'], - 'PA_LINUX': ['src/pa/linux.S', 'src/pa/ffi.c'], - 'PA_HPUX': ['src/pa/hpux32.S', 'src/pa/ffi.c'], -} - -ffi_sources += ffi_platforms['@TARGET@'] - -ffi_cflags = '@CFLAGS@' diff --git a/third_party/python/Modules/_ctypes/libffi/generate-darwin-source-and-headers.py b/third_party/python/Modules/_ctypes/libffi/generate-darwin-source-and-headers.py deleted file mode 100644 index 964e861d4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/generate-darwin-source-and-headers.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python -import subprocess -import os -import errno -import collections -import glob -import argparse - -class Platform(object): - pass - -class simulator_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'i386' - triple = 'i386-apple-darwin11' - version_min = '-miphoneos-version-min=5.1.1' - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['darwin.S', 'win32.S', 'ffi.c'] - - -class simulator64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'x86_64' - triple = 'x86_64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['darwin64.S', 'ffi64.c'] - - -class device_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'armv7' - triple = 'arm-apple-darwin11' - version_min = '-miphoneos-version-min=5.1.1' - - prefix = "#ifdef __arm__\n\n" - suffix = "\n\n#endif" - src_dir = 'arm' - src_files = ['sysv.S', 'trampoline.S', 'ffi.c'] - - -class device64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'arm64' - triple = 'aarch64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __arm64__\n\n" - suffix = "\n\n#endif" - src_dir = 'aarch64' - src_files = ['sysv.S', 'ffi.c'] - - -class desktop32_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'i386' - triple = 'i386-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - src_dir = 'x86' - src_files = ['darwin.S', 'win32.S', 'ffi.c'] - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - - -class desktop64_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'x86_64' - triple = 'x86_64-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['darwin64.S', 'ffi64.c'] - - -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno == errno.EEXIST: - pass - else: - raise - - -def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): - mkdir_p(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]) - - with open(os.path.join(src_dir, filename)) as in_file: - with open(os.path.join(dst_dir, out_filename), 'w') as out_file: - if prefix: - out_file.write(prefix) - - out_file.write(in_file.read()) - - if suffix: - out_file.write(suffix) - - -def list_files(src_dir, pattern=None, filelist=None): - if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern)) - for file in filelist: - yield os.path.basename(file) - - -def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None): - for filename in list_files(src_dir, pattern=pattern, filelist=filelist): - move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix) - - -def copy_src_platform_files(platform): - src_dir = os.path.join('src', platform.src_dir) - dst_dir = os.path.join(platform.directory, 'src', platform.src_dir) - copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix) - - -def build_target(platform, platform_headers): - def xcrun_cmd(cmd): - return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch) - - tag='%s-%s' % (platform.sdk, platform.arch) - build_dir = 'build_%s' % tag - mkdir_p(build_dir) - env = dict(CC=xcrun_cmd('clang'), - LD=xcrun_cmd('ld'), - CFLAGS='%s' % (platform.version_min)) - working_dir = os.getcwd() - try: - os.chdir(build_dir) - subprocess.check_call(['../configure', '-host', platform.triple], env=env) - finally: - os.chdir(working_dir) - - for src_dir in [build_dir, os.path.join(build_dir, 'include')]: - copy_files(src_dir, - os.path.join(platform.directory, 'include'), - pattern='*.h', - file_suffix=platform.arch, - prefix=platform.prefix, - suffix=platform.suffix) - - for filename in list_files(src_dir, pattern='*.h'): - platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix)) - - -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() - - -def generate_source_and_headers(generate_osx=True, generate_ios=True): - copy_files('src', 'darwin_common/src', pattern='*.c') - copy_files('include', 'darwin_common/include', pattern='*.h') - - if generate_ios: - make_tramp() - copy_src_platform_files(simulator_platform) - copy_src_platform_files(simulator64_platform) - copy_src_platform_files(device_platform) - copy_src_platform_files(device64_platform) - if generate_osx: - copy_src_platform_files(desktop32_platform) - copy_src_platform_files(desktop64_platform) - - platform_headers = collections.defaultdict(set) - - if generate_ios: - build_target(simulator_platform, platform_headers) - build_target(simulator64_platform, platform_headers) - build_target(device_platform, platform_headers) - build_target(device64_platform, platform_headers) - if generate_osx: - build_target(desktop32_platform, platform_headers) - build_target(desktop64_platform, platform_headers) - - mkdir_p('darwin_common/include') - for header_name, tag_tuples in platform_headers.iteritems(): - basename, suffix = os.path.splitext(header_name) - with open(os.path.join('darwin_common/include', header_name), 'w') as header: - for tag_tuple in tag_tuples: - header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2])) - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--only-ios', action='store_true', default=False) - parser.add_argument('--only-osx', action='store_true', default=False) - args = parser.parse_args() - - generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx) diff --git a/third_party/python/Modules/_ctypes/libffi/include/Makefile.am b/third_party/python/Modules/_ctypes/libffi/include/Makefile.am deleted file mode 100644 index fd2802497..000000000 --- a/third_party/python/Modules/_ctypes/libffi/include/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -DISTCLEANFILES=ffitarget.h -EXTRA_DIST=ffi.h.in ffi_common.h - -includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include -nodist_includes_HEADERS = ffi.h ffitarget.h diff --git a/third_party/python/Modules/_ctypes/libffi/include/Makefile.in b/third_party/python/Modules/_ctypes/libffi/include/Makefile.in deleted file mode 100644 index 9d747e80e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/include/Makefile.in +++ /dev/null @@ -1,587 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/ffi.h.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/m4/ax_compiler_vendor.m4 \ - $(top_srcdir)/m4/ax_configure_args.m4 \ - $(top_srcdir)/m4/ax_enable_builddir.m4 \ - $(top_srcdir)/m4/ax_gcc_archflag.m4 \ - $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = ffi.h ffitarget.h -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(includesdir)" -HEADERS = $(nodist_includes_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AM_LTLDFLAGS = @AM_LTLDFLAGS@ -AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ -HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PRTDIAG = @PRTDIAG@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TARGET = @TARGET@ -TARGETDIR = @TARGETDIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -ax_enable_builddir_sed = @ax_enable_builddir_sed@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sys_symbol_underscore = @sys_symbol_underscore@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -toolexecdir = @toolexecdir@ -toolexeclibdir = @toolexeclibdir@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = foreign -DISTCLEANFILES = ffitarget.h -EXTRA_DIST = ffi.h.in ffi_common.h -includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include -nodist_includes_HEADERS = ffi.h ffitarget.h -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-nodist_includesHEADERS: $(nodist_includes_HEADERS) - @$(NORMAL_INSTALL) - @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(includesdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(includesdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ - done - -uninstall-nodist_includesHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(includesdir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(includesdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-nodist_includesHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-nodist_includesHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool cscopelist-am ctags ctags-am distclean \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man \ - install-nodist_includesHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-nodist_includesHEADERS - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/third_party/python/Modules/_ctypes/libffi/include/ffi.h.in b/third_party/python/Modules/_ctypes/libffi/include/ffi.h.in deleted file mode 100644 index 93c776fbb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/include/ffi.h.in +++ /dev/null @@ -1,476 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi @VERSION@ - Copyright (c) 2011 Anthony Green - - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the ``Software''), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - The basic API is described in the README file. - - The raw API is designed to bypass some of the argument packing - and unpacking on architectures for which it can be avoided. - - The closure API allows interpreted functions to be packaged up - inside a C function pointer, so that they can be called as C functions, - with no understanding on the client side that they are interpreted. - It can also be used in other cases in which it is necessary to package - up a user specified parameter and a function pointer as a single - function pointer. - - The closure API must be implemented in order to get its functionality, - e.g. for use by gij. Routines are provided to emulate the raw API - if the underlying platform doesn't allow faster implementation. - - More details on the raw and cloure API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -#ifndef @TARGET@ -#define @TARGET@ -#endif - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#ifdef _MSC_VER -#define __attribute__(X) -#endif - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ - -#define FFI_64_BIT_MAX 9223372036854775807 - -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif /* _AIX52 or newer */ -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -# ifndef __PPC64__ -# if defined (__IBMC__) || defined (__IBMCPP__) -# define FFI_LONG_LONG_MAX LONGLONG_MAX -# endif -# endif /* __PPC64__ */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif -# endif -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t */ -/* can hold a pointer. */ - -typedef struct _ffi_type -{ - size_t size; - unsigned short alignment; - unsigned short type; - struct _ffi_type **elements; -} ffi_type; - -#ifndef LIBFFI_HIDE_BASIC_TYPES -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else - #error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else - #error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else - #error "int size not supported" -#endif - -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX - #error "no 64-bit data type supported" -# endif -#elif LONG_MAX != FFI_64_BIT_MAX - #error "long size not supported" -#endif - -#if LONG_MAX == 2147483647 -# define ffi_type_ulong ffi_type_uint32 -# define ffi_type_slong ffi_type_sint32 -#elif LONG_MAX == FFI_64_BIT_MAX -# define ffi_type_ulong ffi_type_uint64 -# define ffi_type_slong ffi_type_sint64 -#else - #error "long size not supported" -#endif - -/* Need minimal decorations for DLLs to works on Windows. */ -/* GCC has autoimport and autoexport. Rely on Libtool to */ -/* help MSVC export from a DLL, but always declare data */ -/* to be imported for MSVC clients. This costs an extra */ -/* indirection for MSVC clients using the static version */ -/* of the library, but don't worry about that. Besides, */ -/* as a workaround, they can define FFI_BUILDING if they */ -/* *know* they are going to link with the static library. */ -#if defined _MSC_VER && !defined FFI_BUILDING -#define FFI_EXTERN extern __declspec(dllimport) -#else -#define FFI_EXTERN extern -#endif - -/* These are defined in types.c */ -FFI_EXTERN ffi_type ffi_type_void; -FFI_EXTERN ffi_type ffi_type_uint8; -FFI_EXTERN ffi_type ffi_type_sint8; -FFI_EXTERN ffi_type ffi_type_uint16; -FFI_EXTERN ffi_type ffi_type_sint16; -FFI_EXTERN ffi_type ffi_type_uint32; -FFI_EXTERN ffi_type ffi_type_sint32; -FFI_EXTERN ffi_type ffi_type_uint64; -FFI_EXTERN ffi_type ffi_type_sint64; -FFI_EXTERN ffi_type ffi_type_float; -FFI_EXTERN ffi_type ffi_type_double; -FFI_EXTERN ffi_type ffi_type_pointer; - -#if @HAVE_LONG_DOUBLE@ -FFI_EXTERN ffi_type ffi_type_longdouble; -#else -#define ffi_type_longdouble ffi_type_double -#endif -#endif /* LIBFFI_HIDE_BASIC_TYPES */ - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef unsigned FFI_TYPE; - -typedef struct { - ffi_abi abi; - unsigned nargs; - ffi_type **arg_types; - ffi_type *rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -#if HAVE_LONG_DOUBLE_VARIANT -/* Used to adjust size/alignment of ffi types. */ -void ffi_prep_types (ffi_abi abi); -# endif - -/* Used internally, but overridden by some architectures */ -ffi_status ffi_prep_cif_core(ffi_cif *cif, - ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifndef FFI_SIZEOF_ARG -# if LONG_MAX == 2147483647 -# define FFI_SIZEOF_ARG 4 -# elif LONG_MAX == FFI_64_BIT_MAX -# define FFI_SIZEOF_ARG 8 -# endif -#endif - -#ifndef FFI_SIZEOF_JAVA_RAW -# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -/* This is a special case for mips64/n32 ABI (and perhaps others) where - sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -typedef union { - signed int sint; - unsigned int uint; - float flt; - char data[FFI_SIZEOF_JAVA_RAW]; - void* ptr; -} ffi_java_raw; -#else -typedef ffi_raw ffi_java_raw; -#endif - - -void ffi_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_raw *avalue); - -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); - -/* This is analogous to the raw API, except it uses Java parameter */ -/* packing, even on 64-bit machines. I.e. on 64-bit machines */ -/* longs and doubles are followed by an empty 64-bit word. */ - -void ffi_java_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_java_raw *avalue); - -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -#ifdef _MSC_VER -__declspec(align(8)) -#endif -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -#ifdef __GNUC__ -} ffi_closure __attribute__((aligned (8))); -#else -} ffi_closure; -# ifdef __sgi -# pragma pack 0 -# endif -#endif - -void *ffi_closure_alloc (size_t size, void **code); -void ffi_closure_free (void *); - -ffi_status -ffi_prep_closure (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data); - -ffi_status -ffi_prep_closure_loc (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void*codeloc); - -#ifdef __sgi -# pragma pack 8 -#endif -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* if this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void *user_data; - -} ffi_raw_closure; - -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* if this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); - void *user_data; - -} ffi_java_raw_closure; - -ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc); - -ffi_status -ffi_prep_java_raw_closure (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); - -ffi_status -ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data, - void *codeloc); - -#endif /* FFI_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -ffi_status ffi_prep_cif(ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, - ffi_type **atypes); - -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue); - -/* Useful for eliminating compiler warnings */ -#define FFI_FN(f) ((void (*)(void))f) - -/* ---- Definitions shared with assembly code ---------------------------- */ - -#endif - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 -#if @HAVE_LONG_DOUBLE@ -#define FFI_TYPE_LONGDOUBLE 4 -#else -#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 - -/* This should always refer to the last type code (for sanity checks) */ -#define FFI_TYPE_LAST FFI_TYPE_POINTER - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/include/ffi_common.h b/third_party/python/Modules/_ctypes/libffi/include/ffi_common.h deleted file mode 100644 index 37f5a9e92..000000000 --- a/third_party/python/Modules/_ctypes/libffi/include/ffi_common.h +++ /dev/null @@ -1,132 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green - Copyright (C) 2007 Free Software Foundation, Inc - Copyright (c) 1996 Red Hat, Inc. - - Common internal definitions and macros. Only necessary for building - libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_COMMON_H -#define FFI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Do not move this. Some versions of AIX are very picky about where - this is positioned. */ -#ifdef __GNUC__ -# if HAVE_ALLOCA_H -# include -# else - /* mingw64 defines this already in malloc.h. */ -# ifndef alloca -# define alloca __builtin_alloca -# endif -# endif -# define MAYBE_UNUSED __attribute__((__unused__)) -#else -# define MAYBE_UNUSED -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX -# pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -# ifdef _MSC_VER -# define alloca _alloca -# else -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -/* Check for the existence of memcpy. */ -#if STDC_HEADERS -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - -#if defined(FFI_DEBUG) -#include -#endif - -#ifdef FFI_DEBUG -void ffi_assert(char *expr, char *file, int line); -void ffi_stop_here(void); -void ffi_type_test(ffi_type *a, char *file, int line); - -#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) -#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) -#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) -#else -#define FFI_ASSERT(x) -#define FFI_ASSERT_AT(x, f, l) -#define FFI_ASSERT_VALID_TYPE(x) -#endif - -#define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) -#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a) - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif); -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, unsigned int ntotalargs); - -/* Extended cif, used in callback from assembly routine */ -typedef struct -{ - ffi_cif *cif; - void *rvalue; - void **avalue; -} extended_cif; - -/* Terse sized type definitions. */ -#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) -typedef unsigned char UINT8; -typedef signed char SINT8; -typedef unsigned short UINT16; -typedef signed short SINT16; -typedef unsigned int UINT32; -typedef signed int SINT32; -# ifdef _MSC_VER -typedef unsigned __int64 UINT64; -typedef signed __int64 SINT64; -# else -# include -typedef uint64_t UINT64; -typedef int64_t SINT64; -# endif -#else -typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); -typedef signed int SINT8 __attribute__((__mode__(__QI__))); -typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); -typedef signed int SINT16 __attribute__((__mode__(__HI__))); -typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); -typedef signed int SINT32 __attribute__((__mode__(__SI__))); -typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); -typedef signed int SINT64 __attribute__((__mode__(__DI__))); -#endif - -typedef float FLOAT32; - -#ifndef __GNUC__ -#define __builtin_expect(x, expected_value) (x) -#endif -#define LIKELY(x) __builtin_expect(!!(x),1) -#define UNLIKELY(x) __builtin_expect((x)!=0,0) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/install-sh b/third_party/python/Modules/_ctypes/libffi/install-sh deleted file mode 100755 index 377bb8687..000000000 --- a/third_party/python/Modules/_ctypes/libffi/install-sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2011-11-20.07; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# 'make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call 'install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for 'test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/libffi.pc.in b/third_party/python/Modules/_ctypes/libffi/libffi.pc.in deleted file mode 100644 index edf6fde5e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/libffi.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -toolexeclibdir=@toolexeclibdir@ -includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include - -Name: @PACKAGE_NAME@ -Description: Library supporting Foreign Function Interfaces -Version: @PACKAGE_VERSION@ -Libs: -L${toolexeclibdir} -lffi -Cflags: -I${includedir} diff --git a/third_party/python/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj b/third_party/python/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj deleted file mode 100644 index 1cf396ffa..000000000 --- a/third_party/python/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj +++ /dev/null @@ -1,637 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; }; - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; }; - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; - DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */; }; - DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */; }; - DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7174187F1D9B00A76262 /* darwin_i386.S */; }; - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; - DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7176187F1D9B00A76262 /* ffi_i386.c */; }; - DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7182187F1DA100A76262 /* ffi_i386.h */; }; - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; - DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7184187F1DA100A76262 /* fficonfig_i386.h */; }; - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; }; - DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7186187F1DA100A76262 /* ffitarget_i386.h */; }; - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; - DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */; }; - DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718B187F1DA100A76262 /* darwin_i386.S */; }; - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; - DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718D187F1DA100A76262 /* ffi_i386.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - DB13B1641849DF1E0010F42D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 8; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; - DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; - DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; - DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; - DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; - DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = ""; }; - DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = ""; }; - DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = ""; }; - DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = ""; }; - DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = ""; }; - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = ""; }; - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = ""; }; - DBFA7160187F1D9B00A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = ""; }; - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = ""; }; - DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = ""; }; - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = ""; }; - DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = ""; }; - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = ""; }; - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = ""; }; - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = ""; }; - DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = trampoline_armv7.S; sourceTree = ""; }; - DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = ""; }; - DBFA7174187F1D9B00A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = ""; }; - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - DBFA7176187F1D9B00A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; - DBFA7182187F1DA100A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7184187F1DA100A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7186187F1DA100A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = ""; }; - DBFA718B187F1DA100A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = ""; }; - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - DBFA718D187F1DA100A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXGroup section */ - DB13B15B1849DEB70010F42D = { - isa = PBXGroup; - children = ( - DBFA713C187F1D8600A76262 /* darwin_common */, - DBFA715C187F1D9B00A76262 /* darwin_ios */, - DBFA7180187F1DA100A76262 /* darwin_osx */, - DB13B1671849DF1E0010F42D /* Products */, - ); - sourceTree = ""; - }; - DB13B1671849DF1E0010F42D /* Products */ = { - isa = PBXGroup; - children = ( - DB13B1661849DF1E0010F42D /* libffi.a */, - DB13B1911849DF510010F42D /* ffi.dylib */, - ); - name = Products; - sourceTree = ""; - }; - DBFA713C187F1D8600A76262 /* darwin_common */ = { - isa = PBXGroup; - children = ( - DBFA713D187F1D8600A76262 /* include */, - DBFA7142187F1D8600A76262 /* src */, - ); - path = "darwin_common"; - sourceTree = ""; - }; - DBFA713D187F1D8600A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA713E187F1D8600A76262 /* ffi.h */, - DBFA713F187F1D8600A76262 /* ffi_common.h */, - DBFA7140187F1D8600A76262 /* fficonfig.h */, - DBFA7141187F1D8600A76262 /* ffitarget.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7142187F1D8600A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7143187F1D8600A76262 /* closures.c */, - DBFA7145187F1D8600A76262 /* dlmalloc.c */, - DBFA7147187F1D8600A76262 /* prep_cif.c */, - DBFA7148187F1D8600A76262 /* raw_api.c */, - DBFA7149187F1D8600A76262 /* types.c */, - ); - path = src; - sourceTree = ""; - }; - DBFA715C187F1D9B00A76262 /* darwin_ios */ = { - isa = PBXGroup; - children = ( - DBFA715D187F1D9B00A76262 /* include */, - DBFA716A187F1D9B00A76262 /* src */, - ); - path = "darwin_ios"; - sourceTree = ""; - }; - DBFA715D187F1D9B00A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */, - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */, - DBFA7160187F1D9B00A76262 /* ffi_i386.h */, - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */, - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */, - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */, - DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */, - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */, - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */, - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */, - DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */, - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA716A187F1D9B00A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA716B187F1D9B00A76262 /* aarch64 */, - DBFA716E187F1D9B00A76262 /* arm */, - DBFA7172187F1D9B00A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA716B187F1D9B00A76262 /* aarch64 */ = { - isa = PBXGroup; - children = ( - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */, - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */, - ); - path = aarch64; - sourceTree = ""; - }; - DBFA716E187F1D9B00A76262 /* arm */ = { - isa = PBXGroup; - children = ( - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */, - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */, - DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */, - ); - path = arm; - sourceTree = ""; - }; - DBFA7172187F1D9B00A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */, - DBFA7174187F1D9B00A76262 /* darwin_i386.S */, - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */, - DBFA7176187F1D9B00A76262 /* ffi_i386.c */, - ); - path = x86; - sourceTree = ""; - }; - DBFA7180187F1DA100A76262 /* darwin_osx */ = { - isa = PBXGroup; - children = ( - DBFA7181187F1DA100A76262 /* include */, - DBFA7188187F1DA100A76262 /* src */, - ); - path = "darwin_osx"; - sourceTree = ""; - }; - DBFA7181187F1DA100A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA7182187F1DA100A76262 /* ffi_i386.h */, - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */, - DBFA7184187F1DA100A76262 /* fficonfig_i386.h */, - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */, - DBFA7186187F1DA100A76262 /* ffitarget_i386.h */, - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7188187F1DA100A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7189187F1DA100A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA7189187F1DA100A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */, - DBFA718B187F1DA100A76262 /* darwin_i386.S */, - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */, - DBFA718D187F1DA100A76262 /* ffi_i386.c */, - ); - path = x86; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - DB13B18F1849DF510010F42D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */, - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */, - DBFA714A187F1D8600A76262 /* ffi.h in Headers */, - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */, - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */, - DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */, - DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */, - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */, - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */, - DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - DB13B1651849DF1E0010F42D /* libffi-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */; - buildPhases = ( - DB13B3051849E01C0010F42D /* ShellScript */, - DB13B1621849DF1E0010F42D /* Sources */, - DB13B1641849DF1E0010F42D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-iOS"; - productName = ffi; - productReference = DB13B1661849DF1E0010F42D /* libffi.a */; - productType = "com.apple.product-type.library.static"; - }; - DB13B1901849DF510010F42D /* libffi-Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */; - buildPhases = ( - DB13B3061849E0490010F42D /* ShellScript */, - DB13B18D1849DF510010F42D /* Sources */, - DB13B18F1849DF510010F42D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-Mac"; - productName = ffi; - productReference = DB13B1911849DF510010F42D /* ffi.dylib */; - productType = "com.apple.product-type.library.dynamic"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DB13B15C1849DEB70010F42D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0510; - }; - buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = DB13B15B1849DEB70010F42D; - productRefGroup = DB13B1671849DF1E0010F42D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DB13B1651849DF1E0010F42D /* libffi-iOS */, - DB13B1901849DF510010F42D /* libffi-Mac */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXShellScriptBuildPhase section */ - DB13B3051849E01C0010F42D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-ios"; - }; - DB13B3061849E0490010F42D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-osx"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - DB13B1621849DF1E0010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */, - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */, - DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */, - DBFA714E187F1D8600A76262 /* closures.c in Sources */, - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */, - DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */, - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */, - DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */, - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */, - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */, - DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */, - DBFA715A187F1D8600A76262 /* types.c in Sources */, - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DB13B18D1849DF510010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */, - DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */, - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */, - DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */, - DBFA715B187F1D8600A76262 /* types.c in Sources */, - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */, - DBFA714F187F1D8600A76262 /* closures.c in Sources */, - DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - DB13B1601849DEB70010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_common/include", - ); - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - DB13B1611849DEB70010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_common/include", - ); - }; - name = Release; - }; - DB13B1871849DF1E0010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/ffi.dst; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_ios/include", - ); - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - "IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - DB13B1881849DF1E0010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DSTROOT = /tmp/ffi.dst; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_ios/include", - ); - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - "IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DB13B1B11849DF520010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_osx/include", - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Debug; - }; - DB13B1B21849DF520010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "darwin_osx/include", - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1601849DEB70010F42D /* Debug */, - DB13B1611849DEB70010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1871849DF1E0010F42D /* Debug */, - DB13B1881849DF1E0010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1B11849DF520010F42D /* Debug */, - DB13B1B21849DF520010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DB13B15C1849DEB70010F42D /* Project object */; -} diff --git a/third_party/python/Modules/_ctypes/libffi/libtool-ldflags b/third_party/python/Modules/_ctypes/libffi/libtool-ldflags deleted file mode 100755 index e32e37bf1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/libtool-ldflags +++ /dev/null @@ -1,106 +0,0 @@ -#! /bin/sh - -# Script to translate LDFLAGS into a form suitable for use with libtool. - -# Copyright (C) 2005 Free Software Foundation, Inc. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. - -# Contributed by CodeSourcery, LLC. - -# This script is designed to be used from a Makefile that uses libtool -# to build libraries as follows: -# -# LTLDFLAGS = $(shell libtool-ldflags $(LDFLAGS)) -# -# Then, use (LTLDFLAGS) in place of $(LDFLAGS) in your link line. - -# The output of the script. This string is built up as we process the -# arguments. -result= -prev_arg= - -for arg -do - case $arg in - -f*|--*) - # Libtool does not ascribe any special meaning options - # that begin with -f or with a double-dash. So, it will - # think these options are linker options, and prefix them - # with "-Wl,". Then, the compiler driver will ignore the - # options. So, we prefix these options with -Xcompiler to - # make clear to libtool that they are in fact compiler - # options. - case $prev_arg in - -Xpreprocessor|-Xcompiler|-Xlinker) - # This option is already prefixed; don't prefix it again. - ;; - *) - result="$result -Xcompiler" - ;; - esac - ;; - *) - # We do not want to add -Xcompiler to other options because - # that would prevent libtool itself from recognizing them. - ;; - esac - prev_arg=$arg - - # If $(LDFLAGS) is (say): - # a "b'c d" e - # then the user expects that: - # $(LD) $(LDFLAGS) - # will pass three arguments to $(LD): - # 1) a - # 2) b'c d - # 3) e - # We must ensure, therefore, that the arguments are appropriately - # quoted so that using: - # libtool --mode=link ... $(LTLDFLAGS) - # will result in the same number of arguments being passed to - # libtool. In other words, when this script was invoked, the shell - # removed one level of quoting, present in $(LDFLAGS); we have to put - # it back. - - # Quote any embedded single quotes. - case $arg in - *"'"*) - # The following command creates the script: - # 1s,^X,,;s|'|'"'"'|g - # which removes a leading X, and then quotes and embedded single - # quotes. - sed_script="1s,^X,,;s|'|'\"'\"'|g" - # Add a leading "X" so that if $arg starts with a dash, - # the echo command will not try to interpret the argument - # as a command-line option. - arg="X$arg" - # Generate the quoted string. - quoted_arg=`echo "$arg" | sed -e "$sed_script"` - ;; - *) - quoted_arg=$arg - ;; - esac - # Surround the entire argument with single quotes. - quoted_arg="'"$quoted_arg"'" - - # Add it to the string. - result="$result $quoted_arg" -done - -# Output the string we have built up. -echo "$result" diff --git a/third_party/python/Modules/_ctypes/libffi/libtool-version b/third_party/python/Modules/_ctypes/libffi/libtool-version deleted file mode 100644 index d4f501c4d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/libtool-version +++ /dev/null @@ -1,29 +0,0 @@ -# This file is used to maintain libtool version info for libffi. See -# the libtool manual to understand the meaning of the fields. This is -# a separate file so that version updates don't involve re-running -# automake. -# -# Here are a set of rules to help you update your library version -# information: -# -# 1. Start with version information of `0:0:0' for each libtool library. -# -# 2. Update the version information only immediately before a public -# release of your software. More frequent updates are unnecessary, -# and only guarantee that the current interface number gets larger -# faster. -# -# 3. If the library source code has changed at all since the last -# update, then increment revision (`c:r:a' becomes `c:r+1:a'). -# -# 4. If any interfaces have been added, removed, or changed since the -# last update, increment current, and set revision to 0. -# -# 5. If any interfaces have been added since the last public release, -# then increment age. -# -# 6. If any interfaces have been removed since the last public -# release, then set age to 0. -# -# CURRENT:REVISION:AGE -6:2:0 diff --git a/third_party/python/Modules/_ctypes/libffi/ltmain.sh b/third_party/python/Modules/_ctypes/libffi/ltmain.sh deleted file mode 100644 index 059598045..000000000 --- a/third_party/python/Modules/_ctypes/libffi/ltmain.sh +++ /dev/null @@ -1,10932 +0,0 @@ -#! /bin/sh - -# libtool (GNU libtool) 2.4.2.418 -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - - -PROGRAM=libtool -PACKAGE=libtool -VERSION=2.4.2.418 -package_revision=2.4.2.418 - - -## ------ ## -## Usage. ## -## ------ ## - -# Run './libtool --help' for help with using this script from the -# command line. - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# After configure completes, it has a better idea of some of the -# shell tools we need than the defaults used by the functions shared -# with bootstrap, so set those here where they can still be over- -# ridden by the user, but otherwise take precedence. - -: ${AUTOCONF="autoconf"} -: ${AUTOMAKE="automake"} - - -## -------------------------- ## -## Source external libraries. ## -## -------------------------- ## - -# Much of our low-level functionality needs to be sourced from external -# libraries, which are installed to $pkgauxdir. - -# Set a version string for this script. -scriptversion=2013-08-23.20; # UTC - -# General shell script boiler plate, and helper functions. -# Written by Gary V. Vaughan, 2004 - -# Copyright (C) 2004-2013 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. - -# As a special exception to the GNU General Public License, if you distribute -# this file as part of a program or library that is built using GNU Libtool, -# you may include this file under the same distribution terms that you use -# for the rest of that program. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Please report bugs or propose patches to gary@gnu.org. - - -## ------ ## -## Usage. ## -## ------ ## - -# Evaluate this file near the top of your script to gain access to -# the functions and variables defined here: -# -# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh -# -# If you need to override any of the default environment variable -# settings, do that before evaluating this file. - - -## -------------------- ## -## Shell normalisation. ## -## -------------------- ## - -# Some shells need a little help to be as Bourne compatible as possible. -# Before doing anything else, make sure all that help has been provided! - -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac -fi - -# NLS nuisances: We save the old values in case they are required later. -_G_user_locale= -_G_safe_locale= -for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test set = \"\${$_G_var+set}\"; then - save_$_G_var=\$$_G_var - $_G_var=C - export $_G_var - _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" - _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" - fi" -done - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Make sure IFS has a sensible default -sp=' ' -nl=' -' -IFS="$sp $nl" - -# There are still modern systems that have problems with 'echo' mis- -# handling backslashes, among others, so make sure $bs_echo is set to a -# command that correctly interprets backslashes. -# (this code from Autoconf 2.68) - -# Printing a long string crashes Solaris 7 /usr/bin/printf. -bs_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -bs_echo=$bs_echo$bs_echo$bs_echo$bs_echo$bs_echo -bs_echo=$bs_echo$bs_echo$bs_echo$bs_echo$bs_echo$bs_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $bs_echo`" = "X$bs_echo") 2>/dev/null; then - bs_echo='print -r --' - bs_echo_n='print -rn --' -elif (test "X`printf %s $bs_echo`" = "X$bs_echo") 2>/dev/null; then - bs_echo='printf %s\n' - bs_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $bs_echo) 2>/dev/null`" = "X-n $bs_echo"; then - bs_echo_body='eval /usr/ucb/echo -n "$1$nl"' - bs_echo_n='/usr/ucb/echo -n' - else - bs_echo_body='eval expr "X$1" : "X\\(.*\\)"' - bs_echo_n_body='eval - arg=$1; - case $arg in #( - *"$nl"*) - expr "X$arg" : "X\\(.*\\)$nl"; - arg=`expr "X$arg" : ".*$nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$nl" - ' - export bs_echo_n_body - bs_echo_n='sh -c $bs_echo_n_body bs_echo' - fi - export bs_echo_body - bs_echo='sh -c $bs_echo_body bs_echo' -fi - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# All uppercase variable names are used for environment variables. These -# variables can be overridden by the user before calling a script that -# uses them if a suitable command of that name is not already available -# in the command search PATH. - -: ${CP="cp -f"} -: ${ECHO="$bs_echo"} -: ${EGREP="grep -E"} -: ${FGREP="grep -F"} -: ${GREP="grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} - - -## -------------------- ## -## Useful sed snippets. ## -## -------------------- ## - -sed_dirname='s|/[^/]*$||' -sed_basename='s|^.*/||' - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s|\([`"$\\]\)|\\\1|g' - -# Same as above, but do not quote variable references. -sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' - -# Sed substitution that converts a w32 file name or path -# that contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-'\' parameter expansions in output of sed_double_quote_subst that -# were '\'-ed in input to the same. If an odd number of '\' preceded a -# '$' in input to sed_double_quote_subst, that '$' was protected from -# expansion. Since each input '\' is now two '\'s, look for any number -# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. -_G_bs='\\' -_G_bs2='\\\\' -_G_bs4='\\\\\\\\' -_G_dollar='\$' -sed_double_backslash="\ - s/$_G_bs4/&\\ -/g - s/^$_G_bs2$_G_dollar/$_G_bs&/ - s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g - s/\n//g" - - -## ----------------- ## -## Global variables. ## -## ----------------- ## - -# Except for the global variables explicitly listed below, the following -# functions in the '^func_' namespace, and the '^require_' namespace -# variables initialised in the 'Resource management' section, sourcing -# this file will not pollute your global namespace with anything -# else. There's no portable way to scope variables in Bourne shell -# though, so actually running these functions will sometimes place -# results into a variable named after the function, and often use -# temporary variables in the '^_G_' namespace. If you are careful to -# avoid using those namespaces casually in your sourcing script, things -# should continue to work as you expect. And, of course, you can freely -# overwrite any of the functions or variables defined here before -# calling anything to customize them. - -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -# Allow overriding, eg assuming that you follow the convention of -# putting '$debug_cmd' at the start of all your functions, you can get -# bash to show function call trace with: -# -# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name -debug_cmd=${debug_cmd-":"} -exit_cmd=: - -# By convention, finish your script with: -# -# exit $exit_status -# -# so that you can set exit_status to non-zero if you want to indicate -# something went wrong during execution without actually bailing out at -# the point of failure. -exit_status=$EXIT_SUCCESS - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath=$0 - -# The name of this program. -progname=`$bs_echo "$progpath" |$SED "$sed_basename"` - -# Make sure we have an absolute progpath for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=`$bs_echo "$progpath" |$SED "$sed_dirname"` - progdir=`cd "$progdir" && pwd` - progpath=$progdir/$progname - ;; - *) - _G_IFS=$IFS - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS=$_G_IFS - test -x "$progdir/$progname" && break - done - IFS=$_G_IFS - test -n "$progdir" || progdir=`pwd` - progpath=$progdir/$progname - ;; -esac - - -## ----------------- ## -## Standard options. ## -## ----------------- ## - -# The following options affect the operation of the functions defined -# below, and should be set appropriately depending on run-time para- -# meters passed on the command line. - -opt_dry_run=false -opt_quiet=false -opt_verbose=false - -# Categories 'all' and 'none' are always available. Append any others -# you will pass as the first argument to func_warning from your own -# code. -warning_categories= - -# By default, display warnings according to 'opt_warning_types'. Set -# 'warning_func' to ':' to elide all warnings, or func_fatal_error to -# treat the next displayed warning as a fatal error. -warning_func=func_warn_and_continue - -# Set to 'all' to display all warnings, 'none' to suppress all -# warnings, or a space delimited list of some subset of -# 'warning_categories' to display only the listed warnings. -opt_warning_types=all - - -## -------------------- ## -## Resource management. ## -## -------------------- ## - -# This section contains definitions for functions that each ensure a -# particular resource (a file, or a non-empty configuration variable for -# example) is available, and if appropriate to extract default values -# from pertinent package files. Call them using their associated -# 'require_*' variable to ensure that they are executed, at most, once. -# -# It's entirely deliberate that calling these functions can set -# variables that don't obey the namespace limitations obeyed by the rest -# of this file, in order that that they be as useful as possible to -# callers. - - -# require_term_colors -# ------------------- -# Allow display of bold text on terminals that support it. -require_term_colors=func_require_term_colors -func_require_term_colors () -{ - $debug_cmd - - test -t 1 && { - # COLORTERM and USE_ANSI_COLORS environment variables take - # precedence, because most terminfo databases neglect to describe - # whether color sequences are supported. - test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} - - if test 1 = "$USE_ANSI_COLORS"; then - # Standard ANSI escape sequences - tc_reset='' - tc_bold=''; tc_standout='' - tc_red=''; tc_green='' - tc_blue=''; tc_cyan='' - else - # Otherwise trust the terminfo database after all. - test -n "`tput sgr0 2>/dev/null`" && { - tc_reset=`tput sgr0` - test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` - tc_standout=$tc_bold - test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` - test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` - test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` - test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` - test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` - } - fi - } - - require_term_colors=: -} - - -## ----------------- ## -## Function library. ## -## ----------------- ## - -# This section contains a variety of useful functions to call in your -# scripts. Take note of the portable wrappers for features provided by -# some modern shells, which will fall back to slower equivalents on -# less featureful shells. - - -# func_append VAR VALUE -# --------------------- -# Append VALUE onto the existing contents of VAR. - - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - - # _G_HAVE_PLUSEQ_OP - # Can be empty, in which case the shell is probed, "yes" if += is - # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes - -if test yes = "$_G_HAVE_PLUSEQ_OP" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_append () - { - $debug_cmd - - eval "$1+=\$2" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_append () - { - $debug_cmd - - eval "$1=\$$1\$2" - } -fi - - -# func_append_quoted VAR VALUE -# ---------------------------- -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -if test yes = "$_G_HAVE_PLUSEQ_OP"; then - eval 'func_append_quoted () - { - $debug_cmd - - func_quote_for_eval "$2" - eval "$1+=\\ \$func_quote_for_eval_result" - }' -else - func_append_quoted () - { - $debug_cmd - - func_quote_for_eval "$2" - eval "$1=\$$1\\ \$func_quote_for_eval_result" - } -fi - - -# func_append_uniq VAR VALUE -# -------------------------- -# Append unique VALUE onto the existing contents of VAR, assuming -# entries are delimited by the first character of VALUE. For example: -# -# func_append_uniq options " --another-option option-argument" -# -# will only append to $options if " --another-option option-argument " -# is not already present somewhere in $options already (note spaces at -# each end implied by leading space in second argument). -func_append_uniq () -{ - $debug_cmd - - eval _G_current_value='`$bs_echo $'$1'`' - _G_delim=`expr "$2" : '\(.\)'` - - case $_G_delim$_G_current_value$_G_delim in - *"$2$_G_delim"*) ;; - *) func_append "$@" ;; - esac -} - - -# func_arith TERM... -# ------------------ -# Set func_arith_result to the result of evaluating TERMs. - test -z "$_G_HAVE_ARITH_OP" \ - && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ - && _G_HAVE_ARITH_OP=yes - -if test yes = "$_G_HAVE_ARITH_OP"; then - eval 'func_arith () - { - $debug_cmd - - func_arith_result=$(( $* )) - }' -else - func_arith () - { - $debug_cmd - - func_arith_result=`expr "$@"` - } -fi - - -# func_basename FILE -# ------------------ -# Set func_basename_result to FILE with everything up to and including -# the last / stripped. -if test yes = "$_G_HAVE_XSI_OPS"; then - # If this shell supports suffix pattern removal, then use it to avoid - # forking. Hide the definitions single quotes in case the shell chokes - # on unsupported syntax... - _b='func_basename_result=${1##*/}' - _d='case $1 in - */*) func_dirname_result=${1%/*}$2 ;; - * ) func_dirname_result=$3 ;; - esac' - -else - # ...otherwise fall back to using sed. - _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' - _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` - if test "X$func_dirname_result" = "X$1"; then - func_dirname_result=$3 - else - func_append func_dirname_result "$2" - fi' -fi - -eval 'func_basename () -{ - $debug_cmd - - '"$_b"' -}' - - -# func_dirname FILE APPEND NONDIR_REPLACEMENT -# ------------------------------------------- -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -eval 'func_dirname () -{ - $debug_cmd - - '"$_d"' -}' - - -# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT -# -------------------------------------------------------- -# Perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# For efficiency, we do not delegate to the functions above but instead -# duplicate the functionality here. -eval 'func_dirname_and_basename () -{ - $debug_cmd - - '"$_b"' - '"$_d"' -}' - - -# func_echo ARG... -# ---------------- -# Echo program name prefixed message. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $bs_echo "$progname: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_echo_all ARG... -# -------------------- -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - - -# func_echo_infix_1 INFIX ARG... -# ------------------------------ -# Echo program name, followed by INFIX on the first line, with any -# additional lines not showing INFIX. -func_echo_infix_1 () -{ - $debug_cmd - - $require_term_colors - - _G_infix=$1; shift - _G_indent=$_G_infix - _G_prefix="$progname: $_G_infix: " - _G_message=$* - - # Strip color escape sequences before counting printable length - for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" - do - test -n "$_G_tc" && { - _G_esc_tc=`$bs_echo "$_G_tc" | sed "$sed_make_literal_regex"` - _G_indent=`$bs_echo "$_G_indent" | sed "s|$_G_esc_tc||g"` - } - done - _G_indent="$progname: "`echo "$_G_indent" | sed 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes - - func_echo_infix_1_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_infix_1_IFS - $bs_echo "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 - _G_prefix=$_G_indent - done - IFS=$func_echo_infix_1_IFS -} - - -# func_error ARG... -# ----------------- -# Echo program name prefixed message to standard error. -func_error () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 -} - - -# func_fatal_error ARG... -# ----------------------- -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - $debug_cmd - - func_error "$*" - exit $EXIT_FAILURE -} - - -# func_grep EXPRESSION FILENAME -# ----------------------------- -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $debug_cmd - - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_len STRING -# --------------- -# Set func_len_result to the length of STRING. STRING may not -# start with a hyphen. - test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_len () - { - $debug_cmd - - func_len_result=${#1} - }' -else - func_len () - { - $debug_cmd - - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` - } -fi - - -# func_mkdir_p DIRECTORY-PATH -# --------------------------- -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - $debug_cmd - - _G_directory_path=$1 - _G_dir_list= - - if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then - - # Protect directory names starting with '-' - case $_G_directory_path in - -*) _G_directory_path=./$_G_directory_path ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$_G_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - _G_dir_list=$_G_directory_path:$_G_dir_list - - # If the last portion added has no slash in it, the list is done - case $_G_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` - done - _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` - - func_mkdir_p_IFS=$IFS; IFS=: - for _G_dir in $_G_dir_list; do - IFS=$func_mkdir_p_IFS - # mkdir can fail with a 'File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$_G_dir" 2>/dev/null || : - done - IFS=$func_mkdir_p_IFS - - # Bail out if we (or some other process) failed to create a directory. - test -d "$_G_directory_path" || \ - func_fatal_error "Failed to create '$1'" - fi -} - - -# func_mktempdir [BASENAME] -# ------------------------- -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, BASENAME is the basename for that directory. -func_mktempdir () -{ - $debug_cmd - - _G_template=${TMPDIR-/tmp}/${1-$progname} - - if test : = "$opt_dry_run"; then - # Return a directory name, but don't create it in dry-run mode - _G_tmpdir=$_G_template-$$ - else - - # If mktemp works, use that first and foremost - _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - - if test ! -d "$_G_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - _G_tmpdir=$_G_template-${RANDOM-0}$$ - - func_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$_G_tmpdir" - umask $func_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$_G_tmpdir" || \ - func_fatal_error "cannot create temporary directory '$_G_tmpdir'" - fi - - $ECHO "$_G_tmpdir" -} - - -# func_normal_abspath PATH -# ------------------------ -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -func_normal_abspath () -{ - $debug_cmd - - # These SED scripts presuppose an absolute path with a trailing slash. - _G_pathcar='s|^/\([^/]*\).*$|\1|' - _G_pathcdr='s|^/[^/]*||' - _G_removedotparts=':dotsl - s|/\./|/|g - t dotsl - s|/\.$|/|' - _G_collapseslashes='s|/\{1,\}|/|g' - _G_finalslash='s|/*$|/|' - - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` - while :; do - # Processed it all yet? - if test / = "$func_normal_abspath_tpath"; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result"; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - - -# func_notquiet ARG... -# -------------------- -# Echo program name prefixed message only when not in quiet mode. -func_notquiet () -{ - $debug_cmd - - $opt_quiet || func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - - -# func_relative_path SRCDIR DSTDIR -# -------------------------------- -# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. -func_relative_path () -{ - $debug_cmd - - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=$func_dirname_result - if test -z "$func_relative_path_tlibdir"; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test -n "$func_stripname_result"; then - func_append func_relative_path_result "/$func_stripname_result" - fi - - # Normalisation. If bindir is libdir, return '.' else relative path. - if test -n "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - fi - - test -n "$func_relative_path_result" || func_relative_path_result=. - - : -} - - -# func_quote_for_eval ARG... -# -------------------------- -# Aesthetically quote ARGs to be evaled later. -# This function returns two values: -# i) func_quote_for_eval_result -# double-quoted, suitable for a subsequent eval -# ii) func_quote_for_eval_unquoted_result -# has all characters that are still active within double -# quotes backslashified. -func_quote_for_eval () -{ - $debug_cmd - - func_quote_for_eval_unquoted_result= - func_quote_for_eval_result= - while test 0 -lt $#; do - case $1 in - *[\\\`\"\$]*) - _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; - *) - _G_unquoted_arg=$1 ;; - esac - if test -n "$func_quote_for_eval_unquoted_result"; then - func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" - else - func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" - fi - - case $_G_unquoted_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_quoted_arg=\"$_G_unquoted_arg\" - ;; - *) - _G_quoted_arg=$_G_unquoted_arg - ;; - esac - - if test -n "$func_quote_for_eval_result"; then - func_append func_quote_for_eval_result " $_G_quoted_arg" - else - func_append func_quote_for_eval_result "$_G_quoted_arg" - fi - shift - done -} - - -# func_quote_for_expand ARG -# ------------------------- -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - $debug_cmd - - case $1 in - *[\\\`\"]*) - _G_arg=`$ECHO "$1" | $SED \ - -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; - *) - _G_arg=$1 ;; - esac - - case $_G_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_arg=\"$_G_arg\" - ;; - esac - - func_quote_for_expand_result=$_G_arg -} - - -# func_stripname PREFIX SUFFIX NAME -# --------------------------------- -# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_stripname () - { - $debug_cmd - - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary variable first. - func_stripname_result=$3 - func_stripname_result=${func_stripname_result#"$1"} - func_stripname_result=${func_stripname_result%"$2"} - }' -else - func_stripname () - { - $debug_cmd - - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; - esac - } -fi - - -# func_show_eval CMD [FAIL_EXP] -# ----------------------------- -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - func_quote_for_expand "$_G_cmd" - eval "func_notquiet $func_quote_for_expand_result" - - $opt_dry_run || { - eval "$_G_cmd" - _G_status=$? - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_show_eval_locale CMD [FAIL_EXP] -# ------------------------------------ -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - $opt_quiet || { - func_quote_for_expand "$_G_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - $opt_dry_run || { - eval "$_G_user_locale - $_G_cmd" - _G_status=$? - eval "$_G_safe_locale" - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_tr_sh -# ---------- -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - $debug_cmd - - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_verbose ARG... -# ------------------- -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $debug_cmd - - $opt_verbose && func_echo "$*" - - : -} - - -# func_warn_and_continue ARG... -# ----------------------------- -# Echo program name prefixed warning message to standard error. -func_warn_and_continue () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 -} - - -# func_warning CATEGORY ARG... -# ---------------------------- -# Echo program name prefixed warning message to standard error. Warning -# messages can be filtered according to CATEGORY, where this function -# elides messages where CATEGORY is not listed in the global variable -# 'opt_warning_types'. -func_warning () -{ - $debug_cmd - - # CATEGORY must be in the warning_categories list! - case " $warning_categories " in - *" $1 "*) ;; - *) func_internal_error "invalid warning category '$1'" ;; - esac - - _G_category=$1 - shift - - case " $opt_warning_types " in - *" $_G_category "*) $warning_func ${1+"$@"} ;; - esac -} - - -# func_sort_ver VER1 VER2 -# ----------------------- -# 'sort -V' is not generally available. -# Note this deviates from the version comparison in automake -# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a -# but this should suffice as we won't be specifying old -# version formats or redundant trailing .0 in bootstrap.conf. -# If we did want full compatibility then we should probably -# use m4_version_compare from autoconf. -func_sort_ver () -{ - $debug_cmd - - ver1=$1 - ver2=$2 - - # Split on '.' and compare each component. - i=1 - while :; do - p1=`echo "$ver1" |cut -d. -f$i` - p2=`echo "$ver2" |cut -d. -f$i` - if test ! "$p1"; then - echo "$1 $2" - break - elif test ! "$p2"; then - echo "$2 $1" - break - elif test ! "$p1" = "$p2"; then - if test "$p1" -gt "$p2" 2>/dev/null; then # numeric comparison - echo "$2 $1" - elif test "$p2" -gt "$p1" 2>/dev/null; then # numeric comparison - echo "$1 $2" - else # numeric, then lexicographic comparison - lp=`printf "$p1\n$p2\n" |sort -n |tail -n1` - if test "$lp" = "$p2"; then - echo "$1 $2" - else - echo "$2 $1" - fi - fi - break - fi - i=`expr $i + 1` - done -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: -#! /bin/sh - -# Set a version string for this script. -scriptversion=2012-10-21.11; # UTC - -# A portable, pluggable option parser for Bourne shell. -# Written by Gary V. Vaughan, 2010 - -# Copyright (C) 2010-2013 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Please report bugs or propose patches to gary@gnu.org. - - -## ------ ## -## Usage. ## -## ------ ## - -# This file is a library for parsing options in your shell scripts along -# with assorted other useful supporting features that you can make use -# of too. -# -# For the simplest scripts you might need only: -# -# #!/bin/sh -# . relative/path/to/funclib.sh -# . relative/path/to/options-parser -# scriptversion=1.0 -# func_options ${1+"$@"} -# eval set dummy "$func_options_result"; shift -# ...rest of your script... -# -# In order for the '--version' option to work, you will need to have a -# suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# warranty; '. -# -# For '-h' and '--help' to work, you will also need a one line -# description of your script's purpose in a comment directly above the -# '# Written by ' line, like the one at the top of this file. -# -# The default options also support '--debug', which will turn on shell -# execution tracing (see the comment above debug_cmd below for another -# use), and '--verbose' and the func_verbose function to allow your script -# to display verbose messages only when your user has specified -# '--verbose'. -# -# After sourcing this file, you can plug processing for additional -# options by amending the variables from the 'Configuration' section -# below, and following the instructions in the 'Option parsing' -# section further down. - -## -------------- ## -## Configuration. ## -## -------------- ## - -# You should override these variables in your script after sourcing this -# file so that they reflect the customisations you have added to the -# option parser. - -# The usage line for option parsing errors and the start of '-h' and -# '--help' output messages. You can embed shell variables for delayed -# expansion at the time the message is displayed, but you will need to -# quote other shell meta-characters carefully to prevent them being -# expanded when the contents are evaled. -usage='$progpath [OPTION]...' - -# Short help message in response to '-h' and '--help'. Add to this or -# override it after sourcing this library to reflect the full set of -# options your script accepts. -usage_message="\ - --debug enable verbose shell tracing - -W, --warnings=CATEGORY - report the warnings falling in CATEGORY [all] - -v, --verbose verbosely report processing - --version print version information and exit - -h, --help print short or long help message and exit -" - -# Additional text appended to 'usage_message' in response to '--help'. -long_help_message=" -Warning categories include: - 'all' show all warnings - 'none' turn off all the warnings - 'error' warnings are treated as fatal errors" - -# Help message printed before fatal option parsing errors. -fatal_help="Try '\$progname --help' for more information." - - - -## ------------------------- ## -## Hook function management. ## -## ------------------------- ## - -# This section contains functions for adding, removing, and running hooks -# to the main code. A hook is just a named list of of function, that can -# be run in order later on. - -# func_hookable FUNC_NAME -# ----------------------- -# Declare that FUNC_NAME will run hooks added with -# 'func_add_hook FUNC_NAME ...'. -func_hookable () -{ - $debug_cmd - - func_append hookable_fns " $1" -} - - -# func_add_hook FUNC_NAME HOOK_FUNC -# --------------------------------- -# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must -# first have been declared "hookable" by a call to 'func_hookable'. -func_add_hook () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not accept hook functions." ;; - esac - - eval func_append ${1}_hooks '" $2"' -} - - -# func_remove_hook FUNC_NAME HOOK_FUNC -# ------------------------------------ -# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. -func_remove_hook () -{ - $debug_cmd - - eval ${1}_hooks='`$bs_echo "\$'$1'_hooks" |$SED "s| '$2'||"`' -} - - -# func_run_hooks FUNC_NAME [ARG]... -# --------------------------------- -# Run all hook functions registered to FUNC_NAME. -# It is assumed that the list of hook functions contains nothing more -# than a whitespace-delimited list of legal shell function names, and -# no effort is wasted trying to catch shell meta-characters or preserve -# whitespace. -func_run_hooks () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook functions." ;; - esac - - eval _G_hook_fns=\$$1_hooks; shift - - for _G_hook in $_G_hook_fns; do - eval $_G_hook '"$@"' - - # store returned options list back into positional - # parameters for next 'cmd' execution. - eval _G_hook_result=\$${_G_hook}_result - eval set dummy "$_G_hook_result"; shift - done - - func_quote_for_eval ${1+"$@"} - func_run_hooks_result=$func_quote_for_eval_result -} - - - -## --------------- ## -## Option parsing. ## -## --------------- ## - -# In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, remove any -# options that you action, and then pass back the remaining unprocessed -# options in '_result', escaped suitably for -# 'eval'. Like this: -# -# my_options_prep () -# { -# $debug_cmd -# -# # Extend the existing usage message. -# usage_message=$usage_message' -# -s, --silent don'\''t print informational messages -# ' -# -# func_quote_for_eval ${1+"$@"} -# my_options_prep_result=$func_quote_for_eval_result -# } -# func_add_hook func_options_prep my_options_prep -# -# -# my_silent_option () -# { -# $debug_cmd -# -# # Note that for efficiency, we parse as many options as we can -# # recognise in a loop before passing the remainder back to the -# # caller on the first unrecognised argument we encounter. -# while test $# -gt 0; do -# opt=$1; shift -# case $opt in -# --silent|-s) opt_silent=: ;; -# # Separate non-argument short options: -# -s*) func_split_short_opt "$_G_opt" -# set dummy "$func_split_short_opt_name" \ -# "-$func_split_short_opt_arg" ${1+"$@"} -# shift -# ;; -# *) set dummy "$_G_opt" "$*"; shift; break ;; -# esac -# done -# -# func_quote_for_eval ${1+"$@"} -# my_silent_option_result=$func_quote_for_eval_result -# } -# func_add_hook func_parse_options my_silent_option -# -# -# my_option_validation () -# { -# $debug_cmd -# -# $opt_silent && $opt_verbose && func_fatal_help "\ -# '--silent' and '--verbose' options are mutually exclusive." -# -# func_quote_for_eval ${1+"$@"} -# my_option_validation_result=$func_quote_for_eval_result -# } -# func_add_hook func_validate_options my_option_validation -# -# You'll alse need to manually amend $usage_message to reflect the extra -# options you parse. It's preferable to append if you can, so that -# multiple option parsing hooks can be added safely. - - -# func_options [ARG]... -# --------------------- -# All the functions called inside func_options are hookable. See the -# individual implementations for details. -func_hookable func_options -func_options () -{ - $debug_cmd - - func_options_prep ${1+"$@"} - eval func_parse_options \ - ${func_options_prep_result+"$func_options_prep_result"} - eval func_validate_options \ - ${func_parse_options_result+"$func_parse_options_result"} - - eval func_run_hooks func_options \ - ${func_validate_options_result+"$func_validate_options_result"} - - # save modified positional parameters for caller - func_options_result=$func_run_hooks_result -} - - -# func_options_prep [ARG]... -# -------------------------- -# All initialisations required before starting the option parse loop. -# Note that when calling hook functions, we pass through the list of -# positional parameters. If a hook function modifies that list, and -# needs to propogate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before -# returning. -func_hookable func_options_prep -func_options_prep () -{ - $debug_cmd - - # Option defaults: - opt_verbose=false - opt_warning_types= - - func_run_hooks func_options_prep ${1+"$@"} - - # save modified positional parameters for caller - func_options_prep_result=$func_run_hooks_result -} - - -# func_parse_options [ARG]... -# --------------------------- -# The main option parsing loop. -func_hookable func_parse_options -func_parse_options () -{ - $debug_cmd - - func_parse_options_result= - - # this just eases exit handling - while test $# -gt 0; do - # Defer to hook functions for initial option parsing, so they - # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - - # Adjust func_parse_options positional parameters to match - eval set dummy "$func_run_hooks_result"; shift - - # Break out of the loop if we already parsed every option. - test $# -gt 0 || break - - _G_opt=$1 - shift - case $_G_opt in - --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" - $debug_cmd - ;; - - --no-warnings|--no-warning|--no-warn) - set dummy --warnings none ${1+"$@"} - shift - ;; - - --warnings|--warning|-W) - test $# = 0 && func_missing_arg $_G_opt && break - case " $warning_categories $1" in - *" $1 "*) - # trailing space prevents matching last $1 above - func_append_uniq opt_warning_types " $1" - ;; - *all) - opt_warning_types=$warning_categories - ;; - *none) - opt_warning_types=none - warning_func=: - ;; - *error) - opt_warning_types=$warning_categories - warning_func=func_fatal_error - ;; - *) - func_fatal_error \ - "unsupported warning category: '$1'" - ;; - esac - shift - ;; - - --verbose|-v) opt_verbose=: ;; - --version) func_version ;; - -\?|-h) func_usage ;; - --help) func_help ;; - - # Separate optargs to long options (plugins may need this): - --*=*) func_split_equals "$_G_opt" - set dummy "$func_split_equals_lhs" \ - "$func_split_equals_rhs" ${1+"$@"} - shift - ;; - - # Separate optargs to short options: - -W*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-v*|-x*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; - esac - done - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_parse_options_result=$func_quote_for_eval_result -} - - -# func_validate_options [ARG]... -# ------------------------------ -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -func_hookable func_validate_options -func_validate_options () -{ - $debug_cmd - - # Display all warnings if -W was not given. - test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - - func_run_hooks func_validate_options ${1+"$@"} - - # Bail if the options were screwed! - $exit_cmd $EXIT_FAILURE - - # save modified positional parameters for caller - func_validate_options_result=$func_run_hooks_result -} - - - -## ------------------## -## Helper functions. ## -## ------------------## - -# This section contains the helper functions used by the rest of the -# hookable option parser framework in ascii-betical order. - - -# func_fatal_help ARG... -# ---------------------- -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - $debug_cmd - - eval \$bs_echo \""Usage: $usage"\" - eval \$bs_echo \""$fatal_help"\" - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - - -# func_help -# --------- -# Echo long help message to standard output and exit. -func_help () -{ - $debug_cmd - - func_usage_message - $bs_echo "$long_help_message" - exit 0 -} - - -# func_missing_arg ARGNAME -# ------------------------ -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $debug_cmd - - func_error "Missing argument for '$1'." - exit_cmd=exit -} - - -# func_split_equals STRING -# ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables after -# splitting STRING at the '=' sign. -test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=${1%%=*} - func_split_equals_rhs=${1#*=} - test "x$func_split_equals_lhs" = "x$1" \ - && func_split_equals_rhs= - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` - func_split_equals_rhs= - test "x$func_split_equals_lhs" = "x$1" \ - || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` - } -fi #func_split_equals - - -# func_split_short_opt SHORTOPT -# ----------------------------- -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"} - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` - func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` - } -fi #func_split_short_opt - - -# func_usage -# ---------- -# Echo short help message to standard output and exit. -func_usage () -{ - $debug_cmd - - func_usage_message - $bs_echo "Run '$progname --help |${PAGER-more}' for full usage" - exit 0 -} - - -# func_usage_message -# ------------------ -# Echo short help message to standard output. -func_usage_message () -{ - $debug_cmd - - eval \$bs_echo \""Usage: $usage"\" - echo - $SED -n 's|^# || - /^Written by/{ - x;p;x - } - h - /^Written by/q' < "$progpath" - echo - eval \$bs_echo \""$usage_message"\" -} - - -# func_version -# ------------ -# Echo version message to standard output and exit. -func_version () -{ - $debug_cmd - - printf '%s\n' "$progname $scriptversion" - $SED -n '/^##/q - /(C)/!b go - :more - /\./!{ - N - s|\n# | | - b more - } - :go - /^# Written by /,/# warranty; / { - s|^# || - s|^# *$|| - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - p - } - /^# Written by / { - s|^# || - p - } - /^warranty; /q' < "$progpath" - - exit $? -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: - -# Set a version string. -scriptversion='(GNU libtool) 2.4.2.418' - - -# func_echo ARG... -# ---------------- -# Libtool also displays the current mode in messages, so override -# funclib.sh func_echo with this custom definition. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $bs_echo "$progname${opt_mode+: $opt_mode}: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - -## ---------------- ## -## Options parsing. ## -## ---------------- ## - -# Hook in the functions to make sure our own options are parsed during -# the option parsing loop. - -usage='$progpath [OPTION]... [MODE-ARG]...' - -# Short help message in response to '-h'. -usage_message="Options: - --config show all configuration variables - --debug enable verbose shell tracing - -n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --mode=MODE use operation mode MODE - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message -" - -# Additional text appended to 'usage_message' in response to '--help'. -long_help_message=$long_help_message" - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. When passed as first option, -'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. -Try '$progname --help --mode=MODE' for a more detailed description of MODE. - -When reporting a bug, please describe a test case to reproduce it and -include the following information: - - host-triplet: $host - shell: $SHELL - compiler: $LTCC - compiler flags: $LTCFLAGS - linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.2.418 - automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` - autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` - -Report bugs to . -GNU libtool home page: . -General help using GNU software: ." - - -# func_lo2o OBJECT-NAME -# --------------------- -# Transform OBJECT-NAME from a '.lo' suffix to the platform specific -# object suffix. - -lo2o=s/\\.lo\$/.$objext/ -o2lo=s/\\.$objext\$/.lo/ - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_lo2o () - { - case $1 in - *.lo) func_lo2o_result=${1%.lo}.$objext ;; - * ) func_lo2o_result=$1 ;; - esac - }' - - # func_xform LIBOBJ-OR-SOURCE - # --------------------------- - # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) - # suffix to a '.lo' libtool-object suffix. - eval 'func_xform () - { - func_xform_result=${1%.*}.lo - }' -else - # ...otherwise fall back to using sed. - func_lo2o () - { - func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` - } - - func_xform () - { - func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` - } -fi - - -# func_fatal_configuration ARG... -# ------------------------------- -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func__fatal_error ${1+"$@"} \ - "See the $PACKAGE documentation for more information." \ - "Fatal configuration error." -} - - -# func_config -# ----------- -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - - -# func_features -# ------------- -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test yes = "$build_libtool_libs"; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test yes = "$build_old_libs"; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - - -# func_enable_tag TAGNAME -# ----------------------- -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname=$1 - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf=/$re_begincf/,/$re_endcf/p - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - - -# func_check_version_match -# ------------------------ -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# libtool_options_prep [ARG]... -# ----------------------------- -# Preparation for options parsed by libtool. -libtool_options_prep () -{ - $debug_mode - - # Option defaults: - opt_config=false - opt_dlopen= - opt_dry_run=false - opt_help=false - opt_mode= - opt_preserve_dup_deps=false - opt_quiet=false - - nonopt= - preserve_args= - - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - esac - - # Pass back the list of options. - func_quote_for_eval ${1+"$@"} - libtool_options_prep_result=$func_quote_for_eval_result -} -func_add_hook func_options_prep libtool_options_prep - - -# libtool_parse_options [ARG]... -# --------------------------------- -# Provide handling for libtool specific options. -libtool_parse_options () -{ - $debug_cmd - - # Perform our own loop to consume as many options as possible in - # each iteration. - while test $# -gt 0; do - _G_opt=$1 - shift - case $_G_opt in - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - - --config) func_config ;; - - --dlopen|-dlopen) - opt_dlopen="${opt_dlopen+$opt_dlopen -}$1" - shift - ;; - - --preserve-dup-deps) - opt_preserve_dup_deps=: ;; - - --features) func_features ;; - - --finish) set dummy --mode finish ${1+"$@"}; shift ;; - - --help) opt_help=: ;; - - --help-all) opt_help=': help-all' ;; - - --mode) test $# = 0 && func_missing_arg $_G_opt && break - opt_mode=$1 - case $1 in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" - exit_cmd=exit - break - ;; - esac - shift - ;; - - --no-silent|--no-quiet) - opt_quiet=false - func_append preserve_args " $_G_opt" - ;; - - --no-warnings|--no-warning|--no-warn) - opt_warning=false - func_append preserve_args " $_G_opt" - ;; - - --no-verbose) - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --silent|--quiet) - opt_quiet=: - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --tag) test $# = 0 && func_missing_arg $_G_opt && break - opt_tag=$1 - func_append preserve_args " $_G_opt $1" - func_enable_tag "$1" - shift - ;; - - --verbose|-v) opt_quiet=false - opt_verbose=: - func_append preserve_args " $_G_opt" - ;; - - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; - esac - done - - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - libtool_parse_options_result=$func_quote_for_eval_result -} -func_add_hook func_parse_options libtool_parse_options - - - -# libtool_validate_options [ARG]... -# --------------------------------- -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -libtool_validate_options () -{ - # save first non-option argument - if test 0 -lt $#; then - nonopt=$1 - shift - fi - - # preserve --debug - test : = "$debug_cmd" || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - test yes != "$build_libtool_libs" \ - && test yes != "$build_old_libs" \ - && func_fatal_configuration "not configured to build any kind of library" - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test execute != "$opt_mode"; then - func_error "unrecognized option '-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help=$help - help="Try '$progname --help --mode=$opt_mode' for more information." - } - - # Pass back the unparsed argument list - func_quote_for_eval ${1+"$@"} - libtool_validate_options_result=$func_quote_for_eval_result -} -func_add_hook func_validate_options libtool_validate_options - - -# Process options as early as possible so that --help and --version -# can return quickly. -func_options ${1+"$@"} -eval set dummy "$func_options_result"; shift - - - -## ----------- ## -## Main. ## -## ----------- ## - -magic='%%%MAGIC variable%%%' -magic_exe='%%%MAGIC EXE variable%%%' - -# Global variables. -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# func_lalib_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if 'file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case $lalib_p_line in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test yes = "$lalib_p" -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $debug_cmd - - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# 'FILE.' does not work on cygwin managed mounts. -func_source () -{ - $debug_cmd - - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case $lt_sysroot:$1 in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result='='$func_stripname_result - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $debug_cmd - - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with '--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=$1 - if test yes = "$build_libtool_libs"; then - write_lobj=\'$2\' - else - write_lobj=none - fi - - if test yes = "$build_old_libs"; then - write_oldobj=\'$3\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $debug_cmd - - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result= - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result"; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $debug_cmd - - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $debug_cmd - - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $debug_cmd - - if test -z "$2" && test -n "$1"; then - func_error "Could not determine host file name corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result=$1 - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $debug_cmd - - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " '$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result=$3 - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $debug_cmd - - case $4 in - $1 ) func_to_host_path_result=$3$func_to_host_path_result - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via '$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $debug_cmd - - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $debug_cmd - - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result=$1 -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result=$func_convert_core_msys_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result=$func_convert_core_file_wine_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via '$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $debug_cmd - - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd=func_convert_path_$func_stripname_result - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $debug_cmd - - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result=$1 -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_msys_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_path_wine_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_dll_def_p FILE -# True iff FILE is a Windows DLL '.def' file. -# Keep in sync with _LT_DLL_DEF_P in libtool.m4 -func_dll_def_p () -{ - $debug_cmd - - func_dll_def_p_tmp=`$SED -n \ - -e 's/^[ ]*//' \ - -e '/^\(;.*\)*$/d' \ - -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ - -e q \ - "$1"` - test DEF = "$func_dll_def_p_tmp" -} - - -# func_mode_compile arg... -func_mode_compile () -{ - $debug_cmd - - # Get the compilation command and the source file. - base_compile= - srcfile=$nonopt # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg=$arg - arg_mode=normal - ;; - - target ) - libobj=$arg - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify '-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs=$IFS; IFS=, - for arg in $args; do - IFS=$save_ifs - func_append_quoted lastarg "$arg" - done - IFS=$save_ifs - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg=$srcfile - srcfile=$arg - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with '-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj=$func_basename_result - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from '$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test yes = "$build_libtool_libs" \ - || func_fatal_configuration "cannot build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name '$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname=$func_basename_result - xdir=$func_dirname_result - lobj=$xdir$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test yes = "$build_old_libs"; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test no = "$compiler_c_o"; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext - lockfile=$output_obj.lock - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test yes = "$need_locks"; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test warn = "$need_locks"; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test yes = "$build_libtool_libs"; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test no != "$pic_mode"; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test yes = "$suppress_opt"; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test yes = "$build_old_libs"; then - if test yes != "$pic_mode"; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test yes = "$compiler_c_o"; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test no != "$need_locks"; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test compile = "$opt_mode" && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a '.o' file suitable for static linking - -static only build a '.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a 'standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix '.c' with the -library object suffix, '.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to '-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the '--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the 'install' or 'cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with '-') are ignored. - -Every other argument is treated as a filename. Files ending in '.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in '.la', then a libtool library is created, -only library objects ('.lo' files) may be specified, and '-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created -using 'ar' and 'ranlib', or on Windows using 'lib'. - -If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode '$opt_mode'" - ;; - esac - - echo - $ECHO "Try '$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test : = "$opt_help"; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $debug_cmd - - # The first argument is the command name. - cmd=$nonopt - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "'$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "'$file' was not linked with '-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir=$func_dirname_result - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir=$func_dirname_result - ;; - - *) - func_warning "'-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir=$absdir - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic=$magic - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file=$progdir/$program - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file=$progdir/$program - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if $opt_dry_run; then - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - else - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd=\$cmd$args - fi -} - -test execute = "$opt_mode" && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $debug_cmd - - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "'$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument '$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and '=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_quiet && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the '-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the '$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the '$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the '$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test finish = "$opt_mode" && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $debug_cmd - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac - then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=false - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=: ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test X-m = "X$prev" && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the '$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=: - if $isdir; then - destdir=$dest - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir=$func_dirname_result - destname=$func_basename_result - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "'$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "'$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir=$func_dirname_result - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking '$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname=$1 - shift - - srcname=$realname - test -n "$relink_command" && srcname=${realname}T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme=$stripme - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme= - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try 'ln -sf' first, because the 'ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib=$destdir/$realname - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name=$func_basename_result - instname=$dir/${name}i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest=$destfile - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to '$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test yes = "$build_old_libs"; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext= - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=.exe - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script '$wrapper'" - - finalize=: - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "'$lib' has not been installed in '$libdir'" - finalize=false - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test no = "$fast_install" && test -n "$relink_command"; then - $opt_dry_run || { - if $finalize; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file=$func_basename_result - outputname=$tmpdir/$file - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_quiet || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink '$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file=$outputname - else - func_warning "cannot relink '$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name=$func_basename_result - - # Set up the ranlib parameters. - oldlib=$destdir/$name - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run '$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test install = "$opt_mode" && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $debug_cmd - - my_outputname=$1 - my_originator=$2 - my_pic_p=${3-false} - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms=${my_outputname}S.c - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist=$output_objdir/$my_outputname.nm - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* External symbol declarations for the compiler. */\ -" - - if test yes = "$dlself"; then - func_verbose "generating symbol list for '$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from '$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols=$output_objdir/$outputname.exp - $opt_dry_run || { - $RM $export_symbols - eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from '$dlprefile'" - func_basename "$dlprefile" - name=$func_basename_result - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename= - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname"; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename=$func_basename_result - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename"; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - func_show_eval '$RM "${nlist}I"' - if test -n "$global_symbol_to_import"; then - eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[];\ -" - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ -static void lt_syminit(void) -{ - LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; - for (; symbol->name; ++symbol) - {" - $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" - echo >> "$output_objdir/$my_dlsyms" "\ - } -}" - fi - echo >> "$output_objdir/$my_dlsyms" "\ -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{ {\"$my_originator\", (void *) 0}," - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ - {\"@INIT@\", (void *) <_syminit}," - fi - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - $my_pic_p && pic_flag_for_symtable=" $pic_flag" - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' - - # Transform the symbol file into the correct name. - symfileobj=$output_objdir/${my_outputname}S.$objext - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for '$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $debug_cmd - - win32_libid_type=unknown - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - case $nm_interface in - "MS dumpbin") - if func_cygming_ms_implib_p "$1" || - func_cygming_gnu_implib_p "$1" - then - win32_nmres=import - else - win32_nmres= - fi - ;; - *) - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s|.*|import| - p - q - } - }'` - ;; - esac - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $debug_cmd - - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $debug_cmd - - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive that possess that section. Heuristic: eliminate - # all those that have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $debug_cmd - - if func_cygming_gnu_implib_p "$1"; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1"; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result= - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $debug_cmd - - f_ex_an_ar_dir=$1; shift - f_ex_an_ar_oldlib=$1 - if test yes = "$lock_old_archive_extraction"; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test yes = "$lock_old_archive_extraction"; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $debug_cmd - - my_gentop=$1; shift - my_oldlibs=${1+"$@"} - my_oldobjs= - my_xlib= - my_xabs= - my_xdir= - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib=$func_basename_result - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir=$my_gentop/$my_xlib_u - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - func_basename "$darwin_archive" - darwin_base_archive=$func_basename_result - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches; do - func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" - $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" - cd "unfat-$$/$darwin_base_archive-$darwin_arch" - func_extract_an_archive "`pwd`" "$darwin_base_archive" - cd "$darwin_curdir" - $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result=$my_oldobjs -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory where it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ that is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options that match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test yes = "$fast_install"; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* declarations of non-ANSI functions */ -#if defined __MINGW32__ -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined __CYGWIN__ -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined other_platform || defined ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined _MSC_VER -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -#elif defined __MINGW32__ -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined __CYGWIN__ -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined other platforms ... */ -#endif - -#if defined PATH_MAX -# define LT_PATHMAX PATH_MAX -#elif defined MAXPATHLEN -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ - defined __OS2__ -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free (stale); stale = 0; } \ -} while (0) - -#if defined LT_DEBUGWRAPPER -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - size_t tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined HAVE_DOS_BASED_FILE_SYSTEM - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined HAVE_DOS_BASED_FILE_SYSTEM - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = (size_t) (q - p); - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (STREQ (str, pat)) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - size_t len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - size_t orig_value_len = strlen (orig_value); - size_t add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - size_t len = strlen (new_value); - while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[--len] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $debug_cmd - - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $debug_cmd - - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # what system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll that has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=false - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module=$wl-single_module - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test yes != "$build_libtool_libs" \ - && func_fatal_configuration "cannot build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg=$1 - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir=$arg - prev= - continue - ;; - dlfiles|dlprefiles) - $preload || { - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=: - } - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test no = "$dlself"; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test dlprefiles = "$prev"; then - dlself=yes - elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test dlfiles = "$prev"; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols=$arg - test -f "$arg" \ - || func_fatal_error "symbol file '$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex=$arg - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir=$arg - prev= - continue - ;; - mllvm) - # Clang does not use LLVM to link, so we can simply discard any - # '-mllvm $arg' options when doing the link step. - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - if test none != "$pic_object"; then - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - fi - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file '$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex=$arg - prev= - continue - ;; - release) - release=-$arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test rpath = "$prev"; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds=$arg - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg=$arg - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "'-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test X-export-symbols = "X$arg"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between '-L' and '$1'" - else - func_fatal_error "need path for '-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of '$dir'" - dir=$absdir - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test X-lc = "X$arg" || test X-lm = "X$arg"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test X-lc = "X$arg" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) - # Do not include libc due to us having libc/libc_r. - test X-lc = "X$arg" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test X-lc = "X$arg" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test X-lc = "X$arg" && continue - ;; - esac - elif test X-lc_r = "X$arg"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -mllvm) - prev=mllvm - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module=$wl-multi_module - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "'-no-install' is ignored for $host" - func_warning "assuming '-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - # -stdlib=* select c++ std lib with clang - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-stdlib=*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - test none = "$pic_object" || { - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - } - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test dlfiles = "$prev"; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test dlprefiles = "$prev"; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the '$prevarg' option requires an argument" - - if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname=$func_basename_result - libobjs_save=$libobjs - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir=$func_dirname_result$objdir - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test lib = "$linkmode"; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=false - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test lib,link = "$linkmode,$pass"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs=$tmp_deplibs - fi - - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass"; then - libs=$deplibs - deplibs= - fi - if test prog = "$linkmode"; then - case $pass in - dlopen) libs=$dlfiles ;; - dlpreopen) libs=$dlprefiles ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test lib,dlpreopen = "$linkmode,$pass"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs=$dlprefiles - fi - if test dlopen = "$pass"; then - # Collect dlpreopened libraries - save_deplibs=$deplibs - deplibs= - fi - - for deplib in $libs; do - lib= - found=false - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test lib != "$linkmode" && test prog != "$linkmode"; then - func_warning "'-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test lib = "$linkmode"; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib=$searchdir/lib$name$search_ext - if test -f "$lib"; then - if test .la = "$search_ext"; then - found=: - else - found=false - fi - break 2 - fi - done - done - if $found; then - # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll=$l - done - if test "X$ll" = "X$old_library"; then # only static version available - found=false - func_dirname "$lib" "" "." - ladir=$func_dirname_result - lib=$ladir/$old_library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - else - # deplib doesn't seem to be a libtool library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; # -l - *.ltframework) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test conv = "$pass" && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - if test scan = "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "'-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test link = "$pass"; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=false - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=: - fi - ;; - pass_all) - valid_a_lib=: - ;; - esac - if $valid_a_lib; then - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - else - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - fi - ;; - esac - continue - ;; - prog) - if test link != "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - elif test prog = "$linkmode"; then - if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=: - continue - ;; - esac # case $deplib - - $found || test -f "$lib" \ - || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "'$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir=$func_dirname_result - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass" || - { test prog != "$linkmode" && test lib != "$linkmode"; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test conv = "$pass"; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - elif test prog != "$linkmode" && test lib != "$linkmode"; then - func_fatal_error "'$lib' is not a convenience library" - fi - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test yes = "$prefer_static_libs" || - test built,no = "$prefer_static_libs,$installed"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib=$l - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - - # This library was specified with -dlopen. - if test dlopen = "$pass"; then - test -z "$libdir" \ - && func_fatal_error "cannot -dlopen a convenience library: '$lib'" - if test -z "$dlname" || - test yes != "$dlopen_support" || - test no = "$build_libtool_libs" - then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of '$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir=$ladir - fi - ;; - esac - func_basename "$lib" - laname=$func_basename_result - - # Find the relevant object directory and library name. - if test yes = "$installed"; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library '$lib' was moved." - dir=$ladir - absdir=$abs_ladir - libdir=$abs_ladir - else - dir=$lt_sysroot$libdir - absdir=$lt_sysroot$libdir - fi - test yes = "$hardcode_automatic" && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir=$ladir - absdir=$abs_ladir - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir=$ladir/$objdir - absdir=$abs_ladir/$objdir - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test dlpreopen = "$pass"; then - if test -z "$libdir" && test prog = "$linkmode"; then - func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" - fi - case $host in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test lib = "$linkmode"; then - deplibs="$dir/$old_library $deplibs" - elif test prog,link = "$linkmode,$pass"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test prog = "$linkmode" && test link != "$pass"; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=false - if test no != "$link_all_deplibs" || test -z "$library_names" || - test no = "$build_libtool_libs"; then - linkalldeplibs=: - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if $linkalldeplibs; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test prog,link = "$linkmode,$pass"; then - if test -n "$library_names" && - { { test no = "$prefer_static_libs" || - test built,yes = "$prefer_static_libs,$installed"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then - # Make sure the rpath contains only unique directories. - case $temp_rpath: in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if $alldeplibs && - { test pass_all = "$deplibs_check_method" || - { test yes = "$build_libtool_libs" && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test built = "$use_static_libs" && test yes = "$installed"; then - use_static_libs=no - fi - if test -n "$library_names" && - { test no = "$use_static_libs" || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test no = "$installed"; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule= - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule=$dlpremoduletest - break - fi - done - if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then - echo - if test prog = "$linkmode"; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test lib = "$linkmode" && - test yes = "$hardcode_into_libs"; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname=$1 - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname=$dlname - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - esac - eval soname=\"$soname_spec\" - else - soname=$realname - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot=$soname - func_basename "$soroot" - soname=$func_basename_result - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from '$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for '$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test prog = "$linkmode" || test relink != "$opt_mode"; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test no = "$hardcode_direct"; then - add=$dir/$linklib - case $host in - *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; - *-*-sysv4*uw2*) add_dir=-L$dir ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir=-L$dir ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we cannot - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library"; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add=$dir/$old_library - fi - elif test -n "$old_library"; then - add=$dir/$old_library - fi - fi - esac - elif test no = "$hardcode_minus_L"; then - case $host in - *-*-sunos*) add_shlibpath=$dir ;; - esac - add_dir=-L$dir - add=-l$name - elif test no = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - relink) - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$dir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$absdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test yes != "$lib_linked"; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test prog = "$linkmode"; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test yes != "$hardcode_direct" && - test yes != "$hardcode_minus_L" && - test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test prog = "$linkmode" || test relink = "$opt_mode"; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$libdir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$libdir - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add=-l$name - elif test yes = "$hardcode_automatic"; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib"; then - add=$inst_prefix_dir$libdir/$linklib - else - add=$libdir/$linklib - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir=-L$libdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - fi - - if test prog = "$linkmode"; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test prog = "$linkmode"; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test unsupported != "$hardcode_direct"; then - test -n "$old_library" && linklib=$old_library - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test yes = "$build_libtool_libs"; then - # Not a shared library - if test pass_all != "$deplibs_check_method"; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system cannot link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test yes = "$module"; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test lib = "$linkmode"; then - if test -n "$dependency_libs" && - { test yes != "$hardcode_into_libs" || - test yes = "$build_old_libs" || - test yes = "$link_static"; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs=$temp_deplibs - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test no != "$link_all_deplibs"; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path=$deplib ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of '$dir'" - absdir=$dir - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names"; then - for tmp in $deplibrary_names; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl"; then - depdepl=$absdir/$objdir/$depdepl - darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" - func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" - path= - fi - fi - ;; - *) - path=-L$absdir/$objdir - ;; - esac - else - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "'$deplib' seems to be moved" - - path=-L$absdir - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test link = "$pass"; then - if test prog = "$linkmode"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs=$newdependency_libs - if test dlpreopen = "$pass"; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test dlopen != "$pass"; then - test conv = "$pass" || { - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - } - - if test prog,link = "$linkmode,$pass"; then - vars="compile_deplibs finalize_deplibs" - else - vars=deplibs - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i= - ;; - esac - if test -n "$i"; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test prog = "$linkmode"; then - dlfiles=$newdlfiles - fi - if test prog = "$linkmode" || test lib = "$linkmode"; then - dlprefiles=$newdlprefiles - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "'-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "'-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs=$output - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form 'libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test no = "$module" \ - && func_fatal_help "libtool library '$output' must begin with 'lib'" - - if test no != "$need_lib_prefix"; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test pass_all != "$deplibs_check_method"; then - func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test no = "$dlself" \ - || func_warning "'-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test 1 -lt "$#" \ - && func_warning "ignoring multiple '-rpath's for a libtool library" - - install_libdir=$1 - - oldlibs= - if test -z "$rpath"; then - if test yes = "$build_libtool_libs"; then - # Building a libtool convenience library. - # Some compilers have problems with a '.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "'-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs=$IFS; IFS=: - set dummy $vinfo 0 0 0 - shift - IFS=$save_ifs - - test -n "$7" && \ - func_fatal_help "too many parameters to '-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major=$1 - number_minor=$2 - number_revision=$3 - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # that has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_revision - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current=$number_major - revision=$number_minor - age=0 - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_minor - lt_irix_increment=no - ;; - esac - ;; - no) - current=$1 - revision=$2 - age=$3 - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT '$current' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION '$revision' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE '$age' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE '$age' is greater than the current interface number '$current'" - func_fatal_error "'$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - # On Darwin other compilers - case $CC in - nagfor*) - verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - ;; - *) - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - esac - ;; - - freebsd-aout) - major=.$current - versuffix=.$current.$revision - ;; - - freebsd-elf) - major=.$current - versuffix=.$current - ;; - - irix | nonstopux) - if test no = "$lt_irix_increment"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring=$verstring_prefix$major.$revision - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test 0 -ne "$loop"; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring_prefix$major.$iface:$verstring - done - - # Before this point, $major must not contain '.'. - major=.$major - versuffix=$major.$revision - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=.$current.$age.$revision - verstring=$current.$age.$revision - - # Add in all the interfaces that we are compatible with. - loop=$age - while test 0 -ne "$loop"; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring:$iface.0 - done - - # Make executables depend on our current version. - func_append verstring ":$current.0" - ;; - - qnx) - major=.$current - versuffix=.$current - ;; - - sunos) - major=.$current - versuffix=.$current.$revision - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 file systems. - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - - *) - func_fatal_configuration "unknown library version type '$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring=0.0 - ;; - esac - if test no = "$need_version"; then - versuffix= - else - versuffix=.0.0 - fi - fi - - # Remove version info from name if versioning should be avoided - if test yes,no = "$avoid_version,$need_version"; then - major= - versuffix= - verstring= - fi - - # Check to see if the archive will have undefined symbols. - if test yes = "$allow_undefined"; then - if test unsupported = "$allow_undefined_flag"; then - if test yes = "$build_old_libs"; then - func_warning "undefined symbols not allowed in $host shared libraries; building static only" - build_libtool_libs=no - else - func_fatal_error "can't build $host shared library unless -no-undefined is specified" - fi - fi - else - # Don't allow undefined symbols. - allow_undefined_flag=$no_undefined_flag - fi - - fi - - func_generate_dlsyms "$libname" "$libname" : - func_append libobjs " $symfileobj" - test " " = "$libobjs" && libobjs= - - if test relink != "$opt_mode"; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) - if test -n "$precious_files_regex"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles=$dlfiles - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles=$dlprefiles - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test yes = "$build_libtool_libs"; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test yes = "$build_libtool_need_lc"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release= - versuffix= - major= - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib=$potent_lib - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | $SED 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; - *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib= - ;; - esac - fi - if test -n "$a_deplib"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib=$potent_lib # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs= - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - for i in $predeps $postdeps; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test none = "$deplibs_check_method"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test yes = "$droppeddeps"; then - if test yes = "$module"; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test no = "$allow_undefined"; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs=$new_libs - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test yes = "$build_libtool_libs"; then - # Remove $wl instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test yes = "$hardcode_into_libs"; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath=$finalize_rpath - test relink = "$opt_mode" || rpath=$compile_rpath$rpath - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath=$finalize_shlibpath - test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname=$1 - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname=$realname - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib=$output_objdir/$realname - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols=$output_objdir/$libname.uexp - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - func_dll_def_p "$export_symbols" || { - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols=$export_symbols - export_symbols= - always_export_symbols=yes - } - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs=$IFS; IFS='~' - for cmd1 in $cmds; do - IFS=$save_ifs - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test yes = "$try_normal_branch" \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=$output_objdir/$output_la.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS=$save_ifs - if test -n "$export_symbols_regex" && test : != "$skipped_export"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test : != "$skipped_export" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs=$tmp_deplibs - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test yes = "$compiler_needs_object" && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test : != "$skipped_export" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then - output=$output_objdir/$output_la.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then - output=$output_objdir/$output_la.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test yes = "$compiler_needs_object"; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-$k.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test -z "$objlist" || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test 1 -eq "$k"; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-$k.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-$k.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - ${skipped_export-false} && { - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - } - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs=$IFS; IFS='~' - for cmd in $concat_cmds; do - IFS=$save_ifs - $opt_quiet || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - ${skipped_export-false} && { - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - } - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs=$IFS; IFS='~' - for cmd in $cmds; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - $opt_quiet || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test yes = "$module" || test yes = "$export_dynamic"; then - # On all known operating systems, these are identical. - dlname=$soname - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "'-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object '$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj=$output - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop=$output_objdir/${obj}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test yes = "$build_libtool_libs" || libobjs=$non_pic_objects - - # Create the old-style object. - reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs - - output=$obj - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - test yes = "$build_libtool_libs" || { - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - } - - if test -n "$pic_flag" || test default != "$pic_mode"; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output=$libobj - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "'-release' is ignored for programs" - - $preload \ - && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ - && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test CXX = "$tagname"; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " $wl-bind_at_load" - func_append finalize_command " $wl-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs=$new_libs - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath=$rpath - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath=$rpath - - if test -n "$libobjs" && test yes = "$build_old_libs"; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" false - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=: - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=false - ;; - *cygwin* | *mingw* ) - test yes = "$build_libtool_libs" || wrappers_required=false - ;; - *) - if test no = "$need_relink" || test yes != "$build_libtool_libs"; then - wrappers_required=false - fi - ;; - esac - $wrappers_required || { - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command=$compile_command$compile_rpath - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.$objext"; then - func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' - fi - - exit $exit_status - } - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test yes = "$no_install"; then - # We don't need to create a wrapper script. - link_command=$compile_var$compile_command$compile_rpath - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - case $hardcode_action,$fast_install in - relink,*) - # Fast installation is not supported - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "'$output' will be relinked during installation" - ;; - *,yes) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - ;; - *,no) - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - ;; - *,needless) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command= - ;; - esac - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource=$output_path/$objdir/lt-$output_name.c - cwrapper=$output_path/$output_name.exe - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host"; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - case $build_libtool_libs in - convenience) - oldobjs="$libobjs_save $symfileobj" - addlibs=$convenience - build_libtool_libs=no - ;; - module) - oldobjs=$libobjs_save - addlibs=$old_convenience - build_libtool_libs=no - ;; - *) - oldobjs="$old_deplibs $non_pic_objects" - $preload && test -f "$symfileobj" \ - && func_append oldobjs " $symfileobj" - addlibs=$old_convenience - ;; - esac - - if test -n "$addlibs"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase=$func_basename_result - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj"; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test -z "$oldobjs"; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test yes = "$build_old_libs" && old_library=$libname.$libext - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test yes = "$hardcode_automatic"; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test yes = "$installed"; then - if test -z "$install_libdir"; then - break - fi - output=$output_objdir/${outputname}i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name=$func_basename_result - func_resolve_sysroot "$deplib" - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs=$newdependency_libs - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles=$newdlprefiles - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles=$newdlprefiles - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test -n "$bindir"; then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result/$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test no,yes = "$installed,$need_relink"; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -if test link = "$opt_mode" || test relink = "$opt_mode"; then - func_mode_link ${1+"$@"} -fi - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $debug_cmd - - RM=$nonopt - files= - rmforce=false - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=: ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir=$func_dirname_result - if test . = "$dir"; then - odir=$objdir - else - odir=$dir/$objdir - fi - func_basename "$file" - name=$func_basename_result - test uninstall = "$opt_mode" && odir=$dir - - # Remember odir for removal later, being careful to avoid duplicates - if test clean = "$opt_mode"; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif $rmforce; then - continue - fi - - rmfiles=$file - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case $opt_mode in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && test none != "$pic_object"; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && test none != "$non_pic_object"; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test clean = "$opt_mode"; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.$objext" - if test yes = "$fast_install" && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name"; then - func_append rmfiles " $odir/lt-$noexename.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the $objdir's in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then - func_mode_uninstall ${1+"$@"} -fi - -test -z "$opt_mode" && { - help=$generic_help - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode '$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# where we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/m4/asmcfi.m4 b/third_party/python/Modules/_ctypes/libffi/m4/asmcfi.m4 deleted file mode 100644 index dbf73a0b3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/asmcfi.m4 +++ /dev/null @@ -1,13 +0,0 @@ -AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], -[AC_CACHE_CHECK([assembler .cfi pseudo-op support], - gcc_cv_as_cfi_pseudo_op, [ - gcc_cv_as_cfi_pseudo_op=unknown - AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],, - [gcc_cv_as_cfi_pseudo_op=yes], - [gcc_cv_as_cfi_pseudo_op=no]) - ]) - if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, - [Define if your assembler supports .cfi_* directives.]) - fi -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_append_flag.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_append_flag.m4 deleted file mode 100644 index 1d38b76fb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_append_flag.m4 +++ /dev/null @@ -1,69 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) -# -# DESCRIPTION -# -# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space -# added in between. -# -# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. -# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains -# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly -# FLAG. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 2 - -AC_DEFUN([AX_APPEND_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX -AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl -AS_VAR_SET_IF(FLAGS, - [case " AS_VAR_GET(FLAGS) " in - *" $1 "*) - AC_RUN_LOG([: FLAGS already contains $1]) - ;; - *) - AC_RUN_LOG([: FLAGS="$FLAGS $1"]) - AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) - ;; - esac], - [AS_VAR_SET(FLAGS,["$1"])]) -AS_VAR_POPDEF([FLAGS])dnl -])dnl AX_APPEND_FLAG diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 deleted file mode 100644 index 62e3b5330..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 +++ /dev/null @@ -1,181 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CC_MAXOPT -# -# DESCRIPTION -# -# Try to turn on "good" C optimization flags for various compilers and -# architectures, for some definition of "good". (In our case, good for -# FFTW and hopefully for other scientific codes. Modify as needed.) -# -# The user can override the flags by setting the CFLAGS environment -# variable. The user can also specify --enable-portable-binary in order to -# disable any optimization flags that might result in a binary that only -# runs on the host architecture. -# -# Note also that the flags assume that ANSI C aliasing rules are followed -# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point -# computations can be re-ordered as needed. -# -# Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR, -# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 13 - -AC_DEFUN([AX_CC_MAXOPT], -[ -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AX_COMPILER_VENDOR]) -AC_REQUIRE([AC_CANONICAL_HOST]) - -AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], - acx_maxopt_portable=$enableval, acx_maxopt_portable=no) - -# Try to determine "good" native compiler flags if none specified via CFLAGS -if test "$ac_test_CFLAGS" != "set"; then - CFLAGS="" - case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" - if test "x$acx_maxopt_portable" = xno; then - CFLAGS="$CFLAGS -arch host" - fi;; - - sun) CFLAGS="-native -fast -xO5 -dalign" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS -xarch=generic" - fi;; - - hp) CFLAGS="+Oall +Optrs_ansi +DSnative" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS +DAportable" - fi;; - - ibm) if test "x$acx_maxopt_portable" = xno; then - xlc_opt="-qarch=auto -qtune=auto" - else - xlc_opt="-qtune=auto" - fi - AX_CHECK_COMPILE_FLAG($xlc_opt, - CFLAGS="-O3 -qansialias -w $xlc_opt", - [CFLAGS="-O3 -qansialias -w" - echo "******************************************************" - echo "* You seem to have the IBM C compiler. It is *" - echo "* recommended for best performance that you use: *" - echo "* *" - echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" - echo "* ^^^ ^^^ *" - echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" - echo "* CPU you have. (Set the CFLAGS environment var. *" - echo "* and re-run configure.) For more info, man cc. *" - echo "******************************************************"]) - ;; - - intel) CFLAGS="-O3 -ansi_alias" - if test "x$acx_maxopt_portable" = xno; then - icc_archflag=unknown - icc_flags="" - case $host_cpu in - i686*|x86_64*) - # icc accepts gcc assembly syntax, so these should work: - AX_GCC_X86_CPUID(0) - AX_GCC_X86_CPUID(1) - case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG - *:756e6547:*:*) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";; - *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";; - *f??:*:*:*) icc_flags="-xN -xW -xK";; - esac ;; - esac ;; - esac - if test "x$icc_flags" != x; then - for flag in $icc_flags; do - AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break]) - done - fi - AC_MSG_CHECKING([for icc architecture flag]) - AC_MSG_RESULT($icc_archflag) - if test "x$icc_archflag" != xunknown; then - CFLAGS="$CFLAGS $icc_archflag" - fi - fi - ;; - - gnu) - # default optimization flags for gcc on all systems - CFLAGS="-O3 -fomit-frame-pointer" - - # -malign-double for x86 systems - # LIBFFI -- DON'T DO THIS - CHANGES ABI - # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") - - # -fstrict-aliasing for gcc-2.95+ - AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, - CFLAGS="$CFLAGS -fstrict-aliasing") - - # note that we enable "unsafe" fp optimization with other compilers, too - AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") - - AX_GCC_ARCHFLAG($acx_maxopt_portable) - ;; - esac - - if test -z "$CFLAGS"; then - echo "" - echo "********************************************************" - echo "* WARNING: Don't know the best CFLAGS for this system *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" - echo "********************************************************" - echo "" - CFLAGS="-O3" - fi - - AX_CHECK_COMPILE_FLAG($CFLAGS, [], [ - echo "" - echo "********************************************************" - echo "* WARNING: The guessed CFLAGS don't seem to work with *" - echo "* your compiler. *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "********************************************************" - echo "" - CFLAGS="" - ]) - -fi -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4 deleted file mode 100644 index 0fa3e186b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4 +++ /dev/null @@ -1,122 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# -# DESCRIPTION -# -# Try to find a compiler option that enables most reasonable warnings. -# -# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result -# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. -# -# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, -# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and -# Intel compilers. For a given compiler, the Fortran flags are much more -# experimental than their C equivalents. -# -# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS -# - $2 add-value-if-not-found : nothing -# - $3 action-if-found : add value to shellvariable -# - $4 action-if-not-found : nothing -# -# NOTE: These macros depend on AX_APPEND_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2010 Rhys Ulerich -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 14 - -AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl -AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl -AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl -AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], -VAR,[VAR="no, unknown" -ac_save_[]FLAGS="$[]FLAGS" -for ac_arg dnl -in "-warn all % -warn all" dnl Intel - "-pedantic % -Wall" dnl GCC - "-xstrconst % -v" dnl Solaris C - "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix - "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX - "-ansi -ansiE % -fullwarn" dnl IRIX - "+ESlit % +w1" dnl HP-UX C - "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) - "-h conform % -h msglevel 2" dnl Cray C (Unicos) - # -do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) -done -FLAGS="$ac_save_[]FLAGS" -]) -AS_VAR_POPDEF([FLAGS])dnl -AC_REQUIRE([AX_APPEND_FLAG]) -case ".$VAR" in - .ok|.ok,*) m4_ifvaln($3,$3) ;; - .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; - *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; -esac -AS_VAR_POPDEF([VAR])dnl -])dnl AX_FLAGS_WARN_ALL -dnl implementation tactics: -dnl the for-argument contains a list of options. The first part of -dnl these does only exist to detect the compiler - usually it is -dnl a global option to enable -ansi or -extrawarnings. All other -dnl compilers will fail about it. That was needed since a lot of -dnl compilers will give false positives for some option-syntax -dnl like -Woption or -Xoption as they think of it is a pass-through -dnl to later compile stages or something. The "%" is used as a -dnl delimiter. A non-option comment can be given after "%%" marks -dnl which will be shown but not added to the respective C/CXXFLAGS. - -AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C]) -]) - -AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C++]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C++]) -]) - -AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([Fortran]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([Fortran]) -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4 deleted file mode 100644 index c3a8d695a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,72 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 2 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4 deleted file mode 100644 index 73e32ea9e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4 +++ /dev/null @@ -1,84 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_COMPILER_VENDOR -# -# DESCRIPTION -# -# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, -# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, -# watcom, etc. The vendor is returned in the cache variable -# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -AC_DEFUN([AX_COMPILER_VENDOR], -[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, - [# note: don't check for gcc first since some other compilers define __GNUC__ - vendors="intel: __ICC,__ECC,__INTEL_COMPILER - ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ - pathscale: __PATHCC__,__PATHSCALE__ - clang: __clang__ - gnu: __GNUC__ - sun: __SUNPRO_C,__SUNPRO_CC - hp: __HP_cc,__HP_aCC - dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER - borland: __BORLANDC__,__TURBOC__ - comeau: __COMO__ - cray: _CRAYC - kai: __KCC - lcc: __LCC__ - sgi: __sgi,sgi - microsoft: _MSC_VER - metrowerks: __MWERKS__ - watcom: __WATCOMC__ - portland: __PGI - unknown: UNKNOWN" - for ventest in $vendors; do - case $ventest in - *:) vendor=$ventest; continue ;; - *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; - esac - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ - #if !($vencpp) - thisisanerror; - #endif - ])], [break]) - done - ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` - ]) -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_configure_args.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_configure_args.m4 deleted file mode 100644 index 0726b1bc8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_configure_args.m4 +++ /dev/null @@ -1,70 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_configure_args.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CONFIGURE_ARGS -# -# DESCRIPTION -# -# Helper macro for AX_ENABLE_BUILDDIR. -# -# The traditional way of starting a subdir-configure is running the script -# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have -# to rely on eval'ing $ac_configure_args however some old autoconf -# versions do not provide that. To ensure maximum portability of autoconf -# extension macros this helper can be AC_REQUIRE'd so that -# $ac_configure_args will alsways be present. -# -# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is -# spoiled now and must be replaced by "eval + exit $?". -# -# Example: -# -# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl -# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl -# eval $SHELL $ac_configure_args || exit $? -# ...]) -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 9 - -AC_DEFUN([AX_CONFIGURE_ARGS],[ - # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args - if test "${ac_configure_args+set}" != "set" ; then - ac_configure_args= - for ac_arg in ${1+"[$]@"}; do - ac_configure_args="$ac_configure_args '$ac_arg'" - done - fi -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4 deleted file mode 100644 index 3fb87317d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4 +++ /dev/null @@ -1,300 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] -# -# DESCRIPTION -# -# If the current configure was run within the srcdir then we move all -# configure-files into a subdir and let the configure steps continue -# there. We provide an option --disable-builddir to suppress the move into -# a separate builddir. -# -# Defaults: -# -# $1 = $host (overridden with $HOST) -# $2 = Makefile.mk -# $3 = -all -# -# This macro must be called before AM_INIT_AUTOMAKE. It creates a default -# toplevel srcdir Makefile from the information found in the created -# toplevel builddir Makefile. It just copies the variables and -# rule-targets, each extended with a default rule-execution that recurses -# into the build directory of the current "HOST". You can override the -# auto-dection through `config.guess` and build-time of course, as in -# -# make HOST=i386-mingw-cross -# -# which can of course set at configure time as well using -# -# configure --host=i386-mingw-cross -# -# After the default has been created, additional rules can be appended -# that will not just recurse into the subdirectories and only ever exist -# in the srcdir toplevel makefile - these parts are read from the $2 = -# Makefile.mk file -# -# The automatic rules are usually scanning the toplevel Makefile for lines -# like '#### $host |$builddir' to recognize the place where to recurse -# into. Usually, the last one is the only one used. However, almost all -# targets have an additional "*-all" rule which makes the script to -# recurse into _all_ variants of the current HOST (!!) setting. The "-all" -# suffix can be overriden for the macro as well. -# -# a special rule is only given for things like "dist" that will copy the -# tarball from the builddir to the sourcedir (or $(PUB)) for reason of -# convenience. -# -# LICENSE -# -# Copyright (c) 2009 Guido U. Draheim -# Copyright (c) 2009 Alan Jenkins -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 23 - -AC_DEFUN([AX_ENABLE_BUILDDIR],[ -AC_REQUIRE([AC_CANONICAL_HOST])[]dnl -AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl -AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl -AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl -AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl -AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl -SUB="." -AC_ARG_ENABLE([builddir], AS_HELP_STRING( - [--disable-builddir],[disable automatic build in subdir of sources]) - ,[SUB="$enableval"], [SUB="auto"]) -if test ".$ac_srcdir_defaulted" != ".no" ; then -if test ".$srcdir" = ".." ; then - if test -f config.status ; then - AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) - else - test ".$SUB" = "." && SUB="." - test ".$SUB" = ".no" && SUB="." - test ".$TARGET" = "." && TARGET="$target" - test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" - if test ".$SUB" != ".." ; then # we know where to go and - AS_MKDIR_P([$SUB]) - echo __.$SUB.__ > $SUB/conftest.tmp - cd $SUB - if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then - rm conftest.tmp - AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) - else - AC_MSG_ERROR([could not change to default builddir "./$SUB"]) - fi - srcdir=`echo "$SUB" | - sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` - # going to restart from subdirectory location - test -f $srcdir/config.log && mv $srcdir/config.log . - test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . - test -f $srcdir/conftest.log && mv $srcdir/conftest.log . - test -f $srcdir/$cache_file && mv $srcdir/$cache_file . - AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) - case "[$]0" in # restart - [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; - *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; - esac ; exit $? - fi - fi -fi fi -test ".$SUB" = ".auto" && SUB="." -dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" -AC_PATH_PROG(SED,gsed sed, sed) -AUX="$am_aux_dir" -AS_VAR_POPDEF([SED])dnl -AS_VAR_POPDEF([AUX])dnl -AS_VAR_POPDEF([SUB])dnl -AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. -AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl -AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl -AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl -AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl -AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl -pushdef([END],[Makefile.mk])dnl -pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl - SRC="$ax_enable_builddir_srcdir" - if test ".$SUB" = ".." ; then - if test -f "$TOP/Makefile" ; then - AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) - else - AC_MSG_NOTICE([skipping TOP/Makefile - not created]) - fi - else - if test -f "$SRC/Makefile" ; then - a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` - test "$a" != "$b" && rm "$SRC/Makefile" - fi - if test -f "$SRC/Makefile" ; then - echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk - echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk - eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" - if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null - then rm $SRC/Makefile ; fi - cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING - fi - if test ! -f "$SRC/Makefile" ; then - AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) - x='`' ; cat >$tmp/conftemp.sed <<_EOF -/^\$/n -x -/^\$/bS -x -/\\\\\$/{H;d;} -{H;s/.*//;x;} -bM -:S -x -/\\\\\$/{h;d;} -{h;s/.*//;x;} -:M -s/\\(\\n\\) /\\1 /g -/^ /d -/^[[ ]]*[[\\#]]/d -/^VPATH *=/d -s/^srcdir *=.*/srcdir = ./ -s/^top_srcdir *=.*/top_srcdir = ./ -/[[:=]]/!d -/^\\./d -dnl Now handle rules (i.e. lines containing ":" but not " = "). -/ = /b -/ .= /b -/:/!b -s/:.*/:/ -s/ / /g -s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g -s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ -s/ / /g -/^all all[]_ALL[[ :]]/i\\ -all-configured : all[]_ALL -dnl dist-all exists... and would make for dist-all-all -s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g -/[]_ALL[]_ALL/d -a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done -dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) -/dist[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) -/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -dnl special rule add-on: "distclean" removes all local builddirs completely -/distclean[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ - ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ - ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile -_EOF - cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING - $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile - if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then - AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) - cat $SRC/END >>$SRC/Makefile - fi ; xxxx="####" - echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile - # sanity check - if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then - AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) - $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ - >$SRC/Makefile~ - (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null - fi - else - xxxx="\\#\\#\\#\\#" - # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed - echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed - $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp - cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING - cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING - if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then - AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) - rm "$tmp/mkfile.tmp" - else - AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) - mv "$tmp/mkfile.tmp" "$SRC/Makefile" - fi - fi - AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) - xxxx="####" - echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile - fi -popdef([END])dnl -AS_VAR_POPDEF([SED])dnl -AS_VAR_POPDEF([AUX])dnl -AS_VAR_POPDEF([SRC])dnl -AS_VAR_POPDEF([TOP])dnl -AS_VAR_POPDEF([SUB])dnl -],[dnl -ax_enable_builddir_srcdir="$srcdir" # $srcdir -ax_enable_builddir_host="$HOST" # $HOST / $host -ax_enable_builddir_version="$VERSION" # $VERSION -ax_enable_builddir_package="$PACKAGE" # $PACKAGE -ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX -ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED -ax_enable_builddir="$ax_enable_builddir" # $SUB -])dnl -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4 deleted file mode 100644 index aab2661c3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4 +++ /dev/null @@ -1,225 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) -# -# DESCRIPTION -# -# This macro tries to guess the "native" arch corresponding to the target -# architecture for use with gcc's -march=arch or -mtune=arch flags. If -# found, the cache variable $ax_cv_gcc_archflag is set to this flag and -# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to -# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is -# to add $ax_cv_gcc_archflag to the end of $CFLAGS. -# -# PORTABLE? should be either [yes] (default) or [no]. In the former case, -# the flag is set to -mtune (or equivalent) so that the architecture is -# only used for tuning, but the instruction set used is still portable. In -# the latter case, the flag is set to -march (or equivalent) so that -# architecture-specific instructions are enabled. -# -# The user can specify --with-gcc-arch= in order to override the -# macro's choice of architecture, or --without-gcc-arch to disable this. -# -# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is -# called unless the user specified --with-gcc-arch manually. -# -# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID -# -# (The main emphasis here is on recent CPUs, on the principle that doing -# high-performance computing on old hardware is uncommon.) -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# Copyright (c) 2012 Tsukasa Oi -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -AC_DEFUN([AX_GCC_ARCHFLAG], -[AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_CANONICAL_HOST]) - -AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], - ax_gcc_arch=$withval, ax_gcc_arch=yes) - -AC_MSG_CHECKING([for gcc architecture flag]) -AC_MSG_RESULT([]) -AC_CACHE_VAL(ax_cv_gcc_archflag, -[ -ax_cv_gcc_archflag="unknown" - -if test "$GCC" = yes; then - -if test "x$ax_gcc_arch" = xyes; then -ax_gcc_arch="" -if test "$cross_compiling" = no; then -case $host_cpu in - i[[3456]]86*|x86_64*) # use cpuid codes - AX_GCC_X86_CPUID(0) - AX_GCC_X86_CPUID(1) - case $ax_cv_gcc_x86_cpuid_0 in - *:756e6547:*:*) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; - *5??:*:*:*) ax_gcc_arch=pentium ;; - *0?6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6[[9de]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; - *0?6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; - *1?6c?:*:*:*|*[[23]]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; - *2?6[[ad]]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; - *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; - ?000?f3[[347]]:*:*:*|?000?f4[1347]:*:*:*|?000?f6?:*:*:*) - case $host_cpu in - x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; - *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; - esac ;; - ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; - esac ;; - *:68747541:*:*) # AMD - case $ax_cv_gcc_x86_cpuid_1 in - *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; - *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; - *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; - *60?:*:*:*) ax_gcc_arch=k7 ;; - *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; - *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; - *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; - *6[[68a]]?:*:*:*) - AX_GCC_X86_CPUID(0x80000006) # L2 cache size - case $ax_cv_gcc_x86_cpuid_0x80000006 in - *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256 - ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; - *) ax_gcc_arch="athlon-4 athlon k7" ;; - esac ;; - ?00??f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; - ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; - ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; - ?00??f??:*:*:*) ax_gcc_arch="k8" ;; - ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; - esac ;; - *:746e6543:*:*) # IDT - case $ax_cv_gcc_x86_cpuid_1 in - *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; - *58?:*:*:*) ax_gcc_arch=winchip2 ;; - *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; - *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; - esac ;; - esac - if test x"$ax_gcc_arch" = x; then # fallback - case $host_cpu in - i586*) ax_gcc_arch=pentium ;; - i686*) ax_gcc_arch=pentiumpro ;; - esac - fi - ;; - - sparc*) - AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) - cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` - cputype=`echo "$cputype" | tr -d ' -' | sed 's/SPARCIIi/SPARCII/' | tr $as_cr_LETTERS $as_cr_letters` - case $cputype in - *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; - *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; - *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; - *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; - *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; - *cypress*) ax_gcc_arch=cypress ;; - esac ;; - - alphaev5) ax_gcc_arch=ev5 ;; - alphaev56) ax_gcc_arch=ev56 ;; - alphapca56) ax_gcc_arch="pca56 ev56" ;; - alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; - alphaev6) ax_gcc_arch=ev6 ;; - alphaev67) ax_gcc_arch=ev67 ;; - alphaev68) ax_gcc_arch="ev68 ev67" ;; - alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; - alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; - alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; - - powerpc*) - cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` - cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` - case $cputype in - *750*) ax_gcc_arch="750 G3" ;; - *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; - *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; - *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; - *970*) ax_gcc_arch="970 G5 power4";; - *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; - *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; - 603ev|8240) ax_gcc_arch="$cputype 603e 603";; - *) ax_gcc_arch=$cputype ;; - esac - ax_gcc_arch="$ax_gcc_arch powerpc" - ;; -esac -fi # not cross-compiling -fi # guess arch - -if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then -for arch in $ax_gcc_arch; do - if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code - flags="-mtune=$arch" - # -mcpu=$arch and m$arch generate nonportable code on every arch except - # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. - case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac - else - flags="-march=$arch -mcpu=$arch -m$arch" - fi - for flag in $flags; do - AX_CHECK_COMPILE_FLAG($flag, [ax_cv_gcc_archflag=$flag; break]) - done - test "x$ax_cv_gcc_archflag" = xunknown || break -done -fi - -fi # $GCC=yes -]) -AC_MSG_CHECKING([for gcc architecture flag]) -AC_MSG_RESULT($ax_cv_gcc_archflag) -if test "x$ax_cv_gcc_archflag" = xunknown; then - m4_default([$3],:) -else - m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) -fi -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 deleted file mode 100644 index 7d46fee02..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 +++ /dev/null @@ -1,79 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_GCC_X86_CPUID(OP) -# -# DESCRIPTION -# -# On Pentium and later x86 processors, with gcc or a compiler that has a -# compatible syntax for inline assembly instructions, run a small program -# that executes the cpuid instruction with input OP. This can be used to -# detect the CPU type. -# -# On output, the values of the eax, ebx, ecx, and edx registers are stored -# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable -# ax_cv_gcc_x86_cpuid_OP. -# -# If the cpuid instruction fails (because you are running a -# cross-compiler, or because you are not using gcc, or because you are on -# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP -# is set to the string "unknown". -# -# This macro mainly exists to be used in AX_GCC_ARCHFLAG. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 7 - -AC_DEFUN([AX_GCC_X86_CPUID], -[AC_REQUIRE([AC_PROG_CC]) -AC_LANG_PUSH([C]) -AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, - [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ - int op = $1, eax, ebx, ecx, edx; - FILE *f; - __asm__("cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op)); - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; -])], - [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], - [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], - [ax_cv_gcc_x86_cpuid_$1=unknown])]) -AC_LANG_POP([C]) -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/libtool.m4 b/third_party/python/Modules/_ctypes/libffi/m4/libtool.m4 deleted file mode 100644 index d9cc77b84..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/libtool.m4 +++ /dev/null @@ -1,7989 +0,0 @@ -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996-2001, 2003-2013 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 58 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS=$ltmain - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl -dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options that allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld=$lt_cv_prog_gnu_ld - -old_CC=$CC -old_CFLAGS=$CFLAGS - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -]) - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from 'configure', and 'config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# 'config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain=$ac_aux_dir/ltmain.sh -])# _LT_PROG_LTMAIN - - -## ------------------------------------- ## -## Accumulate code for creating libtool. ## -## ------------------------------------- ## - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the 'libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - -## ------------------------ ## -## FIXME: Eliminate VARNAME ## -## ------------------------ ## - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to 'config.status' so that its -# declaration there will have the same value as in 'configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags='_LT_TAGS'dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into 'config.status', and then the shell code to quote escape them in -# for loops in 'config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# '#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test 0 = "$lt_write_fail" && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -'$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test 0 != $[#] -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try '$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try '$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test yes = "$silent" && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options that allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST - fi - - cfgfile=${ofile}T - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -m4_ifndef([AC_PROG_GO], [ -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_GO. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ -m4_defun([AC_PROG_GO], -[AC_LANG_PUSH(Go)dnl -AC_ARG_VAR([GOC], [Go compiler command])dnl -AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl -_AC_ARG_VAR_LDFLAGS()dnl -AC_CHECK_TOOL(GOC, gccgo) -if test -z "$GOC"; then - if test -n "$ac_tool_prefix"; then - AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) - fi -fi -if test -z "$GOC"; then - AC_CHECK_PROG(GOC, gccgo, gccgo, false) -fi -])#m4_defun -])#m4_ifndef - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([AC_PROG_GO], - [LT_LANG(GO)], - [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "$LT_MULTI_MODULE"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test 0 = "$_lt_result"; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS=$save_LDFLAGS - ]) - - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test yes = "$lt_cv_apple_cc_single_mod"; then - _lt_dar_single_mod='$single_module' - fi - if test yes = "$lt_cv_ld_exported_symbols_list"; then - _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' - fi - if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES([TAG]) -# --------------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test yes = "$lt_cv_ld_force_load"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], - [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - m4_if([$1], [CXX], -[ if test yes != "$lt_cv_apple_cc_single_mod"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -# Store the results from the different compilers for each TAGNAME. -# Allow overriding them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib - fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) -fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script that will find a shell with a builtin -# printf (that we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -case $ECHO in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], - [Search for dependent libraries within DIR (or the compiler's sysroot - if not specified).])], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case $with_sysroot in #( - yes) - if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([$with_sysroot]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and where our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test no = "$enable_libtool_lock" || enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out what ABI is being produced by ac_compile, and set mode - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE=32 - ;; - *ELF-64*) - HPUX_IA64_MODE=64 - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test yes = "$lt_cv_prog_gnu_ld"; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -mips64*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - emul=elf - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - emul="${emul}32" - ;; - *64-bit*) - emul="${emul}64" - ;; - esac - case `/usr/bin/file conftest.$ac_objext` in - *MSB*) - emul="${emul}btsmip" - ;; - *LSB*) - emul="${emul}ltsmip" - ;; - esac - case `/usr/bin/file conftest.$ac_objext` in - *N32*) - emul="${emul}n32" - ;; - esac - LD="${LD-ld} -m $emul" - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. Note that the listed cases only cover the - # situations where additional linker options are needed (such as when - # doing 32-bit compilation for a host where ld defaults to 64-bit, or - # vice versa); the common cases where no linker options are needed do - # not appear in the list. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - case `/usr/bin/file conftest.o` in - *x86-64*) - LD="${LD-ld} -m elf32_x86_64" - ;; - *) - LD="${LD-ld} -m elf_i386" - ;; - esac - ;; - powerpc64le-*linux*) - LD="${LD-ld} -m elf32lppclinux" - ;; - powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - powerpcle-*linux*) - LD="${LD-ld} -m elf64lppc" - ;; - powerpc-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test yes != "$lt_cv_cc_needs_belf"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS=$SAVE_CFLAGS - fi - ;; -*-*solaris*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*|x86_64-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD=${LD-ld}_sol2 - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks=$enable_libtool_lock -])# _LT_ENABLE_LOCK - - -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test 0 -eq "$ac_status"; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test 0 -ne "$ac_status"; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test no = "$lt_cv_ar_at_file"; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test yes = "[$]$2"; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS -]) - -if test yes = "[$]$2"; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring=ABCD - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test X`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test 17 != "$i" # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n "$lt_cv_sys_max_cmd_len"; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test yes = "$cross_compiling"; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test yes != "$enable_dlopen"; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen=load_add_on - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen=LoadLibrary - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ - lt_cv_dlopen=dyld - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - tpf*) - # Don't try to run any link tests for TPF. We know it's impossible - # because TPF is a cross-compiler, and we know how we open DSOs. - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - lt_cv_dlopen_self=no - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen=shl_load], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen=dlopen], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test no = "$lt_cv_dlopen"; then - enable_dlopen=no - else - enable_dlopen=yes - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS=$CPPFLAGS - test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS=$LDFLAGS - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS=$LIBS - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test yes = "$lt_cv_dlopen_self"; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS - LIBS=$save_LIBS - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links=nottested -if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test no = "$hard_links"; then - AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", - [Define to the sub-directory where libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then - - # We can hardcode non-existent directories. - if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && - test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || - test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test yes = "$GCC"; then - case $host_os in - darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; - *) lt_awk_arg='/^libraries:/' ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; - *) lt_sed_strip_eq='s|=/|/|g' ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary... - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path component already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). - case "$lt_multi_os_dir; $lt_search_path_spec " in - "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) - lt_multi_os_dir= - ;; - esac - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" - elif test -n "$lt_multi_os_dir"; then - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS = " "; FS = "/|\n";} { - lt_foo = ""; - lt_count = 0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo = "/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; - -aix[[4-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test yes = "$aix_use_runtimelinking"; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[23]].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[[3-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -os2*) - libname_spec='$name' - shrext_cmds=.dll - need_lib_prefix=no - library_names_spec='$libname$shared_ext $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test no = "$dynamic_linker" && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program that can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$1"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac]) -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program that can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test no = "$withval" || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd* | bitrig*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM=$NM -else - lt_nm_to_check=${ac_tool_prefix}nm - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/$lt_tmp_nm - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the 'sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break 2 - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break 2 - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS=$lt_save_ifs - done - : ${lt_cv_path_NM=no} -fi]) -if test no != "$lt_cv_path_NM"; then - NM=$lt_cv_path_NM -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols -headers" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test : != "$DUMPBIN"; then - NM=$DUMPBIN - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh; - # decide which one to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd=$ECHO - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB - - -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test yes != "$lt_cv_path_mainfest_tool"; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# _LT_DLL_DEF_P([FILE]) -# --------------------- -# True iff FILE is a Windows DLL '.def' file. -# Keep in sync with func_dll_def_p in the libtool script -AC_DEFUN([_LT_DLL_DEF_P], -[dnl - test DEF = "`$SED -n dnl - -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace - -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments - -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl - -e q dnl Only consider the first "real" line - $1`" dnl -])# _LT_DLL_DEF_P - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM=-lm) - ;; -esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test yes = "$GCC"; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; - *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; - esac - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test ia64 = "$host_cpu"; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Gets list of data symbols to import. - lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" - # Adjust the below global symbol transforms to fixup imported variables. - lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" - lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" - lt_c_name_lib_hook="\ - -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ - -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" -else - # Disable hooks by default. - lt_cv_sys_global_symbol_to_import= - lt_cdecl_hook= - lt_c_name_hook= - lt_c_name_lib_hook= -fi - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n"\ -$lt_cdecl_hook\ -" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ -$lt_c_name_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" - -# Transform an extracted symbol line into symbol name with lib prefix and -# symbol address. -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ -$lt_c_name_lib_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function, - # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ -" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ -" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ -" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ -" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS=conftstm.$ac_objext - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test yes = "$pipe_works"; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], - [Transform the output of nm into a list of symbols to manually relocate]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], - [The name lister interface]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test yes = "$GXX"; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' - if test ia64 != "$host_cpu"; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64, which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test yes = "$GCC"; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - case $cc_basename in - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64, which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ F* | *Sun*Fortran*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - *Intel*\ [[CF]]*Compiler*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - *Portland\ Group*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - case $host_os in - aix[[4-9]]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ' (' and ')$', so one must not match beginning or - # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', - # as well as any symbol that contains 'd'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test yes != "$GCC"; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test yes = "$with_gnu_ld"; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test yes = "$lt_use_gnu_ld_interface"; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='$wl' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test ia64 != "$host_cpu"; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test linux-dietlibc = "$host_os"; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test no = "$tmp_diet" - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - nagfor*) # NAGFOR 5.3 - tmp_sharedflag='-Wl,-shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - - if test yes = "$supports_anon_versioning"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test yes = "$supports_anon_versioning"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='$wl-f,' - - if test yes = "$GCC"; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag="$shared_flag "'$wl-G' - fi - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test yes = "$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $wl-bnoentry $compiler_flags $wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test yes = "$GCC"; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - ;; - - hpux10*) - if test yes,no = "$GCC,$with_gnu_ld"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test no = "$with_gnu_ld"; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test yes,no = "$GCC,$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) - ;; - esac - fi - if test no = "$with_gnu_ld"; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test yes = "$GCC"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS=$save_LDFLAGS]) - if test yes = "$lt_cv_irix_exported_symbol"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' - fi - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test yes = "$GCC"; then - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test yes = "$GCC"; then - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test yes = "$GCC"; then - wlarc='$wl' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='$wl' - _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. GCC discards it without '$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test yes = "$GCC"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test sequent = "$host_vendor"; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test sni = "$host_vendor"; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test yes,yes = "$GCC,$enable_shared"; then - case $_LT_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting $shlibpath_var if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC=$CC -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report what library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test no = "$can_build_shared" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test ia64 != "$host_cpu" && test no = "$aix_use_runtimelinking"; then - test yes = "$enable_shared" && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC=$lt_save_CC -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test no != "$CXX" && - ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || - (test g++ != "$CXX"))); then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test yes != "$_lt_caught_CXX_error"; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test yes = "$GXX"; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test yes = "$GXX"; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test yes = "$with_gnu_ld"; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='$wl' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='$wl-f,' - - if test yes = "$GXX"; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag=$shared_flag' $wl-G' - fi - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test yes = "$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $wl-bnoentry $compiler_flags $wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test no = "$with_gnu_ld"; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test yes = "$supports_anon_versioning"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes,no = "$GXX,$with_gnu_ld"; then - _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test yes,no = "$GXX,$with_gnu_ld"; then - _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require '-G' NOT '-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no - - _LT_TAGVAR(GCC, $1)=$GXX - _LT_TAGVAR(LD, $1)=$LD - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test yes != "$_lt_caught_CXX_error" - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case @S|@2 in - .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; - *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF - -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) -# --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF -package foo -func foo() { -} -_LT_EOF -]) - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case $prev$p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test x-L = "$p" || - test x-R = "$p"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test no = "$pre_test_object_deps_done"; then - case $prev in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)=$prev$p - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test no = "$pre_test_object_deps_done"; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)=$p - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)=$p - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test no = "$F77"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test yes != "$_lt_disable_F77"; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test no = "$can_build_shared" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test ia64 != "$host_cpu" && test no = "$aix_use_runtimelinking"; then - test yes = "$enable_shared" && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)=$G77 - _LT_TAGVAR(LD, $1)=$LD - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test yes != "$_lt_disable_F77" - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test no = "$FC"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test yes != "$_lt_disable_FC"; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test no = "$can_build_shared" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test ia64 != "$host_cpu" && test no = "$aix_use_runtimelinking"; then - test yes = "$enable_shared" && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu - _LT_TAGVAR(LD, $1)=$LD - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test yes != "$_lt_disable_FC" - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)=$LD -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_GO_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Go compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_GO_CONFIG], -[AC_REQUIRE([LT_PROG_GO])dnl -AC_LANG_SAVE - -# Source file extension for Go test sources. -ac_ext=go - -# Object file extension for compiled Go test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="package main; func main() { }" - -# Code to be used in simple link tests -lt_simple_link_test_code='package main; func main() { }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GOC-"gccgo"} -CFLAGS=$GOFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)=$LD -_LT_CC_BASENAME([$compiler]) - -# Go did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GO_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to 'libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code=$lt_simple_compile_test_code - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_GO -# ---------- -AC_DEFUN([LT_PROG_GO], -[AC_CHECK_TOOL(GOC, gccgo,) -]) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL -# ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f "$lt_ac_sed" && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test 10 -lt "$lt_ac_count" && break - lt_ac_count=`expr $lt_ac_count + 1` - if test "$lt_ac_count" -gt "$lt_ac_max"; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine what file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ltoptions.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ltoptions.m4 deleted file mode 100644 index 50c77236c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ltoptions.m4 +++ /dev/null @@ -1,382 +0,0 @@ -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004-2005, 2007-2009, 2011-2013 Free Software -# Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 8 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option '$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl 'shared' nor 'disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - -## --------------------------------- ## -## Macros to handle LT_INIT options. ## -## --------------------------------- ## - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the 'dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the 'win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the 'shared' and -# 'disable-shared' LT_INIT options. -# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS=$lt_save_ifs - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the 'static' and -# 'disable-static' LT_INIT options. -# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the 'fast-install' -# and 'disable-fast-install' LT_INIT options. -# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS=$lt_save_ifs - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the 'fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the 'disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' -# LT_INIT options. -# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for lt_pkg in $withval; do - IFS=$lt_save_ifs - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS=$lt_save_ifs - ;; - esac], - [pic_mode=m4_default([$1], [default])]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the 'pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - -## ----------------- ## -## LTDL_INIT Options ## -## ----------------- ## - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ltsugar.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ltsugar.m4 deleted file mode 100644 index 7cbc638b6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ltsugar.m4 +++ /dev/null @@ -1,124 +0,0 @@ -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004-2005, 2007-2008, 2011-2013 Free Software -# Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59, which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/ltversion.m4 b/third_party/python/Modules/_ctypes/libffi/m4/ltversion.m4 deleted file mode 100644 index daeb0af7a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/ltversion.m4 +++ /dev/null @@ -1,23 +0,0 @@ -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004, 2011-2013 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 4038 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4.2.418]) -m4_define([LT_PACKAGE_REVISION], [2.4.2.418]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2.418' -macro_revision='2.4.2.418' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) diff --git a/third_party/python/Modules/_ctypes/libffi/m4/lt~obsolete.m4 b/third_party/python/Modules/_ctypes/libffi/m4/lt~obsolete.m4 deleted file mode 100644 index 59461e458..000000000 --- a/third_party/python/Modules/_ctypes/libffi/m4/lt~obsolete.m4 +++ /dev/null @@ -1,99 +0,0 @@ -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004-2005, 2007, 2009, 2011-2013 Free Software -# Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/third_party/python/Modules/_ctypes/libffi/man/Makefile.am b/third_party/python/Modules/_ctypes/libffi/man/Makefile.am deleted file mode 100644 index afcbfb69f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - diff --git a/third_party/python/Modules/_ctypes/libffi/man/Makefile.in b/third_party/python/Modules/_ctypes/libffi/man/Makefile.in deleted file mode 100644 index d92af74fb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/Makefile.in +++ /dev/null @@ -1,541 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = man -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/m4/ax_compiler_vendor.m4 \ - $(top_srcdir)/m4/ax_configure_args.m4 \ - $(top_srcdir)/m4/ax_enable_builddir.m4 \ - $(top_srcdir)/m4/ax_gcc_archflag.m4 \ - $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -man3dir = $(mandir)/man3 -am__installdirs = "$(DESTDIR)$(man3dir)" -NROFF = nroff -MANS = $(man_MANS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AM_LTLDFLAGS = @AM_LTLDFLAGS@ -AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ -HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PRTDIAG = @PRTDIAG@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TARGET = @TARGET@ -TARGETDIR = @TARGETDIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -ax_enable_builddir_sed = @ax_enable_builddir_sed@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sys_symbol_underscore = @sys_symbol_underscore@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -toolexecdir = @toolexecdir@ -toolexeclibdir = @toolexeclibdir@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = foreign -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign man/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man3: $(man_MANS) - @$(NORMAL_INSTALL) - @list1=''; \ - list2='$(man_MANS)'; \ - test -n "$(man3dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.3[a-z]*$$/p'; \ - fi; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ - done; } - -uninstall-man3: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man3dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.3[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man3dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man3 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man3 - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - cscopelist-am ctags-am distclean distclean-generic \ - distclean-libtool distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man3 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags-am uninstall uninstall-am uninstall-man \ - uninstall-man3 - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/third_party/python/Modules/_ctypes/libffi/man/ffi.3 b/third_party/python/Modules/_ctypes/libffi/man/ffi.3 deleted file mode 100644 index 1f1d3031c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/ffi.3 +++ /dev/null @@ -1,41 +0,0 @@ -.Dd February 15, 2008 -.Dt FFI 3 -.Sh NAME -.Nm FFI -.Nd Foreign Function Interface -.Sh LIBRARY -libffi, -lffi -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Ft void -.Fo ffi_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Ft void -.Fo ffi_call -.Fa "ffi_cif *cif" -.Fa "void (*fn)(void)" -.Fa "void *rvalue" -.Fa "void **avalue" -.Fc -.Sh DESCRIPTION -The foreign function interface provides a mechanism by which a function can -generate a call to another function at runtime without requiring knowledge of -the called function's interface at compile time. -.Sh SEE ALSO -.Xr ffi_prep_cif 3 , -.Xr ffi_prep_cif_var 3 , -.Xr ffi_call 3 diff --git a/third_party/python/Modules/_ctypes/libffi/man/ffi_call.3 b/third_party/python/Modules/_ctypes/libffi/man/ffi_call.3 deleted file mode 100644 index 5351513f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/ffi_call.3 +++ /dev/null @@ -1,103 +0,0 @@ -.Dd February 15, 2008 -.Dt ffi_call 3 -.Sh NAME -.Nm ffi_call -.Nd Invoke a foreign function. -.Sh SYNOPSIS -.In ffi.h -.Ft void -.Fo ffi_call -.Fa "ffi_cif *cif" -.Fa "void (*fn)(void)" -.Fa "void *rvalue" -.Fa "void **avalue" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_call -function provides a simple mechanism for invoking a function without -requiring knowledge of the function's interface at compile time. -.Fa fn -is called with the values retrieved from the pointers in the -.Fa avalue -array. The return value from -.Fa fn -is placed in storage pointed to by -.Fa rvalue . -.Fa cif -contains information describing the data types, sizes and alignments of the -arguments to and return value from -.Fa fn , -and must be initialized with -.Nm ffi_prep_cif -before it is used with -.Nm ffi_call . -.Pp -.Fa rvalue -must point to storage that is sizeof(ffi_arg) or larger for non-floating point -types. For smaller-sized return value types, the -.Nm ffi_arg -or -.Nm ffi_sarg -integral type must be used to hold -the return value. -.Sh EXAMPLES -.Bd -literal -#include -#include - -unsigned char -foo(unsigned int, float); - -int -main(int argc, const char **argv) -{ - ffi_cif cif; - ffi_type *arg_types[2]; - void *arg_values[2]; - ffi_status status; - - // Because the return value from foo() is smaller than sizeof(long), it - // must be passed as ffi_arg or ffi_sarg. - ffi_arg result; - - // Specify the data type of each argument. Available types are defined - // in . - arg_types[0] = &ffi_type_uint; - arg_types[1] = &ffi_type_float; - - // Prepare the ffi_cif structure. - if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, - 2, &ffi_type_uint8, arg_types)) != FFI_OK) - { - // Handle the ffi_status error. - } - - // Specify the values of each argument. - unsigned int arg1 = 42; - float arg2 = 5.1; - - arg_values[0] = &arg1; - arg_values[1] = &arg2; - - // Invoke the function. - ffi_call(&cif, FFI_FN(foo), &result, arg_values); - - // The ffi_arg 'result' now contains the unsigned char returned from foo(), - // which can be accessed by a typecast. - printf("result is %hhu", (unsigned char)result); - - return 0; -} - -// The target function. -unsigned char -foo(unsigned int x, float y) -{ - unsigned char result = x - y; - return result; -} -.Ed -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_prep_cif 3 diff --git a/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif.3 b/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif.3 deleted file mode 100644 index ab2be8adc..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif.3 +++ /dev/null @@ -1,68 +0,0 @@ -.Dd February 15, 2008 -.Dt ffi_prep_cif 3 -.Sh NAME -.Nm ffi_prep_cif -.Nd Prepare a -.Nm ffi_cif -structure for use with -.Nm ffi_call -. -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_prep_cif -function prepares a -.Nm ffi_cif -structure for use with -.Nm ffi_call -. -.Fa abi -specifies a set of calling conventions to use. -.Fa atypes -is an array of -.Fa nargs -pointers to -.Nm ffi_type -structs that describe the data type, size and alignment of each argument. -.Fa rtype -points to an -.Nm ffi_type -that describes the data type, size and alignment of the -return value. Note that to call a variadic function -.Nm ffi_prep_cif_var -must be used instead. -.Sh RETURN VALUES -Upon successful completion, -.Nm ffi_prep_cif -returns -.Nm FFI_OK . -It will return -.Nm FFI_BAD_TYPEDEF -if -.Fa cif -is -.Nm NULL -or -.Fa atypes -or -.Fa rtype -is malformed. If -.Fa abi -does not refer to a valid ABI, -.Nm FFI_BAD_ABI -will be returned. Available ABIs are -defined in -.Nm . -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_call 3 , -.Xr ffi_prep_cif_var 3 diff --git a/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3 b/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3 deleted file mode 100644 index 7e19d0b07..000000000 --- a/third_party/python/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3 +++ /dev/null @@ -1,73 +0,0 @@ -.Dd January 25, 2011 -.Dt ffi_prep_cif_var 3 -.Sh NAME -.Nm ffi_prep_cif_var -.Nd Prepare a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_prep_cif_var -function prepares a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Fa abi -specifies a set of calling conventions to use. -.Fa atypes -is an array of -.Fa ntotalargs -pointers to -.Nm ffi_type -structs that describe the data type, size and alignment of each argument. -.Fa rtype -points to an -.Nm ffi_type -that describes the data type, size and alignment of the -return value. -.Fa nfixedargs -must contain the number of fixed (non-variadic) arguments. -Note that to call a non-variadic function -.Nm ffi_prep_cif -must be used. -.Sh RETURN VALUES -Upon successful completion, -.Nm ffi_prep_cif_var -returns -.Nm FFI_OK . -It will return -.Nm FFI_BAD_TYPEDEF -if -.Fa cif -is -.Nm NULL -or -.Fa atypes -or -.Fa rtype -is malformed. If -.Fa abi -does not refer to a valid ABI, -.Nm FFI_BAD_ABI -will be returned. Available ABIs are -defined in -.Nm -. -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_call 3 , -.Xr ffi_prep_cif 3 diff --git a/third_party/python/Modules/_ctypes/libffi/mdate-sh b/third_party/python/Modules/_ctypes/libffi/mdate-sh deleted file mode 100755 index b3719cf76..000000000 --- a/third_party/python/Modules/_ctypes/libffi/mdate-sh +++ /dev/null @@ -1,224 +0,0 @@ -#!/bin/sh -# Get modification time of a file or directory and pretty-print it. - -scriptversion=2010-08-21.06; # UTC - -# Copyright (C) 1995-2013 Free Software Foundation, Inc. -# written by Ulrich Drepper , June 1995 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -fi - -case $1 in - '') - echo "$0: No file. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: mdate-sh [--help] [--version] FILE - -Pretty-print the modification day of FILE, in the format: -1 January 1970 - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "mdate-sh $scriptversion" - exit $? - ;; -esac - -error () -{ - echo "$0: $1" >&2 - exit 1 -} - - -# Prevent date giving response in another language. -LANG=C -export LANG -LC_ALL=C -export LC_ALL -LC_TIME=C -export LC_TIME - -# GNU ls changes its time format in response to the TIME_STYLE -# variable. Since we cannot assume 'unset' works, revert this -# variable to its documented default. -if test "${TIME_STYLE+set}" = set; then - TIME_STYLE=posix-long-iso - export TIME_STYLE -fi - -save_arg1=$1 - -# Find out how to get the extended ls output of a file or directory. -if ls -L /dev/null 1>/dev/null 2>&1; then - ls_command='ls -L -l -d' -else - ls_command='ls -l -d' -fi -# Avoid user/group names that might have spaces, when possible. -if ls -n /dev/null 1>/dev/null 2>&1; then - ls_command="$ls_command -n" -fi - -# A 'ls -l' line looks as follows on OS/2. -# drwxrwx--- 0 Aug 11 2001 foo -# This differs from Unix, which adds ownership information. -# drwxrwx--- 2 root root 4096 Aug 11 2001 foo -# -# To find the date, we split the line on spaces and iterate on words -# until we find a month. This cannot work with files whose owner is a -# user named "Jan", or "Feb", etc. However, it's unlikely that '/' -# will be owned by a user whose name is a month. So we first look at -# the extended ls output of the root directory to decide how many -# words should be skipped to get the date. - -# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. -set x`$ls_command /` - -# Find which argument is the month. -month= -command= -until test $month -do - test $# -gt 0 || error "failed parsing '$ls_command /' output" - shift - # Add another shift to the command. - command="$command shift;" - case $1 in - Jan) month=January; nummonth=1;; - Feb) month=February; nummonth=2;; - Mar) month=March; nummonth=3;; - Apr) month=April; nummonth=4;; - May) month=May; nummonth=5;; - Jun) month=June; nummonth=6;; - Jul) month=July; nummonth=7;; - Aug) month=August; nummonth=8;; - Sep) month=September; nummonth=9;; - Oct) month=October; nummonth=10;; - Nov) month=November; nummonth=11;; - Dec) month=December; nummonth=12;; - esac -done - -test -n "$month" || error "failed parsing '$ls_command /' output" - -# Get the extended ls output of the file or directory. -set dummy x`eval "$ls_command \"\\\$save_arg1\""` - -# Remove all preceding arguments -eval $command - -# Because of the dummy argument above, month is in $2. -# -# On a POSIX system, we should have -# -# $# = 5 -# $1 = file size -# $2 = month -# $3 = day -# $4 = year or time -# $5 = filename -# -# On Darwin 7.7.0 and 7.6.0, we have -# -# $# = 4 -# $1 = day -# $2 = month -# $3 = year or time -# $4 = filename - -# Get the month. -case $2 in - Jan) month=January; nummonth=1;; - Feb) month=February; nummonth=2;; - Mar) month=March; nummonth=3;; - Apr) month=April; nummonth=4;; - May) month=May; nummonth=5;; - Jun) month=June; nummonth=6;; - Jul) month=July; nummonth=7;; - Aug) month=August; nummonth=8;; - Sep) month=September; nummonth=9;; - Oct) month=October; nummonth=10;; - Nov) month=November; nummonth=11;; - Dec) month=December; nummonth=12;; -esac - -case $3 in - ???*) day=$1;; - *) day=$3; shift;; -esac - -# Here we have to deal with the problem that the ls output gives either -# the time of day or the year. -case $3 in - *:*) set `date`; eval year=\$$# - case $2 in - Jan) nummonthtod=1;; - Feb) nummonthtod=2;; - Mar) nummonthtod=3;; - Apr) nummonthtod=4;; - May) nummonthtod=5;; - Jun) nummonthtod=6;; - Jul) nummonthtod=7;; - Aug) nummonthtod=8;; - Sep) nummonthtod=9;; - Oct) nummonthtod=10;; - Nov) nummonthtod=11;; - Dec) nummonthtod=12;; - esac - # For the first six month of the year the time notation can also - # be used for files modified in the last year. - if (expr $nummonth \> $nummonthtod) > /dev/null; - then - year=`expr $year - 1` - fi;; - *) year=$3;; -esac - -# The result. -echo $day $month $year - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/missing b/third_party/python/Modules/_ctypes/libffi/missing deleted file mode 100755 index cdea51493..000000000 --- a/third_party/python/Modules/_ctypes/libffi/missing +++ /dev/null @@ -1,215 +0,0 @@ -#! /bin/sh -# Common wrapper for a few potentially missing GNU programs. - -scriptversion=2012-06-26.16; # UTC - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# Originally written by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try '$0 --help' for more information" - exit 1 -fi - -case $1 in - - --is-lightweight) - # Used by our autoconf macros to check whether the available missing - # script is modern enough. - exit 0 - ;; - - --run) - # Back-compat with the calling convention used by older automake. - shift - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due -to PROGRAM being missing or too old. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal autoconf autoheader autom4te automake makeinfo - bison yacc flex lex help2man - -Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and -'g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: unknown '$1' option" - echo 1>&2 "Try '$0 --help' for more information" - exit 1 - ;; - -esac - -# Run the given program, remember its exit status. -"$@"; st=$? - -# If it succeeded, we are done. -test $st -eq 0 && exit 0 - -# Also exit now if we it failed (or wasn't found), and '--version' was -# passed; such an option is passed most likely to detect whether the -# program is present and works. -case $2 in --version|--help) exit $st;; esac - -# Exit code 63 means version mismatch. This often happens when the user -# tries to use an ancient version of a tool on a file that requires a -# minimum version. -if test $st -eq 63; then - msg="probably too old" -elif test $st -eq 127; then - # Program was missing. - msg="missing on your system" -else - # Program was found and executed, but failed. Give up. - exit $st -fi - -perl_URL=http://www.perl.org/ -flex_URL=http://flex.sourceforge.net/ -gnu_software_URL=http://www.gnu.org/software - -program_details () -{ - case $1 in - aclocal|automake) - echo "The '$1' program is part of the GNU Automake package:" - echo "<$gnu_software_URL/automake>" - echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/autoconf>" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - autoconf|autom4te|autoheader) - echo "The '$1' program is part of the GNU Autoconf package:" - echo "<$gnu_software_URL/autoconf/>" - echo "It also requires GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - esac -} - -give_advice () -{ - # Normalize program name to check for. - normalized_program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - - printf '%s\n' "'$1' is $msg." - - configure_deps="'configure.ac' or m4 files included by 'configure.ac'" - case $normalized_program in - autoconf*) - echo "You should only need it if you modified 'configure.ac'," - echo "or m4 files included by it." - program_details 'autoconf' - ;; - autoheader*) - echo "You should only need it if you modified 'acconfig.h' or" - echo "$configure_deps." - program_details 'autoheader' - ;; - automake*) - echo "You should only need it if you modified 'Makefile.am' or" - echo "$configure_deps." - program_details 'automake' - ;; - aclocal*) - echo "You should only need it if you modified 'acinclude.m4' or" - echo "$configure_deps." - program_details 'aclocal' - ;; - autom4te*) - echo "You might have modified some maintainer files that require" - echo "the 'automa4te' program to be rebuilt." - program_details 'autom4te' - ;; - bison*|yacc*) - echo "You should only need it if you modified a '.y' file." - echo "You may want to install the GNU Bison package:" - echo "<$gnu_software_URL/bison/>" - ;; - lex*|flex*) - echo "You should only need it if you modified a '.l' file." - echo "You may want to install the Fast Lexical Analyzer package:" - echo "<$flex_URL>" - ;; - help2man*) - echo "You should only need it if you modified a dependency" \ - "of a man page." - echo "You may want to install the GNU Help2man package:" - echo "<$gnu_software_URL/help2man/>" - ;; - makeinfo*) - echo "You should only need it if you modified a '.texi' file, or" - echo "any other file indirectly affecting the aspect of the manual." - echo "You might want to install the Texinfo package:" - echo "<$gnu_software_URL/texinfo/>" - echo "The spurious makeinfo call might also be the consequence of" - echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" - echo "want to install GNU make:" - echo "<$gnu_software_URL/make/>" - ;; - *) - echo "You might have modified some files without having the proper" - echo "tools for further handling them. Check the 'README' file, it" - echo "often tells you about the needed prerequisites for installing" - echo "this package. You may also peek at any GNU archive site, in" - echo "case some other package contains this missing '$1' program." - ;; - esac -} - -give_advice "$1" | sed -e '1s/^/WARNING: /' \ - -e '2,$s/^/ /' >&2 - -# Propagate the correct exit status (expected to be 127 for a program -# not found, 63 for a program that failed due to version mismatch). -exit $st - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/msvcc.sh b/third_party/python/Modules/_ctypes/libffi/msvcc.sh deleted file mode 100755 index 7440deb34..000000000 --- a/third_party/python/Modules/_ctypes/libffi/msvcc.sh +++ /dev/null @@ -1,233 +0,0 @@ -#!/bin/sh - -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the MSVC wrappificator. -# -# The Initial Developer of the Original Code is -# Timothy Wall . -# Portions created by the Initial Developer are Copyright (C) 2009 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Daniel Witte -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -# -# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC -# format and translated into something sensible for cl or ml. -# - -args_orig=$@ -args="-nologo -W3" -md=-MD -cl="cl" -ml="ml" -safeseh="-safeseh" -output= - -while [ $# -gt 0 ] -do - case $1 - in - -fexceptions) - # Don't enable exceptions for now. - #args="$args -EHac" - shift 1 - ;; - -m32) - shift 1 - ;; - -m64) - cl="cl" # "$MSVC/x86_amd64/cl" - ml="ml64" # "$MSVC/x86_amd64/ml64" - safeseh= - shift 1 - ;; - -O0) - args="$args -Od" - shift 1 - ;; - -O*) - # Runtime error checks (enabled by setting -RTC1 in the -DFFI_DEBUG - # case below) are not compatible with optimization flags and will - # cause the build to fail. Therefore, drop the optimization flag if - # -DFFI_DEBUG is also set. - case $args_orig in - *-DFFI_DEBUG*) - args="$args" - ;; - *) - # The ax_cc_maxopt.m4 macro from the upstream autoconf-archive - # project doesn't support MSVC and therefore ends up trying to - # use -O3. Use the equivalent "max optimization" flag for MSVC - # instead of erroring out. - case $1 in - -O3) - args="$args -O2" - ;; - *) - args="$args $1" - ;; - esac - opt="true" - ;; - esac - shift 1 - ;; - -g) - # Enable debug symbol generation. - args="$args -Zi" - shift 1 - ;; - -DFFI_DEBUG) - # Link against debug CRT and enable runtime error checks. - args="$args -RTC1" - defines="$defines $1" - md=-MDd - shift 1 - ;; - -c) - args="$args -c" - args="$(echo $args | sed 's%/Fe%/Fo%g')" - single="-c" - shift 1 - ;; - -D*=*) - name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')" - value="$(echo $1|sed 's/-D[^=][^=]*=//g')" - args="$args -D${name}='$value'" - defines="$defines -D${name}='$value'" - shift 1 - ;; - -D*) - args="$args $1" - defines="$defines $1" - shift 1 - ;; - -I) - args="$args -I$2" - includes="$includes -I$2" - shift 2 - ;; - -I*) - args="$args $1" - includes="$includes $1" - shift 1 - ;; - -W|-Wextra) - # TODO map extra warnings - shift 1 - ;; - -Wall) - # -Wall on MSVC is overzealous, and we already build with -W3. Nothing - # to do here. - shift 1 - ;; - -pedantic) - # libffi tests -pedantic with -Wall, so drop it also. - shift 1 - ;; - -Werror) - args="$args -WX" - shift 1 - ;; - -W*) - # TODO map specific warnings - shift 1 - ;; - -S) - args="$args -FAs" - shift 1 - ;; - -o) - outdir="$(dirname $2)" - base="$(basename $2|sed 's/\.[^.]*//g')" - if [ -n "$single" ]; then - output="-Fo$2" - else - output="-Fe$2" - fi - if [ -n "$assembly" ]; then - args="$args $output" - else - args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base" - fi - shift 2 - ;; - *.S) - src=$1 - assembly="true" - shift 1 - ;; - *.c) - args="$args $1" - shift 1 - ;; - *) - # Assume it's an MSVC argument, and pass it through. - args="$args $1" - shift 1 - ;; - esac -done - -# If -Zi is specified, certain optimizations are implicitly disabled -# by MSVC. Add back those optimizations if this is an optimized build. -# NOTE: These arguments must come after all others. -if [ -n "$opt" ]; then - args="$args -link -OPT:REF -OPT:ICF -INCREMENTAL:NO" -fi - -if [ -n "$assembly" ]; then - if [ -z "$outdir" ]; then - outdir="." - fi - ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" - echo "$cl -nologo -EP $includes $defines $src > $ppsrc" - "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $? - output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" - args="-nologo $safeseh $single $output $ppsrc" - - echo "$ml $args" - eval "\"$ml\" $args" - result=$? - - # required to fix ml64 broken output? - #mv *.obj $outdir -else - args="$md $args" - echo "$cl $args" - # Return an error code of 1 if an invalid command line parameter is passed - # instead of just ignoring it. - eval "(\"$cl\" $args 2>&1 1>&3 | \ - awk '{print \$0} /D9002/ {error=1} END{exit error}' >&2) 3>&1" - result=$? -fi - -exit $result - diff --git a/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffi.c deleted file mode 100644 index b807a2d38..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffi.c +++ /dev/null @@ -1,1168 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -#include - -#include -#include - -#include - -/* Stack alignment requirement in bytes */ -#if defined (__APPLE__) -#define AARCH64_STACK_ALIGN 1 -#else -#define AARCH64_STACK_ALIGN 16 -#endif - -#define N_X_ARG_REG 8 -#define N_V_ARG_REG 8 - -#define AARCH64_FFI_WITH_V (1 << AARCH64_FFI_WITH_V_BIT) - -union _d -{ - UINT64 d; - UINT32 s[2]; -}; - -struct call_context -{ - UINT64 x [AARCH64_N_XREG]; - struct - { - union _d d[2]; - } v [AARCH64_N_VREG]; -}; - -#if defined (__clang__) && defined (__APPLE__) -extern void -sys_icache_invalidate (void *start, size_t len); -#endif - -static inline void -ffi_clear_cache (void *start, void *end) -{ -#if defined (__clang__) && defined (__APPLE__) - sys_icache_invalidate (start, (char *)end - (char *)start); -#elif defined (__GNUC__) - __builtin___clear_cache (start, end); -#else -#error "Missing builtin to flush instruction cache" -#endif -} - -static void * -get_x_addr (struct call_context *context, unsigned n) -{ - return &context->x[n]; -} - -static void * -get_s_addr (struct call_context *context, unsigned n) -{ -#if defined __AARCH64EB__ - return &context->v[n].d[1].s[1]; -#else - return &context->v[n].d[0].s[0]; -#endif -} - -static void * -get_d_addr (struct call_context *context, unsigned n) -{ -#if defined __AARCH64EB__ - return &context->v[n].d[1]; -#else - return &context->v[n].d[0]; -#endif -} - -static void * -get_v_addr (struct call_context *context, unsigned n) -{ - return &context->v[n]; -} - -/* Return the memory location at which a basic type would reside - were it to have been stored in register n. */ - -static void * -get_basic_type_addr (unsigned short type, struct call_context *context, - unsigned n) -{ - switch (type) - { - case FFI_TYPE_FLOAT: - return get_s_addr (context, n); - case FFI_TYPE_DOUBLE: - return get_d_addr (context, n); -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - return get_v_addr (context, n); -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - return get_x_addr (context, n); - case FFI_TYPE_VOID: - return NULL; - default: - FFI_ASSERT (0); - return NULL; - } -} - -/* Return the alignment width for each of the basic types. */ - -static size_t -get_basic_type_alignment (unsigned short type) -{ - switch (type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - return sizeof (UINT64); -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - return sizeof (long double); -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: -#if defined (__APPLE__) - return sizeof (UINT8); -#endif - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: -#if defined (__APPLE__) - return sizeof (UINT16); -#endif - case FFI_TYPE_UINT32: - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: -#if defined (__APPLE__) - return sizeof (UINT32); -#endif - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - return sizeof (UINT64); - - default: - FFI_ASSERT (0); - return 0; - } -} - -/* Return the size in bytes for each of the basic types. */ - -static size_t -get_basic_type_size (unsigned short type) -{ - switch (type) - { - case FFI_TYPE_FLOAT: - return sizeof (UINT32); - case FFI_TYPE_DOUBLE: - return sizeof (UINT64); -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - return sizeof (long double); -#endif - case FFI_TYPE_UINT8: - return sizeof (UINT8); - case FFI_TYPE_SINT8: - return sizeof (SINT8); - case FFI_TYPE_UINT16: - return sizeof (UINT16); - case FFI_TYPE_SINT16: - return sizeof (SINT16); - case FFI_TYPE_UINT32: - return sizeof (UINT32); - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - return sizeof (SINT32); - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - return sizeof (UINT64); - case FFI_TYPE_SINT64: - return sizeof (SINT64); - - default: - FFI_ASSERT (0); - return 0; - } -} - -extern void -ffi_call_SYSV (unsigned (*)(struct call_context *context, unsigned char *, - extended_cif *), - struct call_context *context, - extended_cif *, - size_t, - void (*fn)(void)); - -extern void -ffi_closure_SYSV (ffi_closure *); - -/* Test for an FFI floating point representation. */ - -static unsigned -is_floating_type (unsigned short type) -{ - return (type == FFI_TYPE_FLOAT || type == FFI_TYPE_DOUBLE - || type == FFI_TYPE_LONGDOUBLE); -} - -/* Test for a homogeneous structure. */ - -static unsigned short -get_homogeneous_type (ffi_type *ty) -{ - if (ty->type == FFI_TYPE_STRUCT && ty->elements) - { - unsigned i; - unsigned short candidate_type - = get_homogeneous_type (ty->elements[0]); - for (i =1; ty->elements[i]; i++) - { - unsigned short iteration_type = 0; - /* If we have a nested struct, we must find its homogeneous type. - If that fits with our candidate type, we are still - homogeneous. */ - if (ty->elements[i]->type == FFI_TYPE_STRUCT - && ty->elements[i]->elements) - { - iteration_type = get_homogeneous_type (ty->elements[i]); - } - else - { - iteration_type = ty->elements[i]->type; - } - - /* If we are not homogeneous, return FFI_TYPE_STRUCT. */ - if (candidate_type != iteration_type) - return FFI_TYPE_STRUCT; - } - return candidate_type; - } - - /* Base case, we have no more levels of nesting, so we - are a basic type, and so, trivially homogeneous in that type. */ - return ty->type; -} - -/* Determine the number of elements within a STRUCT. - - Note, we must handle nested structs. - - If ty is not a STRUCT this function will return 0. */ - -static unsigned -element_count (ffi_type *ty) -{ - if (ty->type == FFI_TYPE_STRUCT && ty->elements) - { - unsigned n; - unsigned elems = 0; - for (n = 0; ty->elements[n]; n++) - { - if (ty->elements[n]->type == FFI_TYPE_STRUCT - && ty->elements[n]->elements) - elems += element_count (ty->elements[n]); - else - elems++; - } - return elems; - } - return 0; -} - -/* Test for a homogeneous floating point aggregate. - - A homogeneous floating point aggregate is a homogeneous aggregate of - a half- single- or double- precision floating point type with one - to four elements. Note that this includes nested structs of the - basic type. */ - -static int -is_hfa (ffi_type *ty) -{ - if (ty->type == FFI_TYPE_STRUCT - && ty->elements[0] - && is_floating_type (get_homogeneous_type (ty))) - { - unsigned n = element_count (ty); - return n >= 1 && n <= 4; - } - return 0; -} - -/* Test if an ffi_type is a candidate for passing in a register. - - This test does not check that sufficient registers of the - appropriate class are actually available, merely that IFF - sufficient registers are available then the argument will be passed - in register(s). - - Note that an ffi_type that is deemed to be a register candidate - will always be returned in registers. - - Returns 1 if a register candidate else 0. */ - -static int -is_register_candidate (ffi_type *ty) -{ - switch (ty->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - case FFI_TYPE_SINT64: - return 1; - - case FFI_TYPE_STRUCT: - if (is_hfa (ty)) - { - return 1; - } - else if (ty->size > 16) - { - /* Too large. Will be replaced with a pointer to memory. The - pointer MAY be passed in a register, but the value will - not. This test specifically fails since the argument will - never be passed by value in registers. */ - return 0; - } - else - { - /* Might be passed in registers depending on the number of - registers required. */ - return (ty->size + 7) / 8 < N_X_ARG_REG; - } - break; - - default: - FFI_ASSERT (0); - break; - } - - return 0; -} - -/* Test if an ffi_type argument or result is a candidate for a vector - register. */ - -static int -is_v_register_candidate (ffi_type *ty) -{ - return is_floating_type (ty->type) - || (ty->type == FFI_TYPE_STRUCT && is_hfa (ty)); -} - -/* Representation of the procedure call argument marshalling - state. - - The terse state variable names match the names used in the AARCH64 - PCS. */ - -struct arg_state -{ - unsigned ngrn; /* Next general-purpose register number. */ - unsigned nsrn; /* Next vector register number. */ - size_t nsaa; /* Next stack offset. */ - -#if defined (__APPLE__) - unsigned allocating_variadic; -#endif -}; - -/* Initialize a procedure call argument marshalling state. */ -static void -arg_init (struct arg_state *state, size_t call_frame_size) -{ - state->ngrn = 0; - state->nsrn = 0; - state->nsaa = 0; - -#if defined (__APPLE__) - state->allocating_variadic = 0; -#endif -} - -/* Return the number of available consecutive core argument - registers. */ - -static unsigned -available_x (struct arg_state *state) -{ - return N_X_ARG_REG - state->ngrn; -} - -/* Return the number of available consecutive vector argument - registers. */ - -static unsigned -available_v (struct arg_state *state) -{ - return N_V_ARG_REG - state->nsrn; -} - -static void * -allocate_to_x (struct call_context *context, struct arg_state *state) -{ - FFI_ASSERT (state->ngrn < N_X_ARG_REG); - return get_x_addr (context, (state->ngrn)++); -} - -static void * -allocate_to_s (struct call_context *context, struct arg_state *state) -{ - FFI_ASSERT (state->nsrn < N_V_ARG_REG); - return get_s_addr (context, (state->nsrn)++); -} - -static void * -allocate_to_d (struct call_context *context, struct arg_state *state) -{ - FFI_ASSERT (state->nsrn < N_V_ARG_REG); - return get_d_addr (context, (state->nsrn)++); -} - -static void * -allocate_to_v (struct call_context *context, struct arg_state *state) -{ - FFI_ASSERT (state->nsrn < N_V_ARG_REG); - return get_v_addr (context, (state->nsrn)++); -} - -/* Allocate an aligned slot on the stack and return a pointer to it. */ -static void * -allocate_to_stack (struct arg_state *state, void *stack, size_t alignment, - size_t size) -{ - void *allocation; - - /* Round up the NSAA to the larger of 8 or the natural - alignment of the argument's type. */ - state->nsaa = ALIGN (state->nsaa, alignment); - state->nsaa = ALIGN (state->nsaa, alignment); -#if defined (__APPLE__) - if (state->allocating_variadic) - state->nsaa = ALIGN (state->nsaa, 8); -#else - state->nsaa = ALIGN (state->nsaa, 8); -#endif - - allocation = stack + state->nsaa; - - state->nsaa += size; - return allocation; -} - -static void -copy_basic_type (void *dest, void *source, unsigned short type) -{ - /* This is necessary to ensure that basic types are copied - sign extended to 64-bits as libffi expects. */ - switch (type) - { - case FFI_TYPE_FLOAT: - *(float *) dest = *(float *) source; - break; - case FFI_TYPE_DOUBLE: - *(double *) dest = *(double *) source; - break; -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - *(long double *) dest = *(long double *) source; - break; -#endif - case FFI_TYPE_UINT8: - *(ffi_arg *) dest = *(UINT8 *) source; - break; - case FFI_TYPE_SINT8: - *(ffi_sarg *) dest = *(SINT8 *) source; - break; - case FFI_TYPE_UINT16: - *(ffi_arg *) dest = *(UINT16 *) source; - break; - case FFI_TYPE_SINT16: - *(ffi_sarg *) dest = *(SINT16 *) source; - break; - case FFI_TYPE_UINT32: - *(ffi_arg *) dest = *(UINT32 *) source; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - *(ffi_sarg *) dest = *(SINT32 *) source; - break; - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - *(ffi_arg *) dest = *(UINT64 *) source; - break; - case FFI_TYPE_SINT64: - *(ffi_sarg *) dest = *(SINT64 *) source; - break; - case FFI_TYPE_VOID: - break; - - default: - FFI_ASSERT (0); - } -} - -static void -copy_hfa_to_reg_or_stack (void *memory, - ffi_type *ty, - struct call_context *context, - unsigned char *stack, - struct arg_state *state) -{ - unsigned elems = element_count (ty); - if (available_v (state) < elems) - { - /* There are insufficient V registers. Further V register allocations - are prevented, the NSAA is adjusted (by allocate_to_stack ()) - and the argument is copied to memory at the adjusted NSAA. */ - state->nsrn = N_V_ARG_REG; - memcpy (allocate_to_stack (state, stack, ty->alignment, ty->size), - memory, - ty->size); - } - else - { - int i; - unsigned short type = get_homogeneous_type (ty); - for (i = 0; i < elems; i++) - { - void *reg = allocate_to_v (context, state); - copy_basic_type (reg, memory, type); - memory += get_basic_type_size (type); - } - } -} - -/* Either allocate an appropriate register for the argument type, or if - none are available, allocate a stack slot and return a pointer - to the allocated space. */ - -static void * -allocate_to_register_or_stack (struct call_context *context, - unsigned char *stack, - struct arg_state *state, - unsigned short type) -{ - size_t alignment = get_basic_type_alignment (type); - size_t size = alignment; - switch (type) - { - case FFI_TYPE_FLOAT: - /* This is the only case for which the allocated stack size - should not match the alignment of the type. */ - size = sizeof (UINT32); - /* Fall through. */ - case FFI_TYPE_DOUBLE: - if (state->nsrn < N_V_ARG_REG) - return allocate_to_d (context, state); - state->nsrn = N_V_ARG_REG; - break; -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - if (state->nsrn < N_V_ARG_REG) - return allocate_to_v (context, state); - state->nsrn = N_V_ARG_REG; - break; -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (state->ngrn < N_X_ARG_REG) - return allocate_to_x (context, state); - state->ngrn = N_X_ARG_REG; - break; - default: - FFI_ASSERT (0); - } - - return allocate_to_stack (state, stack, alignment, size); -} - -/* Copy a value to an appropriate register, or if none are - available, to the stack. */ - -static void -copy_to_register_or_stack (struct call_context *context, - unsigned char *stack, - struct arg_state *state, - void *value, - unsigned short type) -{ - copy_basic_type ( - allocate_to_register_or_stack (context, stack, state, type), - value, - type); -} - -/* Marshall the arguments from FFI representation to procedure call - context and stack. */ - -static unsigned -aarch64_prep_args (struct call_context *context, unsigned char *stack, - extended_cif *ecif) -{ - int i; - struct arg_state state; - - arg_init (&state, ALIGN(ecif->cif->bytes, 16)); - - for (i = 0; i < ecif->cif->nargs; i++) - { - ffi_type *ty = ecif->cif->arg_types[i]; - switch (ty->type) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - /* If the argument is a basic type the argument is allocated to an - appropriate register, or if none are available, to the stack. */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - copy_to_register_or_stack (context, stack, &state, - ecif->avalue[i], ty->type); - break; - - case FFI_TYPE_STRUCT: - if (is_hfa (ty)) - { - copy_hfa_to_reg_or_stack (ecif->avalue[i], ty, context, - stack, &state); - } - else if (ty->size > 16) - { - /* If the argument is a composite type that is larger than 16 - bytes, then the argument has been copied to memory, and - the argument is replaced by a pointer to the copy. */ - - copy_to_register_or_stack (context, stack, &state, - &(ecif->avalue[i]), FFI_TYPE_POINTER); - } - else if (available_x (&state) >= (ty->size + 7) / 8) - { - /* If the argument is a composite type and the size in - double-words is not more than the number of available - X registers, then the argument is copied into consecutive - X registers. */ - int j; - for (j = 0; j < (ty->size + 7) / 8; j++) - { - memcpy (allocate_to_x (context, &state), - &(((UINT64 *) ecif->avalue[i])[j]), - sizeof (UINT64)); - } - } - else - { - /* Otherwise, there are insufficient X registers. Further X - register allocations are prevented, the NSAA is adjusted - (by allocate_to_stack ()) and the argument is copied to - memory at the adjusted NSAA. */ - state.ngrn = N_X_ARG_REG; - - memcpy (allocate_to_stack (&state, stack, ty->alignment, - ty->size), ecif->avalue + i, ty->size); - } - break; - - default: - FFI_ASSERT (0); - break; - } - -#if defined (__APPLE__) - if (i + 1 == ecif->cif->aarch64_nfixedargs) - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - - state.allocating_variadic = 1; - } -#endif - } - - return ecif->cif->aarch64_flags; -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Round the stack up to a multiple of the stack alignment requirement. */ - cif->bytes = - (cif->bytes + (AARCH64_STACK_ALIGN - 1)) & ~ (AARCH64_STACK_ALIGN - 1); - - /* Initialize our flags. We are interested if this CIF will touch a - vector register, if so we will enable context save and load to - those registers, otherwise not. This is intended to be friendly - to lazy float context switching in the kernel. */ - cif->aarch64_flags = 0; - - if (is_v_register_candidate (cif->rtype)) - { - cif->aarch64_flags |= AARCH64_FFI_WITH_V; - } - else - { - int i; - for (i = 0; i < cif->nargs; i++) - if (is_v_register_candidate (cif->arg_types[i])) - { - cif->aarch64_flags |= AARCH64_FFI_WITH_V; - break; - } - } - - return FFI_OK; -} - -#if defined (__APPLE__) - -/* Perform Apple-specific cif processing for variadic calls */ -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs) -{ - cif->aarch64_nfixedargs = nfixedargs; - - return ffi_prep_cif_machdep(cif); -} - -#endif - -/* Call a function with the provided arguments and capture the return - value. */ -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - { - struct call_context context; - size_t stack_bytes; - - /* Figure out the total amount of stack space we need, the - above call frame space needs to be 16 bytes aligned to - ensure correct alignment of the first object inserted in - that space hence the ALIGN applied to cif->bytes.*/ - stack_bytes = ALIGN(cif->bytes, 16); - - memset (&context, 0, sizeof (context)); - if (is_register_candidate (cif->rtype)) - { - ffi_call_SYSV (aarch64_prep_args, &context, &ecif, stack_bytes, fn); - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_INT: - case FFI_TYPE_SINT64: - { - void *addr = get_basic_type_addr (cif->rtype->type, - &context, 0); - copy_basic_type (rvalue, addr, cif->rtype->type); - break; - } - - case FFI_TYPE_STRUCT: - if (is_hfa (cif->rtype)) - { - int j; - unsigned short type = get_homogeneous_type (cif->rtype); - unsigned elems = element_count (cif->rtype); - for (j = 0; j < elems; j++) - { - void *reg = get_basic_type_addr (type, &context, j); - copy_basic_type (rvalue, reg, type); - rvalue += get_basic_type_size (type); - } - } - else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) - { - size_t size = ALIGN (cif->rtype->size, sizeof (UINT64)); - memcpy (rvalue, get_x_addr (&context, 0), size); - } - else - { - FFI_ASSERT (0); - } - break; - - default: - FFI_ASSERT (0); - break; - } - } - else - { - memcpy (get_x_addr (&context, 8), &rvalue, sizeof (UINT64)); - ffi_call_SYSV (aarch64_prep_args, &context, &ecif, - stack_bytes, fn); - } - break; - } - - default: - FFI_ASSERT (0); - break; - } -} - -static unsigned char trampoline [] = -{ 0x70, 0x00, 0x00, 0x58, /* ldr x16, 1f */ - 0x91, 0x00, 0x00, 0x10, /* adr x17, 2f */ - 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ -}; - -/* Build a trampoline. */ - -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,FLAGS) \ - ({unsigned char *__tramp = (unsigned char*)(TRAMP); \ - UINT64 __fun = (UINT64)(FUN); \ - UINT64 __ctx = (UINT64)(CTX); \ - UINT64 __flags = (UINT64)(FLAGS); \ - memcpy (__tramp, trampoline, sizeof (trampoline)); \ - memcpy (__tramp + 12, &__fun, sizeof (__fun)); \ - memcpy (__tramp + 20, &__ctx, sizeof (__ctx)); \ - memcpy (__tramp + 28, &__flags, sizeof (__flags)); \ - ffi_clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE); \ - }) - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, codeloc, - cif->aarch64_flags); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -/* Primary handler to setup and invoke a function within a closure. - - A closure when invoked enters via the assembler wrapper - ffi_closure_SYSV(). The wrapper allocates a call context on the - stack, saves the interesting registers (from the perspective of - the calling convention) into the context then passes control to - ffi_closure_SYSV_inner() passing the saved context and a pointer to - the stack at the point ffi_closure_SYSV() was invoked. - - On the return path the assembler wrapper will reload call context - registers. - - ffi_closure_SYSV_inner() marshalls the call context into ffi value - descriptors, invokes the wrapped function, then marshalls the return - value back into the call context. */ - -void FFI_HIDDEN -ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context, - void *stack) -{ - ffi_cif *cif = closure->cif; - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - void *rvalue = NULL; - int i; - struct arg_state state; - - arg_init (&state, ALIGN(cif->bytes, 16)); - - for (i = 0; i < cif->nargs; i++) - { - ffi_type *ty = cif->arg_types[i]; - - switch (ty->type) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - avalue[i] = allocate_to_register_or_stack (context, stack, - &state, ty->type); - break; -#endif - - case FFI_TYPE_STRUCT: - if (is_hfa (ty)) - { - unsigned n = element_count (ty); - if (available_v (&state) < n) - { - state.nsrn = N_V_ARG_REG; - avalue[i] = allocate_to_stack (&state, stack, ty->alignment, - ty->size); - } - else - { - switch (get_homogeneous_type (ty)) - { - case FFI_TYPE_FLOAT: - { - /* Eeek! We need a pointer to the structure, - however the homogeneous float elements are - being passed in individual S registers, - therefore the structure is not represented as - a contiguous sequence of bytes in our saved - register context. We need to fake up a copy - of the structure laid out in memory - correctly. The fake can be tossed once the - closure function has returned hence alloca() - is sufficient. */ - int j; - UINT32 *p = avalue[i] = alloca (ty->size); - for (j = 0; j < element_count (ty); j++) - memcpy (&p[j], - allocate_to_s (context, &state), - sizeof (*p)); - break; - } - - case FFI_TYPE_DOUBLE: - { - /* Eeek! We need a pointer to the structure, - however the homogeneous float elements are - being passed in individual S registers, - therefore the structure is not represented as - a contiguous sequence of bytes in our saved - register context. We need to fake up a copy - of the structure laid out in memory - correctly. The fake can be tossed once the - closure function has returned hence alloca() - is sufficient. */ - int j; - UINT64 *p = avalue[i] = alloca (ty->size); - for (j = 0; j < element_count (ty); j++) - memcpy (&p[j], - allocate_to_d (context, &state), - sizeof (*p)); - break; - } - -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: - memcpy (&avalue[i], - allocate_to_v (context, &state), - sizeof (*avalue)); - break; -#endif - - default: - FFI_ASSERT (0); - break; - } - } - } - else if (ty->size > 16) - { - /* Replace Composite type of size greater than 16 with a - pointer. */ - memcpy (&avalue[i], - allocate_to_register_or_stack (context, stack, - &state, FFI_TYPE_POINTER), - sizeof (avalue[i])); - } - else if (available_x (&state) >= (ty->size + 7) / 8) - { - avalue[i] = get_x_addr (context, state.ngrn); - state.ngrn += (ty->size + 7) / 8; - } - else - { - state.ngrn = N_X_ARG_REG; - - avalue[i] = allocate_to_stack (&state, stack, ty->alignment, - ty->size); - } - break; - - default: - FFI_ASSERT (0); - break; - } - } - - /* Figure out where the return value will be passed, either in - registers or in a memory block allocated by the caller and passed - in x8. */ - - if (is_register_candidate (cif->rtype)) - { - /* Register candidates are *always* returned in registers. */ - - /* Allocate a scratchpad for the return value, we will let the - callee scrible the result into the scratch pad then move the - contents into the appropriate return value location for the - call convention. */ - rvalue = alloca (cif->rtype->size); - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Copy the return value into the call context so that it is returned - as expected to our caller. */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - { - void *addr = get_basic_type_addr (cif->rtype->type, context, 0); - copy_basic_type (addr, rvalue, cif->rtype->type); - break; - } - case FFI_TYPE_STRUCT: - if (is_hfa (cif->rtype)) - { - int j; - unsigned short type = get_homogeneous_type (cif->rtype); - unsigned elems = element_count (cif->rtype); - for (j = 0; j < elems; j++) - { - void *reg = get_basic_type_addr (type, context, j); - copy_basic_type (reg, rvalue, type); - rvalue += get_basic_type_size (type); - } - } - else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) - { - size_t size = ALIGN (cif->rtype->size, sizeof (UINT64)) ; - memcpy (get_x_addr (context, 0), rvalue, size); - } - else - { - FFI_ASSERT (0); - } - break; - default: - FFI_ASSERT (0); - break; - } - } - else - { - memcpy (&rvalue, get_x_addr (context, 8), sizeof (UINT64)); - (closure->fun) (cif, rvalue, avalue, closure->user_data); - } -} - diff --git a/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffitarget.h deleted file mode 100644 index 4bbced26f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/aarch64/ffitarget.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi - { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV - } ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 36 -#define FFI_NATIVE_RAW_API 0 - -/* ---- Internal ---- */ - -#if defined (__APPLE__) -#define FFI_TARGET_SPECIFIC_VARIADIC -#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_flags; unsigned aarch64_nfixedargs -#else -#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_flags -#endif - -#define AARCH64_FFI_WITH_V_BIT 0 - -#define AARCH64_N_XREG 32 -#define AARCH64_N_VREG 32 -#define AARCH64_CALL_CONTEXT_SIZE (AARCH64_N_XREG * 8 + AARCH64_N_VREG * 16) - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/aarch64/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/aarch64/sysv.S deleted file mode 100644 index 169eab804..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/aarch64/sysv.S +++ /dev/null @@ -1,333 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -#define LIBFFI_ASM -#include -#include - -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#ifdef __USER_LABEL_PREFIX__ -#define CONCAT1(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -/* Use the right prefix for global labels. */ -#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) -#else -#define CNAME(x) x -#endif -#endif - -#define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -#define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off -#define cfi_restore(reg) .cfi_restore reg -#define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg - - .text - .globl CNAME(ffi_call_SYSV) -#ifdef __ELF__ - .type CNAME(ffi_call_SYSV), #function -#endif -#ifdef __APPLE__ - .align 2 -#endif - -/* ffi_call_SYSV() - - Create a stack frame, setup an argument context, call the callee - and extract the result. - - The maximum required argument stack size is provided, - ffi_call_SYSV() allocates that stack space then calls the - prepare_fn to populate register context and stack. The - argument passing registers are loaded from the register - context and the callee called, on return the register passing - register are saved back to the context. Our caller will - extract the return value from the final state of the saved - register context. - - Prototype: - - extern unsigned - ffi_call_SYSV (void (*)(struct call_context *context, unsigned char *, - extended_cif *), - struct call_context *context, - extended_cif *, - size_t required_stack_size, - void (*fn)(void)); - - Therefore on entry we have: - - x0 prepare_fn - x1 &context - x2 &ecif - x3 bytes - x4 fn - - This function uses the following stack frame layout: - - == - saved x30(lr) - x29(fp)-> saved x29(fp) - saved x24 - saved x23 - saved x22 - sp' -> saved x21 - ... - sp -> (constructed callee stack arguments) - == - - Voila! */ - -#define ffi_call_SYSV_FS (8 * 4) - - .cfi_startproc -CNAME(ffi_call_SYSV): - stp x29, x30, [sp, #-16]! - cfi_adjust_cfa_offset (16) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - mov x29, sp - cfi_def_cfa_register (x29) - sub sp, sp, #ffi_call_SYSV_FS - - stp x21, x22, [sp, #0] - cfi_rel_offset (x21, 0 - ffi_call_SYSV_FS) - cfi_rel_offset (x22, 8 - ffi_call_SYSV_FS) - - stp x23, x24, [sp, #16] - cfi_rel_offset (x23, 16 - ffi_call_SYSV_FS) - cfi_rel_offset (x24, 24 - ffi_call_SYSV_FS) - - mov x21, x1 - mov x22, x2 - mov x24, x4 - - /* Allocate the stack space for the actual arguments, many - arguments will be passed in registers, but we assume - worst case and allocate sufficient stack for ALL of - the arguments. */ - sub sp, sp, x3 - - /* unsigned (*prepare_fn) (struct call_context *context, - unsigned char *stack, extended_cif *ecif); - */ - mov x23, x0 - mov x0, x1 - mov x1, sp - /* x2 already in place */ - blr x23 - - /* Preserve the flags returned. */ - mov x23, x0 - - /* Figure out if we should touch the vector registers. */ - tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f - - /* Load the vector argument passing registers. */ - ldp q0, q1, [x21, #8*32 + 0] - ldp q2, q3, [x21, #8*32 + 32] - ldp q4, q5, [x21, #8*32 + 64] - ldp q6, q7, [x21, #8*32 + 96] -1: - /* Load the core argument passing registers. */ - ldp x0, x1, [x21, #0] - ldp x2, x3, [x21, #16] - ldp x4, x5, [x21, #32] - ldp x6, x7, [x21, #48] - - /* Don't forget x8 which may be holding the address of a return buffer. - */ - ldr x8, [x21, #8*8] - - blr x24 - - /* Save the core argument passing registers. */ - stp x0, x1, [x21, #0] - stp x2, x3, [x21, #16] - stp x4, x5, [x21, #32] - stp x6, x7, [x21, #48] - - /* Note nothing useful ever comes back in x8! */ - - /* Figure out if we should touch the vector registers. */ - tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f - - /* Save the vector argument passing registers. */ - stp q0, q1, [x21, #8*32 + 0] - stp q2, q3, [x21, #8*32 + 32] - stp q4, q5, [x21, #8*32 + 64] - stp q6, q7, [x21, #8*32 + 96] -1: - /* All done, unwind our stack frame. */ - ldp x21, x22, [x29, # - ffi_call_SYSV_FS] - cfi_restore (x21) - cfi_restore (x22) - - ldp x23, x24, [x29, # - ffi_call_SYSV_FS + 16] - cfi_restore (x23) - cfi_restore (x24) - - mov sp, x29 - cfi_def_cfa_register (sp) - - ldp x29, x30, [sp], #16 - cfi_adjust_cfa_offset (-16) - cfi_restore (x29) - cfi_restore (x30) - - ret - - .cfi_endproc -#ifdef __ELF__ - .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) -#endif - -#define ffi_closure_SYSV_FS (8 * 2 + AARCH64_CALL_CONTEXT_SIZE) - -/* ffi_closure_SYSV - - Closure invocation glue. This is the low level code invoked directly by - the closure trampoline to setup and call a closure. - - On entry x17 points to a struct trampoline_data, x16 has been clobbered - all other registers are preserved. - - We allocate a call context and save the argument passing registers, - then invoked the generic C ffi_closure_SYSV_inner() function to do all - the real work, on return we load the result passing registers back from - the call context. - - On entry - - extern void - ffi_closure_SYSV (struct trampoline_data *); - - struct trampoline_data - { - UINT64 *ffi_closure; - UINT64 flags; - }; - - This function uses the following stack frame layout: - - == - saved x30(lr) - x29(fp)-> saved x29(fp) - saved x22 - saved x21 - ... - sp -> call_context - == - - Voila! */ - - .text - .globl CNAME(ffi_closure_SYSV) -#ifdef __APPLE__ - .align 2 -#endif - .cfi_startproc -CNAME(ffi_closure_SYSV): - stp x29, x30, [sp, #-16]! - cfi_adjust_cfa_offset (16) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - mov x29, sp - cfi_def_cfa_register (x29) - - sub sp, sp, #ffi_closure_SYSV_FS - - stp x21, x22, [x29, #-16] - cfi_rel_offset (x21, -16) - cfi_rel_offset (x22, -8) - - /* Load x21 with &call_context. */ - mov x21, sp - /* Preserve our struct trampoline_data * */ - mov x22, x17 - - /* Save the rest of the argument passing registers. */ - stp x0, x1, [x21, #0] - stp x2, x3, [x21, #16] - stp x4, x5, [x21, #32] - stp x6, x7, [x21, #48] - /* Don't forget we may have been given a result scratch pad address. - */ - str x8, [x21, #64] - - /* Figure out if we should touch the vector registers. */ - ldr x0, [x22, #8] - tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f - - /* Save the argument passing vector registers. */ - stp q0, q1, [x21, #8*32 + 0] - stp q2, q3, [x21, #8*32 + 32] - stp q4, q5, [x21, #8*32 + 64] - stp q6, q7, [x21, #8*32 + 96] -1: - /* Load &ffi_closure.. */ - ldr x0, [x22, #0] - mov x1, x21 - /* Compute the location of the stack at the point that the - trampoline was called. */ - add x2, x29, #16 - - bl CNAME(ffi_closure_SYSV_inner) - - /* Figure out if we should touch the vector registers. */ - ldr x0, [x22, #8] - tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f - - /* Load the result passing vector registers. */ - ldp q0, q1, [x21, #8*32 + 0] - ldp q2, q3, [x21, #8*32 + 32] - ldp q4, q5, [x21, #8*32 + 64] - ldp q6, q7, [x21, #8*32 + 96] -1: - /* Load the result passing core registers. */ - ldp x0, x1, [x21, #0] - ldp x2, x3, [x21, #16] - ldp x4, x5, [x21, #32] - ldp x6, x7, [x21, #48] - /* Note nothing useful is returned in x8. */ - - /* We are done, unwind our frame. */ - ldp x21, x22, [x29, #-16] - cfi_restore (x21) - cfi_restore (x22) - - mov sp, x29 - cfi_def_cfa_register (sp) - - ldp x29, x30, [sp], #16 - cfi_adjust_cfa_offset (-16) - cfi_restore (x29) - cfi_restore (x30) - - ret - .cfi_endproc -#ifdef __ELF__ - .size CNAME(ffi_closure_SYSV), .-CNAME(ffi_closure_SYSV) -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/alpha/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/alpha/ffi.c deleted file mode 100644 index 192f691c4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/alpha/ffi.c +++ /dev/null @@ -1,288 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Anthony Green - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. - - Alpha Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 128-bit type. */ -#if defined(__LONG_DOUBLE_128__) -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void)) - FFI_HIDDEN; -extern void ffi_closure_osf(void) FFI_HIDDEN; - - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Adjust cif->bytes to represent a minimum 6 words for the temporary - register argument loading area. */ - if (cif->bytes < 6*FFI_SIZEOF_ARG) - cif->bytes = 6*FFI_SIZEOF_ARG; - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = cif->rtype->type; - break; - - case FFI_TYPE_LONGDOUBLE: - /* 128-bit long double is returned in memory, like a struct. */ - cif->flags = FFI_TYPE_STRUCT; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - unsigned long *stack, *argp; - long i, avn; - ffi_type **arg_types; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT) - rvalue = alloca(cif->rtype->size); - - /* Allocate the space for the arguments, plus 4 words of temp - space for ffi_call_osf. */ - argp = stack = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); - - if (cif->flags == FFI_TYPE_STRUCT) - *(void **) argp++ = rvalue; - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - size_t size = (*arg_types)->size; - - switch ((*arg_types)->type) - { - case FFI_TYPE_SINT8: - *(SINT64 *) argp = *(SINT8 *)(* avalue); - break; - - case FFI_TYPE_UINT8: - *(SINT64 *) argp = *(UINT8 *)(* avalue); - break; - - case FFI_TYPE_SINT16: - *(SINT64 *) argp = *(SINT16 *)(* avalue); - break; - - case FFI_TYPE_UINT16: - *(SINT64 *) argp = *(UINT16 *)(* avalue); - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - /* Note that unsigned 32-bit quantities are sign extended. */ - *(SINT64 *) argp = *(SINT32 *)(* avalue); - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - *(UINT64 *) argp = *(UINT64 *)(* avalue); - break; - - case FFI_TYPE_FLOAT: - if (argp - stack < 6) - { - /* Note the conversion -- all the fp regs are loaded as - doubles. The in-register format is the same. */ - *(double *) argp = *(float *)(* avalue); - } - else - *(float *) argp = *(float *)(* avalue); - break; - - case FFI_TYPE_DOUBLE: - *(double *) argp = *(double *)(* avalue); - break; - - case FFI_TYPE_LONGDOUBLE: - /* 128-bit long double is passed by reference. */ - *(long double **) argp = (long double *)(* avalue); - size = sizeof (long double *); - break; - - case FFI_TYPE_STRUCT: - memcpy(argp, *avalue, (*arg_types)->size); - break; - - default: - FFI_ASSERT(0); - } - - argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - i++, arg_types++, avalue++; - } - - ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn); -} - - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - tramp[0] = 0x47fb0401; /* mov $27,$1 */ - tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ - tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ - tramp[3] = 0x47ff041f; /* nop */ - *(void **) &tramp[4] = ffi_closure_osf; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the Icache. - - Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal - instead, since both Compaq as and gas can handle it. - - 0x86 is PAL_imb in Tru64 UNIX . */ - asm volatile ("call_pal 0x86" : : : "memory"); - - return FFI_OK; -} - - -long FFI_HIDDEN -ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp) -{ - ffi_cif *cif; - void **avalue; - ffi_type **arg_types; - long i, avn, argn; - - cif = closure->cif; - avalue = alloca(cif->nargs * sizeof(void *)); - - argn = 0; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - { - rvalue = (void *) argp[0]; - argn = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - size_t size = arg_types[i]->size; - - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_STRUCT: - avalue[i] = &argp[argn]; - break; - - case FFI_TYPE_FLOAT: - if (argn < 6) - { - /* Floats coming from registers need conversion from double - back to float format. */ - *(float *)&argp[argn - 6] = *(double *)&argp[argn - 6]; - avalue[i] = &argp[argn - 6]; - } - else - avalue[i] = &argp[argn]; - break; - - case FFI_TYPE_DOUBLE: - avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)]; - break; - - case FFI_TYPE_LONGDOUBLE: - /* 128-bit long double is passed by reference. */ - avalue[i] = (long double *) argp[argn]; - size = sizeof (long double *); - break; - - default: - abort (); - } - - argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - i++; - } - - /* Invoke the closure. */ - closure->fun (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_osf how to perform return type promotions. */ - return cif->rtype->type; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/alpha/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/alpha/ffitarget.h deleted file mode 100644 index af145bce8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/alpha/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for Alpha. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_OSF, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_OSF -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/alpha/osf.S b/third_party/python/Modules/_ctypes/libffi/src/alpha/osf.S deleted file mode 100644 index 6b9f4dfa0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/alpha/osf.S +++ /dev/null @@ -1,387 +0,0 @@ -/* ----------------------------------------------------------------------- - osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat - - Alpha/OSF Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .arch ev6 - .text - -/* ffi_call_osf (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)); - - Bit o trickiness here -- ARGS+BYTES is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 3 - .globl ffi_call_osf - .ent ffi_call_osf - FFI_HIDDEN(ffi_call_osf) - -ffi_call_osf: - .frame $15, 32, $26, 0 - .mask 0x4008000, -32 -$LFB1: - addq $16,$17,$1 - mov $16, $30 - stq $26, 0($1) - stq $15, 8($1) - stq $18, 16($1) - mov $1, $15 -$LCFI1: - .prologue 0 - - stq $19, 24($1) - mov $20, $27 - - # Load up all of the (potential) argument registers. - ldq $16, 0($30) - ldt $f16, 0($30) - ldt $f17, 8($30) - ldq $17, 8($30) - ldt $f18, 16($30) - ldq $18, 16($30) - ldt $f19, 24($30) - ldq $19, 24($30) - ldt $f20, 32($30) - ldq $20, 32($30) - ldt $f21, 40($30) - ldq $21, 40($30) - - # Deallocate the register argument area. - lda $30, 48($30) - - jsr $26, ($27), 0 - ldgp $29, 0($26) - - # If the return value pointer is NULL, assume no return value. - ldq $19, 24($15) - ldq $18, 16($15) - ldq $26, 0($15) -$LCFI2: - beq $19, $noretval - - # Store the return value out in the proper type. - cmpeq $18, FFI_TYPE_INT, $1 - bne $1, $retint - cmpeq $18, FFI_TYPE_FLOAT, $2 - bne $2, $retfloat - cmpeq $18, FFI_TYPE_DOUBLE, $3 - bne $3, $retdouble - - .align 3 -$noretval: - ldq $15, 8($15) - ret - - .align 4 -$retint: - stq $0, 0($19) - nop - ldq $15, 8($15) - ret - - .align 4 -$retfloat: - sts $f0, 0($19) - nop - ldq $15, 8($15) - ret - - .align 4 -$retdouble: - stt $f0, 0($19) - nop - ldq $15, 8($15) - ret -$LFE1: - - .end ffi_call_osf - -/* ffi_closure_osf(...) - - Receives the closure argument in $1. */ - - .align 3 - .globl ffi_closure_osf - .ent ffi_closure_osf - FFI_HIDDEN(ffi_closure_osf) - -ffi_closure_osf: - .frame $30, 16*8, $26, 0 - .mask 0x4000000, -16*8 -$LFB2: - ldgp $29, 0($27) - subq $30, 16*8, $30 -$LCFI5: - stq $26, 0($30) -$LCFI6: - .prologue 1 - - # Store all of the potential argument registers in va_list format. - stt $f16, 4*8($30) - stt $f17, 5*8($30) - stt $f18, 6*8($30) - stt $f19, 7*8($30) - stt $f20, 8*8($30) - stt $f21, 9*8($30) - stq $16, 10*8($30) - stq $17, 11*8($30) - stq $18, 12*8($30) - stq $19, 13*8($30) - stq $20, 14*8($30) - stq $21, 15*8($30) - - # Call ffi_closure_osf_inner to do the bulk of the work. - mov $1, $16 - lda $17, 2*8($30) - lda $18, 10*8($30) - jsr $26, ffi_closure_osf_inner - ldgp $29, 0($26) - ldq $26, 0($30) - - # Load up the return value in the proper type. - lda $1, $load_table - s4addq $0, $1, $1 - ldl $1, 0($1) - addq $1, $29, $1 - jmp $31, ($1), $load_32 - - .align 4 -$load_none: - addq $30, 16*8, $30 - ret - - .align 4 -$load_float: - lds $f0, 16($30) - nop - addq $30, 16*8, $30 - ret - - .align 4 -$load_double: - ldt $f0, 16($30) - nop - addq $30, 16*8, $30 - ret - - .align 4 -$load_u8: -#ifdef __alpha_bwx__ - ldbu $0, 16($30) - nop -#else - ldq $0, 16($30) - and $0, 255, $0 -#endif - addq $30, 16*8, $30 - ret - - .align 4 -$load_s8: -#ifdef __alpha_bwx__ - ldbu $0, 16($30) - sextb $0, $0 -#else - ldq $0, 16($30) - sll $0, 56, $0 - sra $0, 56, $0 -#endif - addq $30, 16*8, $30 - ret - - .align 4 -$load_u16: -#ifdef __alpha_bwx__ - ldwu $0, 16($30) - nop -#else - ldq $0, 16($30) - zapnot $0, 3, $0 -#endif - addq $30, 16*8, $30 - ret - - .align 4 -$load_s16: -#ifdef __alpha_bwx__ - ldwu $0, 16($30) - sextw $0, $0 -#else - ldq $0, 16($30) - sll $0, 48, $0 - sra $0, 48, $0 -#endif - addq $30, 16*8, $30 - ret - - .align 4 -$load_32: - ldl $0, 16($30) - nop - addq $30, 16*8, $30 - ret - - .align 4 -$load_64: - ldq $0, 16($30) - nop - addq $30, 16*8, $30 - ret -$LFE2: - - .end ffi_closure_osf - -#ifdef __ELF__ -.section .rodata -#else -.rdata -#endif -$load_table: - .gprel32 $load_none # FFI_TYPE_VOID - .gprel32 $load_32 # FFI_TYPE_INT - .gprel32 $load_float # FFI_TYPE_FLOAT - .gprel32 $load_double # FFI_TYPE_DOUBLE - .gprel32 $load_none # FFI_TYPE_LONGDOUBLE - .gprel32 $load_u8 # FFI_TYPE_UINT8 - .gprel32 $load_s8 # FFI_TYPE_SINT8 - .gprel32 $load_u16 # FFI_TYPE_UINT16 - .gprel32 $load_s16 # FFI_TYPE_SINT16 - .gprel32 $load_32 # FFI_TYPE_UINT32 - .gprel32 $load_32 # FFI_TYPE_SINT32 - .gprel32 $load_64 # FFI_TYPE_UINT64 - .gprel32 $load_64 # FFI_TYPE_SINT64 - .gprel32 $load_none # FFI_TYPE_STRUCT - .gprel32 $load_64 # FFI_TYPE_POINTER - -/* Assert that the table above is in sync with ffi.h. */ - -#if FFI_TYPE_FLOAT != 2 \ - || FFI_TYPE_DOUBLE != 3 \ - || FFI_TYPE_UINT8 != 5 \ - || FFI_TYPE_SINT8 != 6 \ - || FFI_TYPE_UINT16 != 7 \ - || FFI_TYPE_SINT16 != 8 \ - || FFI_TYPE_UINT32 != 9 \ - || FFI_TYPE_SINT32 != 10 \ - || FFI_TYPE_UINT64 != 11 \ - || FFI_TYPE_SINT64 != 12 \ - || FFI_TYPE_STRUCT != 13 \ - || FFI_TYPE_POINTER != 14 \ - || FFI_TYPE_LAST != 14 -#error "osf.S out of sync with ffi.h" -#endif - -#ifdef __ELF__ -# define UA_SI .4byte -# define FDE_ENCODING 0x1b /* pcrel sdata4 */ -# define FDE_ENCODE(X) .4byte X-. -# define FDE_ARANGE(X) .4byte X -#elif defined __osf__ -# define UA_SI .align 0; .long -# define FDE_ENCODING 0x50 /* aligned absolute */ -# define FDE_ENCODE(X) .align 3; .quad X -# define FDE_ARANGE(X) .align 0; .quad X -#endif - -#ifdef __ELF__ - .section .eh_frame,EH_FRAME_FLAGS,@progbits -#elif defined __osf__ - .data - .align 3 - .globl _GLOBAL__F_ffi_call_osf -_GLOBAL__F_ffi_call_osf: -#endif -__FRAME_BEGIN__: - UA_SI $LECIE1-$LSCIE1 # Length of Common Information Entry -$LSCIE1: - UA_SI 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor - .byte 0x78 # sleb128 -8; CIE Data Alignment Factor - .byte 26 # CIE RA Column - .byte 0x1 # uleb128 0x1; Augmentation size - .byte FDE_ENCODING # FDE Encoding - .byte 0xc # DW_CFA_def_cfa - .byte 30 # uleb128 column 30 - .byte 0 # uleb128 offset 0 - .align 3 -$LECIE1: -$LSFDE1: - UA_SI $LEFDE1-$LASFDE1 # FDE Length -$LASFDE1: - UA_SI $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset - FDE_ENCODE($LFB1) # FDE initial location - FDE_ARANGE($LFE1-$LFB1) # FDE address range - .byte 0x0 # uleb128 0x0; Augmentation size - - .byte 0x4 # DW_CFA_advance_loc4 - UA_SI $LCFI1-$LFB1 - .byte 0x9a # DW_CFA_offset, column 26 - .byte 4 # uleb128 4*-8 - .byte 0x8f # DW_CFA_offset, column 15 - .byte 0x3 # uleb128 3*-8 - .byte 0xc # DW_CFA_def_cfa - .byte 15 # uleb128 column 15 - .byte 32 # uleb128 offset 32 - - .byte 0x4 # DW_CFA_advance_loc4 - UA_SI $LCFI2-$LCFI1 - .byte 0xda # DW_CFA_restore, column 26 - .align 3 -$LEFDE1: - -$LSFDE3: - UA_SI $LEFDE3-$LASFDE3 # FDE Length -$LASFDE3: - UA_SI $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset - FDE_ENCODE($LFB2) # FDE initial location - FDE_ARANGE($LFE2-$LFB2) # FDE address range - .byte 0x0 # uleb128 0x0; Augmentation size - - .byte 0x4 # DW_CFA_advance_loc4 - UA_SI $LCFI5-$LFB2 - .byte 0xe # DW_CFA_def_cfa_offset - .byte 0x80,0x1 # uleb128 128 - - .byte 0x4 # DW_CFA_advance_loc4 - UA_SI $LCFI6-$LCFI5 - .byte 0x9a # DW_CFA_offset, column 26 - .byte 16 # uleb128 offset 16*-8 - .align 3 -$LEFDE3: -#if defined __osf__ - .align 0 - .long 0 # End of Table -#endif - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/arc/arcompact.S b/third_party/python/Modules/_ctypes/libffi/src/arc/arcompact.S deleted file mode 100644 index 03715fde4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arc/arcompact.S +++ /dev/null @@ -1,135 +0,0 @@ -/* ----------------------------------------------------------------------- - arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) - - ARCompact Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x): -#endif - -.text - - /* R0: ffi_prep_args */ - /* R1: &ecif */ - /* R2: cif->bytes */ - /* R3: fig->flags */ - /* R4: ecif.rvalue */ - /* R5: fn */ -ENTRY(ffi_call_ARCompact) - /* Save registers. */ - st.a fp, [sp, -4] /* fp + 20, fp */ - push_s blink /* fp + 16, blink */ - st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ - push_s r3 /* fp + 8, fig->flags */ - st.a r5, [sp, -4] /* fp + 4, fn */ - push_s r2 /* fp + 0, cif->bytes */ - mov fp, sp - - /* Make room for all of the new args. */ - sub sp, sp, r2 - - /* Place all of the ffi_prep_args in position. */ - /* ffi_prep_args(char *stack, extended_cif *ecif) */ - /* R1 already set. */ - - /* And call. */ - jl_s.d [r0] - mov_s r0, sp - - ld.ab r12, [fp, 4] /* cif->bytes */ - ld.ab r11, [fp, 4] /* fn */ - - /* Move first 8 parameters in registers... */ - ld_s r0, [sp] - ld_s r1, [sp, 4] - ld_s r2, [sp, 8] - ld_s r3, [sp, 12] - ld r4, [sp, 16] - ld r5, [sp, 20] - ld r6, [sp, 24] - ld r7, [sp, 28] - - /* ...and adjust the stack. */ - min r12, r12, 32 - - /* Call the function. */ - jl.d [r11] - add sp, sp, r12 - - mov sp, fp - pop_s r3 /* fig->flags, return type */ - pop_s r2 /* ecif.rvalue, pointer for return value */ - - /* If the return value pointer is NULL, assume no return value. */ - breq.d r2, 0, epilogue - pop_s blink - - /* Return INT. */ - brne r3, FFI_TYPE_INT, return_double - b.d epilogue - st_s r0, [r2] - -return_double: - brne r3, FFI_TYPE_DOUBLE, epilogue - st_s r0, [r2] - st_s r1, [r2,4] - -epilogue: - j_s.d [blink] - ld.ab fp, [sp, 4] - -ENTRY(ffi_closure_ARCompact) - st.a r0, [sp, -32] - st_s r1, [sp, 4] - st_s r2, [sp, 8] - st_s r3, [sp, 12] - st r4, [sp, 16] - st r5, [sp, 20] - st r6, [sp, 24] - st r7, [sp, 28] - - /* pointer to arguments */ - mov_s r2, sp - - /* return value goes here */ - sub sp, sp, 8 - mov_s r1, sp - - push_s blink - - bl.d ffi_closure_inner_ARCompact - mov_s r0, r8 /* codeloc, set by trampoline */ - - pop_s blink - - /* set return value to r1:r0 */ - pop_s r0 - pop_s r1 - j_s.d [blink] - add_s sp, sp, 32 diff --git a/third_party/python/Modules/_ctypes/libffi/src/arc/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/arc/ffi.c deleted file mode 100644 index 32f82a7d5..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arc/ffi.c +++ /dev/null @@ -1,268 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - - ARC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#include - -/* for little endian ARC, the code is in fact stored as mixed endian for - performance reasons */ -#if __BIG_ENDIAN__ -#define CODE_ENDIAN(x) (x) -#else -#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) -#endif - -/* ffi_prep_args is called by the assembly routine once stack - space has been allocated for the function's arguments. */ - -void -ffi_prep_args (char *stack, extended_cif * ecif) -{ - unsigned int i; - int tmp; - void **p_argv; - char *argp; - ffi_type **p_arg; - - tmp = 0; - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); i--, p_arg++) - { - size_t z; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_arg)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) ALIGN (argp, alignment); - - z = (*p_arg)->size; - if (z < sizeof (int)) - { - z = sizeof (int); - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv); - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, (*p_arg)->size); - break; - - default: - FFI_ASSERT (0); - } - } - else if (z == sizeof (int)) - { - *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); - } - else - { - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - memcpy (argp, *p_argv, z); - } - else - { - /* Double or long long 64bit. */ - memcpy (argp, *p_argv, z); - } - } - p_argv++; - argp += z; - } - - return; -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep (ffi_cif * cif) -{ - /* Set the return type flag. */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFI_TYPE_DOUBLE; - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_ARCompact (void (*)(char *, extended_cif *), - extended_cif *, unsigned, unsigned, - unsigned *, void (*fn) (void)); - -void -ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have - a return value address then we need to make one. */ - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_ARCOMPACT: - ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -int -ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue, - ffi_arg * args) -{ - void **arg_area, **p_argv; - ffi_cif *cif = closure->cif; - char *argp = (char *) args; - ffi_type **p_argt; - int i; - - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - /* handle hidden argument */ - if (cif->flags == FFI_TYPE_STRUCT) - { - rvalue = *(void **) argp; - argp += 4; - } - - p_argv = arg_area; - - for (i = 0, p_argt = cif->arg_types; i < cif->nargs; - i++, p_argt++, p_argv++) - { - size_t z; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_argt)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) ALIGN (argp, alignment); - - z = (*p_argt)->size; - *p_argv = (void *) argp; - argp += z; - } - - (closure->fun) (cif, rvalue, arg_area, closure->user_data); - - return cif->flags; -} - -extern void ffi_closure_ARCompact (void); - -ffi_status -ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, void *codeloc) -{ - uint32_t *tramp = (uint32_t *) & (closure->tramp[0]); - - switch (cif->abi) - { - case FFI_ARCOMPACT: - FFI_ASSERT (tramp == codeloc); - tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */ - tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */ - tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact); - break; - - default: - return FFI_BAD_ABI; - } - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE); - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/arc/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/arc/ffitarget.h deleted file mode 100644 index bf8311bc8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arc/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - Target configuration macros for ARC. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi -{ - FFI_FIRST_ABI = 0, - FFI_ARCOMPACT, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_ARCOMPACT -} ffi_abi; -#endif - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/arm/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/arm/ffi.c deleted file mode 100644 index 6691ab57d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arm/ffi.c +++ /dev/null @@ -1,931 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Timothy Wall - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - Copyright (c) 2011 Anthony Green - Copyright (c) 2011 Free Software Foundation - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - - ARM Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* Forward declares. */ -static int vfp_type_p (ffi_type *); -static void layout_vfp_args (ffi_cif *); - -int ffi_prep_args_SYSV(char *stack, extended_cif *ecif, float *vfp_space); -int ffi_prep_args_VFP(char *stack, extended_cif *ecif, float *vfp_space); - -static char* ffi_align(ffi_type **p_arg, char *argp) -{ - /* Align if necessary */ - register size_t alignment = (*p_arg)->alignment; - if (alignment < 4) - { - alignment = 4; - } -#ifdef _WIN32_WCE - if (alignment > 4) - { - alignment = 4; - } -#endif - if ((alignment - 1) & (unsigned) argp) - { - argp = (char *) ALIGN(argp, alignment); - } - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - argp = (char *) ALIGN(argp, 4); - } - return argp; -} - -static size_t ffi_put_arg(ffi_type **arg_type, void **arg, char *stack) -{ - register char* argp = stack; - register ffi_type **p_arg = arg_type; - register void **p_argv = arg; - register size_t z = (*p_arg)->size; - if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - if ((*p_arg)->type == FFI_TYPE_FLOAT) - *(float *) argp = *(float *)(* p_argv); - else - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else if (z == sizeof(double) && (*p_arg)->type == FFI_TYPE_DOUBLE) - { - *(double *) argp = *(double *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - return z; -} -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments - - The vfp_space parameter is the load area for VFP regs, the return - value is cif->vfp_used (word bitset of VFP regs used for passing - arguments). These are only used for the VFP hard-float ABI. -*/ -int ffi_prep_args_SYSV(char *stack, extended_cif *ecif, float *vfp_space) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - argp = stack; - - - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++, p_argv++) - { - argp = ffi_align(p_arg, argp); - argp += ffi_put_arg(p_arg, p_argv, argp); - } - - return 0; -} - -int ffi_prep_args_VFP(char *stack, extended_cif *ecif, float *vfp_space) -{ - register unsigned int i, vi = 0; - register void **p_argv; - register char *argp, *regp, *eo_regp; - register ffi_type **p_arg; - char stack_used = 0; - char done_with_regs = 0; - char is_vfp_type; - - // make sure we are using FFI_VFP - FFI_ASSERT(ecif->cif->abi == FFI_VFP); - - /* the first 4 words on the stack are used for values passed in core - * registers. */ - regp = stack; - eo_regp = argp = regp + 16; - - - /* if the function returns an FFI_TYPE_STRUCT in memory, that address is - * passed in r0 to the function */ - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - *(void **) regp = ecif->rvalue; - regp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++, p_argv++) - { - is_vfp_type = vfp_type_p (*p_arg); - - /* Allocated in VFP registers. */ - if(vi < ecif->cif->vfp_nargs && is_vfp_type) - { - char *vfp_slot = (char *)(vfp_space + ecif->cif->vfp_args[vi++]); - ffi_put_arg(p_arg, p_argv, vfp_slot); - continue; - } - /* Try allocating in core registers. */ - else if (!done_with_regs && !is_vfp_type) - { - char *tregp = ffi_align(p_arg, regp); - size_t size = (*p_arg)->size; - size = (size < 4)? 4 : size; // pad - /* Check if there is space left in the aligned register area to place - * the argument */ - if(tregp + size <= eo_regp) - { - regp = tregp + ffi_put_arg(p_arg, p_argv, tregp); - done_with_regs = (regp == argp); - // ensure we did not write into the stack area - FFI_ASSERT(regp <= argp); - continue; - } - /* In case there are no arguments in the stack area yet, - the argument is passed in the remaining core registers and on the - stack. */ - else if (!stack_used) - { - stack_used = 1; - done_with_regs = 1; - argp = tregp + ffi_put_arg(p_arg, p_argv, tregp); - FFI_ASSERT(eo_regp < argp); - continue; - } - } - /* Base case, arguments are passed on the stack */ - stack_used = 1; - argp = ffi_align(p_arg, argp); - argp += ffi_put_arg(p_arg, p_argv, argp); - } - /* Indicate the VFP registers used. */ - return ecif->cif->vfp_used; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int type_code; - /* Round the stack up to a multiple of 8 bytes. This isn't needed - everywhere, but it is on some platforms, and it doesn't harm anything - when it isn't needed. */ - cif->bytes = (cif->bytes + 7) & ~7; - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) FFI_TYPE_SINT64; - break; - - case FFI_TYPE_STRUCT: - if (cif->abi == FFI_VFP - && (type_code = vfp_type_p (cif->rtype)) != 0) - { - /* A Composite Type passed in VFP registers, either - FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */ - cif->flags = (unsigned) type_code; - } - else if (cif->rtype->size <= 4) - /* A Composite Type not larger than 4 bytes is returned in r0. */ - cif->flags = (unsigned)FFI_TYPE_INT; - else - /* A Composite Type larger than 4 bytes, or whose size cannot - be determined statically ... is stored in memory at an - address passed [in r0]. */ - cif->flags = (unsigned)FFI_TYPE_STRUCT; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - /* Map out the register placements of VFP register args. - The VFP hard-float calling conventions are slightly more sophisticated than - the base calling conventions, so we do it here instead of in ffi_prep_args(). */ - if (cif->abi == FFI_VFP) - layout_vfp_args (cif); - - return FFI_OK; -} - -/* Perform machine dependent cif processing for variadic calls */ -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs) -{ - /* VFP variadic calls actually use the SYSV ABI */ - if (cif->abi == FFI_VFP) - cif->abi = FFI_SYSV; - - return ffi_prep_cif_machdep(cif); -} - -/* Prototypes for assembly functions, in sysv.S */ -extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); -extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - int small_struct = (cif->flags == FFI_TYPE_INT - && cif->rtype->type == FFI_TYPE_STRUCT); - int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT - || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE); - - unsigned int temp; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->flags == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else if (small_struct) - ecif.rvalue = &temp; - else if (vfp_struct) - { - /* Largest case is double x 4. */ - ecif.rvalue = alloca(32); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; - - case FFI_VFP: -#ifdef __ARM_EABI__ - ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; -#endif - - default: - FFI_ASSERT(0); - break; - } - if (small_struct) - { - FFI_ASSERT(rvalue != NULL); - memcpy (rvalue, &temp, cif->rtype->size); - } - - else if (vfp_struct) - { - FFI_ASSERT(rvalue != NULL); - memcpy (rvalue, ecif.rvalue, cif->rtype->size); - } - -} - -/** private members **/ - -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif, float *vfp_stack); - -static void ffi_prep_incoming_args_VFP (char *stack, void **ret, - void** args, ffi_cif* cif, float *vfp_stack); - -void ffi_closure_SYSV (ffi_closure *); - -void ffi_closure_VFP (ffi_closure *); - -/* This function is jumped to by the trampoline */ - -unsigned int FFI_HIDDEN -ffi_closure_inner (ffi_closure *closure, - void **respp, void *args, void *vfp_args) -{ - // our various things... - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. */ - if (cif->abi == FFI_VFP) - ffi_prep_incoming_args_VFP(args, respp, arg_area, cif, vfp_args); - else - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); - - (closure->fun) (cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -/*@-exportheader@*/ -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif, - /* Used only under VFP hard-float ABI. */ - float *vfp_stack) -/*@=exportheader@*/ -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( cif->flags == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) argp; - argp += 4; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - argp = ffi_align(p_arg, argp); - - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/*@-exportheader@*/ -static void -ffi_prep_incoming_args_VFP(char *stack, void **rvalue, - void **avalue, ffi_cif *cif, - /* Used only under VFP hard-float ABI. */ - float *vfp_stack) -/*@=exportheader@*/ -{ - register unsigned int i, vi = 0; - register void **p_argv; - register char *argp, *regp, *eo_regp; - register ffi_type **p_arg; - char done_with_regs = 0; - char stack_used = 0; - char is_vfp_type; - - FFI_ASSERT(cif->abi == FFI_VFP); - regp = stack; - eo_regp = argp = regp + 16; - - if ( cif->flags == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) regp; - regp += 4; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - is_vfp_type = vfp_type_p (*p_arg); - - if(vi < cif->vfp_nargs && is_vfp_type) - { - *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); - continue; - } - else if (!done_with_regs && !is_vfp_type) - { - char* tregp = ffi_align(p_arg, regp); - - z = (*p_arg)->size; - z = (z < 4)? 4 : z; // pad - - /* if the arguments either fits into the registers or uses registers - * and stack, while we haven't read other things from the stack */ - if(tregp + z <= eo_regp || !stack_used) - { - /* because we're little endian, this is what it turns into. */ - *p_argv = (void*) tregp; - - p_argv++; - regp = tregp + z; - // if we read past the last core register, make sure we have not read - // from the stack before and continue reading after regp - if(regp > eo_regp) - { - if(stack_used) - { - abort(); // we should never read past the end of the register - // are if the stack is already in use - } - argp = regp; - } - if(regp >= eo_regp) - { - done_with_regs = 1; - stack_used = 1; - } - continue; - } - } - stack_used = 1; - - argp = ffi_align(p_arg, argp); - - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/* How to make a trampoline. */ - -extern unsigned int ffi_arm_trampoline[3]; - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#include -#include -#include -#include - -extern void *ffi_closure_trampoline_table_page; - -typedef struct ffi_trampoline_table ffi_trampoline_table; -typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; - -struct ffi_trampoline_table { - /* contiguous writable and executable pages */ - vm_address_t config_page; - vm_address_t trampoline_page; - - /* free list tracking */ - uint16_t free_count; - ffi_trampoline_table_entry *free_list; - ffi_trampoline_table_entry *free_list_pool; - - ffi_trampoline_table *prev; - ffi_trampoline_table *next; -}; - -struct ffi_trampoline_table_entry { - void *(*trampoline)(); - ffi_trampoline_table_entry *next; -}; - -/* Override the standard architecture trampoline size */ -// XXX TODO - Fix -#undef FFI_TRAMPOLINE_SIZE -#define FFI_TRAMPOLINE_SIZE 12 - -/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */ -#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080)); - -/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */ -#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16 - -/* Total number of trampolines that fit in one trampoline table */ -#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE) - -static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; -static ffi_trampoline_table *ffi_trampoline_tables = NULL; - -static ffi_trampoline_table * -ffi_trampoline_table_alloc () -{ - ffi_trampoline_table *table = NULL; - - /* Loop until we can allocate two contiguous pages */ - while (table == NULL) { - vm_address_t config_page = 0x0; - kern_return_t kt; - - /* Try to allocate two pages */ - kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); - if (kt != KERN_SUCCESS) { - fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - break; - } - - /* Now drop the second half of the allocation to make room for the trampoline table */ - vm_address_t trampoline_page = config_page+PAGE_SIZE; - kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE); - if (kt != KERN_SUCCESS) { - fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - break; - } - - /* Remap the trampoline table to directly follow the config page */ - vm_prot_t cur_prot; - vm_prot_t max_prot; - - kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); - - /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ - if (kt != KERN_SUCCESS) { - /* Log unexpected failures */ - if (kt != KERN_NO_SPACE) { - fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - } - - vm_deallocate (mach_task_self (), config_page, PAGE_SIZE); - continue; - } - - /* We have valid trampoline and config pages */ - table = calloc (1, sizeof(ffi_trampoline_table)); - table->free_count = FFI_TRAMPOLINE_COUNT; - table->config_page = config_page; - table->trampoline_page = trampoline_page; - - /* Create and initialize the free list */ - table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry)); - - uint16_t i; - for (i = 0; i < table->free_count; i++) { - ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; - entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); - - if (i < table->free_count - 1) - entry->next = &table->free_list_pool[i+1]; - } - - table->free_list = table->free_list_pool; - } - - return table; -} - -void * -ffi_closure_alloc (size_t size, void **code) -{ - /* Create the closure */ - ffi_closure *closure = malloc(size); - if (closure == NULL) - return NULL; - - pthread_mutex_lock(&ffi_trampoline_lock); - - /* Check for an active trampoline table with available entries. */ - ffi_trampoline_table *table = ffi_trampoline_tables; - if (table == NULL || table->free_list == NULL) { - table = ffi_trampoline_table_alloc (); - if (table == NULL) { - free(closure); - return NULL; - } - - /* Insert the new table at the top of the list */ - table->next = ffi_trampoline_tables; - if (table->next != NULL) - table->next->prev = table; - - ffi_trampoline_tables = table; - } - - /* Claim the free entry */ - ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; - ffi_trampoline_tables->free_list = entry->next; - ffi_trampoline_tables->free_count--; - entry->next = NULL; - - pthread_mutex_unlock(&ffi_trampoline_lock); - - /* Initialize the return values */ - *code = entry->trampoline; - closure->trampoline_table = table; - closure->trampoline_table_entry = entry; - - return closure; -} - -void -ffi_closure_free (void *ptr) -{ - ffi_closure *closure = ptr; - - pthread_mutex_lock(&ffi_trampoline_lock); - - /* Fetch the table and entry references */ - ffi_trampoline_table *table = closure->trampoline_table; - ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; - - /* Return the entry to the free list */ - entry->next = table->free_list; - table->free_list = entry; - table->free_count++; - - /* If all trampolines within this table are free, and at least one other table exists, deallocate - * the table */ - if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { - /* Remove from the list */ - if (table->prev != NULL) - table->prev->next = table->next; - - if (table->next != NULL) - table->next->prev = table->prev; - - /* Deallocate pages */ - kern_return_t kt; - kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE); - if (kt != KERN_SUCCESS) - fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - - kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE); - if (kt != KERN_SUCCESS) - fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - - /* Deallocate free list */ - free (table->free_list_pool); - free (table); - } else if (ffi_trampoline_tables != table) { - /* Otherwise, bump this table to the top of the list */ - table->prev = NULL; - table->next = ffi_trampoline_tables; - if (ffi_trampoline_tables != NULL) - ffi_trampoline_tables->prev = table; - - ffi_trampoline_tables = table; - } - - pthread_mutex_unlock (&ffi_trampoline_lock); - - /* Free the closure */ - free (closure); -} - -#else - -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ -({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned char *insns = (unsigned char *)(CTX); \ - memcpy (__tramp, ffi_arm_trampoline, sizeof ffi_arm_trampoline); \ - *(unsigned int*) &__tramp[12] = __ctx; \ - *(unsigned int*) &__tramp[16] = __fun; \ - __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping. */ \ - __clear_cache(insns, insns + 3 * sizeof (unsigned int)); \ - /* Clear instruction \ - mapping. */ \ - }) - -#endif - -/* the cif must already be prep'ed */ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - void (*closure_func)(ffi_closure*) = NULL; - - if (cif->abi == FFI_SYSV) - closure_func = &ffi_closure_SYSV; -#ifdef __ARM_EABI__ - else if (cif->abi == FFI_VFP) - closure_func = &ffi_closure_VFP; -#endif - else - return FFI_BAD_ABI; - -#if FFI_EXEC_TRAMPOLINE_TABLE - void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); - config[0] = closure; - config[1] = closure_func; -#else - FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ - closure_func, \ - codeloc); -#endif - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -/* Below are routines for VFP hard-float support. */ - -static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum) -{ - switch (t->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - *elt = (int) t->type; - *elnum = 1; - return 1; - - case FFI_TYPE_STRUCT_VFP_FLOAT: - *elt = FFI_TYPE_FLOAT; - *elnum = t->size / sizeof (float); - return 1; - - case FFI_TYPE_STRUCT_VFP_DOUBLE: - *elt = FFI_TYPE_DOUBLE; - *elnum = t->size / sizeof (double); - return 1; - - case FFI_TYPE_STRUCT:; - { - int base_elt = 0, total_elnum = 0; - ffi_type **el = t->elements; - while (*el) - { - int el_elt = 0, el_elnum = 0; - if (! rec_vfp_type_p (*el, &el_elt, &el_elnum) - || (base_elt && base_elt != el_elt) - || total_elnum + el_elnum > 4) - return 0; - base_elt = el_elt; - total_elnum += el_elnum; - el++; - } - *elnum = total_elnum; - *elt = base_elt; - return 1; - } - default: ; - } - return 0; -} - -static int vfp_type_p (ffi_type *t) -{ - int elt, elnum; - if (rec_vfp_type_p (t, &elt, &elnum)) - { - if (t->type == FFI_TYPE_STRUCT) - { - if (elnum == 1) - t->type = elt; - else - t->type = (elt == FFI_TYPE_FLOAT - ? FFI_TYPE_STRUCT_VFP_FLOAT - : FFI_TYPE_STRUCT_VFP_DOUBLE); - } - return (int) t->type; - } - return 0; -} - -static int place_vfp_arg (ffi_cif *cif, ffi_type *t) -{ - short reg = cif->vfp_reg_free; - int nregs = t->size / sizeof (float); - int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT - || t->type == FFI_TYPE_FLOAT) ? 1 : 2); - /* Align register number. */ - if ((reg & 1) && align == 2) - reg++; - while (reg + nregs <= 16) - { - int s, new_used = 0; - for (s = reg; s < reg + nregs; s++) - { - new_used |= (1 << s); - if (cif->vfp_used & (1 << s)) - { - reg += align; - goto next_reg; - } - } - /* Found regs to allocate. */ - cif->vfp_used |= new_used; - cif->vfp_args[cif->vfp_nargs++] = reg; - - /* Update vfp_reg_free. */ - if (cif->vfp_used & (1 << cif->vfp_reg_free)) - { - reg += nregs; - while (cif->vfp_used & (1 << reg)) - reg += 1; - cif->vfp_reg_free = reg; - } - return 0; - next_reg: ; - } - // done, mark all regs as used - cif->vfp_reg_free = 16; - cif->vfp_used = 0xFFFF; - return 1; -} - -static void layout_vfp_args (ffi_cif *cif) -{ - int i; - /* Init VFP fields */ - cif->vfp_used = 0; - cif->vfp_nargs = 0; - cif->vfp_reg_free = 0; - memset (cif->vfp_args, -1, 16); /* Init to -1. */ - - for (i = 0; i < cif->nargs; i++) - { - ffi_type *t = cif->arg_types[i]; - if (vfp_type_p (t) && place_vfp_arg (cif, t) == 1) - { - break; - } - } -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/arm/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/arm/ffitarget.h deleted file mode 100644 index 26d494d61..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arm/ffitarget.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2010 CodeSourcery - Copyright (c) 1996-2003 Red Hat, Inc. - - Target configuration macros for ARM. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_VFP, - FFI_LAST_ABI, -#ifdef __ARM_PCS_VFP - FFI_DEFAULT_ABI = FFI_VFP, -#else - FFI_DEFAULT_ABI = FFI_SYSV, -#endif -} ffi_abi; -#endif - -#define FFI_EXTRA_CIF_FIELDS \ - int vfp_used; \ - short vfp_reg_free, vfp_nargs; \ - signed char vfp_args[16] \ - -/* Internally used. */ -#define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1) -#define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2) - -#define FFI_TARGET_SPECIFIC_VARIADIC - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 20 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/arm/gentramp.sh b/third_party/python/Modules/_ctypes/libffi/src/arm/gentramp.sh deleted file mode 100755 index 05c43a30f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arm/gentramp.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh - -# ----------------------------------------------------------------------- -# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. -# -# ARM Trampoline Page Generator -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# ``Software''), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -# ----------------------------------------------------------------------- - -PROGNAME=$0 - -# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, -# the entire arm trampoline implementation must be updated to match, too. - -# Size of an individual trampoline, in bytes -TRAMPOLINE_SIZE=12 - -# Page size, in bytes -PAGE_SIZE=4096 - -# Compute the size of the reachable config page; The first 16 bytes of the config page -# are unreachable due to our maximum pc-relative ldr offset. -PAGE_AVAIL=`expr $PAGE_SIZE - 16` - -# Compute the number of of available trampolines. -TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` - -header () { - echo "# GENERATED CODE - DO NOT EDIT" - echo "# This file was generated by $PROGNAME" - echo "" - - # Write out the license header -cat << EOF -# Copyright (c) 2010, Plausible Labs Cooperative, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# ``Software''), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -# ----------------------------------------------------------------------- - -EOF - - # Write out the trampoline table, aligned to the page boundary - echo ".text" - echo ".align 12" - echo ".globl _ffi_closure_trampoline_table_page" - echo "_ffi_closure_trampoline_table_page:" -} - - -# WARNING - Don't modify the trampoline code size without also updating the relevant libffi code -trampoline () { - cat << END - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - -END -} - -main () { - # Write out the header - header - - # Write out the trampolines - local i=0 - while [ $i -lt ${TRAMPOLINE_COUNT} ]; do - trampoline - local i=`expr $i + 1` - done -} - -main diff --git a/third_party/python/Modules/_ctypes/libffi/src/arm/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/arm/sysv.S deleted file mode 100644 index 541bbe923..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arm/sysv.S +++ /dev/null @@ -1,491 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - - ARM Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#ifdef __USER_LABEL_PREFIX__ -#define CONCAT1(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -/* Use the right prefix for global labels. */ -#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) -#else -#define CNAME(x) x -#endif -#ifdef __APPLE__ -#define ENTRY(x) .globl _##x; _##x: -#else -#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): -#endif /* __APPLE__ */ -#endif - -#ifdef __ELF__ -#define LSYM(x) .x -#else -#define LSYM(x) x -#endif - -/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI - Function Call Guide */ -#ifdef __APPLE__ -#define __SOFTFP__ -#endif - -/* We need a better way of testing for this, but for now, this is all - we can do. */ -@ This selects the minimum architecture level required. -#define __ARM_ARCH__ 3 - -#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) -# undef __ARM_ARCH__ -# define __ARM_ARCH__ 4 -#endif - -#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ - || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ - || defined(__ARM_ARCH_5TEJ__) -# undef __ARM_ARCH__ -# define __ARM_ARCH__ 5 -#endif - -#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ - || defined(__ARM_ARCH_6M__) -# undef __ARM_ARCH__ -# define __ARM_ARCH__ 6 -#endif - -#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ - || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ - || defined(__ARM_ARCH_7EM__) -# undef __ARM_ARCH__ -# define __ARM_ARCH__ 7 -#endif - -#if __ARM_ARCH__ >= 5 -# define call_reg(x) blx x -#elif defined (__ARM_ARCH_4T__) -# define call_reg(x) mov lr, pc ; bx x -# if defined(__thumb__) || defined(__THUMB_INTERWORK__) -# define __INTERWORKING__ -# endif -#else -# define call_reg(x) mov lr, pc ; mov pc, x -#endif - -/* Conditionally compile unwinder directives. */ -#ifdef __ARM_EABI__ -#define UNWIND -#else -#define UNWIND @ -#endif - -.syntax unified - -#if defined(__thumb__) && !defined(__THUMB_INTERWORK__) -#define ARM_FUNC_START(name) \ - .text; \ - .align 2; \ - .thumb; \ - .thumb_func; \ - ENTRY(name); \ - bx pc; \ - nop; \ - .arm; \ - UNWIND .fnstart; \ -_L__##name: -#else -#define ARM_FUNC_START(name) \ - .text; \ - .align 2; \ - .arm; \ - ENTRY(name); \ - UNWIND .fnstart -#endif - -.macro RETLDM regs=, cond=, dirn=ia -#if defined (__INTERWORKING__) - .ifc "\regs","" - ldr\cond lr, [sp], #4 - .else - ldm\cond\dirn sp!, {\regs, lr} - .endif - bx\cond lr -#else - .ifc "\regs","" - ldr\cond pc, [sp], #4 - .else - ldm\cond\dirn sp!, {\regs, pc} - .endif -#endif -.endm - - @ r0: ffi_prep_args - @ r1: &ecif - @ r2: cif->bytes - @ r3: fig->flags - @ sp+0: ecif.rvalue - - @ This assumes we are using gas. -ARM_FUNC_START(ffi_call_SYSV) - @ Save registers - stmfd sp!, {r0-r3, fp, lr} - UNWIND .save {r0-r3, fp, lr} - mov fp, sp - - UNWIND .setfp fp, sp - - @ Make room for all of the new args. - sub sp, fp, r2 - - @ Place all of the ffi_prep_args in position - mov r0, sp - @ r1 already set - - @ Call ffi_prep_args(stack, &ecif) - bl CNAME(ffi_prep_args_SYSV) - - @ move first 4 parameters in registers - ldmia sp, {r0-r3} - - @ and adjust stack - sub lr, fp, sp @ cif->bytes == fp - sp - ldr ip, [fp] @ load fn() in advance - cmp lr, #16 - movhs lr, #16 - add sp, sp, lr - - @ call (fn) (...) - call_reg(ip) - - @ Remove the space we pushed for the args - mov sp, fp - - @ Load r2 with the pointer to storage for the return value - ldr r2, [sp, #24] - - @ Load r3 with the return type code - ldr r3, [sp, #12] - - @ If the return value pointer is NULL, assume no return value. - cmp r2, #0 - beq LSYM(Lepilogue) - -@ return INT - cmp r3, #FFI_TYPE_INT -#if defined(__SOFTFP__) || defined(__ARM_EABI__) - cmpne r3, #FFI_TYPE_FLOAT -#endif - streq r0, [r2] - beq LSYM(Lepilogue) - - @ return INT64 - cmp r3, #FFI_TYPE_SINT64 -#if defined(__SOFTFP__) || defined(__ARM_EABI__) - cmpne r3, #FFI_TYPE_DOUBLE -#endif - stmiaeq r2, {r0, r1} - -#if !defined(__SOFTFP__) && !defined(__ARM_EABI__) - beq LSYM(Lepilogue) - -@ return FLOAT - cmp r3, #FFI_TYPE_FLOAT - stfeqs f0, [r2] - beq LSYM(Lepilogue) - -@ return DOUBLE or LONGDOUBLE - cmp r3, #FFI_TYPE_DOUBLE - stfeqd f0, [r2] -#endif - -LSYM(Lepilogue): -#if defined (__INTERWORKING__) - ldmia sp!, {r0-r3,fp, lr} - bx lr -#else - ldmia sp!, {r0-r3,fp, pc} -#endif - -.ffi_call_SYSV_end: - UNWIND .fnend -#ifdef __ELF__ - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) -#endif - - -/* - unsigned int FFI_HIDDEN - ffi_closure_inner (closure, respp, args) - ffi_closure *closure; - void **respp; - void *args; -*/ - -ARM_FUNC_START(ffi_closure_SYSV) - UNWIND .pad #16 - add ip, sp, #16 - stmfd sp!, {ip, lr} - UNWIND .save {r0, lr} - add r2, sp, #8 - UNWIND .pad #16 - sub sp, sp, #16 - str sp, [sp, #8] - add r1, sp, #8 - bl CNAME(ffi_closure_inner) - cmp r0, #FFI_TYPE_INT - beq .Lretint - - cmp r0, #FFI_TYPE_FLOAT -#if defined(__SOFTFP__) || defined(__ARM_EABI__) - beq .Lretint -#else - beq .Lretfloat -#endif - - cmp r0, #FFI_TYPE_DOUBLE -#if defined(__SOFTFP__) || defined(__ARM_EABI__) - beq .Lretlonglong -#else - beq .Lretdouble -#endif - - cmp r0, #FFI_TYPE_LONGDOUBLE -#if defined(__SOFTFP__) || defined(__ARM_EABI__) - beq .Lretlonglong -#else - beq .Lretlongdouble -#endif - - cmp r0, #FFI_TYPE_SINT64 - beq .Lretlonglong -.Lclosure_epilogue: - add sp, sp, #16 - ldmfd sp, {sp, pc} -.Lretint: - ldr r0, [sp] - b .Lclosure_epilogue -.Lretlonglong: - ldr r0, [sp] - ldr r1, [sp, #4] - b .Lclosure_epilogue - -#if !defined(__SOFTFP__) && !defined(__ARM_EABI__) -.Lretfloat: - ldfs f0, [sp] - b .Lclosure_epilogue -.Lretdouble: - ldfd f0, [sp] - b .Lclosure_epilogue -.Lretlongdouble: - ldfd f0, [sp] - b .Lclosure_epilogue -#endif - -.ffi_closure_SYSV_end: - UNWIND .fnend -#ifdef __ELF__ - .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) -#endif - - -/* Below are VFP hard-float ABI call and closure implementations. - Add VFP FPU directive here. This is only compiled into the library - under EABI. */ -#ifdef __ARM_EABI__ - .fpu vfp - - @ r0: fn - @ r1: &ecif - @ r2: cif->bytes - @ r3: fig->flags - @ sp+0: ecif.rvalue - -ARM_FUNC_START(ffi_call_VFP) - @ Save registers - stmfd sp!, {r0-r3, fp, lr} - UNWIND .save {r0-r3, fp, lr} - mov fp, sp - UNWIND .setfp fp, sp - - @ Make room for all of the new args. - sub sp, sp, r2 - - @ Make room for loading VFP args - sub sp, sp, #64 - - @ Place all of the ffi_prep_args in position - mov r0, sp - @ r1 already set - sub r2, fp, #64 @ VFP scratch space - - @ Call ffi_prep_args(stack, &ecif, vfp_space) - bl CNAME(ffi_prep_args_VFP) - - @ Load VFP register args if needed - cmp r0, #0 - mov ip, fp - beq LSYM(Lbase_args) - - @ Load only d0 if possible - cmp r0, #3 - sub ip, fp, #64 - flddle d0, [ip] - fldmiadgt ip, {d0-d7} - -LSYM(Lbase_args): - @ move first 4 parameters in registers - ldmia sp, {r0-r3} - - @ and adjust stack - sub lr, ip, sp @ cif->bytes == (fp - 64) - sp - ldr ip, [fp] @ load fn() in advance - cmp lr, #16 - movhs lr, #16 - add sp, sp, lr - - @ call (fn) (...) - call_reg(ip) - - @ Remove the space we pushed for the args - mov sp, fp - - @ Load r2 with the pointer to storage for - @ the return value - ldr r2, [sp, #24] - - @ Load r3 with the return type code - ldr r3, [sp, #12] - - @ If the return value pointer is NULL, - @ assume no return value. - cmp r2, #0 - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_INT - streq r0, [r2] - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_SINT64 - stmeqia r2, {r0, r1} - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_FLOAT - fstseq s0, [r2] - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_DOUBLE - fstdeq d0, [r2] - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT - cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE - fstmiadeq r2, {d0-d3} - -LSYM(Lepilogue_vfp): - RETLDM "r0-r3,fp" - -.ffi_call_VFP_end: - UNWIND .fnend - .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) - - -ARM_FUNC_START(ffi_closure_VFP) - fstmfdd sp!, {d0-d7} - @ r0-r3, then d0-d7 - UNWIND .pad #80 - add ip, sp, #80 - stmfd sp!, {ip, lr} - UNWIND .save {r0, lr} - add r2, sp, #72 - add r3, sp, #8 - UNWIND .pad #72 - sub sp, sp, #72 - str sp, [sp, #64] - add r1, sp, #64 - bl CNAME(ffi_closure_inner) - - cmp r0, #FFI_TYPE_INT - beq .Lretint_vfp - - cmp r0, #FFI_TYPE_FLOAT - beq .Lretfloat_vfp - - cmp r0, #FFI_TYPE_DOUBLE - cmpne r0, #FFI_TYPE_LONGDOUBLE - beq .Lretdouble_vfp - - cmp r0, #FFI_TYPE_SINT64 - beq .Lretlonglong_vfp - - cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT - beq .Lretfloat_struct_vfp - - cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE - beq .Lretdouble_struct_vfp - -.Lclosure_epilogue_vfp: - add sp, sp, #72 - ldmfd sp, {sp, pc} - -.Lretfloat_vfp: - flds s0, [sp] - b .Lclosure_epilogue_vfp -.Lretdouble_vfp: - fldd d0, [sp] - b .Lclosure_epilogue_vfp -.Lretint_vfp: - ldr r0, [sp] - b .Lclosure_epilogue_vfp -.Lretlonglong_vfp: - ldmia sp, {r0, r1} - b .Lclosure_epilogue_vfp -.Lretfloat_struct_vfp: - fldmiad sp, {d0-d1} - b .Lclosure_epilogue_vfp -.Lretdouble_struct_vfp: - fldmiad sp, {d0-d3} - b .Lclosure_epilogue_vfp - -.ffi_closure_VFP_end: - UNWIND .fnend - .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP) -#endif - -ENTRY(ffi_arm_trampoline) - stmfd sp!, {r0-r3} - ldr r0, [pc] - ldr pc, [pc] - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/arm/trampoline.S b/third_party/python/Modules/_ctypes/libffi/src/arm/trampoline.S deleted file mode 100644 index 935e8de17..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/arm/trampoline.S +++ /dev/null @@ -1,4450 +0,0 @@ -# GENERATED CODE - DO NOT EDIT -# This file was generated by src/arm/gentramp.sh - -# Copyright (c) 2010, Plausible Labs Cooperative, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# Software''), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -# ----------------------------------------------------------------------- - -.text -.align 12 -.globl _ffi_closure_trampoline_table_page -_ffi_closure_trampoline_table_page: - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - - - // trampoline - // Save to stack - stmfd sp!, {r0-r3} - - // Load the context argument from the config page. - // This places the first usable config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. - ldr r0, [pc, #-4092] - - // Load the jump address from the config page. - ldr pc, [pc, #-4092] - diff --git a/third_party/python/Modules/_ctypes/libffi/src/avr32/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/avr32/ffi.c deleted file mode 100644 index 3d43397b0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/avr32/ffi.c +++ /dev/null @@ -1,423 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Anthony Green - Copyright (c) 2009 Bradley Smith - - AVR32 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include -#include - -/* #define DEBUG */ - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned int, unsigned int, unsigned int*, unsigned int, - void (*fn)(void)); -extern void ffi_closure_SYSV (ffi_closure *); - -unsigned int pass_struct_on_stack(ffi_type *type) -{ - if(type->type != FFI_TYPE_STRUCT) - return 0; - - if(type->alignment < type->size && - !(type->size == 4 || type->size == 8) && - !(type->size == 8 && type->alignment >= 4)) - return 1; - - if(type->size == 3 || type->size == 5 || type->size == 6 || - type->size == 7) - return 1; - - return 0; -} - -/* ffi_prep_args is called by the assembly routine once stack space - * has been allocated for the function's arguments - * - * This is annoyingly complex since we need to keep track of used - * registers. - */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - ffi_type **p_arg; - char *reg_base = stack; - char *stack_base = stack + 20; - unsigned int stack_offset = 0; - unsigned int reg_mask = 0; - - p_argv = ecif->avalue; - - /* If cif->flags is struct then we know it's not passed in registers */ - if(ecif->cif->flags == FFI_TYPE_STRUCT) - { - *(void**)reg_base = ecif->rvalue; - reg_mask |= 1; - } - - for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t z = (*p_arg)->size; - int alignment = (*p_arg)->alignment; - int type = (*p_arg)->type; - char *addr = 0; - - if(z % 4 != 0) - z += (4 - z % 4); - - if(reg_mask != 0x1f) - { - if(pass_struct_on_stack(*p_arg)) - { - addr = stack_base + stack_offset; - stack_offset += z; - } - else if(z == sizeof(int)) - { - char index = 0; - - while((reg_mask >> index) & 1) - index++; - - addr = reg_base + (index * 4); - reg_mask |= (1 << index); - } - else if(z == 2 * sizeof(int)) - { - if(!((reg_mask >> 1) & 1)) - { - addr = reg_base + 4; - reg_mask |= (3 << 1); - } - else if(!((reg_mask >> 3) & 1)) - { - addr = reg_base + 12; - reg_mask |= (3 << 3); - } - } - } - - if(!addr) - { - addr = stack_base + stack_offset; - stack_offset += z; - } - - if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL) - type = (*p_arg)->elements[0]->type; - - switch(type) - { - case FFI_TYPE_UINT8: - *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv); - break; - case FFI_TYPE_SINT8: - *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv); - break; - case FFI_TYPE_SINT16: - *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv); - break; - default: - memcpy(addr, *p_argv, z); - } - - p_argv++; - } - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < 5; i++) - { - if((reg_mask & (1 << i)) == 0) - printf("r%d: (unused)\n", 12 - i); - else - printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]); - } - - for(i = 0; i < stack_offset / 4; i++) - { - printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]); - } -#endif -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Round the stack up to a multiple of 8 bytes. This isn't needed - * everywhere, but it is on some platforms, and it doesn't harm - * anything when it isn't needed. */ - cif->bytes = (cif->bytes + 7) & ~7; - - /* Flag to indicate that he return value is in fact a struct */ - cif->rstruct_flag = 0; - - /* Set the return type flag */ - switch(cif->rtype->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - cif->flags = (unsigned)FFI_TYPE_UINT8; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - cif->flags = (unsigned)FFI_TYPE_UINT16; - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - cif->flags = (unsigned)FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned)FFI_TYPE_UINT64; - break; - case FFI_TYPE_STRUCT: - cif->rstruct_flag = 1; - if(!pass_struct_on_stack(cif->rtype)) - { - if(cif->rtype->size <= 1) - cif->flags = (unsigned)FFI_TYPE_UINT8; - else if(cif->rtype->size <= 2) - cif->flags = (unsigned)FFI_TYPE_UINT16; - else if(cif->rtype->size <= 4) - cif->flags = (unsigned)FFI_TYPE_UINT32; - else if(cif->rtype->size <= 8) - cif->flags = (unsigned)FFI_TYPE_UINT64; - else - cif->flags = (unsigned)cif->rtype->type; - } - else - cif->flags = (unsigned)cif->rtype->type; - break; - default: - cif->flags = (unsigned)cif->rtype->type; - break; - } - - return FFI_OK; -} - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - unsigned int size = 0, i = 0; - ffi_type **p_arg; - - ecif.cif = cif; - ecif.avalue = avalue; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - size += (*p_arg)->size + (4 - (*p_arg)->size % 4); - - /* If the return value is a struct and we don't have a return value - * address then we need to make one */ - - /* If cif->flags is struct then it's not suitable for registers */ - if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch(cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags, - ecif.rvalue, cif->rstruct_flag, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif) -{ - register unsigned int i, reg_mask = 0; - register void **p_argv; - register ffi_type **p_arg; - register char *reg_base = stack; - register char *stack_base = stack + 20; - register unsigned int stack_offset = 0; - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < cif->nargs + 7; i++) - { - printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]); - } -#endif - - /* If cif->flags is struct then we know it's not passed in registers */ - if(cif->flags == FFI_TYPE_STRUCT) - { - *rvalue = *(void **)reg_base; - reg_mask |= 1; - } - - p_argv = avalue; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - { - size_t z = (*p_arg)->size; - int alignment = (*p_arg)->alignment; - - *p_argv = 0; - - if(z % 4 != 0) - z += (4 - z % 4); - - if(reg_mask != 0x1f) - { - if(pass_struct_on_stack(*p_arg)) - { - *p_argv = (void*)stack_base + stack_offset; - stack_offset += z; - } - else if(z <= sizeof(int)) - { - char index = 0; - - while((reg_mask >> index) & 1) - index++; - - *p_argv = (void*)reg_base + (index * 4); - reg_mask |= (1 << index); - } - else if(z == 2 * sizeof(int)) - { - if(!((reg_mask >> 1) & 1)) - { - *p_argv = (void*)reg_base + 4; - reg_mask |= (3 << 1); - } - else if(!((reg_mask >> 3) & 1)) - { - *p_argv = (void*)reg_base + 12; - reg_mask |= (3 << 3); - } - } - } - - if(!*p_argv) - { - *p_argv = (void*)stack_base + stack_offset; - stack_offset += z; - } - - if((*p_arg)->type != FFI_TYPE_STRUCT || - (*p_arg)->elements[1] == NULL) - { - if(alignment == 1) - **(unsigned int**)p_argv <<= 24; - else if(alignment == 2) - **(unsigned int**)p_argv <<= 16; - } - - p_argv++; - } - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < cif->nargs; i++) - { - printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i])); - } -#endif -} - -/* This function is jumped to by the trampoline */ - -unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp, - void *args) -{ - ffi_cif *cif; - void **arg_area; - unsigned int i, size = 0; - ffi_type **p_arg; - - cif = closure->cif; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - size += (*p_arg)->size + (4 - (*p_arg)->size % 4); - - arg_area = (void **)alloca(size); - - /* this call will initialize ARG_AREA, such that each element in that - * array points to the corresponding value on the stack; and if the - * function returns a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); - - (closure->fun)(cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); - unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); - unsigned int __ctx = (unsigned int)(codeloc); - unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); - unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); - *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ - *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ - *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */ - *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */ - *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */ - *(unsigned int*) &__tramp[20] = __ctx; - *(unsigned int*) &__tramp[24] = __rstruct_flag; - *(unsigned int*) &__tramp[28] = __inner; - *(unsigned int*) &__tramp[32] = __fun; - syscall(__NR_cacheflush, 0, (&__tramp[0]), 36); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - diff --git a/third_party/python/Modules/_ctypes/libffi/src/avr32/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/avr32/ffitarget.h deleted file mode 100644 index d0c7586f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/avr32/ffitarget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2009 Bradley Smith - Target configuration macros for AVR32. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag - -/* Definitions for closures */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 36 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/avr32/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/avr32/sysv.S deleted file mode 100644 index a984b3c88..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/avr32/sysv.S +++ /dev/null @@ -1,208 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2009 Bradley Smith - - AVR32 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - /* r12: ffi_prep_args - * r11: &ecif - * r10: size - * r9: cif->flags - * r8: ecif.rvalue - * sp+0: cif->rstruct_flag - * sp+4: fn */ - - .text - .align 1 - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -ffi_call_SYSV: - stm --sp, r0,r1,lr - stm --sp, r8-r12 - mov r0, sp - - /* Make room for all of the new args. */ - sub sp, r10 - /* Pad to make way for potential skipped registers */ - sub sp, 20 - - /* Call ffi_prep_args(stack, &ecif). */ - /* r11 already set */ - mov r1, r12 - mov r12, sp - icall r1 - - /* Save new argument size */ - mov r1, r12 - - /* Move first 5 parameters in registers. */ - ldm sp++, r8-r12 - - /* call (fn) (...). */ - ld.w r1, r0[36] - icall r1 - - /* Remove the space we pushed for the args. */ - mov sp, r0 - - /* Load r1 with the rstruct flag. */ - ld.w r1, sp[32] - - /* Load r9 with the return type code. */ - ld.w r9, sp[12] - - /* Load r8 with the return value pointer. */ - ld.w r8, sp[16] - - /* If the return value pointer is NULL, assume no return value. */ - cp.w r8, 0 - breq .Lend - - /* Check if return type is actually a struct */ - cp.w r1, 0 - breq 1f - - /* Return 8bit */ - cp.w r9, FFI_TYPE_UINT8 - breq .Lstore8 - - /* Return 16bit */ - cp.w r9, FFI_TYPE_UINT16 - breq .Lstore16 - -1: - /* Return 32bit */ - cp.w r9, FFI_TYPE_UINT32 - breq .Lstore32 - cp.w r9, FFI_TYPE_UINT16 - breq .Lstore32 - cp.w r9, FFI_TYPE_UINT8 - breq .Lstore32 - - /* Return 64bit */ - cp.w r9, FFI_TYPE_UINT64 - breq .Lstore64 - - /* Didn't match anything */ - bral .Lend - -.Lstore64: - st.w r8[0], r11 - st.w r8[4], r10 - bral .Lend - -.Lstore32: - st.w r8[0], r12 - bral .Lend - -.Lstore16: - st.h r8[0], r12 - bral .Lend - -.Lstore8: - st.b r8[0], r12 - bral .Lend - -.Lend: - sub sp, -20 - ldm sp++, r0,r1,pc - - .size ffi_call_SYSV, . - ffi_call_SYSV - - - /* r12: __ctx - * r11: __rstruct_flag - * r10: __inner */ - - .align 1 - .globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function -ffi_closure_SYSV: - stm --sp, r0,lr - mov r0, r11 - mov r8, r10 - sub r10, sp, -8 - sub sp, 12 - st.w sp[8], sp - sub r11, sp, -8 - icall r8 - - /* Check if return type is actually a struct */ - cp.w r0, 0 - breq 1f - - /* Return 8bit */ - cp.w r12, FFI_TYPE_UINT8 - breq .Lget8 - - /* Return 16bit */ - cp.w r12, FFI_TYPE_UINT16 - breq .Lget16 - -1: - /* Return 32bit */ - cp.w r12, FFI_TYPE_UINT32 - breq .Lget32 - cp.w r12, FFI_TYPE_UINT16 - breq .Lget32 - cp.w r12, FFI_TYPE_UINT8 - breq .Lget32 - - /* Return 64bit */ - cp.w r12, FFI_TYPE_UINT64 - breq .Lget64 - - /* Didn't match anything */ - bral .Lclend - -.Lget64: - ld.w r11, sp[0] - ld.w r10, sp[4] - bral .Lclend - -.Lget32: - ld.w r12, sp[0] - bral .Lclend - -.Lget16: - ld.uh r12, sp[0] - bral .Lclend - -.Lget8: - ld.ub r12, sp[0] - bral .Lclend - -.Lclend: - sub sp, -12 - ldm sp++, r0,lr - sub sp, -20 - mov pc, lr - - .size ffi_closure_SYSV, . - ffi_closure_SYSV - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/bfin/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/bfin/ffi.c deleted file mode 100644 index 22a2acdac..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/bfin/ffi.c +++ /dev/null @@ -1,196 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ -#include -#include - -#include -#include - -/* Maximum number of GPRs available for argument passing. */ -#define MAX_GPRARGS 3 - -/* - * Return types - */ -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 - -/*====================================================================*/ -/* PROTOTYPE * - /*====================================================================*/ -void ffi_prep_args(unsigned char *, extended_cif *); - -/*====================================================================*/ -/* Externals */ -/* (Assembly) */ -/*====================================================================*/ - -extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); - -/*====================================================================*/ -/* Implementation */ -/* */ -/*====================================================================*/ - - -/* - * This function calculates the return type (size) based on type. - */ - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* --------------------------------------* - * Return handling * - * --------------------------------------*/ - switch (cif->rtype->type) { - case FFI_TYPE_VOID: - cif->flags = FFIBFIN_RET_VOID; - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - cif->flags = FFIBFIN_RET_HALFWORD; - break; - case FFI_TYPE_UINT8: - cif->flags = FFIBFIN_RET_BYTE; - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - case FFI_TYPE_SINT8: - cif->flags = FFIBFIN_RET_INT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFIBFIN_RET_INT64; - break; - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4){ - cif->flags = FFIBFIN_RET_INT32; - }else if (cif->rtype->size == 8){ - cif->flags = FFIBFIN_RET_INT64; - }else{ - //it will return via a hidden pointer in P0 - cif->flags = FFIBFIN_RET_VOID; - } - break; - default: - FFI_ASSERT(0); - break; - } - return FFI_OK; -} - -/* - * This will prepare the arguments and will call the assembly routine - * cif = the call interface - * fn = the function to be called - * rvalue = the return value - * avalue = the arguments - */ -void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) -{ - int ret_type = cif->flags; - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - switch (cif->abi) { - case FFI_SYSV: - ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - - -/* -* This function prepares the parameters (copies them from the ecif to the stack) -* to call the function (ffi_prep_args is called by the assembly routine in file -* sysv.S, which also calls the actual function) -*/ -void ffi_prep_args(unsigned char *stack, extended_cif *ecif) -{ - register unsigned int i = 0; - void **p_argv; - unsigned char *argp; - ffi_type **p_arg; - argp = stack; - p_argv = ecif->avalue; - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) { - size_t z; - z = (*p_arg)->size; - if (z < sizeof(int)) { - z = sizeof(int); - switch ((*p_arg)->type) { - case FFI_TYPE_SINT8: { - signed char v = *(SINT8 *)(* p_argv); - signed int t = v; - *(signed int *) argp = t; - } - break; - case FFI_TYPE_UINT8: { - unsigned char v = *(UINT8 *)(* p_argv); - unsigned int t = v; - *(unsigned int *) argp = t; - } - break; - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); - break; - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - default: - FFI_ASSERT(0); - break; - } - } else if (z == sizeof(int)) { - *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); - } else { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } -} - - - diff --git a/third_party/python/Modules/_ctypes/libffi/src/bfin/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/bfin/ffitarget.h deleted file mode 100644 index 2175c0101..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/bfin/ffitarget.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca - - Blackfin Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/bfin/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/bfin/sysv.S deleted file mode 100644 index f4278be24..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/bfin/sysv.S +++ /dev/null @@ -1,179 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -.text -.align 4 - - /* - There is a "feature" in the bfin toolchain that it puts a _ before function names - that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV - */ - .global _ffi_call_SYSV; - .type _ffi_call_SYSV, STT_FUNC; - .func ffi_call_SYSV - - /* - cif->bytes = R0 (fp+8) - &ecif = R1 (fp+12) - ffi_prep_args = R2 (fp+16) - ret_type = stack (fp+20) - ecif.rvalue = stack (fp+24) - fn = stack (fp+28) - got (fp+32) - - There is room for improvement here (we can use temporary registers - instead of saving the values in the memory) - REGS: - P5 => Stack pointer (function arguments) - R5 => cif->bytes - R4 => ret->type - - FP-20 = P3 - FP-16 = SP (parameters area) - FP-12 = SP (temp) - FP-08 = function return part 1 [R0] - FP-04 = function return part 2 [R1] - */ - -_ffi_call_SYSV: -.prologue: - LINK 20; - [FP-20] = P3; - [FP+8] = R0; - [FP+12] = R1; - [FP+16] = R2; - -.allocate_stack: - //alocate cif->bytes into the stack - R1 = [FP+8]; - R0 = SP; - R0 = R0 - R1; - R1 = 4; - R0 = R0 - R1; - [FP-12] = SP; - SP = R0; - [FP-16] = SP; - -.call_prep_args: - //get the addr of prep_args - P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; - P1 = [P0]; - P3 = [P0+4]; - R0 = [FP-16];//SP (parameter area) - R1 = [FP+12];//ecif - call (P1); - -.call_user_function: - //ajust SP so as to allow the user function access the parameters on the stack - SP = [FP-16]; //point to function parameters - R0 = [SP]; - R1 = [SP+4]; - R2 = [SP+8]; - //load user function address - P0 = FP; - P0 +=28; - P1 = [P0]; - P1 = [P1]; - P3 = [P0+4]; - /* - For functions returning aggregate values (struct) occupying more than 8 bytes, - the caller allocates the return value object on the stack and the address - of this object is passed to the callee as a hidden argument in register P0. - */ - P0 = [FP+24]; - - call (P1); - SP = [FP-12]; -.compute_return: - P2 = [FP-20]; - [FP-8] = R0; - [FP-4] = R1; - - R0 = [FP+20]; - R1 = R0 << 2; - - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R1 = [P2]; - - P2 = [FP+-20]; - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R0 = [FP-8]; - R1 = [FP-4]; - jump (P2); - -/* -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 -*/ -.align 4 -.align 4 -.rettable: - .dd .epilogue - .rettable - .dd .rbyte - .rettable; - .dd .rhalfword - .rettable; - .dd .rint64 - .rettable; - .dd .rint32 - .rettable; - -.rbyte: - P0 = [FP+24]; - R0 = R0.B (Z); - [P0] = R0; - JUMP .epilogue -.rhalfword: - P0 = [FP+24]; - R0 = R0.L; - [P0] = R0; - JUMP .epilogue -.rint64: - P0 = [FP+24];// &rvalue - [P0] = R0; - [P0+4] = R1; - JUMP .epilogue -.rint32: - P0 = [FP+24]; - [P0] = R0; -.epilogue: - R0 = [FP+8]; - R1 = [FP+12]; - R2 = [FP+16]; - P3 = [FP-20]; - UNLINK; - RTS; - -.size _ffi_call_SYSV,.-_ffi_call_SYSV; -.endfunc diff --git a/third_party/python/Modules/_ctypes/libffi/src/closures.c b/third_party/python/Modules/_ctypes/libffi/src/closures.c deleted file mode 100644 index c7863f3d0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/closures.c +++ /dev/null @@ -1,660 +0,0 @@ -/* ----------------------------------------------------------------------- - closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc. - Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - - Code to allocate and deallocate memory for closures. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#if defined __linux__ && !defined _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -#include -#include - -#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE -# if __gnu_linux__ && !defined(__ANDROID__) -/* This macro indicates it may be forbidden to map anonymous memory - with both write and execute permission. Code compiled when this - option is defined will attempt to map such pages once, but if it - fails, it falls back to creating a temporary file in a writable and - executable filesystem and mapping pages from it into separate - locations in the virtual memory space, one location writable and - another executable. */ -# define FFI_MMAP_EXEC_WRIT 1 -# define HAVE_MNTENT 1 -# endif -# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__) -/* Windows systems may have Data Execution Protection (DEP) enabled, - which requires the use of VirtualMalloc/VirtualFree to alloc/free - executable memory. */ -# define FFI_MMAP_EXEC_WRIT 1 -# endif -#endif - -#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX -# ifdef __linux__ -/* When defined to 1 check for SELinux and if SELinux is active, - don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that - might cause audit messages. */ -# define FFI_MMAP_EXEC_SELINUX 1 -# endif -#endif - -#if FFI_CLOSURES - -# if FFI_EXEC_TRAMPOLINE_TABLE - -// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. - -# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ - -#define USE_LOCKS 1 -#define USE_DL_PREFIX 1 -#ifdef __GNUC__ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 1 -#endif -#endif - -/* We need to use mmap, not sbrk. */ -#define HAVE_MORECORE 0 - -/* We could, in theory, support mremap, but it wouldn't buy us anything. */ -#define HAVE_MREMAP 0 - -/* We have no use for this, so save some code and data. */ -#define NO_MALLINFO 1 - -/* We need all allocations to be in regular segments, otherwise we - lose track of the corresponding code address. */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T - -/* Don't allocate more than a page unless needed. */ -#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) - -#if FFI_CLOSURE_TEST -/* Don't release single pages, to avoid a worst-case scenario of - continuously allocating and releasing single pages, but release - pairs of pages, which should do just as well given that allocations - are likely to be small. */ -#define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize) -#endif - -#include -#include -#include -#include -#ifndef _MSC_VER -#include -#endif -#include -#include -#if !defined(X86_WIN32) && !defined(X86_WIN64) -#ifdef HAVE_MNTENT -#include -#endif /* HAVE_MNTENT */ -#include -#include - -/* We don't want sys/mman.h to be included after we redefine mmap and - dlmunmap. */ -#include -#define LACKS_SYS_MMAN_H 1 - -#if FFI_MMAP_EXEC_SELINUX -#include -#include - -static int selinux_enabled = -1; - -static int -selinux_enabled_check (void) -{ - struct statfs sfs; - FILE *f; - char *buf = NULL; - size_t len = 0; - - if (statfs ("/selinux", &sfs) >= 0 - && (unsigned int) sfs.f_type == 0xf97cff8cU) - return 1; - f = fopen ("/proc/mounts", "r"); - if (f == NULL) - return 0; - while (getline (&buf, &len, f) >= 0) - { - char *p = strchr (buf, ' '); - if (p == NULL) - break; - p = strchr (p + 1, ' '); - if (p == NULL) - break; - if (strncmp (p + 1, "selinuxfs ", 10) == 0) - { - free (buf); - fclose (f); - return 1; - } - } - free (buf); - fclose (f); - return 0; -} - -#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ - : (selinux_enabled = selinux_enabled_check ())) - -#else - -#define is_selinux_enabled() 0 - -#endif /* !FFI_MMAP_EXEC_SELINUX */ - -/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ -#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX -#include - -static int emutramp_enabled = -1; - -static int -emutramp_enabled_check (void) -{ - char *buf = NULL; - size_t len = 0; - FILE *f; - int ret; - f = fopen ("/proc/self/status", "r"); - if (f == NULL) - return 0; - ret = 0; - - while (getline (&buf, &len, f) != -1) - if (!strncmp (buf, "PaX:", 4)) - { - char emutramp; - if (sscanf (buf, "%*s %*c%c", &emutramp) == 1) - ret = (emutramp == 'E'); - break; - } - free (buf); - fclose (f); - return ret; -} - -#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ - : (emutramp_enabled = emutramp_enabled_check ())) -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -#elif defined (__CYGWIN__) || defined(__INTERIX) - -#include - -/* Cygwin is Linux-like, but not quite that Linux-like. */ -#define is_selinux_enabled() 0 - -#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ - -#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX -#define is_emutramp_enabled() 0 -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -/* Declare all functions defined in dlmalloc.c as static. */ -static void *dlmalloc(size_t); -static void dlfree(void*); -static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; -static void *dlrealloc(void *, size_t) MAYBE_UNUSED; -static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; -static void *dlvalloc(size_t) MAYBE_UNUSED; -static int dlmallopt(int, int) MAYBE_UNUSED; -static size_t dlmalloc_footprint(void) MAYBE_UNUSED; -static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; -static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; -static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; -static void *dlpvalloc(size_t) MAYBE_UNUSED; -static int dlmalloc_trim(size_t) MAYBE_UNUSED; -static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; -static void dlmalloc_stats(void) MAYBE_UNUSED; - -#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) -/* Use these for mmap and munmap within dlmalloc.c. */ -static void *dlmmap(void *, size_t, int, int, int, off_t); -static int dlmunmap(void *, size_t); -#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ - -#define mmap dlmmap -#define munmap dlmunmap - -#include "dlmalloc.c" - -#undef mmap -#undef munmap - -#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) - -/* A mutex used to synchronize access to *exec* variables in this file. */ -static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* A file descriptor of a temporary file from which we'll map - executable pages. */ -static int execfd = -1; - -/* The amount of space already allocated from the temporary file. */ -static size_t execsize = 0; - -/* Open a temporary file name, and immediately unlink it. */ -static int -open_temp_exec_file_name (char *name) -{ - int fd = mkstemp (name); - - if (fd != -1) - unlink (name); - - return fd; -} - -/* Open a temporary file in the named directory. */ -static int -open_temp_exec_file_dir (const char *dir) -{ - static const char suffix[] = "/ffiXXXXXX"; - size_t lendir = strlen (dir); - char *tempname = __builtin_alloca (lendir + sizeof (suffix)); - - if (!tempname) - return -1; - - memcpy (tempname, dir, lendir); - memcpy (tempname + lendir, suffix, sizeof (suffix)); - - return open_temp_exec_file_name (tempname); -} - -/* Open a temporary file in the directory in the named environment - variable. */ -static int -open_temp_exec_file_env (const char *envvar) -{ - const char *value = getenv (envvar); - - if (!value) - return -1; - - return open_temp_exec_file_dir (value); -} - -#ifdef HAVE_MNTENT -/* Open a temporary file in an executable and writable mount point - listed in the mounts file. Subsequent calls with the same mounts - keep searching for mount points in the same file. Providing NULL - as the mounts file closes the file. */ -static int -open_temp_exec_file_mnt (const char *mounts) -{ - static const char *last_mounts; - static FILE *last_mntent; - - if (mounts != last_mounts) - { - if (last_mntent) - endmntent (last_mntent); - - last_mounts = mounts; - - if (mounts) - last_mntent = setmntent (mounts, "r"); - else - last_mntent = NULL; - } - - if (!last_mntent) - return -1; - - for (;;) - { - int fd; - struct mntent mnt; - char buf[MAXPATHLEN * 3]; - - if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) - return -1; - - if (hasmntopt (&mnt, "ro") - || hasmntopt (&mnt, "noexec") - || access (mnt.mnt_dir, W_OK)) - continue; - - fd = open_temp_exec_file_dir (mnt.mnt_dir); - - if (fd != -1) - return fd; - } -} -#endif /* HAVE_MNTENT */ - -/* Instructions to look for a location to hold a temporary file that - can be mapped in for execution. */ -static struct -{ - int (*func)(const char *); - const char *arg; - int repeat; -} open_temp_exec_file_opts[] = { - { open_temp_exec_file_env, "TMPDIR", 0 }, - { open_temp_exec_file_dir, "/tmp", 0 }, - { open_temp_exec_file_dir, "/var/tmp", 0 }, - { open_temp_exec_file_dir, "/dev/shm", 0 }, - { open_temp_exec_file_env, "HOME", 0 }, -#ifdef HAVE_MNTENT - { open_temp_exec_file_mnt, "/etc/mtab", 1 }, - { open_temp_exec_file_mnt, "/proc/mounts", 1 }, -#endif /* HAVE_MNTENT */ -}; - -/* Current index into open_temp_exec_file_opts. */ -static int open_temp_exec_file_opts_idx = 0; - -/* Reset a current multi-call func, then advances to the next entry. - If we're at the last, go back to the first and return nonzero, - otherwise return zero. */ -static int -open_temp_exec_file_opts_next (void) -{ - if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) - open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); - - open_temp_exec_file_opts_idx++; - if (open_temp_exec_file_opts_idx - == (sizeof (open_temp_exec_file_opts) - / sizeof (*open_temp_exec_file_opts))) - { - open_temp_exec_file_opts_idx = 0; - return 1; - } - - return 0; -} - -/* Return a file descriptor of a temporary zero-sized file in a - writable and executable filesystem. */ -static int -open_temp_exec_file (void) -{ - int fd; - - do - { - fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func - (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); - - if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat - || fd == -1) - { - if (open_temp_exec_file_opts_next ()) - break; - } - } - while (fd == -1); - - return fd; -} - -/* Map in a chunk of memory from the temporary exec file into separate - locations in the virtual memory address space, one writable and one - executable. Returns the address of the writable portion, after - storing an offset to the corresponding executable portion at the - last word of the requested chunk. */ -static void * -dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) -{ - void *ptr; - - if (execfd == -1) - { - open_temp_exec_file_opts_idx = 0; - retry_open: - execfd = open_temp_exec_file (); - if (execfd == -1) - return MFAIL; - } - - offset = execsize; - - if (ftruncate (execfd, offset + length)) - return MFAIL; - - flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); - flags |= MAP_SHARED; - - ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, - flags, execfd, offset); - if (ptr == MFAIL) - { - if (!offset) - { - close (execfd); - goto retry_open; - } - ftruncate (execfd, offset); - return MFAIL; - } - else if (!offset - && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) - open_temp_exec_file_opts_next (); - - start = mmap (start, length, prot, flags, execfd, offset); - - if (start == MFAIL) - { - munmap (ptr, length); - ftruncate (execfd, offset); - return start; - } - - mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; - - execsize += length; - - return start; -} - -/* Map in a writable and executable chunk of memory if possible. - Failing that, fall back to dlmmap_locked. */ -static void * -dlmmap (void *start, size_t length, int prot, - int flags, int fd, off_t offset) -{ - void *ptr; - - assert (start == NULL && length % malloc_getpagesize == 0 - && prot == (PROT_READ | PROT_WRITE) - && flags == (MAP_PRIVATE | MAP_ANONYMOUS) - && fd == -1 && offset == 0); - -#if FFI_CLOSURE_TEST - printf ("mapping in %zi\n", length); -#endif - - if (execfd == -1 && is_emutramp_enabled ()) - { - ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); - return ptr; - } - - if (execfd == -1 && !is_selinux_enabled ()) - { - ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); - - if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) - /* Cool, no need to mess with separate segments. */ - return ptr; - - /* If MREMAP_DUP is ever introduced and implemented, try mmap - with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with - MREMAP_DUP and prot at this point. */ - } - - if (execsize == 0 || execfd == -1) - { - pthread_mutex_lock (&open_temp_exec_file_mutex); - ptr = dlmmap_locked (start, length, prot, flags, offset); - pthread_mutex_unlock (&open_temp_exec_file_mutex); - - return ptr; - } - - return dlmmap_locked (start, length, prot, flags, offset); -} - -/* Release memory at the given address, as well as the corresponding - executable page if it's separate. */ -static int -dlmunmap (void *start, size_t length) -{ - /* We don't bother decreasing execsize or truncating the file, since - we can't quite tell whether we're unmapping the end of the file. - We don't expect frequent deallocation anyway. If we did, we - could locate pages in the file by writing to the pages being - deallocated and checking that the file contents change. - Yuck. */ - msegmentptr seg = segment_holding (gm, start); - void *code; - -#if FFI_CLOSURE_TEST - printf ("unmapping %zi\n", length); -#endif - - if (seg && (code = add_segment_exec_offset (start, seg)) != start) - { - int ret = munmap (code, length); - if (ret) - return ret; - } - - return munmap (start, length); -} - -#if FFI_CLOSURE_FREE_CODE -/* Return segment holding given code address. */ -static msegmentptr -segment_holding_code (mstate m, char* addr) -{ - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= add_segment_exec_offset (sp->base, sp) - && addr < add_segment_exec_offset (sp->base, sp) + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} -#endif - -#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ - -/* Allocate a chunk of memory with the given size. Returns a pointer - to the writable address, and sets *CODE to the executable - corresponding virtual address. */ -void * -ffi_closure_alloc (size_t size, void **code) -{ - void *ptr; - - if (!code) - return NULL; - - ptr = dlmalloc (size); - - if (ptr) - { - msegmentptr seg = segment_holding (gm, ptr); - - *code = add_segment_exec_offset (ptr, seg); - } - - return ptr; -} - -/* Release a chunk of memory allocated with ffi_closure_alloc. If - FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the - writable or the executable address given. Otherwise, only the - writable address can be provided here. */ -void -ffi_closure_free (void *ptr) -{ -#if FFI_CLOSURE_FREE_CODE - msegmentptr seg = segment_holding_code (gm, ptr); - - if (seg) - ptr = sub_segment_exec_offset (ptr, seg); -#endif - - dlfree (ptr); -} - - -#if FFI_CLOSURE_TEST -/* Do some internal sanity testing to make sure allocation and - deallocation of pages are working as intended. */ -int main () -{ - void *p[3]; -#define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0) -#define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0) - GET (0, malloc_getpagesize / 2); - GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*)); - PUT (1); - GET (1, 2 * malloc_getpagesize); - GET (2, malloc_getpagesize / 2); - PUT (1); - PUT (0); - PUT (2); - return 0; -} -#endif /* FFI_CLOSURE_TEST */ -# else /* ! FFI_MMAP_EXEC_WRIT */ - -/* On many systems, memory returned by malloc is writable and - executable, so just use it. */ - -#include - -void * -ffi_closure_alloc (size_t size, void **code) -{ - if (!code) - return NULL; - - return *code = malloc (size); -} - -void -ffi_closure_free (void *ptr) -{ - free (ptr); -} - -# endif /* ! FFI_MMAP_EXEC_WRIT */ -#endif /* FFI_CLOSURES */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/cris/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/cris/ffi.c deleted file mode 100644 index aaca5b1cb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/cris/ffi.c +++ /dev/null @@ -1,386 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Cygnus Solutions - Copyright (c) 2004 Simon Posnjak - Copyright (c) 2005 Axis Communications AB - Copyright (C) 2007 Free Software Foundation, Inc. - - CRIS Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) - -static ffi_status -initialize_aggregate_packed_struct (ffi_type * arg) -{ - ffi_type **ptr; - - FFI_ASSERT (arg != NULL); - - FFI_ASSERT (arg->elements != NULL); - FFI_ASSERT (arg->size == 0); - FFI_ASSERT (arg->alignment == 0); - - ptr = &(arg->elements[0]); - - while ((*ptr) != NULL) - { - if (((*ptr)->size == 0) - && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT (ffi_type_test ((*ptr))); - - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; -} - -int -ffi_prep_args (char *stack, extended_cif * ecif) -{ - unsigned int i; - unsigned int struct_count = 0; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); i--, p_arg++) - { - size_t z; - - switch ((*p_arg)->type) - { - case FFI_TYPE_STRUCT: - { - z = (*p_arg)->size; - if (z <= 4) - { - memcpy (argp, *p_argv, z); - z = 4; - } - else if (z <= 8) - { - memcpy (argp, *p_argv, z); - z = 8; - } - else - { - unsigned int uiLocOnStack; - z = sizeof (void *); - uiLocOnStack = 4 * ecif->cif->nargs + struct_count; - struct_count = struct_count + (*p_arg)->size; - *(unsigned int *) argp = - (unsigned int) (UINT32 *) (stack + uiLocOnStack); - memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size); - } - break; - } - default: - z = (*p_arg)->size; - if (z < sizeof (int)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = - (unsigned int) *(UINT8 *) (*p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = - (unsigned int) *(UINT16 *) (*p_argv); - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else if (z == sizeof (int)) - *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); - else - memcpy (argp, *p_argv, z); - break; - } - p_argv++; - argp += z; - } - - return (struct_count); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_core (ffi_cif * cif, - ffi_abi abi, unsigned int isvariadic, - unsigned int nfixedargs, unsigned int ntotalargs, - ffi_type * rtype, ffi_type ** atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT (cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - cif->rtype = rtype; - - cif->flags = 0; - - if ((cif->rtype->size == 0) - && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT_VALID_TYPE (cif->rtype); - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - if (((*ptr)->size == 0) - && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT_VALID_TYPE (*ptr); - - if (((*ptr)->alignment - 1) & bytes) - bytes = ALIGN (bytes, (*ptr)->alignment); - if ((*ptr)->type == FFI_TYPE_STRUCT) - { - if ((*ptr)->size > 8) - { - bytes += (*ptr)->size; - bytes += sizeof (void *); - } - else - { - if ((*ptr)->size > 4) - bytes += 8; - else - bytes += 4; - } - } - else - bytes += STACK_ARG_SIZE ((*ptr)->size); - } - - cif->bytes = bytes; - - return ffi_prep_cif_machdep (cif); -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif * cif) -{ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) cif->rtype->type; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV (int (*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, unsigned *, void (*fn) ()) - __attribute__ ((__visibility__ ("hidden"))); - -void -ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT (0); - break; - } -} - -/* Because the following variables are not exported outside libffi, we - mark them hidden. */ - -/* Assembly code for the jump stub. */ -extern const char ffi_cris_trampoline_template[] - __attribute__ ((__visibility__ ("hidden"))); - -/* Offset into ffi_cris_trampoline_template of where to put the - ffi_prep_closure_inner function. */ -extern const int ffi_cris_trampoline_fn_offset - __attribute__ ((__visibility__ ("hidden"))); - -/* Offset into ffi_cris_trampoline_template of where to put the - closure data. */ -extern const int ffi_cris_trampoline_closure_offset - __attribute__ ((__visibility__ ("hidden"))); - -/* This function is sibling-called (jumped to) by the closure - trampoline. We get R10..R13 at PARAMS[0..3] and a copy of [SP] at - PARAMS[4] to simplify handling of a straddling parameter. A copy - of R9 is at PARAMS[5] and SP at PARAMS[6]. These parameters are - put at the appropriate place in CLOSURE which is then executed and - the return value is passed back to the caller. */ - -static unsigned long long -ffi_prep_closure_inner (void **params, ffi_closure* closure) -{ - char *register_args = (char *) params; - void *struct_ret = params[5]; - char *stack_args = params[6]; - char *ptr = register_args; - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - - /* Max room needed is number of arguments as 64-bit values. */ - void **avalue = alloca (closure->cif->nargs * sizeof(void *)); - int i; - int doing_regs; - long long llret = 0; - - /* Find the address of each argument. */ - for (i = 0, doing_regs = 1; i < cif->nargs; i++) - { - /* Types up to and including 8 bytes go by-value. */ - if (arg_types[i]->size <= 4) - { - avalue[i] = ptr; - ptr += 4; - } - else if (arg_types[i]->size <= 8) - { - avalue[i] = ptr; - ptr += 8; - } - else - { - FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT); - - /* Passed by-reference, so copy the pointer. */ - avalue[i] = *(void **) ptr; - ptr += 4; - } - - /* If we've handled more arguments than fit in registers, start - looking at the those passed on the stack. Step over the - first one if we had a straddling parameter. */ - if (doing_regs && ptr >= register_args + 4*4) - { - ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0); - doing_regs = 0; - } - } - - /* Invoke the closure. */ - (closure->fun) (cif, - - cif->rtype->type == FFI_TYPE_STRUCT - /* The caller allocated space for the return - structure, and passed a pointer to this space in - R9. */ - ? struct_ret - - /* We take advantage of being able to ignore that - the high part isn't set if the return value is - not in R10:R11, but in R10 only. */ - : (void *) &llret, - - avalue, closure->user_data); - - return llret; -} - -/* API function: Prepare the trampoline. */ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif *, void *, void **, void*), - void *user_data, - void *codeloc) -{ - void *innerfn = ffi_prep_closure_inner; - FFI_ASSERT (cif->abi == FFI_SYSV); - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - memcpy (closure->tramp, ffi_cris_trampoline_template, - FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE); - memcpy (closure->tramp + ffi_cris_trampoline_fn_offset, - &innerfn, sizeof (void *)); - memcpy (closure->tramp + ffi_cris_trampoline_closure_offset, - &codeloc, sizeof (void *)); - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/cris/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/cris/ffitarget.h deleted file mode 100644 index b837e976e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/cris/ffitarget.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for CRIS. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36 -#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4) -#define FFI_TRAMPOLINE_SIZE \ - (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE) -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/cris/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/cris/sysv.S deleted file mode 100644 index 79abaee4d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/cris/sysv.S +++ /dev/null @@ -1,215 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2004 Simon Posnjak - Copyright (c) 2005 Axis Communications AB - - CRIS Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#define CONCAT(x,y) x ## y -#define XCONCAT(x,y) CONCAT (x, y) -#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x) - - .text - - ;; OK, when we get called we should have this (according to - ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3). - ;; - ;; R10: ffi_prep_args (func. pointer) - ;; R11: &ecif - ;; R12: cif->bytes - ;; R13: fig->flags - ;; sp+0: ecif.rvalue - ;; sp+4: fn (function pointer to the function that we need to call) - - .globl L(ffi_call_SYSV) - .type L(ffi_call_SYSV),@function - .hidden L(ffi_call_SYSV) - -L(ffi_call_SYSV): - ;; Save the regs to the stack. - push $srp - ;; Used for stack pointer saving. - push $r6 - ;; Used for function address pointer. - push $r7 - ;; Used for stack pointer saving. - push $r8 - ;; We save fig->flags to stack we will need them after we - ;; call The Function. - push $r13 - - ;; Saving current stack pointer. - move.d $sp,$r8 - move.d $sp,$r6 - - ;; Move address of ffi_prep_args to r13. - move.d $r10,$r13 - - ;; Make room on the stack for the args of fn. - sub.d $r12,$sp - - ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are: - ;; r10 <-- stack pointer - ;; r11 <-- &ecif (already there) - move.d $sp,$r10 - - ;; Call the function. - jsr $r13 - - ;; Save the size of the structures which are passed on stack. - move.d $r10,$r7 - - ;; Move first four args in to r10..r13. - move.d [$sp+0],$r10 - move.d [$sp+4],$r11 - move.d [$sp+8],$r12 - move.d [$sp+12],$r13 - - ;; Adjust the stack and check if any parameters are given on stack. - addq 16,$sp - sub.d $r7,$r6 - cmp.d $sp,$r6 - - bpl go_on - nop - -go_on_no_params_on_stack: - move.d $r6,$sp - -go_on: - ;; Discover if we need to put rval address in to r9. - move.d [$r8+0],$r7 - cmpq FFI_TYPE_STRUCT,$r7 - bne call_now - nop - - ;; Move rval address to $r9. - move.d [$r8+20],$r9 - -call_now: - ;; Move address of The Function in to r7. - move.d [$r8+24],$r7 - - ;; Call The Function. - jsr $r7 - - ;; Reset stack. - move.d $r8,$sp - - ;; Load rval type (fig->flags) in to r13. - pop $r13 - - ;; Detect rval type. - cmpq FFI_TYPE_VOID,$r13 - beq epilogue - - cmpq FFI_TYPE_STRUCT,$r13 - beq epilogue - - cmpq FFI_TYPE_DOUBLE,$r13 - beq return_double_or_longlong - - cmpq FFI_TYPE_UINT64,$r13 - beq return_double_or_longlong - - cmpq FFI_TYPE_SINT64,$r13 - beq return_double_or_longlong - nop - - ;; Just return the 32 bit value. - ba return - nop - -return_double_or_longlong: - ;; Load half of the rval to r10 and the other half to r11. - move.d [$sp+16],$r13 - move.d $r10,[$r13] - addq 4,$r13 - move.d $r11,[$r13] - ba epilogue - nop - -return: - ;; Load the rval to r10. - move.d [$sp+16],$r13 - move.d $r10,[$r13] - -epilogue: - pop $r8 - pop $r7 - pop $r6 - Jump [$sp+] - - .size ffi_call_SYSV,.-ffi_call_SYSV - -/* Save R10..R13 into an array, somewhat like varargs. Copy the next - argument too, to simplify handling of any straddling parameter. - Save R9 and SP after those. Jump to function handling the rest. - Since this is a template, copied and the main function filled in by - the user. */ - - .globl L(ffi_cris_trampoline_template) - .type L(ffi_cris_trampoline_template),@function - .hidden L(ffi_cris_trampoline_template) - -L(ffi_cris_trampoline_template): -0: - /* The value we get for "PC" is right after the prefix instruction, - two bytes from the beginning, i.e. 0b+2. */ - move.d $r10,[$pc+2f-(0b+2)] - move.d $pc,$r10 -1: - addq 2f-1b+4,$r10 - move.d $r11,[$r10+] - move.d $r12,[$r10+] - move.d $r13,[$r10+] - move.d [$sp],$r11 - move.d $r11,[$r10+] - move.d $r9,[$r10+] - move.d $sp,[$r10+] - subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10 - move.d 0,$r11 -3: - jump 0 -2: - .size ffi_cris_trampoline_template,.-0b - -/* This macro create a constant usable as "extern const int \name" in - C from within libffi, when \name has no prefix decoration. */ - - .macro const name,value - .globl \name - .type \name,@object - .hidden \name -\name: - .dword \value - .size \name,4 - .endm - -/* Constants for offsets within the trampoline. We could do this with - just symbols, avoiding memory contents and memory accesses, but the - C usage code would look a bit stranger. */ - - const L(ffi_cris_trampoline_fn_offset),2b-4-0b - const L(ffi_cris_trampoline_closure_offset),3b-4-0b diff --git a/third_party/python/Modules/_ctypes/libffi/src/debug.c b/third_party/python/Modules/_ctypes/libffi/src/debug.c deleted file mode 100644 index 51dcfcf22..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/debug.c +++ /dev/null @@ -1,59 +0,0 @@ -/* ----------------------------------------------------------------------- - debug.c - Copyright (c) 1996 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include - -/* General debugging routines */ - -void ffi_stop_here(void) -{ - /* This function is only useful for debugging purposes. - Place a breakpoint on ffi_stop_here to be notified of - significant events. */ -} - -/* This function should only be called via the FFI_ASSERT() macro */ - -void ffi_assert(char *expr, char *file, int line) -{ - fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); - ffi_stop_here(); - abort(); -} - -/* Perform a sanity check on an ffi_type structure */ - -void ffi_type_test(ffi_type *a, char *file, int line) -{ - FFI_ASSERT_AT(a != NULL, file, line); - - FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); - FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); - FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); - FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT || a->elements != NULL, file, line); - -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/dlmalloc.c b/third_party/python/Modules/_ctypes/libffi/src/dlmalloc.c deleted file mode 100644 index 55c2d768b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/dlmalloc.c +++ /dev/null @@ -1,5166 +0,0 @@ -/* - This is a version (aka dlmalloc) of malloc/free/realloc written by - Doug Lea and released to the public domain, as explained at - http://creativecommons.org/licenses/publicdomain. Send questions, - comments, complaints, performance data, etc to dl@cs.oswego.edu - -* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) - - Note: There may be an updated version of this malloc obtainable at - ftp://gee.cs.oswego.edu/pub/misc/malloc.c - Check before installing! - -* Quickstart - - This library is all in one file to simplify the most common usage: - ftp it, compile it (-O3), and link it into another program. All of - the compile-time options default to reasonable values for use on - most platforms. You might later want to step through various - compile-time and dynamic tuning options. - - For convenience, an include file for code using this malloc is at: - ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h - You don't really need this .h file unless you call functions not - defined in your system include files. The .h file contains only the - excerpts from this file needed for using this malloc on ANSI C/C++ - systems, so long as you haven't changed compile-time options about - naming and tuning parameters. If you do, then you can create your - own malloc.h that does include all settings by cutting at the point - indicated below. Note that you may already by default be using a C - library containing a malloc that is based on some version of this - malloc (for example in linux). You might still want to use the one - in this file to customize settings or to avoid overheads associated - with library versions. - -* Vital statistics: - - Supported pointer/size_t representation: 4 or 8 bytes - size_t MUST be an unsigned type of the same width as - pointers. (If you are using an ancient system that declares - size_t as a signed type, or need it to be a different width - than pointers, you can use a previous release of this malloc - (e.g. 2.7.2) supporting these.) - - Alignment: 8 bytes (default) - This suffices for nearly all current machines and C compilers. - However, you can define MALLOC_ALIGNMENT to be wider than this - if necessary (up to 128bytes), at the expense of using more space. - - Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) - 8 or 16 bytes (if 8byte sizes) - Each malloced chunk has a hidden word of overhead holding size - and status information, and additional cross-check word - if FOOTERS is defined. - - Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) - 8-byte ptrs: 32 bytes (including overhead) - - Even a request for zero bytes (i.e., malloc(0)) returns a - pointer to something of the minimum allocatable size. - The maximum overhead wastage (i.e., number of extra bytes - allocated than were requested in malloc) is less than or equal - to the minimum size, except for requests >= mmap_threshold that - are serviced via mmap(), where the worst case wastage is about - 32 bytes plus the remainder from a system page (the minimal - mmap unit); typically 4096 or 8192 bytes. - - Security: static-safe; optionally more or less - The "security" of malloc refers to the ability of malicious - code to accentuate the effects of errors (for example, freeing - space that is not currently malloc'ed or overwriting past the - ends of chunks) in code that calls malloc. This malloc - guarantees not to modify any memory locations below the base of - heap, i.e., static variables, even in the presence of usage - errors. The routines additionally detect most improper frees - and reallocs. All this holds as long as the static bookkeeping - for malloc itself is not corrupted by some other means. This - is only one aspect of security -- these checks do not, and - cannot, detect all possible programming errors. - - If FOOTERS is defined nonzero, then each allocated chunk - carries an additional check word to verify that it was malloced - from its space. These check words are the same within each - execution of a program using malloc, but differ across - executions, so externally crafted fake chunks cannot be - freed. This improves security by rejecting frees/reallocs that - could corrupt heap memory, in addition to the checks preventing - writes to statics that are always on. This may further improve - security at the expense of time and space overhead. (Note that - FOOTERS may also be worth using with MSPACES.) - - By default detected errors cause the program to abort (calling - "abort()"). You can override this to instead proceed past - errors by defining PROCEED_ON_ERROR. In this case, a bad free - has no effect, and a malloc that encounters a bad address - caused by user overwrites will ignore the bad address by - dropping pointers and indices to all known memory. This may - be appropriate for programs that should continue if at all - possible in the face of programming errors, although they may - run out of memory because dropped memory is never reclaimed. - - If you don't like either of these options, you can define - CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything - else. And if if you are sure that your program using malloc has - no errors or vulnerabilities, you can define INSECURE to 1, - which might (or might not) provide a small performance improvement. - - Thread-safety: NOT thread-safe unless USE_LOCKS defined - When USE_LOCKS is defined, each public call to malloc, free, - etc is surrounded with either a pthread mutex or a win32 - spinlock (depending on WIN32). This is not especially fast, and - can be a major bottleneck. It is designed only to provide - minimal protection in concurrent environments, and to provide a - basis for extensions. If you are using malloc in a concurrent - program, consider instead using ptmalloc, which is derived from - a version of this malloc. (See http://www.malloc.de). - - System requirements: Any combination of MORECORE and/or MMAP/MUNMAP - This malloc can use unix sbrk or any emulation (invoked using - the CALL_MORECORE macro) and/or mmap/munmap or any emulation - (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system - memory. On most unix systems, it tends to work best if both - MORECORE and MMAP are enabled. On Win32, it uses emulations - based on VirtualAlloc. It also uses common C library functions - like memset. - - Compliance: I believe it is compliant with the Single Unix Specification - (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably - others as well. - -* Overview of algorithms - - This is not the fastest, most space-conserving, most portable, or - most tunable malloc ever written. However it is among the fastest - while also being among the most space-conserving, portable and - tunable. Consistent balance across these factors results in a good - general-purpose allocator for malloc-intensive programs. - - In most ways, this malloc is a best-fit allocator. Generally, it - chooses the best-fitting existing chunk for a request, with ties - broken in approximately least-recently-used order. (This strategy - normally maintains low fragmentation.) However, for requests less - than 256bytes, it deviates from best-fit when there is not an - exactly fitting available chunk by preferring to use space adjacent - to that used for the previous small request, as well as by breaking - ties in approximately most-recently-used order. (These enhance - locality of series of small allocations.) And for very large requests - (>= 256Kb by default), it relies on system memory mapping - facilities, if supported. (This helps avoid carrying around and - possibly fragmenting memory used only for large chunks.) - - All operations (except malloc_stats and mallinfo) have execution - times that are bounded by a constant factor of the number of bits in - a size_t, not counting any clearing in calloc or copying in realloc, - or actions surrounding MORECORE and MMAP that have times - proportional to the number of non-contiguous regions returned by - system allocation routines, which is often just 1. - - The implementation is not very modular and seriously overuses - macros. Perhaps someday all C compilers will do as good a job - inlining modular code as can now be done by brute-force expansion, - but now, enough of them seem not to. - - Some compilers issue a lot of warnings about code that is - dead/unreachable only on some platforms, and also about intentional - uses of negation on unsigned types. All known cases of each can be - ignored. - - For a longer but out of date high-level description, see - http://gee.cs.oswego.edu/dl/html/malloc.html - -* MSPACES - If MSPACES is defined, then in addition to malloc, free, etc., - this file also defines mspace_malloc, mspace_free, etc. These - are versions of malloc routines that take an "mspace" argument - obtained using create_mspace, to control all internal bookkeeping. - If ONLY_MSPACES is defined, only these versions are compiled. - So if you would like to use this allocator for only some allocations, - and your system malloc for others, you can compile with - ONLY_MSPACES and then do something like... - static mspace mymspace = create_mspace(0,0); // for example - #define mymalloc(bytes) mspace_malloc(mymspace, bytes) - - (Note: If you only need one instance of an mspace, you can instead - use "USE_DL_PREFIX" to relabel the global malloc.) - - You can similarly create thread-local allocators by storing - mspaces as thread-locals. For example: - static __thread mspace tlms = 0; - void* tlmalloc(size_t bytes) { - if (tlms == 0) tlms = create_mspace(0, 0); - return mspace_malloc(tlms, bytes); - } - void tlfree(void* mem) { mspace_free(tlms, mem); } - - Unless FOOTERS is defined, each mspace is completely independent. - You cannot allocate from one and free to another (although - conformance is only weakly checked, so usage errors are not always - caught). If FOOTERS is defined, then each chunk carries around a tag - indicating its originating mspace, and frees are directed to their - originating spaces. - - ------------------------- Compile-time options --------------------------- - -Be careful in setting #define values for numerical constants of type -size_t. On some systems, literal values are not automatically extended -to size_t precision unless they are explicitly casted. - -WIN32 default: defined if _WIN32 defined - Defining WIN32 sets up defaults for MS environment and compilers. - Otherwise defaults are for unix. - -MALLOC_ALIGNMENT default: (size_t)8 - Controls the minimum alignment for malloc'ed chunks. It must be a - power of two and at least 8, even on machines for which smaller - alignments would suffice. It may be defined as larger than this - though. Note however that code and data structures are optimized for - the case of 8-byte alignment. - -MSPACES default: 0 (false) - If true, compile in support for independent allocation spaces. - This is only supported if HAVE_MMAP is true. - -ONLY_MSPACES default: 0 (false) - If true, only compile in mspace versions, not regular versions. - -USE_LOCKS default: 0 (false) - Causes each call to each public routine to be surrounded with - pthread or WIN32 mutex lock/unlock. (If set true, this can be - overridden on a per-mspace basis for mspace versions.) - -FOOTERS default: 0 - If true, provide extra checking and dispatching by placing - information in the footers of allocated chunks. This adds - space and time overhead. - -INSECURE default: 0 - If true, omit checks for usage errors and heap space overwrites. - -USE_DL_PREFIX default: NOT defined - Causes compiler to prefix all public routines with the string 'dl'. - This can be useful when you only want to use this malloc in one part - of a program, using your regular system malloc elsewhere. - -ABORT default: defined as abort() - Defines how to abort on failed checks. On most systems, a failed - check cannot die with an "assert" or even print an informative - message, because the underlying print routines in turn call malloc, - which will fail again. Generally, the best policy is to simply call - abort(). It's not very useful to do more than this because many - errors due to overwriting will show up as address faults (null, odd - addresses etc) rather than malloc-triggered checks, so will also - abort. Also, most compilers know that abort() does not return, so - can better optimize code conditionally calling it. - -PROCEED_ON_ERROR default: defined as 0 (false) - Controls whether detected bad addresses cause them to bypassed - rather than aborting. If set, detected bad arguments to free and - realloc are ignored. And all bookkeeping information is zeroed out - upon a detected overwrite of freed heap space, thus losing the - ability to ever return it from malloc again, but enabling the - application to proceed. If PROCEED_ON_ERROR is defined, the - static variable malloc_corruption_error_count is compiled in - and can be examined to see if errors have occurred. This option - generates slower code than the default abort policy. - -DEBUG default: NOT defined - The DEBUG setting is mainly intended for people trying to modify - this code or diagnose problems when porting to new platforms. - However, it may also be able to better isolate user errors than just - using runtime checks. The assertions in the check routines spell - out in more detail the assumptions and invariants underlying the - algorithms. The checking is fairly extensive, and will slow down - execution noticeably. Calling malloc_stats or mallinfo with DEBUG - set will attempt to check every non-mmapped allocated and free chunk - in the course of computing the summaries. - -ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) - Debugging assertion failures can be nearly impossible if your - version of the assert macro causes malloc to be called, which will - lead to a cascade of further failures, blowing the runtime stack. - ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), - which will usually make debugging easier. - -MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 - The action to take before "return 0" when malloc fails to be able to - return memory because there is none available. - -HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES - True if this system supports sbrk or an emulation of it. - -MORECORE default: sbrk - The name of the sbrk-style system routine to call to obtain more - memory. See below for guidance on writing custom MORECORE - functions. The type of the argument to sbrk/MORECORE varies across - systems. It cannot be size_t, because it supports negative - arguments, so it is normally the signed type of the same width as - size_t (sometimes declared as "intptr_t"). It doesn't much matter - though. Internally, we only call it with arguments less than half - the max value of a size_t, which should work across all reasonable - possibilities, although sometimes generating compiler warnings. See - near the end of this file for guidelines for creating a custom - version of MORECORE. - -MORECORE_CONTIGUOUS default: 1 (true) - If true, take advantage of fact that consecutive calls to MORECORE - with positive arguments always return contiguous increasing - addresses. This is true of unix sbrk. It does not hurt too much to - set it true anyway, since malloc copes with non-contiguities. - Setting it false when definitely non-contiguous saves time - and possibly wasted space it would take to discover this though. - -MORECORE_CANNOT_TRIM default: NOT defined - True if MORECORE cannot release space back to the system when given - negative arguments. This is generally necessary only if you are - using a hand-crafted MORECORE function that cannot handle negative - arguments. - -HAVE_MMAP default: 1 (true) - True if this system supports mmap or an emulation of it. If so, and - HAVE_MORECORE is not true, MMAP is used for all system - allocation. If set and HAVE_MORECORE is true as well, MMAP is - primarily used to directly allocate very large blocks. It is also - used as a backup strategy in cases where MORECORE fails to provide - space from system. Note: A single call to MUNMAP is assumed to be - able to unmap memory that may have be allocated using multiple calls - to MMAP, so long as they are adjacent. - -HAVE_MREMAP default: 1 on linux, else 0 - If true realloc() uses mremap() to re-allocate large blocks and - extend or shrink allocation spaces. - -MMAP_CLEARS default: 1 on unix - True if mmap clears memory so calloc doesn't need to. This is true - for standard unix mmap using /dev/zero. - -USE_BUILTIN_FFS default: 0 (i.e., not used) - Causes malloc to use the builtin ffs() function to compute indices. - Some compilers may recognize and intrinsify ffs to be faster than the - supplied C version. Also, the case of x86 using gcc is special-cased - to an asm instruction, so is already as fast as it can be, and so - this setting has no effect. (On most x86s, the asm version is only - slightly faster than the C version.) - -malloc_getpagesize default: derive from system includes, or 4096. - The system page size. To the extent possible, this malloc manages - memory from the system in page-size units. This may be (and - usually is) a function rather than a constant. This is ignored - if WIN32, where page size is determined using getSystemInfo during - initialization. - -USE_DEV_RANDOM default: 0 (i.e., not used) - Causes malloc to use /dev/random to initialize secure magic seed for - stamping footers. Otherwise, the current time is used. - -NO_MALLINFO default: 0 - If defined, don't compile "mallinfo". This can be a simple way - of dealing with mismatches between system declarations and - those in this file. - -MALLINFO_FIELD_TYPE default: size_t - The type of the fields in the mallinfo struct. This was originally - defined as "int" in SVID etc, but is more usefully defined as - size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set - -REALLOC_ZERO_BYTES_FREES default: not defined - This should be set if a call to realloc with zero bytes should - be the same as a call to free. Some people think it should. Otherwise, - since this malloc returns a unique pointer for malloc(0), so does - realloc(p, 0). - -LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H -LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H -LACKS_STDLIB_H default: NOT defined unless on WIN32 - Define these if your system does not have these header files. - You might need to manually insert some of the declarations they provide. - -DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, - system_info.dwAllocationGranularity in WIN32, - otherwise 64K. - Also settable using mallopt(M_GRANULARITY, x) - The unit for allocating and deallocating memory from the system. On - most systems with contiguous MORECORE, there is no reason to - make this more than a page. However, systems with MMAP tend to - either require or encourage larger granularities. You can increase - this value to prevent system allocation functions to be called so - often, especially if they are slow. The value must be at least one - page and must be a power of two. Setting to 0 causes initialization - to either page size or win32 region size. (Note: In previous - versions of malloc, the equivalent of this option was called - "TOP_PAD") - -DEFAULT_TRIM_THRESHOLD default: 2MB - Also settable using mallopt(M_TRIM_THRESHOLD, x) - The maximum amount of unused top-most memory to keep before - releasing via malloc_trim in free(). Automatic trimming is mainly - useful in long-lived programs using contiguous MORECORE. Because - trimming via sbrk can be slow on some systems, and can sometimes be - wasteful (in cases where programs immediately afterward allocate - more large chunks) the value should be high enough so that your - overall system performance would improve by releasing this much - memory. As a rough guide, you might set to a value close to the - average size of a process (program) running on your system. - Releasing this much memory would allow such a process to run in - memory. Generally, it is worth tuning trim thresholds when a - program undergoes phases where several large chunks are allocated - and released in ways that can reuse each other's storage, perhaps - mixed with phases where there are no such chunks at all. The trim - value must be greater than page size to have any useful effect. To - disable trimming completely, you can set to MAX_SIZE_T. Note that the trick - some people use of mallocing a huge space and then freeing it at - program startup, in an attempt to reserve system memory, doesn't - have the intended effect under automatic trimming, since that memory - will immediately be returned to the system. - -DEFAULT_MMAP_THRESHOLD default: 256K - Also settable using mallopt(M_MMAP_THRESHOLD, x) - The request size threshold for using MMAP to directly service a - request. Requests of at least this size that cannot be allocated - using already-existing space will be serviced via mmap. (If enough - normal freed space already exists it is used instead.) Using mmap - segregates relatively large chunks of memory so that they can be - individually obtained and released from the host system. A request - serviced through mmap is never reused by any other request (at least - not directly; the system may just so happen to remap successive - requests to the same locations). Segregating space in this way has - the benefits that: Mmapped space can always be individually released - back to the system, which helps keep the system level memory demands - of a long-lived program low. Also, mapped memory doesn't become - `locked' between other chunks, as can happen with normally allocated - chunks, which means that even trimming via malloc_trim would not - release them. However, it has the disadvantage that the space - cannot be reclaimed, consolidated, and then used to service later - requests, as happens with normal chunks. The advantages of mmap - nearly always outweigh disadvantages for "large" chunks, but the - value of "large" may vary across systems. The default is an - empirically derived value that works well in most systems. You can - disable mmap by setting to MAX_SIZE_T. - -*/ - -#ifndef WIN32 -#ifdef _WIN32 -#define WIN32 1 -#endif /* _WIN32 */ -#endif /* WIN32 */ -#ifdef WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#define HAVE_MMAP 1 -#define HAVE_MORECORE 0 -#define LACKS_UNISTD_H -#define LACKS_SYS_PARAM_H -#define LACKS_SYS_MMAN_H -#define LACKS_STRING_H -#define LACKS_STRINGS_H -#define LACKS_SYS_TYPES_H -#define LACKS_ERRNO_H -#define MALLOC_FAILURE_ACTION -#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ -#elif !defined _GNU_SOURCE -/* mremap() on Linux requires this via sys/mman.h - * See roundup issue 10309 - */ -#define _GNU_SOURCE 1 -#endif /* WIN32 */ - -#ifdef __OS2__ -#define INCL_DOS -#include -#define HAVE_MMAP 1 -#define HAVE_MORECORE 0 -#define LACKS_SYS_MMAN_H -#endif /* __OS2__ */ - -#if defined(DARWIN) || defined(_DARWIN) -/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ -#ifndef HAVE_MORECORE -#define HAVE_MORECORE 0 -#define HAVE_MMAP 1 -#endif /* HAVE_MORECORE */ -#endif /* DARWIN */ - -#ifndef LACKS_SYS_TYPES_H -#include /* For size_t */ -#endif /* LACKS_SYS_TYPES_H */ - -/* The maximum possible size_t value has all bits set */ -#define MAX_SIZE_T (~(size_t)0) - -#ifndef ONLY_MSPACES -#define ONLY_MSPACES 0 -#endif /* ONLY_MSPACES */ -#ifndef MSPACES -#if ONLY_MSPACES -#define MSPACES 1 -#else /* ONLY_MSPACES */ -#define MSPACES 0 -#endif /* ONLY_MSPACES */ -#endif /* MSPACES */ -#ifndef MALLOC_ALIGNMENT -#define MALLOC_ALIGNMENT ((size_t)8U) -#endif /* MALLOC_ALIGNMENT */ -#ifndef FOOTERS -#define FOOTERS 0 -#endif /* FOOTERS */ -#ifndef ABORT -#define ABORT abort() -#endif /* ABORT */ -#ifndef ABORT_ON_ASSERT_FAILURE -#define ABORT_ON_ASSERT_FAILURE 1 -#endif /* ABORT_ON_ASSERT_FAILURE */ -#ifndef PROCEED_ON_ERROR -#define PROCEED_ON_ERROR 0 -#endif /* PROCEED_ON_ERROR */ -#ifndef USE_LOCKS -#define USE_LOCKS 0 -#endif /* USE_LOCKS */ -#ifndef INSECURE -#define INSECURE 0 -#endif /* INSECURE */ -#ifndef HAVE_MMAP -#define HAVE_MMAP 1 -#endif /* HAVE_MMAP */ -#ifndef MMAP_CLEARS -#define MMAP_CLEARS 1 -#endif /* MMAP_CLEARS */ -#ifndef HAVE_MREMAP -#ifdef __linux__ -#define HAVE_MREMAP 1 -#else /* linux */ -#define HAVE_MREMAP 0 -#endif /* linux */ -#endif /* HAVE_MREMAP */ -#ifndef MALLOC_FAILURE_ACTION -#define MALLOC_FAILURE_ACTION errno = ENOMEM; -#endif /* MALLOC_FAILURE_ACTION */ -#ifndef HAVE_MORECORE -#if ONLY_MSPACES -#define HAVE_MORECORE 0 -#else /* ONLY_MSPACES */ -#define HAVE_MORECORE 1 -#endif /* ONLY_MSPACES */ -#endif /* HAVE_MORECORE */ -#if !HAVE_MORECORE -#define MORECORE_CONTIGUOUS 0 -#else /* !HAVE_MORECORE */ -#ifndef MORECORE -#define MORECORE sbrk -#endif /* MORECORE */ -#ifndef MORECORE_CONTIGUOUS -#define MORECORE_CONTIGUOUS 1 -#endif /* MORECORE_CONTIGUOUS */ -#endif /* HAVE_MORECORE */ -#ifndef DEFAULT_GRANULARITY -#if MORECORE_CONTIGUOUS -#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ -#else /* MORECORE_CONTIGUOUS */ -#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) -#endif /* MORECORE_CONTIGUOUS */ -#endif /* DEFAULT_GRANULARITY */ -#ifndef DEFAULT_TRIM_THRESHOLD -#ifndef MORECORE_CANNOT_TRIM -#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) -#else /* MORECORE_CANNOT_TRIM */ -#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T -#endif /* MORECORE_CANNOT_TRIM */ -#endif /* DEFAULT_TRIM_THRESHOLD */ -#ifndef DEFAULT_MMAP_THRESHOLD -#if HAVE_MMAP -#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) -#else /* HAVE_MMAP */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T -#endif /* HAVE_MMAP */ -#endif /* DEFAULT_MMAP_THRESHOLD */ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 0 -#endif /* USE_BUILTIN_FFS */ -#ifndef USE_DEV_RANDOM -#define USE_DEV_RANDOM 0 -#endif /* USE_DEV_RANDOM */ -#ifndef NO_MALLINFO -#define NO_MALLINFO 0 -#endif /* NO_MALLINFO */ -#ifndef MALLINFO_FIELD_TYPE -#define MALLINFO_FIELD_TYPE size_t -#endif /* MALLINFO_FIELD_TYPE */ - -/* - mallopt tuning options. SVID/XPG defines four standard parameter - numbers for mallopt, normally defined in malloc.h. None of these - are used in this malloc, so setting them has no effect. But this - malloc does support the following options. -*/ - -#define M_TRIM_THRESHOLD (-1) -#define M_GRANULARITY (-2) -#define M_MMAP_THRESHOLD (-3) - -/* ------------------------ Mallinfo declarations ------------------------ */ - -#if !NO_MALLINFO -/* - This version of malloc supports the standard SVID/XPG mallinfo - routine that returns a struct containing usage properties and - statistics. It should work on any system that has a - /usr/include/malloc.h defining struct mallinfo. The main - declaration needed is the mallinfo struct that is returned (by-copy) - by mallinfo(). The malloinfo struct contains a bunch of fields that - are not even meaningful in this version of malloc. These fields are - are instead filled by mallinfo() with other numbers that might be of - interest. - - HAVE_USR_INCLUDE_MALLOC_H should be set if you have a - /usr/include/malloc.h file that includes a declaration of struct - mallinfo. If so, it is included; else a compliant version is - declared below. These must be precisely the same for mallinfo() to - work. The original SVID version of this struct, defined on most - systems with mallinfo, declares all fields as ints. But some others - define as unsigned long. If your system defines the fields using a - type of different width than listed here, you MUST #include your - system version and #define HAVE_USR_INCLUDE_MALLOC_H. -*/ - -/* #define HAVE_USR_INCLUDE_MALLOC_H */ - -#ifdef HAVE_USR_INCLUDE_MALLOC_H -#include "/usr/include/malloc.h" -#else /* HAVE_USR_INCLUDE_MALLOC_H */ - -/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ -#define _STRUCT_MALLINFO - -struct mallinfo { - MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ - MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ - MALLINFO_FIELD_TYPE smblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ - MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ - MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ - MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ - MALLINFO_FIELD_TYPE fordblks; /* total free space */ - MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ -}; - -#endif /* HAVE_USR_INCLUDE_MALLOC_H */ -#endif /* NO_MALLINFO */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#if !ONLY_MSPACES - -/* ------------------- Declarations of public routines ------------------- */ - -#ifndef USE_DL_PREFIX -#define dlcalloc calloc -#define dlfree free -#define dlmalloc malloc -#define dlmemalign memalign -#define dlrealloc realloc -#define dlvalloc valloc -#define dlpvalloc pvalloc -#define dlmallinfo mallinfo -#define dlmallopt mallopt -#define dlmalloc_trim malloc_trim -#define dlmalloc_stats malloc_stats -#define dlmalloc_usable_size malloc_usable_size -#define dlmalloc_footprint malloc_footprint -#define dlmalloc_max_footprint malloc_max_footprint -#define dlindependent_calloc independent_calloc -#define dlindependent_comalloc independent_comalloc -#endif /* USE_DL_PREFIX */ - - -/* - malloc(size_t n) - Returns a pointer to a newly allocated chunk of at least n bytes, or - null if no space is available, in which case errno is set to ENOMEM - on ANSI C systems. - - If n is zero, malloc returns a minimum-sized chunk. (The minimum - size is 16 bytes on most 32bit systems, and 32 bytes on 64bit - systems.) Note that size_t is an unsigned type, so calls with - arguments that would be negative if signed are interpreted as - requests for huge amounts of space, which will often fail. The - maximum supported value of n differs across systems, but is in all - cases less than the maximum representable value of a size_t. -*/ -void* dlmalloc(size_t); - -/* - free(void* p) - Releases the chunk of memory pointed to by p, that had been previously - allocated using malloc or a related routine such as realloc. - It has no effect if p is null. If p was not malloced or already - freed, free(p) will by default cause the current program to abort. -*/ -void dlfree(void*); - -/* - calloc(size_t n_elements, size_t element_size); - Returns a pointer to n_elements * element_size bytes, with all locations - set to zero. -*/ -void* dlcalloc(size_t, size_t); - -/* - realloc(void* p, size_t n) - Returns a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. - - The returned pointer may or may not be the same as p. The algorithm - prefers extending p in most cases when possible, otherwise it - employs the equivalent of a malloc-copy-free sequence. - - If p is null, realloc is equivalent to malloc. - - If space is not available, realloc returns null, errno is set (if on - ANSI) and p is NOT freed. - - if n is for fewer bytes than already held by p, the newly unused - space is lopped off and freed if possible. realloc with a size - argument of zero (re)allocates a minimum-sized chunk. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is not supported. -*/ - -void* dlrealloc(void*, size_t); - -/* - memalign(size_t alignment, size_t n); - Returns a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument. - - The alignment argument should be a power of two. If the argument is - not a power of two, the nearest greater power is used. - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. -*/ -void* dlmemalign(size_t, size_t); - -/* - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system. If the pagesize is unknown, 4096 is used. -*/ -void* dlvalloc(size_t); - -/* - mallopt(int parameter_number, int parameter_value) - Sets tunable parameters The format is to provide a - (parameter-number, parameter-value) pair. mallopt then sets the - corresponding parameter to the argument value if it can (i.e., so - long as the value is meaningful), and returns 1 if successful else - 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, - normally defined in malloc.h. None of these are use in this malloc, - so setting them has no effect. But this malloc also supports other - options in mallopt. See below for details. Briefly, supported - parameters are as follows (listed defaults are for "typical" - configurations). - - Symbol param # default allowed param values - M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) - M_GRANULARITY -2 page size any power of 2 >= page size - M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) -*/ -int dlmallopt(int, int); - -/* - malloc_footprint(); - Returns the number of bytes obtained from the system. The total - number of bytes allocated by malloc, realloc etc., is less than this - value. Unlike mallinfo, this function returns only a precomputed - result, so can be called frequently to monitor memory consumption. - Even if locks are otherwise defined, this function does not use them, - so results might not be up to date. -*/ -size_t dlmalloc_footprint(void); - -/* - malloc_max_footprint(); - Returns the maximum number of bytes obtained from the system. This - value will be greater than current footprint if deallocated space - has been reclaimed by the system. The peak number of bytes allocated - by malloc, realloc etc., is less than this value. Unlike mallinfo, - this function returns only a precomputed result, so can be called - frequently to monitor memory consumption. Even if locks are - otherwise defined, this function does not use them, so results might - not be up to date. -*/ -size_t dlmalloc_max_footprint(void); - -#if !NO_MALLINFO -/* - mallinfo() - Returns (by copy) a struct containing various summary statistics: - - arena: current total non-mmapped bytes allocated from system - ordblks: the number of free chunks - smblks: always zero. - hblks: current number of mmapped regions - hblkhd: total bytes held in mmapped regions - usmblks: the maximum total allocated space. This will be greater - than current total if trimming has occurred. - fsmblks: always zero - uordblks: current total allocated space (normal or mmapped) - fordblks: total free space - keepcost: the maximum number of bytes that could ideally be released - back to system via malloc_trim. ("ideally" means that - it ignores page restrictions etc.) - - Because these fields are ints, but internal bookkeeping may - be kept as longs, the reported values may wrap around zero and - thus be inaccurate. -*/ -struct mallinfo dlmallinfo(void); -#endif /* NO_MALLINFO */ - -/* - independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use regular calloc and assign pointers into this - space to represent elements. (In this case though, you cannot - independently free elements.) - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -void** dlindependent_calloc(size_t, size_t, void**); - -/* - independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use a single regular malloc, and assign pointers at - particular offsets in the aggregate space. (In this case though, you - cannot independently free elements.) - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -void** dlindependent_comalloc(size_t, size_t*, void**); - - -/* - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - */ -void* dlpvalloc(size_t); - -/* - malloc_trim(size_t pad); - - If possible, gives memory back to the system (via negative arguments - to sbrk) if there is unused memory at the `high' end of the malloc - pool or in unused MMAP segments. You can call this after freeing - large blocks of memory to potentially reduce the system-level memory - requirements of a program. However, it cannot guarantee to reduce - memory. Under some allocation patterns, some large free blocks of - memory will be locked between two used chunks, so they cannot be - given back to the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, only - the minimum amount of memory to maintain internal data structures - will be left. Non-zero arguments can be supplied to maintain enough - trailing space to service future expected allocations without having - to re-obtain memory from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. -*/ -int dlmalloc_trim(size_t); - -/* - malloc_usable_size(void* p); - - Returns the number of bytes you can actually use in - an allocated chunk, which may be more than you requested (although - often not) due to alignment and minimum size constraints. - You can use this many bytes without worrying about - overwriting other allocated objects. This is not a particularly great - programming practice. malloc_usable_size can be more useful in - debugging and assertions, for example: - - p = malloc(n); - assert(malloc_usable_size(p) >= 256); -*/ -size_t dlmalloc_usable_size(void*); - -/* - malloc_stats(); - Prints on stderr the amount of space obtained from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), and the current - number of bytes allocated via malloc (or realloc, etc) but not yet - freed. Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead. Because it includes - alignment wastage as being in use, this figure may be greater than - zero even when no user-level chunks are allocated. - - The reported current and maximum system memory can be inaccurate if - a program makes other calls to system memory allocation functions - (normally sbrk) outside of malloc. - - malloc_stats prints only the most commonly interesting statistics. - More information can be obtained by calling mallinfo. -*/ -void dlmalloc_stats(void); - -#endif /* ONLY_MSPACES */ - -#if MSPACES - -/* - mspace is an opaque type representing an independent - region of space that supports mspace_malloc, etc. -*/ -typedef void* mspace; - -/* - create_mspace creates and returns a new independent space with the - given initial capacity, or, if 0, the default granularity size. It - returns null if there is no system memory available to create the - space. If argument locked is non-zero, the space uses a separate - lock to control access. The capacity of the space will grow - dynamically as needed to service mspace_malloc requests. You can - control the sizes of incremental increases of this space by - compiling with a different DEFAULT_GRANULARITY or dynamically - setting with mallopt(M_GRANULARITY, value). -*/ -mspace create_mspace(size_t capacity, int locked); - -/* - destroy_mspace destroys the given space, and attempts to return all - of its memory back to the system, returning the total number of - bytes freed. After destruction, the results of access to all memory - used by the space become undefined. -*/ -size_t destroy_mspace(mspace msp); - -/* - create_mspace_with_base uses the memory supplied as the initial base - of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this - space is used for bookkeeping, so the capacity must be at least this - large. (Otherwise 0 is returned.) When this initial space is - exhausted, additional memory will be obtained from the system. - Destroying this space will deallocate all additionally allocated - space (if possible) but not the initial base. -*/ -mspace create_mspace_with_base(void* base, size_t capacity, int locked); - -/* - mspace_malloc behaves as malloc, but operates within - the given space. -*/ -void* mspace_malloc(mspace msp, size_t bytes); - -/* - mspace_free behaves as free, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_free is not actually needed. - free may be called instead of mspace_free because freed chunks from - any space are handled by their originating spaces. -*/ -void mspace_free(mspace msp, void* mem); - -/* - mspace_realloc behaves as realloc, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_realloc is not actually - needed. realloc may be called instead of mspace_realloc because - realloced chunks from any space are handled by their originating - spaces. -*/ -void* mspace_realloc(mspace msp, void* mem, size_t newsize); - -/* - mspace_calloc behaves as calloc, but operates within - the given space. -*/ -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); - -/* - mspace_memalign behaves as memalign, but operates within - the given space. -*/ -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); - -/* - mspace_independent_calloc behaves as independent_calloc, but - operates within the given space. -*/ -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]); - -/* - mspace_independent_comalloc behaves as independent_comalloc, but - operates within the given space. -*/ -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]); - -/* - mspace_footprint() returns the number of bytes obtained from the - system for this space. -*/ -size_t mspace_footprint(mspace msp); - -/* - mspace_max_footprint() returns the peak number of bytes obtained from the - system for this space. -*/ -size_t mspace_max_footprint(mspace msp); - - -#if !NO_MALLINFO -/* - mspace_mallinfo behaves as mallinfo, but reports properties of - the given space. -*/ -struct mallinfo mspace_mallinfo(mspace msp); -#endif /* NO_MALLINFO */ - -/* - mspace_malloc_stats behaves as malloc_stats, but reports - properties of the given space. -*/ -void mspace_malloc_stats(mspace msp); - -/* - mspace_trim behaves as malloc_trim, but - operates within the given space. -*/ -int mspace_trim(mspace msp, size_t pad); - -/* - An alias for mallopt. -*/ -int mspace_mallopt(int, int); - -#endif /* MSPACES */ - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif /* __cplusplus */ - -/* - ======================================================================== - To make a fully customizable malloc.h header file, cut everything - above this line, put into file malloc.h, edit to suit, and #include it - on the next line, as well as in programs that use this malloc. - ======================================================================== -*/ - -/* #include "malloc.h" */ - -/*------------------------------ internal #includes ---------------------- */ - -#ifdef _MSC_VER -#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ -#endif /* _MSC_VER */ - -#include /* for printing in malloc_stats */ - -#ifndef LACKS_ERRNO_H -#include /* for MALLOC_FAILURE_ACTION */ -#endif /* LACKS_ERRNO_H */ -#if FOOTERS -#include /* for magic initialization */ -#endif /* FOOTERS */ -#ifndef LACKS_STDLIB_H -#include /* for abort() */ -#endif /* LACKS_STDLIB_H */ -#ifdef DEBUG -#if ABORT_ON_ASSERT_FAILURE -#define assert(x) if(!(x)) ABORT -#else /* ABORT_ON_ASSERT_FAILURE */ -#include -#endif /* ABORT_ON_ASSERT_FAILURE */ -#else /* DEBUG */ -#define assert(x) -#endif /* DEBUG */ -#ifndef LACKS_STRING_H -#include /* for memset etc */ -#endif /* LACKS_STRING_H */ -#if USE_BUILTIN_FFS -#ifndef LACKS_STRINGS_H -#include /* for ffs */ -#endif /* LACKS_STRINGS_H */ -#endif /* USE_BUILTIN_FFS */ -#if HAVE_MMAP -#ifndef LACKS_SYS_MMAN_H -#include /* for mmap */ -#endif /* LACKS_SYS_MMAN_H */ -#ifndef LACKS_FCNTL_H -#include -#endif /* LACKS_FCNTL_H */ -#endif /* HAVE_MMAP */ -#if HAVE_MORECORE -#ifndef LACKS_UNISTD_H -#include /* for sbrk */ -#else /* LACKS_UNISTD_H */ -#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) -extern void* sbrk(ptrdiff_t); -#endif /* FreeBSD etc */ -#endif /* LACKS_UNISTD_H */ -#endif /* HAVE_MMAP */ - -#ifndef WIN32 -#ifndef malloc_getpagesize -# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ -# ifndef _SC_PAGE_SIZE -# define _SC_PAGE_SIZE _SC_PAGESIZE -# endif -# endif -# ifdef _SC_PAGE_SIZE -# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) -# else -# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) - extern size_t getpagesize(); -# define malloc_getpagesize getpagesize() -# else -# ifdef WIN32 /* use supplied emulation of getpagesize */ -# define malloc_getpagesize getpagesize() -# else -# ifndef LACKS_SYS_PARAM_H -# include -# endif -# ifdef EXEC_PAGESIZE -# define malloc_getpagesize EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define malloc_getpagesize NBPG -# else -# define malloc_getpagesize (NBPG * CLSIZE) -# endif -# else -# ifdef NBPC -# define malloc_getpagesize NBPC -# else -# ifdef PAGESIZE -# define malloc_getpagesize PAGESIZE -# else /* just guess */ -# define malloc_getpagesize ((size_t)4096U) -# endif -# endif -# endif -# endif -# endif -# endif -# endif -#endif -#endif - -/* ------------------- size_t and alignment properties -------------------- */ - -/* The byte and bit size of a size_t */ -#define SIZE_T_SIZE (sizeof(size_t)) -#define SIZE_T_BITSIZE (sizeof(size_t) << 3) - -/* Some constants coerced to size_t */ -/* Annoying but necessary to avoid errors on some platforms */ -#define SIZE_T_ZERO ((size_t)0) -#define SIZE_T_ONE ((size_t)1) -#define SIZE_T_TWO ((size_t)2) -#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) -#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) -#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) -#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) - -/* The bit mask value corresponding to MALLOC_ALIGNMENT */ -#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) - -/* True if address a has acceptable alignment */ -#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) - -/* the number of bytes to offset an address to align it */ -#define align_offset(A)\ - ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ - ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) - -/* -------------------------- MMAP preliminaries ------------------------- */ - -/* - If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and - checks to fail so compiler optimizer can delete code rather than - using so many "#if"s. -*/ - - -/* MORECORE and MMAP must return MFAIL on failure */ -#define MFAIL ((void*)(MAX_SIZE_T)) -#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ - -#if !HAVE_MMAP -#define IS_MMAPPED_BIT (SIZE_T_ZERO) -#define USE_MMAP_BIT (SIZE_T_ZERO) -#define CALL_MMAP(s) MFAIL -#define CALL_MUNMAP(a, s) (-1) -#define DIRECT_MMAP(s) MFAIL - -#else /* HAVE_MMAP */ -#define IS_MMAPPED_BIT (SIZE_T_ONE) -#define USE_MMAP_BIT (SIZE_T_ONE) - -#if !defined(WIN32) && !defined (__OS2__) -#define CALL_MUNMAP(a, s) munmap((a), (s)) -#define MMAP_PROT (PROT_READ|PROT_WRITE) -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif /* MAP_ANON */ -#ifdef MAP_ANONYMOUS -#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) -#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) -#else /* MAP_ANONYMOUS */ -/* - Nearly all versions of mmap support MAP_ANONYMOUS, so the following - is unlikely to be needed, but is supplied just in case. -*/ -#define MMAP_FLAGS (MAP_PRIVATE) -static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ -#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ - (dev_zero_fd = open("/dev/zero", O_RDWR), \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) -#endif /* MAP_ANONYMOUS */ - -#define DIRECT_MMAP(s) CALL_MMAP(s) - -#elif defined(__OS2__) - -/* OS/2 MMAP via DosAllocMem */ -static void* os2mmap(size_t size) { - void* ptr; - if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && - DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) - return MFAIL; - return ptr; -} - -#define os2direct_mmap(n) os2mmap(n) - -/* This function supports releasing coalesed segments */ -static int os2munmap(void* ptr, size_t size) { - while (size) { - ULONG ulSize = size; - ULONG ulFlags = 0; - if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) - return -1; - if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || - ulSize > size) - return -1; - if (DosFreeMem(ptr) != 0) - return -1; - ptr = ( void * ) ( ( char * ) ptr + ulSize ); - size -= ulSize; - } - return 0; -} - -#define CALL_MMAP(s) os2mmap(s) -#define CALL_MUNMAP(a, s) os2munmap((a), (s)) -#define DIRECT_MMAP(s) os2direct_mmap(s) - -#else /* WIN32 */ - -/* Win32 MMAP via VirtualAlloc */ -static void* win32mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static void* win32direct_mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, - PAGE_EXECUTE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* This function supports releasing coalesed segments */ -static int win32munmap(void* ptr, size_t size) { - MEMORY_BASIC_INFORMATION minfo; - char* cptr = ptr; - while (size) { - if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) - return -1; - if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || - minfo.State != MEM_COMMIT || minfo.RegionSize > size) - return -1; - if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) - return -1; - cptr += minfo.RegionSize; - size -= minfo.RegionSize; - } - return 0; -} - -#define CALL_MMAP(s) win32mmap(s) -#define CALL_MUNMAP(a, s) win32munmap((a), (s)) -#define DIRECT_MMAP(s) win32direct_mmap(s) -#endif /* WIN32 */ -#endif /* HAVE_MMAP */ - -#if HAVE_MMAP && HAVE_MREMAP -#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) -#else /* HAVE_MMAP && HAVE_MREMAP */ -#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL -#endif /* HAVE_MMAP && HAVE_MREMAP */ - -#if HAVE_MORECORE -#define CALL_MORECORE(S) MORECORE(S) -#else /* HAVE_MORECORE */ -#define CALL_MORECORE(S) MFAIL -#endif /* HAVE_MORECORE */ - -/* mstate bit set if contiguous morecore disabled or failed */ -#define USE_NONCONTIGUOUS_BIT (4U) - -/* segment bit set in create_mspace_with_base */ -#define EXTERN_BIT (8U) - - -/* --------------------------- Lock preliminaries ------------------------ */ - -#if USE_LOCKS - -/* - When locks are defined, there are up to two global locks: - - * If HAVE_MORECORE, morecore_mutex protects sequences of calls to - MORECORE. In many cases sys_alloc requires two calls, that should - not be interleaved with calls by other threads. This does not - protect against direct calls to MORECORE by other threads not - using this lock, so there is still code to cope the best we can on - interference. - - * magic_init_mutex ensures that mparams.magic and other - unique mparams values are initialized only once. -*/ - -#if !defined(WIN32) && !defined(__OS2__) -/* By default use posix locks */ -#include -#define MLOCK_T pthread_mutex_t -#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) -#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) -#define RELEASE_LOCK(l) pthread_mutex_unlock(l) - -#if HAVE_MORECORE -static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif /* HAVE_MORECORE */ - -static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; - -#elif defined(__OS2__) -#define MLOCK_T HMTX -#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) -#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) -#define RELEASE_LOCK(l) DosReleaseMutexSem(*l) -#if HAVE_MORECORE -static MLOCK_T morecore_mutex; -#endif /* HAVE_MORECORE */ -static MLOCK_T magic_init_mutex; - -#else /* WIN32 */ -/* - Because lock-protected regions have bounded times, and there - are no recursive lock calls, we can use simple spinlocks. -*/ - -#define MLOCK_T long -static int win32_acquire_lock (MLOCK_T *sl) { - for (;;) { -#ifdef InterlockedCompareExchangePointer - if (!InterlockedCompareExchange(sl, 1, 0)) - return 0; -#else /* Use older void* version */ - if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) - return 0; -#endif /* InterlockedCompareExchangePointer */ - Sleep (0); - } -} - -static void win32_release_lock (MLOCK_T *sl) { - InterlockedExchange (sl, 0); -} - -#define INITIAL_LOCK(l) *(l)=0 -#define ACQUIRE_LOCK(l) win32_acquire_lock(l) -#define RELEASE_LOCK(l) win32_release_lock(l) -#if HAVE_MORECORE -static MLOCK_T morecore_mutex; -#endif /* HAVE_MORECORE */ -static MLOCK_T magic_init_mutex; -#endif /* WIN32 */ - -#define USE_LOCK_BIT (2U) -#else /* USE_LOCKS */ -#define USE_LOCK_BIT (0U) -#define INITIAL_LOCK(l) -#endif /* USE_LOCKS */ - -#if USE_LOCKS && HAVE_MORECORE -#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); -#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); -#else /* USE_LOCKS && HAVE_MORECORE */ -#define ACQUIRE_MORECORE_LOCK() -#define RELEASE_MORECORE_LOCK() -#endif /* USE_LOCKS && HAVE_MORECORE */ - -#if USE_LOCKS -#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); -#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); -#else /* USE_LOCKS */ -#define ACQUIRE_MAGIC_INIT_LOCK() -#define RELEASE_MAGIC_INIT_LOCK() -#endif /* USE_LOCKS */ - - -/* ----------------------- Chunk representations ------------------------ */ - -/* - (The following includes lightly edited explanations by Colin Plumb.) - - The malloc_chunk declaration below is misleading (but accurate and - necessary). It declares a "view" into memory allowing access to - necessary fields at known offsets from a given base. - - Chunks of memory are maintained using a `boundary tag' method as - originally described by Knuth. (See the paper by Paul Wilson - ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such - techniques.) Sizes of free chunks are stored both in the front of - each chunk and at the end. This makes consolidating fragmented - chunks into bigger chunks fast. The head fields also hold bits - representing whether chunks are free or in use. - - Here are some pictures to make it clearer. They are "exploded" to - show that the state of a chunk can be thought of as extending from - the high 31 bits of the head field of its header through the - prev_foot and PINUSE_BIT bit of the following chunk header. - - A chunk that's in use looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk (if P = 1) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 1| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - +- -+ - | | - +- -+ - | : - +- size - sizeof(size_t) available payload bytes -+ - : | - chunk-> +- -+ - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| - | Size of next chunk (may or may not be in use) | +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - And if it's free, it looks like this: - - chunk-> +- -+ - | User payload (must be in use, or we would have merged!) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 0| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Next pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Prev pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- size - sizeof(struct chunk) unused bytes -+ - : | - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| - | Size of next chunk (must be in use, or we would have merged)| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- User payload -+ - : | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |0| - +-+ - Note that since we always merge adjacent free chunks, the chunks - adjacent to a free chunk must be in use. - - Given a pointer to a chunk (which can be derived trivially from the - payload pointer) we can, in O(1) time, find out whether the adjacent - chunks are free, and if so, unlink them from the lists that they - are on and merge them with the current chunk. - - Chunks always begin on even word boundaries, so the mem portion - (which is returned to the user) is also on an even word boundary, and - thus at least double-word aligned. - - The P (PINUSE_BIT) bit, stored in the unused low-order bit of the - chunk size (which is always a multiple of two words), is an in-use - bit for the *previous* chunk. If that bit is *clear*, then the - word before the current chunk size contains the previous chunk - size, and can be used to find the front of the previous chunk. - The very first chunk allocated always has this bit set, preventing - access to non-existent (or non-owned) memory. If pinuse is set for - any given chunk, then you CANNOT determine the size of the - previous chunk, and might even get a memory addressing fault when - trying to do so. - - The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of - the chunk size redundantly records whether the current chunk is - inuse. This redundancy enables usage checks within free and realloc, - and reduces indirection when freeing and consolidating chunks. - - Each freshly allocated chunk must have both cinuse and pinuse set. - That is, each allocated chunk borders either a previously allocated - and still in-use chunk, or the base of its memory arena. This is - ensured by making all allocations from the the `lowest' part of any - found chunk. Further, no free chunk physically borders another one, - so each free chunk is known to be preceded and followed by either - inuse chunks or the ends of memory. - - Note that the `foot' of the current chunk is actually represented - as the prev_foot of the NEXT chunk. This makes it easier to - deal with alignments etc but can be very confusing when trying - to extend or adapt this code. - - The exceptions to all this are - - 1. The special chunk `top' is the top-most available chunk (i.e., - the one bordering the end of available memory). It is treated - specially. Top is never included in any bin, is used only if - no other chunk is available, and is released back to the - system if it is very large (see M_TRIM_THRESHOLD). In effect, - the top chunk is treated as larger (and thus less well - fitting) than any other available chunk. The top chunk - doesn't update its trailing size field since there is no next - contiguous chunk that would have to index off it. However, - space is still allocated for it (TOP_FOOT_SIZE) to enable - separation or merging when space is extended. - - 3. Chunks allocated via mmap, which have the lowest-order bit - (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set - PINUSE_BIT in their head fields. Because they are allocated - one-by-one, each must carry its own prev_foot field, which is - also used to hold the offset this chunk has within its mmapped - region, which is needed to preserve alignment. Each mmapped - chunk is trailed by the first two fields of a fake next-chunk - for sake of usage checks. - -*/ - -struct malloc_chunk { - size_t prev_foot; /* Size of previous chunk (if free). */ - size_t head; /* Size and inuse bits. */ - struct malloc_chunk* fd; /* double links -- used only if free. */ - struct malloc_chunk* bk; -}; - -typedef struct malloc_chunk mchunk; -typedef struct malloc_chunk* mchunkptr; -typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ -typedef size_t bindex_t; /* Described below */ -typedef unsigned int binmap_t; /* Described below */ -typedef unsigned int flag_t; /* The type of various bit flag sets */ - -/* ------------------- Chunks sizes and alignments ----------------------- */ - -#define MCHUNK_SIZE (sizeof(mchunk)) - -#if FOOTERS -#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -#else /* FOOTERS */ -#define CHUNK_OVERHEAD (SIZE_T_SIZE) -#endif /* FOOTERS */ - -/* MMapped chunks need a second word of overhead ... */ -#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -/* ... and additional padding for fake next-chunk at foot */ -#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) - -/* The smallest size we can malloc is an aligned minimal chunk */ -#define MIN_CHUNK_SIZE\ - ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* conversion from malloc headers to user pointers, and back */ -#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) -#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) -/* chunk associated with aligned address A */ -#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) - -/* Bounds on request (not chunk) sizes. */ -#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) -#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) - -/* pad request bytes into a usable size */ -#define pad_request(req) \ - (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* pad request, checking for minimum (but not maximum) */ -#define request2size(req) \ - (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) - - -/* ------------------ Operations on head and foot fields ----------------- */ - -/* - The head field of a chunk is or'ed with PINUSE_BIT when previous - adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in - use. If the chunk was obtained with mmap, the prev_foot field has - IS_MMAPPED_BIT set, otherwise holding the offset of the base of the - mmapped region to the base of the chunk. -*/ - -#define PINUSE_BIT (SIZE_T_ONE) -#define CINUSE_BIT (SIZE_T_TWO) -#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) - -/* Head value for fenceposts */ -#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) - -/* extraction of fields from head words */ -#define cinuse(p) ((p)->head & CINUSE_BIT) -#define pinuse(p) ((p)->head & PINUSE_BIT) -#define chunksize(p) ((p)->head & ~(INUSE_BITS)) - -#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) -#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) - -/* Treat space at ptr +/- offset as a chunk */ -#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) -#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) - -/* Ptr to next or previous physical malloc_chunk. */ -#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) -#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) - -/* extract next chunk's pinuse bit */ -#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) - -/* Get/set size at footer */ -#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) -#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) - -/* Set size, pinuse bit, and foot */ -#define set_size_and_pinuse_of_free_chunk(p, s)\ - ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) - -/* Set size, pinuse bit, foot, and clear next pinuse */ -#define set_free_with_pinuse(p, s, n)\ - (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) - -#define is_mmapped(p)\ - (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) - -/* Get the internal overhead associated with chunk p */ -#define overhead_for(p)\ - (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) - -/* Return true if malloced space is not necessarily cleared */ -#if MMAP_CLEARS -#define calloc_must_clear(p) (!is_mmapped(p)) -#else /* MMAP_CLEARS */ -#define calloc_must_clear(p) (1) -#endif /* MMAP_CLEARS */ - -/* ---------------------- Overlaid data structures ----------------------- */ - -/* - When chunks are not in use, they are treated as nodes of either - lists or trees. - - "Small" chunks are stored in circular doubly-linked lists, and look - like this: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space (may be 0 bytes long) . - . . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Larger chunks are kept in a form of bitwise digital trees (aka - tries) keyed on chunksizes. Because malloc_tree_chunks are only for - free chunks greater than 256 bytes, their size doesn't impose any - constraints on user chunk sizes. Each node looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to left child (child[0]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to right child (child[1]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to parent | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | bin index of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Each tree holding treenodes is a tree of unique chunk sizes. Chunks - of the same size are arranged in a circularly-linked list, with only - the oldest chunk (the next to be used, in our FIFO ordering) - actually in the tree. (Tree members are distinguished by a non-null - parent pointer.) If a chunk with the same size an an existing node - is inserted, it is linked off the existing node using pointers that - work in the same way as fd/bk pointers of small chunks. - - Each tree contains a power of 2 sized range of chunk sizes (the - smallest is 0x100 <= x < 0x180), which is is divided in half at each - tree level, with the chunks in the smaller half of the range (0x100 - <= x < 0x140 for the top nose) in the left subtree and the larger - half (0x140 <= x < 0x180) in the right subtree. This is, of course, - done by inspecting individual bits. - - Using these rules, each node's left subtree contains all smaller - sizes than its right subtree. However, the node at the root of each - subtree has no particular ordering relationship to either. (The - dividing line between the subtree sizes is based on trie relation.) - If we remove the last chunk of a given size from the interior of the - tree, we need to replace it with a leaf node. The tree ordering - rules permit a node to be replaced by any leaf below it. - - The smallest chunk in a tree (a common operation in a best-fit - allocator) can be found by walking a path to the leftmost leaf in - the tree. Unlike a usual binary tree, where we follow left child - pointers until we reach a null, here we follow the right child - pointer any time the left one is null, until we reach a leaf with - both child pointers null. The smallest chunk in the tree will be - somewhere along that path. - - The worst case number of steps to add, find, or remove a node is - bounded by the number of bits differentiating chunks within - bins. Under current bin calculations, this ranges from 6 up to 21 - (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case - is of course much better. -*/ - -struct malloc_tree_chunk { - /* The first four fields must be compatible with malloc_chunk */ - size_t prev_foot; - size_t head; - struct malloc_tree_chunk* fd; - struct malloc_tree_chunk* bk; - - struct malloc_tree_chunk* child[2]; - struct malloc_tree_chunk* parent; - bindex_t index; -}; - -typedef struct malloc_tree_chunk tchunk; -typedef struct malloc_tree_chunk* tchunkptr; -typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ - -/* A little helper macro for trees */ -#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) - -/* ----------------------------- Segments -------------------------------- */ - -/* - Each malloc space may include non-contiguous segments, held in a - list headed by an embedded malloc_segment record representing the - top-most space. Segments also include flags holding properties of - the space. Large chunks that are directly allocated by mmap are not - included in this list. They are instead independently created and - destroyed without otherwise keeping track of them. - - Segment management mainly comes into play for spaces allocated by - MMAP. Any call to MMAP might or might not return memory that is - adjacent to an existing segment. MORECORE normally contiguously - extends the current space, so this space is almost always adjacent, - which is simpler and faster to deal with. (This is why MORECORE is - used preferentially to MMAP when both are available -- see - sys_alloc.) When allocating using MMAP, we don't use any of the - hinting mechanisms (inconsistently) supported in various - implementations of unix mmap, or distinguish reserving from - committing memory. Instead, we just ask for space, and exploit - contiguity when we get it. It is probably possible to do - better than this on some systems, but no general scheme seems - to be significantly better. - - Management entails a simpler variant of the consolidation scheme - used for chunks to reduce fragmentation -- new adjacent memory is - normally prepended or appended to an existing segment. However, - there are limitations compared to chunk consolidation that mostly - reflect the fact that segment processing is relatively infrequent - (occurring only when getting memory from system) and that we - don't expect to have huge numbers of segments: - - * Segments are not indexed, so traversal requires linear scans. (It - would be possible to index these, but is not worth the extra - overhead and complexity for most programs on most platforms.) - * New segments are only appended to old ones when holding top-most - memory; if they cannot be prepended to others, they are held in - different segments. - - Except for the top-most segment of an mstate, each segment record - is kept at the tail of its segment. Segments are added by pushing - segment records onto the list headed by &mstate.seg for the - containing mstate. - - Segment flags control allocation/merge/deallocation policies: - * If EXTERN_BIT set, then we did not allocate this segment, - and so should not try to deallocate or merge with others. - (This currently holds only for the initial segment passed - into create_mspace_with_base.) - * If IS_MMAPPED_BIT set, the segment may be merged with - other surrounding mmapped segments and trimmed/de-allocated - using munmap. - * If neither bit is set, then the segment was obtained using - MORECORE so can be merged with surrounding MORECORE'd segments - and deallocated/trimmed using MORECORE with negative arguments. -*/ - -struct malloc_segment { - char* base; /* base address */ - size_t size; /* allocated size */ - struct malloc_segment* next; /* ptr to next segment */ -#if FFI_MMAP_EXEC_WRIT - /* The mmap magic is supposed to store the address of the executable - segment at the very end of the requested block. */ - -# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) - - /* We can only merge segments if their corresponding executable - segments are at identical offsets. */ -# define check_segment_merge(S,b,s) \ - (mmap_exec_offset((b),(s)) == (S)->exec_offset) - -# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) -# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) - - /* The removal of sflags only works with HAVE_MORECORE == 0. */ - -# define get_segment_flags(S) (IS_MMAPPED_BIT) -# define set_segment_flags(S,v) \ - (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ - (((S)->exec_offset = \ - mmap_exec_offset((S)->base, (S)->size)), \ - (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ - (S)->exec_offset) ? (ABORT, (v)) : \ - (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) - - /* We use an offset here, instead of a pointer, because then, when - base changes, we don't have to modify this. On architectures - with segmented addresses, this might not work. */ - ptrdiff_t exec_offset; -#else - -# define get_segment_flags(S) ((S)->sflags) -# define set_segment_flags(S,v) ((S)->sflags = (v)) -# define check_segment_merge(S,b,s) (1) - - flag_t sflags; /* mmap and extern flag */ -#endif -}; - -#define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) -#define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) - -typedef struct malloc_segment msegment; -typedef struct malloc_segment* msegmentptr; - -/* ---------------------------- malloc_state ----------------------------- */ - -/* - A malloc_state holds all of the bookkeeping for a space. - The main fields are: - - Top - The topmost chunk of the currently active segment. Its size is - cached in topsize. The actual size of topmost space is - topsize+TOP_FOOT_SIZE, which includes space reserved for adding - fenceposts and segment records if necessary when getting more - space from the system. The size at which to autotrim top is - cached from mparams in trim_check, except that it is disabled if - an autotrim fails. - - Designated victim (dv) - This is the preferred chunk for servicing small requests that - don't have exact fits. It is normally the chunk split off most - recently to service another small request. Its size is cached in - dvsize. The link fields of this chunk are not maintained since it - is not kept in a bin. - - SmallBins - An array of bin headers for free chunks. These bins hold chunks - with sizes less than MIN_LARGE_SIZE bytes. Each bin contains - chunks of all the same size, spaced 8 bytes apart. To simplify - use in double-linked lists, each bin header acts as a malloc_chunk - pointing to the real first node, if it exists (else pointing to - itself). This avoids special-casing for headers. But to avoid - waste, we allocate only the fd/bk pointers of bins, and then use - repositioning tricks to treat these as the fields of a chunk. - - TreeBins - Treebins are pointers to the roots of trees holding a range of - sizes. There are 2 equally spaced treebins for each power of two - from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything - larger. - - Bin maps - There is one bit map for small bins ("smallmap") and one for - treebins ("treemap). Each bin sets its bit when non-empty, and - clears the bit when empty. Bit operations are then used to avoid - bin-by-bin searching -- nearly all "search" is done without ever - looking at bins that won't be selected. The bit maps - conservatively use 32 bits per map word, even if on 64bit system. - For a good description of some of the bit-based techniques used - here, see Henry S. Warren Jr's book "Hacker's Delight" (and - supplement at http://hackersdelight.org/). Many of these are - intended to reduce the branchiness of paths through malloc etc, as - well as to reduce the number of memory locations read or written. - - Segments - A list of segments headed by an embedded malloc_segment record - representing the initial space. - - Address check support - The least_addr field is the least address ever obtained from - MORECORE or MMAP. Attempted frees and reallocs of any address less - than this are trapped (unless INSECURE is defined). - - Magic tag - A cross-check field that should always hold same value as mparams.magic. - - Flags - Bits recording whether to use MMAP, locks, or contiguous MORECORE - - Statistics - Each space keeps track of current and maximum system memory - obtained via MORECORE or MMAP. - - Locking - If USE_LOCKS is defined, the "mutex" lock is acquired and released - around every public call using this mspace. -*/ - -/* Bin types, widths and sizes */ -#define NSMALLBINS (32U) -#define NTREEBINS (32U) -#define SMALLBIN_SHIFT (3U) -#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) -#define TREEBIN_SHIFT (8U) -#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) -#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) -#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) - -struct malloc_state { - binmap_t smallmap; - binmap_t treemap; - size_t dvsize; - size_t topsize; - char* least_addr; - mchunkptr dv; - mchunkptr top; - size_t trim_check; - size_t magic; - mchunkptr smallbins[(NSMALLBINS+1)*2]; - tbinptr treebins[NTREEBINS]; - size_t footprint; - size_t max_footprint; - flag_t mflags; -#if USE_LOCKS - MLOCK_T mutex; /* locate lock among fields that rarely change */ -#endif /* USE_LOCKS */ - msegment seg; -}; - -typedef struct malloc_state* mstate; - -/* ------------- Global malloc_state and malloc_params ------------------- */ - -/* - malloc_params holds global properties, including those that can be - dynamically set using mallopt. There is a single instance, mparams, - initialized in init_mparams. -*/ - -struct malloc_params { - size_t magic; - size_t page_size; - size_t granularity; - size_t mmap_threshold; - size_t trim_threshold; - flag_t default_mflags; -}; - -static struct malloc_params mparams; - -/* The global malloc_state used for all non-"mspace" calls */ -static struct malloc_state _gm_; -#define gm (&_gm_) -#define is_global(M) ((M) == &_gm_) -#define is_initialized(M) ((M)->top != 0) - -/* -------------------------- system alloc setup ------------------------- */ - -/* Operations on mflags */ - -#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) -#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) -#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) - -#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) -#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) -#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) - -#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) -#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) - -#define set_lock(M,L)\ - ((M)->mflags = (L)?\ - ((M)->mflags | USE_LOCK_BIT) :\ - ((M)->mflags & ~USE_LOCK_BIT)) - -/* page-align a size */ -#define page_align(S)\ - (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) - -/* granularity-align a size */ -#define granularity_align(S)\ - (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) - -#define is_page_aligned(S)\ - (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) -#define is_granularity_aligned(S)\ - (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) - -/* True if segment S holds address A */ -#define segment_holds(S, A)\ - ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) - -/* Return segment holding given address */ -static msegmentptr segment_holding(mstate m, char* addr) { - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= sp->base && addr < sp->base + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* Return true if segment contains a segment link */ -static int has_segment_link(mstate m, msegmentptr ss) { - msegmentptr sp = &m->seg; - for (;;) { - if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) - return 1; - if ((sp = sp->next) == 0) - return 0; - } -} - -#ifndef MORECORE_CANNOT_TRIM -#define should_trim(M,s) ((s) > (M)->trim_check) -#else /* MORECORE_CANNOT_TRIM */ -#define should_trim(M,s) (0) -#endif /* MORECORE_CANNOT_TRIM */ - -/* - TOP_FOOT_SIZE is padding at the end of a segment, including space - that may be needed to place segment records and fenceposts when new - noncontiguous segments are added. -*/ -#define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) - - -/* ------------------------------- Hooks -------------------------------- */ - -/* - PREACTION should be defined to return 0 on success, and nonzero on - failure. If you are not using locking, you can redefine these to do - anything you like. -*/ - -#if USE_LOCKS - -/* Ensure locks are initialized */ -#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) - -#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) -#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } -#else /* USE_LOCKS */ - -#ifndef PREACTION -#define PREACTION(M) (0) -#endif /* PREACTION */ - -#ifndef POSTACTION -#define POSTACTION(M) -#endif /* POSTACTION */ - -#endif /* USE_LOCKS */ - -/* - CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. - USAGE_ERROR_ACTION is triggered on detected bad frees and - reallocs. The argument p is an address that might have triggered the - fault. It is ignored by the two predefined actions, but might be - useful in custom actions that try to help diagnose errors. -*/ - -#if PROCEED_ON_ERROR - -/* A count of the number of corruption errors causing resets */ -int malloc_corruption_error_count; - -/* default corruption action */ -static void reset_on_error(mstate m); - -#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) -#define USAGE_ERROR_ACTION(m, p) - -#else /* PROCEED_ON_ERROR */ - -#ifndef CORRUPTION_ERROR_ACTION -#define CORRUPTION_ERROR_ACTION(m) ABORT -#endif /* CORRUPTION_ERROR_ACTION */ - -#ifndef USAGE_ERROR_ACTION -#define USAGE_ERROR_ACTION(m,p) ABORT -#endif /* USAGE_ERROR_ACTION */ - -#endif /* PROCEED_ON_ERROR */ - -/* -------------------------- Debugging setup ---------------------------- */ - -#if ! DEBUG - -#define check_free_chunk(M,P) -#define check_inuse_chunk(M,P) -#define check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) -#define check_malloc_state(M) -#define check_top_chunk(M,P) - -#else /* DEBUG */ -#define check_free_chunk(M,P) do_check_free_chunk(M,P) -#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) -#define check_top_chunk(M,P) do_check_top_chunk(M,P) -#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) -#define check_malloc_state(M) do_check_malloc_state(M) - -static void do_check_any_chunk(mstate m, mchunkptr p); -static void do_check_top_chunk(mstate m, mchunkptr p); -static void do_check_mmapped_chunk(mstate m, mchunkptr p); -static void do_check_inuse_chunk(mstate m, mchunkptr p); -static void do_check_free_chunk(mstate m, mchunkptr p); -static void do_check_malloced_chunk(mstate m, void* mem, size_t s); -static void do_check_tree(mstate m, tchunkptr t); -static void do_check_treebin(mstate m, bindex_t i); -static void do_check_smallbin(mstate m, bindex_t i); -static void do_check_malloc_state(mstate m); -static int bin_find(mstate m, mchunkptr x); -static size_t traverse_and_check(mstate m); -#endif /* DEBUG */ - -/* ---------------------------- Indexing Bins ---------------------------- */ - -#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) -#define small_index(s) ((s) >> SMALLBIN_SHIFT) -#define small_index2size(i) ((i) << SMALLBIN_SHIFT) -#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) - -/* addressing by index. See above about smallbin repositioning */ -#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) -#define treebin_at(M,i) (&((M)->treebins[i])) - -/* assign tree index for size S to variable I */ -#if defined(__GNUC__) && defined(i386) -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K;\ - __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} -#else /* GNUC */ -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int Y = (unsigned int)X;\ - unsigned int N = ((Y - 0x100) >> 16) & 8;\ - unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ - N += K;\ - N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ - K = 14 - N + ((Y <<= K) >> 15);\ - I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ - }\ -} -#endif /* GNUC */ - -/* Bit representing maximum resolved size in a treebin at i */ -#define bit_for_tree_index(i) \ - (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) - -/* Shift placing maximum resolved bit in a treebin at i as sign bit */ -#define leftshift_for_tree_index(i) \ - ((i == NTREEBINS-1)? 0 : \ - ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) - -/* The size of the smallest chunk held in bin with index i */ -#define minsize_for_tree_index(i) \ - ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ - (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) - - -/* ------------------------ Operations on bin maps ----------------------- */ - -/* bit corresponding to given index */ -#define idx2bit(i) ((binmap_t)(1) << (i)) - -/* Mark/Clear bits with given index */ -#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) -#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) -#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) - -#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) -#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) -#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) - -/* index corresponding to given bit */ - -#if defined(__GNUC__) && defined(i386) -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ - I = (bindex_t)J;\ -} - -#else /* GNUC */ -#if USE_BUILTIN_FFS -#define compute_bit2idx(X, I) I = ffs(X)-1 - -#else /* USE_BUILTIN_FFS */ -#define compute_bit2idx(X, I)\ -{\ - unsigned int Y = X - 1;\ - unsigned int K = Y >> (16-4) & 16;\ - unsigned int N = K; Y >>= K;\ - N += K = Y >> (8-3) & 8; Y >>= K;\ - N += K = Y >> (4-2) & 4; Y >>= K;\ - N += K = Y >> (2-1) & 2; Y >>= K;\ - N += K = Y >> (1-0) & 1; Y >>= K;\ - I = (bindex_t)(N + Y);\ -} -#endif /* USE_BUILTIN_FFS */ -#endif /* GNUC */ - -/* isolate the least set bit of a bitmap */ -#define least_bit(x) ((x) & -(x)) - -/* mask with all bits to left of least bit of x on */ -#define left_bits(x) ((x<<1) | -(x<<1)) - -/* mask with all bits to left of or equal to least bit of x on */ -#define same_or_left_bits(x) ((x) | -(x)) - - -/* ----------------------- Runtime Check Support ------------------------- */ - -/* - For security, the main invariant is that malloc/free/etc never - writes to a static address other than malloc_state, unless static - malloc_state itself has been corrupted, which cannot occur via - malloc (because of these checks). In essence this means that we - believe all pointers, sizes, maps etc held in malloc_state, but - check all of those linked or offsetted from other embedded data - structures. These checks are interspersed with main code in a way - that tends to minimize their run-time cost. - - When FOOTERS is defined, in addition to range checking, we also - verify footer fields of inuse chunks, which can be used guarantee - that the mstate controlling malloc/free is intact. This is a - streamlined version of the approach described by William Robertson - et al in "Run-time Detection of Heap-based Overflows" LISA'03 - http://www.usenix.org/events/lisa03/tech/robertson.html The footer - of an inuse chunk holds the xor of its mstate and a random seed, - that is checked upon calls to free() and realloc(). This is - (probablistically) unguessable from outside the program, but can be - computed by any code successfully malloc'ing any chunk, so does not - itself provide protection against code that has already broken - security through some other means. Unlike Robertson et al, we - always dynamically check addresses of all offset chunks (previous, - next, etc). This turns out to be cheaper than relying on hashes. -*/ - -#if !INSECURE -/* Check if address a is at least as high as any from MORECORE or MMAP */ -#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) -/* Check if address of next chunk n is higher than base chunk p */ -#define ok_next(p, n) ((char*)(p) < (char*)(n)) -/* Check if p has its cinuse bit on */ -#define ok_cinuse(p) cinuse(p) -/* Check if p has its pinuse bit on */ -#define ok_pinuse(p) pinuse(p) - -#else /* !INSECURE */ -#define ok_address(M, a) (1) -#define ok_next(b, n) (1) -#define ok_cinuse(p) (1) -#define ok_pinuse(p) (1) -#endif /* !INSECURE */ - -#if (FOOTERS && !INSECURE) -/* Check if (alleged) mstate m has expected magic field */ -#define ok_magic(M) ((M)->magic == mparams.magic) -#else /* (FOOTERS && !INSECURE) */ -#define ok_magic(M) (1) -#endif /* (FOOTERS && !INSECURE) */ - - -/* In gcc, use __builtin_expect to minimize impact of checks */ -#if !INSECURE -#if defined(__GNUC__) && __GNUC__ >= 3 -#define RTCHECK(e) __builtin_expect(e, 1) -#else /* GNUC */ -#define RTCHECK(e) (e) -#endif /* GNUC */ -#else /* !INSECURE */ -#define RTCHECK(e) (1) -#endif /* !INSECURE */ - -/* macros to set up inuse chunks with or without footers */ - -#if !FOOTERS - -#define mark_inuse_foot(M,p,s) - -/* Set cinuse bit and pinuse bit of next chunk */ -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set size, cinuse and pinuse bit of this chunk */ -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) - -#else /* FOOTERS */ - -/* Set foot of inuse chunk to be xor of mstate and seed */ -#define mark_inuse_foot(M,p,s)\ - (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) - -#define get_mstate_for(p)\ - ((mstate)(((mchunkptr)((char*)(p) +\ - (chunksize(p))))->prev_foot ^ mparams.magic)) - -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ - mark_inuse_foot(M,p,s)) - -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ - mark_inuse_foot(M,p,s)) - -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - mark_inuse_foot(M, p, s)) - -#endif /* !FOOTERS */ - -/* ---------------------------- setting mparams -------------------------- */ - -/* Initialize mparams */ -static int init_mparams(void) { - if (mparams.page_size == 0) { - size_t s; - - mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; - mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; -#if MORECORE_CONTIGUOUS - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; -#else /* MORECORE_CONTIGUOUS */ - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; -#endif /* MORECORE_CONTIGUOUS */ - -#if (FOOTERS && !INSECURE) - { -#if USE_DEV_RANDOM - int fd; - unsigned char buf[sizeof(size_t)]; - /* Try to use /dev/urandom, else fall back on using time */ - if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && - read(fd, buf, sizeof(buf)) == sizeof(buf)) { - s = *((size_t *) buf); - close(fd); - } - else -#endif /* USE_DEV_RANDOM */ - s = (size_t)(time(0) ^ (size_t)0x55555555U); - - s |= (size_t)8U; /* ensure nonzero */ - s &= ~(size_t)7U; /* improve chances of fault for bad values */ - - } -#else /* (FOOTERS && !INSECURE) */ - s = (size_t)0x58585858U; -#endif /* (FOOTERS && !INSECURE) */ - ACQUIRE_MAGIC_INIT_LOCK(); - if (mparams.magic == 0) { - mparams.magic = s; - /* Set up lock for main malloc area */ - INITIAL_LOCK(&gm->mutex); - gm->mflags = mparams.default_mflags; - } - RELEASE_MAGIC_INIT_LOCK(); - -#if !defined(WIN32) && !defined(__OS2__) - mparams.page_size = malloc_getpagesize; - mparams.granularity = ((DEFAULT_GRANULARITY != 0)? - DEFAULT_GRANULARITY : mparams.page_size); -#elif defined (__OS2__) - /* if low-memory is used, os2munmap() would break - if it were anything other than 64k */ - mparams.page_size = 4096u; - mparams.granularity = 65536u; -#else /* WIN32 */ - { - SYSTEM_INFO system_info; - GetSystemInfo(&system_info); - mparams.page_size = system_info.dwPageSize; - mparams.granularity = system_info.dwAllocationGranularity; - } -#endif /* WIN32 */ - - /* Sanity-check configuration: - size_t must be unsigned and as wide as pointer type. - ints must be at least 4 bytes. - alignment must be at least 8. - Alignment, min chunk size, and page size must all be powers of 2. - */ - if ((sizeof(size_t) != sizeof(char*)) || - (MAX_SIZE_T < MIN_CHUNK_SIZE) || - (sizeof(int) < 4) || - (MALLOC_ALIGNMENT < (size_t)8U) || - ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || - ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || - ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || - ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) - ABORT; - } - return 0; -} - -/* support for mallopt */ -static int change_mparam(int param_number, int value) { - size_t val = (size_t)value; - init_mparams(); - switch(param_number) { - case M_TRIM_THRESHOLD: - mparams.trim_threshold = val; - return 1; - case M_GRANULARITY: - if (val >= mparams.page_size && ((val & (val-1)) == 0)) { - mparams.granularity = val; - return 1; - } - else - return 0; - case M_MMAP_THRESHOLD: - mparams.mmap_threshold = val; - return 1; - default: - return 0; - } -} - -#if DEBUG -/* ------------------------- Debugging Support --------------------------- */ - -/* Check properties of any chunk, whether free, inuse, mmapped etc */ -static void do_check_any_chunk(mstate m, mchunkptr p) { - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); -} - -/* Check properties of top chunk */ -static void do_check_top_chunk(mstate m, mchunkptr p) { - msegmentptr sp = segment_holding(m, (char*)p); - size_t sz = chunksize(p); - assert(sp != 0); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(sz == m->topsize); - assert(sz > 0); - assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); - assert(pinuse(p)); - assert(!next_pinuse(p)); -} - -/* Check properties of (inuse) mmapped chunks */ -static void do_check_mmapped_chunk(mstate m, mchunkptr p) { - size_t sz = chunksize(p); - size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); - assert(is_mmapped(p)); - assert(use_mmap(m)); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(!is_small(sz)); - assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); - assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); - assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); -} - -/* Check properties of inuse chunks */ -static void do_check_inuse_chunk(mstate m, mchunkptr p) { - do_check_any_chunk(m, p); - assert(cinuse(p)); - assert(next_pinuse(p)); - /* If not pinuse and not mmapped, previous chunk has OK offset */ - assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); - if (is_mmapped(p)) - do_check_mmapped_chunk(m, p); -} - -/* Check properties of free chunks */ -static void do_check_free_chunk(mstate m, mchunkptr p) { - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - mchunkptr next = chunk_plus_offset(p, sz); - do_check_any_chunk(m, p); - assert(!cinuse(p)); - assert(!next_pinuse(p)); - assert (!is_mmapped(p)); - if (p != m->dv && p != m->top) { - if (sz >= MIN_CHUNK_SIZE) { - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(is_aligned(chunk2mem(p))); - assert(next->prev_foot == sz); - assert(pinuse(p)); - assert (next == m->top || cinuse(next)); - assert(p->fd->bk == p); - assert(p->bk->fd == p); - } - else /* markers are always of size SIZE_T_SIZE */ - assert(sz == SIZE_T_SIZE); - } -} - -/* Check properties of malloced chunks at the point they are malloced */ -static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - do_check_inuse_chunk(m, p); - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(sz >= MIN_CHUNK_SIZE); - assert(sz >= s); - /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ - assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); - } -} - -/* Check a tree and its subtrees. */ -static void do_check_tree(mstate m, tchunkptr t) { - tchunkptr head = 0; - tchunkptr u = t; - bindex_t tindex = t->index; - size_t tsize = chunksize(t); - bindex_t idx; - compute_tree_index(tsize, idx); - assert(tindex == idx); - assert(tsize >= MIN_LARGE_SIZE); - assert(tsize >= minsize_for_tree_index(idx)); - assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); - - do { /* traverse through chain of same-sized nodes */ - do_check_any_chunk(m, ((mchunkptr)u)); - assert(u->index == tindex); - assert(chunksize(u) == tsize); - assert(!cinuse(u)); - assert(!next_pinuse(u)); - assert(u->fd->bk == u); - assert(u->bk->fd == u); - if (u->parent == 0) { - assert(u->child[0] == 0); - assert(u->child[1] == 0); - } - else { - assert(head == 0); /* only one node on chain has parent */ - head = u; - assert(u->parent != u); - assert (u->parent->child[0] == u || - u->parent->child[1] == u || - *((tbinptr*)(u->parent)) == u); - if (u->child[0] != 0) { - assert(u->child[0]->parent == u); - assert(u->child[0] != u); - do_check_tree(m, u->child[0]); - } - if (u->child[1] != 0) { - assert(u->child[1]->parent == u); - assert(u->child[1] != u); - do_check_tree(m, u->child[1]); - } - if (u->child[0] != 0 && u->child[1] != 0) { - assert(chunksize(u->child[0]) < chunksize(u->child[1])); - } - } - u = u->fd; - } while (u != t); - assert(head != 0); -} - -/* Check all the chunks in a treebin. */ -static void do_check_treebin(mstate m, bindex_t i) { - tbinptr* tb = treebin_at(m, i); - tchunkptr t = *tb; - int empty = (m->treemap & (1U << i)) == 0; - if (t == 0) - assert(empty); - if (!empty) - do_check_tree(m, t); -} - -/* Check all the chunks in a smallbin. */ -static void do_check_smallbin(mstate m, bindex_t i) { - sbinptr b = smallbin_at(m, i); - mchunkptr p = b->bk; - unsigned int empty = (m->smallmap & (1U << i)) == 0; - if (p == b) - assert(empty); - if (!empty) { - for (; p != b; p = p->bk) { - size_t size = chunksize(p); - mchunkptr q; - /* each chunk claims to be free */ - do_check_free_chunk(m, p); - /* chunk belongs in bin */ - assert(small_index(size) == i); - assert(p->bk == b || chunksize(p->bk) == chunksize(p)); - /* chunk is followed by an inuse chunk */ - q = next_chunk(p); - if (q->head != FENCEPOST_HEAD) - do_check_inuse_chunk(m, q); - } - } -} - -/* Find x in a bin. Used in other check functions. */ -static int bin_find(mstate m, mchunkptr x) { - size_t size = chunksize(x); - if (is_small(size)) { - bindex_t sidx = small_index(size); - sbinptr b = smallbin_at(m, sidx); - if (smallmap_is_marked(m, sidx)) { - mchunkptr p = b; - do { - if (p == x) - return 1; - } while ((p = p->fd) != b); - } - } - else { - bindex_t tidx; - compute_tree_index(size, tidx); - if (treemap_is_marked(m, tidx)) { - tchunkptr t = *treebin_at(m, tidx); - size_t sizebits = size << leftshift_for_tree_index(tidx); - while (t != 0 && chunksize(t) != size) { - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - sizebits <<= 1; - } - if (t != 0) { - tchunkptr u = t; - do { - if (u == (tchunkptr)x) - return 1; - } while ((u = u->fd) != t); - } - } - } - return 0; -} - -/* Traverse each chunk and check it; return total */ -static size_t traverse_and_check(mstate m) { - size_t sum = 0; - if (is_initialized(m)) { - msegmentptr s = &m->seg; - sum += m->topsize + TOP_FOOT_SIZE; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - mchunkptr lastq = 0; - assert(pinuse(q)); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - sum += chunksize(q); - if (cinuse(q)) { - assert(!bin_find(m, q)); - do_check_inuse_chunk(m, q); - } - else { - assert(q == m->dv || bin_find(m, q)); - assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ - do_check_free_chunk(m, q); - } - lastq = q; - q = next_chunk(q); - } - s = s->next; - } - } - return sum; -} - -/* Check all properties of malloc_state. */ -static void do_check_malloc_state(mstate m) { - bindex_t i; - size_t total; - /* check bins */ - for (i = 0; i < NSMALLBINS; ++i) - do_check_smallbin(m, i); - for (i = 0; i < NTREEBINS; ++i) - do_check_treebin(m, i); - - if (m->dvsize != 0) { /* check dv chunk */ - do_check_any_chunk(m, m->dv); - assert(m->dvsize == chunksize(m->dv)); - assert(m->dvsize >= MIN_CHUNK_SIZE); - assert(bin_find(m, m->dv) == 0); - } - - if (m->top != 0) { /* check top chunk */ - do_check_top_chunk(m, m->top); - assert(m->topsize == chunksize(m->top)); - assert(m->topsize > 0); - assert(bin_find(m, m->top) == 0); - } - - total = traverse_and_check(m); - assert(total <= m->footprint); - assert(m->footprint <= m->max_footprint); -} -#endif /* DEBUG */ - -/* ----------------------------- statistics ------------------------------ */ - -#if !NO_MALLINFO -static struct mallinfo internal_mallinfo(mstate m) { - struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - if (!PREACTION(m)) { - check_malloc_state(m); - if (is_initialized(m)) { - size_t nfree = SIZE_T_ONE; /* top always free */ - size_t mfree = m->topsize + TOP_FOOT_SIZE; - size_t sum = mfree; - msegmentptr s = &m->seg; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - size_t sz = chunksize(q); - sum += sz; - if (!cinuse(q)) { - mfree += sz; - ++nfree; - } - q = next_chunk(q); - } - s = s->next; - } - - nm.arena = sum; - nm.ordblks = nfree; - nm.hblkhd = m->footprint - sum; - nm.usmblks = m->max_footprint; - nm.uordblks = m->footprint - mfree; - nm.fordblks = mfree; - nm.keepcost = m->topsize; - } - - POSTACTION(m); - } - return nm; -} -#endif /* !NO_MALLINFO */ - -static void internal_malloc_stats(mstate m) { - if (!PREACTION(m)) { - size_t maxfp = 0; - size_t fp = 0; - size_t used = 0; - check_malloc_state(m); - if (is_initialized(m)) { - msegmentptr s = &m->seg; - maxfp = m->max_footprint; - fp = m->footprint; - used = fp - (m->topsize + TOP_FOOT_SIZE); - - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - if (!cinuse(q)) - used -= chunksize(q); - q = next_chunk(q); - } - s = s->next; - } - } - - fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); - fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); - fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); - - POSTACTION(m); - } -} - -/* ----------------------- Operations on smallbins ----------------------- */ - -/* - Various forms of linking and unlinking are defined as macros. Even - the ones for trees, which are very long but have very short typical - paths. This is ugly but reduces reliance on inlining support of - compilers. -*/ - -/* Link a free chunk into a smallbin */ -#define insert_small_chunk(M, P, S) {\ - bindex_t I = small_index(S);\ - mchunkptr B = smallbin_at(M, I);\ - mchunkptr F = B;\ - assert(S >= MIN_CHUNK_SIZE);\ - if (!smallmap_is_marked(M, I))\ - mark_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, B->fd)))\ - F = B->fd;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - B->fd = P;\ - F->bk = P;\ - P->fd = F;\ - P->bk = B;\ -} - -/* Unlink a chunk from a smallbin */ -#define unlink_small_chunk(M, P, S) {\ - mchunkptr F = P->fd;\ - mchunkptr B = P->bk;\ - bindex_t I = small_index(S);\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (F == B)\ - clear_smallmap(M, I);\ - else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ - (B == smallbin_at(M,I) || ok_address(M, B)))) {\ - F->bk = B;\ - B->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Unlink the first chunk from a smallbin */ -#define unlink_first_small_chunk(M, B, P, I) {\ - mchunkptr F = P->fd;\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (B == F)\ - clear_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, F))) {\ - B->fd = F;\ - F->bk = B;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Replace dv node, binning the old one */ -/* Used only when dvsize known to be small */ -#define replace_dv(M, P, S) {\ - size_t DVS = M->dvsize;\ - if (DVS != 0) {\ - mchunkptr DV = M->dv;\ - assert(is_small(DVS));\ - insert_small_chunk(M, DV, DVS);\ - }\ - M->dvsize = S;\ - M->dv = P;\ -} - -/* ------------------------- Operations on trees ------------------------- */ - -/* Insert chunk into tree */ -#define insert_large_chunk(M, X, S) {\ - tbinptr* H;\ - bindex_t I;\ - compute_tree_index(S, I);\ - H = treebin_at(M, I);\ - X->index = I;\ - X->child[0] = X->child[1] = 0;\ - if (!treemap_is_marked(M, I)) {\ - mark_treemap(M, I);\ - *H = X;\ - X->parent = (tchunkptr)H;\ - X->fd = X->bk = X;\ - }\ - else {\ - tchunkptr T = *H;\ - size_t K = S << leftshift_for_tree_index(I);\ - for (;;) {\ - if (chunksize(T) != S) {\ - tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ - K <<= 1;\ - if (*C != 0)\ - T = *C;\ - else if (RTCHECK(ok_address(M, C))) {\ - *C = X;\ - X->parent = T;\ - X->fd = X->bk = X;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - else {\ - tchunkptr F = T->fd;\ - if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ - T->fd = F->bk = X;\ - X->fd = F;\ - X->bk = T;\ - X->parent = 0;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - }\ - }\ -} - -/* - Unlink steps: - - 1. If x is a chained node, unlink it from its same-sized fd/bk links - and choose its bk node as its replacement. - 2. If x was the last node of its size, but not a leaf node, it must - be replaced with a leaf node (not merely one with an open left or - right), to make sure that lefts and rights of descendants - correspond properly to bit masks. We use the rightmost descendant - of x. We could use any other leaf, but this is easy to locate and - tends to counteract removal of leftmosts elsewhere, and so keeps - paths shorter than minimally guaranteed. This doesn't loop much - because on average a node in a tree is near the bottom. - 3. If x is the base of a chain (i.e., has parent links) relink - x's parent and children to x's replacement (or null if none). -*/ - -#define unlink_large_chunk(M, X) {\ - tchunkptr XP = X->parent;\ - tchunkptr R;\ - if (X->bk != X) {\ - tchunkptr F = X->fd;\ - R = X->bk;\ - if (RTCHECK(ok_address(M, F))) {\ - F->bk = R;\ - R->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else {\ - tchunkptr* RP;\ - if (((R = *(RP = &(X->child[1]))) != 0) ||\ - ((R = *(RP = &(X->child[0]))) != 0)) {\ - tchunkptr* CP;\ - while ((*(CP = &(R->child[1])) != 0) ||\ - (*(CP = &(R->child[0])) != 0)) {\ - R = *(RP = CP);\ - }\ - if (RTCHECK(ok_address(M, RP)))\ - *RP = 0;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - }\ - if (XP != 0) {\ - tbinptr* H = treebin_at(M, X->index);\ - if (X == *H) {\ - if ((*H = R) == 0) \ - clear_treemap(M, X->index);\ - }\ - else if (RTCHECK(ok_address(M, XP))) {\ - if (XP->child[0] == X) \ - XP->child[0] = R;\ - else \ - XP->child[1] = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - if (R != 0) {\ - if (RTCHECK(ok_address(M, R))) {\ - tchunkptr C0, C1;\ - R->parent = XP;\ - if ((C0 = X->child[0]) != 0) {\ - if (RTCHECK(ok_address(M, C0))) {\ - R->child[0] = C0;\ - C0->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - if ((C1 = X->child[1]) != 0) {\ - if (RTCHECK(ok_address(M, C1))) {\ - R->child[1] = C1;\ - C1->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ -} - -/* Relays to large vs small bin operations */ - -#define insert_chunk(M, P, S)\ - if (is_small(S)) insert_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } - -#define unlink_chunk(M, P, S)\ - if (is_small(S)) unlink_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } - - -/* Relays to internal calls to malloc/free from realloc, memalign etc */ - -#if ONLY_MSPACES -#define internal_malloc(m, b) mspace_malloc(m, b) -#define internal_free(m, mem) mspace_free(m,mem); -#else /* ONLY_MSPACES */ -#if MSPACES -#define internal_malloc(m, b)\ - (m == gm)? dlmalloc(b) : mspace_malloc(m, b) -#define internal_free(m, mem)\ - if (m == gm) dlfree(mem); else mspace_free(m,mem); -#else /* MSPACES */ -#define internal_malloc(m, b) dlmalloc(b) -#define internal_free(m, mem) dlfree(mem) -#endif /* MSPACES */ -#endif /* ONLY_MSPACES */ - -/* ----------------------- Direct-mmapping chunks ----------------------- */ - -/* - Directly mmapped chunks are set up with an offset to the start of - the mmapped region stored in the prev_foot field of the chunk. This - allows reconstruction of the required argument to MUNMAP when freed, - and also allows adjustment of the returned chunk to meet alignment - requirements (especially in memalign). There is also enough space - allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain - the PINUSE bit so frees can be checked. -*/ - -/* Malloc using mmap */ -static void* mmap_alloc(mstate m, size_t nb) { - size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - if (mmsize > nb) { /* Check for wrap around 0 */ - char* mm = (char*)(DIRECT_MMAP(mmsize)); - if (mm != CMFAIL) { - size_t offset = align_offset(chunk2mem(mm)); - size_t psize = mmsize - offset - MMAP_FOOT_PAD; - mchunkptr p = (mchunkptr)(mm + offset); - p->prev_foot = offset | IS_MMAPPED_BIT; - (p)->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, p, psize); - chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; - - if (mm < m->least_addr) - m->least_addr = mm; - if ((m->footprint += mmsize) > m->max_footprint) - m->max_footprint = m->footprint; - assert(is_aligned(chunk2mem(p))); - check_mmapped_chunk(m, p); - return chunk2mem(p); - } - } - return 0; -} - -/* Realloc using mmap */ -static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { - size_t oldsize = chunksize(oldp); - if (is_small(nb)) /* Can't shrink mmap regions below small size */ - return 0; - /* Keep old chunk if big enough but not too big */ - if (oldsize >= nb + SIZE_T_SIZE && - (oldsize - nb) <= (mparams.granularity << 1)) - return oldp; - else { - size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; - size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; - size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + - CHUNK_ALIGN_MASK); - char* cp = (char*)CALL_MREMAP((char*)oldp - offset, - oldmmsize, newmmsize, 1); - if (cp != CMFAIL) { - mchunkptr newp = (mchunkptr)(cp + offset); - size_t psize = newmmsize - offset - MMAP_FOOT_PAD; - newp->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, newp, psize); - chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; - - if (cp < m->least_addr) - m->least_addr = cp; - if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) - m->max_footprint = m->footprint; - check_mmapped_chunk(m, newp); - return newp; - } - } - return 0; -} - -/* -------------------------- mspace management -------------------------- */ - -/* Initialize top chunk and its size */ -static void init_top(mstate m, mchunkptr p, size_t psize) { - /* Ensure alignment */ - size_t offset = align_offset(chunk2mem(p)); - p = (mchunkptr)((char*)p + offset); - psize -= offset; - - m->top = p; - m->topsize = psize; - p->head = psize | PINUSE_BIT; - /* set size of fake trailing chunk holding overhead space only once */ - chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; - m->trim_check = mparams.trim_threshold; /* reset on each update */ -} - -/* Initialize bins for a new mstate that is otherwise zeroed out */ -static void init_bins(mstate m) { - /* Establish circular links for smallbins */ - bindex_t i; - for (i = 0; i < NSMALLBINS; ++i) { - sbinptr bin = smallbin_at(m,i); - bin->fd = bin->bk = bin; - } -} - -#if PROCEED_ON_ERROR - -/* default corruption action */ -static void reset_on_error(mstate m) { - int i; - ++malloc_corruption_error_count; - /* Reinitialize fields to forget about all memory */ - m->smallbins = m->treebins = 0; - m->dvsize = m->topsize = 0; - m->seg.base = 0; - m->seg.size = 0; - m->seg.next = 0; - m->top = m->dv = 0; - for (i = 0; i < NTREEBINS; ++i) - *treebin_at(m, i) = 0; - init_bins(m); -} -#endif /* PROCEED_ON_ERROR */ - -/* Allocate chunk and prepend remainder with chunk in successor base. */ -static void* prepend_alloc(mstate m, char* newbase, char* oldbase, - size_t nb) { - mchunkptr p = align_as_chunk(newbase); - mchunkptr oldfirst = align_as_chunk(oldbase); - size_t psize = (char*)oldfirst - (char*)p; - mchunkptr q = chunk_plus_offset(p, nb); - size_t qsize = psize - nb; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - - assert((char*)oldfirst > (char*)q); - assert(pinuse(oldfirst)); - assert(qsize >= MIN_CHUNK_SIZE); - - /* consolidate remainder with first chunk of old base */ - if (oldfirst == m->top) { - size_t tsize = m->topsize += qsize; - m->top = q; - q->head = tsize | PINUSE_BIT; - check_top_chunk(m, q); - } - else if (oldfirst == m->dv) { - size_t dsize = m->dvsize += qsize; - m->dv = q; - set_size_and_pinuse_of_free_chunk(q, dsize); - } - else { - if (!cinuse(oldfirst)) { - size_t nsize = chunksize(oldfirst); - unlink_chunk(m, oldfirst, nsize); - oldfirst = chunk_plus_offset(oldfirst, nsize); - qsize += nsize; - } - set_free_with_pinuse(q, qsize, oldfirst); - insert_chunk(m, q, qsize); - check_free_chunk(m, q); - } - - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); -} - - -/* Add a segment to hold a new noncontiguous region */ -static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { - /* Determine locations and sizes of segment, fenceposts, old top */ - char* old_top = (char*)m->top; - msegmentptr oldsp = segment_holding(m, old_top); - char* old_end = oldsp->base + oldsp->size; - size_t ssize = pad_request(sizeof(struct malloc_segment)); - char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - size_t offset = align_offset(chunk2mem(rawsp)); - char* asp = rawsp + offset; - char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; - mchunkptr sp = (mchunkptr)csp; - msegmentptr ss = (msegmentptr)(chunk2mem(sp)); - mchunkptr tnext = chunk_plus_offset(sp, ssize); - mchunkptr p = tnext; - int nfences = 0; - - /* reset top to new space */ - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - - /* Set up segment record */ - assert(is_aligned(ss)); - set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); - *ss = m->seg; /* Push current record */ - m->seg.base = tbase; - m->seg.size = tsize; - (void)set_segment_flags(&m->seg, mmapped); - m->seg.next = ss; - - /* Insert trailing fenceposts */ - for (;;) { - mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); - p->head = FENCEPOST_HEAD; - ++nfences; - if ((char*)(&(nextp->head)) < old_end) - p = nextp; - else - break; - } - assert(nfences >= 2); - - /* Insert the rest of old top into a bin as an ordinary free chunk */ - if (csp != old_top) { - mchunkptr q = (mchunkptr)old_top; - size_t psize = csp - old_top; - mchunkptr tn = chunk_plus_offset(q, psize); - set_free_with_pinuse(q, psize, tn); - insert_chunk(m, q, psize); - } - - check_top_chunk(m, m->top); -} - -/* -------------------------- System allocation -------------------------- */ - -/* Get memory from system using MORECORE or MMAP */ -static void* sys_alloc(mstate m, size_t nb) { - char* tbase = CMFAIL; - size_t tsize = 0; - flag_t mmap_flag = 0; - - init_mparams(); - - /* Directly map large chunks */ - if (use_mmap(m) && nb >= mparams.mmap_threshold) { - void* mem = mmap_alloc(m, nb); - if (mem != 0) - return mem; - } - - /* - Try getting memory in any of three ways (in most-preferred to - least-preferred order): - 1. A call to MORECORE that can normally contiguously extend memory. - (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or - or main space is mmapped or a previous contiguous call failed) - 2. A call to MMAP new space (disabled if not HAVE_MMAP). - Note that under the default settings, if MORECORE is unable to - fulfill a request, and HAVE_MMAP is true, then mmap is - used as a noncontiguous system allocator. This is a useful backup - strategy for systems with holes in address spaces -- in this case - sbrk cannot contiguously expand the heap, but mmap may be able to - find space. - 3. A call to MORECORE that cannot usually contiguously extend memory. - (disabled if not HAVE_MORECORE) - */ - - if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { - char* br = CMFAIL; - msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); - size_t asize = 0; - ACQUIRE_MORECORE_LOCK(); - - if (ss == 0) { /* First time through or recovery */ - char* base = (char*)CALL_MORECORE(0); - if (base != CMFAIL) { - asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Adjust to end on a page boundary */ - if (!is_page_aligned(base)) - asize += (page_align((size_t)base) - (size_t)base); - /* Can't call MORECORE if size is negative when treated as signed */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == base) { - tbase = base; - tsize = asize; - } - } - } - else { - /* Subtract out existing available top space from MORECORE request. */ - asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Use mem here only if it did continuously extend old space */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { - tbase = br; - tsize = asize; - } - } - - if (tbase == CMFAIL) { /* Cope with partial failure */ - if (br != CMFAIL) { /* Try to use/extend the space we did get */ - if (asize < HALF_MAX_SIZE_T && - asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { - size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); - if (esize < HALF_MAX_SIZE_T) { - char* end = (char*)CALL_MORECORE(esize); - if (end != CMFAIL) - asize += esize; - else { /* Can't use; try to release */ - (void)CALL_MORECORE(-asize); - br = CMFAIL; - } - } - } - } - if (br != CMFAIL) { /* Use the space we did get */ - tbase = br; - tsize = asize; - } - else - disable_contiguous(m); /* Don't try contiguous path in the future */ - } - - RELEASE_MORECORE_LOCK(); - } - - if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ - size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; - size_t rsize = granularity_align(req); - if (rsize > nb) { /* Fail if wraps around zero */ - char* mp = (char*)(CALL_MMAP(rsize)); - if (mp != CMFAIL) { - tbase = mp; - tsize = rsize; - mmap_flag = IS_MMAPPED_BIT; - } - } - } - - if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ - size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - if (asize < HALF_MAX_SIZE_T) { - char* br = CMFAIL; - char* end = CMFAIL; - ACQUIRE_MORECORE_LOCK(); - br = (char*)(CALL_MORECORE(asize)); - end = (char*)(CALL_MORECORE(0)); - RELEASE_MORECORE_LOCK(); - if (br != CMFAIL && end != CMFAIL && br < end) { - size_t ssize = end - br; - if (ssize > nb + TOP_FOOT_SIZE) { - tbase = br; - tsize = ssize; - } - } - } - } - - if (tbase != CMFAIL) { - - if ((m->footprint += tsize) > m->max_footprint) - m->max_footprint = m->footprint; - - if (!is_initialized(m)) { /* first-time initialization */ - m->seg.base = m->least_addr = tbase; - m->seg.size = tsize; - (void)set_segment_flags(&m->seg, mmap_flag); - m->magic = mparams.magic; - init_bins(m); - if (is_global(m)) - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - else { - /* Offset top by embedded malloc_state */ - mchunkptr mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); - } - } - - else { - /* Try to merge with an existing segment */ - msegmentptr sp = &m->seg; - while (sp != 0 && tbase != sp->base + sp->size) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - check_segment_merge(sp, tbase, tsize) && - (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && - segment_holds(sp, m->top)) { /* append */ - sp->size += tsize; - init_top(m, m->top, m->topsize + tsize); - } - else { - if (tbase < m->least_addr) - m->least_addr = tbase; - sp = &m->seg; - while (sp != 0 && sp->base != tbase + tsize) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - check_segment_merge(sp, tbase, tsize) && - (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { - char* oldbase = sp->base; - sp->base = tbase; - sp->size += tsize; - return prepend_alloc(m, tbase, oldbase, nb); - } - else - add_segment(m, tbase, tsize, mmap_flag); - } - } - - if (nb < m->topsize) { /* Allocate from new or extended top space */ - size_t rsize = m->topsize -= nb; - mchunkptr p = m->top; - mchunkptr r = m->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - check_top_chunk(m, m->top); - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); - } - } - - MALLOC_FAILURE_ACTION; - return 0; -} - -/* ----------------------- system deallocation -------------------------- */ - -/* Unmap and unlink any mmapped segments that don't contain used chunks */ -static size_t release_unused_segments(mstate m) { - size_t released = 0; - msegmentptr pred = &m->seg; - msegmentptr sp = pred->next; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - msegmentptr next = sp->next; - if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { - mchunkptr p = align_as_chunk(base); - size_t psize = chunksize(p); - /* Can unmap if first chunk holds entire segment and not pinned */ - if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { - tchunkptr tp = (tchunkptr)p; - assert(segment_holds(sp, (char*)sp)); - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } - else { - unlink_large_chunk(m, tp); - } - if (CALL_MUNMAP(base, size) == 0) { - released += size; - m->footprint -= size; - /* unlink obsoleted record */ - sp = pred; - sp->next = next; - } - else { /* back out if cannot unmap */ - insert_large_chunk(m, tp, psize); - } - } - } - pred = sp; - sp = next; - } - return released; -} - -static int sys_trim(mstate m, size_t pad) { - size_t released = 0; - if (pad < MAX_REQUEST && is_initialized(m)) { - pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ - - if (m->topsize > pad) { - /* Shrink top space in granularity-size units, keeping at least one */ - size_t unit = mparams.granularity; - size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - - SIZE_T_ONE) * unit; - msegmentptr sp = segment_holding(m, (char*)m->top); - - if (!is_extern_segment(sp)) { - if (is_mmapped_segment(sp)) { - if (HAVE_MMAP && - sp->size >= extra && - !has_segment_link(m, sp)) { /* can't shrink if pinned */ - size_t newsize = sp->size - extra; - /* Prefer mremap, fall back to munmap */ - if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || - (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { - released = extra; - } - } - } - else if (HAVE_MORECORE) { - if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ - extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; - ACQUIRE_MORECORE_LOCK(); - { - /* Make sure end of memory is where we last set it. */ - char* old_br = (char*)(CALL_MORECORE(0)); - if (old_br == sp->base + sp->size) { - char* rel_br = (char*)(CALL_MORECORE(-extra)); - char* new_br = (char*)(CALL_MORECORE(0)); - if (rel_br != CMFAIL && new_br < old_br) - released = old_br - new_br; - } - } - RELEASE_MORECORE_LOCK(); - } - } - - if (released != 0) { - sp->size -= released; - m->footprint -= released; - init_top(m, m->top, m->topsize - released); - check_top_chunk(m, m->top); - } - } - - /* Unmap any unused mmapped segments */ - if (HAVE_MMAP) - released += release_unused_segments(m); - - /* On failure, disable autotrim to avoid repeated failed future calls */ - if (released == 0) - m->trim_check = MAX_SIZE_T; - } - - return (released != 0)? 1 : 0; -} - -/* ---------------------------- malloc support --------------------------- */ - -/* allocate a large request from the best fitting chunk in a treebin */ -static void* tmalloc_large(mstate m, size_t nb) { - tchunkptr v = 0; - size_t rsize = -nb; /* Unsigned negation */ - tchunkptr t; - bindex_t idx; - compute_tree_index(nb, idx); - - if ((t = *treebin_at(m, idx)) != 0) { - /* Traverse tree for this bin looking for node with size == nb */ - size_t sizebits = nb << leftshift_for_tree_index(idx); - tchunkptr rst = 0; /* The deepest untaken right subtree */ - for (;;) { - tchunkptr rt; - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - v = t; - if ((rsize = trem) == 0) - break; - } - rt = t->child[1]; - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - if (rt != 0 && rt != t) - rst = rt; - if (t == 0) { - t = rst; /* set t to least subtree holding sizes > nb */ - break; - } - sizebits <<= 1; - } - } - - if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ - binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; - if (leftbits != 0) { - bindex_t i; - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - t = *treebin_at(m, i); - } - } - - while (t != 0) { /* find smallest of tree or subtree */ - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - t = leftmost_child(t); - } - - /* If dv is a better fit, return 0 so malloc will use it */ - if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { - if (RTCHECK(ok_address(m, v))) { /* split */ - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - insert_chunk(m, r, rsize); - } - return chunk2mem(v); - } - } - CORRUPTION_ERROR_ACTION(m); - } - return 0; -} - -/* allocate a small request from the best fitting chunk in a treebin */ -static void* tmalloc_small(mstate m, size_t nb) { - tchunkptr t, v; - size_t rsize; - bindex_t i; - binmap_t leastbit = least_bit(m->treemap); - compute_bit2idx(leastbit, i); - - v = t = *treebin_at(m, i); - rsize = chunksize(t) - nb; - - while ((t = leftmost_child(t)) != 0) { - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - } - - if (RTCHECK(ok_address(m, v))) { - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(m, r, rsize); - } - return chunk2mem(v); - } - } - - CORRUPTION_ERROR_ACTION(m); - return 0; -} - -/* --------------------------- realloc support --------------------------- */ - -static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { - if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - return 0; - } - if (!PREACTION(m)) { - mchunkptr oldp = mem2chunk(oldmem); - size_t oldsize = chunksize(oldp); - mchunkptr next = chunk_plus_offset(oldp, oldsize); - mchunkptr newp = 0; - void* extra = 0; - - /* Try to either shrink or extend into top. Else malloc-copy-free */ - - if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && - ok_next(oldp, next) && ok_pinuse(next))) { - size_t nb = request2size(bytes); - if (is_mmapped(oldp)) - newp = mmap_resize(m, oldp, nb); - else if (oldsize >= nb) { /* already big enough */ - size_t rsize = oldsize - nb; - newp = oldp; - if (rsize >= MIN_CHUNK_SIZE) { - mchunkptr remainder = chunk_plus_offset(newp, nb); - set_inuse(m, newp, nb); - set_inuse(m, remainder, rsize); - extra = chunk2mem(remainder); - } - } - else if (next == m->top && oldsize + m->topsize > nb) { - /* Expand into top */ - size_t newsize = oldsize + m->topsize; - size_t newtopsize = newsize - nb; - mchunkptr newtop = chunk_plus_offset(oldp, nb); - set_inuse(m, oldp, nb); - newtop->head = newtopsize |PINUSE_BIT; - m->top = newtop; - m->topsize = newtopsize; - newp = oldp; - } - } - else { - USAGE_ERROR_ACTION(m, oldmem); - POSTACTION(m); - return 0; - } - - POSTACTION(m); - - if (newp != 0) { - if (extra != 0) { - internal_free(m, extra); - } - check_inuse_chunk(m, newp); - return chunk2mem(newp); - } - else { - void* newmem = internal_malloc(m, bytes); - if (newmem != 0) { - size_t oc = oldsize - overhead_for(oldp); - memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); - internal_free(m, oldmem); - } - return newmem; - } - } - return 0; -} - -/* --------------------------- memalign support -------------------------- */ - -static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { - if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ - return internal_malloc(m, bytes); - if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ - alignment = MIN_CHUNK_SIZE; - if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ - size_t a = MALLOC_ALIGNMENT << 1; - while (a < alignment) a <<= 1; - alignment = a; - } - - if (bytes >= MAX_REQUEST - alignment) { - if (m != 0) { /* Test isn't needed but avoids compiler warning */ - MALLOC_FAILURE_ACTION; - } - } - else { - size_t nb = request2size(bytes); - size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; - char* mem = (char*)internal_malloc(m, req); - if (mem != 0) { - void* leader = 0; - void* trailer = 0; - mchunkptr p = mem2chunk(mem); - - if (PREACTION(m)) return 0; - if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ - /* - Find an aligned spot inside chunk. Since we need to give - back leading space in a chunk of at least MIN_CHUNK_SIZE, if - the first calculation places us at a spot with less than - MIN_CHUNK_SIZE leader, we can move to the next aligned spot. - We've allocated enough total room so that this is always - possible. - */ - char* br = (char*)mem2chunk((size_t)(((size_t)(mem + - alignment - - SIZE_T_ONE)) & - -alignment)); - char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? - br : br+alignment; - mchunkptr newp = (mchunkptr)pos; - size_t leadsize = pos - (char*)(p); - size_t newsize = chunksize(p) - leadsize; - - if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ - newp->prev_foot = p->prev_foot + leadsize; - newp->head = (newsize|CINUSE_BIT); - } - else { /* Otherwise, give back leader, use the rest */ - set_inuse(m, newp, newsize); - set_inuse(m, p, leadsize); - leader = chunk2mem(p); - } - p = newp; - } - - /* Give back spare room at the end */ - if (!is_mmapped(p)) { - size_t size = chunksize(p); - if (size > nb + MIN_CHUNK_SIZE) { - size_t remainder_size = size - nb; - mchunkptr remainder = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, remainder, remainder_size); - trailer = chunk2mem(remainder); - } - } - - assert (chunksize(p) >= nb); - assert((((size_t)(chunk2mem(p))) % alignment) == 0); - check_inuse_chunk(m, p); - POSTACTION(m); - if (leader != 0) { - internal_free(m, leader); - } - if (trailer != 0) { - internal_free(m, trailer); - } - return chunk2mem(p); - } - } - return 0; -} - -/* ------------------------ comalloc/coalloc support --------------------- */ - -static void** ialloc(mstate m, - size_t n_elements, - size_t* sizes, - int opts, - void* chunks[]) { - /* - This provides common support for independent_X routines, handling - all of the combinations that can result. - - The opts arg has: - bit 0 set if all elements are same size (using sizes[0]) - bit 1 set if elements should be zeroed - */ - - size_t element_size; /* chunksize of each element, if all same */ - size_t contents_size; /* total size of elements */ - size_t array_size; /* request size of pointer array */ - void* mem; /* malloced aggregate space */ - mchunkptr p; /* corresponding chunk */ - size_t remainder_size; /* remaining bytes while splitting */ - void** marray; /* either "chunks" or malloced ptr array */ - mchunkptr array_chunk; /* chunk for malloced ptr array */ - flag_t was_enabled; /* to disable mmap */ - size_t size; - size_t i; - - /* compute array length, if needed */ - if (chunks != 0) { - if (n_elements == 0) - return chunks; /* nothing to do */ - marray = chunks; - array_size = 0; - } - else { - /* if empty req, must still return chunk representing empty array */ - if (n_elements == 0) - return (void**)internal_malloc(m, 0); - marray = 0; - array_size = request2size(n_elements * (sizeof(void*))); - } - - /* compute total element size */ - if (opts & 0x1) { /* all-same-size */ - element_size = request2size(*sizes); - contents_size = n_elements * element_size; - } - else { /* add up all the sizes */ - element_size = 0; - contents_size = 0; - for (i = 0; i != n_elements; ++i) - contents_size += request2size(sizes[i]); - } - - size = contents_size + array_size; - - /* - Allocate the aggregate chunk. First disable direct-mmapping so - malloc won't use it, since we would not be able to later - free/realloc space internal to a segregated mmap region. - */ - was_enabled = use_mmap(m); - disable_mmap(m); - mem = internal_malloc(m, size - CHUNK_OVERHEAD); - if (was_enabled) - enable_mmap(m); - if (mem == 0) - return 0; - - if (PREACTION(m)) return 0; - p = mem2chunk(mem); - remainder_size = chunksize(p); - - assert(!is_mmapped(p)); - - if (opts & 0x2) { /* optionally clear the elements */ - memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); - } - - /* If not provided, allocate the pointer array as final part of chunk */ - if (marray == 0) { - size_t array_chunk_size; - array_chunk = chunk_plus_offset(p, contents_size); - array_chunk_size = remainder_size - contents_size; - marray = (void**) (chunk2mem(array_chunk)); - set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); - remainder_size = contents_size; - } - - /* split out elements */ - for (i = 0; ; ++i) { - marray[i] = chunk2mem(p); - if (i != n_elements-1) { - if (element_size != 0) - size = element_size; - else - size = request2size(sizes[i]); - remainder_size -= size; - set_size_and_pinuse_of_inuse_chunk(m, p, size); - p = chunk_plus_offset(p, size); - } - else { /* the final element absorbs any overallocation slop */ - set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); - break; - } - } - -#if DEBUG - if (marray != chunks) { - /* final element must have exactly exhausted chunk */ - if (element_size != 0) { - assert(remainder_size == element_size); - } - else { - assert(remainder_size == request2size(sizes[i])); - } - check_inuse_chunk(m, mem2chunk(marray)); - } - for (i = 0; i != n_elements; ++i) - check_inuse_chunk(m, mem2chunk(marray[i])); - -#endif /* DEBUG */ - - POSTACTION(m); - return marray; -} - - -/* -------------------------- public routines ---------------------------- */ - -#if !ONLY_MSPACES - -void* dlmalloc(size_t bytes) { - /* - Basic algorithm: - If a small request (< 256 bytes minus per-chunk overhead): - 1. If one exists, use a remainderless chunk in associated smallbin. - (Remainderless means that there are too few excess bytes to - represent as a chunk.) - 2. If it is big enough, use the dv chunk, which is normally the - chunk adjacent to the one used for the most recent small request. - 3. If one exists, split the smallest available chunk in a bin, - saving remainder in dv. - 4. If it is big enough, use the top chunk. - 5. If available, get memory from system and use it - Otherwise, for a large request: - 1. Find the smallest available binned chunk that fits, and use it - if it is better fitting than dv chunk, splitting if necessary. - 2. If better fitting than any binned chunk, use the dv chunk. - 3. If it is big enough, use the top chunk. - 4. If request size >= mmap threshold, try to directly mmap this chunk. - 5. If available, get memory from system and use it - - The ugly goto's here ensure that postaction occurs along all paths. - */ - - if (!PREACTION(gm)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = gm->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(gm, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(gm, b, p, idx); - set_inuse_and_pinuse(gm, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb > gm->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(gm, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(gm, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(gm, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(gm, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - - if (nb <= gm->dvsize) { - size_t rsize = gm->dvsize - nb; - mchunkptr p = gm->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = gm->dv = chunk_plus_offset(p, nb); - gm->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - } - else { /* exhaust dv */ - size_t dvs = gm->dvsize; - gm->dvsize = 0; - gm->dv = 0; - set_inuse_and_pinuse(gm, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb < gm->topsize) { /* Split top */ - size_t rsize = gm->topsize -= nb; - mchunkptr p = gm->top; - mchunkptr r = gm->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - mem = chunk2mem(p); - check_top_chunk(gm, gm->top); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - mem = sys_alloc(gm, nb); - - postaction: - POSTACTION(gm); - return mem; - } - - return 0; -} - -void dlfree(void* mem) { - /* - Consolidate freed chunks with preceding or succeeding bordering - free chunks, if they exist, and then place in a bin. Intermixed - with special cases for top, dv, mmapped chunks, and usage errors. - */ - - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } -#else /* FOOTERS */ -#define fm gm -#endif /* FOOTERS */ - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -#if !FOOTERS -#undef fm -#endif /* FOOTERS */ -} - -void* dlcalloc(size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = dlmalloc(req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* dlrealloc(void* oldmem, size_t bytes) { - if (oldmem == 0) - return dlmalloc(bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - dlfree(oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if ! FOOTERS - mstate m = gm; -#else /* FOOTERS */ - mstate m = get_mstate_for(mem2chunk(oldmem)); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - return internal_realloc(m, oldmem, bytes); - } -} - -void* dlmemalign(size_t alignment, size_t bytes) { - return internal_memalign(gm, alignment, bytes); -} - -void** dlindependent_calloc(size_t n_elements, size_t elem_size, - void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - return ialloc(gm, n_elements, &sz, 3, chunks); -} - -void** dlindependent_comalloc(size_t n_elements, size_t sizes[], - void* chunks[]) { - return ialloc(gm, n_elements, sizes, 0, chunks); -} - -void* dlvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, bytes); -} - -void* dlpvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); -} - -int dlmalloc_trim(size_t pad) { - int result = 0; - if (!PREACTION(gm)) { - result = sys_trim(gm, pad); - POSTACTION(gm); - } - return result; -} - -size_t dlmalloc_footprint(void) { - return gm->footprint; -} - -size_t dlmalloc_max_footprint(void) { - return gm->max_footprint; -} - -#if !NO_MALLINFO -struct mallinfo dlmallinfo(void) { - return internal_mallinfo(gm); -} -#endif /* NO_MALLINFO */ - -void dlmalloc_stats() { - internal_malloc_stats(gm); -} - -size_t dlmalloc_usable_size(void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (cinuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; -} - -int dlmallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* !ONLY_MSPACES */ - -/* ----------------------------- user mspaces ---------------------------- */ - -#if MSPACES - -static mstate init_user_mstate(char* tbase, size_t tsize) { - size_t msize = pad_request(sizeof(struct malloc_state)); - mchunkptr mn; - mchunkptr msp = align_as_chunk(tbase); - mstate m = (mstate)(chunk2mem(msp)); - memset(m, 0, msize); - INITIAL_LOCK(&m->mutex); - msp->head = (msize|PINUSE_BIT|CINUSE_BIT); - m->seg.base = m->least_addr = tbase; - m->seg.size = m->footprint = m->max_footprint = tsize; - m->magic = mparams.magic; - m->mflags = mparams.default_mflags; - disable_contiguous(m); - init_bins(m); - mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); - check_top_chunk(m, m->top); - return m; -} - -mspace create_mspace(size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - size_t rs = ((capacity == 0)? mparams.granularity : - (capacity + TOP_FOOT_SIZE + msize)); - size_t tsize = granularity_align(rs); - char* tbase = (char*)(CALL_MMAP(tsize)); - if (tbase != CMFAIL) { - m = init_user_mstate(tbase, tsize); - (void)set_segment_flags(&m->seg, IS_MMAPPED_BIT); - set_lock(m, locked); - } - } - return (mspace)m; -} - -mspace create_mspace_with_base(void* base, size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity > msize + TOP_FOOT_SIZE && - capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - m = init_user_mstate((char*)base, capacity); - (void)set_segment_flags(&m->seg, EXTERN_BIT); - set_lock(m, locked); - } - return (mspace)m; -} - -size_t destroy_mspace(mspace msp) { - size_t freed = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - msegmentptr sp = &ms->seg; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - flag_t flag = get_segment_flags(sp); - sp = sp->next; - if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && - CALL_MUNMAP(base, size) == 0) - freed += size; - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return freed; -} - -/* - mspace versions of routines are near-clones of the global - versions. This is not so nice but better than the alternatives. -*/ - - -void* mspace_malloc(mspace msp, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (!PREACTION(ms)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = ms->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(ms, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(ms, b, p, idx); - set_inuse_and_pinuse(ms, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb > ms->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(ms, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(ms, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(ms, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(ms, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - - if (nb <= ms->dvsize) { - size_t rsize = ms->dvsize - nb; - mchunkptr p = ms->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = ms->dv = chunk_plus_offset(p, nb); - ms->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - } - else { /* exhaust dv */ - size_t dvs = ms->dvsize; - ms->dvsize = 0; - ms->dv = 0; - set_inuse_and_pinuse(ms, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb < ms->topsize) { /* Split top */ - size_t rsize = ms->topsize -= nb; - mchunkptr p = ms->top; - mchunkptr r = ms->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - mem = chunk2mem(p); - check_top_chunk(ms, ms->top); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - mem = sys_alloc(ms, nb); - - postaction: - POSTACTION(ms); - return mem; - } - - return 0; -} - -void mspace_free(mspace msp, void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); -#else /* FOOTERS */ - mstate fm = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -} - -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = internal_malloc(ms, req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { - if (oldmem == 0) - return mspace_malloc(msp, bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - mspace_free(msp, oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if FOOTERS - mchunkptr p = mem2chunk(oldmem); - mstate ms = get_mstate_for(p); -#else /* FOOTERS */ - mstate ms = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_realloc(ms, oldmem, bytes); - } -} - -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_memalign(ms, alignment, bytes); -} - -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, &sz, 3, chunks); -} - -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, sizes, 0, chunks); -} - -int mspace_trim(mspace msp, size_t pad) { - int result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (!PREACTION(ms)) { - result = sys_trim(ms, pad); - POSTACTION(ms); - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -void mspace_malloc_stats(mspace msp) { - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - internal_malloc_stats(ms); - } - else { - USAGE_ERROR_ACTION(ms,ms); - } -} - -size_t mspace_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -size_t mspace_max_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->max_footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -#if !NO_MALLINFO -struct mallinfo mspace_mallinfo(mspace msp) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - } - return internal_mallinfo(ms); -} -#endif /* NO_MALLINFO */ - -int mspace_mallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* MSPACES */ - -/* -------------------- Alternative MORECORE functions ------------------- */ - -/* - Guidelines for creating a custom version of MORECORE: - - * For best performance, MORECORE should allocate in multiples of pagesize. - * MORECORE may allocate more memory than requested. (Or even less, - but this will usually result in a malloc failure.) - * MORECORE must not allocate memory when given argument zero, but - instead return one past the end address of memory from previous - nonzero call. - * For best performance, consecutive calls to MORECORE with positive - arguments should return increasing addresses, indicating that - space has been contiguously extended. - * Even though consecutive calls to MORECORE need not return contiguous - addresses, it must be OK for malloc'ed chunks to span multiple - regions in those cases where they do happen to be contiguous. - * MORECORE need not handle negative arguments -- it may instead - just return MFAIL when given negative arguments. - Negative arguments are always multiples of pagesize. MORECORE - must not misinterpret negative args as large positive unsigned - args. You can suppress all such calls from even occurring by defining - MORECORE_CANNOT_TRIM, - - As an example alternative MORECORE, here is a custom allocator - kindly contributed for pre-OSX macOS. It uses virtually but not - necessarily physically contiguous non-paged memory (locked in, - present and won't get swapped out). You can use it by uncommenting - this section, adding some #includes, and setting up the appropriate - defines above: - - #define MORECORE osMoreCore - - There is also a shutdown routine that should somehow be called for - cleanup upon program exit. - - #define MAX_POOL_ENTRIES 100 - #define MINIMUM_MORECORE_SIZE (64 * 1024U) - static int next_os_pool; - void *our_os_pools[MAX_POOL_ENTRIES]; - - void *osMoreCore(int size) - { - void *ptr = 0; - static void *sbrk_top = 0; - - if (size > 0) - { - if (size < MINIMUM_MORECORE_SIZE) - size = MINIMUM_MORECORE_SIZE; - if (CurrentExecutionLevel() == kTaskLevel) - ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); - if (ptr == 0) - { - return (void *) MFAIL; - } - // save ptrs so they can be freed during cleanup - our_os_pools[next_os_pool] = ptr; - next_os_pool++; - ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); - sbrk_top = (char *) ptr + size; - return ptr; - } - else if (size < 0) - { - // we don't currently support shrink behavior - return (void *) MFAIL; - } - else - { - return sbrk_top; - } - } - - // cleanup any allocated memory pools - // called as last thing before shutting down driver - - void osCleanupMem(void) - { - void **ptr; - - for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) - if (*ptr) - { - PoolDeallocate(*ptr); - *ptr = 0; - } - } - -*/ - - -/* ----------------------------------------------------------------------- -History: - V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) - * Add max_footprint functions - * Ensure all appropriate literals are size_t - * Fix conditional compilation problem for some #define settings - * Avoid concatenating segments with the one provided - in create_mspace_with_base - * Rename some variables to avoid compiler shadowing warnings - * Use explicit lock initialization. - * Better handling of sbrk interference. - * Simplify and fix segment insertion, trimming and mspace_destroy - * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x - * Thanks especially to Dennis Flanagan for help on these. - - V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) - * Fix memalign brace error. - - V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) - * Fix improper #endif nesting in C++ - * Add explicit casts needed for C++ - - V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) - * Use trees for large bins - * Support mspaces - * Use segments to unify sbrk-based and mmap-based system allocation, - removing need for emulation on most platforms without sbrk. - * Default safety checks - * Optional footer checks. Thanks to William Robertson for the idea. - * Internal code refactoring - * Incorporate suggestions and platform-specific changes. - Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, - Aaron Bachmann, Emery Berger, and others. - * Speed up non-fastbin processing enough to remove fastbins. - * Remove useless cfree() to avoid conflicts with other apps. - * Remove internal memcpy, memset. Compilers handle builtins better. - * Remove some options that no one ever used and rename others. - - V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) - * Fix malloc_state bitmap array misdeclaration - - V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) - * Allow tuning of FIRST_SORTED_BIN_SIZE - * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. - * Better detection and support for non-contiguousness of MORECORE. - Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger - * Bypass most of malloc if no frees. Thanks To Emery Berger. - * Fix freeing of old top non-contiguous chunk im sysmalloc. - * Raised default trim and map thresholds to 256K. - * Fix mmap-related #defines. Thanks to Lubos Lunak. - * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. - * Branch-free bin calculation - * Default trim and mmap thresholds now 256K. - - V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) - * Introduce independent_comalloc and independent_calloc. - Thanks to Michael Pachos for motivation and help. - * Make optional .h file available - * Allow > 2GB requests on 32bit systems. - * new WIN32 sbrk, mmap, munmap, lock code from . - Thanks also to Andreas Mueller , - and Anonymous. - * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for - helping test this.) - * memalign: check alignment arg - * realloc: don't try to shift chunks backwards, since this - leads to more fragmentation in some programs and doesn't - seem to help in any others. - * Collect all cases in malloc requiring system memory into sysmalloc - * Use mmap as backup to sbrk - * Place all internal state in malloc_state - * Introduce fastbins (although similar to 2.5.1) - * Many minor tunings and cosmetic improvements - * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK - * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS - Thanks to Tony E. Bennett and others. - * Include errno.h to support default failure action. - - V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) - * return null for negative arguments - * Added Several WIN32 cleanups from Martin C. Fong - * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' - (e.g. WIN32 platforms) - * Cleanup header file inclusion for WIN32 platforms - * Cleanup code to avoid Microsoft Visual C++ compiler complaints - * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing - memory allocation routines - * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) - * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to - usage of 'assert' in non-WIN32 code - * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to - avoid infinite loop - * Always call 'fREe()' rather than 'free()' - - V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) - * Fixed ordering problem with boundary-stamping - - V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) - * Added pvalloc, as recommended by H.J. Liu - * Added 64bit pointer support mainly from Wolfram Gloger - * Added anonymously donated WIN32 sbrk emulation - * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen - * malloc_extend_top: fix mask error that caused wastage after - foreign sbrks - * Add linux mremap support code from HJ Liu - - V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) - * Integrated most documentation with the code. - * Add support for mmap, with help from - Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Use last_remainder in more cases. - * Pack bins using idea from colin@nyx10.cs.du.edu - * Use ordered bins instead of best-fit threshold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occurring when initial sbrk_base not word-aligned. - * Rely on page size for units instead of SBRK_UNIT to - avoid surprises about sbrk alignment conventions. - * Add mallinfo, mallopt. Thanks to Raymond Nijssen - (raymond@es.ele.tue.nl) for the suggestion. - * Add `pad' argument to malloc_trim and top_pad mallopt parameter. - * More precautions for cases where other routines call sbrk, - courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Added macros etc., allowing use in linux libc from - H.J. Lu (hjl@gnu.ai.mit.edu) - * Inverted this history list - - V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) - * Re-tuned and fixed to behave more nicely with V2.6.0 changes. - * Removed all preallocation code since under current scheme - the work required to undo bad preallocations exceeds - the work saved in good cases for most test programs. - * No longer use return list or unconsolidated bins since - no scheme using them consistently outperforms those that don't - given above changes. - * Use best fit for very large chunks to prevent some worst-cases. - * Added some support for debugging - - V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) - * Removed footers when chunks are in use. Thanks to - Paul Wilson (wilson@cs.texas.edu) for the suggestion. - - V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) - * Added malloc_trim, with help from Wolfram Gloger - (wmglo@Dent.MED.Uni-Muenchen.DE). - - V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) - - V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) - * realloc: try to expand in both directions - * malloc: swap order of clean-bin strategy; - * realloc: only conditionally expand backwards - * Try not to scavenge used bins - * Use bin counts as a guide to preallocation - * Occasionally bin return list chunks in first scan - * Add a few optimizations from colin@nyx10.cs.du.edu - - V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) - * faster bin computation & slightly different binning - * merged all consolidations to one part of malloc proper - (eliminating old malloc_find_space & malloc_clean_bin) - * Scan 2 returns chunks (not just 1) - * Propagate failure in realloc if malloc returns 0 - * Add stuff to allow compilation on non-ANSI compilers - from kpv@research.att.com - - V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) - * removed potential for odd address access in prev_chunk - * removed dependency on getpagesize.h - * misc cosmetics and a bit more internal documentation - * anticosmetics: mangled names in macros to evade debugger strangeness - * tested on sparc, hp-700, dec-mips, rs6000 - with gcc & native cc (hp, dec only) allowing - Detlefs & Zorn comparison study (in SIGPLAN Notices.) - - Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) - * Based loosely on libg++-1.2X malloc. (It retains some of the overall - structure of old version, but most details differ.) - -*/ diff --git a/third_party/python/Modules/_ctypes/libffi/src/frv/eabi.S b/third_party/python/Modules/_ctypes/libffi/src/frv/eabi.S deleted file mode 100644 index 379ea4bb0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/frv/eabi.S +++ /dev/null @@ -1,128 +0,0 @@ -/* ----------------------------------------------------------------------- - eabi.S - Copyright (c) 2004 Anthony Green - - FR-V Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .globl ffi_prep_args_EABI - - .text - .p2align 4 - .globl ffi_call_EABI - .type ffi_call_EABI, @function - - # gr8 : ffi_prep_args - # gr9 : &ecif - # gr10: cif->bytes - # gr11: fig->flags - # gr12: ecif.rvalue - # gr13: fn - -ffi_call_EABI: - addi sp, #-80, sp - sti fp, @(sp, #24) - addi sp, #24, fp - movsg lr, gr5 - - /* Make room for the new arguments. */ - /* subi sp, fp, gr10 */ - - /* Store return address and incoming args on stack. */ - sti gr5, @(fp, #8) - sti gr8, @(fp, #-4) - sti gr9, @(fp, #-8) - sti gr10, @(fp, #-12) - sti gr11, @(fp, #-16) - sti gr12, @(fp, #-20) - sti gr13, @(fp, #-24) - - sub sp, gr10, sp - - /* Call ffi_prep_args. */ - ldi @(fp, #-4), gr4 - addi sp, #0, gr8 - ldi @(fp, #-8), gr9 -#ifdef __FRV_FDPIC__ - ldd @(gr4, gr0), gr14 - calll @(gr14, gr0) -#else - calll @(gr4, gr0) -#endif - - /* ffi_prep_args returns the new stack pointer. */ - mov gr8, gr4 - - ldi @(sp, #0), gr8 - ldi @(sp, #4), gr9 - ldi @(sp, #8), gr10 - ldi @(sp, #12), gr11 - ldi @(sp, #16), gr12 - ldi @(sp, #20), gr13 - - /* Always copy the return value pointer into the hidden - parameter register. This is only strictly necessary - when we're returning an aggregate type, but it doesn't - hurt to do this all the time, and it saves a branch. */ - ldi @(fp, #-20), gr3 - - /* Use the ffi_prep_args return value for the new sp. */ - mov gr4, sp - - /* Call the target function. */ - ldi @(fp, -24), gr4 -#ifdef __FRV_FDPIC__ - ldd @(gr4, gr0), gr14 - calll @(gr14, gr0) -#else - calll @(gr4, gr0) -#endif - - /* Store the result. */ - ldi @(fp, #-16), gr10 /* fig->flags */ - ldi @(fp, #-20), gr4 /* ecif.rvalue */ - - /* Is the return value stored in two registers? */ - cmpi gr10, #8, icc0 - bne icc0, 0, .L2 - /* Yes, save them. */ - sti gr8, @(gr4, #0) - sti gr9, @(gr4, #4) - bra .L3 -.L2: - /* Is the return value a structure? */ - cmpi gr10, #-1, icc0 - beq icc0, 0, .L3 - /* No, save a 4 byte return value. */ - sti gr8, @(gr4, #0) -.L3: - - /* Restore the stack, and return. */ - ldi @(fp, 8), gr5 - ld @(fp, gr0), fp - addi sp,#80,sp - jmpl @(gr5,gr0) - .size ffi_call_EABI, .-ffi_call_EABI - diff --git a/third_party/python/Modules/_ctypes/libffi/src/frv/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/frv/ffi.c deleted file mode 100644 index 5698c89c3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/frv/ffi.c +++ /dev/null @@ -1,292 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2004 Anthony Green - Copyright (C) 2007 Free Software Foundation, Inc. - Copyright (C) 2008 Red Hat, Inc. - - FR-V Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void *ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - register int count = 0; - - p_argv = ecif->avalue; - argp = stack; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - z = sizeof(void*); - *(void **) argp = *p_argv; - } - /* if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (count > 24) - { - // This is going on the stack. Turn it into a double. - *(double *) argp = (double) *(float*)(* p_argv); - z = sizeof(double); - } - else - *(void **) argp = *(void **)(* p_argv); - } */ - else if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - count += z; - } - - return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = -1; - else - cif->flags = cif->rtype->size; - - cif->bytes = ALIGN (cif->bytes, 8); - - return FFI_OK; -} - -extern void ffi_call_EABI(void *(*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, - unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_EABI: - ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, - unsigned arg4, unsigned arg5, unsigned arg6) -{ - /* This function is called by a trampoline. The trampoline stows a - pointer to the ffi_closure object in gr7. We must save this - pointer in a place that will persist while we do our work. */ - register ffi_closure *creg __asm__ ("gr7"); - ffi_closure *closure = creg; - - /* Arguments that don't fit in registers are found on the stack - at a fixed offset above the current frame pointer. */ - register char *frame_pointer __asm__ ("fp"); - char *stack_args = frame_pointer + 16; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { arg1, arg2, arg3, arg4, arg5, arg6 }; - - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - void **avalue = alloca (cif->nargs * sizeof(void *)); - char *ptr = (char *) register_args; - int i; - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = ptr + 3; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = ptr + 2; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - avalue[i] = ptr; - break; - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - default: - /* This is an 8-byte value. */ - avalue[i] = ptr; - ptr += 4; - break; - } - ptr += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - if (ptr == ((char *)register_args + (6*4))) - ptr = stack_args; - } - - /* Invoke the closure. */ - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - /* The caller allocates space for the return structure, and - passes a pointer to this space in gr3. Use this value directly - as the return value. */ - register void *return_struct_ptr __asm__("gr3"); - (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); - } - else - { - /* Allocate space for the return value and call the function. */ - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - - /* Functions return 4-byte or smaller results in gr8. 8-byte - values also use gr9. We fill the both, even for small return - values, just to avoid a branch. */ - asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); - asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); - } -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - unsigned long fn = (long) ffi_closure_eabi; - unsigned long cls = (long) codeloc; -#ifdef __FRV_FDPIC__ - register void *got __asm__("gr15"); -#endif - int i; - - fn = (unsigned long) ffi_closure_eabi; - -#ifdef __FRV_FDPIC__ - tramp[0] = &((unsigned int *)codeloc)[2]; - tramp[1] = got; - tramp[2] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ - tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ - tramp[4] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ - tramp[5] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ - tramp[6] = 0x9cc86000; /* ldi @(gr6, #0), gr14 */ - tramp[7] = 0x8030e000; /* jmpl @(gr14, gr0) */ -#else - tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ - tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ - tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ - tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ - tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Cache flushing. */ - for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) - __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), - "r" (codeloc)); - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/frv/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/frv/ffitarget.h deleted file mode 100644 index d42540e53..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/frv/ffitarget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2004 Red Hat, Inc. - Target configuration macros for FR-V - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_EABI, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_EABI -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#ifdef __FRV_FDPIC__ -/* Trampolines are 8 4-byte instructions long. */ -#define FFI_TRAMPOLINE_SIZE (8*4) -#else -/* Trampolines are 5 4-byte instructions long. */ -#define FFI_TRAMPOLINE_SIZE (5*4) -#endif - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/ia64/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/ia64/ffi.c deleted file mode 100644 index b77a836dd..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/ia64/ffi.c +++ /dev/null @@ -1,586 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - Copyright (c) 2011 Anthony Green - - IA64 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include - -#include "ia64_flags.h" - -/* A 64-bit pointer value. In LP64 mode, this is effectively a plain - pointer. In ILP32 mode, it's a pointer that's been extended to - 64 bits by "addp4". */ -typedef void *PTR64 __attribute__((mode(DI))); - -/* Memory image of fp register contents. This is the implementation - specific format used by ldf.fill/stf.spill. All we care about is - that it wants a 16 byte aligned slot. */ -typedef struct -{ - UINT64 x[2] __attribute__((aligned(16))); -} fpreg; - - -/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner. */ - -struct ia64_args -{ - fpreg fp_regs[8]; /* Contents of 8 fp arg registers. */ - UINT64 gp_regs[8]; /* Contents of 8 gp arg registers. */ - UINT64 other_args[]; /* Arguments passed on stack, variable size. */ -}; - - -/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes. */ - -static inline void * -endian_adjust (void *addr, size_t len) -{ -#ifdef __BIG_ENDIAN__ - return addr + (8 - len); -#else - return addr; -#endif -} - -/* Store VALUE to ADDR in the current cpu implementation's fp spill format. - This is a macro instead of a function, so that it works for all 3 floating - point types without type conversions. Type conversion to long double breaks - the denorm support. */ - -#define stf_spill(addr, value) \ - asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value)); - -/* Load a value from ADDR, which is in the current cpu implementation's - fp spill format. As above, this must also be a macro. */ - -#define ldf_fill(result, addr) \ - asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr)); - -/* Return the size of the C type associated with with TYPE. Which will - be one of the FFI_IA64_TYPE_HFA_* values. */ - -static size_t -hfa_type_size (int type) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - return sizeof(float); - case FFI_IA64_TYPE_HFA_DOUBLE: - return sizeof(double); - case FFI_IA64_TYPE_HFA_LDOUBLE: - return sizeof(__float80); - default: - abort (); - } -} - -/* Load from ADDR a value indicated by TYPE. Which will be one of - the FFI_IA64_TYPE_HFA_* values. */ - -static void -hfa_type_load (fpreg *fpaddr, int type, void *addr) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - stf_spill (fpaddr, *(float *) addr); - return; - case FFI_IA64_TYPE_HFA_DOUBLE: - stf_spill (fpaddr, *(double *) addr); - return; - case FFI_IA64_TYPE_HFA_LDOUBLE: - stf_spill (fpaddr, *(__float80 *) addr); - return; - default: - abort (); - } -} - -/* Load VALUE into ADDR as indicated by TYPE. Which will be one of - the FFI_IA64_TYPE_HFA_* values. */ - -static void -hfa_type_store (int type, void *addr, fpreg *fpaddr) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - { - float result; - ldf_fill (result, fpaddr); - *(float *) addr = result; - break; - } - case FFI_IA64_TYPE_HFA_DOUBLE: - { - double result; - ldf_fill (result, fpaddr); - *(double *) addr = result; - break; - } - case FFI_IA64_TYPE_HFA_LDOUBLE: - { - __float80 result; - ldf_fill (result, fpaddr); - *(__float80 *) addr = result; - break; - } - default: - abort (); - } -} - -/* Is TYPE a struct containing floats, doubles, or extended doubles, - all of the same fp type? If so, return the element type. Return - FFI_TYPE_VOID if not. */ - -static int -hfa_element_type (ffi_type *type, int nested) -{ - int element = FFI_TYPE_VOID; - - switch (type->type) - { - case FFI_TYPE_FLOAT: - /* We want to return VOID for raw floating-point types, but the - synthetic HFA type if we're nested within an aggregate. */ - if (nested) - element = FFI_IA64_TYPE_HFA_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - /* Similarly. */ - if (nested) - element = FFI_IA64_TYPE_HFA_DOUBLE; - break; - - case FFI_TYPE_LONGDOUBLE: - /* Similarly, except that that HFA is true for double extended, - but not quad precision. Both have sizeof == 16, so tell the - difference based on the precision. */ - if (LDBL_MANT_DIG == 64 && nested) - element = FFI_IA64_TYPE_HFA_LDOUBLE; - break; - - case FFI_TYPE_STRUCT: - { - ffi_type **ptr = &type->elements[0]; - - for (ptr = &type->elements[0]; *ptr ; ptr++) - { - int sub_element = hfa_element_type (*ptr, 1); - if (sub_element == FFI_TYPE_VOID) - return FFI_TYPE_VOID; - - if (element == FFI_TYPE_VOID) - element = sub_element; - else if (element != sub_element) - return FFI_TYPE_VOID; - } - } - break; - - default: - return FFI_TYPE_VOID; - } - - return element; -} - - -/* Perform machine dependent cif processing. */ - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - int flags; - - /* Adjust cif->bytes to include space for the bits of the ia64_args frame - that precedes the integer register portion. The estimate that the - generic bits did for the argument space required is good enough for the - integer component. */ - cif->bytes += offsetof(struct ia64_args, gp_regs[0]); - if (cif->bytes < sizeof(struct ia64_args)) - cif->bytes = sizeof(struct ia64_args); - - /* Set the return type flag. */ - flags = cif->rtype->type; - switch (cif->rtype->type) - { - case FFI_TYPE_LONGDOUBLE: - /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision, - and encode quad precision as a two-word integer structure. */ - if (LDBL_MANT_DIG != 64) - flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8); - break; - - case FFI_TYPE_STRUCT: - { - size_t size = cif->rtype->size; - int hfa_type = hfa_element_type (cif->rtype, 0); - - if (hfa_type != FFI_TYPE_VOID) - { - size_t nelts = size / hfa_type_size (hfa_type); - if (nelts <= 8) - flags = hfa_type | (size << 8); - } - else - { - if (size <= 32) - flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8); - } - } - break; - - default: - break; - } - cif->flags = flags; - - return FFI_OK; -} - -extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64); - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - struct ia64_args *stack; - long i, avn, gpcount, fpcount; - ffi_type **p_arg; - - FFI_ASSERT (cif->abi == FFI_UNIX); - - /* If we have no spot for a return value, make one. */ - if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID) - rvalue = alloca (cif->rtype->size); - - /* Allocate the stack frame. */ - stack = alloca (cif->bytes); - - gpcount = fpcount = 0; - avn = cif->nargs; - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i]; - break; - case FFI_TYPE_UINT8: - stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i]; - break; - case FFI_TYPE_SINT16: - stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i]; - break; - case FFI_TYPE_UINT16: - stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i]; - break; - case FFI_TYPE_SINT32: - stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i]; - break; - case FFI_TYPE_UINT32: - stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; - break; - - case FFI_TYPE_POINTER: - stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; - break; - - case FFI_TYPE_FLOAT: - if (gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); - { - UINT32 tmp; - memcpy (&tmp, avalue[i], sizeof (UINT32)); - stack->gp_regs[gpcount++] = tmp; - } - break; - - case FFI_TYPE_DOUBLE: - if (gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); - memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); - break; - - case FFI_TYPE_LONGDOUBLE: - if (gpcount & 1) - gpcount++; - if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); - memcpy (&stack->gp_regs[gpcount], avalue[i], 16); - gpcount += 2; - break; - - case FFI_TYPE_STRUCT: - { - size_t size = (*p_arg)->size; - size_t align = (*p_arg)->alignment; - int hfa_type = hfa_element_type (*p_arg, 0); - - FFI_ASSERT (align <= 16); - if (align == 16 && (gpcount & 1)) - gpcount++; - - if (hfa_type != FFI_TYPE_VOID) - { - size_t hfa_size = hfa_type_size (hfa_type); - size_t offset = 0; - size_t gp_offset = gpcount * 8; - - while (fpcount < 8 - && offset < size - && gp_offset < 8 * 8) - { - hfa_type_load (&stack->fp_regs[fpcount], hfa_type, - avalue[i] + offset); - offset += hfa_size; - gp_offset += hfa_size; - fpcount += 1; - } - } - - memcpy (&stack->gp_regs[gpcount], avalue[i], size); - gpcount += (size + 7) / 8; - } - break; - - default: - abort (); - } - } - - ffi_call_unix (stack, rvalue, fn, cif->flags); -} - -/* Closures represent a pair consisting of a function pointer, and - some user data. A closure is invoked by reinterpreting the closure - as a function pointer, and branching to it. Thus we can make an - interpreted function callable as a C function: We turn the - interpreter itself, together with a pointer specifying the - interpreted procedure, into a closure. - - For IA64, function pointer are already pairs consisting of a code - pointer, and a gp pointer. The latter is needed to access global - variables. Here we set up such a pair as the first two words of - the closure (in the "trampoline" area), but we replace the gp - pointer with a pointer to the closure itself. We also add the real - gp pointer to the closure. This allows the function entry code to - both retrieve the user data, and to restore the correct gp pointer. */ - -extern void ffi_closure_unix (); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - /* The layout of a function descriptor. A C function pointer really - points to one of these. */ - struct ia64_fd - { - UINT64 code_pointer; - UINT64 gp; - }; - - struct ffi_ia64_trampoline_struct - { - UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ - UINT64 fake_gp; /* Pointer to closure, installed as gp. */ - UINT64 real_gp; /* Real gp value. */ - }; - - struct ffi_ia64_trampoline_struct *tramp; - struct ia64_fd *fd; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; - fd = (struct ia64_fd *)(void *)ffi_closure_unix; - - tramp->code_pointer = fd->code_pointer; - tramp->real_gp = fd->gp; - tramp->fake_gp = (UINT64)(PTR64)codeloc; - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - -UINT64 -ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack, - void *rvalue, void *r8) -{ - ffi_cif *cif; - void **avalue; - ffi_type **p_arg; - long i, avn, gpcount, fpcount; - - cif = closure->cif; - avn = cif->nargs; - avalue = alloca (avn * sizeof (void *)); - - /* If the structure return value is passed in memory get that location - from r8 so as to pass the value directly back to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - rvalue = r8; - - gpcount = fpcount = 0; - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1); - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2); - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4); - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - avalue[i] = &stack->gp_regs[gpcount++]; - break; - case FFI_TYPE_POINTER: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*)); - break; - - case FFI_TYPE_FLOAT: - if (gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - float result; - avalue[i] = addr; - ldf_fill (result, addr); - *(float *)addr = result; - } - else - avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4); - gpcount++; - break; - - case FFI_TYPE_DOUBLE: - if (gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - double result; - avalue[i] = addr; - ldf_fill (result, addr); - *(double *)addr = result; - } - else - avalue[i] = &stack->gp_regs[gpcount]; - gpcount++; - break; - - case FFI_TYPE_LONGDOUBLE: - if (gpcount & 1) - gpcount++; - if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - __float80 result; - avalue[i] = addr; - ldf_fill (result, addr); - *(__float80 *)addr = result; - } - else - avalue[i] = &stack->gp_regs[gpcount]; - gpcount += 2; - break; - - case FFI_TYPE_STRUCT: - { - size_t size = (*p_arg)->size; - size_t align = (*p_arg)->alignment; - int hfa_type = hfa_element_type (*p_arg, 0); - - FFI_ASSERT (align <= 16); - if (align == 16 && (gpcount & 1)) - gpcount++; - - if (hfa_type != FFI_TYPE_VOID) - { - size_t hfa_size = hfa_type_size (hfa_type); - size_t offset = 0; - size_t gp_offset = gpcount * 8; - void *addr = alloca (size); - - avalue[i] = addr; - - while (fpcount < 8 - && offset < size - && gp_offset < 8 * 8) - { - hfa_type_store (hfa_type, addr + offset, - &stack->fp_regs[fpcount]); - offset += hfa_size; - gp_offset += hfa_size; - fpcount += 1; - } - - if (offset < size) - memcpy (addr + offset, (char *)stack->gp_regs + gp_offset, - size - offset); - } - else - avalue[i] = &stack->gp_regs[gpcount]; - - gpcount += (size + 7) / 8; - } - break; - - default: - abort (); - } - } - - closure->fun (cif, rvalue, avalue, closure->user_data); - - return cif->flags; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/ia64/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/ia64/ffitarget.h deleted file mode 100644 index e68cea615..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/ia64/ffitarget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for IA-64. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long long ffi_arg; -typedef signed long long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_UNIX, /* Linux and all Unix variants use the same conventions */ - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */ - /* can be interpreted as a C function */ - /* descriptor: */ - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/ia64/ia64_flags.h b/third_party/python/Modules/_ctypes/libffi/src/ia64/ia64_flags.h deleted file mode 100644 index 9d652cef1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/ia64/ia64_flags.h +++ /dev/null @@ -1,40 +0,0 @@ -/* ----------------------------------------------------------------------- - ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company - - IA64/unix Foreign Function Interface - - Original author: Hans Boehm, HP Labs - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* "Type" codes used between assembly and C. When used as a part of - a cfi->flags value, the low byte will be these extra type codes, - and bits 8-31 will be the actual size of the type. */ - -/* Small structures containing N words in integer registers. */ -#define FFI_IA64_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 1) - -/* Homogeneous Floating Point Aggregates (HFAs) which are returned - in FP registers. */ -#define FFI_IA64_TYPE_HFA_FLOAT (FFI_TYPE_LAST + 2) -#define FFI_IA64_TYPE_HFA_DOUBLE (FFI_TYPE_LAST + 3) -#define FFI_IA64_TYPE_HFA_LDOUBLE (FFI_TYPE_LAST + 4) diff --git a/third_party/python/Modules/_ctypes/libffi/src/ia64/unix.S b/third_party/python/Modules/_ctypes/libffi/src/ia64/unix.S deleted file mode 100644 index 4d2a86d42..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/ia64/unix.S +++ /dev/null @@ -1,560 +0,0 @@ -/* ----------------------------------------------------------------------- - unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - - IA64/unix Foreign Function Interface - - Primary author: Hans Boehm, HP Labs - - Loosely modeled on Cygnus code for other platforms. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include "ia64_flags.h" - - .pred.safe_across_calls p1-p5,p16-p63 -.text - -/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, - void (*fn)(void), int flags); - */ - - .align 16 - .global ffi_call_unix - .proc ffi_call_unix -ffi_call_unix: - .prologue - /* Bit o trickiness. We actually share a stack frame with ffi_call. - Rely on the fact that ffi_call uses a vframe and don't bother - tracking one here at all. */ - .fframe 0 - .save ar.pfs, r36 // loc0 - alloc loc0 = ar.pfs, 4, 3, 8, 0 - .save rp, loc1 - mov loc1 = b0 - .body - add r16 = 16, in0 - mov loc2 = gp - mov r8 = in1 - ;; - - /* Load up all of the argument registers. */ - ldf.fill f8 = [in0], 32 - ldf.fill f9 = [r16], 32 - ;; - ldf.fill f10 = [in0], 32 - ldf.fill f11 = [r16], 32 - ;; - ldf.fill f12 = [in0], 32 - ldf.fill f13 = [r16], 32 - ;; - ldf.fill f14 = [in0], 32 - ldf.fill f15 = [r16], 24 - ;; - ld8 out0 = [in0], 16 - ld8 out1 = [r16], 16 - ;; - ld8 out2 = [in0], 16 - ld8 out3 = [r16], 16 - ;; - ld8 out4 = [in0], 16 - ld8 out5 = [r16], 16 - ;; - ld8 out6 = [in0] - ld8 out7 = [r16] - ;; - - /* Deallocate the register save area from the stack frame. */ - mov sp = in0 - - /* Call the target function. */ - ld8 r16 = [in2], 8 - ;; - ld8 gp = [in2] - mov b6 = r16 - br.call.sptk.many b0 = b6 - ;; - - /* Dispatch to handle return value. */ - mov gp = loc2 - zxt1 r16 = in3 - ;; - mov ar.pfs = loc0 - addl r18 = @ltoffx(.Lst_table), gp - ;; - ld8.mov r18 = [r18], .Lst_table - mov b0 = loc1 - ;; - shladd r18 = r16, 3, r18 - ;; - ld8 r17 = [r18] - shr in3 = in3, 8 - ;; - add r17 = r17, r18 - ;; - mov b6 = r17 - br b6 - ;; - -.Lst_void: - br.ret.sptk.many b0 - ;; -.Lst_uint8: - zxt1 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint8: - sxt1 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_uint16: - zxt2 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint16: - sxt2 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_uint32: - zxt4 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint32: - sxt4 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_int64: - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_float: - stfs [in1] = f8 - br.ret.sptk.many b0 - ;; -.Lst_double: - stfd [in1] = f8 - br.ret.sptk.many b0 - ;; -.Lst_ldouble: - stfe [in1] = f8 - br.ret.sptk.many b0 - ;; - -.Lst_small_struct: - add sp = -16, sp - cmp.lt p6, p0 = 8, in3 - cmp.lt p7, p0 = 16, in3 - cmp.lt p8, p0 = 24, in3 - ;; - add r16 = 8, sp - add r17 = 16, sp - add r18 = 24, sp - ;; - st8 [sp] = r8 -(p6) st8 [r16] = r9 - mov out0 = in1 -(p7) st8 [r17] = r10 -(p8) st8 [r18] = r11 - mov out1 = sp - mov out2 = in3 - br.call.sptk.many b0 = memcpy# - ;; - mov ar.pfs = loc0 - mov b0 = loc1 - mov gp = loc2 - br.ret.sptk.many b0 - -.Lst_hfa_float: - add r16 = 4, in1 - cmp.lt p6, p0 = 4, in3 - ;; - stfs [in1] = f8, 8 -(p6) stfs [r16] = f9, 8 - cmp.lt p7, p0 = 8, in3 - cmp.lt p8, p0 = 12, in3 - ;; -(p7) stfs [in1] = f10, 8 -(p8) stfs [r16] = f11, 8 - cmp.lt p9, p0 = 16, in3 - cmp.lt p10, p0 = 20, in3 - ;; -(p9) stfs [in1] = f12, 8 -(p10) stfs [r16] = f13, 8 - cmp.lt p6, p0 = 24, in3 - cmp.lt p7, p0 = 28, in3 - ;; -(p6) stfs [in1] = f14 -(p7) stfs [r16] = f15 - br.ret.sptk.many b0 - ;; - -.Lst_hfa_double: - add r16 = 8, in1 - cmp.lt p6, p0 = 8, in3 - ;; - stfd [in1] = f8, 16 -(p6) stfd [r16] = f9, 16 - cmp.lt p7, p0 = 16, in3 - cmp.lt p8, p0 = 24, in3 - ;; -(p7) stfd [in1] = f10, 16 -(p8) stfd [r16] = f11, 16 - cmp.lt p9, p0 = 32, in3 - cmp.lt p10, p0 = 40, in3 - ;; -(p9) stfd [in1] = f12, 16 -(p10) stfd [r16] = f13, 16 - cmp.lt p6, p0 = 48, in3 - cmp.lt p7, p0 = 56, in3 - ;; -(p6) stfd [in1] = f14 -(p7) stfd [r16] = f15 - br.ret.sptk.many b0 - ;; - -.Lst_hfa_ldouble: - add r16 = 16, in1 - cmp.lt p6, p0 = 16, in3 - ;; - stfe [in1] = f8, 32 -(p6) stfe [r16] = f9, 32 - cmp.lt p7, p0 = 32, in3 - cmp.lt p8, p0 = 48, in3 - ;; -(p7) stfe [in1] = f10, 32 -(p8) stfe [r16] = f11, 32 - cmp.lt p9, p0 = 64, in3 - cmp.lt p10, p0 = 80, in3 - ;; -(p9) stfe [in1] = f12, 32 -(p10) stfe [r16] = f13, 32 - cmp.lt p6, p0 = 96, in3 - cmp.lt p7, p0 = 112, in3 - ;; -(p6) stfe [in1] = f14 -(p7) stfe [r16] = f15 - br.ret.sptk.many b0 - ;; - - .endp ffi_call_unix - - .align 16 - .global ffi_closure_unix - .proc ffi_closure_unix - -#define FRAME_SIZE (8*16 + 8*8 + 8*16) - -ffi_closure_unix: - .prologue - .save ar.pfs, r40 // loc0 - alloc loc0 = ar.pfs, 8, 4, 4, 0 - .fframe FRAME_SIZE - add r12 = -FRAME_SIZE, r12 - .save rp, loc1 - mov loc1 = b0 - .save ar.unat, loc2 - mov loc2 = ar.unat - .body - - /* Retrieve closure pointer and real gp. */ -#ifdef _ILP32 - addp4 out0 = 0, gp - addp4 gp = 16, gp -#else - mov out0 = gp - add gp = 16, gp -#endif - ;; - ld8 gp = [gp] - - /* Spill all of the possible argument registers. */ - add r16 = 16 + 8*16, sp - add r17 = 16 + 8*16 + 16, sp - ;; - stf.spill [r16] = f8, 32 - stf.spill [r17] = f9, 32 - mov loc3 = gp - ;; - stf.spill [r16] = f10, 32 - stf.spill [r17] = f11, 32 - ;; - stf.spill [r16] = f12, 32 - stf.spill [r17] = f13, 32 - ;; - stf.spill [r16] = f14, 32 - stf.spill [r17] = f15, 24 - ;; - .mem.offset 0, 0 - st8.spill [r16] = in0, 16 - .mem.offset 8, 0 - st8.spill [r17] = in1, 16 - add out1 = 16 + 8*16, sp - ;; - .mem.offset 0, 0 - st8.spill [r16] = in2, 16 - .mem.offset 8, 0 - st8.spill [r17] = in3, 16 - add out2 = 16, sp - ;; - .mem.offset 0, 0 - st8.spill [r16] = in4, 16 - .mem.offset 8, 0 - st8.spill [r17] = in5, 16 - mov out3 = r8 - ;; - .mem.offset 0, 0 - st8.spill [r16] = in6 - .mem.offset 8, 0 - st8.spill [r17] = in7 - - /* Invoke ffi_closure_unix_inner for the hard work. */ - br.call.sptk.many b0 = ffi_closure_unix_inner - ;; - - /* Dispatch to handle return value. */ - mov gp = loc3 - zxt1 r16 = r8 - ;; - addl r18 = @ltoffx(.Lld_table), gp - mov ar.pfs = loc0 - ;; - ld8.mov r18 = [r18], .Lld_table - mov b0 = loc1 - ;; - shladd r18 = r16, 3, r18 - mov ar.unat = loc2 - ;; - ld8 r17 = [r18] - shr r8 = r8, 8 - ;; - add r17 = r17, r18 - add r16 = 16, sp - ;; - mov b6 = r17 - br b6 - ;; - .label_state 1 - -.Lld_void: - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_int: - .body - .copy_state 1 - ld8 r8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_float: - .body - .copy_state 1 - ldfs f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_double: - .body - .copy_state 1 - ldfd f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_ldouble: - .body - .copy_state 1 - ldfe f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_small_struct: - .body - .copy_state 1 - add r17 = 8, r16 - cmp.lt p6, p0 = 8, r8 - cmp.lt p7, p0 = 16, r8 - cmp.lt p8, p0 = 24, r8 - ;; - ld8 r8 = [r16], 16 -(p6) ld8 r9 = [r17], 16 - ;; -(p7) ld8 r10 = [r16] -(p8) ld8 r11 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_float: - .body - .copy_state 1 - add r17 = 4, r16 - cmp.lt p6, p0 = 4, r8 - ;; - ldfs f8 = [r16], 8 -(p6) ldfs f9 = [r17], 8 - cmp.lt p7, p0 = 8, r8 - cmp.lt p8, p0 = 12, r8 - ;; -(p7) ldfs f10 = [r16], 8 -(p8) ldfs f11 = [r17], 8 - cmp.lt p9, p0 = 16, r8 - cmp.lt p10, p0 = 20, r8 - ;; -(p9) ldfs f12 = [r16], 8 -(p10) ldfs f13 = [r17], 8 - cmp.lt p6, p0 = 24, r8 - cmp.lt p7, p0 = 28, r8 - ;; -(p6) ldfs f14 = [r16] -(p7) ldfs f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_double: - .body - .copy_state 1 - add r17 = 8, r16 - cmp.lt p6, p0 = 8, r8 - ;; - ldfd f8 = [r16], 16 -(p6) ldfd f9 = [r17], 16 - cmp.lt p7, p0 = 16, r8 - cmp.lt p8, p0 = 24, r8 - ;; -(p7) ldfd f10 = [r16], 16 -(p8) ldfd f11 = [r17], 16 - cmp.lt p9, p0 = 32, r8 - cmp.lt p10, p0 = 40, r8 - ;; -(p9) ldfd f12 = [r16], 16 -(p10) ldfd f13 = [r17], 16 - cmp.lt p6, p0 = 48, r8 - cmp.lt p7, p0 = 56, r8 - ;; -(p6) ldfd f14 = [r16] -(p7) ldfd f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_ldouble: - .body - .copy_state 1 - add r17 = 16, r16 - cmp.lt p6, p0 = 16, r8 - ;; - ldfe f8 = [r16], 32 -(p6) ldfe f9 = [r17], 32 - cmp.lt p7, p0 = 32, r8 - cmp.lt p8, p0 = 48, r8 - ;; -(p7) ldfe f10 = [r16], 32 -(p8) ldfe f11 = [r17], 32 - cmp.lt p9, p0 = 64, r8 - cmp.lt p10, p0 = 80, r8 - ;; -(p9) ldfe f12 = [r16], 32 -(p10) ldfe f13 = [r17], 32 - cmp.lt p6, p0 = 96, r8 - cmp.lt p7, p0 = 112, r8 - ;; -(p6) ldfe f14 = [r16] -(p7) ldfe f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - - .endp ffi_closure_unix - - .section .rodata - .align 8 -.Lst_table: - data8 @pcrel(.Lst_void) // FFI_TYPE_VOID - data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT - data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT - data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE - data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE - data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 - data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 - data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 - data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 - data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 - data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 - data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 - data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 - data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT - data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER - data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT - data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT - data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE - data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE - -.Lld_table: - data8 @pcrel(.Lld_void) // FFI_TYPE_VOID - data8 @pcrel(.Lld_int) // FFI_TYPE_INT - data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT - data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE - data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 - data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT - data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER - data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT - data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT - data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE - data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/java_raw_api.c b/third_party/python/Modules/_ctypes/libffi/src/java_raw_api.c deleted file mode 100644 index 522c8bfd6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/java_raw_api.c +++ /dev/null @@ -1,356 +0,0 @@ -/* ----------------------------------------------------------------------- - java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. - - Cloned from raw_api.c - - Raw_api.c author: Kresten Krab Thorup - Java_raw_api.c author: Hans-J. Boehm - - $Id $ - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* This defines a Java- and 64-bit specific variant of the raw API. */ -/* It assumes that "raw" argument blocks look like Java stacks on a */ -/* 64-bit machine. Arguments that can be stored in a single stack */ -/* stack slots (longs, doubles) occupy 128 bits, but only the first */ -/* 64 bits are actually used. */ - -#include -#include -#include - -#if !defined(NO_JAVA_RAW_API) && !defined(FFI_NO_RAW_API) - -size_t -ffi_java_raw_size (ffi_cif *cif) -{ - size_t result = 0; - int i; - - ffi_type **at = cif->arg_types; - - for (i = cif->nargs-1; i >= 0; i--, at++) - { - switch((*at) -> type) { - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - result += 2 * FFI_SIZEOF_JAVA_RAW; - break; - case FFI_TYPE_STRUCT: - /* No structure parameters in Java. */ - abort(); - default: - result += FFI_SIZEOF_JAVA_RAW; - } - } - - return result; -} - - -void -ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - -#if WORDS_BIGENDIAN - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - *args = (void*) ((char*)(raw++) + 3); - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - *args = (void*) ((char*)(raw++) + 2); - break; - -#if FFI_SIZEOF_JAVA_RAW == 8 - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - *args = (void *)raw; - raw += 2; - break; -#endif - - case FFI_TYPE_POINTER: - *args = (void*) &(raw++)->ptr; - break; - - default: - *args = raw; - raw += - ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); - } - } - -#else /* WORDS_BIGENDIAN */ - -#if !PDP - - /* then assume little endian */ - for (i = 0; i < cif->nargs; i++, tp++, args++) - { -#if FFI_SIZEOF_JAVA_RAW == 8 - switch((*tp)->type) { - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - *args = (void*) raw; - raw += 2; - break; - default: - *args = (void*) raw++; - } -#else /* FFI_SIZEOF_JAVA_RAW != 8 */ - *args = (void*) raw; - raw += - ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); -#endif /* FFI_SIZEOF_JAVA_RAW == 8 */ - } - -#else -#error "pdp endian not supported" -#endif /* ! PDP */ - -#endif /* WORDS_BIGENDIAN */ -} - -void -ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT8*) (*args); -#else - (raw++)->uint = *(UINT8*) (*args); -#endif - break; - - case FFI_TYPE_SINT8: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT8*) (*args); -#else - (raw++)->sint = *(SINT8*) (*args); -#endif - break; - - case FFI_TYPE_UINT16: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT16*) (*args); -#else - (raw++)->uint = *(UINT16*) (*args); -#endif - break; - - case FFI_TYPE_SINT16: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT16*) (*args); -#else - (raw++)->sint = *(SINT16*) (*args); -#endif - break; - - case FFI_TYPE_UINT32: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT32*) (*args); -#else - (raw++)->uint = *(UINT32*) (*args); -#endif - break; - - case FFI_TYPE_SINT32: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT32*) (*args); -#else - (raw++)->sint = *(SINT32*) (*args); -#endif - break; - - case FFI_TYPE_FLOAT: - (raw++)->flt = *(FLOAT32*) (*args); - break; - -#if FFI_SIZEOF_JAVA_RAW == 8 - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - raw->uint = *(UINT64*) (*args); - raw += 2; - break; -#endif - - case FFI_TYPE_POINTER: - (raw++)->ptr = **(void***) args; - break; - - default: -#if FFI_SIZEOF_JAVA_RAW == 8 - FFI_ASSERT(0); /* Should have covered all cases */ -#else - memcpy ((void*) raw->data, (void*)*args, (*tp)->size); - raw += - ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); -#endif - } - } -} - -#if !FFI_NATIVE_RAW_API - -static void -ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) -{ -#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 - switch (cif->rtype->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - *(UINT64 *)rvalue <<= 32; - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: -#if FFI_SIZEOF_JAVA_RAW == 4 - case FFI_TYPE_POINTER: -#endif - *(SINT64 *)rvalue <<= 32; - break; - - default: - break; - } -#endif -} - -static void -ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) -{ -#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 - switch (cif->rtype->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - *(UINT64 *)rvalue >>= 32; - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - *(SINT64 *)rvalue >>= 32; - break; - - default: - break; - } -#endif -} - -/* This is a generic definition of ffi_raw_call, to be used if the - * native system does not provide a machine-specific implementation. - * Having this, allows code to be written for the raw API, without - * the need for system-specific code to handle input in that format; - * these following couple of functions will handle the translation forth - * and back automatically. */ - -void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *raw) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - ffi_java_raw_to_ptrarray (cif, raw, avalue); - ffi_call (cif, fn, rvalue, avalue); - ffi_java_rvalue_to_raw (cif, rvalue); -} - -#if FFI_CLOSURES /* base system provides closures */ - -static void -ffi_java_translate_args (ffi_cif *cif, void *rvalue, - void **avalue, void *user_data) -{ - ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); - ffi_raw_closure *cl = (ffi_raw_closure*)user_data; - - ffi_java_ptrarray_to_raw (cif, avalue, raw); - (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); - ffi_java_raw_to_rvalue (cif, rvalue); -} - -ffi_status -ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data, - void *codeloc) -{ - ffi_status status; - - status = ffi_prep_closure_loc ((ffi_closure*) cl, - cif, - &ffi_java_translate_args, - codeloc, - codeloc); - if (status == FFI_OK) - { - cl->fun = fun; - cl->user_data = user_data; - } - - return status; -} - -/* Again, here is the generic version of ffi_prep_raw_closure, which - * will install an intermediate "hub" for translation of arguments from - * the pointer-array format, to the raw format */ - -ffi_status -ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data) -{ - return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); -} - -#endif /* FFI_CLOSURES */ -#endif /* !FFI_NATIVE_RAW_API */ -#endif /* !FFI_NO_RAW_API */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/m32r/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/m32r/ffi.c deleted file mode 100644 index 300006349..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m32r/ffi.c +++ /dev/null @@ -1,232 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2004 Renesas Technology - Copyright (c) 2008 Red Hat, Inc. - - M32R Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack - space has been allocated for the function's arguments. */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - unsigned int i; - int tmp; - unsigned int avn; - void **p_argv; - char *argp; - ffi_type **p_arg; - - tmp = 0; - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0) && (avn != 0); - i--, p_arg++) - { - size_t z; - - /* Align if necessary. */ - if (((*p_arg)->alignment - 1) & (unsigned) argp) - argp = (char *) ALIGN (argp, (*p_arg)->alignment); - - if (avn != 0) - { - avn--; - z = (*p_arg)->size; - if (z < sizeof (int)) - { - z = sizeof (int); - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - z = (*p_arg)->size; - if ((*p_arg)->alignment != 1) - memcpy (argp, *p_argv, z); - else - memcpy (argp + 4 - z, *p_argv, z); - z = sizeof (int); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof (int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - if (z > 8) - { - *(unsigned int *) argp = (unsigned int)(void *)(* p_argv); - z = sizeof(void *); - } - else - { - memcpy(argp, *p_argv, z); - z = 8; - } - } - else - { - /* Double or long long 64bit. */ - memcpy (argp, *p_argv, z); - } - } - p_argv++; - argp += z; - } - } - - return; -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag. */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4) - cif->flags = FFI_TYPE_INT; - - else if (cif->rtype->size <= 8) - cif->flags = FFI_TYPE_DOUBLE; - - else - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFI_TYPE_DOUBLE; - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have - a return value address then we need to make one. */ - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - int size = cif->rtype->size; - int align = cif->rtype->alignment; - - if (size < 4) - { - if (align == 1) - *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8; - } - else if (4 < size && size < 8) - { - if (align == 1) - { - memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); - } - else if (align == 2) - { - if (size & 1) - size += 1; - - if (size != 8) - memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); - } - } - } - break; - - default: - FFI_ASSERT(0); - break; - } -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/m32r/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/m32r/ffitarget.h deleted file mode 100644 index 6c3480198..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m32r/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2004 Renesas Technology. - Target configuration macros for M32R. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi - { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV - } ffi_abi; -#endif - -#define FFI_CLOSURES 0 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/m32r/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/m32r/sysv.S deleted file mode 100644 index 06b75c226..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m32r/sysv.S +++ /dev/null @@ -1,121 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2004 Renesas Technology - - M32R Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): -#endif - -.text - - /* R0: ffi_prep_args */ - /* R1: &ecif */ - /* R2: cif->bytes */ - /* R3: fig->flags */ - /* sp+0: ecif.rvalue */ - /* sp+4: fn */ - - /* This assumes we are using gas. */ -ENTRY(ffi_call_SYSV) - /* Save registers. */ - push fp - push lr - push r3 - push r2 - push r1 - push r0 - mv fp, sp - - /* Make room for all of the new args. */ - sub sp, r2 - - /* Place all of the ffi_prep_args in position. */ - mv lr, r0 - mv r0, sp - /* R1 already set. */ - - /* And call. */ - jl lr - - /* Move first 4 parameters in registers... */ - ld r0, @(0,sp) - ld r1, @(4,sp) - ld r2, @(8,sp) - ld r3, @(12,sp) - - /* ...and adjust the stack. */ - ld lr, @(8,fp) - cmpi lr, #16 - bc adjust_stack - ldi lr, #16 -adjust_stack: - add sp, lr - - /* Call the function. */ - ld lr, @(28,fp) - jl lr - - /* Remove the space we pushed for the args. */ - mv sp, fp - - /* Load R2 with the pointer to storage for the return value. */ - ld r2, @(24,sp) - - /* Load R3 with the return type code. */ - ld r3, @(12,sp) - - /* If the return value pointer is NULL, assume no return value. */ - beqz r2, epilogue - - /* Return INT. */ - ldi r4, #FFI_TYPE_INT - bne r3, r4, return_double - st r0, @r2 - bra epilogue - -return_double: - /* Return DOUBLE or LONGDOUBLE. */ - ldi r4, #FFI_TYPE_DOUBLE - bne r3, r4, epilogue - st r0, @r2 - st r1, @(4,r2) - -epilogue: - pop r0 - pop r1 - pop r2 - pop r3 - pop lr - pop fp - jmp lr - -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) diff --git a/third_party/python/Modules/_ctypes/libffi/src/m68k/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/m68k/ffi.c deleted file mode 100644 index 0dee9383a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m68k/ffi.c +++ /dev/null @@ -1,362 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - - m68k Foreign Function Interface - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#ifdef __rtems__ -void rtems_cache_flush_multiple_data_lines( const void *, size_t ); -#else -#include -#ifdef __MINT__ -#include -#include -#else -#include -#endif -#endif - -void ffi_call_SYSV (extended_cif *, - unsigned, unsigned, - void *, void (*fn) ()); -void *ffi_prep_args (void *stack, extended_cif *ecif); -void ffi_closure_SYSV (ffi_closure *); -void ffi_closure_struct_SYSV (ffi_closure *); -unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, - void *resp, void *args); - -/* ffi_prep_args is called by the assembly routine once stack space has - been allocated for the function's arguments. */ - -void * -ffi_prep_args (void *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - void *struct_value_ptr; - - argp = stack; - - if ( -#ifdef __MINT__ - (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) - && !ecif->cif->flags))) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z = (*p_arg)->size; - int type = (*p_arg)->type; - - if (z < sizeof (int)) - { - switch (type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_STRUCT: -#ifdef __MINT__ - if (z == 1 || z == 2) - memcpy (argp + 2, *p_argv, z); - else - memcpy (argp, *p_argv, z); -#else - memcpy (argp + sizeof (int) - z, *p_argv, z); -#endif - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else - { - memcpy (argp, *p_argv, z); - - /* Align if necessary. */ - if ((sizeof(int) - 1) & z) - z = ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } - - return struct_value_ptr; -} - -#define CIF_FLAGS_INT 1 -#define CIF_FLAGS_DINT 2 -#define CIF_FLAGS_FLOAT 4 -#define CIF_FLAGS_DOUBLE 8 -#define CIF_FLAGS_LDOUBLE 16 -#define CIF_FLAGS_POINTER 32 -#define CIF_FLAGS_STRUCT1 64 -#define CIF_FLAGS_STRUCT2 128 -#define CIF_FLAGS_SINT8 256 -#define CIF_FLAGS_SINT16 512 - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - switch (cif->rtype->size) - { - case 1: -#ifdef __MINT__ - cif->flags = CIF_FLAGS_STRUCT2; -#else - cif->flags = CIF_FLAGS_STRUCT1; -#endif - break; - case 2: - cif->flags = CIF_FLAGS_STRUCT2; - break; -#ifdef __MINT__ - case 3: -#endif - case 4: - cif->flags = CIF_FLAGS_INT; - break; -#ifdef __MINT__ - case 7: -#endif - case 8: - cif->flags = CIF_FLAGS_DINT; - break; - default: - cif->flags = 0; - break; - } - break; - - case FFI_TYPE_FLOAT: - cif->flags = CIF_FLAGS_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - cif->flags = CIF_FLAGS_DOUBLE; - break; - -#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) - case FFI_TYPE_LONGDOUBLE: -#ifdef __MINT__ - cif->flags = 0; -#else - cif->flags = CIF_FLAGS_LDOUBLE; -#endif - break; -#endif - - case FFI_TYPE_POINTER: - cif->flags = CIF_FLAGS_POINTER; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = CIF_FLAGS_DINT; - break; - - case FFI_TYPE_SINT16: - cif->flags = CIF_FLAGS_SINT16; - break; - - case FFI_TYPE_SINT8: - cif->flags = CIF_FLAGS_SINT8; - break; - - default: - cif->flags = CIF_FLAGS_INT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (&ecif, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -static void -ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; -#ifdef __MINT__ - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 1 || z == 2)) - { - *p_argv = (void *) (argp + 2); - - z = 4; - } - else - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 3 || z == 4)) - { - *p_argv = (void *) (argp); - - z = 4; - } - else -#endif - if (z <= 4) - { - *p_argv = (void *) (argp + 4 - z); - - z = 4; - } - else - { - *p_argv = (void *) argp; - - /* Align if necessary */ - if ((sizeof(int) - 1) & z) - z = ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } -} - -unsigned int -ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_incoming_args_SYSV(args, arg_area, cif); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - *(unsigned short *)closure->tramp = 0x207c; - *(void **)(closure->tramp + 2) = codeloc; - *(unsigned short *)(closure->tramp + 6) = 0x4ef9; - - if ( -#ifdef __MINT__ - (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((cif->rtype->type == FFI_TYPE_STRUCT) - && !cif->flags))) - *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; - else - *(void **)(closure->tramp + 8) = ffi_closure_SYSV; - -#ifdef __rtems__ - rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); -#elif defined(__MINT__) - Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); -#else - syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, - FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); -#endif - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/m68k/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/m68k/ffitarget.h deleted file mode 100644 index e81dde2b2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m68k/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for Motorola 68K. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/m68k/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/m68k/sysv.S deleted file mode 100644 index ec2b14f3d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m68k/sysv.S +++ /dev/null @@ -1,330 +0,0 @@ -/* ----------------------------------------------------------------------- - - sysv.S - Copyright (c) 2012 Alan Hourihane - Copyright (c) 1998, 2012 Andreas Schwab - Copyright (c) 2008 Red Hat, Inc. - Copyright (c) 2012 Thorsten Glaser - - m68k Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifdef HAVE_AS_CFI_PSEUDO_OP -#define CFI_STARTPROC() .cfi_startproc -#define CFI_OFFSET(reg,off) .cfi_offset reg,off -#define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off -#define CFI_ENDPROC() .cfi_endproc -#else -#define CFI_STARTPROC() -#define CFI_OFFSET(reg,off) -#define CFI_DEF_CFA(reg,off) -#define CFI_ENDPROC() -#endif - -#ifdef __MINT__ -#define CALLFUNC(funcname) _ ## funcname -#else -#define CALLFUNC(funcname) funcname -#endif - - .text - - .globl CALLFUNC(ffi_call_SYSV) - .type CALLFUNC(ffi_call_SYSV),@function - .align 4 - -CALLFUNC(ffi_call_SYSV): - CFI_STARTPROC() - link %fp,#0 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %d2,-(%sp) - CFI_OFFSET(2,-12) - - | Make room for all of the new args. - sub.l 12(%fp),%sp - - | Call ffi_prep_args - move.l 8(%fp),-(%sp) - pea 4(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_prep_args) -#else - bsr.l CALLFUNC(ffi_prep_args@PLTPC) -#endif - addq.l #8,%sp - - | Pass pointer to struct value, if any -#ifdef __MINT__ - move.l %d0,%a1 -#else - move.l %a0,%a1 -#endif - - | Call the function - move.l 24(%fp),%a0 - jsr (%a0) - - | Remove the space we pushed for the args - add.l 12(%fp),%sp - - | Load the pointer to storage for the return value - move.l 20(%fp),%a1 - - | Load the return type code - move.l 16(%fp),%d2 - - | If the return value pointer is NULL, assume no return value. - | NOTE: On the mc68000, tst on an address register is not supported. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - cmp.w #0, %a1 -#else - tst.l %a1 -#endif - jbeq noretval - - btst #0,%d2 - jbeq retlongint - move.l %d0,(%a1) - jbra epilogue - -retlongint: - btst #1,%d2 - jbeq retfloat - move.l %d0,(%a1) - move.l %d1,4(%a1) - jbra epilogue - -retfloat: - btst #2,%d2 - jbeq retdouble -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.s %fp0,(%a1) -#else - move.l %d0,(%a1) -#endif - jbra epilogue - -retdouble: - btst #3,%d2 - jbeq retlongdouble -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.d %fp0,(%a1) -#else - move.l %d0,(%a1)+ - move.l %d1,(%a1) -#endif - jbra epilogue - -retlongdouble: - btst #4,%d2 - jbeq retpointer -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.x %fp0,(%a1) -#else - move.l %d0,(%a1)+ - move.l %d1,(%a1)+ - move.l %d2,(%a1) -#endif - jbra epilogue - -retpointer: - btst #5,%d2 - jbeq retstruct1 -#ifdef __MINT__ - move.l %d0,(%a1) -#else - move.l %a0,(%a1) -#endif - jbra epilogue - -retstruct1: - btst #6,%d2 - jbeq retstruct2 - move.b %d0,(%a1) - jbra epilogue - -retstruct2: - btst #7,%d2 - jbeq retsint8 - move.w %d0,(%a1) - jbra epilogue - -retsint8: - btst #8,%d2 - jbeq retsint16 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - move.l %d0,(%a1) - jbra epilogue - -retsint16: - btst #9,%d2 - jbeq noretval - ext.l %d0 - move.l %d0,(%a1) - -noretval: -epilogue: - move.l (%sp)+,%d2 - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) - - .globl CALLFUNC(ffi_closure_SYSV) - .type CALLFUNC(ffi_closure_SYSV), @function - .align 4 - -CALLFUNC(ffi_closure_SYSV): - CFI_STARTPROC() - link %fp,#-12 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %sp,-12(%fp) - pea 8(%fp) - pea -12(%fp) - move.l %a0,-(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_closure_SYSV_inner) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - - lsr.l #1,%d0 - jne 1f - jcc .Lcls_epilogue - | CIF_FLAGS_INT - move.l -12(%fp),%d0 -.Lcls_epilogue: - | no CIF_FLAGS_* - unlk %fp - rts -1: - lea -12(%fp),%a0 - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_float - | CIF_FLAGS_DINT - move.l (%a0)+,%d0 - move.l (%a0),%d1 - jra .Lcls_epilogue -.Lcls_ret_float: -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.s (%a0),%fp0 -#else - move.l (%a0),%d0 -#endif - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_ldouble - | CIF_FLAGS_DOUBLE -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.d (%a0),%fp0 -#else - move.l (%a0)+,%d0 - move.l (%a0),%d1 -#endif - jra .Lcls_epilogue -.Lcls_ret_ldouble: -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.x (%a0),%fp0 -#else - move.l (%a0)+,%d0 - move.l (%a0)+,%d1 - move.l (%a0),%d2 -#endif - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_struct1 - | CIF_FLAGS_POINTER - move.l (%a0),%a0 - move.l %a0,%d0 - jra .Lcls_epilogue -.Lcls_ret_struct1: - move.b (%a0),%d0 - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_sint8 - | CIF_FLAGS_STRUCT2 - move.w (%a0),%d0 - jra .Lcls_epilogue -.Lcls_ret_sint8: - move.l (%a0),%d0 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - jra .Lcls_epilogue -1: - | CIF_FLAGS_SINT16 - move.l (%a0),%d0 - ext.l %d0 - jra .Lcls_epilogue - CFI_ENDPROC() - - .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) - - .globl CALLFUNC(ffi_closure_struct_SYSV) - .type CALLFUNC(ffi_closure_struct_SYSV), @function - .align 4 - -CALLFUNC(ffi_closure_struct_SYSV): - CFI_STARTPROC() - link %fp,#0 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %sp,-12(%fp) - pea 8(%fp) - move.l %a1,-(%sp) - move.l %a0,-(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_closure_SYSV_inner) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/m88k/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/m88k/ffi.c deleted file mode 100644 index 68df49495..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m88k/ffi.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * m88k Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - * - * Only OpenBSD/m88k is currently supported; other platforms (such as - * Motorola's SysV/m88k) could be supported with the following tweaks: - * - * - non-OpenBSD systems use an `outgoing parameter area' as part of the - * 88BCS calling convention, which is not supported under OpenBSD from - * release 3.6 onwards. Supporting it should be as easy as taking it - * into account when adjusting the stack, in the assembly code. - * - * - the logic deciding whether a function argument gets passed through - * registers, or on the stack, has changed several times in OpenBSD in - * edge cases (especially for structs larger than 32 bytes being passed - * by value). The code below attemps to match the logic used by the - * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend - * fixes. - */ - -#include -#include - -#include -#include - -void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *, - void (*fn) ()); -void *ffi_prep_args (void *, extended_cif *); -void ffi_closure_OBSD (ffi_closure *); -void ffi_closure_struct_OBSD (ffi_closure *); -unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *, - char *); -void ffi_cacheflush_OBSD (unsigned int, unsigned int); - -#define CIF_FLAGS_INT (1 << 0) -#define CIF_FLAGS_DINT (1 << 1) - -/* - * Foreign Function Interface API - */ - -/* ffi_prep_args is called by the assembly routine once stack space has - been allocated for the function's arguments. */ - -void * -ffi_prep_args (void *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - char *argp, *stackp; - unsigned int *regp; - unsigned int regused; - ffi_type **p_arg; - void *struct_value_ptr; - - regp = (unsigned int *)stack; - stackp = (char *)(regp + 8); - regused = 0; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && !ecif->cif->flags) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument can be passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) ALIGN(stackp, a); - argp = stackp; - } - - switch (t) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *(unsigned int *) argp = *(unsigned int *) *p_argv; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT (0); - } - - /* Align if necessary. */ - if ((sizeof (int) - 1) & z) - z = ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are filled, and about to continue - on stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } - - return struct_value_ptr; -} - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->size == sizeof (int) && - cif->rtype->alignment == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = 0; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = CIF_FLAGS_DINT; - break; - - default: - cif->flags = CIF_FLAGS_INT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && (cif->rtype->size != sizeof (int) - || cif->rtype->alignment != sizeof (int))) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_OBSD: - ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -static void -ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp, - char *stackp) -{ - unsigned int i; - void **p_argv; - char *argp; - unsigned int regused; - ffi_type **p_arg; - - regused = 0; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument has been passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) ALIGN(stackp, a); - argp = stackp; - } - - if (z < sizeof (int) && t != FFI_TYPE_STRUCT) - *p_argv = (void *) (argp + sizeof (int) - z); - else - *p_argv = (void *) argp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are exhausted, and about to fetch from - stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } -} - -unsigned int -ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp, - char *stackp) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, void *codeloc) -{ - unsigned int *tramp = (unsigned int *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_OBSD); - - if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags) - fn = &ffi_closure_struct_OBSD; - else - fn = &ffi_closure_OBSD; - - /* or.u %r10, %r0, %hi16(fn) */ - tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16); - /* or.u %r13, %r0, %hi16(closure) */ - tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16); - /* or %r10, %r10, %lo16(fn) */ - tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff); - /* jmp.n %r10 */ - tramp[3] = 0xf400c40a; - /* or %r13, %r13, %lo16(closure) */ - tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff); - - ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/m88k/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/m88k/ffitarget.h deleted file mode 100644 index e52bf9fa3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m88k/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * m88k Foreign Function Interface - */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_OBSD, - FFI_DEFAULT_ABI = FFI_OBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 0x14 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/m88k/obsd.S b/third_party/python/Modules/_ctypes/libffi/src/m88k/obsd.S deleted file mode 100644 index 1944a23de..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/m88k/obsd.S +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * m88k Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * ffi_cacheflush_OBSD(unsigned int addr, %r2 - * unsigned int size); %r3 - */ - .align 4 - .globl ffi_cacheflush_OBSD - .type ffi_cacheflush_OBSD,@function -ffi_cacheflush_OBSD: - tb0 0, %r0, 451 - or %r0, %r0, %r0 - jmp %r1 - .size ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD - -/* - * ffi_call_OBSD(unsigned bytes, %r2 - * extended_cif *ecif, %r3 - * unsigned flags, %r4 - * void *rvalue, %r5 - * void (*fn)()); %r6 - */ - .align 4 - .globl ffi_call_OBSD - .type ffi_call_OBSD,@function -ffi_call_OBSD: - subu %r31, %r31, 32 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 32 - - | Save the few arguments we'll need after ffi_prep_args() - st.d %r4, %r31, 8 - st %r6, %r31, 16 - - | Allocate room for the image of r2-r9, and the stack space for - | the args (rounded to a 16-byte boundary) - addu %r2, %r2, (8 * 4) + 15 - clr %r2, %r2, 4<0> - subu %r31, %r31, %r2 - - | Fill register and stack image - or %r2, %r31, %r0 -#ifdef PIC - bsr ffi_prep_args#plt -#else - bsr ffi_prep_args -#endif - - | Save pointer to return struct address, if any - or %r12, %r2, %r0 - - | Get function pointer - subu %r4, %r30, 32 - ld %r1, %r4, 16 - - | Fetch the register arguments - ld.d %r2, %r31, (0 * 4) - ld.d %r4, %r31, (2 * 4) - ld.d %r6, %r31, (4 * 4) - ld.d %r8, %r31, (6 * 4) - addu %r31, %r31, (8 * 4) - - | Invoke the function - jsr %r1 - - | Restore stack now that we don't need the args anymore - subu %r31, %r30, 32 - - | Figure out what to return as the function's return value - ld %r5, %r31, 12 | rvalue - ld %r4, %r31, 8 | flags - - bcnd eq0, %r5, 9f - - bb0 0, %r4, 1f | CIF_FLAGS_INT - st %r2, %r5, 0 - br 9f - -1: - bb0 1, %r4, 1f | CIF_FLAGS_DINT - st.d %r2, %r5, 0 - br 9f - -1: -9: - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 32 - .size ffi_call_OBSD, . - ffi_call_OBSD - -/* - * ffi_closure_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_OBSD - .type ffi_closure_OBSD, @function -ffi_closure_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments and return - | value - subu %r31, %r31, (8 * 4) + (2 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - addu %r3, %r31, (8 * 4) | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - | Figure out what to return as the function's return value - bb0 0, %r2, 1f | CIF_FLAGS_INT - ld %r2, %r31, (8 * 4) - br 9f - -1: - bb0 1, %r2, 1f | CIF_FLAGS_DINT - ld.d %r2, %r31, (8 * 4) - br 9f - -1: -9: - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_OBSD,.-ffi_closure_OBSD - -/* - * ffi_closure_struct_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_struct_OBSD - .type ffi_closure_struct_OBSD, @function -ffi_closure_struct_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments - subu %r31, %r31, (8 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - or %r3, %r12, 0 | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD diff --git a/third_party/python/Modules/_ctypes/libffi/src/metag/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/metag/ffi.c deleted file mode 100644 index 46b383e7a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/metag/ffi.c +++ /dev/null @@ -1,330 +0,0 @@ -/* ---------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Imagination Technologies - - Meta Foreign Function Interface - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - `Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED `AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------ */ - -#include -#include - -#include - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -/* - * ffi_prep_args is called by the assembly routine once stack space has been - * allocated for the function's arguments - */ - -unsigned int ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - /* Store return value */ - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *(void **) argp = ecif->rvalue; - } - - p_argv = ecif->avalue; - - /* point to next location */ - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) - { - size_t z; - - /* Move argp to address of argument */ - z = (*p_arg)->size; - argp -= z; - - /* Align if necessary */ - argp = (char *) ALIGN_DOWN(ALIGN_DOWN(argp, (*p_arg)->alignment), 4); - - if (z < sizeof(int)) { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - default: - FFI_ASSERT(0); - } - } else if ( z == sizeof(int)) { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } else { - memcpy(argp, *p_argv, z); - } - } - - /* return the size of the arguments to be passed in registers, - padded to an 8 byte boundary to preserve stack alignment */ - return ALIGN(MIN(stack - argp, 6*4), 8); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - ffi_type **ptr; - unsigned i, bytes = 0; - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { - if ((*ptr)->size == 0) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = ALIGN(bytes, (*ptr)->alignment); - - bytes += ALIGN((*ptr)->size, 4); - } - - /* Ensure arg space is aligned to an 8-byte boundary */ - bytes = ALIGN(bytes, 8); - - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT) { - bytes += sizeof(void*); - - /* Ensure stack is aligned to an 8-byte boundary */ - bytes = ALIGN(bytes, 8); - } - - cif->bytes = bytes; - - /* Set the return type flag */ - switch (cif->rtype->type) { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) FFI_TYPE_SINT64; - break; - case FFI_TYPE_STRUCT: - /* Meta can store return values which are <= 64 bits */ - if (cif->rtype->size <= 4) - /* Returned to D0Re0 as 32-bit value */ - cif->flags = (unsigned)FFI_TYPE_INT; - else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) - /* Returned valued is stored to D1Re0|R0Re0 */ - cif->flags = (unsigned)FFI_TYPE_DOUBLE; - else - /* value stored in memory */ - cif->flags = (unsigned)FFI_TYPE_STRUCT; - break; - default: - cif->flags = (unsigned)FFI_TYPE_INT; - break; - } - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); - -/* - * Exported in API. Entry point - * cif -> ffi_cif object - * fn -> function pointer - * rvalue -> pointer to return value - * avalue -> vector of void * pointers pointing to memory locations holding the - * arguments - */ -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); - ecif.cif = cif; - ecif.avalue = avalue; - - double temp; - - /* - * If the return value is a struct and we don't have a return value address - * then we need to make one - */ - - if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else if (small_struct) - ecif.rvalue = &temp; - else - ecif.rvalue = rvalue; - - switch (cif->abi) { - case FFI_SYSV: - ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; - default: - FFI_ASSERT(0); - break; - } - - if (small_struct) - memcpy (rvalue, &temp, cif->rtype->size); -} - -/* private members */ - -static void ffi_prep_incoming_args_SYSV (char *, void **, void **, - ffi_cif*, float *); - -void ffi_closure_SYSV (ffi_closure *); - -/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ -extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ - -/* end of private members */ - -/* - * __tramp: trampoline memory location - * __fun: assembly routine - * __ctx: memory location for wrapper - * - * At this point, tramp[0] == __ctx ! - */ -void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { - memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); - *(unsigned int*) &__tramp[40] = __ctx; - *(unsigned int*) &__tramp[44] = __fun; - /* This will flush the instruction cache */ - __builtin_meta2_cachewd(&__tramp[0], 1); - __builtin_meta2_cachewd(&__tramp[47], 1); -} - - - -/* the cif must already be prepared */ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - void (*closure_func)(ffi_closure*) = NULL; - - if (cif->abi == FFI_SYSV) - closure_func = &ffi_closure_SYSV; - else - return FFI_BAD_ABI; - - ffi_init_trampoline( - (unsigned char*)&closure->tramp[0], - (unsigned int)closure_func, - (unsigned int)codeloc); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - -/* This function is jumped to by the trampoline */ -unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) - ffi_closure *closure; - void **respp; - void *args; - void *vfp_args; -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* - * This call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. - */ - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); - - (closure->fun) ( cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif, - float *vfp_stack) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - /* stack points to original arguments */ - argp = stack; - - /* Store return value */ - if ( cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *rvalue = *(void **) argp; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { - size_t z; - size_t alignment; - - alignment = (*p_arg)->alignment; - if (alignment < 4) - alignment = 4; - if ((alignment - 1) & (unsigned)argp) - argp = (char *) ALIGN(argp, alignment); - - z = (*p_arg)->size; - *p_argv = (void*) argp; - p_argv++; - argp -= z; - } - return; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/metag/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/metag/ffitarget.h deleted file mode 100644 index 7b9dbebca..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/metag/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. - Target configuration macros for Meta - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_DEFAULT_ABI = FFI_SYSV, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 48 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/metag/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/metag/sysv.S deleted file mode 100644 index b4b2a3b26..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/metag/sysv.S +++ /dev/null @@ -1,311 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. - - Meta Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#ifdef __USER_LABEL_PREFIX__ -#define CONCAT1(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -/* Use the right prefix for global labels. */ -#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) -#else -#define CNAME(x) x -#endif -#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): -#endif - -#ifdef __ELF__ -#define LSYM(x) .x -#else -#define LSYM(x) x -#endif - -.macro call_reg x= - .text - .balign 4 - mov D1RtP, \x - swap D1RtP, PC -.endm - -! Save register arguments -.macro SAVE_ARGS - .text - .balign 4 - setl [A0StP++], D0Ar6, D1Ar5 - setl [A0StP++], D0Ar4, D1Ar3 - setl [A0StP++], D0Ar2, D1Ar1 -.endm - -! Save retrun, frame pointer and other regs -.macro SAVE_REGS regs= - .text - .balign 4 - setl [A0StP++], D0FrT, D1RtP - ! Needs to be a pair of regs - .ifnc "\regs","" - setl [A0StP++], \regs - .endif -.endm - -! Declare a global function -.macro METAG_FUNC_START name - .text - .balign 4 - ENTRY(\name) -.endm - -! Return registers from the stack. Reverse SAVE_REGS operation -.macro RET_REGS regs=, cond= - .ifnc "\regs", "" - getl \regs, [--A0StP] - .endif - getl D0FrT, D1RtP, [--A0StP] -.endm - -! Return arguments -.macro RET_ARGS - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] -.endm - - - ! D1Ar1: fn - ! D0Ar2: &ecif - ! D1Ar3: cif->bytes - ! D0Ar4: fig->flags - ! D1Ar5: ecif.rvalue - - ! This assumes we are using GNU as -METAG_FUNC_START ffi_call_SYSV - ! Save argument registers - - SAVE_ARGS - - ! new frame - mov D0FrT, A0FrP - add A0FrP, A0StP, #0 - - ! Preserve the old frame pointer - SAVE_REGS "D1.5, D0.5" - - ! Make room for new args. cifs->bytes is the total space for input - ! and return arguments - - add A0StP, A0StP, D1Ar3 - - ! Preserve cifs->bytes & fn - mov D0.5, D1Ar3 - mov D1.5, D1Ar1 - - ! Place all of the ffi_prep_args in position - mov D1Ar1, A0StP - - ! Call ffi_prep_args(stack, &ecif) -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_prep_args@PLT) -#else - callr D1RtP, CNAME(ffi_prep_args) -#endif - - ! Restore fn pointer - - ! The foreign stack should look like this - ! XXXXX XXXXXX <--- stack pointer - ! FnArgN rvalue - ! FnArgN+2 FnArgN+1 - ! FnArgN+4 FnArgN+3 - ! .... - ! - - ! A0StP now points to the first (or return) argument + 4 - - ! Preserve cif->bytes - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] - - ! Place A0StP to the first argument again - add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each - - ! A0FrP points to the initial stack without the reserved space for the - ! cifs->bytes, whilst A0StP points to the stack after the space allocation - - ! fn was the first argument of ffi_call_SYSV. - ! The stack at this point looks like this: - ! - ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low - ! Arg4 Arg3 | - ! Arg2 Arg1 | - ! A0FrP ----> D0FrtP D1RtP | - ! D1.5 D0.5 | - ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | - ! FnArgn-2FnArgn-3 | - ! ................ | <= cifs->bytes - ! FnArg4 FnArg3 | - ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high - ! - ! fn was in Arg1 so it's located in in A0FrP+#-0xC - ! - - ! D0Re0 contains the size of arguments stored in registers - sub A0StP, A0StP, D0Re0 - - ! Arg1 is the function pointer for the foreign call. This has been - ! preserved in D1.5 - - ! Time to call (fn). Arguments should be like this: - ! Arg1-Arg6 are loaded to regs - ! The rest of the arguments are stored in stack pointed by A0StP - - call_reg D1.5 - - ! Reset stack. - - mov A0StP, A0FrP - - ! Load Arg1 with the pointer to storage for the return type - ! This was stored in Arg5 - - getd D1Ar1, [A0FrP+#-20] - - ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) - - getd D0Ar2, [A0FrP+#-16] - - ! We are ready to start processing the return value - ! D0Re0 (and D1Re0) hold the return value - - ! If the return value is NULL, assume no return value - cmp D1Ar1, #0 - beq LSYM(Lepilogue) - - ! return INT - cmp D0Ar2, #FFI_TYPE_INT - ! Sadly, there is no setd{cc} instruction so we need to workaround that - bne .INT64 - setd [D1Ar1], D0Re0 - b LSYM(Lepilogue) - - ! return INT64 -.INT64: - cmp D0Ar2, #FFI_TYPE_SINT64 - setleq [D1Ar1], D0Re0, D1Re0 - - ! return DOUBLE - cmp D0Ar2, #FFI_TYPE_DOUBLE - setl [D1AR1++], D0Re0, D1Re0 - -LSYM(Lepilogue): - ! At this point, the stack pointer points right after the argument - ! saved area. We need to restore 4 regs, therefore we need to move - ! 16 bytes ahead. - add A0StP, A0StP, #16 - RET_REGS "D1.5, D0.5" - RET_ARGS - getd D0Re0, [A0StP] - mov A0FrP, D0FrT - swap D1RtP, PC - -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - - -/* - (called by ffi_metag_trampoline) - void ffi_closure_SYSV (ffi_closure*) - - (called by ffi_closure_SYSV) - unsigned int FFI_HIDDEN - ffi_closure_SYSV_inner (closure,respp, args) - ffi_closure *closure; - void **respp; - void *args; -*/ - -METAG_FUNC_START ffi_closure_SYSV - ! We assume that D1Ar1 holds the address of the - ! ffi_closure struct. We will use that to fetch the - ! arguments. The stack pointer points to an empty space - ! and it is ready to store more data. - - ! D1Ar1 is ready - ! Allocate stack space for return value - add A0StP, A0StP, #8 - ! Store it to D0Ar2 - sub D0Ar2, A0StP, #8 - - sub D1Ar3, A0FrP, #4 - - ! D1Ar3 contains the address of the original D1Ar1 argument - ! We need to subtract #4 later on - - ! Preverve D0Ar2 - mov D0.5, D0Ar2 - -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) -#else - callr D1RtP, CNAME(ffi_closure_SYSV_inner) -#endif - - ! Check the return value and store it to D0.5 - cmp D0Re0, #FFI_TYPE_INT - beq .Lretint - cmp D0Re0, #FFI_TYPE_DOUBLE - beq .Lretdouble -.Lclosure_epilogue: - sub A0StP, A0StP, #8 - RET_REGS "D1.5, D0.5" - RET_ARGS - swap D1RtP, PC - -.Lretint: - setd [D0.5], D0Re0 - b .Lclosure_epilogue -.Lretdouble: - setl [D0.5++], D0Re0, D1Re0 - b .Lclosure_epilogue -.ffi_closure_SYSV_end: -.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - - -ENTRY(ffi_metag_trampoline) - SAVE_ARGS - ! New frame - mov A0FrP, A0StP - SAVE_REGS "D1.5, D0.5" - mov D0.5, PC - ! Load D1Ar1 the value of ffi_metag_trampoline - getd D1Ar1, [D0.5 + #8] - ! Jump to ffi_closure_SYSV - getd PC, [D0.5 + #12] diff --git a/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffi.c deleted file mode 100644 index ea962ea48..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffi.c +++ /dev/null @@ -1,321 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, - unsigned int, unsigned int, unsigned int*, void (*fn)(void), - unsigned int, unsigned int); - -extern void ffi_closure_SYSV(void); - -#define WORD_SIZE sizeof(unsigned int) -#define ARGS_REGISTER_SIZE (WORD_SIZE * 6) -#define WORD_ALIGN(x) ALIGN(x, WORD_SIZE) - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ -void ffi_prep_args(void* stack, extended_cif* ecif) -{ - unsigned int i; - ffi_type** p_arg; - void** p_argv; - void* stack_args_p = stack; - - p_argv = ecif->avalue; - - if (ecif == NULL || ecif->cif == NULL) { - return; /* no description to prepare */ - } - - if ((ecif->cif->rtype != NULL) && - (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) - { - /* if return type is a struct which is referenced on the stack/reg5, - * by a pointer. Stored the return value pointer in r5. - */ - char* addr = stack_args_p; - memcpy(addr, &(ecif->rvalue), WORD_SIZE); - stack_args_p += WORD_SIZE; - } - - if (ecif->avalue == NULL) { - return; /* no arguments to prepare */ - } - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t size = (*p_arg)->size; - int type = (*p_arg)->type; - void* value = p_argv[i]; - char* addr = stack_args_p; - int aligned_size = WORD_ALIGN(size); - - /* force word alignment on the stack */ - stack_args_p += aligned_size; - - switch (type) - { - case FFI_TYPE_UINT8: - *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); - break; - case FFI_TYPE_SINT8: - *(signed int *)addr = (signed int)*(SINT8*)(value); - break; - case FFI_TYPE_UINT16: - *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); - break; - case FFI_TYPE_SINT16: - *(signed int *)addr = (signed int)*(SINT16*)(value); - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * MicroBlaze toolchain appears to emit: - * bsrli r5, r5, 8 (caller) - * ... - * - * ... - * bslli r5, r5, 8 (callee) - * - * For structs like "struct a { uint8_t a[3]; };", when passed - * by value. - * - * Structs like "struct b { uint16_t a; };" are also expected - * to be packed strangely in registers. - * - * This appears to be because the microblaze toolchain expects - * "struct b == uint16_t", which is only any issue for big - * endian. - * - * The following is a work around for big-endian only, for the - * above mentioned case, it will re-align the contents of a - * <= 3-byte struct value. - */ - if (size < WORD_SIZE) - { - memcpy (addr + (WORD_SIZE - size), value, size); - break; - } -#endif - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - default: - memcpy(addr, value, aligned_size); - } - } -} - -ffi_status ffi_prep_cif_machdep(ffi_cif* cif) -{ - /* check ABI */ - switch (cif->abi) - { - case FFI_SYSV: - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} - -void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue) -{ - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - ecif.rvalue = alloca(cif->rtype->size); - } else { - ecif.rvalue = rvalue; - } - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, - ecif.rvalue, fn, cif->rtype->type, cif->rtype->size); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_call_SYSV(void* register_args, void* stack_args, - ffi_closure* closure, void* rvalue, - unsigned int* rtype, unsigned int* rsize) -{ - /* prepare arguments for closure call */ - ffi_cif* cif = closure->cif; - ffi_type** arg_types = cif->arg_types; - - /* re-allocate data for the args. This needs to be done in order to keep - * multi-word objects (e.g. structs) in contiguous memory. Callers are not - * required to store the value of args in the lower 6 words in the stack - * (although they are allocated in the stack). - */ - char* stackclone = alloca(cif->bytes); - void** avalue = alloca(cif->nargs * sizeof(void*)); - void* struct_rvalue = NULL; - char* ptr = stackclone; - int i; - - /* copy registers into stack clone */ - int registers_used = cif->bytes; - if (registers_used > ARGS_REGISTER_SIZE) { - registers_used = ARGS_REGISTER_SIZE; - } - memcpy(stackclone, register_args, registers_used); - - /* copy stack allocated args into stack clone */ - if (cif->bytes > ARGS_REGISTER_SIZE) { - int stack_used = cif->bytes - ARGS_REGISTER_SIZE; - memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); - } - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - struct_rvalue = *((void**)ptr); - ptr += WORD_SIZE; - } - - /* populate arg pointer list */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 3; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 2; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * Work around strange ABI behaviour. - * (see info in ffi_prep_args) - */ - if (arg_types[i]->size < WORD_SIZE) - { - memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); - } -#endif - avalue[i] = (void*)ptr; - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - avalue[i] = ptr; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - default: - /* default 4-byte argument */ - avalue[i] = ptr; - break; - } - ptr += WORD_ALIGN(arg_types[i]->size); - } - - /* set the return type info passed back to the wrapper */ - *rsize = cif->rtype->size; - *rtype = cif->rtype->type; - if (struct_rvalue != NULL) { - closure->fun(cif, struct_rvalue, avalue, closure->user_data); - /* copy struct return pointer value into function return value */ - *((void**)rvalue) = struct_rvalue; - } else { - closure->fun(cif, rvalue, avalue, closure->user_data); - } -} - -ffi_status ffi_prep_closure_loc( - ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void* user_data, void* codeloc) -{ - unsigned long* tramp = (unsigned long*)&(closure->tramp[0]); - unsigned long cls = (unsigned long)codeloc; - unsigned long fn = 0; - unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - switch (cif->abi) - { - case FFI_SYSV: - fn = (unsigned long)ffi_closure_SYSV; - - /* load r11 (temp) with fn */ - /* imm fn(upper) */ - tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); - /* addik r11, r0, fn(lower) */ - tramp[1] = 0x31600000 | (fn & 0xffff); - - /* load r12 (temp) with cls */ - /* imm cls(upper) */ - tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); - /* addik r12, r0, cls(lower) */ - tramp[3] = 0x31800000 | (cls & 0xffff); - - /* load r3 (temp) with ffi_closure_call_SYSV */ - /* imm fn_closure_call_sysv(upper) */ - tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); - /* addik r3, r0, fn_closure_call_sysv(lower) */ - tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); - /* branch/jump to address stored in r11 (fn) */ - tramp[6] = 0x98085800; /* bra r11 */ - - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffitarget.h deleted file mode 100644 index c6fa5a411..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/microblaze/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc - - Target configuration macros for MicroBlaze. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* Definitions for closures */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#define FFI_TRAMPOLINE_SIZE (4*8) - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/microblaze/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/microblaze/sysv.S deleted file mode 100644 index ea43e9d54..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/microblaze/sysv.S +++ /dev/null @@ -1,302 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - /* - * arg[0] (r5) = ffi_prep_args, - * arg[1] (r6) = &ecif, - * arg[2] (r7) = cif->bytes, - * arg[3] (r8) = cif->flags, - * arg[4] (r9) = ecif.rvalue, - * arg[5] (r10) = fn - * arg[6] (sp[0]) = cif->rtype->type - * arg[7] (sp[4]) = cif->rtype->size - */ - .text - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -ffi_call_SYSV: - /* push callee saves */ - addik r1, r1, -20 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - swi r22, r1, 12 /* save for locals */ - swi r23, r1, 16 /* save for locals */ - - /* save the r5-r10 registers in the stack */ - addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* save function pointer */ - addik r3, r5, 0 /* copy ffi_prep_args into r3 */ - addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ - addik r23, r10, 0 /* save function address into r23 (callee-saved) */ - - /* prepare stack with allocation for n (bytes = r7) args */ - rsub r1, r7, r1 /* subtract bytes from sp */ - - /* prep args for ffi_prep_args call */ - addik r5, r1, 0 /* store stack pointer into arg[0] */ - /* r6 still holds ecif for arg[1] */ - - /* Call ffi_prep_args(stack, &ecif). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - /* returns calling stack pointer location */ - - /* prepare args for fn call, prep_args populates them onto the stack */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - - /* call (fn) (...). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r23 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - - /* Remove the space we pushed for the args. */ - addik r1, r22, 0 /* restore old SP */ - - /* restore this functions parameters */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ - - /* If the return value pointer is NULL, assume no return value. */ - beqi r9, ffi_call_SYSV_end - - lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ - lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ - - /* Check if return type is actually a struct, do nothing */ - rsubi r11, r22, FFI_TYPE_STRUCT - beqi r11, ffi_call_SYSV_end - - /* Return 8bit */ - rsubi r11, r23, 1 - beqi r11, ffi_call_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r23, 2 - beqi r11, ffi_call_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r23, 4 - beqi r11, ffi_call_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r23, 8 - beqi r11, ffi_call_SYSV_store64 - - /* Didn't match anything */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store64: - swi r3, r9, 0 /* store word r3 into return value */ - swi r4, r9, 4 /* store word r4 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store32: - swi r3, r9, 0 /* store word r3 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store16: -#ifdef __BIG_ENDIAN__ - shi r3, r9, 2 /* store half-word r3 into return value */ -#else - shi r3, r9, 0 /* store half-word r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_store8: -#ifdef __BIG_ENDIAN__ - sbi r3, r9, 3 /* store byte r3 into return value */ -#else - sbi r3, r9, 0 /* store byte r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_end: - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - lwi r22, r1, 12 - lwi r23, r1, 16 - addik r1, r1, 20 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_call_SYSV, . - ffi_call_SYSV - -/* ------------------------------------------------------------------------- */ - - /* - * args passed into this function, are passed down to the callee. - * this function is the target of the closure trampoline, as such r12 is - * a pointer to the closure object. - */ - .text - .globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function -ffi_closure_SYSV: - /* push callee saves */ - addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ - addik r1, r1, -12 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - - /* store register args on stack */ - addik r1, r1, -24 - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* setup args */ - addik r5, r1, 0 /* register_args */ - addik r6, r11, 0 /* stack_args */ - addik r7, r12, 0 /* closure object */ - addik r1, r1, -8 /* allocate return value */ - addik r8, r1, 0 /* void* rvalue */ - addik r1, r1, -8 /* allocate for return type/size values */ - addik r9, r1, 0 /* void* rtype */ - addik r10, r1, 4 /* void* rsize */ - - /* call the wrap_call function */ - addik r1, r1, -28 /* allocate args + link reg */ - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 28 /* restore the link register from the frame */ - -ffi_closure_SYSV_prepare_return: - lwi r9, r1, 0 /* rtype */ - lwi r10, r1, 4 /* rsize */ - addik r1, r1, 8 /* de-allocate return info values */ - - /* Check if return type is actually a struct, store 4 bytes */ - rsubi r11, r9, FFI_TYPE_STRUCT - beqi r11, ffi_closure_SYSV_store32 - - /* Return 8bit */ - rsubi r11, r10, 1 - beqi r11, ffi_closure_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r10, 2 - beqi r11, ffi_closure_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r10, 4 - beqi r11, ffi_closure_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r10, 8 - beqi r11, ffi_closure_SYSV_store64 - - /* Didn't match anything */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store64: - lwi r3, r1, 0 /* store word r3 into return value */ - lwi r4, r1, 4 /* store word r4 into return value */ - /* 64 bits == 2 words, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store32: - lwi r3, r1, 0 /* store word r3 into return value */ - /* 32 bits == 1 word, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store16: -#ifdef __BIG_ENDIAN__ - lhui r3, r1, 2 /* store half-word r3 into return value */ -#else - lhui r3, r1, 0 /* store half-word r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT16 - bnei r11, ffi_closure_SYSV_end - sext16 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store8: -#ifdef __BIG_ENDIAN__ - lbui r3, r1, 3 /* store byte r3 into return value */ -#else - lbui r3, r1, 0 /* store byte r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT8 - bnei r11, ffi_closure_SYSV_end - sext8 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_end: - addik r1, r1, 8 /* de-allocate return value */ - - /* de-allocate stored args */ - addik r1, r1, 24 - - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - addik r1, r1, 12 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_closure_SYSV, . - ffi_closure_SYSV diff --git a/third_party/python/Modules/_ctypes/libffi/src/mips/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/mips/ffi.c deleted file mode 100644 index 5d0dd70cb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/mips/ffi.c +++ /dev/null @@ -1,1050 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Anthony Green - Copyright (c) 2008 David Daney - Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. - - MIPS Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -#ifdef __GNUC__ -# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) -# define USE__BUILTIN___CLEAR_CACHE 1 -# endif -#endif - -#ifndef USE__BUILTIN___CLEAR_CACHE -# if defined(__OpenBSD__) -# include -# else -# include -# endif -#endif - -#ifdef FFI_DEBUG -# define FFI_MIPS_STOP_HERE() ffi_stop_here() -#else -# define FFI_MIPS_STOP_HERE() do {} while(0) -#endif - -#ifdef FFI_MIPS_N32 -#define FIX_ARGP \ -FFI_ASSERT(argp <= &stack[bytes]); \ -if (argp == &stack[bytes]) \ -{ \ - argp = stack; \ - FFI_MIPS_STOP_HERE(); \ -} -#else -#define FIX_ARGP -#endif - - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -static void ffi_prep_args(char *stack, - extended_cif *ecif, - int bytes, - int flags) -{ - int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - -#ifdef FFI_MIPS_N32 - /* If more than 8 double words are used, the remainder go - on the stack. We reorder stuff on the stack here to - support this easily. */ - if (bytes > 8 * sizeof(ffi_arg)) - argp = &stack[bytes - (8 * sizeof(ffi_arg))]; - else - argp = stack; -#else - argp = stack; -#endif - - memset(stack, 0, bytes); - -#ifdef FFI_MIPS_N32 - if ( ecif->cif->rstruct_flag != 0 ) -#else - if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) -#endif - { - *(ffi_arg *) argp = (ffi_arg) ecif->rvalue; - argp += sizeof(ffi_arg); - FIX_ARGP; - } - - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) - { - size_t z; - unsigned int a; - - /* Align if necessary. */ - a = (*p_arg)->alignment; - if (a < sizeof(ffi_arg)) - a = sizeof(ffi_arg); - - if ((a - 1) & (unsigned long) argp) - { - argp = (char *) ALIGN(argp, a); - FIX_ARGP; - } - - z = (*p_arg)->size; - if (z <= sizeof(ffi_arg)) - { - int type = (*p_arg)->type; - z = sizeof(ffi_arg); - - /* The size of a pointer depends on the ABI */ - if (type == FFI_TYPE_POINTER) - type = (ecif->cif->abi == FFI_N64 - || ecif->cif->abi == FFI_N64_SOFT_FLOAT) - ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; - - if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT - || ecif->cif->abi == FFI_N64_SOFT_FLOAT)) - { - switch (type) - { - case FFI_TYPE_FLOAT: - type = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - type = FFI_TYPE_UINT64; - break; - default: - break; - } - } - switch (type) - { - case FFI_TYPE_SINT8: - *(ffi_arg *)argp = *(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(ffi_arg *)argp = *(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(ffi_arg *)argp = *(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(ffi_arg *)argp = *(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(ffi_arg *)argp = *(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: -#ifdef FFI_MIPS_N32 - /* The N32 ABI requires that 32-bit integers - be sign-extended to 64-bits, regardless of - whether they are signed or unsigned. */ - *(ffi_arg *)argp = *(SINT32 *)(* p_argv); -#else - *(ffi_arg *)argp = *(UINT32 *)(* p_argv); -#endif - break; - - /* This can only happen with 64bit slots. */ - case FFI_TYPE_FLOAT: - *(float *) argp = *(float *)(* p_argv); - break; - - /* Handle structures. */ - default: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - } - } - else - { -#ifdef FFI_MIPS_O32 - memcpy(argp, *p_argv, z); -#else - { - unsigned long end = (unsigned long) argp + z; - unsigned long cap = (unsigned long) stack + bytes; - - /* Check if the data will fit within the register space. - Handle it if it doesn't. */ - - if (end <= cap) - memcpy(argp, *p_argv, z); - else - { - unsigned long portion = cap - (unsigned long)argp; - - memcpy(argp, *p_argv, portion); - argp = stack; - z -= portion; - memcpy(argp, (void*)((unsigned long)(*p_argv) + portion), - z); - } - } -#endif - } - p_argv++; - argp += z; - FIX_ARGP; - } -} - -#ifdef FFI_MIPS_N32 - -/* The n32 spec says that if "a chunk consists solely of a double - float field (but not a double, which is part of a union), it - is passed in a floating point register. Any other chunk is - passed in an integer register". This code traverses structure - definitions and generates the appropriate flags. */ - -static unsigned -calc_n32_struct_flags(int soft_float, ffi_type *arg, - unsigned *loc, unsigned *arg_reg) -{ - unsigned flags = 0; - unsigned index = 0; - - ffi_type *e; - - if (soft_float) - return 0; - - while ((e = arg->elements[index])) - { - /* Align this object. */ - *loc = ALIGN(*loc, e->alignment); - if (e->type == FFI_TYPE_DOUBLE) - { - /* Already aligned to FFI_SIZEOF_ARG. */ - *arg_reg = *loc / FFI_SIZEOF_ARG; - if (*arg_reg > 7) - break; - flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS)); - *loc += e->size; - } - else - *loc += e->size; - index++; - } - /* Next Argument register at alignment of FFI_SIZEOF_ARG. */ - *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - - return flags; -} - -static unsigned -calc_n32_return_struct_flags(int soft_float, ffi_type *arg) -{ - unsigned flags = 0; - unsigned small = FFI_TYPE_SMALLSTRUCT; - ffi_type *e; - - /* Returning structures under n32 is a tricky thing. - A struct with only one or two floating point fields - is returned in $f0 (and $f2 if necessary). Any other - struct results at most 128 bits are returned in $2 - (the first 64 bits) and $3 (remainder, if necessary). - Larger structs are handled normally. */ - - if (arg->size > 16) - return 0; - - if (arg->size > 8) - small = FFI_TYPE_SMALLSTRUCT2; - - e = arg->elements[0]; - - if (e->type == FFI_TYPE_DOUBLE) - flags = FFI_TYPE_DOUBLE; - else if (e->type == FFI_TYPE_FLOAT) - flags = FFI_TYPE_FLOAT; - - if (flags && (e = arg->elements[1])) - { - if (e->type == FFI_TYPE_DOUBLE) - flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS; - else if (e->type == FFI_TYPE_FLOAT) - flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS; - else - return small; - - if (flags && (arg->elements[2])) - { - /* There are three arguments and the first two are - floats! This must be passed the old way. */ - return small; - } - if (soft_float) - flags += FFI_TYPE_STRUCT_SOFT; - } - else - if (!flags) - return small; - - return flags; -} - -#endif - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->flags = 0; - -#ifdef FFI_MIPS_O32 - /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT - * does not have special handling for floating point args. - */ - - if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32) - { - if (cif->nargs > 0) - { - switch ((cif->arg_types)[0]->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += (cif->arg_types)[0]->type; - break; - - default: - break; - } - - if (cif->nargs > 1) - { - /* Only handle the second argument if the first - is a float or double. */ - if (cif->flags) - { - switch ((cif->arg_types)[1]->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS; - break; - - default: - break; - } - } - } - } - } - - /* Set the return type flag */ - - if (cif->abi == FFI_O32_SOFT_FLOAT) - { - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); - break; - } - } - else - { - /* FFI_O32 */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); - break; - - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); - break; - } - } -#endif - -#ifdef FFI_MIPS_N32 - /* Set the flags necessary for N32 processing */ - { - int type; - unsigned arg_reg = 0; - unsigned loc = 0; - unsigned count = (cif->nargs < 8) ? cif->nargs : 8; - unsigned index = 0; - - unsigned struct_flags = 0; - int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT - || cif->abi == FFI_N64_SOFT_FLOAT); - - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype); - - if (struct_flags == 0) - { - /* This means that the structure is being passed as - a hidden argument */ - - arg_reg = 1; - count = (cif->nargs < 7) ? cif->nargs : 7; - - cif->rstruct_flag = !0; - } - else - cif->rstruct_flag = 0; - } - else - cif->rstruct_flag = 0; - - while (count-- > 0 && arg_reg < 8) - { - type = (cif->arg_types)[index]->type; - if (soft_float) - { - switch (type) - { - case FFI_TYPE_FLOAT: - type = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - type = FFI_TYPE_UINT64; - break; - default: - break; - } - } - switch (type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += - ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - break; - case FFI_TYPE_LONGDOUBLE: - /* Align it. */ - arg_reg = ALIGN(arg_reg, 2); - /* Treat it as two adjacent doubles. */ - if (soft_float) - { - arg_reg += 2; - } - else - { - cif->flags += - (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - cif->flags += - (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - } - break; - - case FFI_TYPE_STRUCT: - loc = arg_reg * FFI_SIZEOF_ARG; - cif->flags += calc_n32_struct_flags(soft_float, - (cif->arg_types)[index], - &loc, &arg_reg); - break; - - default: - arg_reg++; - break; - } - - index++; - } - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - { - if (struct_flags == 0) - { - /* The structure is returned through a hidden - first argument. Do nothing, 'cause FFI_TYPE_VOID - is 0 */ - } - else - { - /* The structure is returned via some tricky - mechanism */ - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8)); - } - break; - } - - case FFI_TYPE_VOID: - /* Do nothing, 'cause FFI_TYPE_VOID is 0 */ - break; - - case FFI_TYPE_POINTER: - if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32) - cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); - else - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - break; - - case FFI_TYPE_FLOAT: - if (soft_float) - { - cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); - break; - } - /* else fall through */ - case FFI_TYPE_DOUBLE: - if (soft_float) - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - else - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8); - break; - - case FFI_TYPE_LONGDOUBLE: - /* Long double is returned as if it were a struct containing - two doubles. */ - if (soft_float) - { - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8)); - } - else - { - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += (FFI_TYPE_DOUBLE - + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS)) - << (4 + (FFI_FLAG_BITS * 8)); - } - break; - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - break; - } - } -#endif - - return FFI_OK; -} - -/* Low level routine for calling O32 functions */ -extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), - extended_cif *, unsigned, - unsigned, unsigned *, void (*)(void)); - -/* Low level routine for calling N32 functions */ -extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), - extended_cif *, unsigned, - unsigned, void *, void (*)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { -#ifdef FFI_MIPS_O32 - case FFI_O32: - case FFI_O32_SOFT_FLOAT: - ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; -#endif - -#ifdef FFI_MIPS_N32 - case FFI_N32: - case FFI_N32_SOFT_FLOAT: - case FFI_N64: - case FFI_N64_SOFT_FLOAT: - { - int copy_rvalue = 0; - int copy_offset = 0; - char *rvalue_copy = ecif.rvalue; - if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16) - { - /* For structures smaller than 16 bytes we clobber memory - in 8 byte increments. Make a copy so we don't clobber - the callers memory outside of the struct bounds. */ - rvalue_copy = alloca(16); - copy_rvalue = 1; - } - else if (cif->rtype->type == FFI_TYPE_FLOAT - && (cif->abi == FFI_N64_SOFT_FLOAT - || cif->abi == FFI_N32_SOFT_FLOAT)) - { - rvalue_copy = alloca (8); - copy_rvalue = 1; -#if defined(__MIPSEB__) || defined(_MIPSEB) - copy_offset = 4; -#endif - } - ffi_call_N32(ffi_prep_args, &ecif, cif->bytes, - cif->flags, rvalue_copy, fn); - if (copy_rvalue) - memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); - } - break; -#endif - - default: - FFI_ASSERT(0); - break; - } -} - -#if FFI_CLOSURES -#if defined(FFI_MIPS_O32) -extern void ffi_closure_O32(void); -#else -extern void ffi_closure_N32(void); -#endif /* FFI_MIPS_O32 */ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - void * fn; - char *clear_location = (char *) codeloc; - -#if defined(FFI_MIPS_O32) - if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) - return FFI_BAD_ABI; - fn = ffi_closure_O32; -#else -#if _MIPS_SIM ==_ABIN32 - if (cif->abi != FFI_N32 - && cif->abi != FFI_N32_SOFT_FLOAT) - return FFI_BAD_ABI; -#else - if (cif->abi != FFI_N64 - && cif->abi != FFI_N64_SOFT_FLOAT) - return FFI_BAD_ABI; -#endif - fn = ffi_closure_N32; -#endif /* FFI_MIPS_O32 */ - -#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) - /* lui $25,high(fn) */ - tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); - /* ori $25,low(fn) */ - tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); - /* lui $12,high(codeloc) */ - tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); - /* jr $25 */ - tramp[3] = 0x03200008; - /* ori $12,low(codeloc) */ - tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); -#else - /* N64 has a somewhat larger trampoline. */ - /* lui $25,high(fn) */ - tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48); - /* lui $12,high(codeloc) */ - tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48); - /* ori $25,mid-high(fn) */ - tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff); - /* ori $12,mid-high(codeloc) */ - tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff); - /* dsll $25,$25,16 */ - tramp[4] = 0x0019cc38; - /* dsll $12,$12,16 */ - tramp[5] = 0x000c6438; - /* ori $25,mid-low(fn) */ - tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff); - /* ori $12,mid-low(codeloc) */ - tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff); - /* dsll $25,$25,16 */ - tramp[8] = 0x0019cc38; - /* dsll $12,$12,16 */ - tramp[9] = 0x000c6438; - /* ori $25,low(fn) */ - tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); - /* jr $25 */ - tramp[11] = 0x03200008; - /* ori $12,low(codeloc) */ - tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); - -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - -#ifdef USE__BUILTIN___CLEAR_CACHE - __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE); -#else - cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE); -#endif - return FFI_OK; -} - -/* - * Decodes the arguments to a function, which will be stored on the - * stack. AR is the pointer to the beginning of the integer arguments - * (and, depending upon the arguments, some floating-point arguments - * as well). FPR is a pointer to the area where floating point - * registers have been saved, if any. - * - * RVALUE is the location where the function return value will be - * stored. CLOSURE is the prepared closure to invoke. - * - * This function should only be called from assembly, which is in - * turn called from a trampoline. - * - * Returns the function return type. - * - * Based on the similar routine for sparc. - */ -int -ffi_closure_mips_inner_O32 (ffi_closure *closure, - void *rvalue, ffi_arg *ar, - double *fpr) -{ - ffi_cif *cif; - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn, seen_int; - - cif = closure->cif; - avalue = alloca (cif->nargs * sizeof (ffi_arg)); - avaluep = alloca (cif->nargs * sizeof (ffi_arg)); - - seen_int = (cif->abi == FFI_O32_SOFT_FLOAT); - argn = 0; - - if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) - { - rvalue = (void *)(UINT32)ar[0]; - argn = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - if (i < 2 && !seen_int && - (arg_types[i]->type == FFI_TYPE_FLOAT || - arg_types[i]->type == FFI_TYPE_DOUBLE || - arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) - { -#if defined(__MIPSEB__) || defined(_MIPSEB) - if (arg_types[i]->type == FFI_TYPE_FLOAT) - avaluep[i] = ((char *) &fpr[i]) + sizeof (float); - else -#endif - avaluep[i] = (char *) &fpr[i]; - } - else - { - if (arg_types[i]->alignment == 8 && (argn & 0x1)) - argn++; - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - avaluep[i] = &avalue[i]; - *(SINT8 *) &avalue[i] = (SINT8) ar[argn]; - break; - - case FFI_TYPE_UINT8: - avaluep[i] = &avalue[i]; - *(UINT8 *) &avalue[i] = (UINT8) ar[argn]; - break; - - case FFI_TYPE_SINT16: - avaluep[i] = &avalue[i]; - *(SINT16 *) &avalue[i] = (SINT16) ar[argn]; - break; - - case FFI_TYPE_UINT16: - avaluep[i] = &avalue[i]; - *(UINT16 *) &avalue[i] = (UINT16) ar[argn]; - break; - - default: - avaluep[i] = (char *) &ar[argn]; - break; - } - seen_int = 1; - } - argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - i++; - } - - /* Invoke the closure. */ - (closure->fun) (cif, rvalue, avaluep, closure->user_data); - - if (cif->abi == FFI_O32_SOFT_FLOAT) - { - switch (cif->rtype->type) - { - case FFI_TYPE_FLOAT: - return FFI_TYPE_INT; - case FFI_TYPE_DOUBLE: - return FFI_TYPE_UINT64; - default: - return cif->rtype->type; - } - } - else - { - return cif->rtype->type; - } -} - -#if defined(FFI_MIPS_N32) - -static void -copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type, - int argn, unsigned arg_offset, ffi_arg *ar, - ffi_arg *fpr, int soft_float) -{ - ffi_type **elt_typep = type->elements; - while(*elt_typep) - { - ffi_type *elt_type = *elt_typep; - unsigned o; - char *tp; - char *argp; - char *fpp; - - o = ALIGN(offset, elt_type->alignment); - arg_offset += o - offset; - offset = o; - argn += arg_offset / sizeof(ffi_arg); - arg_offset = arg_offset % sizeof(ffi_arg); - - argp = (char *)(ar + argn); - fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn); - - tp = target + offset; - - if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float) - *(double *)tp = *(double *)fpp; - else - memcpy(tp, argp + arg_offset, elt_type->size); - - offset += elt_type->size; - arg_offset += elt_type->size; - elt_typep++; - argn += arg_offset / sizeof(ffi_arg); - arg_offset = arg_offset % sizeof(ffi_arg); - } -} - -/* - * Decodes the arguments to a function, which will be stored on the - * stack. AR is the pointer to the beginning of the integer - * arguments. FPR is a pointer to the area where floating point - * registers have been saved. - * - * RVALUE is the location where the function return value will be - * stored. CLOSURE is the prepared closure to invoke. - * - * This function should only be called from assembly, which is in - * turn called from a trampoline. - * - * Returns the function return flags. - * - */ -int -ffi_closure_mips_inner_N32 (ffi_closure *closure, - void *rvalue, ffi_arg *ar, - ffi_arg *fpr) -{ - ffi_cif *cif; - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn; - int soft_float; - ffi_arg *argp; - - cif = closure->cif; - soft_float = cif->abi == FFI_N64_SOFT_FLOAT - || cif->abi == FFI_N32_SOFT_FLOAT; - avalue = alloca (cif->nargs * sizeof (ffi_arg)); - avaluep = alloca (cif->nargs * sizeof (ffi_arg)); - - argn = 0; - - if (cif->rstruct_flag) - { -#if _MIPS_SIM==_ABIN32 - rvalue = (void *)(UINT32)ar[0]; -#else /* N64 */ - rvalue = (void *)ar[0]; -#endif - argn = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - if (arg_types[i]->type == FFI_TYPE_FLOAT - || arg_types[i]->type == FFI_TYPE_DOUBLE - || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) - { - argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn; - if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1))) - { - argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment); - argn++; - } -#if defined(__MIPSEB__) || defined(_MIPSEB) - if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) - avaluep[i] = ((char *) argp) + sizeof (float); - else -#endif - avaluep[i] = (char *) argp; - } - else - { - unsigned type = arg_types[i]->type; - - if (arg_types[i]->alignment > sizeof(ffi_arg)) - argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg)); - - argp = ar + argn; - - /* The size of a pointer depends on the ABI */ - if (type == FFI_TYPE_POINTER) - type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT) - ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; - - if (soft_float && type == FFI_TYPE_FLOAT) - type = FFI_TYPE_UINT32; - - switch (type) - { - case FFI_TYPE_SINT8: - avaluep[i] = &avalue[i]; - *(SINT8 *) &avalue[i] = (SINT8) *argp; - break; - - case FFI_TYPE_UINT8: - avaluep[i] = &avalue[i]; - *(UINT8 *) &avalue[i] = (UINT8) *argp; - break; - - case FFI_TYPE_SINT16: - avaluep[i] = &avalue[i]; - *(SINT16 *) &avalue[i] = (SINT16) *argp; - break; - - case FFI_TYPE_UINT16: - avaluep[i] = &avalue[i]; - *(UINT16 *) &avalue[i] = (UINT16) *argp; - break; - - case FFI_TYPE_SINT32: - avaluep[i] = &avalue[i]; - *(SINT32 *) &avalue[i] = (SINT32) *argp; - break; - - case FFI_TYPE_UINT32: - avaluep[i] = &avalue[i]; - *(UINT32 *) &avalue[i] = (UINT32) *argp; - break; - - case FFI_TYPE_STRUCT: - if (argn < 8) - { - /* Allocate space for the struct as at least part of - it was passed in registers. */ - avaluep[i] = alloca(arg_types[i]->size); - copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i], - argn, 0, ar, fpr, soft_float); - - break; - } - /* Else fall through. */ - default: - avaluep[i] = (char *) argp; - break; - } - } - argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); - i++; - } - - /* Invoke the closure. */ - (closure->fun) (cif, rvalue, avaluep, closure->user_data); - - return cif->flags >> (FFI_FLAG_BITS * 8); -} - -#endif /* FFI_MIPS_N32 */ - -#endif /* FFI_CLOSURES */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/mips/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/mips/ffitarget.h deleted file mode 100644 index 717d65951..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/mips/ffitarget.h +++ /dev/null @@ -1,247 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for MIPS. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifdef linux -# include -#elif defined(__rtems__) -/* - * Subprogram calling convention - copied from sgidefs.h - */ -#define _MIPS_SIM_ABI32 1 -#define _MIPS_SIM_NABI32 2 -#define _MIPS_SIM_ABI64 3 -#elif !defined(__OpenBSD__) -# include -#endif - -# ifndef _ABIN32 -# define _ABIN32 _MIPS_SIM_NABI32 -# endif -# ifndef _ABI64 -# define _ABI64 _MIPS_SIM_ABI64 -# endif -# ifndef _ABIO32 -# define _ABIO32 _MIPS_SIM_ABI32 -# endif - -#if !defined(_MIPS_SIM) -# error -- something is very wrong -- -#else -# if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) -# define FFI_MIPS_N32 -# else -# if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) -# define FFI_MIPS_O32 -# else -# error -- this is an unsupported platform -- -# endif -# endif -#endif - -#ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -# define FFI_SIZEOF_ARG 4 -#else -/* N32 and N64 frames have 64bit integer args */ -# define FFI_SIZEOF_ARG 8 -# if _MIPS_SIM == _ABIN32 -# define FFI_SIZEOF_JAVA_RAW 4 -# endif -#endif - -#define FFI_FLAG_BITS 2 - -/* SGI's strange assembler requires that we multiply by 4 rather - than shift left by FFI_FLAG_BITS */ - -#define FFI_ARGS_D FFI_TYPE_DOUBLE -#define FFI_ARGS_F FFI_TYPE_FLOAT -#define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE -#define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT -#define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT -#define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE - -/* Needed for N32 structure returns */ -#define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 -#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 - -#if 0 -/* The SGI assembler can't handle this.. */ -#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT -/* (and so on) */ -#else -/* ...so we calculate these by hand! */ -#define FFI_TYPE_STRUCT_D 61 -#define FFI_TYPE_STRUCT_F 45 -#define FFI_TYPE_STRUCT_DD 253 -#define FFI_TYPE_STRUCT_FF 173 -#define FFI_TYPE_STRUCT_FD 237 -#define FFI_TYPE_STRUCT_DF 189 -#define FFI_TYPE_STRUCT_SMALL 93 -#define FFI_TYPE_STRUCT_SMALL2 109 - -/* and for n32 soft float, add 16 * 2^4 */ -#define FFI_TYPE_STRUCT_D_SOFT 317 -#define FFI_TYPE_STRUCT_F_SOFT 301 -#define FFI_TYPE_STRUCT_DD_SOFT 509 -#define FFI_TYPE_STRUCT_FF_SOFT 429 -#define FFI_TYPE_STRUCT_FD_SOFT 493 -#define FFI_TYPE_STRUCT_DF_SOFT 445 -#define FFI_TYPE_STRUCT_SOFT 16 -#endif - -#ifdef LIBFFI_ASM -#define v0 $2 -#define v1 $3 -#define a0 $4 -#define a1 $5 -#define a2 $6 -#define a3 $7 -#define a4 $8 -#define a5 $9 -#define a6 $10 -#define a7 $11 -#define t0 $8 -#define t1 $9 -#define t2 $10 -#define t3 $11 -#define t4 $12 -#define t5 $13 -#define t6 $14 -#define t7 $15 -#define t8 $24 -#define t9 $25 -#define ra $31 - -#ifdef FFI_MIPS_O32 -# define REG_L lw -# define REG_S sw -# define SUBU subu -# define ADDU addu -# define SRL srl -# define LI li -#else /* !FFI_MIPS_O32 */ -# define REG_L ld -# define REG_S sd -# define SUBU dsubu -# define ADDU daddu -# define SRL dsrl -# define LI dli -# if (_MIPS_SIM==_ABI64) -# define LA dla -# define EH_FRAME_ALIGN 3 -# define FDE_ADDR_BYTES .8byte -# else -# define LA la -# define EH_FRAME_ALIGN 2 -# define FDE_ADDR_BYTES .4byte -# endif /* _MIPS_SIM==_ABI64 */ -#endif /* !FFI_MIPS_O32 */ -#else /* !LIBFFI_ASM */ -# ifdef __GNUC__ -# ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); -typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); -#else -/* N32 and N64 frames have 64bit integer args */ -typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); -typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); -# endif -# else -# ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -typedef __uint32_t ffi_arg; -typedef __int32_t ffi_sarg; -# else -/* N32 and N64 frames have 64bit integer args */ -typedef __uint64_t ffi_arg; -typedef __int64_t ffi_sarg; -# endif -# endif /* __GNUC__ */ - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_O32, - FFI_N32, - FFI_N64, - FFI_O32_SOFT_FLOAT, - FFI_N32_SOFT_FLOAT, - FFI_N64_SOFT_FLOAT, - FFI_LAST_ABI, - -#ifdef FFI_MIPS_O32 -#ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT -#else - FFI_DEFAULT_ABI = FFI_O32 -#endif -#else -# if _MIPS_SIM==_ABI64 -# ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT -# else - FFI_DEFAULT_ABI = FFI_N64 -# endif -# else -# ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT -# else - FFI_DEFAULT_ABI = FFI_N32 -# endif -# endif -#endif -} ffi_abi; - -#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag -#endif /* !LIBFFI_ASM */ - -/* ---- Definitions for closures ----------------------------------------- */ - -#if defined(FFI_MIPS_O32) -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 20 -#else -/* N32/N64. */ -# define FFI_CLOSURES 1 -#if _MIPS_SIM==_ABI64 -#define FFI_TRAMPOLINE_SIZE 52 -#else -#define FFI_TRAMPOLINE_SIZE 20 -#endif -#endif /* FFI_MIPS_O32 */ -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/mips/n32.S b/third_party/python/Modules/_ctypes/libffi/src/mips/n32.S deleted file mode 100644 index c6985d30a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/mips/n32.S +++ /dev/null @@ -1,576 +0,0 @@ -/* ----------------------------------------------------------------------- - n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. - - MIPS Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Only build this code if we are compiling for n32 */ - -#if defined(FFI_MIPS_N32) - -#define callback a0 -#define bytes a2 -#define flags a3 -#define raddr a4 -#define fn a5 - -#define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) - -#ifdef __GNUC__ - .abicalls -#endif - .set mips4 - .text - .align 2 - .globl ffi_call_N32 - .ent ffi_call_N32 -ffi_call_N32: -.LFB3: - .frame $fp, SIZEOF_FRAME, ra - .mask 0xc0000000,-FFI_SIZEOF_ARG - .fmask 0x00000000,0 - - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -.LCFI0: - REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer - REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address -.LCFI1: - move $fp, $sp -.LCFI3: - move t9, callback # callback function pointer - REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes - REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags - REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr - REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn - - # Allocate at least 4 words in the argstack - move v0, bytes - bge bytes, 4 * FFI_SIZEOF_ARG, bigger - LI v0, 4 * FFI_SIZEOF_ARG - b sixteen - - bigger: - ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned - and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. - -sixteen: - SUBU $sp, $sp, v0 # move the stack pointer to reflect the - # arg space - - move a0, $sp # 4 * FFI_SIZEOF_ARG - ADDU a3, $fp, 3 * FFI_SIZEOF_ARG - - # Call ffi_prep_args - jal t9 - - # Copy the stack pointer to t9 - move t9, $sp - - # Fix the stack if there are more than 8 64bit slots worth - # of arguments. - - # Load the number of bytes - REG_L t6, 2*FFI_SIZEOF_ARG($fp) - - # Is it bigger than 8 * FFI_SIZEOF_ARG? - daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) - bltz t8, loadregs - - ADDU t9, t9, t8 - -loadregs: - - REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. - - and t4, t6, ((1< -#include - -/* Only build this code if we are compiling for o32 */ - -#if defined(FFI_MIPS_O32) - -#define callback a0 -#define bytes a2 -#define flags a3 - -#define SIZEOF_FRAME (4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG) -#define A3_OFF (SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG) -#define FP_OFF (SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG) -#define RA_OFF (SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG) - - .abicalls - .text - .align 2 - .globl ffi_call_O32 - .ent ffi_call_O32 -ffi_call_O32: -$LFB0: - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -$LCFI0: - REG_S $fp, FP_OFF($sp) # Save frame pointer -$LCFI1: - REG_S ra, RA_OFF($sp) # Save return address -$LCFI2: - move $fp, $sp - -$LCFI3: - move t9, callback # callback function pointer - REG_S flags, A3_OFF($fp) # flags - - # Allocate at least 4 words in the argstack - LI v0, 4 * FFI_SIZEOF_ARG - blt bytes, v0, sixteen - - ADDU v0, bytes, 7 # make sure it is aligned - and v0, -8 # to an 8 byte boundry - -sixteen: - SUBU $sp, v0 # move the stack pointer to reflect the - # arg space - - ADDU a0, $sp, 4 * FFI_SIZEOF_ARG - - jalr t9 - - REG_L t0, A3_OFF($fp) # load the flags word - SRL t2, t0, 4 # shift our arg info - and t0, ((1<<4)-1) # mask out the return type - - ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args - - bnez t0, pass_d # make it quick for int - REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the - REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs. - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_d: - bne t0, FFI_ARGS_D, pass_f - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - REG_L a2, 2*FFI_SIZEOF_ARG($sp) # passing a double - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_f: - bne t0, FFI_ARGS_F, pass_d_d - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - REG_L a1, 1*FFI_SIZEOF_ARG($sp) # passing a float - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_d_d: - bne t0, FFI_ARGS_DD, pass_f_f - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing two doubles - b call_it - -pass_f_f: - bne t0, FFI_ARGS_FF, pass_d_f - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.s $f14, 1*FFI_SIZEOF_ARG($sp) # passing two floats - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_d_f: - bne t0, FFI_ARGS_DF, pass_f_d - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.s $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_f_d: - # assume that the only other combination must be float then double - # bne t0, FFI_ARGS_F_D, call_it - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float - -call_it: - # Load the function pointer - REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp) - - # If the return value pointer is NULL, assume no return value. - REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - beqz t1, noretval - - bne t2, FFI_TYPE_INT, retlonglong - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - REG_S v0, 0(t0) - b epilogue - -retlonglong: - # Really any 64-bit int, signed or not. - bne t2, FFI_TYPE_UINT64, retfloat - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - REG_S v1, 4(t0) - REG_S v0, 0(t0) - b epilogue - -retfloat: - bne t2, FFI_TYPE_FLOAT, retdouble - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - s.s $f0, 0(t0) - b epilogue - -retdouble: - bne t2, FFI_TYPE_DOUBLE, noretval - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - s.d $f0, 0(t0) - b epilogue - -noretval: - jalr t9 - - # Epilogue -epilogue: - move $sp, $fp - REG_L $fp, FP_OFF($sp) # Restore frame pointer - REG_L ra, RA_OFF($sp) # Restore return address - ADDU $sp, SIZEOF_FRAME # Fix stack pointer - j ra - -$LFE0: - .end ffi_call_O32 - - -/* ffi_closure_O32. Expects address of the passed-in ffi_closure - in t4 ($12). Stores any arguments passed in registers onto the - stack, then calls ffi_closure_mips_inner_O32, which - then decodes them. - - Stack layout: - - 3 - a3 save - 2 - a2 save - 1 - a1 save - 0 - a0 save, original sp - -1 - ra save - -2 - fp save - -3 - $16 (s0) save - -4 - cprestore - -5 - return value high (v1) - -6 - return value low (v0) - -7 - f14 (le high, be low) - -8 - f14 (le low, be high) - -9 - f12 (le high, be low) - -10 - f12 (le low, be high) - -11 - Called function a3 save - -12 - Called function a2 save - -13 - Called function a1 save - -14 - Called function a0 save, our sp and fp point here - */ - -#define SIZEOF_FRAME2 (14 * FFI_SIZEOF_ARG) -#define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG) -#define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG) -#define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG) -#define A0_OFF2 (SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG) -#define RA_OFF2 (SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG) -#define FP_OFF2 (SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG) -#define S0_OFF2 (SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG) -#define GP_OFF2 (SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG) -#define V1_OFF2 (SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG) -#define V0_OFF2 (SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG) -#define FA_1_1_OFF2 (SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG) -#define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG) -#define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG) -#define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG) - - .text - .align 2 - .globl ffi_closure_O32 - .ent ffi_closure_O32 -ffi_closure_O32: -$LFB1: - # Prologue - .frame $fp, SIZEOF_FRAME2, ra - .set noreorder - .cpload t9 - .set reorder - SUBU $sp, SIZEOF_FRAME2 - .cprestore GP_OFF2 -$LCFI4: - REG_S $16, S0_OFF2($sp) # Save s0 - REG_S $fp, FP_OFF2($sp) # Save frame pointer - REG_S ra, RA_OFF2($sp) # Save return address -$LCFI6: - move $fp, $sp - -$LCFI7: - # Store all possible argument registers. If there are more than - # four arguments, then they are stored above where we put a3. - REG_S a0, A0_OFF2($fp) - REG_S a1, A1_OFF2($fp) - REG_S a2, A2_OFF2($fp) - REG_S a3, A3_OFF2($fp) - - # Load ABI enum to s0 - REG_L $16, 20($12) # cif pointer follows tramp. - REG_L $16, 0($16) # abi is first member. - - li $13, 1 # FFI_O32 - bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT - - # Store all possible float/double registers. - s.d $f12, FA_0_0_OFF2($fp) - s.d $f14, FA_1_0_OFF2($fp) -1: - # Call ffi_closure_mips_inner_O32 to do the work. - la t9, ffi_closure_mips_inner_O32 - move a0, $12 # Pointer to the ffi_closure - addu a1, $fp, V0_OFF2 - addu a2, $fp, A0_OFF2 - addu a3, $fp, FA_0_0_OFF2 - jalr t9 - - # Load the return value into the appropriate register. - move $8, $2 - li $9, FFI_TYPE_VOID - beq $8, $9, closure_done - - li $13, 1 # FFI_O32 - bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT - - li $9, FFI_TYPE_FLOAT - l.s $f0, V0_OFF2($fp) - beq $8, $9, closure_done - - li $9, FFI_TYPE_DOUBLE - l.d $f0, V0_OFF2($fp) - beq $8, $9, closure_done -1: - REG_L $3, V1_OFF2($fp) - REG_L $2, V0_OFF2($fp) - -closure_done: - # Epilogue - move $sp, $fp - REG_L $16, S0_OFF2($sp) # Restore s0 - REG_L $fp, FP_OFF2($sp) # Restore frame pointer - REG_L ra, RA_OFF2($sp) # Restore return address - ADDU $sp, SIZEOF_FRAME2 - j ra -$LFE1: - .end ffi_closure_O32 - -/* DWARF-2 unwind info. */ - - .section .eh_frame,"a",@progbits -$Lframe0: - .4byte $LECIE0-$LSCIE0 # Length of Common Information Entry -$LSCIE0: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 4 # CIE Data Alignment Factor - .byte 0x1f # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x00 # FDE Encoding (absptr) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1d - .uleb128 0x0 - .align 2 -$LECIE0: -$LSFDE0: - .4byte $LEFDE0-$LASFDE0 # FDE Length -$LASFDE0: - .4byte $LASFDE0-$Lframe0 # FDE CIE offset - .4byte $LFB0 # FDE initial location - .4byte $LFE0-$LFB0 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI0-$LFB0 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x18 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI2-$LCFI0 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1e # $fp - .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1f # $ra - .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI3-$LCFI2 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x18 - .align 2 -$LEFDE0: -$LSFDE1: - .4byte $LEFDE1-$LASFDE1 # FDE Length -$LASFDE1: - .4byte $LASFDE1-$Lframe0 # FDE CIE offset - .4byte $LFB1 # FDE initial location - .4byte $LFE1-$LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI4-$LFB1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x38 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI6-$LCFI4 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x10 # $16 - .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1e # $fp - .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1f # $ra - .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI7-$LCFI6 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x38 - .align 2 -$LEFDE1: - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/moxie/eabi.S b/third_party/python/Modules/_ctypes/libffi/src/moxie/eabi.S deleted file mode 100644 index ac7aceb1a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/moxie/eabi.S +++ /dev/null @@ -1,101 +0,0 @@ -/* ----------------------------------------------------------------------- - eabi.S - Copyright (c) 2012, 2013 Anthony Green - - Moxie Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .globl ffi_prep_args_EABI - - .text - .p2align 4 - .globl ffi_call_EABI - .type ffi_call_EABI, @function - - # $r0 : ffi_prep_args - # $r1 : &ecif - # $r2 : cif->bytes - # $r3 : fig->flags - # $r4 : ecif.rvalue - # $r5 : fn - -ffi_call_EABI: - push $sp, $r6 - push $sp, $r7 - push $sp, $r8 - dec $sp, 24 - - /* Store incoming args on stack. */ - sto.l 0($sp), $r0 /* ffi_prep_args */ - sto.l 4($sp), $r1 /* ecif */ - sto.l 8($sp), $r2 /* bytes */ - sto.l 12($sp), $r3 /* flags */ - sto.l 16($sp), $r4 /* &rvalue */ - sto.l 20($sp), $r5 /* fn */ - - /* Call ffi_prep_args. */ - mov $r6, $r4 /* Save result buffer */ - mov $r7, $r5 /* Save the target fn */ - mov $r8, $r3 /* Save the flags */ - sub.l $sp, $r2 /* Allocate stack space */ - mov $r0, $sp /* We can stomp over $r0 */ - /* $r1 is already set up */ - jsra ffi_prep_args - - /* Load register arguments. */ - ldo.l $r0, 0($sp) - ldo.l $r1, 4($sp) - ldo.l $r2, 8($sp) - ldo.l $r3, 12($sp) - ldo.l $r4, 16($sp) - ldo.l $r5, 20($sp) - - /* Call the target function. */ - jsr $r7 - - ldi.l $r7, 0xffffffff - cmp $r8, $r7 - beq retstruct - - ldi.l $r7, 4 - cmp $r8, $r7 - bgt ret2reg - - st.l ($r6), $r0 - jmpa retdone - -ret2reg: - st.l ($r6), $r0 - sto.l 4($r6), $r1 - -retstruct: -retdone: - /* Return. */ - ldo.l $r6, -4($fp) - ldo.l $r7, -8($fp) - ldo.l $r8, -12($fp) - ret - .size ffi_call_EABI, .-ffi_call_EABI - diff --git a/third_party/python/Modules/_ctypes/libffi/src/moxie/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/moxie/ffi.c deleted file mode 100644 index 540a04299..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/moxie/ffi.c +++ /dev/null @@ -1,272 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2012, 2013 Anthony Green - - Moxie Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void *ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - register int count = 0; - - p_argv = ecif->avalue; - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - z = sizeof(void*); - *(void **) argp = *p_argv; - } - else if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - count += z; - } - - return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = -1; - else - cif->flags = cif->rtype->size; - - cif->bytes = ALIGN (cif->bytes, 8); - - return FFI_OK; -} - -extern void ffi_call_EABI(void *(*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, - unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_EABI: - ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, - unsigned arg4, unsigned arg5, unsigned arg6) -{ - /* This function is called by a trampoline. The trampoline stows a - pointer to the ffi_closure object in $r7. We must save this - pointer in a place that will persist while we do our work. */ - register ffi_closure *creg __asm__ ("$r12"); - ffi_closure *closure = creg; - - /* Arguments that don't fit in registers are found on the stack - at a fixed offset above the current frame pointer. */ - register char *frame_pointer __asm__ ("$fp"); - - /* Pointer to a struct return value. */ - void *struct_rvalue = (void *) arg1; - - /* 6 words reserved for register args + 3 words from jsr */ - char *stack_args = frame_pointer + 9*4; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { arg1, arg2, arg3, arg4, arg5, arg6 }; - char *register_args_ptr = (char *) register_args; - - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - void **avalue = alloca (cif->nargs * sizeof(void *)); - char *ptr = (char *) register_args; - int i; - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - ptr += 4; - register_args_ptr = (char *)®ister_args[1]; - } - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = ptr + 3; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = ptr + 2; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - avalue[i] = ptr; - break; - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - default: - /* This is an 8-byte value. */ - avalue[i] = ptr; - ptr += 4; - break; - } - ptr += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - if (ptr == ®ister_args[6]) - ptr = stack_args; - } - - /* Invoke the closure. */ - if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); - } - else - { - /* Allocate space for the return value and call the function. */ - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); - } -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned short *tramp = (unsigned short *) &closure->tramp[0]; - unsigned long fn = (long) ffi_closure_eabi; - unsigned long cls = (long) codeloc; - - if (cif->abi != FFI_EABI) - return FFI_BAD_ABI; - - fn = (unsigned long) ffi_closure_eabi; - - tramp[0] = 0x01e0; /* ldi.l $r7, .... */ - tramp[1] = cls >> 16; - tramp[2] = cls & 0xffff; - tramp[3] = 0x1a00; /* jmpa .... */ - tramp[4] = fn >> 16; - tramp[5] = fn & 0xffff; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/moxie/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/moxie/ffitarget.h deleted file mode 100644 index 623e3ece5..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/moxie/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2013 Anthony Green - Target configuration macros for Moxie - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_EABI, - FFI_DEFAULT_ABI = FFI_EABI, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -/* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ -#define FFI_TRAMPOLINE_SIZE (12) - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/nios2/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/nios2/ffi.c deleted file mode 100644 index 2efa033f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/nios2/ffi.c +++ /dev/null @@ -1,304 +0,0 @@ -/* libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - - -#include -#include - -#include - -/* The Nios II Processor Reference Handbook defines the procedure call - ABI as follows. - - Arguments are passed as if a structure containing the types of - the arguments were constructed. The first 16 bytes are passed in r4 - through r7, the remainder on the stack. The first 16 bytes of a function - taking variable arguments are passed in r4-r7 in the same way. - - Return values of types up to 8 bytes are returned in r2 and r3. For - return values greater than 8 bytes, the caller must allocate memory for - the result and pass the address as if it were argument 0. - - While this isn't specified explicitly in the ABI documentation, GCC - promotes integral arguments smaller than int size to 32 bits. - - Also of note, the ABI specifies that all structure objects are - aligned to 32 bits even if all their fields have a smaller natural - alignment. See FFI_AGGREGATE_ALIGNMENT. */ - - -/* Declare the assembly language hooks. */ - -extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *), - extended_cif *, - unsigned, - void (*fn) (void)); -extern void ffi_closure_sysv (void); - -/* Perform machine-dependent cif processing. */ - -ffi_status ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* We always want at least 16 bytes in the parameter block since it - simplifies the low-level call function. Also round the parameter - block size up to a multiple of 4 bytes to preserve - 32-bit alignment of the stack pointer. */ - if (cif->bytes < 16) - cif->bytes = 16; - else - cif->bytes = (cif->bytes + 3) & ~3; - - return FFI_OK; -} - - -/* ffi_prep_args is called by the assembly routine to transfer arguments - to the stack using the pointers in the ecif array. - Note that the stack buffer is big enough to fit all the arguments, - but the first 16 bytes will be copied to registers for the actual - call. */ - -void ffi_prep_args (char *stack, extended_cif *ecif) -{ - char *argp = stack; - unsigned int i; - - /* The implicit return value pointer is passed as if it were a hidden - first argument. */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && ecif->cif->rtype->size > 8) - { - (*(void **) argp) = ecif->rvalue; - argp += 4; - } - - for (i = 0; i < ecif->cif->nargs; i++) - { - void *avalue = ecif->avalue[i]; - ffi_type *atype = ecif->cif->arg_types[i]; - size_t size = atype->size; - size_t alignment = atype->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) ALIGN (argp, alignment); - - /* Copy the argument, promoting integral types smaller than a - word to word size. */ - if (size < sizeof (int)) - { - size = sizeof (int); - switch (atype->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) avalue; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) avalue; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue; - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, avalue, atype->size); - break; - - default: - FFI_ASSERT(0); - } - } - else if (size == sizeof (int)) - *(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue; - else - memcpy (argp, avalue, size); - argp += size; - } -} - - -/* Call FN using the prepared CIF. RVALUE points to space allocated by - the caller for the return value, and AVALUE is an array of argument - pointers. */ - -void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - - extended_cif ecif; - UINT64 result; - - /* If bigret is true, this is the case where a return value of larger - than 8 bytes is handled by being passed by reference as an implicit - argument. */ - int bigret = (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8); - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Allocate space for return value if this is the pass-by-reference case - and the caller did not provide a buffer. */ - if (rvalue == NULL && bigret) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn); - - /* Now result contains the 64 bit contents returned from fn in - r2 and r3. Copy the value of the appropriate size to the user-provided - rvalue buffer. */ - if (rvalue && !bigret) - switch (cif->rtype->size) - { - case 1: - *(UINT8 *)rvalue = (UINT8) result; - break; - case 2: - *(UINT16 *)rvalue = (UINT16) result; - break; - case 4: - *(UINT32 *)rvalue = (UINT32) result; - break; - case 8: - *(UINT64 *)rvalue = (UINT64) result; - break; - default: - memcpy (rvalue, (void *)&result, cif->rtype->size); - break; - } -} - -/* This function is invoked from the closure trampoline to invoke - CLOSURE with argument block ARGS. Parse ARGS according to - CLOSURE->cfi and invoke CLOSURE->fun. */ - -static UINT64 -ffi_closure_helper (unsigned char *args, - ffi_closure *closure) -{ - ffi_cif *cif = closure->cif; - unsigned char *argp = args; - void **parsed_args = alloca (cif->nargs * sizeof (void *)); - UINT64 result; - void *retptr; - unsigned int i; - - /* First figure out what to do about the return type. If this is the - big-structure-return case, the first arg is the hidden return buffer - allocated by the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8) - { - retptr = *((void **) argp); - argp += 4; - } - else - retptr = (void *) &result; - - /* Fill in the array of argument pointers. */ - for (i = 0; i < cif->nargs; i++) - { - size_t size = cif->arg_types[i]->size; - size_t alignment = cif->arg_types[i]->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) ALIGN (argp, alignment); - - /* Arguments smaller than an int are promoted to int. */ - if (size < sizeof (int)) - size = sizeof (int); - - /* Store the pointer. */ - parsed_args[i] = argp; - argp += size; - } - - /* Call the user-supplied function. */ - (closure->fun) (cif, retptr, parsed_args, closure->user_data); - return result; -} - - -/* Initialize CLOSURE with a trampoline to call FUN with - CIF and USER_DATA. */ -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun) (ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - int i; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - /* The trampoline looks like: - movhi r8, %hi(ffi_closure_sysv) - ori r8, r8, %lo(ffi_closure_sysv) - movhi r9, %hi(ffi_closure_helper) - ori r0, r9, %lo(ffi_closure_helper) - movhi r10, %hi(closure) - ori r10, r10, %lo(closure) - jmp r8 - and then ffi_closure_sysv retrieves the closure pointer out of r10 - in addition to the arguments passed in the normal way for the call, - and invokes ffi_closure_helper. We encode the pointer to - ffi_closure_helper in the trampoline because making a PIC call - to it in ffi_closure_sysv would be messy (it would have to indirect - through the GOT). */ - -#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) -#define LO(x) (((unsigned int) (x)) & 0xffff) - tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34; - tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14; - tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34; - tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14; - tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34; - tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14; - tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a; -#undef HI -#undef LO - - /* Flush the caches. - See Example 9-4 in the Nios II Software Developer's Handbook. */ - for (i = 0; i < 7; i++) - asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory"); - asm volatile ("flushp" ::: "memory"); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - diff --git a/third_party/python/Modules/_ctypes/libffi/src/nios2/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/nios2/ffitarget.h deleted file mode 100644 index 134d118c1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/nios2/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* libffi target includes for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* Structures have a 4-byte alignment even if all the fields have lesser - alignment requirements. */ -#define FFI_AGGREGATE_ALIGNMENT 4 - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */ -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/nios2/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/nios2/sysv.S deleted file mode 100644 index 75f442bbe..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/nios2/sysv.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Low-level libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -/* This function is declared on the C side as - - extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *), - extended_cif *ecif, - unsigned nbytes, - void (*fn) (void)); - - On input, the arguments appear as - r4 = arghook - r5 = ecif - r6 = nbytes - r7 = fn -*/ - - .section .text - .align 2 - .global ffi_call_sysv - .type ffi_call_sysv, @function - -ffi_call_sysv: - .cfi_startproc - - /* Create the stack frame, saving r16 so we can use it locally. */ - addi sp, sp, -12 - .cfi_def_cfa_offset 12 - stw ra, 8(sp) - stw fp, 4(sp) - stw r16, 0(sp) - .cfi_offset 31, -4 - .cfi_offset 28, -8 - .cfi_offset 16, -12 - mov fp, sp - .cfi_def_cfa_register 28 - mov r16, r7 - - /* Adjust the stack pointer to create the argument buffer - nbytes long. */ - sub sp, sp, r6 - - /* Call the arghook function. */ - mov r2, r4 /* fn */ - mov r4, sp /* argbuffer */ - callr r2 /* r5 already contains ecif */ - - /* Pop off the first 16 bytes of the argument buffer on the stack, - transferring the contents to the argument registers. */ - ldw r4, 0(sp) - ldw r5, 4(sp) - ldw r6, 8(sp) - ldw r7, 12(sp) - addi sp, sp, 16 - - /* Call the user function, which leaves its result in r2 and r3. */ - callr r16 - - /* Pop off the stack frame. */ - mov sp, fp - ldw ra, 8(sp) - ldw fp, 4(sp) - ldw r16, 0(sp) - addi sp, sp, 12 - ret - .cfi_endproc - .size ffi_call_sysv, .-ffi_call_sysv - - -/* Closure trampolines jump here after putting the C helper address - in r9 and the closure pointer in r10. The user-supplied arguments - to the closure are in the normal places, in r4-r7 and on the - stack. Push the register arguments on the stack too and then call the - C helper function to deal with them. */ - - .section .text - .align 2 - .global ffi_closure_sysv - .type ffi_closure_sysv, @function - -ffi_closure_sysv: - .cfi_startproc - - /* Create the stack frame, pushing the register args on the stack - just below the stack args. This is the same trick illustrated - in Figure 7-3 in the Nios II Processor Reference Handbook, used - for variable arguments and structures passed by value. */ - addi sp, sp, -20 - .cfi_def_cfa_offset 20 - stw ra, 0(sp) - .cfi_offset 31, -20 - stw r4, 4(sp) - .cfi_offset 4, -16 - stw r5, 8(sp) - .cfi_offset 5, -12 - stw r6, 12(sp) - .cfi_offset 6, -8 - stw r7, 16(sp) - .cfi_offset 7, -4 - - /* Call the helper. - r4 = pointer to arguments on stack - r5 = closure pointer (loaded in r10 by the trampoline) - r9 = address of helper function (loaded by trampoline) */ - addi r4, sp, 4 - mov r5, r10 - callr r9 - - /* Pop the stack and return. */ - ldw ra, 0(sp) - addi sp, sp, 20 - .cfi_def_cfa_offset -20 - ret - .cfi_endproc - .size ffi_closure_sysv, .-ffi_closure_sysv - diff --git a/third_party/python/Modules/_ctypes/libffi/src/pa/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/pa/ffi.c deleted file mode 100644 index 4ce2bc6f0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/pa/ffi.c +++ /dev/null @@ -1,719 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - (c) 2011 Anthony Green - (c) 2008 Red Hat, Inc. - (c) 2006 Free Software Foundation, Inc. - (c) 2003-2004 Randolph Chung - - HPPA Foreign Function Interface - HP-UX PA ABI support - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) - -#define MIN_STACK_SIZE 64 -#define FIRST_ARG_SLOT 9 -#define DEBUG_LEVEL 0 - -#define fldw(addr, fpreg) \ - __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) -#define fstw(fpreg, addr) \ - __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) -#define fldd(addr, fpreg) \ - __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) -#define fstd(fpreg, addr) \ - __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) - -#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) - -static inline int ffi_struct_type(ffi_type *t) -{ - size_t sz = t->size; - - /* Small structure results are passed in registers, - larger ones are passed by pointer. Note that - small structures of size 2, 4 and 8 differ from - the corresponding integer types in that they have - different alignment requirements. */ - - if (sz <= 1) - return FFI_TYPE_UINT8; - else if (sz == 2) - return FFI_TYPE_SMALL_STRUCT2; - else if (sz == 3) - return FFI_TYPE_SMALL_STRUCT3; - else if (sz == 4) - return FFI_TYPE_SMALL_STRUCT4; - else if (sz == 5) - return FFI_TYPE_SMALL_STRUCT5; - else if (sz == 6) - return FFI_TYPE_SMALL_STRUCT6; - else if (sz == 7) - return FFI_TYPE_SMALL_STRUCT7; - else if (sz <= 8) - return FFI_TYPE_SMALL_STRUCT8; - else - return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ -} - -/* PA has a downward growing stack, which looks like this: - - Offset - [ Variable args ] - SP = (4*(n+9)) arg word N - ... - SP-52 arg word 4 - [ Fixed args ] - SP-48 arg word 3 - SP-44 arg word 2 - SP-40 arg word 1 - SP-36 arg word 0 - [ Frame marker ] - ... - SP-20 RP - SP-4 previous SP - - The first four argument words on the stack are reserved for use by - the callee. Instead, the general and floating registers replace - the first four argument slots. Non FP arguments are passed solely - in the general registers. FP arguments are passed in both general - and floating registers when using libffi. - - Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23. - Non-FP 64-bit args are passed in register pairs, starting - on an odd numbered register (i.e. r25+r26 and r23+r24). - FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L. - FP 64-bit arguments are passed in fr5 and fr7. - - The registers are allocated in the same manner as stack slots. - This allows the callee to save its arguments on the stack if - necessary: - - arg word 3 -> gr23 or fr7L - arg word 2 -> gr24 or fr6L or fr7R - arg word 1 -> gr25 or fr5L - arg word 0 -> gr26 or fr4L or fr5R - - Note that fr4R and fr6R are never used for arguments (i.e., - doubles are not passed in fr4 or fr6). - - The rest of the arguments are passed on the stack starting at SP-52, - but 64-bit arguments need to be aligned to an 8-byte boundary - - This means we can have holes either in the register allocation, - or in the stack. */ - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments - - The following code will put everything into the stack frame - (which was allocated by the asm routine), and on return - the asm routine will load the arguments that should be - passed by register into the appropriate registers - - NOTE: We load floating point args in this function... that means we - assume gcc will not mess with fp regs in here. */ - -void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes) -{ - register unsigned int i; - register ffi_type **p_arg; - register void **p_argv; - unsigned int slot = FIRST_ARG_SLOT; - char *dest_cpy; - size_t len; - - debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, - ecif, bytes); - - p_arg = ecif->cif->arg_types; - p_argv = ecif->avalue; - - for (i = 0; i < ecif->cif->nargs; i++) - { - int type = (*p_arg)->type; - - switch (type) - { - case FFI_TYPE_SINT8: - *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); - break; - - case FFI_TYPE_UINT8: - *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); - break; - - case FFI_TYPE_SINT16: - *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT16: - *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), - slot); - *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* Align slot for 64-bit type. */ - slot += (slot & 1) ? 1 : 2; - *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); - break; - - case FFI_TYPE_FLOAT: - /* First 4 args go in fr4L - fr7L. */ - debug(3, "Storing UINT32(float) in slot %u\n", slot); - *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); - switch (slot - FIRST_ARG_SLOT) - { - /* First 4 args go in fr4L - fr7L. */ - case 0: fldw(stack - slot, fr4); break; - case 1: fldw(stack - slot, fr5); break; - case 2: fldw(stack - slot, fr6); break; - case 3: fldw(stack - slot, fr7); break; - } - break; - - case FFI_TYPE_DOUBLE: - /* Align slot for 64-bit type. */ - slot += (slot & 1) ? 1 : 2; - debug(3, "Storing UINT64(double) at slot %u\n", slot); - *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); - switch (slot - FIRST_ARG_SLOT) - { - /* First 2 args go in fr5, fr7. */ - case 1: fldd(stack - slot, fr5); break; - case 3: fldd(stack - slot, fr7); break; - } - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are passed in the same manner as structures - larger than 8 bytes. */ - *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); - break; -#endif - - case FFI_TYPE_STRUCT: - - /* Structs smaller or equal than 4 bytes are passed in one - register. Structs smaller or equal 8 bytes are passed in two - registers. Larger structures are passed by pointer. */ - - len = (*p_arg)->size; - if (len <= 4) - { - dest_cpy = (char *)(stack - slot) + 4 - len; - memcpy(dest_cpy, (char *)*p_argv, len); - } - else if (len <= 8) - { - slot += (slot & 1) ? 1 : 2; - dest_cpy = (char *)(stack - slot) + 8 - len; - memcpy(dest_cpy, (char *)*p_argv, len); - } - else - *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); - break; - - default: - FFI_ASSERT(0); - } - - slot++; - p_arg++; - p_argv++; - } - - /* Make sure we didn't mess up and scribble on the stack. */ - { - unsigned int n; - - debug(5, "Stack setup:\n"); - for (n = 0; n < (bytes + 3) / 4; n++) - { - if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } - debug(5, "%08x ", *(stack - n)); - } - debug(5, "\n"); - } - - FFI_ASSERT(slot * 4 <= bytes); - - return; -} - -static void ffi_size_stack_pa32(ffi_cif *cif) -{ - ffi_type **ptr; - int i; - int z = 0; /* # stack slots */ - - for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) - { - int type = (*ptr)->type; - - switch (type) - { - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - z += 2 + (z & 1); /* must start on even regs, so we may waste one */ - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: -#endif - case FFI_TYPE_STRUCT: - z += 1; /* pass by ptr, callee will copy */ - break; - - default: /* <= 32-bit values */ - z++; - } - } - - /* We can fit up to 6 args in the default 64-byte stack frame, - if we need more, we need more stack. */ - if (z <= 6) - cif->bytes = MIN_STACK_SIZE; /* min stack size */ - else - cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); - - debug(3, "Calculated stack size is %u bytes\n", cif->bytes); -} - -/* Perform machine dependent cif processing. */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are treated like a structure. */ - cif->flags = FFI_TYPE_STRUCT; - break; -#endif - - case FFI_TYPE_STRUCT: - /* For the return type we have to check the size of the structures. - If the size is smaller or equal 4 bytes, the result is given back - in one register. If the size is smaller or equal 8 bytes than we - return the result in two registers. But if the size is bigger than - 8 bytes, we work with pointers. */ - cif->flags = ffi_struct_type(cif->rtype); - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI_TYPE_UINT64; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - /* Lucky us, because of the unique PA ABI we get to do our - own stack sizing. */ - switch (cif->abi) - { - case FFI_PA32: - ffi_size_stack_pa32(cif); - break; - - default: - FFI_ASSERT(0); - break; - } - - return FFI_OK; -} - -extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), - extended_cif *, unsigned, unsigned, unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - - if (rvalue == NULL -#ifdef PA_HPUX - && (cif->rtype->type == FFI_TYPE_STRUCT - || cif->rtype->type == FFI_TYPE_LONGDOUBLE)) -#else - && cif->rtype->type == FFI_TYPE_STRUCT) -#endif - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_PA32: - debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); - ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT(0); - break; - } -} - -#if FFI_CLOSURES -/* This is more-or-less an inverse of ffi_call -- we have arguments on - the stack, and we need to fill them into a cif structure and invoke - the user function. This really ought to be in asm to make sure - the compiler doesn't do things we don't expect. */ -ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack) -{ - ffi_cif *cif; - void **avalue; - void *rvalue; - UINT32 ret[2]; /* function can return up to 64-bits in registers */ - ffi_type **p_arg; - char *tmp; - int i, avn; - unsigned int slot = FIRST_ARG_SLOT; - register UINT32 r28 asm("r28"); - - cif = closure->cif; - - /* If returning via structure, callee will write to our pointer. */ - if (cif->flags == FFI_TYPE_STRUCT) - rvalue = (void *)r28; - else - rvalue = &ret[0]; - - avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); - avn = cif->nargs; - p_arg = cif->arg_types; - - for (i = 0; i < avn; i++) - { - int type = (*p_arg)->type; - - switch (type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - slot += (slot & 1) ? 1 : 2; - avalue[i] = (void *)(stack - slot); - break; - - case FFI_TYPE_FLOAT: -#ifdef PA_LINUX - /* The closure call is indirect. In Linux, floating point - arguments in indirect calls with a prototype are passed - in the floating point registers instead of the general - registers. So, we need to replace what was previously - stored in the current slot with the value in the - corresponding floating point register. */ - switch (slot - FIRST_ARG_SLOT) - { - case 0: fstw(fr4, (void *)(stack - slot)); break; - case 1: fstw(fr5, (void *)(stack - slot)); break; - case 2: fstw(fr6, (void *)(stack - slot)); break; - case 3: fstw(fr7, (void *)(stack - slot)); break; - } -#endif - avalue[i] = (void *)(stack - slot); - break; - - case FFI_TYPE_DOUBLE: - slot += (slot & 1) ? 1 : 2; -#ifdef PA_LINUX - /* See previous comment for FFI_TYPE_FLOAT. */ - switch (slot - FIRST_ARG_SLOT) - { - case 1: fstd(fr5, (void *)(stack - slot)); break; - case 3: fstd(fr7, (void *)(stack - slot)); break; - } -#endif - avalue[i] = (void *)(stack - slot); - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are treated like a big structure. */ - avalue[i] = (void *) *(stack - slot); - break; -#endif - - case FFI_TYPE_STRUCT: - /* Structs smaller or equal than 4 bytes are passed in one - register. Structs smaller or equal 8 bytes are passed in two - registers. Larger structures are passed by pointer. */ - if((*p_arg)->size <= 4) - { - avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - - (*p_arg)->size; - } - else if ((*p_arg)->size <= 8) - { - slot += (slot & 1) ? 1 : 2; - avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - - (*p_arg)->size; - } - else - avalue[i] = (void *) *(stack - slot); - break; - - default: - FFI_ASSERT(0); - } - - slot++; - p_arg++; - } - - /* Invoke the closure. */ - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", ret[0], - ret[1]); - - /* Store the result using the lower 2 bytes of the flags. */ - switch (cif->flags) - { - case FFI_TYPE_UINT8: - *(stack - FIRST_ARG_SLOT) = (UINT8)(ret[0] >> 24); - break; - case FFI_TYPE_SINT8: - *(stack - FIRST_ARG_SLOT) = (SINT8)(ret[0] >> 24); - break; - case FFI_TYPE_UINT16: - *(stack - FIRST_ARG_SLOT) = (UINT16)(ret[0] >> 16); - break; - case FFI_TYPE_SINT16: - *(stack - FIRST_ARG_SLOT) = (SINT16)(ret[0] >> 16); - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - *(stack - FIRST_ARG_SLOT) = ret[0]; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - *(stack - FIRST_ARG_SLOT) = ret[0]; - *(stack - FIRST_ARG_SLOT - 1) = ret[1]; - break; - - case FFI_TYPE_DOUBLE: - fldd(rvalue, fr4); - break; - - case FFI_TYPE_FLOAT: - fldw(rvalue, fr4); - break; - - case FFI_TYPE_STRUCT: - /* Don't need a return value, done by caller. */ - break; - - case FFI_TYPE_SMALL_STRUCT2: - case FFI_TYPE_SMALL_STRUCT3: - case FFI_TYPE_SMALL_STRUCT4: - tmp = (void*)(stack - FIRST_ARG_SLOT); - tmp += 4 - cif->rtype->size; - memcpy((void*)tmp, &ret[0], cif->rtype->size); - break; - - case FFI_TYPE_SMALL_STRUCT5: - case FFI_TYPE_SMALL_STRUCT6: - case FFI_TYPE_SMALL_STRUCT7: - case FFI_TYPE_SMALL_STRUCT8: - { - unsigned int ret2[2]; - int off; - - /* Right justify ret[0] and ret[1] */ - switch (cif->flags) - { - case FFI_TYPE_SMALL_STRUCT5: off = 3; break; - case FFI_TYPE_SMALL_STRUCT6: off = 2; break; - case FFI_TYPE_SMALL_STRUCT7: off = 1; break; - default: off = 0; break; - } - - memset (ret2, 0, sizeof (ret2)); - memcpy ((char *)ret2 + off, ret, 8 - off); - - *(stack - FIRST_ARG_SLOT) = ret2[0]; - *(stack - FIRST_ARG_SLOT - 1) = ret2[1]; - } - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_VOID: - break; - - default: - debug(0, "assert with cif->flags: %d\n",cif->flags); - FFI_ASSERT(0); - break; - } - return FFI_OK; -} - -/* Fill in a closure to refer to the specified fun and user_data. - cif specifies the argument and result types for fun. - The cif must already be prep'ed. */ - -extern void ffi_closure_pa32(void); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - UINT32 *tramp = (UINT32 *)(closure->tramp); -#ifdef PA_HPUX - UINT32 *tmp; -#endif - - if (cif->abi != FFI_PA32) - return FFI_BAD_ABI; - - /* Make a small trampoline that will branch to our - handler function. Use PC-relative addressing. */ - -#ifdef PA_LINUX - tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ - tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ - tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1 ; load plabel */ - tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ - tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ - tramp[5] = 0xeac0c000; /* bv%r0(%r22) ; branch to handler */ - tramp[6] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ - tramp[7] = ((UINT32)(ffi_closure_pa32) & ~2); - - /* Flush d/icache -- have to flush up 2 two lines because of - alignment. */ - __asm__ volatile( - "fdc 0(%0)\n\t" - "fdc %1(%0)\n\t" - "fic 0(%%sr4, %0)\n\t" - "fic %1(%%sr4, %0)\n\t" - "sync\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n" - : - : "r"((unsigned long)tramp & ~31), - "r"(32 /* stride */) - : "memory"); -#endif - -#ifdef PA_HPUX - tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ - tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ - tramp[2] = 0x4aa10038; /* ldw 28(%r21),%r1 ; load plabel */ - tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ - tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ - tramp[5] = 0x02c010b4; /* ldsid (%r22),%r20 ; load space id */ - tramp[6] = 0x00141820; /* mtsp %r20,%sr0 ; into %sr0 */ - tramp[7] = 0xe2c00000; /* be 0(%sr0,%r22) ; branch to handler */ - tramp[8] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ - tramp[9] = ((UINT32)(ffi_closure_pa32) & ~2); - - /* Flush d/icache -- have to flush three lines because of alignment. */ - __asm__ volatile( - "copy %1,%0\n\t" - "fdc,m %2(%0)\n\t" - "fdc,m %2(%0)\n\t" - "fdc,m %2(%0)\n\t" - "ldsid (%1),%0\n\t" - "mtsp %0,%%sr0\n\t" - "copy %1,%0\n\t" - "fic,m %2(%%sr0,%0)\n\t" - "fic,m %2(%%sr0,%0)\n\t" - "fic,m %2(%%sr0,%0)\n\t" - "sync\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n" - : "=&r" ((unsigned long)tmp) - : "r" ((unsigned long)tramp & ~31), - "r" (32/* stride */) - : "memory"); -#endif - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/pa/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/pa/ffitarget.h deleted file mode 100644 index 5e364d38f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/pa/ffitarget.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for hppa. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - -#ifdef PA_LINUX - FFI_PA32, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA32 -#endif - -#ifdef PA_HPUX - FFI_PA32, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA32 -#endif - -#ifdef PA64_HPUX -#error "PA64_HPUX FFI is not yet implemented" - FFI_PA64, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA64 -#endif -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#ifdef PA_LINUX -#define FFI_TRAMPOLINE_SIZE 32 -#else -#define FFI_TRAMPOLINE_SIZE 40 -#endif - -#define FFI_TYPE_SMALL_STRUCT2 -1 -#define FFI_TYPE_SMALL_STRUCT3 -2 -#define FFI_TYPE_SMALL_STRUCT4 -3 -#define FFI_TYPE_SMALL_STRUCT5 -4 -#define FFI_TYPE_SMALL_STRUCT6 -5 -#define FFI_TYPE_SMALL_STRUCT7 -6 -#define FFI_TYPE_SMALL_STRUCT8 -7 -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/pa/hpux32.S b/third_party/python/Modules/_ctypes/libffi/src/pa/hpux32.S deleted file mode 100644 index 40528bad7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/pa/hpux32.S +++ /dev/null @@ -1,368 +0,0 @@ -/* ----------------------------------------------------------------------- - hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. - (c) 2008 Red Hat, Inc. - based on src/pa/linux.S - - HP-UX PA Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .LEVEL 1.1 - .SPACE $PRIVATE$ - .IMPORT $global$,DATA - .IMPORT $$dyncall,MILLICODE - .SUBSPA $DATA$ - .align 4 - - /* void ffi_call_pa32(void (*)(char *, extended_cif *), - extended_cif *ecif, - unsigned bytes, - unsigned flags, - unsigned *rvalue, - void (*fn)(void)); - */ - - .export ffi_call_pa32,ENTRY,PRIV_LEV=3 - .import ffi_prep_args_pa32,CODE - - .SPACE $TEXT$ - .SUBSPA $CODE$ - .align 4 - -L$FB1 -ffi_call_pa32 - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 - .entry - stw %rp, -20(%sp) - copy %r3, %r1 -L$CFI11 - copy %sp, %r3 -L$CFI12 - - /* Setup the stack for calling prep_args... - We want the stack to look like this: - - [ Previous stack ] <- %r3 - - [ 64-bytes register save area ] <- %r4 - - [ Stack space for actual call, passed as ] <- %arg0 - [ arg0 to ffi_prep_args_pa32 ] - - [ Stack for calling prep_args ] <- %sp - */ - - stwm %r1, 64(%sp) - stw %r4, 12(%r3) -L$CFI13 - copy %sp, %r4 - - addl %arg2, %r4, %arg0 ; arg stack - stw %arg3, -48(%r3) ; save flags we need it later - - /* Call prep_args: - %arg0(stack) -- set up above - %arg1(ecif) -- same as incoming param - %arg2(bytes) -- same as incoming param */ - bl ffi_prep_args_pa32,%r2 - ldo 64(%arg0), %sp - ldo -64(%sp), %sp - - /* now %sp should point where %arg0 was pointing. */ - - /* Load the arguments that should be passed in registers - The fp args are loaded by the prep_args function. */ - ldw -36(%sp), %arg0 - ldw -40(%sp), %arg1 - ldw -44(%sp), %arg2 - ldw -48(%sp), %arg3 - - /* in case the function is going to return a structure - we need to give it a place to put the result. */ - ldw -52(%r3), %ret0 ; %ret0 <- rvalue - ldw -56(%r3), %r22 ; %r22 <- function to call - bl $$dyncall, %r31 ; Call the user function - copy %r31, %rp - - /* Prepare to store the result; we need to recover flags and rvalue. */ - ldw -48(%r3), %r21 ; r21 <- flags - ldw -52(%r3), %r20 ; r20 <- rvalue - - /* Store the result according to the return type. The most - likely types should come first. */ - -L$checkint - comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 - b L$done - stw %ret0, 0(%r20) - -L$checkint8 - comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 - b L$done - stb %ret0, 0(%r20) - -L$checkint16 - comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl - b L$done - sth %ret0, 0(%r20) - -L$checkdbl - comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat - b L$done - fstd %fr4,0(%r20) - -L$checkfloat - comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll - b L$done - fstw %fr4L,0(%r20) - -L$checkll - comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 - stw %ret0, 0(%r20) - b L$done - stw %ret1, 4(%r20) - -L$checksmst2 - comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 - /* 2-byte structs are returned in ret0 as ????xxyy. */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst3 - comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 - /* 3-byte structs are returned in ret0 as ??xxyyzz. */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst4 - comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 - /* 4-byte structs are returned in ret0 as wwxxyyzz. */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst5 - comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 - /* 5 byte values are returned right justified: - ret0 ret1 - 5: ??????aa bbccddee */ - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst6 - comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 - /* 6 byte values are returned right justified: - ret0 ret1 - 6: ????aabb ccddeeff */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst7 - comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 - /* 7 byte values are returned right justified: - ret0 ret1 - 7: ??aabbcc ddeeffgg */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst8 - comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done - /* 8 byte values are returned right justified: - ret0 ret1 - 8: aabbccdd eeffgghh */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stb %ret1, 0(%r20) - -L$done - /* all done, return */ - copy %r4, %sp ; pop arg stack - ldw 12(%r3), %r4 - ldwm -64(%sp), %r3 ; .. and pop stack - ldw -20(%sp), %rp - bv %r0(%rp) - nop - .exit - .procend -L$FE1 - - /* void ffi_closure_pa32(void); - Called with closure argument in %r21 */ - - .SPACE $TEXT$ - .SUBSPA $CODE$ - .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR - .import ffi_closure_inner_pa32,CODE - .align 4 -L$FB2 -ffi_closure_pa32 - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 - .entry - - stw %rp, -20(%sp) - copy %r3, %r1 -L$CFI21 - copy %sp, %r3 -L$CFI22 - stwm %r1, 64(%sp) - - /* Put arguments onto the stack and call ffi_closure_inner. */ - stw %arg0, -36(%r3) - stw %arg1, -40(%r3) - stw %arg2, -44(%r3) - stw %arg3, -48(%r3) - - copy %r21, %arg0 - bl ffi_closure_inner_pa32, %r2 - copy %r3, %arg1 - ldwm -64(%sp), %r3 - ldw -20(%sp), %rp - ldw -36(%sp), %ret0 - bv %r0(%rp) - ldw -40(%sp), %ret1 - .exit - .procend -L$FE2: - - .SPACE $PRIVATE$ - .SUBSPA $DATA$ - - .align 4 - .EXPORT _GLOBAL__F_ffi_call_pa32,DATA -_GLOBAL__F_ffi_call_pa32 -L$frame1: - .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry -L$SCIE1: - .word 0x0 ;# CIE Identifier Tag - .byte 0x1 ;# CIE Version - .ascii "\0" ;# CIE Augmentation - .uleb128 0x1 ;# CIE Code Alignment Factor - .sleb128 4 ;# CIE Data Alignment Factor - .byte 0x2 ;# CIE RA Column - .byte 0xc ;# DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x0 - .align 4 -L$ECIE1: -L$SFDE1: - .word L$EFDE1-L$ASFDE1 ;# FDE Length -L$ASFDE1: - .word L$ASFDE1-L$frame1 ;# FDE CIE offset - .word L$FB1 ;# FDE initial location - .word L$FE1-L$FB1 ;# FDE address range - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI11-L$FB1 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI12-L$CFI11 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI13-L$CFI12 - .byte 0x84 ;# DW_CFA_offset, column 0x4 - .uleb128 0x3 - - .align 4 -L$EFDE1: - -L$SFDE2: - .word L$EFDE2-L$ASFDE2 ;# FDE Length -L$ASFDE2: - .word L$ASFDE2-L$frame1 ;# FDE CIE offset - .word L$FB2 ;# FDE initial location - .word L$FE2-L$FB2 ;# FDE address range - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI21-L$FB2 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI22-L$CFI21 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .align 4 -L$EFDE2: diff --git a/third_party/python/Modules/_ctypes/libffi/src/pa/linux.S b/third_party/python/Modules/_ctypes/libffi/src/pa/linux.S deleted file mode 100644 index f11ae7680..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/pa/linux.S +++ /dev/null @@ -1,357 +0,0 @@ -/* ----------------------------------------------------------------------- - linux.S - (c) 2003-2004 Randolph Chung - (c) 2008 Red Hat, Inc. - - HPPA Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .text - .level 1.1 - .align 4 - - /* void ffi_call_pa32(void (*)(char *, extended_cif *), - extended_cif *ecif, - unsigned bytes, - unsigned flags, - unsigned *rvalue, - void (*fn)(void)); - */ - - .export ffi_call_pa32,code - .import ffi_prep_args_pa32,code - - .type ffi_call_pa32, @function -.LFB1: -ffi_call_pa32: - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 - .entry - stw %rp, -20(%sp) - copy %r3, %r1 -.LCFI11: - - copy %sp, %r3 -.LCFI12: - - /* Setup the stack for calling prep_args... - We want the stack to look like this: - - [ Previous stack ] <- %r3 - - [ 64-bytes register save area ] <- %r4 - - [ Stack space for actual call, passed as ] <- %arg0 - [ arg0 to ffi_prep_args_pa32 ] - - [ Stack for calling prep_args ] <- %sp - */ - - stwm %r1, 64(%sp) - stw %r4, 12(%r3) -.LCFI13: - copy %sp, %r4 - - addl %arg2, %r4, %arg0 /* arg stack */ - stw %arg3, -48(%r3) /* save flags; we need it later */ - - /* Call prep_args: - %arg0(stack) -- set up above - %arg1(ecif) -- same as incoming param - %arg2(bytes) -- same as incoming param */ - bl ffi_prep_args_pa32,%r2 - ldo 64(%arg0), %sp - ldo -64(%sp), %sp - - /* now %sp should point where %arg0 was pointing. */ - - /* Load the arguments that should be passed in registers - The fp args were loaded by the prep_args function. */ - ldw -36(%sp), %arg0 - ldw -40(%sp), %arg1 - ldw -44(%sp), %arg2 - ldw -48(%sp), %arg3 - - /* in case the function is going to return a structure - we need to give it a place to put the result. */ - ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ - ldw -56(%r3), %r22 /* %r22 <- function to call */ - bl $$dyncall, %r31 /* Call the user function */ - copy %r31, %rp - - /* Prepare to store the result; we need to recover flags and rvalue. */ - ldw -48(%r3), %r21 /* r21 <- flags */ - ldw -52(%r3), %r20 /* r20 <- rvalue */ - - /* Store the result according to the return type. */ - -.Lcheckint: - comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8 - b .Ldone - stw %ret0, 0(%r20) - -.Lcheckint8: - comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16 - b .Ldone - stb %ret0, 0(%r20) - -.Lcheckint16: - comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl - b .Ldone - sth %ret0, 0(%r20) - -.Lcheckdbl: - comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat - b .Ldone - fstd %fr4,0(%r20) - -.Lcheckfloat: - comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll - b .Ldone - fstw %fr4L,0(%r20) - -.Lcheckll: - comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2 - stw %ret0, 0(%r20) - b .Ldone - stw %ret1, 4(%r20) - -.Lchecksmst2: - comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3 - /* 2-byte structs are returned in ret0 as ????xxyy. */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst3: - comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4 - /* 3-byte structs are returned in ret0 as ??xxyyzz. */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst4: - comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5 - /* 4-byte structs are returned in ret0 as wwxxyyzz. */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst5: - comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6 - /* 5 byte values are returned right justified: - ret0 ret1 - 5: ??????aa bbccddee */ - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst6: - comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7 - /* 6 byte values are returned right justified: - ret0 ret1 - 6: ????aabb ccddeeff */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst7: - comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8 - /* 7 byte values are returned right justified: - ret0 ret1 - 7: ??aabbcc ddeeffgg */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst8: - comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone - /* 8 byte values are returned right justified: - ret0 ret1 - 8: aabbccdd eeffgghh */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stb %ret1, 0(%r20) - -.Ldone: - /* all done, return */ - copy %r4, %sp /* pop arg stack */ - ldw 12(%r3), %r4 - ldwm -64(%sp), %r3 /* .. and pop stack */ - ldw -20(%sp), %rp - bv %r0(%rp) - nop - .exit - .procend -.LFE1: - - /* void ffi_closure_pa32(void); - Called with closure argument in %r21 */ - .export ffi_closure_pa32,code - .import ffi_closure_inner_pa32,code - - .type ffi_closure_pa32, @function -.LFB2: -ffi_closure_pa32: - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 - .entry - - stw %rp, -20(%sp) -.LCFI20: - copy %r3, %r1 -.LCFI21: - copy %sp, %r3 -.LCFI22: - stwm %r1, 64(%sp) - - /* Put arguments onto the stack and call ffi_closure_inner. */ - stw %arg0, -36(%r3) - stw %arg1, -40(%r3) - stw %arg2, -44(%r3) - stw %arg3, -48(%r3) - - copy %r21, %arg0 - bl ffi_closure_inner_pa32, %r2 - copy %r3, %arg1 - - ldwm -64(%sp), %r3 - ldw -20(%sp), %rp - ldw -36(%sp), %ret0 - bv %r0(%r2) - ldw -40(%sp), %ret1 - - .exit - .procend -.LFE2: - - .section ".eh_frame",EH_FRAME_FLAGS,@progbits -.Lframe1: - .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry -.LSCIE1: - .word 0x0 ;# CIE Identifier Tag - .byte 0x1 ;# CIE Version - .ascii "\0" ;# CIE Augmentation - .uleb128 0x1 ;# CIE Code Alignment Factor - .sleb128 4 ;# CIE Data Alignment Factor - .byte 0x2 ;# CIE RA Column - .byte 0xc ;# DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x0 - .align 4 -.LECIE1: -.LSFDE1: - .word .LEFDE1-.LASFDE1 ;# FDE Length -.LASFDE1: - .word .LASFDE1-.Lframe1 ;# FDE CIE offset - .word .LFB1 ;# FDE initial location - .word .LFE1-.LFB1 ;# FDE address range - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI11-.LFB1 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI12-.LCFI11 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI13-.LCFI12 - .byte 0x84 ;# DW_CFA_offset, column 0x4 - .uleb128 0x3 - - .align 4 -.LEFDE1: - -.LSFDE2: - .word .LEFDE2-.LASFDE2 ;# FDE Length -.LASFDE2: - .word .LASFDE2-.Lframe1 ;# FDE CIE offset - .word .LFB2 ;# FDE initial location - .word .LFE2-.LFB2 ;# FDE address range - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI21-.LFB2 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI22-.LCFI21 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .align 4 -.LEFDE2: diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix.S deleted file mode 100644 index 349e78c26..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix.S +++ /dev/null @@ -1,328 +0,0 @@ -/* ----------------------------------------------------------------------- - aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. - based on darwin.S by John Hornkvist - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - - .set r0,0 - .set r1,1 - .set r2,2 - .set r3,3 - .set r4,4 - .set r5,5 - .set r6,6 - .set r7,7 - .set r8,8 - .set r9,9 - .set r10,10 - .set r11,11 - .set r12,12 - .set r13,13 - .set r14,14 - .set r15,15 - .set r16,16 - .set r17,17 - .set r18,18 - .set r19,19 - .set r20,20 - .set r21,21 - .set r22,22 - .set r23,23 - .set r24,24 - .set r25,25 - .set r26,26 - .set r27,27 - .set r28,28 - .set r29,29 - .set r30,30 - .set r31,31 - .set f0,0 - .set f1,1 - .set f2,2 - .set f3,3 - .set f4,4 - .set f5,5 - .set f6,6 - .set f7,7 - .set f8,8 - .set f9,9 - .set f10,10 - .set f11,11 - .set f12,12 - .set f13,13 - .set f14,14 - .set f15,15 - .set f16,16 - .set f17,17 - .set f18,18 - .set f19,19 - .set f20,20 - .set f21,21 - - .extern .ffi_prep_args - -#define LIBFFI_ASM -#include -#include -#define JUMPTARGET(name) name -#define L(x) x - .file "aix.S" - .toc - - /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, - * unsigned int flags, unsigned int *rvalue, - * void (*fn)(), - * void (*prep_args)(extended_cif*, unsigned *const)); - * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args - */ - -.csect .text[PR] - .align 2 - .globl ffi_call_AIX - .globl .ffi_call_AIX -.csect ffi_call_AIX[DS] -ffi_call_AIX: -#ifdef __64BIT__ - .llong .ffi_call_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_AIX: - /* Save registers we use. */ - mflr r0 - - std r28,-32(r1) - std r29,-24(r1) - std r30,-16(r1) - std r31, -8(r1) - - std r0, 16(r1) - mr r28, r1 /* our AP. */ - stdux r1, r1, r4 - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address. */ - std r2, 40(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - ld r0, 0(r29) - ld r2, 8(r29) - ld r11, 16(r29) - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - ld r3, 40+(1*8)(r1) - ld r4, 40+(2*8)(r1) - ld r5, 40+(3*8)(r1) - ld r6, 40+(4*8)(r1) - nop - ld r7, 40+(5*8)(r1) - ld r8, 40+(6*8)(r1) - ld r9, 40+(7*8)(r1) - ld r10,40+(8*8)(r1) - -L1: - /* Load all the FP registers. */ - bf 6,L2 /* 2f + 0x18 */ - lfd f1,-32-(13*8)(r28) - lfd f2,-32-(12*8)(r28) - lfd f3,-32-(11*8)(r28) - lfd f4,-32-(10*8)(r28) - nop - lfd f5,-32-(9*8)(r28) - lfd f6,-32-(8*8)(r28) - lfd f7,-32-(7*8)(r28) - lfd f8,-32-(6*8)(r28) - nop - lfd f9,-32-(5*8)(r28) - lfd f10,-32-(4*8)(r28) - lfd f11,-32-(3*8)(r28) - lfd f12,-32-(2*8)(r28) - nop - lfd f13,-32-(1*8)(r28) - -L2: - /* Make the call. */ - bctrl - ld r2, 40(r1) - - /* Now, deal with the return value. */ - mtcrf 0x01, r31 - - bt 30, L(done_return_value) - bt 29, L(fp_return_value) - std r3, 0(r30) - - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - mr r1, r28 - ld r0, 16(r28) - ld r28, -32(r1) - mtlr r0 - ld r29, -24(r1) - ld r30, -16(r1) - ld r31, -8(r1) - blr - -L(fp_return_value): - bf 28, L(float_return_value) - stfd f1, 0(r30) - bf 31, L(done_return_value) - stfd f2, 8(r30) - b L(done_return_value) -L(float_return_value): - stfs f1, 0(r30) - b L(done_return_value) - -#else /* ! __64BIT__ */ - - .long .ffi_call_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_AIX: - /* Save registers we use. */ - mflr r0 - - stw r28,-16(r1) - stw r29,-12(r1) - stw r30, -8(r1) - stw r31, -4(r1) - - stw r0, 8(r1) - mr r28, r1 /* out AP. */ - stwux r1, r1, r4 - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address, */ - stw r2, 20(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - lwz r0, 0(r29) - lwz r2, 4(r29) - lwz r11, 8(r29) - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - lwz r3, 20+(1*4)(r1) - lwz r4, 20+(2*4)(r1) - lwz r5, 20+(3*4)(r1) - lwz r6, 20+(4*4)(r1) - nop - lwz r7, 20+(5*4)(r1) - lwz r8, 20+(6*4)(r1) - lwz r9, 20+(7*4)(r1) - lwz r10,20+(8*4)(r1) - -L1: - /* Load all the FP registers. */ - bf 6,L2 /* 2f + 0x18 */ - lfd f1,-16-(13*8)(r28) - lfd f2,-16-(12*8)(r28) - lfd f3,-16-(11*8)(r28) - lfd f4,-16-(10*8)(r28) - nop - lfd f5,-16-(9*8)(r28) - lfd f6,-16-(8*8)(r28) - lfd f7,-16-(7*8)(r28) - lfd f8,-16-(6*8)(r28) - nop - lfd f9,-16-(5*8)(r28) - lfd f10,-16-(4*8)(r28) - lfd f11,-16-(3*8)(r28) - lfd f12,-16-(2*8)(r28) - nop - lfd f13,-16-(1*8)(r28) - -L2: - /* Make the call. */ - bctrl - lwz r2, 20(r1) - - /* Now, deal with the return value. */ - mtcrf 0x01, r31 - - bt 30, L(done_return_value) - bt 29, L(fp_return_value) - stw r3, 0(r30) - bf 28, L(done_return_value) - stw r4, 4(r30) - - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - mr r1, r28 - lwz r0, 8(r28) - lwz r28,-16(r1) - mtlr r0 - lwz r29,-12(r1) - lwz r30, -8(r1) - lwz r31, -4(r1) - blr - -L(fp_return_value): - bf 28, L(float_return_value) - stfd f1, 0(r30) - b L(done_return_value) -L(float_return_value): - stfs f1, 0(r30) - b L(done_return_value) -#endif - .long 0 - .byte 0,0,0,1,128,4,0,0 -/* END(ffi_call_AIX) */ - -.csect .text[PR] - .align 2 - .globl ffi_call_DARWIN - .globl .ffi_call_DARWIN -.csect ffi_call_DARWIN[DS] -ffi_call_DARWIN: -#ifdef __64BIT__ - .llong .ffi_call_DARWIN, TOC[tc0], 0 -#else - .long .ffi_call_DARWIN, TOC[tc0], 0 -#endif - .csect .text[PR] -.ffi_call_DARWIN: - blr - .long 0 - .byte 0,0,0,0,0,0,0,0 -/* END(ffi_call_DARWIN) */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix_closure.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix_closure.S deleted file mode 100644 index aabd3c3c1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/aix_closure.S +++ /dev/null @@ -1,447 +0,0 @@ -/* ----------------------------------------------------------------------- - aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. - based on darwin_closure.S - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - - .set r0,0 - .set r1,1 - .set r2,2 - .set r3,3 - .set r4,4 - .set r5,5 - .set r6,6 - .set r7,7 - .set r8,8 - .set r9,9 - .set r10,10 - .set r11,11 - .set r12,12 - .set r13,13 - .set r14,14 - .set r15,15 - .set r16,16 - .set r17,17 - .set r18,18 - .set r19,19 - .set r20,20 - .set r21,21 - .set r22,22 - .set r23,23 - .set r24,24 - .set r25,25 - .set r26,26 - .set r27,27 - .set r28,28 - .set r29,29 - .set r30,30 - .set r31,31 - .set f0,0 - .set f1,1 - .set f2,2 - .set f3,3 - .set f4,4 - .set f5,5 - .set f6,6 - .set f7,7 - .set f8,8 - .set f9,9 - .set f10,10 - .set f11,11 - .set f12,12 - .set f13,13 - .set f14,14 - .set f15,15 - .set f16,16 - .set f17,17 - .set f18,18 - .set f19,19 - .set f20,20 - .set f21,21 - - .extern .ffi_closure_helper_DARWIN - -#define LIBFFI_ASM -#define JUMPTARGET(name) name -#define L(x) x - .file "aix_closure.S" - .toc -LC..60: - .tc L..60[TC],L..60 - .csect .text[PR] - .align 2 - -.csect .text[PR] - .align 2 - .globl ffi_closure_ASM - .globl .ffi_closure_ASM -.csect ffi_closure_ASM[DS] -ffi_closure_ASM: -#ifdef __64BIT__ - .llong .ffi_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_closure_ASM: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - std r3, 48+(0*8)(r1) - std r4, 48+(1*8)(r1) - std r5, 48+(2*8)(r1) - std r6, 48+(3*8)(r1) - mflr r0 - - std r7, 48+(4*8)(r1) - std r8, 48+(5*8)(r1) - std r9, 48+(6*8)(r1) - std r10, 48+(7*8)(r1) - std r0, 16(r1) /* save the return address */ - - - /* 48 Bytes (Linkage Area) */ - /* 64 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 8 Bytes (alignment) */ - /* 240 Bytes */ - - stdu r1, -240(r1) /* skip over caller save area - keep stack aligned to 16 */ - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 128+(0*8)(r1) - stfd f2, 128+(1*8)(r1) - stfd f3, 128+(2*8)(r1) - stfd f4, 128+(3*8)(r1) - stfd f5, 128+(4*8)(r1) - stfd f6, 128+(5*8)(r1) - stfd f7, 128+(6*8)(r1) - stfd f8, 128+(7*8)(r1) - stfd f9, 128+(8*8)(r1) - stfd f10, 128+(9*8)(r1) - stfd f11, 128+(10*8)(r1) - stfd f12, 128+(11*8)(r1) - stfd f13, 128+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - /* get the context pointer from the trampoline */ - mr r3, r11 - - /* now load up the pointer to the result storage */ - addi r4, r1, 112 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 288 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 128 - - /* make the call */ - bl .ffi_closure_helper_DARWIN - nop - - /* now r3 contains the return type */ - /* so use it to look up in a table */ - /* so we know how to deal with each type */ - - /* look up the proper starting point in table */ - /* by using return type as offset */ - lhz r3, 10(r3) /* load type from return type */ - ld r4, LC..60(2) /* get address of jump table */ - sldi r3, r3, 4 /* now multiply return type by 16 */ - ld r0, 240+16(r1) /* load return address */ - add r3, r3, r4 /* add contents of table to table address */ - mtctr r3 - bctr /* jump to it */ - -/* Each fragment must be exactly 16 bytes long (4 instructions). - Align to 16 byte boundary for cache and dispatch efficiency. */ - .align 4 - -L..60: -/* case FFI_TYPE_VOID */ - mtlr r0 - addi r1, r1, 240 - blr - nop - -/* case FFI_TYPE_INT */ - lwa r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_FLOAT */ - lfs f1, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_DOUBLE */ - lfd f1, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_LONGDOUBLE */ - lfd f1, 112+0(r1) - mtlr r0 - lfd f2, 112+8(r1) - b L..finish - -/* case FFI_TYPE_UINT8 */ - lbz r3, 112+7(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT8 */ - lbz r3, 112+7(r1) - mtlr r0 - extsb r3, r3 - b L..finish - -/* case FFI_TYPE_UINT16 */ - lhz r3, 112+6(r1) - mtlr r0 -L..finish: - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT16 */ - lha r3, 112+6(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_UINT32 */ - lwz r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT32 */ - lwa r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_UINT64 */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT64 */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_STRUCT */ - mtlr r0 - addi r1, r1, 240 - blr - nop - -/* case FFI_TYPE_POINTER */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -#else /* ! __64BIT__ */ - - .long .ffi_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_closure_ASM: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - stw r3, 24+(0*4)(r1) - stw r4, 24+(1*4)(r1) - stw r5, 24+(2*4)(r1) - stw r6, 24+(3*4)(r1) - mflr r0 - - stw r7, 24+(4*4)(r1) - stw r8, 24+(5*4)(r1) - stw r9, 24+(6*4)(r1) - stw r10, 24+(7*4)(r1) - stw r0, 8(r1) - - /* 24 Bytes (Linkage Area) */ - /* 32 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 176 Bytes */ - - stwu r1, -176(r1) /* skip over caller save area - keep stack aligned to 16 */ - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 72+(0*8)(r1) - stfd f2, 72+(1*8)(r1) - stfd f3, 72+(2*8)(r1) - stfd f4, 72+(3*8)(r1) - stfd f5, 72+(4*8)(r1) - stfd f6, 72+(5*8)(r1) - stfd f7, 72+(6*8)(r1) - stfd f8, 72+(7*8)(r1) - stfd f9, 72+(8*8)(r1) - stfd f10, 72+(9*8)(r1) - stfd f11, 72+(10*8)(r1) - stfd f12, 72+(11*8)(r1) - stfd f13, 72+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - /* get the context pointer from the trampoline */ - mr r3, r11 - - /* now load up the pointer to the result storage */ - addi r4, r1, 56 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 200 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 72 - - /* make the call */ - bl .ffi_closure_helper_DARWIN - nop - - /* now r3 contains the return type */ - /* so use it to look up in a table */ - /* so we know how to deal with each type */ - - /* look up the proper starting point in table */ - /* by using return type as offset */ - lhz r3, 6(r3) /* load type from return type */ - lwz r4, LC..60(2) /* get address of jump table */ - slwi r3, r3, 4 /* now multiply return type by 16 */ - lwz r0, 176+8(r1) /* load return address */ - add r3, r3, r4 /* add contents of table to table address */ - mtctr r3 - bctr /* jump to it */ - -/* Each fragment must be exactly 16 bytes long (4 instructions). - Align to 16 byte boundary for cache and dispatch efficiency. */ - .align 4 - -L..60: -/* case FFI_TYPE_VOID */ - mtlr r0 - addi r1, r1, 176 - blr - nop - -/* case FFI_TYPE_INT */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_FLOAT */ - lfs f1, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_DOUBLE */ - lfd f1, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_LONGDOUBLE */ - lfd f1, 56+0(r1) - mtlr r0 - lfd f2, 56+8(r1) - b L..finish - -/* case FFI_TYPE_UINT8 */ - lbz r3, 56+3(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT8 */ - lbz r3, 56+3(r1) - mtlr r0 - extsb r3, r3 - b L..finish - -/* case FFI_TYPE_UINT16 */ - lhz r3, 56+2(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT16 */ - lha r3, 56+2(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_UINT32 */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT32 */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_UINT64 */ - lwz r3, 56+0(r1) - mtlr r0 - lwz r4, 56+4(r1) - b L..finish - -/* case FFI_TYPE_SINT64 */ - lwz r3, 56+0(r1) - mtlr r0 - lwz r4, 56+4(r1) - b L..finish - -/* case FFI_TYPE_STRUCT */ - mtlr r0 - addi r1, r1, 176 - blr - nop - -/* case FFI_TYPE_POINTER */ - lwz r3, 56+0(r1) - mtlr r0 -L..finish: - addi r1, r1, 176 - blr -#endif -/* END(ffi_closure_ASM) */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/asm.h b/third_party/python/Modules/_ctypes/libffi/src/powerpc/asm.h deleted file mode 100644 index 994f62d07..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/asm.h +++ /dev/null @@ -1,125 +0,0 @@ -/* ----------------------------------------------------------------------- - asm.h - Copyright (c) 1998 Geoffrey Keating - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define ASM_GLOBAL_DIRECTIVE .globl - - -#define C_SYMBOL_NAME(name) name -/* Macro for a label. */ -#ifdef __STDC__ -#define C_LABEL(name) name##: -#else -#define C_LABEL(name) name/**/: -#endif - -/* This seems to always be the case on PPC. */ -#define ALIGNARG(log2) log2 -/* For ELF we need the `.type' directive to make shared libs work right. */ -#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name - -/* If compiled for profiling, call `_mcount' at the start of each function. */ -#ifdef PROF -/* The mcount code relies on the return address being on the stack - to locate our caller and so it can restore it; so store one just - for its benefit. */ -#ifdef PIC -#define CALL_MCOUNT \ - .pushsection; \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr %r0; \ - stw %r0,4(%r1); \ - bl _GLOBAL_OFFSET_TABLE_@local-4; \ - mflr %r11; \ - lwz %r0,0b@got(%r11); \ - bl JUMPTARGET(_mcount); -#else /* PIC */ -#define CALL_MCOUNT \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr %r0; \ - lis %r11,0b@ha; \ - stw %r0,4(%r1); \ - addi %r0,%r11,0b@l; \ - bl JUMPTARGET(_mcount); -#endif /* PIC */ -#else /* PROF */ -#define CALL_MCOUNT /* Do nothing. */ -#endif /* PROF */ - -#define ENTRY(name) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT - -#define EALIGN_W_0 /* No words to insert. */ -#define EALIGN_W_1 nop -#define EALIGN_W_2 nop;nop -#define EALIGN_W_3 nop;nop;nop -#define EALIGN_W_4 EALIGN_W_3;nop -#define EALIGN_W_5 EALIGN_W_4;nop -#define EALIGN_W_6 EALIGN_W_5;nop -#define EALIGN_W_7 EALIGN_W_6;nop - -/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes - past a 2^align boundary. */ -#ifdef PROF -#define EALIGN(name, alignt, words) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT \ - b 0f; \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - 0: -#else /* PROF */ -#define EALIGN(name, alignt, words) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - C_LABEL(name) -#endif - -#define END(name) \ - ASM_SIZE_DIRECTIVE(name) - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -/* Local labels stripped out by the linker. */ -#define L(x) .L##x diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin.S deleted file mode 100644 index 066eb82ef..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin.S +++ /dev/null @@ -1,378 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin.S - Copyright (c) 2000 John Hornkvist - Copyright (c) 2004, 2010 Free Software Foundation, Inc. - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#if defined(__ppc64__) -#define MODE_CHOICE(x, y) y -#else -#define MODE_CHOICE(x, y) x -#endif - -#define machine_choice MODE_CHOICE(ppc7400,ppc64) - -; Define some pseudo-opcodes for size-independent load & store of GPRs ... -#define lgu MODE_CHOICE(lwzu, ldu) -#define lg MODE_CHOICE(lwz,ld) -#define sg MODE_CHOICE(stw,std) -#define sgu MODE_CHOICE(stwu,stdu) -#define sgux MODE_CHOICE(stwux,stdux) - -; ... and the size of GPRs and their storage indicator. -#define GPR_BYTES MODE_CHOICE(4,8) -#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ -#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ - -; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. -#define LINKAGE_SIZE MODE_CHOICE(24,48) -#define PARAM_AREA MODE_CHOICE(32,64) -#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ - -/* If there is any FP stuff we make space for all of the regs. */ -#define SAVED_FPR_COUNT 13 -#define FPR_SIZE 8 -#define RESULT_BYTES 16 - -/* This should be kept in step with the same value in ffi_darwin.c. */ -#define ASM_NEEDS_REGISTERS 4 -#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) - -#include -#include - -#define JUMPTARGET(name) name -#define L(x) x - - .text - .align 2 - .globl _ffi_prep_args - - .align 2 - .globl _ffi_call_DARWIN - - /* We arrive here with: - r3 = ptr to extended cif. - r4 = -bytes. - r5 = cif flags. - r6 = ptr to return value. - r7 = fn pointer (user func). - r8 = fn pointer (ffi_prep_args). - r9 = ffi_type* for the ret val. */ - -_ffi_call_DARWIN: -Lstartcode: - mr r12,r8 /* We only need r12 until the call, - so it does not have to be saved. */ -LFB1: - /* Save the old stack pointer as AP. */ - mr r8,r1 -LCFI0: - - /* Save the retval type in parents frame. */ - sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) - - /* Allocate the stack space we need. */ - sgux r1,r1,r4 - - /* Save registers we use. */ - mflr r9 - sg r9,SAVED_LR_OFFSET(r8) - - sg r28,-(4 * GPR_BYTES)(r8) - sg r29,-(3 * GPR_BYTES)(r8) - sg r30,-(2 * GPR_BYTES)(r8) - sg r31,-( GPR_BYTES)(r8) - -#if !defined(POWERPC_DARWIN) - /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ - sg r2,(5 * GPR_BYTES)(r1) -#endif - -LCFI1: - - /* Save arguments over call. */ - mr r31,r5 /* flags, */ - mr r30,r6 /* rvalue, */ - mr r29,r7 /* function address, */ - mr r28,r8 /* our AP. */ -LCFI2: - /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ - mr r4,r1 - li r9,0 - - mtctr r12 /* r12 holds address of _ffi_prep_args. */ - bctrl - -#if !defined(POWERPC_DARWIN) - /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ - lg r2,(5 * GPR_BYTES)(r1) -#endif - /* Now do the call. - Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40,r31 - /* Get the address to call into CTR. */ - mtctr r29 - /* Load all those argument registers. - We have set up a nice stack frame, just load it into registers. */ - lg r3, (LINKAGE_SIZE )(r1) - lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) - lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) - lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) - nop - lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) - lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) - lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) - lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) - -L1: - /* ... Load all the FP registers. */ - bf 6,L2 /* No floats to load. */ - lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) - lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) - lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) - lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) - nop - lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) - lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) - lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) - lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) - nop - lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) - lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) - lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) - lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) - nop - lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) - -L2: - mr r12,r29 /* Put the target address in r12 as specified. */ - mtctr r12 - nop - nop - - /* Make the call. */ - bctrl - - /* Now, deal with the return value. */ - - /* m64 structure returns can occupy the same set of registers as - would be used to pass such a structure as arg0 - so take care - not to step on any possibly hot regs. */ - - /* Get the flags.. */ - mtcrf 0x03,r31 ; we need c6 & cr7 now. - ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. - bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING - bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT - - /* OK, so we have a struct. */ -#if defined(__ppc64__) - bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case - - /* OK, we have to map the return back to a mem struct. - We are about to trample the parents param area, so recover the - return type. r29 is free, since the call is done. */ - lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) - - sg r3, (LINKAGE_SIZE )(r28) - sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) - sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) - sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) - nop - sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) - sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) - sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) - sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) - /* OK, so do the block move - we trust that memcpy will not trample - the fprs... */ - mr r3,r30 ; dest - addi r4,r28,LINKAGE_SIZE ; source - /* The size is a size_t, should be long. */ - lg r5,0(r29) - /* Figure out small structs */ - cmpi 0,r5,4 - bgt L3 ; 1, 2 and 4 bytes have special rules. - cmpi 0,r5,3 - beq L3 ; not 3 - addi r4,r4,8 - subf r4,r5,r4 -L3: - bl _memcpy - - /* ... do we need the FP registers? - recover the flags.. */ - mtcrf 0x03,r31 ; we need c6 & cr7 now. - bf 29,L(done_return_value) /* No floats in the struct. */ - stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) - stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) - stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) - stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) - nop - stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) - stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) - stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) - stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) - nop - stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) - stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) - stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) - stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) - nop - stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) - - mr r3,r29 ; ffi_type * - mr r4,r30 ; dest - addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs - xor r6,r6,r6 - sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) - addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. - bl _darwin64_struct_floats_to_mem - - b L(done_return_value) -#else - stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. -#endif - b L(done_return_value) - -L(fp_return_value): - /* Do we have long double to store? */ - bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS - stfd f1,0(r30) - stfd f2,FPR_SIZE(r30) - b L(done_return_value) - -L(fd_return_value): - /* Do we have double to store? */ - bf 28,L(float_return_value) - stfd f1,0(r30) - b L(done_return_value) - -L(float_return_value): - /* We only have a float to store. */ - stfs f1,0(r30) - b L(done_return_value) - -L(scalar_return_value): - bt 29,L(fp_return_value) ; FLAG_RETURNS_FP - ; ffi_arg is defined as unsigned long. - sg r3,0(r30) ; Save the reg. - bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS - -#if defined(__ppc64__) -L(maybe_return_128): - std r3,0(r30) - bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS - std r4,8(r30) -#else - stw r4,4(r30) -#endif - - /* Fall through. */ - /* We want this at the end to simplify eh epilog computation. */ - -L(done_return_value): - /* Restore the registers we used and return. */ - lg r29,SAVED_LR_OFFSET(r28) - ; epilog - lg r31,-(1 * GPR_BYTES)(r28) - mtlr r29 - lg r30,-(2 * GPR_BYTES)(r28) - lg r29,-(3 * GPR_BYTES)(r28) - lg r28,-(4 * GPR_BYTES)(r28) - lg r1,0(r1) - blr -LFE1: - .align 1 -/* END(_ffi_call_DARWIN) */ - -/* Provide a null definition of _ffi_call_AIX. */ - .text - .globl _ffi_call_AIX - .align 2 -_ffi_call_AIX: - blr -/* END(_ffi_call_AIX) */ - -/* EH stuff. */ - -#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) - - .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: - - .globl _ffi_call_DARWIN.eh -_ffi_call_DARWIN.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long Lstartcode-. ; FDE initial location - .set L$set$3,LFE1-Lstartcode - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-Lstartcode - .long L$set$4 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x08 ; uleb128 0x08 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$5,LCFI1-LCFI0 - .long L$set$5 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .byte 0x9f ; DW_CFA_offset, column 0x1f - .byte 0x1 ; uleb128 0x1 - .byte 0x9e ; DW_CFA_offset, column 0x1e - .byte 0x2 ; uleb128 0x2 - .byte 0x9d ; DW_CFA_offset, column 0x1d - .byte 0x3 ; uleb128 0x3 - .byte 0x9c ; DW_CFA_offset, column 0x1c - .byte 0x4 ; uleb128 0x4 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$6,LCFI2-LCFI1 - .long L$set$6 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x1c ; uleb128 0x1c - .align LOG2_GPR_BYTES -LEFDE1: - .align 1 - diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S deleted file mode 100644 index c7734d419..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S +++ /dev/null @@ -1,571 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, - Free Software Foundation, Inc. - based on ppc_closure.S - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#define L(x) x - -#if defined(__ppc64__) -#define MODE_CHOICE(x, y) y -#else -#define MODE_CHOICE(x, y) x -#endif - -#define machine_choice MODE_CHOICE(ppc7400,ppc64) - -; Define some pseudo-opcodes for size-independent load & store of GPRs ... -#define lgu MODE_CHOICE(lwzu, ldu) -#define lg MODE_CHOICE(lwz,ld) -#define sg MODE_CHOICE(stw,std) -#define sgu MODE_CHOICE(stwu,stdu) - -; ... and the size of GPRs and their storage indicator. -#define GPR_BYTES MODE_CHOICE(4,8) -#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ -#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ - -; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. -#define LINKAGE_SIZE MODE_CHOICE(24,48) -#define PARAM_AREA MODE_CHOICE(32,64) - -#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ -#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ - -/* WARNING: if ffi_type is changed... here be monsters. - Offsets of items within the result type. */ -#define FFI_TYPE_TYPE MODE_CHOICE(6,10) -#define FFI_TYPE_ELEM MODE_CHOICE(8,16) - -#define SAVED_FPR_COUNT 13 -#define FPR_SIZE 8 -/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ -#define RESULT_BYTES MODE_CHOICE(16,176) - -; The whole stack frame **MUST** be 16byte-aligned. -#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) -#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) - -#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) -#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 -; We no longer need the pic symbol stub for Darwin >= 9. -#define BLCLS_HELP _ffi_closure_helper_DARWIN -#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p -#define PASS_STR_FLOATS _darwin64_pass_struct_floats -#undef WANT_STUB -#else -#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub -#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub -#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub -#define WANT_STUB -#endif - -/* m32/m64 - - The stack layout looks like this: - - | Additional params... | | Higher address - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | - | Reserved 2*4/8 | | - |--------------------------------------------| | - | Space for callee`s LR 4/8 | | - |--------------------------------------------| | - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | - | Current backchain pointer 4/8 |-/ Parent`s frame. - |--------------------------------------------| <+ <<< on entry to - | Result Bytes 16/176 | | - |--------------------------------------------| | - ~ padding to 16-byte alignment ~ ~ - |--------------------------------------------| | - | NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 13*8 | | - |--------------------------------------------| | - | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved [compiler,binder] 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callees LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< call. - -*/ - - .file "darwin_closure.S" - - .machine machine_choice - - .text - .globl _ffi_closure_ASM - .align LOG2_GPR_BYTES -_ffi_closure_ASM: -LFB1: -Lstartcode: - mflr r0 /* extract return address */ - sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ -LCFI0: - sgu r1,-SAVE_SIZE(r1) /* skip over caller save area - keep stack aligned to 16. */ -LCFI1: - /* We want to build up an area for the parameters passed - in registers. (both floating point and integer) */ - - /* Put gpr 3 to gpr 10 in the parents outgoing area... - ... the remainder of any params that overflowed the regs will - follow here. */ - sg r3, (PARENT_PARM_BASE )(r1) - sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) - sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) - sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) - sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) - sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) - sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) - sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) - - /* We save fpr 1 to fpr 14 in our own save frame. */ - stfd f1, (FP_SAVE_BASE )(r1) - stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) - stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) - stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) - stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) - stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) - stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) - stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) - stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) - stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) - stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) - stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) - stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) - - /* Set up registers for the routine that actually does the work - get the context pointer from the trampoline. */ - mr r3,r11 - - /* Now load up the pointer to the result storage. */ - addi r4,r1,(SAVE_SIZE-RESULT_BYTES) - - /* Now load up the pointer to the saved gpr registers. */ - addi r5,r1,PARENT_PARM_BASE - - /* Now load up the pointer to the saved fpr registers. */ - addi r6,r1,FP_SAVE_BASE - - /* Make the call. */ - bl BLCLS_HELP - - /* r3 contains the rtype pointer... save it since we will need - it later. */ - sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type - lg r0,0(r3) ; size => r0 - lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 - - /* The helper will have intercepted structure returns and inserted - the caller`s destination address for structs returned by ref. */ - - /* r3 contains the return type so use it to look up in a table - so we know how to deal with each type. */ - - addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ - bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ - mflr r4 /* Move to r4. */ - slwi r3,r3,4 /* Now multiply return type by 16. */ - add r3,r3,r4 /* Add contents of table to table address. */ - mtctr r3 - bctr /* Jump to it. */ -LFE1: -/* Each of the ret_typeX code fragments has to be exactly 16 bytes long - (4 instructions). For cache effectiveness we align to a 16 byte boundary - first. */ - - .align 4 - - nop - nop - nop -Lget_ret_type0_addr: - blrl - -/* case FFI_TYPE_VOID */ -Lret_type0: - b Lfinish - nop - nop - nop - -/* case FFI_TYPE_INT */ -Lret_type1: - lg r3,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_FLOAT */ -Lret_type2: - lfs f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_DOUBLE */ -Lret_type3: - lfd f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_LONGDOUBLE */ -Lret_type4: - lfd f1,0(r5) - lfd f2,8(r5) - b Lfinish - nop - -/* case FFI_TYPE_UINT8 */ -Lret_type5: -#if defined(__ppc64__) - lbz r3,7(r5) -#else - lbz r3,3(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT8 */ -Lret_type6: -#if defined(__ppc64__) - lbz r3,7(r5) -#else - lbz r3,3(r5) -#endif - extsb r3,r3 - b Lfinish - nop - -/* case FFI_TYPE_UINT16 */ -Lret_type7: -#if defined(__ppc64__) - lhz r3,6(r5) -#else - lhz r3,2(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT16 */ -Lret_type8: -#if defined(__ppc64__) - lha r3,6(r5) -#else - lha r3,2(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT32 */ -Lret_type9: -#if defined(__ppc64__) - lwz r3,4(r5) -#else - lwz r3,0(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT32 */ -Lret_type10: -#if defined(__ppc64__) - lwz r3,4(r5) -#else - lwz r3,0(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT64 */ -Lret_type11: -#if defined(__ppc64__) - lg r3,0(r5) - b Lfinish - nop -#else - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish -#endif - nop - -/* case FFI_TYPE_SINT64 */ -Lret_type12: -#if defined(__ppc64__) - lg r3,0(r5) - b Lfinish - nop -#else - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish -#endif - nop - -/* case FFI_TYPE_STRUCT */ -Lret_type13: -#if defined(__ppc64__) - lg r3,0(r5) ; we need at least this... - cmpi 0,r0,4 - bgt Lstructend ; not a special small case - b Lsmallstruct ; see if we need more. -#else - cmpi 0,r0,4 - bgt Lfinish ; not by value - lg r3,0(r5) - b Lfinish -#endif -/* case FFI_TYPE_POINTER */ -Lret_type14: - lg r3,0(r5) - b Lfinish - nop - nop - -#if defined(__ppc64__) -Lsmallstruct: - beq Lfour ; continuation of Lret13. - cmpi 0,r0,3 - beq Lfinish ; don`t adjust this - can`t be any floats here... - srdi r3,r3,48 - cmpi 0,r0,2 - beq Lfinish ; .. or here .. - srdi r3,r3,8 - b Lfinish ; .. or here. - -Lfour: - lg r6,LINKAGE_SIZE(r1) ; get the result type - lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer - lg r6,0(r6) ; first element - lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type - cmpi 0,r0,2 ; FFI_TYPE_FLOAT - bne Lfourint - lfs f1,0(r5) ; just one float in the struct. - b Lfinish - -Lfourint: - srdi r3,r3,32 ; four bytes. - b Lfinish - -Lstructend: - lg r3,LINKAGE_SIZE(r1) ; get the result type - bl STRUCT_RETVALUE_P - cmpi 0,r3,0 - beq Lfinish ; nope. - /* Recover a pointer to the results. */ - addi r11,r1,(SAVE_SIZE-RESULT_BYTES) - lg r3,0(r11) ; we need at least this... - lg r4,8(r11) - cmpi 0,r0,16 - beq Lfinish ; special case 16 bytes we don't consider floats. - - /* OK, frustratingly, the process of saving the struct to mem might have - messed with the FPRs, so we have to re-load them :(. - We`ll use our FPRs space again - calling: - void darwin64_pass_struct_floats (ffi_type *s, char *src, - unsigned *nfpr, double **fprs) - We`ll temporarily pinch the first two slots of the param area for local - vars used by the routine. */ - xor r6,r6,r6 - addi r5,r1,PARENT_PARM_BASE ; some space - sg r6,0(r5) ; *nfpr zeroed. - addi r6,r5,8 ; **fprs - addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space - sg r3,0(r6) - mr r4,r11 ; the struct is here... - lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. - bl PASS_STR_FLOATS ; get struct floats into FPR save space. - /* See if we used any floats */ - lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) - cmpi 0,r0,0 - beq Lstructints ; nope. - /* OK load `em up... */ - lfd f1, (FP_SAVE_BASE )(r1) - lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) - lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) - lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) - lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) - lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) - lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) - lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) - lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) - lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) - lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) - lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) - lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) - - /* point back at our saved struct. */ -Lstructints: - addi r11,r1,(SAVE_SIZE-RESULT_BYTES) - lg r3,0(r11) ; we end up picking the - lg r4,8(r11) ; first two again. - lg r5,16(r11) - lg r6,24(r11) - lg r7,32(r11) - lg r8,40(r11) - lg r9,48(r11) - lg r10,56(r11) -#endif - -/* case done */ -Lfinish: - addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ - lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ - mtlr r0 /* Reset link register. */ - blr -Lendcode: - .align 1 - -/* END(ffi_closure_ASM) */ - -/* EH frame stuff. */ -#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) -/* 176, 400 */ -#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) -#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) - - .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: - .globl _ffi_closure_ASM.eh -_ffi_closure_ASM.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length - -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long Lstartcode-. ; FDE initial location - .set L$set$3,LFE1-Lstartcode - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$3,LCFI1-LCFI0 - .long L$set$3 - .byte 0xe ; DW_CFA_def_cfa_offset - .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-Lstartcode - .long L$set$4 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .align LOG2_GPR_BYTES -LEFDE1: - .align 1 - -#ifdef WANT_STUB - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_ffi_closure_helper_DARWIN$stub: - .indirect_symbol _ffi_closure_helper_DARWIN - mflr r0 - bcl 20,31,"L1$spb" -"L1$spb": - mflr r11 - addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") - mtlr r0 - lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_ffi_closure_helper_DARWIN$lazy_ptr: - .indirect_symbol _ffi_closure_helper_DARWIN - .g_long dyld_stub_binding_helper - -#if defined(__ppc64__) - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_darwin64_struct_ret_by_value_p$stub: - .indirect_symbol _darwin64_struct_ret_by_value_p - mflr r0 - bcl 20,31,"L2$spb" -"L2$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_darwin64_struct_ret_by_value_p$lazy_ptr: - .indirect_symbol _darwin64_struct_ret_by_value_p - .g_long dyld_stub_binding_helper - - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_darwin64_pass_struct_floats$stub: - .indirect_symbol _darwin64_pass_struct_floats - mflr r0 - bcl 20,31,"L3$spb" -"L3$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_darwin64_pass_struct_floats$lazy_ptr: - .indirect_symbol _darwin64_pass_struct_floats - .g_long dyld_stub_binding_helper -# endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi.c deleted file mode 100644 index efb441bbf..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi.c +++ /dev/null @@ -1,141 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include "ffi.h" -#include "ffi_common.h" -#include "ffi_powerpc.h" - -#if HAVE_LONG_DOUBLE_VARIANT -/* Adjust ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types (ffi_abi abi) -{ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# ifdef POWERPC64 - ffi_prep_types_linux64 (abi); -# else - ffi_prep_types_sysv (abi); -# endif -# endif -} -#endif - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64 (cif); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var (ffi_cif *cif, - unsigned int nfixedargs MAYBE_UNUSED, - unsigned int ntotalargs MAYBE_UNUSED) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead returns - them in memory. - - We bounce-buffer SYSV small struct return values so that sysv.S - can write r3 and r4 to memory without worrying about struct size. - - For ELFv2 ABI, use a bounce buffer for homogeneous structs too, - for similar reasons. */ - unsigned long smst_buffer[8]; - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - ecif.rvalue = rvalue; - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - ecif.rvalue = smst_buffer; - /* Ensure that we have a valid struct return value. - FIXME: Isn't this just papering over a user problem? */ - else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT) - ecif.rvalue = alloca (cif->rtype->size); - -#ifdef POWERPC64 - ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); -#else - ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); -#endif - - /* Check for a bounce-buffered return value */ - if (rvalue && ecif.rvalue == smst_buffer) - { - unsigned int rsize = cif->rtype->size; -#ifndef __LITTLE_ENDIAN__ - /* The SYSV ABI returns a structure of up to 4 bytes in size - left-padded in r3. */ -# ifndef POWERPC64 - if (rsize <= 4) - memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize); - else -# endif - /* The SYSV ABI returns a structure of up to 8 bytes in size - left-padded in r3/r4, and the ELFv2 ABI similarly returns a - structure of up to 8 bytes in size left-padded in r3. */ - if (rsize <= 8) - memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); - else -#endif - memcpy (rvalue, smst_buffer, rsize); - } -} - - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ -#ifdef POWERPC64 - return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc); -#else - return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc); -#endif -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c deleted file mode 100644 index cf6fb6d4b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c +++ /dev/null @@ -1,1359 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_darwin.c - - Copyright (C) 1998 Geoffrey Keating - Copyright (C) 2001 John Hornkvist - Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. - - FFI support for Darwin and AIX. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -extern void ffi_closure_ASM (void); - -enum { - /* The assembly depends on these exact flags. - For Darwin64 (when FLAG_RETURNS_STRUCT is set): - FLAG_RETURNS_FP indicates that the structure embeds FP data. - FLAG_RETURNS_128BITS signals a special struct size that is not - expanded for float content. */ - FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ - FLAG_RETURNS_NOTHING = 1 << (31-30), - FLAG_RETURNS_FP = 1 << (31-29), - FLAG_RETURNS_64BITS = 1 << (31-28), - - FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ - - FLAG_ARG_NEEDS_COPY = 1 << (31- 7), - FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4) -}; - -/* About the DARWIN ABI. */ -enum { - NUM_GPR_ARG_REGISTERS = 8, - NUM_FPR_ARG_REGISTERS = 13, - LINKAGE_AREA_GPRS = 6 -}; - -enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments. - - m32/m64 - - The stack layout we want looks like this: - - | Return address from ffi_call_DARWIN | higher addresses - |--------------------------------------------| - | Previous backchain pointer 4/8 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN - |--------------------------------------------| | - | When we have any FP activity... the | | - | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 from high to low addr. | | - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callee's LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< ffi_call_DARWIN - - */ - -#if defined(POWERPC_DARWIN64) -static void -darwin64_pass_struct_by_value - (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); -#endif - -/* This depends on GPR_SIZE = sizeof (unsigned long) */ - -void -ffi_prep_args (extended_cif *ecif, unsigned long *const stack) -{ - const unsigned bytes = ecif->cif->bytes; - const unsigned flags = ecif->cif->flags; - const unsigned nargs = ecif->cif->nargs; -#if !defined(POWERPC_DARWIN64) - const ffi_abi abi = ecif->cif->abi; -#endif - - /* 'stacktop' points at the previous backchain pointer. */ - unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); - - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; - int gp_count = 0, fparg_count = 0; - - /* 'next_arg' grows up as we put parameters in it. */ - unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ - - int i; - double double_tmp; - void **p_argv = ecif->avalue; - unsigned long gprvalue; - ffi_type** ptr = ecif->cif->arg_types; -#if !defined(POWERPC_DARWIN64) - char *dest_cpy; -#endif - unsigned size_al = 0; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); - FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); - FFI_ASSERT((bytes & 0xF) == 0); - - /* Deal with return values that are actually pass-by-reference. - Rule: - Return values are referenced by r3, so r4 is the first parameter. */ - - if (flags & FLAG_RETVAL_REFERENCE) - *next_arg++ = (unsigned long) (char *) ecif->rvalue; - - /* Now for the arguments. */ - for (i = nargs; i > 0; i--, ptr++, p_argv++) - { - switch ((*ptr)->type) - { - /* If a floating-point parameter appears before all of the general- - purpose registers are filled, the corresponding GPRs that match - the size of the floating-point parameter are skipped. */ - case FFI_TYPE_FLOAT: - double_tmp = *(float *) *p_argv; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; -#if defined(POWERPC_DARWIN) - *(float *)next_arg = *(float *) *p_argv; -#else - *(double *)next_arg = double_tmp; -#endif - next_arg++; - gp_count++; - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_DOUBLE: - double_tmp = *(double *) *p_argv; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *)next_arg = double_tmp; -#ifdef POWERPC64 - next_arg++; - gp_count++; -#else - next_arg += 2; - gp_count += 2; -#endif - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_LONGDOUBLE: -# if defined(POWERPC64) && !defined(POWERPC_DARWIN64) - /* ??? This will exceed the regs count when the value starts at fp13 - and it will not put the extra bit on the stack. */ - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *(long double *) fpr_base++ = *(long double *) *p_argv; - else - *(long double *) next_arg = *(long double *) *p_argv; - next_arg += 2; - fparg_count += 2; -# else - double_tmp = ((double *) *p_argv)[0]; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *) next_arg = double_tmp; -# if defined(POWERPC_DARWIN64) - next_arg++; - gp_count++; -# else - next_arg += 2; - gp_count += 2; -# endif - fparg_count++; - double_tmp = ((double *) *p_argv)[1]; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *) next_arg = double_tmp; -# if defined(POWERPC_DARWIN64) - next_arg++; - gp_count++; -# else - next_arg += 2; - gp_count += 2; -# endif - fparg_count++; -# endif - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; -#endif - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef POWERPC64 - gprvalue = *(long long *) *p_argv; - goto putgpr; -#else - *(long long *) next_arg = *(long long *) *p_argv; - next_arg += 2; - gp_count += 2; -#endif - break; - case FFI_TYPE_POINTER: - gprvalue = *(unsigned long *) *p_argv; - goto putgpr; - case FFI_TYPE_UINT8: - gprvalue = *(unsigned char *) *p_argv; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = *(signed char *) *p_argv; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = *(unsigned short *) *p_argv; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = *(signed short *) *p_argv; - goto putgpr; - - case FFI_TYPE_STRUCT: - size_al = (*ptr)->size; -#if defined(POWERPC_DARWIN64) - next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment); - darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, - (unsigned) size_al, - (unsigned int *) &fparg_count, - &fpr_base, &next_arg); -#else - dest_cpy = (char *) next_arg; - - /* If the first member of the struct is a double, then include enough - padding in the struct size to align it to double-word. */ - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN((*ptr)->size, 8); - -# if defined(POWERPC64) - FFI_ASSERT (abi != FFI_DARWIN); - memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); - next_arg += (size_al + 7) / 8; -# else - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. - Structures with 3 byte in size are padded upwards. */ - if (size_al < 3 && abi == FFI_DARWIN) - dest_cpy += 4 - size_al; - - memcpy((char *) dest_cpy, (char *) *p_argv, size_al); - next_arg += (size_al + 3) / 4; -# endif -#endif - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - gprvalue = *(signed int *) *p_argv; - goto putgpr; - - case FFI_TYPE_UINT32: - gprvalue = *(unsigned int *) *p_argv; - putgpr: - *next_arg++ = gprvalue; - gp_count++; - break; - default: - break; - } - } - - /* Check that we didn't overrun the stack... */ - /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); - FFI_ASSERT((unsigned *)fpr_base - <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); - FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */ -} - -#if defined(POWERPC_DARWIN64) - -/* See if we can put some of the struct into fprs. - This should not be called for structures of size 16 bytes, since these are not - broken out this way. */ -static void -darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) -{ - int i; - - FFI_ASSERT (s->type == FFI_TYPE_STRUCT) - - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p = s->elements[i]; - switch (p->type) - { - case FFI_TYPE_STRUCT: - darwin64_scan_struct_for_floats (p, nfpr); - break; - case FFI_TYPE_LONGDOUBLE: - (*nfpr) += 2; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_FLOAT: - (*nfpr) += 1; - break; - default: - break; - } - } -} - -static int -darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) -{ - unsigned struct_offset=0, i; - - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = ALIGN(struct_offset, p->alignment); - - item_base = src + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) - return 1; - break; - case FFI_TYPE_LONGDOUBLE: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - break; - case FFI_TYPE_FLOAT: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - break; - default: - /* If we try and place any item, that is non-float, once we've - exceeded the 8 GPR mark, then we can't fit the struct. */ - if ((unsigned long)item_base >= 8*8) - return 1; - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - return 0; -} - -/* Can this struct be returned by value? */ -int -darwin64_struct_ret_by_value_p (ffi_type *s) -{ - unsigned nfp = 0; - - FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); - - /* The largest structure we can return is 8long + 13 doubles. */ - if (s->size > 168) - return 0; - - /* We can't pass more than 13 floats. */ - darwin64_scan_struct_for_floats (s, &nfp); - if (nfp > 13) - return 0; - - /* If there are not too many floats, and the struct is - small enough to accommodate in the GPRs, then it must be OK. */ - if (s->size <= 64) - return 1; - - /* Well, we have to look harder. */ - nfp = 0; - if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) - return 0; - - return 1; -} - -void -darwin64_pass_struct_floats (ffi_type *s, char *src, - unsigned *nfpr, double **fprs) -{ - int i; - double *fpr_base = *fprs; - unsigned struct_offset = 0; - - /* We don't assume anything about the alignment of the source. */ - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = ALIGN(struct_offset, p->alignment); - item_base = src + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - darwin64_pass_struct_floats (p, item_base, nfpr, - &fpr_base); - break; - case FFI_TYPE_LONGDOUBLE: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = *(double *)item_base; - (*nfpr) += 1; - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = *(double *)item_base; - (*nfpr) += 1; - break; - case FFI_TYPE_FLOAT: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = (double) *(float *)item_base; - (*nfpr) += 1; - break; - default: - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - /* Update the scores. */ - *fprs = fpr_base; -} - -/* Darwin64 special rules. - Break out a struct into params and float registers. */ -static void -darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, - unsigned *nfpr, double **fprs, unsigned long **arg) -{ - unsigned long *next_arg = *arg; - char *dest_cpy = (char *)next_arg; - - FFI_ASSERT (s->type == FFI_TYPE_STRUCT) - - if (!size) - return; - - /* First... special cases. */ - if (size < 3 - || (size == 4 - && s->elements[0] - && s->elements[0]->type != FFI_TYPE_FLOAT)) - { - /* Must be at least one GPR, padding is unspecified in value, - let's make it zero. */ - *next_arg = 0UL; - dest_cpy += 8 - size; - memcpy ((char *) dest_cpy, src, size); - next_arg++; - } - else if (size == 16) - { - memcpy ((char *) dest_cpy, src, size); - next_arg += 2; - } - else - { - /* now the general case, we consider embedded floats. */ - memcpy ((char *) dest_cpy, src, size); - darwin64_pass_struct_floats (s, src, nfpr, fprs); - next_arg += (size+7)/8; - } - - *arg = next_arg; -} - -double * -darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) -{ - int i; - unsigned struct_offset = 0; - - /* We don't assume anything about the alignment of the source. */ - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = ALIGN(struct_offset, p->alignment); - item_base = dest + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); - break; - case FFI_TYPE_LONGDOUBLE: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(double *)item_base = *fprs++ ; - (*nf) += 1; - } - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(double *)item_base = *fprs++ ; - (*nf) += 1; - } - break; - case FFI_TYPE_FLOAT: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(float *)item_base = (float) *fprs++ ; - (*nf) += 1; - } - break; - default: - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - return fprs; -} - -#endif - -/* Adjust the size of S to be correct for Darwin. - On Darwin m32, the first field of a structure has natural alignment. - On Darwin m64, all fields have natural alignment. */ - -static void -darwin_adjust_aggregate_sizes (ffi_type *s) -{ - int i; - - if (s->type != FFI_TYPE_STRUCT) - return; - - s->size = 0; - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p; - int align; - - p = s->elements[i]; - if (p->type == FFI_TYPE_STRUCT) - darwin_adjust_aggregate_sizes (p); -#if defined(POWERPC_DARWIN64) - /* Natural alignment for all items. */ - align = p->alignment; -#else - /* Natural alignment for the first item... */ - if (i == 0) - align = p->alignment; - else if (p->alignment == 16 || p->alignment < 4) - /* .. subsequent items with vector or align < 4 have natural align. */ - align = p->alignment; - else - /* .. or align is 4. */ - align = 4; -#endif - /* Pad, if necessary, before adding the current item. */ - s->size = ALIGN(s->size, align) + p->size; - } - - s->size = ALIGN(s->size, s->alignment); - - /* This should not be necessary on m64, but harmless. */ - if (s->elements[0]->type == FFI_TYPE_UINT64 - || s->elements[0]->type == FFI_TYPE_SINT64 - || s->elements[0]->type == FFI_TYPE_DOUBLE - || s->elements[0]->alignment == 8) - s->alignment = s->alignment > 8 ? s->alignment : 8; - /* Do not add additional tail padding. */ -} - -/* Adjust the size of S to be correct for AIX. - Word-align double unless it is the first member of a structure. */ - -static void -aix_adjust_aggregate_sizes (ffi_type *s) -{ - int i; - - if (s->type != FFI_TYPE_STRUCT) - return; - - s->size = 0; - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p; - int align; - - p = s->elements[i]; - aix_adjust_aggregate_sizes (p); - align = p->alignment; - if (i != 0 && p->type == FFI_TYPE_DOUBLE) - align = 4; - s->size = ALIGN(s->size, align) + p->size; - } - - s->size = ALIGN(s->size, s->alignment); - - if (s->elements[0]->type == FFI_TYPE_UINT64 - || s->elements[0]->type == FFI_TYPE_SINT64 - || s->elements[0]->type == FFI_TYPE_DOUBLE - || s->elements[0]->alignment == 8) - s->alignment = s->alignment > 8 ? s->alignment : 8; - /* Do not add additional tail padding. */ -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* All this is for the DARWIN ABI. */ - unsigned i; - ffi_type **ptr; - unsigned bytes; - unsigned fparg_count = 0, intarg_count = 0; - unsigned flags = 0; - unsigned size_al = 0; - - /* All the machine-independent calculation of cif->bytes will be wrong. - All the calculation of structure sizes will also be wrong. - Redo the calculation for DARWIN. */ - - if (cif->abi == FFI_DARWIN) - { - darwin_adjust_aggregate_sizes (cif->rtype); - for (i = 0; i < cif->nargs; i++) - darwin_adjust_aggregate_sizes (cif->arg_types[i]); - } - - if (cif->abi == FFI_AIX) - { - aix_adjust_aggregate_sizes (cif->rtype); - for (i = 0; i < cif->nargs; i++) - aix_adjust_aggregate_sizes (cif->arg_types[i]); - } - - /* Space for the frame pointer, callee's LR, CR, etc, and for - the asm's temp regs. */ - - bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); - - /* Return value handling. - The rules m32 are as follows: - - 32-bit (or less) integer values are returned in gpr3; - - structures of size <= 4 bytes also returned in gpr3; - - 64-bit integer values [??? and structures between 5 and 8 bytes] are - returned in gpr3 and gpr4; - - Single/double FP values are returned in fpr1; - - Long double FP (if not equivalent to double) values are returned in - fpr1 and fpr2; - m64: - - 64-bit or smaller integral values are returned in GPR3 - - Single/double FP values are returned in fpr1; - - Long double FP values are returned in fpr1 and fpr2; - m64 Structures: - - If the structure could be accommodated in registers were it to be the - first argument to a routine, then it is returned in those registers. - m32/m64 structures otherwise: - - Larger structures values are allocated space and a pointer is passed - as the first argument. */ - switch (cif->rtype->type) - { - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - flags |= FLAG_RETURNS_FP; - break; -#endif - - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef POWERPC64 - case FFI_TYPE_POINTER: -#endif - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: -#if defined(POWERPC_DARWIN64) - { - /* Can we fit the struct into regs? */ - if (darwin64_struct_ret_by_value_p (cif->rtype)) - { - unsigned nfpr = 0; - flags |= FLAG_RETURNS_STRUCT; - if (cif->rtype->size != 16) - darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; - else - flags |= FLAG_RETURNS_128BITS; - /* Will be 0 for 16byte struct. */ - if (nfpr) - flags |= FLAG_RETURNS_FP; - } - else /* By ref. */ - { - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - } - } -#elif defined(DARWIN_PPC) - if (cif->rtype->size <= 4) - flags |= FLAG_RETURNS_STRUCT; - else /* else by reference. */ - { - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - } -#else /* assume we pass by ref. */ - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; -#endif - break; - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the - first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest - goes on the stack. - ??? Structures are passed as a pointer to a copy of the structure. - Stuff on the stack needs to keep proper alignment. - For m64 the count is effectively of half-GPRs. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned align_words; - switch ((*ptr)->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - fparg_count++; -#if !defined(POWERPC_DARWIN64) - /* If this FP arg is going on the stack, it must be - 8-byte-aligned. */ - if (fparg_count > NUM_FPR_ARG_REGISTERS - && (intarg_count & 0x01) != 0) - intarg_count++; -#endif - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - fparg_count += 2; - /* If this FP arg is going on the stack, it must be - 16-byte-aligned. */ - if (fparg_count >= NUM_FPR_ARG_REGISTERS) -#if defined (POWERPC64) - intarg_count = ALIGN(intarg_count, 2); -#else - intarg_count = ALIGN(intarg_count, 4); -#endif - break; -#endif - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#if defined(POWERPC64) - intarg_count++; -#else - /* 'long long' arguments are passed as two words, but - either both words must fit in registers or both go - on the stack. If they go on the stack, they must - be 8-byte-aligned. */ - if (intarg_count == NUM_GPR_ARG_REGISTERS-1 - || (intarg_count >= NUM_GPR_ARG_REGISTERS - && (intarg_count & 0x01) != 0)) - intarg_count++; - intarg_count += 2; -#endif - break; - - case FFI_TYPE_STRUCT: - size_al = (*ptr)->size; -#if defined(POWERPC_DARWIN64) - align_words = (*ptr)->alignment >> 3; - if (align_words) - intarg_count = ALIGN(intarg_count, align_words); - /* Base size of the struct. */ - intarg_count += (size_al + 7) / 8; - /* If 16 bytes then don't worry about floats. */ - if (size_al != 16) - /* Scan through for floats to be placed in regs. */ - darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; -#else - align_words = (*ptr)->alignment >> 2; - if (align_words) - intarg_count = ALIGN(intarg_count, align_words); - /* If the first member of the struct is a double, then align - the struct to double-word. - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN((*ptr)->size, 8); */ -# ifdef POWERPC64 - intarg_count += (size_al + 7) / 8; -# else - intarg_count += (size_al + 3) / 4; -# endif -#endif - break; - - default: - /* Everything else is passed as a 4-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - break; - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - -#if defined(POWERPC_DARWIN64) - /* Space to image the FPR registers, if needed - which includes when they might be - used in a struct return. */ - if (fparg_count != 0 - || ((flags & FLAG_RETURNS_STRUCT) - && (flags & FLAG_RETURNS_FP))) - bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); -#else - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); -#endif - - /* Stack space. */ -#ifdef POWERPC64 - if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + fparg_count) * sizeof(long); -#else - if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + 2 * fparg_count) * sizeof(long); -#endif - else - bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = ALIGN(bytes, 16) ; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void)); - -extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void), ffi_type*); - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_AIX: - ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args)); - break; - case FFI_DARWIN: - ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args), cif->rtype); - break; - default: - FFI_ASSERT(0); - break; - } -} - -static void flush_icache(char *); -static void flush_range(char *, int); - -/* The layout of a function descriptor. A C function pointer really - points to one of these. */ - -typedef struct aix_fd_struct { - void *code_pointer; - void *toc; -} aix_fd; - -/* here I'd like to add the stack frame layout we use in darwin_closure.S - and aix_closure.S - - m32/m64 - - The stack layout looks like this: - - | Additional params... | | Higher address - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | - | Reserved 2*4/8 | | - |--------------------------------------------| | - | Space for callee's LR 4/8 | | - |--------------------------------------------| | - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | - | Current backchain pointer 4/8 |-/ Parent's frame. - |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM - | Result Bytes 16 | | - |--------------------------------------------| | - ~ padding to 16-byte alignment ~ ~ - |--------------------------------------------| | - | NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 13*8 | | - |--------------------------------------------| | - | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved [compiler,binder] 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callee's LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< ffi_closure_ASM. - -*/ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - struct ffi_aix_trampoline_struct *tramp_aix; - aix_fd *fd; - - switch (cif->abi) - { - case FFI_DARWIN: - - FFI_ASSERT (cif->abi == FFI_DARWIN); - - tramp = (unsigned int *) &closure->tramp[0]; -#if defined(POWERPC_DARWIN64) - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ - /* We put the addresses here. */ - tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ - tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ - tramp[8] = 0x7c0803a6; /* mtlr r0 */ - tramp[9] = 0x7d8903a6; /* mtctr r12 */ - tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ - tramp[11] = 0x4e800420; /* bctr */ - - *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ - *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ -#else - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ - tramp[4] = 0x7d6802a6; /* mflr r11 */ - tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ - tramp[6] = 0x7c0803a6; /* mtlr r0 */ - tramp[7] = 0x7d8903a6; /* mtctr r12 */ - tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ - tramp[9] = 0x4e800420; /* bctr */ - tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ - tramp[3] = (unsigned long) codeloc; /* context */ -#endif - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the icache. Only necessary on Darwin. */ - flush_range(codeloc, FFI_TRAMPOLINE_SIZE); - - break; - - case FFI_AIX: - - tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); - fd = (aix_fd *)(void *)ffi_closure_ASM; - - FFI_ASSERT (cif->abi == FFI_AIX); - - tramp_aix->code_pointer = fd->code_pointer; - tramp_aix->toc = fd->toc; - tramp_aix->static_chain = codeloc; - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - break; - - default: - return FFI_BAD_ABI; - break; - } - return FFI_OK; -} - -static void -flush_icache(char *addr) -{ -#ifndef _AIX - __asm__ volatile ( - "dcbf 0,%0\n" - "\tsync\n" - "\ticbi 0,%0\n" - "\tsync\n" - "\tisync" - : : "r"(addr) : "memory"); -#endif -} - -static void -flush_range(char * addr1, int size) -{ -#define MIN_LINE_SIZE 32 - int i; - for (i = 0; i < size; i += MIN_LINE_SIZE) - flush_icache(addr1+i); - flush_icache(addr1+size-1); -} - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -ffi_type * -ffi_closure_helper_DARWIN (ffi_closure *, void *, - unsigned long *, ffi_dblfl *); - -/* Basically the trampoline invokes ffi_closure_ASM, and on - entry, r11 holds the address of the closure. - After storing the registers that could possibly contain - parameters to be passed into the stack frame and setting - up space for a return value, ffi_closure_ASM invokes the - following helper function to do most of the work. */ - -ffi_type * -ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - /* rvalue is the pointer to space for return value in closure assembly - pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM - pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ - - typedef double ldbits[2]; - - union ldu - { - ldbits lb; - long double ld; - }; - - void ** avalue; - ffi_type ** arg_types; - long i, avn; - ffi_cif * cif; - ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; - unsigned size_al; -#if defined(POWERPC_DARWIN64) - unsigned fpsused = 0; -#endif - - cif = closure->cif; - avalue = alloca (cif->nargs * sizeof(void *)); - - if (cif->rtype->type == FFI_TYPE_STRUCT) - { -#if defined(POWERPC_DARWIN64) - if (!darwin64_struct_ret_by_value_p (cif->rtype)) - { - /* Won't fit into the regs - return by ref. */ - rvalue = (void *) *pgr; - pgr++; - } -#elif defined(DARWIN_PPC) - if (cif->rtype->size > 4) - { - rvalue = (void *) *pgr; - pgr++; - } -#else /* assume we return by ref. */ - rvalue = (void *) *pgr; - pgr++; -#endif - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 7; -#else - avalue[i] = (char *) pgr + 3; -#endif - pgr++; - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 6; -#else - avalue[i] = (char *) pgr + 2; -#endif - pgr++; - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 4; -#else - case FFI_TYPE_POINTER: - avalue[i] = pgr; -#endif - pgr++; - break; - - case FFI_TYPE_STRUCT: - size_al = arg_types[i]->size; -#if defined(POWERPC_DARWIN64) - pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment); - if (size_al < 3 || size_al == 4) - { - avalue[i] = ((char *)pgr)+8-size_al; - if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT - && fpsused < NUM_FPR_ARG_REGISTERS) - { - *(float *)pgr = (float) *(double *)pfr; - pfr++; - fpsused++; - } - } - else - { - if (size_al != 16) - pfr = (ffi_dblfl *) - darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, - (double *)pfr, &fpsused); - avalue[i] = pgr; - } - pgr += (size_al + 7) / 8; -#else - /* If the first member of the struct is a double, then align - the struct to double-word. */ - if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN(arg_types[i]->size, 8); -# if defined(POWERPC64) - FFI_ASSERT (cif->abi != FFI_DARWIN); - avalue[i] = pgr; - pgr += (size_al + 7) / 8; -# else - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. */ - if (size_al < 3 && cif->abi == FFI_DARWIN) - avalue[i] = (char*) pgr + 4 - size_al; - else - avalue[i] = pgr; - pgr += (size_al + 3) / 4; -# endif -#endif - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: -#if defined(POWERPC64) - case FFI_TYPE_POINTER: - avalue[i] = pgr; - pgr++; - break; -#else - /* Long long ints are passed in two gpr's. */ - avalue[i] = pgr; - pgr += 2; - break; -#endif - - case FFI_TYPE_FLOAT: - /* A float value consumes a GPR. - There are 13 64bit floating point registers. */ - if (pfr < end_pfr) - { - double temp = pfr->d; - pfr->f = (float) temp; - avalue[i] = pfr; - pfr++; - } - else - { - avalue[i] = pgr; - } - pgr++; - break; - - case FFI_TYPE_DOUBLE: - /* A double value consumes two GPRs. - There are 13 64bit floating point registers. */ - if (pfr < end_pfr) - { - avalue[i] = pfr; - pfr++; - } - else - { - avalue[i] = pgr; - } -#ifdef POWERPC64 - pgr++; -#else - pgr += 2; -#endif - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_LONGDOUBLE: -#ifdef POWERPC64 - if (pfr + 1 < end_pfr) - { - avalue[i] = pfr; - pfr += 2; - } - else - { - if (pfr < end_pfr) - { - *pgr = *(unsigned long *) pfr; - pfr++; - } - avalue[i] = pgr; - } - pgr += 2; -#else /* POWERPC64 */ - /* A long double value consumes four GPRs and two FPRs. - There are 13 64bit floating point registers. */ - if (pfr + 1 < end_pfr) - { - avalue[i] = pfr; - pfr += 2; - } - /* Here we have the situation where one part of the long double - is stored in fpr13 and the other part is already on the stack. - We use a union to pass the long double to avalue[i]. */ - else if (pfr + 1 == end_pfr) - { - union ldu temp_ld; - memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits)); - memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits)); - avalue[i] = &temp_ld.ld; - pfr++; - } - else - { - avalue[i] = pgr; - } - pgr += 4; -#endif /* POWERPC64 */ - break; -#endif - default: - FFI_ASSERT(0); - } - i++; - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_linux64.c b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_linux64.c deleted file mode 100644 index b087af8c6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_linux64.c +++ /dev/null @@ -1,943 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_linux64.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include "ffi.h" - -#ifdef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the LINUX64 ABI. */ -enum { - NUM_GPR_ARG_REGISTERS64 = 8, - NUM_FPR_ARG_REGISTERS64 = 13 -}; -enum { ASM_NEEDS_REGISTERS64 = 4 }; - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_linux64 (ffi_abi abi) -{ - if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - - -#if _CALL_ELF == 2 -static unsigned int -discover_homogeneous_aggregate (const ffi_type *t, unsigned int *elnum) -{ - switch (t->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - *elnum = 1; - return (int) t->type; - - case FFI_TYPE_STRUCT:; - { - unsigned int base_elt = 0, total_elnum = 0; - ffi_type **el = t->elements; - while (*el) - { - unsigned int el_elt, el_elnum = 0; - el_elt = discover_homogeneous_aggregate (*el, &el_elnum); - if (el_elt == 0 - || (base_elt && base_elt != el_elt)) - return 0; - base_elt = el_elt; - total_elnum += el_elnum; - if (total_elnum > 8) - return 0; - el++; - } - *elnum = total_elnum; - return base_elt; - } - - default: - return 0; - } -} -#endif - - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_linux64_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fparg_count = 0, intarg_count = 0; - unsigned flags = cif->flags; -#if _CALL_ELF == 2 - unsigned int elt, elnum; -#endif - -#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE - /* If compiled without long double support.. */ - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - return FFI_BAD_ABI; -#endif - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ -#if _CALL_ELF == 2 - /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ - bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); - - /* Space for the general registers. */ - bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); -#else - /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp - regs. */ - bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); - - /* Space for the mandatory parm save area and general registers. */ - bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); -#endif - - /* Return value handling. */ - switch (cif->rtype->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (cif->rtype, &elnum); - if (elt) - { - if (elt == FFI_TYPE_DOUBLE) - flags |= FLAG_RETURNS_64BITS; - flags |= FLAG_RETURNS_FP | FLAG_RETURNS_SMST; - break; - } - if (cif->rtype->size <= 16) - { - flags |= FLAG_RETURNS_SMST; - break; - } -#endif - intarg_count++; - flags |= FLAG_RETVAL_REFERENCE; - /* Fall through. */ - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned int align; - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - fparg_count++; - intarg_count++; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - case FFI_TYPE_FLOAT: - fparg_count++; - intarg_count++; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - align = align / 8; - if (align > 1) - intarg_count = ALIGN (intarg_count, align); - } - intarg_count += ((*ptr)->size + 7) / 8; -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (*ptr, &elnum); - if (elt) - { - fparg_count += elnum; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - else -#endif - { - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* Everything else is passed as a 8-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - default: - FFI_ASSERT (0); - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (intarg_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); - - /* Stack space. */ -#if _CALL_ELF == 2 - if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) - bytes += intarg_count * sizeof (long); -#else - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); -#endif - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64 (ffi_cif *cif) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = cif->nargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; - return ffi_prep_cif_linux64_core (cif); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64_var (ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs MAYBE_UNUSED) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = nfixedargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; -#if _CALL_ELF == 2 - cif->flags |= FLAG_ARG_NEEDS_PSAVE; -#endif - return ffi_prep_cif_linux64_core (cif); -} - - -/* ffi_prep_args64 is called by the assembly routine once stack space - has been allocated for the function's arguments. - - The stack layout we want looks like this: - - | Ret addr from ffi_call_LINUX64 8bytes | higher addresses - |--------------------------------------------| - | CR save area 8bytes | - |--------------------------------------------| - | Previous backchain pointer 8 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | Saved r28-r31 4*8 | | ffi_call_LINUX64 - |--------------------------------------------| | - | GPR registers r3-r10 8*8 | | - |--------------------------------------------| | - | FPR registers f1-f13 (optional) 13*8 | | - |--------------------------------------------| | - | Parameter save area | | - |--------------------------------------------| | - | TOC save area 8 | | - |--------------------------------------------| | stack | - | Linker doubleword 8 | | grows | - |--------------------------------------------| | down V - | Compiler doubleword 8 | | - |--------------------------------------------| | lower addresses - | Space for callee's LR 8 | | - |--------------------------------------------| | - | CR save area 8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 8 |-/ during - |--------------------------------------------| <<< ffi_call_LINUX64 - -*/ - -void FFI_HIDDEN -ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) -{ - const unsigned long bytes = ecif->cif->bytes; - const unsigned long flags = ecif->cif->flags; - - typedef union - { - char *c; - unsigned long *ul; - float *f; - double *d; - size_t p; - } valp; - - /* 'stacktop' points at the previous backchain pointer. */ - valp stacktop; - - /* 'next_arg' points at the space for gpr3, and grows upwards as - we use GPR registers, then continues at rest. */ - valp gpr_base; - valp gpr_end; - valp rest; - valp next_arg; - - /* 'fpr_base' points at the space for fpr3, and grows upwards as - we use FPR registers. */ - valp fpr_base; - unsigned int fparg_count; - - unsigned int i, words, nargs, nfixedargs; - ffi_type **ptr; - double double_tmp; - union - { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - signed int **si; - unsigned int **ui; - unsigned long **ul; - float **f; - double **d; - } p_argv; - unsigned long gprvalue; - unsigned long align; - - stacktop.c = (char *) stack + bytes; - gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; - gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; -#if _CALL_ELF == 2 - rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; -#else - rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; -#endif - fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; - fparg_count = 0; - next_arg.ul = gpr_base.ul; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); - FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); - FFI_ASSERT ((bytes & 0xF) == 0); - - /* Deal with return values that are actually pass-by-reference. */ - if (flags & FLAG_RETVAL_REFERENCE) - *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; - - /* Now for the arguments. */ - p_argv.v = ecif->avalue; - nargs = ecif->cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = ecif->cif->nfixedargs; - for (ptr = ecif->cif->arg_types, i = 0; - i < nargs; - i++, ptr++, p_argv.v++) - { -#if _CALL_ELF == 2 - unsigned int elt, elnum; -#endif - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - double_tmp = (*p_argv.d)[0]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - double_tmp = (*p_argv.d)[1]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (__LDBL_MANT_DIG__ == 106); - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - double_tmp = **p_argv.d; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -#endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: - double_tmp = **p_argv.f; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.f = (float) double_tmp; -#endif - } - else - *next_arg.f = (float) double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_STRUCT: - if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - if (align > 1) - next_arg.p = ALIGN (next_arg.p, align); - } -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (*ptr, &elnum); - if (elt) - { - union { - void *v; - float *f; - double *d; - } arg; - - arg.v = *p_argv.v; - if (elt == FFI_TYPE_FLOAT) - { - do - { - double_tmp = *arg.f++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 - && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.f = (float) double_tmp; - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - fparg_count++; - } - while (--elnum != 0); - if ((next_arg.p & 3) != 0) - { - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - } - } - else - do - { - double_tmp = *arg.d++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.d = double_tmp; - if (++next_arg.d == gpr_end.d) - next_arg.d = rest.d; - fparg_count++; - } - while (--elnum != 0); - } - else -#endif - { - words = ((*ptr)->size + 7) / 8; - if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) - { - size_t first = gpr_end.c - next_arg.c; - memcpy (next_arg.c, *p_argv.c, first); - memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); - next_arg.c = rest.c + words * 8 - first; - } - else - { - char *where = next_arg.c; - -#ifndef __LITTLE_ENDIAN__ - /* Structures with size less than eight bytes are passed - left-padded. */ - if ((*ptr)->size < 8) - where += 8 - (*ptr)->size; -#endif - memcpy (where, *p_argv.c, (*ptr)->size); - next_arg.ul += words; - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - } - } - break; - - case FFI_TYPE_UINT8: - gprvalue = **p_argv.uc; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = **p_argv.sc; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = **p_argv.us; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = **p_argv.ss; - goto putgpr; - case FFI_TYPE_UINT32: - gprvalue = **p_argv.ui; - goto putgpr; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - gprvalue = **p_argv.si; - goto putgpr; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - gprvalue = **p_argv.ul; - putgpr: - *next_arg.ul++ = gprvalue; - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - break; - } - } - - FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS - || (next_arg.ul >= gpr_base.ul - && next_arg.ul <= gpr_base.ul + 4)); -} - - -#if _CALL_ELF == 2 -#define MIN_CACHE_LINE_SIZE 8 - -static void -flush_icache (char *wraddr, char *xaddr, int size) -{ - int i; - for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" - : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" - : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) - : "memory"); -} -#endif - -ffi_status -ffi_prep_closure_loc_linux64 (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ -#if _CALL_ELF == 2 - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ - tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ - tramp[2] = 0x7d8903a6; /* mtctr 12 */ - tramp[3] = 0x4e800420; /* bctr */ - /* 1: .quad function_addr */ - /* 2: .quad context */ - *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; - *(void **) &tramp[6] = codeloc; - flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); -#else - void **tramp = (void **) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - /* Copy function address and TOC from ffi_closure_LINUX64. */ - memcpy (tramp, (char *) ffi_closure_LINUX64, 16); - tramp[2] = tramp[1]; - tramp[1] = codeloc; -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - - -int FFI_HIDDEN -ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, - unsigned long *pst, ffi_dblfl *pfr) -{ - /* rvalue is the pointer to space for return value in closure assembly */ - /* pst is the pointer to parameter save area - (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ - /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ - - void **avalue; - ffi_type **arg_types; - unsigned long i, avn, nfixedargs; - ffi_cif *cif; - ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; - unsigned long align; - - cif = closure->cif; - avalue = alloca (cif->nargs * sizeof (void *)); - - /* Copy the caller's structure return value address so that the - closure returns the data directly to the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT - && (cif->flags & FLAG_RETURNS_SMST) == 0) - { - rvalue = (void *) *pst; - pst++; - } - - i = 0; - avn = cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((cif->flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = cif->nfixedargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - unsigned int elt, elnum; - - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 7; - pst++; - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 6; - pst++; - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 4; - pst++; - break; -#endif - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = arg_types[i]->alignment; - if (align > 16) - align = 16; - if (align > 1) - pst = (unsigned long *) ALIGN ((size_t) pst, align); - } - elt = 0; -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (arg_types[i], &elnum); -#endif - if (elt) - { - union { - void *v; - unsigned long *ul; - float *f; - double *d; - size_t p; - } to, from; - - /* Repackage the aggregate from its parts. The - aggregate size is not greater than the space taken by - the registers so store back to the register/parameter - save arrays. */ - if (pfr + elnum <= end_pfr) - to.v = pfr; - else - to.v = pst; - - avalue[i] = to.v; - from.ul = pst; - if (elt == FFI_TYPE_FLOAT) - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.f = (float) pfr->d; - pfr++; - } - else - *to.f = *from.f; - to.f++; - from.f++; - } - while (--elnum != 0); - } - else - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.d = pfr->d; - pfr++; - } - else - *to.d = *from.d; - to.d++; - from.d++; - } - while (--elnum != 0); - } - } - else - { -#ifndef __LITTLE_ENDIAN__ - /* Structures with size less than eight bytes are passed - left-padded. */ - if (arg_types[i]->size < 8) - avalue[i] = (char *) pst + 8 - arg_types[i]->size; - else -#endif - avalue[i] = pst; - } - pst += (arg_types[i]->size + 7) / 8; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - if (pfr + 1 < end_pfr && i + 1 < nfixedargs) - { - avalue[i] = pfr; - pfr += 2; - } - else - { - if (pfr < end_pfr && i < nfixedargs) - { - /* Passed partly in f13 and partly on the stack. - Move it all to the stack. */ - *pst = *(unsigned long *) pfr; - pfr++; - } - avalue[i] = pst; - } - pst += 2; - break; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - /* On the outgoing stack all values are aligned to 8 */ - /* there are 13 64bit floating point registers */ - - if (pfr < end_pfr && i < nfixedargs) - { - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_FLOAT: - if (pfr < end_pfr && i < nfixedargs) - { - /* Float values are stored as doubles in the - ffi_closure_LINUX64 code. Fix them here. */ - pfr->f = (float) pfr->d; - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pst; - pst++; - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - { - if ((cif->flags & FLAG_RETURNS_FP) == 0) - return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; - else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) - return FFI_V2_TYPE_DOUBLE_HOMOG; - else - return FFI_V2_TYPE_FLOAT_HOMOG; - } - return cif->rtype->type; -} -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_powerpc.h b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_powerpc.h deleted file mode 100644 index 2e61653d1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_powerpc.h +++ /dev/null @@ -1,77 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_powerpc.h - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -enum { - /* The assembly depends on these exact flags. */ - /* These go in cr7 */ - FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ - FLAG_RETURNS_NOTHING = 1 << (31-30), - FLAG_RETURNS_FP = 1 << (31-29), - FLAG_RETURNS_64BITS = 1 << (31-28), - - /* This goes in cr6 */ - FLAG_RETURNS_128BITS = 1 << (31-27), - - FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */ - - /* These go in cr1 */ - FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */ - FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */ - FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4) -}; - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -void FFI_HIDDEN ffi_closure_SYSV (void); -void FFI_HIDDEN ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, - void (*)(void)); - -void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *); -int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *, - ffi_dblfl *, unsigned long *); - -void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, unsigned long, - unsigned long *, void (*)(void)); -void FFI_HIDDEN ffi_closure_LINUX64 (void); - -void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int, - unsigned int); -void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const); -int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, - unsigned long *, ffi_dblfl *); diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c deleted file mode 100644 index fbe85fe91..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c +++ /dev/null @@ -1,931 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_sysv.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include "ffi.h" - -#ifndef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the SYSV ABI. */ -#define ASM_NEEDS_REGISTERS 4 -#define NUM_GPR_ARG_REGISTERS 8 -#define NUM_FPR_ARG_REGISTERS 8 - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_sysv (ffi_abi abi) -{ - if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - -/* Transform long double, double and float to other types as per abi. */ -static int -translate_float (int abi, int type) -{ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (type == FFI_TYPE_LONGDOUBLE - && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0) - type = FFI_TYPE_DOUBLE; -#endif - if ((abi & FFI_SYSV_SOFT_FLOAT) != 0) - { - if (type == FFI_TYPE_FLOAT) - type = FFI_TYPE_UINT32; - else if (type == FFI_TYPE_DOUBLE) - type = FFI_TYPE_UINT64; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - else if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_UINT128; - } - else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0) - { - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - } - return type; -} - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_sysv_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fparg_count = 0, intarg_count = 0; - unsigned flags = cif->flags; - unsigned struct_copy_size = 0; - unsigned type = cif->rtype->type; - unsigned size = cif->rtype->size; - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ - - /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ - bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); - - /* Space for the GPR registers. */ - bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); - - /* Return value handling. The rules for SYSV are as follows: - - 32-bit (or less) integer values are returned in gpr3; - - Structures of size <= 4 bytes also returned in gpr3; - - 64-bit integer values and structures between 5 and 8 bytes are returned - in gpr3 and gpr4; - - Larger structures are allocated space and a pointer is passed as - the first argument. - - Single/double FP values are returned in fpr1; - - long doubles (if not equivalent to double) are returned in - fpr1,fpr2 for Linux and as for large structs for SysV. */ - - type = translate_float (cif->abi, type); - - switch (type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead - returns them in memory. */ - if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - { - flags |= FLAG_RETURNS_SMST; - break; - } - intarg_count++; - flags |= FLAG_RETVAL_REFERENCE; - /* Fall through. */ - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the - first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest - goes on the stack. Structures and long doubles (if not equivalent - to double) are passed as a pointer to a copy of the structure. - Stuff on the stack needs to keep proper alignment. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned short typenum = (*ptr)->type; - - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - fparg_count++; - /* Fall thru */ -#endif - case FFI_TYPE_DOUBLE: - fparg_count++; - /* If this FP arg is going on the stack, it must be - 8-byte-aligned. */ - if (fparg_count > NUM_FPR_ARG_REGISTERS - && intarg_count >= NUM_GPR_ARG_REGISTERS - && intarg_count % 2 != 0) - intarg_count++; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_FLOAT: - fparg_count++; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set - of four consecutive gprs. If we do not have enough, we - have to adjust the intarg_count value. */ - if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3 - && intarg_count < NUM_GPR_ARG_REGISTERS) - intarg_count = NUM_GPR_ARG_REGISTERS; - intarg_count += 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* 'long long' arguments are passed as two words, but - either both words must fit in registers or both go - on the stack. If they go on the stack, they must - be 8-byte-aligned. - - Also, only certain register pairs can be used for - passing long long int -- specifically (r3,r4), (r5,r6), - (r7,r8), (r9,r10). */ - if (intarg_count == NUM_GPR_ARG_REGISTERS-1 - || intarg_count % 2 != 0) - intarg_count++; - intarg_count += 2; - break; - - case FFI_TYPE_STRUCT: - /* We must allocate space for a copy of these to enforce - pass-by-value. Pad the space up to a multiple of 16 - bytes (the maximum alignment required for anything under - the SYSV ABI). */ - struct_copy_size += ((*ptr)->size + 15) & ~0xF; - /* Fall through (allocate space for the pointer). */ - - case FFI_TYPE_POINTER: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* Everything else is passed as a 4-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - break; - - default: - FFI_ASSERT (0); - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (intarg_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - if (struct_copy_size != 0) - flags |= FLAG_ARG_NEEDS_COPY; - - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); - - /* Stack space. */ - if (intarg_count > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int); - if (fparg_count > NUM_FPR_ARG_REGISTERS) - bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double); - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - /* Add in the space for the copied structures. */ - bytes += struct_copy_size; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_sysv (ffi_cif *cif) -{ - if ((cif->abi & FFI_SYSV) == 0) - { - /* This call is from old code. Translate to new ABI values. */ - cif->flags |= FLAG_COMPAT; - switch (cif->abi) - { - default: - return FFI_BAD_ABI; - - case FFI_COMPAT_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_GCC_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_LINUX: - cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - - case FFI_COMPAT_LINUX_SOFT_FLOAT: - cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - } - } - return ffi_prep_cif_sysv_core (cif); -} - -/* ffi_prep_args_SYSV is called by the assembly routine once stack space - has been allocated for the function's arguments. - - The stack layout we want looks like this: - - | Return address from ffi_call_SYSV 4bytes | higher addresses - |--------------------------------------------| - | Previous backchain pointer 4 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | Saved r28-r31 4*4 | | ffi_call_SYSV - |--------------------------------------------| | - | GPR registers r3-r10 8*4 | | ffi_call_SYSV - |--------------------------------------------| | - | FPR registers f1-f8 (optional) 8*8 | | - |--------------------------------------------| | stack | - | Space for copied structures | | grows | - |--------------------------------------------| | down V - | Parameters that didn't fit in registers | | - |--------------------------------------------| | lower addresses - | Space for callee's LR 4 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4 |-/ during - |--------------------------------------------| <<< ffi_call_SYSV - -*/ - -void FFI_HIDDEN -ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) -{ - const unsigned bytes = ecif->cif->bytes; - const unsigned flags = ecif->cif->flags; - - typedef union - { - char *c; - unsigned *u; - long long *ll; - float *f; - double *d; - } valp; - - /* 'stacktop' points at the previous backchain pointer. */ - valp stacktop; - - /* 'gpr_base' points at the space for gpr3, and grows upwards as - we use GPR registers. */ - valp gpr_base; - int intarg_count; - -#ifndef __NO_FPRS__ - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - valp fpr_base; - int fparg_count; -#endif - - /* 'copy_space' grows down as we put structures in it. It should - stay 16-byte aligned. */ - valp copy_space; - - /* 'next_arg' grows up as we put parameters in it. */ - valp next_arg; - - int i; - ffi_type **ptr; -#ifndef __NO_FPRS__ - double double_tmp; -#endif - union - { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **ui; - long long **ll; - float **f; - double **d; - } p_argv; - size_t struct_copy_size; - unsigned gprvalue; - - stacktop.c = (char *) stack + bytes; - gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS; - intarg_count = 0; -#ifndef __NO_FPRS__ - fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS; - fparg_count = 0; - copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); -#else - copy_space.c = gpr_base.c; -#endif - next_arg.u = stack + 2; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); - FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); - FFI_ASSERT ((bytes & 0xF) == 0); - FFI_ASSERT (copy_space.c >= next_arg.c); - - /* Deal with return values that are actually pass-by-reference. */ - if (flags & FLAG_RETVAL_REFERENCE) - { - *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; - intarg_count++; - } - - /* Now for the arguments. */ - p_argv.v = ecif->avalue; - for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; - i > 0; - i--, ptr++, p_argv.v++) - { - unsigned int typenum = (*ptr)->type; - - typenum = translate_float (ecif->cif->abi, typenum); - - /* Now test the translated value */ - switch (typenum) - { -#ifndef __NO_FPRS__ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - double_tmp = (*p_argv.d)[0]; - - if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) - { - if (intarg_count >= NUM_GPR_ARG_REGISTERS - && intarg_count % 2 != 0) - { - intarg_count++; - next_arg.u++; - } - *next_arg.d = double_tmp; - next_arg.u += 2; - double_tmp = (*p_argv.d)[1]; - *next_arg.d = double_tmp; - next_arg.u += 2; - } - else - { - *fpr_base.d++ = double_tmp; - double_tmp = (*p_argv.d)[1]; - *fpr_base.d++ = double_tmp; - } - - fparg_count += 2; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -# endif - case FFI_TYPE_DOUBLE: - double_tmp = **p_argv.d; - - if (fparg_count >= NUM_FPR_ARG_REGISTERS) - { - if (intarg_count >= NUM_GPR_ARG_REGISTERS - && intarg_count % 2 != 0) - { - intarg_count++; - next_arg.u++; - } - *next_arg.d = double_tmp; - next_arg.u += 2; - } - else - *fpr_base.d++ = double_tmp; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: - double_tmp = **p_argv.f; - if (fparg_count >= NUM_FPR_ARG_REGISTERS) - { - *next_arg.f = (float) double_tmp; - next_arg.u += 1; - intarg_count++; - } - else - *fpr_base.d++ = double_tmp; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -#endif /* have FPRs */ - - case FFI_TYPE_UINT128: - /* The soft float ABI for long doubles works like this, a long double - is passed in four consecutive GPRs if available. A maximum of 2 - long doubles can be passed in gprs. If we do not have 4 GPRs - left, the long double is passed on the stack, 4-byte aligned. */ - { - unsigned int int_tmp; - unsigned int ii; - if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) - { - if (intarg_count < NUM_GPR_ARG_REGISTERS) - intarg_count = NUM_GPR_ARG_REGISTERS; - for (ii = 0; ii < 4; ii++) - { - int_tmp = (*p_argv.ui)[ii]; - *next_arg.u++ = int_tmp; - } - } - else - { - for (ii = 0; ii < 4; ii++) - { - int_tmp = (*p_argv.ui)[ii]; - *gpr_base.u++ = int_tmp; - } - } - intarg_count += 4; - break; - } - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (intarg_count == NUM_GPR_ARG_REGISTERS-1) - intarg_count++; - if (intarg_count >= NUM_GPR_ARG_REGISTERS) - { - if (intarg_count % 2 != 0) - { - intarg_count++; - next_arg.u++; - } - *next_arg.ll = **p_argv.ll; - next_arg.u += 2; - } - else - { - /* The abi states only certain register pairs can be - used for passing long long int specifically (r3,r4), - (r5,r6), (r7,r8), (r9,r10). If next arg is long long - but not correct starting register of pair then skip - until the proper starting register. */ - if (intarg_count % 2 != 0) - { - intarg_count ++; - gpr_base.u++; - } - *gpr_base.ll++ = **p_argv.ll; - } - intarg_count += 2; - break; - - case FFI_TYPE_STRUCT: - struct_copy_size = ((*ptr)->size + 15) & ~0xF; - copy_space.c -= struct_copy_size; - memcpy (copy_space.c, *p_argv.c, (*ptr)->size); - - gprvalue = (unsigned long) copy_space.c; - - FFI_ASSERT (copy_space.c > next_arg.c); - FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); - goto putgpr; - - case FFI_TYPE_UINT8: - gprvalue = **p_argv.uc; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = **p_argv.sc; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = **p_argv.us; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = **p_argv.ss; - goto putgpr; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - - gprvalue = **p_argv.ui; - - putgpr: - if (intarg_count >= NUM_GPR_ARG_REGISTERS) - *next_arg.u++ = gprvalue; - else - *gpr_base.u++ = gprvalue; - intarg_count++; - break; - } - } - - /* Check that we didn't overrun the stack... */ - FFI_ASSERT (copy_space.c >= next_arg.c); - FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); - /* The assert below is testing that the number of integer arguments agrees - with the number found in ffi_prep_cif_machdep(). However, intarg_count - is incremented whenever we place an FP arg on the stack, so account for - that before our assert test. */ -#ifndef __NO_FPRS__ - if (fparg_count > NUM_FPR_ARG_REGISTERS) - intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS; - FFI_ASSERT (fpr_base.u - <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); -#endif - FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); -} - -#define MIN_CACHE_LINE_SIZE 8 - -static void -flush_icache (char *wraddr, char *xaddr, int size) -{ - int i; - for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" - : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" - : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) - : "memory"); -} - -ffi_status FFI_HIDDEN -ffi_prep_closure_loc_sysv (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x4800000d; /* bl 10 */ - tramp[4] = 0x7d6802a6; /* mflr r11 */ - tramp[5] = 0x7c0803a6; /* mtlr r0 */ - tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ - tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ - tramp[8] = 0x7c0903a6; /* mtctr r0 */ - tramp[9] = 0x4e800420; /* bctr */ - *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */ - *(void **) &tramp[3] = codeloc; /* context */ - - /* Flush the icache. */ - flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - entry, r11 holds the address of the closure. - After storing the registers that could possibly contain - parameters to be passed into the stack frame and setting - up space for a return value, ffi_closure_SYSV invokes the - following helper function to do most of the work. */ - -int -ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr, - unsigned long *pst) -{ - /* rvalue is the pointer to space for return value in closure assembly */ - /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ - /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ - /* pst is the pointer to outgoing parameter stack in original caller */ - - void ** avalue; - ffi_type ** arg_types; - long i, avn; -#ifndef __NO_FPRS__ - long nf = 0; /* number of floating registers already used */ -#endif - long ng = 0; /* number of general registers already used */ - - ffi_cif *cif = closure->cif; - unsigned size = cif->rtype->size; - unsigned short rtypenum = cif->rtype->type; - - avalue = alloca (cif->nargs * sizeof (void *)); - - /* First translate for softfloat/nonlinux */ - rtypenum = translate_float (cif->abi, rtypenum); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. - For FFI_SYSV the result is passed in r3/r4 if the struct size is less - or equal 8 bytes. */ - if (rtypenum == FFI_TYPE_STRUCT - && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)) - { - rvalue = (void *) *pgr; - ng++; - pgr++; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) { - unsigned short typenum = arg_types[i]->type; - - /* We may need to handle some values depending on ABI. */ - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#ifndef __NO_FPRS__ - case FFI_TYPE_FLOAT: - /* Unfortunately float values are stored as doubles - in the ffi_closure_SYSV code (since we don't check - the type in that routine). */ - if (nf < NUM_FPR_ARG_REGISTERS) - { - /* FIXME? here we are really changing the values - stored in the original calling routines outgoing - parameter stack. This is probably a really - naughty thing to do but... */ - double temp = pfr->d; - pfr->f = (float) temp; - avalue[i] = pfr; - nf++; - pfr++; - } - else - { - avalue[i] = pst; - pst += 1; - } - break; - - case FFI_TYPE_DOUBLE: - if (nf < NUM_FPR_ARG_REGISTERS) - { - avalue[i] = pfr; - nf++; - pfr++; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 2; - } - break; - -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if (nf < NUM_FPR_ARG_REGISTERS - 1) - { - avalue[i] = pfr; - pfr += 2; - nf += 2; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 4; - nf = 8; - } - break; -# endif -#endif - - case FFI_TYPE_UINT128: - /* Test if for the whole long double, 4 gprs are available. - otherwise the stuff ends up on the stack. */ - if (ng < NUM_GPR_ARG_REGISTERS - 3) - { - avalue[i] = pgr; - pgr += 4; - ng += 4; - } - else - { - avalue[i] = pst; - pst += 4; - ng = 8+4; - } - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 3; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 3; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 2; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 2; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = pgr; - ng++; - pgr++; - } - else - { - avalue[i] = pst; - pst++; - } - break; - - case FFI_TYPE_STRUCT: - /* Structs are passed by reference. The address will appear in a - gpr if it is one of the first 8 arguments. */ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (void *) *pgr; - ng++; - pgr++; - } - else - { - avalue[i] = (void *) *pst; - pst++; - } - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* Passing long long ints are complex, they must - be passed in suitable register pairs such as - (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) - and if the entire pair aren't available then the outgoing - parameter stack is used for both but an alignment of 8 - must will be kept. So we must either look in pgr - or pst to find the correct address for this type - of parameter. */ - if (ng < NUM_GPR_ARG_REGISTERS - 1) - { - if (ng & 1) - { - /* skip r4, r6, r8 as starting points */ - ng++; - pgr++; - } - avalue[i] = pgr; - ng += 2; - pgr += 2; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 2; - ng = NUM_GPR_ARG_REGISTERS; - } - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. - Because the FFI_SYSV ABI returns the structures <= 8 bytes in - r3/r4 we have to tell ffi_closure_SYSV how to treat them. We - combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of - the struct less one. We never have a struct with size zero. - See the comment in ffitarget.h about ordering. */ - if (rtypenum == FFI_TYPE_STRUCT - && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size; - return rtypenum; -} -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffitarget.h deleted file mode 100644 index b47b0f5d3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ffitarget.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc - Copyright (c) 1996-2003 Red Hat, Inc. - - Target configuration macros for PowerPC. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#ifndef POWERPC_DARWIN64 -#define POWERPC_DARWIN64 -#endif -#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - -#if defined (POWERPC_AIX) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_AIX, - FFI_LAST_ABI - -#elif defined (POWERPC_DARWIN) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_DARWIN, - FFI_LAST_ABI - -#else - /* The FFI_COMPAT values are used by old code. Since libffi may be - a shared library we have to support old values for backwards - compatibility. */ - FFI_COMPAT_SYSV, - FFI_COMPAT_GCC_SYSV, - FFI_COMPAT_LINUX64, - FFI_COMPAT_LINUX, - FFI_COMPAT_LINUX_SOFT_FLOAT, - -# if defined (POWERPC64) - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 64-bit linux. We - only need worry about FFI_COMPAT_LINUX64, but to be safe avoid - all old values. */ - FFI_LINUX = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_LINUX_STRUCT_ALIGN = 1, - FFI_LINUX_LONG_DOUBLE_128 = 2, - FFI_DEFAULT_ABI = (FFI_LINUX -# ifdef __STRUCT_PARM_ALIGN__ - | FFI_LINUX_STRUCT_ALIGN -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_LINUX_LONG_DOUBLE_128 -# endif - ), - FFI_LAST_ABI = 12 - -# else - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ - FFI_SYSV = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_SYSV_SOFT_FLOAT = 1, - FFI_SYSV_STRUCT_RET = 2, - FFI_SYSV_IBM_LONG_DOUBLE = 4, - FFI_SYSV_LONG_DOUBLE_128 = 16, - - FFI_DEFAULT_ABI = (FFI_SYSV -# ifdef __NO_FPRS__ - | FFI_SYSV_SOFT_FLOAT -# endif -# if (defined (__SVR4_STRUCT_RETURN) \ - || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) - | FFI_SYSV_STRUCT_RET -# endif -# if __LDBL_MANT_DIG__ == 106 - | FFI_SYSV_IBM_LONG_DOUBLE -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_SYSV_LONG_DOUBLE_128 -# endif - ), - FFI_LAST_ABI = 32 -# endif -#endif - -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#if defined (POWERPC) || defined (POWERPC_FREEBSD) -# define FFI_TARGET_SPECIFIC_VARIADIC 1 -# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs -#endif - -/* For additional types like the below, take care about the order in - ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ - -/* Needed for soft-float long-double-128 support. */ -#define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1) - -/* Needed for FFI_SYSV small structure returns. */ -#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) - -/* Used by ELFv2 for homogenous structure returns. */ -#define FFI_V2_TYPE_FLOAT_HOMOG (FFI_TYPE_LAST + 1) -#define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_TYPE_LAST + 2) -#define FFI_V2_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 3) - -#if _CALL_ELF == 2 -# define FFI_TRAMPOLINE_SIZE 32 -#else -# if defined(POWERPC64) || defined(POWERPC_AIX) -# if defined(POWERPC_DARWIN64) -# define FFI_TRAMPOLINE_SIZE 48 -# else -# define FFI_TRAMPOLINE_SIZE 24 -# endif -# else /* POWERPC || POWERPC_AIX */ -# define FFI_TRAMPOLINE_SIZE 40 -# endif -#endif - -#ifndef LIBFFI_ASM -#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) -struct ffi_aix_trampoline_struct { - void * code_pointer; /* Pointer to ffi_closure_ASM */ - void * toc; /* TOC */ - void * static_chain; /* Pointer to closure */ -}; -#endif -#endif - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64.S deleted file mode 100644 index c4d01d8e3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64.S +++ /dev/null @@ -1,260 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC64 Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifdef POWERPC64 - .hidden ffi_call_LINUX64 - .globl ffi_call_LINUX64 -# if _CALL_ELF == 2 - .text -ffi_call_LINUX64: - addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_call_LINUX64@l - .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_call_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 - .type ffi_call_LINUX64,@function - .text -.L.ffi_call_LINUX64: -# else - .hidden .ffi_call_LINUX64 - .globl .ffi_call_LINUX64 - .quad .ffi_call_LINUX64,.TOC.@tocbase,0 - .size ffi_call_LINUX64,24 - .type .ffi_call_LINUX64,@function - .text -.ffi_call_LINUX64: -# endif -# endif -.LFB1: - mflr %r0 - std %r28, -32(%r1) - std %r29, -24(%r1) - std %r30, -16(%r1) - std %r31, -8(%r1) - std %r0, 16(%r1) - - mr %r28, %r1 /* our AP. */ -.LCFI0: - stdux %r1, %r1, %r4 - mr %r31, %r5 /* flags, */ - mr %r30, %r6 /* rvalue, */ - mr %r29, %r7 /* function address. */ -/* Save toc pointer, not for the ffi_prep_args64 call, but for the later - bctrl function call. */ -# if _CALL_ELF == 2 - std %r2, 24(%r1) -# else - std %r2, 40(%r1) -# endif - - /* Call ffi_prep_args64. */ - mr %r4, %r1 -# if defined _CALL_LINUX || _CALL_ELF == 2 - bl ffi_prep_args64 -# else - bl .ffi_prep_args64 -# endif - -# if _CALL_ELF == 2 - mr %r12, %r29 -# else - ld %r12, 0(%r29) - ld %r2, 8(%r29) - ld %r11, 16(%r29) -# endif - /* Now do the call. */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, %r31 - - /* Get the address to call into CTR. */ - mtctr %r12 - /* Load all those argument registers. */ - ld %r3, -32-(8*8)(%r28) - ld %r4, -32-(7*8)(%r28) - ld %r5, -32-(6*8)(%r28) - ld %r6, -32-(5*8)(%r28) - bf- 5, 1f - ld %r7, -32-(4*8)(%r28) - ld %r8, -32-(3*8)(%r28) - ld %r9, -32-(2*8)(%r28) - ld %r10, -32-(1*8)(%r28) -1: - - /* Load all the FP registers. */ - bf- 6, 2f - lfd %f1, -32-(21*8)(%r28) - lfd %f2, -32-(20*8)(%r28) - lfd %f3, -32-(19*8)(%r28) - lfd %f4, -32-(18*8)(%r28) - lfd %f5, -32-(17*8)(%r28) - lfd %f6, -32-(16*8)(%r28) - lfd %f7, -32-(15*8)(%r28) - lfd %f8, -32-(14*8)(%r28) - lfd %f9, -32-(13*8)(%r28) - lfd %f10, -32-(12*8)(%r28) - lfd %f11, -32-(11*8)(%r28) - lfd %f12, -32-(10*8)(%r28) - lfd %f13, -32-(9*8)(%r28) -2: - - /* Make the call. */ - bctrl - - /* This must follow the call immediately, the unwinder - uses this to find out if r2 has been saved or not. */ -# if _CALL_ELF == 2 - ld %r2, 24(%r1) -# else - ld %r2, 40(%r1) -# endif - - /* Now, deal with the return value. */ - mtcrf 0x01, %r31 - bt 31, .Lstruct_return_value - bt 30, .Ldone_return_value - bt 29, .Lfp_return_value - std %r3, 0(%r30) - /* Fall through... */ - -.Ldone_return_value: - /* Restore the registers we used and return. */ - mr %r1, %r28 - ld %r0, 16(%r28) - ld %r28, -32(%r28) - mtlr %r0 - ld %r29, -24(%r1) - ld %r30, -16(%r1) - ld %r31, -8(%r1) - blr - -.Lfp_return_value: - bf 28, .Lfloat_return_value - stfd %f1, 0(%r30) - mtcrf 0x02, %r31 /* cr6 */ - bf 27, .Ldone_return_value - stfd %f2, 8(%r30) - b .Ldone_return_value -.Lfloat_return_value: - stfs %f1, 0(%r30) - b .Ldone_return_value - -.Lstruct_return_value: - bf 29, .Lsmall_struct - bf 28, .Lfloat_homog_return_value - stfd %f1, 0(%r30) - stfd %f2, 8(%r30) - stfd %f3, 16(%r30) - stfd %f4, 24(%r30) - stfd %f5, 32(%r30) - stfd %f6, 40(%r30) - stfd %f7, 48(%r30) - stfd %f8, 56(%r30) - b .Ldone_return_value - -.Lfloat_homog_return_value: - stfs %f1, 0(%r30) - stfs %f2, 4(%r30) - stfs %f3, 8(%r30) - stfs %f4, 12(%r30) - stfs %f5, 16(%r30) - stfs %f6, 20(%r30) - stfs %f7, 24(%r30) - stfs %f8, 28(%r30) - b .Ldone_return_value - -.Lsmall_struct: - std %r3, 0(%r30) - std %r4, 8(%r30) - b .Ldone_return_value - -.LFE1: - .long 0 - .byte 0,12,0,1,128,4,0,0 -# if _CALL_ELF == 2 - .size ffi_call_LINUX64,.-ffi_call_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 -# else - .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 -# endif -# endif - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry -.LSCIE1: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 -8 # CIE Data Alignment Factor - .byte 0x41 # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x14 # FDE Encoding (pcrel udata8) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1 - .uleb128 0x0 - .align 3 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # FDE Length -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # FDE CIE offset - .8byte .LFB1-. # FDE initial location - .8byte .LFE1-.LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x2 # DW_CFA_advance_loc1 - .byte .LCFI0-.LFB1 - .byte 0xd # DW_CFA_def_cfa_register - .uleb128 0x1c - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x41 - .sleb128 -2 - .byte 0x9f # DW_CFA_offset, column 0x1f - .uleb128 0x1 - .byte 0x9e # DW_CFA_offset, column 0x1e - .uleb128 0x2 - .byte 0x9d # DW_CFA_offset, column 0x1d - .uleb128 0x3 - .byte 0x9c # DW_CFA_offset, column 0x1c - .uleb128 0x4 - .align 3 -.LEFDE1: - -# if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -# endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64_closure.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64_closure.S deleted file mode 100644 index bc61b5ed9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/linux64_closure.S +++ /dev/null @@ -1,391 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC64 Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ -#define LIBFFI_ASM -#include -#include - - .file "linux64_closure.S" - -#ifdef POWERPC64 - FFI_HIDDEN (ffi_closure_LINUX64) - .globl ffi_closure_LINUX64 -# if _CALL_ELF == 2 - .text -ffi_closure_LINUX64: - addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l - .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_closure_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 - .type ffi_closure_LINUX64,@function - .text -.L.ffi_closure_LINUX64: -# else - FFI_HIDDEN (.ffi_closure_LINUX64) - .globl .ffi_closure_LINUX64 - .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 - .size ffi_closure_LINUX64,24 - .type .ffi_closure_LINUX64,@function - .text -.ffi_closure_LINUX64: -# endif -# endif - -# if _CALL_ELF == 2 -# 32 byte special reg save area + 64 byte parm save area -# + 64 byte retval area + 13*8 fpr save area + round to 16 -# define STACKFRAME 272 -# define PARMSAVE 32 -# define RETVAL PARMSAVE+64 -# else -# 48 bytes special reg save area + 64 bytes parm save area -# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 -# define STACKFRAME 240 -# define PARMSAVE 48 -# define RETVAL PARMSAVE+64 -# endif - -.LFB1: -# if _CALL_ELF == 2 - ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif - mflr %r0 - lwz %r12, 28(%r12) # cif->flags - mtcrf 0x40, %r12 - addi %r12, %r1, PARMSAVE - bt 7, .Lparmsave - # Our caller has not allocated a parameter save area. - # We need to allocate one here and use it to pass gprs to - # ffi_closure_helper_LINUX64. - addi %r12, %r1, -STACKFRAME+PARMSAVE -.Lparmsave: - std %r0, 16(%r1) - # Save general regs into parm save area - std %r3, 0(%r12) - std %r4, 8(%r12) - std %r5, 16(%r12) - std %r6, 24(%r12) - std %r7, 32(%r12) - std %r8, 40(%r12) - std %r9, 48(%r12) - std %r10, 56(%r12) - - # load up the pointer to the parm save area - mr %r5, %r12 -# else - # copy r2 to r11 and load TOC into r2 - mr %r11, %r2 - ld %r2, 16(%r11) - - mflr %r0 - # Save general regs into parm save area - # This is the parameter save area set up by our caller. - std %r3, PARMSAVE+0(%r1) - std %r4, PARMSAVE+8(%r1) - std %r5, PARMSAVE+16(%r1) - std %r6, PARMSAVE+24(%r1) - std %r7, PARMSAVE+32(%r1) - std %r8, PARMSAVE+40(%r1) - std %r9, PARMSAVE+48(%r1) - std %r10, PARMSAVE+56(%r1) - - std %r0, 16(%r1) - - # load up the pointer to the parm save area - addi %r5, %r1, PARMSAVE -# endif - - # next save fpr 1 to fpr 13 - stfd %f1, -104+(0*8)(%r1) - stfd %f2, -104+(1*8)(%r1) - stfd %f3, -104+(2*8)(%r1) - stfd %f4, -104+(3*8)(%r1) - stfd %f5, -104+(4*8)(%r1) - stfd %f6, -104+(5*8)(%r1) - stfd %f7, -104+(6*8)(%r1) - stfd %f8, -104+(7*8)(%r1) - stfd %f9, -104+(8*8)(%r1) - stfd %f10, -104+(9*8)(%r1) - stfd %f11, -104+(10*8)(%r1) - stfd %f12, -104+(11*8)(%r1) - stfd %f13, -104+(12*8)(%r1) - - # load up the pointer to the saved fpr registers */ - addi %r6, %r1, -104 - - # load up the pointer to the result storage - addi %r4, %r1, -STACKFRAME+RETVAL - - stdu %r1, -STACKFRAME(%r1) -.LCFI0: - - # get the context pointer from the trampoline - mr %r3, %r11 - - # make the call -# if defined _CALL_LINUX || _CALL_ELF == 2 - bl ffi_closure_helper_LINUX64 -# else - bl .ffi_closure_helper_LINUX64 -# endif -.Lret: - - # now r3 contains the return type - # so use it to look up in a table - # so we know how to deal with each type - - # look up the proper starting point in table - # by using return type as offset - ld %r0, STACKFRAME+16(%r1) - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT - bge .Lsmall - mflr %r4 # move address of .Lret to r4 - sldi %r3, %r3, 4 # now multiply return type by 16 - addi %r4, %r4, .Lret_type0 - .Lret - add %r3, %r3, %r4 # add contents of table to table address - mtctr %r3 - bctr # jump to it - -# Each of the ret_typeX code fragments has to be exactly 16 bytes long -# (4 instructions). For cache effectiveness we align to a 16 byte boundary -# first. - .align 4 - -.Lret_type0: -# case FFI_TYPE_VOID - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr - nop -# case FFI_TYPE_INT -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_FLOAT - lfs %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_DOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_LONGDOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - lfd %f2, RETVAL+8(%r1) - b .Lfinish -# case FFI_TYPE_UINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_SINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish -# case FFI_TYPE_UINT16 -# ifdef __LITTLE_ENDIAN__ - lhz %r3, RETVAL+0(%r1) -# else - lhz %r3, RETVAL+6(%r1) -# endif - mtlr %r0 -.Lfinish: - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_SINT16 -# ifdef __LITTLE_ENDIAN__ - lha %r3, RETVAL+0(%r1) -# else - lha %r3, RETVAL+6(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_UINT32 -# ifdef __LITTLE_ENDIAN__ - lwz %r3, RETVAL+0(%r1) -# else - lwz %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_SINT32 -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_UINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_SINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_TYPE_STRUCT - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr - nop -# case FFI_TYPE_POINTER - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - blr -# case FFI_V2_TYPE_FLOAT_HOMOG - lfs %f1, RETVAL+0(%r1) - lfs %f2, RETVAL+4(%r1) - lfs %f3, RETVAL+8(%r1) - b .Lmorefloat -# case FFI_V2_TYPE_DOUBLE_HOMOG - lfd %f1, RETVAL+0(%r1) - lfd %f2, RETVAL+8(%r1) - lfd %f3, RETVAL+16(%r1) - lfd %f4, RETVAL+24(%r1) - mtlr %r0 - lfd %f5, RETVAL+32(%r1) - lfd %f6, RETVAL+40(%r1) - lfd %f7, RETVAL+48(%r1) - lfd %f8, RETVAL+56(%r1) - addi %r1, %r1, STACKFRAME - blr -.Lmorefloat: - lfs %f4, RETVAL+12(%r1) - mtlr %r0 - lfs %f5, RETVAL+16(%r1) - lfs %f6, RETVAL+20(%r1) - lfs %f7, RETVAL+24(%r1) - lfs %f8, RETVAL+28(%r1) - addi %r1, %r1, STACKFRAME - blr -.Lsmall: -# ifdef __LITTLE_ENDIAN__ - ld %r3,RETVAL+0(%r1) - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - blr -# else - # A struct smaller than a dword is returned in the low bits of r3 - # ie. right justified. Larger structs are passed left justified - # in r3 and r4. The return value area on the stack will have - # the structs as they are usually stored in memory. - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes? - neg %r5, %r3 - ld %r3,RETVAL+0(%r1) - blt .Lsmalldown - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - blr -.Lsmalldown: - addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7 - mtlr %r0 - sldi %r5, %r5, 3 - addi %r1, %r1, STACKFRAME - srd %r3, %r3, %r5 - blr -# endif - -.LFE1: - .long 0 - .byte 0,12,0,1,128,0,0,0 -# if _CALL_ELF == 2 - .size ffi_closure_LINUX64,.-ffi_closure_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 -# else - .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 -# endif -# endif - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry -.LSCIE1: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 -8 # CIE Data Alignment Factor - .byte 0x41 # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x14 # FDE Encoding (pcrel udata8) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1 - .uleb128 0x0 - .align 3 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # FDE Length -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # FDE CIE offset - .8byte .LFB1-. # FDE initial location - .8byte .LFE1-.LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x2 # DW_CFA_advance_loc1 - .byte .LCFI0-.LFB1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 STACKFRAME - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x41 - .sleb128 -2 - .align 3 -.LEFDE1: - -# if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -# endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S deleted file mode 100644 index 075922cbb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S +++ /dev/null @@ -1,384 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ -#define LIBFFI_ASM -#include -#include -#include - - .file "ppc_closure.S" - -#ifndef POWERPC64 - -ENTRY(ffi_closure_SYSV) -.LFB1: - stwu %r1,-144(%r1) -.LCFI0: - mflr %r0 -.LCFI1: - stw %r0,148(%r1) - -# we want to build up an areas for the parameters passed -# in registers (both floating point and integer) - - # so first save gpr 3 to gpr 10 (aligned to 4) - stw %r3, 16(%r1) - stw %r4, 20(%r1) - stw %r5, 24(%r1) - stw %r6, 28(%r1) - stw %r7, 32(%r1) - stw %r8, 36(%r1) - stw %r9, 40(%r1) - stw %r10,44(%r1) - -#ifndef __NO_FPRS__ - # next save fpr 1 to fpr 8 (aligned to 8) - stfd %f1, 48(%r1) - stfd %f2, 56(%r1) - stfd %f3, 64(%r1) - stfd %f4, 72(%r1) - stfd %f5, 80(%r1) - stfd %f6, 88(%r1) - stfd %f7, 96(%r1) - stfd %f8, 104(%r1) -#endif - - # set up registers for the routine that actually does the work - # get the context pointer from the trampoline - mr %r3,%r11 - - # now load up the pointer to the result storage - addi %r4,%r1,112 - - # now load up the pointer to the saved gpr registers - addi %r5,%r1,16 - - # now load up the pointer to the saved fpr registers */ - addi %r6,%r1,48 - - # now load up the pointer to the outgoing parameter - # stack in the previous frame - # i.e. the previous frame pointer + 8 - addi %r7,%r1,152 - - # make the call - bl ffi_closure_helper_SYSV@local -.Lret: - # now r3 contains the return type - # so use it to look up in a table - # so we know how to deal with each type - - # look up the proper starting point in table - # by using return type as offset - - mflr %r4 # move address of .Lret to r4 - slwi %r3,%r3,4 # now multiply return type by 16 - addi %r4, %r4, .Lret_type0 - .Lret - lwz %r0,148(%r1) - add %r3,%r3,%r4 # add contents of table to table address - mtctr %r3 - bctr # jump to it -.LFE1: - -# Each of the ret_typeX code fragments has to be exactly 16 bytes long -# (4 instructions). For cache effectiveness we align to a 16 byte boundary -# first. - .align 4 -# case FFI_TYPE_VOID -.Lret_type0: - mtlr %r0 - addi %r1,%r1,144 - blr - nop - -# case FFI_TYPE_INT - lwz %r3,112+0(%r1) - mtlr %r0 -.Lfinish: - addi %r1,%r1,144 - blr - -# case FFI_TYPE_FLOAT -#ifndef __NO_FPRS__ - lfs %f1,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 -#else - nop - nop - nop -#endif - blr - -# case FFI_TYPE_DOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 -#else - nop - nop - nop -#endif - blr - -# case FFI_TYPE_LONGDOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) - lfd %f2,112+8(%r1) - mtlr %r0 - b .Lfinish -#else - nop - nop - nop - blr -#endif - -# case FFI_TYPE_UINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_SINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_UINT16 -#ifdef __LITTLE_ENDIAN__ - lhz %r3,112+0(%r1) -#else - lhz %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_SINT16 -#ifdef __LITTLE_ENDIAN__ - lha %r3,112+0(%r1) -#else - lha %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_UINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_SINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_UINT64 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_SINT64 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_STRUCT - mtlr %r0 - addi %r1,%r1,144 - blr - nop - -# case FFI_TYPE_POINTER - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_TYPE_UINT128 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - lwz %r5,112+8(%r1) - b .Luint128 - -# The return types below are only used when the ABI type is FFI_SYSV. -# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. - lbz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. - lhz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. - lwz %r3,112+0(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - addi %r1,%r1,144 - blr -#else - srwi %r3,%r3,8 - mtlr %r0 - b .Lfinish -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,24 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,16 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,8 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -#ifndef __LITTLE_ENDIAN__ -.Lstruct567: - subfic %r6,%r5,32 - srw %r4,%r4,%r5 - slw %r6,%r3,%r6 - srw %r3,%r3,%r5 - or %r4,%r6,%r4 - mtlr %r0 - addi %r1,%r1,144 - blr -#endif - -.Luint128: - lwz %r6,112+12(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - -END(ffi_closure_SYSV) - - .section ".eh_frame",EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry -.LSCIE1: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version -#if defined _RELOCATABLE || defined __PIC__ - .ascii "zR\0" # CIE Augmentation -#else - .ascii "\0" # CIE Augmentation -#endif - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 -4 # CIE Data Alignment Factor - .byte 0x41 # CIE RA Column -#if defined _RELOCATABLE || defined __PIC__ - .uleb128 0x1 # Augmentation size - .byte 0x1b # FDE Encoding (pcrel sdata4) -#endif - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1 - .uleb128 0x0 - .align 2 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # FDE Length -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # FDE CIE offset -#if defined _RELOCATABLE || defined __PIC__ - .4byte .LFB1-. # FDE initial location -#else - .4byte .LFB1 # FDE initial location -#endif - .4byte .LFE1-.LFB1 # FDE address range -#if defined _RELOCATABLE || defined __PIC__ - .uleb128 0x0 # Augmentation size -#endif - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI0-.LFB1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 144 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI1-.LCFI0 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x41 - .sleb128 -1 - .align 2 -.LEFDE1: - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/powerpc/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/powerpc/sysv.S deleted file mode 100644 index fed2380c9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/powerpc/sysv.S +++ /dev/null @@ -1,220 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 1998 Geoffrey Keating - Copyright (C) 2007 Free Software Foundation, Inc - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include - -#ifndef POWERPC64 - .globl ffi_prep_args_SYSV -ENTRY(ffi_call_SYSV) -.LFB1: - /* Save the old stack pointer as AP. */ - mr %r8,%r1 - -.LCFI0: - /* Allocate the stack space we need. */ - stwux %r1,%r1,%r4 - /* Save registers we use. */ - mflr %r9 - stw %r28,-16(%r8) -.LCFI1: - stw %r29,-12(%r8) -.LCFI2: - stw %r30, -8(%r8) -.LCFI3: - stw %r31, -4(%r8) -.LCFI4: - stw %r9, 4(%r8) -.LCFI5: - - /* Save arguments over call... */ - mr %r31,%r5 /* flags, */ - mr %r30,%r6 /* rvalue, */ - mr %r29,%r7 /* function address, */ - mr %r28,%r8 /* our AP. */ -.LCFI6: - - /* Call ffi_prep_args_SYSV. */ - mr %r4,%r1 - bl ffi_prep_args_SYSV@local - - /* Now do the call. */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40,%r31 - /* Get the address to call into CTR. */ - mtctr %r29 - /* Load all those argument registers. */ - lwz %r3,-16-(8*4)(%r28) - lwz %r4,-16-(7*4)(%r28) - lwz %r5,-16-(6*4)(%r28) - lwz %r6,-16-(5*4)(%r28) - bf- 5,1f - nop - lwz %r7,-16-(4*4)(%r28) - lwz %r8,-16-(3*4)(%r28) - lwz %r9,-16-(2*4)(%r28) - lwz %r10,-16-(1*4)(%r28) - nop -1: - -#ifndef __NO_FPRS__ - /* Load all the FP registers. */ - bf- 6,2f - lfd %f1,-16-(8*4)-(8*8)(%r28) - lfd %f2,-16-(8*4)-(7*8)(%r28) - lfd %f3,-16-(8*4)-(6*8)(%r28) - lfd %f4,-16-(8*4)-(5*8)(%r28) - nop - lfd %f5,-16-(8*4)-(4*8)(%r28) - lfd %f6,-16-(8*4)-(3*8)(%r28) - lfd %f7,-16-(8*4)-(2*8)(%r28) - lfd %f8,-16-(8*4)-(1*8)(%r28) -#endif -2: - - /* Make the call. */ - bctrl - - /* Now, deal with the return value. */ - mtcrf 0x01,%r31 /* cr7 */ - bt- 31,L(small_struct_return_value) - bt- 30,L(done_return_value) -#ifndef __NO_FPRS__ - bt- 29,L(fp_return_value) -#endif - stw %r3,0(%r30) - bf+ 28,L(done_return_value) - stw %r4,4(%r30) - mtcrf 0x02,%r31 /* cr6 */ - bf 27,L(done_return_value) - stw %r5,8(%r30) - stw %r6,12(%r30) - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - lwz %r9, 4(%r28) - lwz %r31, -4(%r28) - mtlr %r9 - lwz %r30, -8(%r28) - lwz %r29,-12(%r28) - lwz %r28,-16(%r28) - lwz %r1,0(%r1) - blr - -#ifndef __NO_FPRS__ -L(fp_return_value): - bf 28,L(float_return_value) - stfd %f1,0(%r30) - mtcrf 0x02,%r31 /* cr6 */ - bf 27,L(done_return_value) - stfd %f2,8(%r30) - b L(done_return_value) -L(float_return_value): - stfs %f1,0(%r30) - b L(done_return_value) -#endif - -L(small_struct_return_value): - /* - * The C code always allocates a properly-aligned 8-byte bounce - * buffer to make this assembly code very simple. Just write out - * r3 and r4 to the buffer to allow the C code to handle the rest. - */ - stw %r3, 0(%r30) - stw %r4, 4(%r30) - b L(done_return_value) - -.LFE1: -END(ffi_call_SYSV) - - .section ".eh_frame",EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .4byte 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#if defined _RELOCATABLE || defined __PIC__ - .ascii "zR\0" /* CIE Augmentation */ -#else - .ascii "\0" /* CIE Augmentation */ -#endif - .uleb128 0x1 /* CIE Code Alignment Factor */ - .sleb128 -4 /* CIE Data Alignment Factor */ - .byte 0x41 /* CIE RA Column */ -#if defined _RELOCATABLE || defined __PIC__ - .uleb128 0x1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .uleb128 0x1 - .uleb128 0x0 - .align 2 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .4byte .LASFDE1-.Lframe1 /* FDE CIE offset */ -#if defined _RELOCATABLE || defined __PIC__ - .4byte .LFB1-. /* FDE initial location */ -#else - .4byte .LFB1 /* FDE initial location */ -#endif - .4byte .LFE1-.LFB1 /* FDE address range */ -#if defined _RELOCATABLE || defined __PIC__ - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI0-.LFB1 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0x08 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI5-.LCFI0 - .byte 0x11 /* DW_CFA_offset_extended_sf */ - .uleb128 0x41 - .sleb128 -1 - .byte 0x9f /* DW_CFA_offset, column 0x1f */ - .uleb128 0x1 - .byte 0x9e /* DW_CFA_offset, column 0x1e */ - .uleb128 0x2 - .byte 0x9d /* DW_CFA_offset, column 0x1d */ - .uleb128 0x3 - .byte 0x9c /* DW_CFA_offset, column 0x1c */ - .uleb128 0x4 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI6-.LCFI5 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0x1c - .align 2 -.LEFDE1: - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/prep_cif.c b/third_party/python/Modules/_ctypes/libffi/src/prep_cif.c deleted file mode 100644 index 55ceed8c5..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/prep_cif.c +++ /dev/null @@ -1,245 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 2011, 2012 Anthony Green - Copyright (c) 1996, 1998, 2007 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include - -/* Round up to FFI_SIZEOF_ARG. */ - -#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status initialize_aggregate(ffi_type *arg) -{ - ffi_type **ptr; - - if (UNLIKELY(arg == NULL || arg->elements == NULL)) - return FFI_BAD_TYPEDEF; - - arg->size = 0; - arg->alignment = 0; - - ptr = &(arg->elements[0]); - - if (UNLIKELY(ptr == 0)) - return FFI_BAD_TYPEDEF; - - while ((*ptr) != NULL) - { - if (UNLIKELY(((*ptr)->size == 0) - && (initialize_aggregate((*ptr)) != FFI_OK))) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - - arg->size = ALIGN(arg->size, (*ptr)->alignment); - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - /* Structure size includes tail padding. This is important for - structures that fit in one register on ABIs like the PowerPC64 - Linux ABI that right justify small structs in a register. - It's also needed for nested structure layout, for example - struct A { long a; char b; }; struct B { struct A x; char y; }; - should find y at an offset of 2*sizeof(long) and result in a - total size of 3*sizeof(long). */ - arg->size = ALIGN (arg->size, arg->alignment); - - /* On some targets, the ABI defines that structures have an additional - alignment beyond the "natural" one based on their elements. */ -#ifdef FFI_AGGREGATE_ALIGNMENT - if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) - arg->alignment = FFI_AGGREGATE_ALIGNMENT; -#endif - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; -} - -#ifndef __CRIS__ -/* The CRIS ABI specifies structure elements to have byte - alignment only, so it completely overrides this functions, - which assumes "natural" alignment and padding. */ - -/* Perform machine independent ffi_cif preparation, then call - machine dependent routine. */ - -/* For non variadic functions isvariadic should be 0 and - nfixedargs==ntotalargs. - - For variadic calls, isvariadic should be 1 and nfixedargs - and ntotalargs set as appropriate. nfixedargs must always be >=1 */ - - -ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, ffi_type **atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT(cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - - if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) - return FFI_BAD_ABI; - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - cif->rtype = rtype; - - cif->flags = 0; - -#if HAVE_LONG_DOUBLE_VARIANT - ffi_prep_types (abi); -#endif - - /* Initialize the return type if necessary */ - if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the return type */ - FFI_ASSERT_VALID_TYPE(cif->rtype); - - /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ -#if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef SPARC - && (cif->abi != FFI_V9 || cif->rtype->size > 32) -#endif -#ifdef TILE - && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) -#endif -#ifdef XTENSA - && (cif->rtype->size > 16) -#endif -#ifdef NIOS2 - && (cif->rtype->size > 8) -#endif - ) - bytes = STACK_ARG_SIZE(sizeof(void*)); -#endif - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - - /* Initialize any uninitialized aggregate type definitions */ - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if !defined X86_ANY && !defined S390 && !defined PA -#ifdef SPARC - if (((*ptr)->type == FFI_TYPE_STRUCT - && ((*ptr)->size > 16 || cif->abi != FFI_V9)) - || ((*ptr)->type == FFI_TYPE_LONGDOUBLE - && cif->abi != FFI_V9)) - bytes += sizeof(void*); - else -#endif - { - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = (unsigned)ALIGN(bytes, (*ptr)->alignment); - -#ifdef TILE - if (bytes < 10 * FFI_SIZEOF_ARG && - bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) - { - /* An argument is never split between the 10 parameter - registers and the stack. */ - bytes = 10 * FFI_SIZEOF_ARG; - } -#endif -#ifdef XTENSA - if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) - bytes = 6*4; -#endif - - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ -#ifdef FFI_TARGET_SPECIFIC_VARIADIC - if (isvariadic) - return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); -#endif - - return ffi_prep_cif_machdep(cif); -} -#endif /* not __CRIS__ */ - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, - ffi_type *rtype, ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); -} - -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); -} - -#if FFI_CLOSURES - -ffi_status -ffi_prep_closure (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -{ - return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); -} - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/raw_api.c b/third_party/python/Modules/_ctypes/libffi/src/raw_api.c deleted file mode 100644 index ce21372e2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/raw_api.c +++ /dev/null @@ -1,254 +0,0 @@ -/* ----------------------------------------------------------------------- - raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. - - Author: Kresten Krab Thorup - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* This file defines generic functions for use with the raw api. */ - -#include -#include - -#if !FFI_NO_RAW_API - -size_t -ffi_raw_size (ffi_cif *cif) -{ - size_t result = 0; - int i; - - ffi_type **at = cif->arg_types; - - for (i = cif->nargs-1; i >= 0; i--, at++) - { -#if !FFI_NO_STRUCTS - if ((*at)->type == FFI_TYPE_STRUCT) - result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG); - else -#endif - result += ALIGN ((*at)->size, FFI_SIZEOF_ARG); - } - - return result; -} - - -void -ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - -#if WORDS_BIGENDIAN - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); - break; - -#if FFI_SIZEOF_ARG >= 4 - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); - break; -#endif - -#if !FFI_NO_STRUCTS - case FFI_TYPE_STRUCT: - *args = (raw++)->ptr; - break; -#endif - - case FFI_TYPE_POINTER: - *args = (void*) &(raw++)->ptr; - break; - - default: - *args = raw; - raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - } - } - -#else /* WORDS_BIGENDIAN */ - -#if !PDP - - /* then assume little endian */ - for (i = 0; i < cif->nargs; i++, tp++, args++) - { -#if !FFI_NO_STRUCTS - if ((*tp)->type == FFI_TYPE_STRUCT) - { - *args = (raw++)->ptr; - } - else -#endif - { - *args = (void*) raw; - raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); - } - } - -#else -#error "pdp endian not supported" -#endif /* ! PDP */ - -#endif /* WORDS_BIGENDIAN */ -} - -void -ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - (raw++)->uint = *(UINT8*) (*args); - break; - - case FFI_TYPE_SINT8: - (raw++)->sint = *(SINT8*) (*args); - break; - - case FFI_TYPE_UINT16: - (raw++)->uint = *(UINT16*) (*args); - break; - - case FFI_TYPE_SINT16: - (raw++)->sint = *(SINT16*) (*args); - break; - -#if FFI_SIZEOF_ARG >= 4 - case FFI_TYPE_UINT32: - (raw++)->uint = *(UINT32*) (*args); - break; - - case FFI_TYPE_SINT32: - (raw++)->sint = *(SINT32*) (*args); - break; -#endif - -#if !FFI_NO_STRUCTS - case FFI_TYPE_STRUCT: - (raw++)->ptr = *args; - break; -#endif - - case FFI_TYPE_POINTER: - (raw++)->ptr = **(void***) args; - break; - - default: - memcpy ((void*) raw->data, (void*)*args, (*tp)->size); - raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - } - } -} - -#if !FFI_NATIVE_RAW_API - - -/* This is a generic definition of ffi_raw_call, to be used if the - * native system does not provide a machine-specific implementation. - * Having this, allows code to be written for the raw API, without - * the need for system-specific code to handle input in that format; - * these following couple of functions will handle the translation forth - * and back automatically. */ - -void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - ffi_raw_to_ptrarray (cif, raw, avalue); - ffi_call (cif, fn, rvalue, avalue); -} - -#if FFI_CLOSURES /* base system provides closures */ - -static void -ffi_translate_args (ffi_cif *cif, void *rvalue, - void **avalue, void *user_data) -{ - ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); - ffi_raw_closure *cl = (ffi_raw_closure*)user_data; - - ffi_ptrarray_to_raw (cif, avalue, raw); - (*cl->fun) (cif, rvalue, raw, cl->user_data); -} - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc) -{ - ffi_status status; - - status = ffi_prep_closure_loc ((ffi_closure*) cl, - cif, - &ffi_translate_args, - codeloc, - codeloc); - if (status == FFI_OK) - { - cl->fun = fun; - cl->user_data = user_data; - } - - return status; -} - -#endif /* FFI_CLOSURES */ -#endif /* !FFI_NATIVE_RAW_API */ - -#if FFI_CLOSURES - -/* Again, here is the generic version of ffi_prep_raw_closure, which - * will install an intermediate "hub" for translation of arguments from - * the pointer-array format, to the raw format */ - -ffi_status -ffi_prep_raw_closure (ffi_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data) -{ - return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); -} - -#endif /* FFI_CLOSURES */ - -#endif /* !FFI_NO_RAW_API */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/s390/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/s390/ffi.c deleted file mode 100644 index 8adb5bc0b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/s390/ffi.c +++ /dev/null @@ -1,781 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2000, 2007 Software AG - Copyright (c) 2008 Red Hat, Inc - - S390 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ -/*====================================================================*/ -/* Includes */ -/* -------- */ -/*====================================================================*/ - -#include -#include - -#include -#include - -/*====================== End of Includes =============================*/ - -/*====================================================================*/ -/* Defines */ -/* ------- */ -/*====================================================================*/ - -/* Maximum number of GPRs available for argument passing. */ -#define MAX_GPRARGS 5 - -/* Maximum number of FPRs available for argument passing. */ -#ifdef __s390x__ -#define MAX_FPRARGS 4 -#else -#define MAX_FPRARGS 2 -#endif - -/* Round to multiple of 16. */ -#define ROUND_SIZE(size) (((size) + 15) & ~15) - -/* If these values change, sysv.S must be adapted! */ -#define FFI390_RET_VOID 0 -#define FFI390_RET_STRUCT 1 -#define FFI390_RET_FLOAT 2 -#define FFI390_RET_DOUBLE 3 -#define FFI390_RET_INT32 4 -#define FFI390_RET_INT64 5 - -/*===================== End of Defines ===============================*/ - -/*====================================================================*/ -/* Prototypes */ -/* ---------- */ -/*====================================================================*/ - -static void ffi_prep_args (unsigned char *, extended_cif *); -void -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) -__attribute__ ((visibility ("hidden"))) -#endif -ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, - unsigned long long *, unsigned long *); - -/*====================== End of Prototypes ===========================*/ - -/*====================================================================*/ -/* Externals */ -/* --------- */ -/*====================================================================*/ - -extern void ffi_call_SYSV(unsigned, - extended_cif *, - void (*)(unsigned char *, extended_cif *), - unsigned, - void *, - void (*fn)(void)); - -extern void ffi_closure_SYSV(void); - -/*====================== End of Externals ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_check_struct_type. */ -/* */ -/* Function - Determine if a structure can be passed within a */ -/* general purpose or floating point register. */ -/* */ -/*====================================================================*/ - -static int -ffi_check_struct_type (ffi_type *arg) -{ - size_t size = arg->size; - - /* If the struct has just one element, look at that element - to find out whether to consider the struct as floating point. */ - while (arg->type == FFI_TYPE_STRUCT - && arg->elements[0] && !arg->elements[1]) - arg = arg->elements[0]; - - /* Structs of size 1, 2, 4, and 8 are passed in registers, - just like the corresponding int/float types. */ - switch (size) - { - case 1: - return FFI_TYPE_UINT8; - - case 2: - return FFI_TYPE_UINT16; - - case 4: - if (arg->type == FFI_TYPE_FLOAT) - return FFI_TYPE_FLOAT; - else - return FFI_TYPE_UINT32; - - case 8: - if (arg->type == FFI_TYPE_DOUBLE) - return FFI_TYPE_DOUBLE; - else - return FFI_TYPE_UINT64; - - default: - break; - } - - /* Other structs are passed via a pointer to the data. */ - return FFI_TYPE_POINTER; -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_prep_args. */ -/* */ -/* Function - Prepare parameters for call to function. */ -/* */ -/* ffi_prep_args is called by the assembly routine once stack space */ -/* has been allocated for the function's arguments. */ -/* */ -/*====================================================================*/ - -static void -ffi_prep_args (unsigned char *stack, extended_cif *ecif) -{ - /* The stack space will be filled with those areas: - - FPR argument register save area (highest addresses) - GPR argument register save area - temporary struct copies - overflow argument area (lowest addresses) - - We set up the following pointers: - - p_fpr: bottom of the FPR area (growing upwards) - p_gpr: bottom of the GPR area (growing upwards) - p_ov: bottom of the overflow area (growing upwards) - p_struct: top of the struct copy area (growing downwards) - - All areas are kept aligned to twice the word size. */ - - int gpr_off = ecif->cif->bytes; - int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); - - unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); - unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); - unsigned char *p_struct = (unsigned char *)p_gpr; - unsigned long *p_ov = (unsigned long *)stack; - - int n_fpr = 0; - int n_gpr = 0; - int n_ov = 0; - - ffi_type **ptr; - void **p_argv = ecif->avalue; - int i; - - /* If we returning a structure then we set the first parameter register - to the address of where we are returning this structure. */ - - if (ecif->cif->flags == FFI390_RET_STRUCT) - p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; - - /* Now for the arguments. */ - - for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; - i > 0; - i--, ptr++, p_argv++) - { - void *arg = *p_argv; - int type = (*ptr)->type; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - /* 16-byte long double is passed like a struct. */ - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - - /* Check how a structure type is passed. */ - if (type == FFI_TYPE_STRUCT) - { - type = ffi_check_struct_type (*ptr); - - /* If we pass the struct via pointer, copy the data. */ - if (type == FFI_TYPE_POINTER) - { - p_struct -= ROUND_SIZE ((*ptr)->size); - memcpy (p_struct, (char *)arg, (*ptr)->size); - arg = &p_struct; - } - } - - /* Now handle all primitive int/pointer/float data types. */ - switch (type) - { - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = *(unsigned long long *) arg; - else -#ifdef __s390x__ - p_ov[n_ov++] = *(unsigned long *) arg; -#else - p_ov[n_ov++] = ((unsigned long *) arg)[0], - p_ov[n_ov++] = ((unsigned long *) arg)[1]; -#endif - break; - - case FFI_TYPE_FLOAT: - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; - else - p_ov[n_ov++] = *(unsigned int *) arg; - break; - - case FFI_TYPE_POINTER: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = (unsigned long)*(unsigned char **) arg; - else - p_ov[n_ov++] = (unsigned long)*(unsigned char **) arg; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(unsigned long *) arg; - else - p_ov[n_ov++] = *(unsigned long *) arg; -#else - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = ((unsigned long *) arg)[0], - p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; - else - p_ov[n_ov++] = ((unsigned long *) arg)[0], - p_ov[n_ov++] = ((unsigned long *) arg)[1]; -#endif - break; - - case FFI_TYPE_UINT32: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(unsigned int *) arg; - else - p_ov[n_ov++] = *(unsigned int *) arg; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(signed int *) arg; - else - p_ov[n_ov++] = *(signed int *) arg; - break; - - case FFI_TYPE_UINT16: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(unsigned short *) arg; - else - p_ov[n_ov++] = *(unsigned short *) arg; - break; - - case FFI_TYPE_SINT16: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(signed short *) arg; - else - p_ov[n_ov++] = *(signed short *) arg; - break; - - case FFI_TYPE_UINT8: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(unsigned char *) arg; - else - p_ov[n_ov++] = *(unsigned char *) arg; - break; - - case FFI_TYPE_SINT8: - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = *(signed char *) arg; - else - p_ov[n_ov++] = *(signed char *) arg; - break; - - default: - FFI_ASSERT (0); - break; - } - } -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_prep_cif_machdep. */ -/* */ -/* Function - Perform machine dependent CIF processing. */ -/* */ -/*====================================================================*/ - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t struct_size = 0; - int n_gpr = 0; - int n_fpr = 0; - int n_ov = 0; - - ffi_type **ptr; - int i; - - /* Determine return value handling. */ - - switch (cif->rtype->type) - { - /* Void is easy. */ - case FFI_TYPE_VOID: - cif->flags = FFI390_RET_VOID; - break; - - /* Structures are returned via a hidden pointer. */ - case FFI_TYPE_STRUCT: - cif->flags = FFI390_RET_STRUCT; - n_gpr++; /* We need one GPR to pass the pointer. */ - break; - - /* Floating point values are returned in fpr 0. */ - case FFI_TYPE_FLOAT: - cif->flags = FFI390_RET_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - cif->flags = FFI390_RET_DOUBLE; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - cif->flags = FFI390_RET_STRUCT; - n_gpr++; - break; -#endif - /* Integer values are returned in gpr 2 (and gpr 3 - for 64-bit values on 31-bit machines). */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI390_RET_INT64; - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* These are to be extended to word size. */ -#ifdef __s390x__ - cif->flags = FFI390_RET_INT64; -#else - cif->flags = FFI390_RET_INT32; -#endif - break; - - default: - FFI_ASSERT (0); - break; - } - - /* Now for the arguments. */ - - for (ptr = cif->arg_types, i = cif->nargs; - i > 0; - i--, ptr++) - { - int type = (*ptr)->type; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - /* 16-byte long double is passed like a struct. */ - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - - /* Check how a structure type is passed. */ - if (type == FFI_TYPE_STRUCT) - { - type = ffi_check_struct_type (*ptr); - - /* If we pass the struct via pointer, we must reserve space - to copy its data for proper call-by-value semantics. */ - if (type == FFI_TYPE_POINTER) - struct_size += ROUND_SIZE ((*ptr)->size); - } - - /* Now handle all primitive int/float data types. */ - switch (type) - { - /* The first MAX_FPRARGS floating point arguments - go in FPRs, the rest overflow to the stack. */ - - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - n_fpr++; - else - n_ov += sizeof (double) / sizeof (long); - break; - - case FFI_TYPE_FLOAT: - if (n_fpr < MAX_FPRARGS) - n_fpr++; - else - n_ov++; - break; - - /* On 31-bit machines, 64-bit integers are passed in GPR pairs, - if one is still available, or else on the stack. If only one - register is free, skip the register (it won't be used for any - subsequent argument either). */ - -#ifndef __s390x__ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - n_gpr += 2; - else - n_ov += 2; - break; -#endif - - /* Everything else is passed in GPRs (until MAX_GPRARGS - have been used) or overflows to the stack. */ - - default: - if (n_gpr < MAX_GPRARGS) - n_gpr++; - else - n_ov++; - break; - } - } - - /* Total stack space as required for overflow arguments - and temporary structure copies. */ - - cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; - - return FFI_OK; -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_call. */ -/* */ -/* Function - Call the FFI routine. */ -/* */ -/*====================================================================*/ - -void -ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue) -{ - int ret_type = cif->flags; - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - /* If we don't have a return value, we need to fake one. */ - if (rvalue == NULL) - { - if (ret_type == FFI390_RET_STRUCT) - ecif.rvalue = alloca (cif->rtype->size); - else - ret_type = FFI390_RET_VOID; - } - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, - ret_type, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_closure_helper_SYSV. */ -/* */ -/* Function - Call a FFI closure target function. */ -/* */ -/*====================================================================*/ - -void -ffi_closure_helper_SYSV (ffi_closure *closure, - unsigned long *p_gpr, - unsigned long long *p_fpr, - unsigned long *p_ov) -{ - unsigned long long ret_buffer; - - void *rvalue = &ret_buffer; - void **avalue; - void **p_arg; - - int n_gpr = 0; - int n_fpr = 0; - int n_ov = 0; - - ffi_type **ptr; - int i; - - /* Allocate buffer for argument list pointers. */ - - p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); - - /* If we returning a structure, pass the structure address - directly to the target function. Otherwise, have the target - function store the return value to the GPR save area. */ - - if (closure->cif->flags == FFI390_RET_STRUCT) - rvalue = (void *) p_gpr[n_gpr++]; - - /* Now for the arguments. */ - - for (ptr = closure->cif->arg_types, i = closure->cif->nargs; - i > 0; - i--, p_arg++, ptr++) - { - int deref_struct_pointer = 0; - int type = (*ptr)->type; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - /* 16-byte long double is passed like a struct. */ - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - - /* Check how a structure type is passed. */ - if (type == FFI_TYPE_STRUCT) - { - type = ffi_check_struct_type (*ptr); - - /* If we pass the struct via pointer, remember to - retrieve the pointer later. */ - if (type == FFI_TYPE_POINTER) - deref_struct_pointer = 1; - } - - /* Pointers are passed like UINTs of the same size. */ - if (type == FFI_TYPE_POINTER) -#ifdef __s390x__ - type = FFI_TYPE_UINT64; -#else - type = FFI_TYPE_UINT32; -#endif - - /* Now handle all primitive int/float data types. */ - switch (type) - { - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - *p_arg = &p_fpr[n_fpr++]; - else - *p_arg = &p_ov[n_ov], - n_ov += sizeof (double) / sizeof (long); - break; - - case FFI_TYPE_FLOAT: - if (n_fpr < MAX_FPRARGS) - *p_arg = &p_fpr[n_fpr++]; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - if (n_gpr < MAX_GPRARGS) - *p_arg = &p_gpr[n_gpr++]; - else - *p_arg = &p_ov[n_ov++]; -#else - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - *p_arg = &p_gpr[n_gpr], n_gpr += 2; - else - *p_arg = &p_ov[n_ov], n_ov += 2; -#endif - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; - break; - - default: - FFI_ASSERT (0); - break; - } - - /* If this is a struct passed via pointer, we need to - actually retrieve that pointer. */ - if (deref_struct_pointer) - *p_arg = *(void **)*p_arg; - } - - - /* Call the target function. */ - (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); - - /* Convert the return value. */ - switch (closure->cif->rtype->type) - { - /* Void is easy, and so is struct. */ - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - break; - - /* Floating point values are returned in fpr 0. */ - case FFI_TYPE_FLOAT: - p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; - break; - - case FFI_TYPE_DOUBLE: - p_fpr[0] = *(unsigned long long *) rvalue; - break; - - /* Integer values are returned in gpr 2 (and gpr 3 - for 64-bit values on 31-bit machines). */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - p_gpr[0] = *(unsigned long *) rvalue; -#else - p_gpr[0] = ((unsigned long *) rvalue)[0], - p_gpr[1] = ((unsigned long *) rvalue)[1]; -#endif - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT8: - p_gpr[0] = *(unsigned long *) rvalue; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT8: - p_gpr[0] = *(signed long *) rvalue; - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_prep_closure_loc. */ -/* */ -/* Function - Prepare a FFI closure. */ -/* */ -/*====================================================================*/ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - -#ifndef __s390x__ - *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ - *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ - *(short *)&closure->tramp [4] = 0x1006; - *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ - *(long *)&closure->tramp [8] = (long)codeloc; - *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; -#else - *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ - *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ - *(short *)&closure->tramp [4] = 0x100e; - *(short *)&closure->tramp [6] = 0x0004; - *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ - *(long *)&closure->tramp[16] = (long)codeloc; - *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; -#endif - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -/*======================== End of Routine ============================*/ - diff --git a/third_party/python/Modules/_ctypes/libffi/src/s390/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/s390/ffitarget.h deleted file mode 100644 index 97fa5c4b6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/s390/ffitarget.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for S390. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#if defined (__s390x__) -#ifndef S390X -#define S390X -#endif -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#ifdef S390X -#define FFI_TRAMPOLINE_SIZE 32 -#else -#define FFI_TRAMPOLINE_SIZE 16 -#endif -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/s390/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/s390/sysv.S deleted file mode 100644 index 4731a3177..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/s390/sysv.S +++ /dev/null @@ -1,434 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2000 Software AG - Copyright (c) 2008 Red Hat, Inc. - - S390 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifndef __s390x__ - -.text - - # r2: cif->bytes - # r3: &ecif - # r4: ffi_prep_args - # r5: ret_type - # r6: ecif.rvalue - # ov: fn - - # This assumes we are using gas. - .globl ffi_call_SYSV - .type ffi_call_SYSV,%function -ffi_call_SYSV: -.LFB1: - stm %r6,%r15,24(%r15) # Save registers -.LCFI0: - basr %r13,0 # Set up base register -.Lbase: - lr %r11,%r15 # Set up frame pointer -.LCFI1: - sr %r15,%r2 - ahi %r15,-96-48 # Allocate stack - lr %r8,%r6 # Save ecif.rvalue - sr %r9,%r9 - ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address - l %r7,96(%r11) # Load function address - st %r11,0(%r15) # Set up back chain - ahi %r11,-48 # Register save area -.LCFI2: - - la %r2,96(%r15) # Save area - # r3 already holds &ecif - basr %r14,%r4 # Call ffi_prep_args - - lm %r2,%r6,0(%r11) # Load arguments - ld %f0,32(%r11) - ld %f2,40(%r11) - la %r14,0(%r13,%r9) # Set return address - br %r7 # ... and call function - -.LretNone: # Return void - l %r4,48+56(%r11) - lm %r6,%r15,48+24(%r11) - br %r4 - -.LretFloat: - l %r4,48+56(%r11) - ste %f0,0(%r8) # Return float - lm %r6,%r15,48+24(%r11) - br %r4 - -.LretDouble: - l %r4,48+56(%r11) - std %f0,0(%r8) # Return double - lm %r6,%r15,48+24(%r11) - br %r4 - -.LretInt32: - l %r4,48+56(%r11) - st %r2,0(%r8) # Return int - lm %r6,%r15,48+24(%r11) - br %r4 - -.LretInt64: - l %r4,48+56(%r11) - stm %r2,%r3,0(%r8) # Return long long - lm %r6,%r15,48+24(%r11) - br %r4 - -.Ltable: - .byte .LretNone-.Lbase # FFI390_RET_VOID - .byte .LretNone-.Lbase # FFI390_RET_STRUCT - .byte .LretFloat-.Lbase # FFI390_RET_FLOAT - .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE - .byte .LretInt32-.Lbase # FFI390_RET_INT32 - .byte .LretInt64-.Lbase # FFI390_RET_INT64 - -.LFE1: -.ffi_call_SYSV_end: - .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV - - - .globl ffi_closure_SYSV - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: -.LFB2: - stm %r12,%r15,48(%r15) # Save registers -.LCFI10: - basr %r13,0 # Set up base register -.Lcbase: - stm %r2,%r6,8(%r15) # Save arguments - std %f0,64(%r15) - std %f2,72(%r15) - lr %r1,%r15 # Set up stack frame - ahi %r15,-96 -.LCFI11: - l %r12,.Lchelper-.Lcbase(%r13) # Get helper function - lr %r2,%r0 # Closure - la %r3,8(%r1) # GPRs - la %r4,64(%r1) # FPRs - la %r5,96(%r1) # Overflow - st %r1,0(%r15) # Set up back chain - - bas %r14,0(%r12,%r13) # Call helper - - l %r4,96+56(%r15) - ld %f0,96+64(%r15) # Load return registers - lm %r2,%r3,96+8(%r15) - lm %r12,%r15,96+48(%r15) - br %r4 - - .align 4 -.Lchelper: - .long ffi_closure_helper_SYSV-.Lcbase - -.LFE2: - -.ffi_closure_SYSV_end: - .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV - - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry -.LSCIE1: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 -4 # CIE Data Alignment Factor - .byte 0xe # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x1b # FDE Encoding (pcrel sdata4) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0xf - .uleb128 0x60 - .align 4 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # FDE Length -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # FDE CIE offset - .4byte .LFB1-. # FDE initial location - .4byte .LFE1-.LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI0-.LFB1 - .byte 0x8f # DW_CFA_offset, column 0xf - .uleb128 0x9 - .byte 0x8e # DW_CFA_offset, column 0xe - .uleb128 0xa - .byte 0x8d # DW_CFA_offset, column 0xd - .uleb128 0xb - .byte 0x8c # DW_CFA_offset, column 0xc - .uleb128 0xc - .byte 0x8b # DW_CFA_offset, column 0xb - .uleb128 0xd - .byte 0x8a # DW_CFA_offset, column 0xa - .uleb128 0xe - .byte 0x89 # DW_CFA_offset, column 0x9 - .uleb128 0xf - .byte 0x88 # DW_CFA_offset, column 0x8 - .uleb128 0x10 - .byte 0x87 # DW_CFA_offset, column 0x7 - .uleb128 0x11 - .byte 0x86 # DW_CFA_offset, column 0x6 - .uleb128 0x12 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI1-.LCFI0 - .byte 0xd # DW_CFA_def_cfa_register - .uleb128 0xb - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI2-.LCFI1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x90 - .align 4 -.LEFDE1: -.LSFDE2: - .4byte .LEFDE2-.LASFDE2 # FDE Length -.LASFDE2: - .4byte .LASFDE2-.Lframe1 # FDE CIE offset - .4byte .LFB2-. # FDE initial location - .4byte .LFE2-.LFB2 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI10-.LFB2 - .byte 0x8f # DW_CFA_offset, column 0xf - .uleb128 0x9 - .byte 0x8e # DW_CFA_offset, column 0xe - .uleb128 0xa - .byte 0x8d # DW_CFA_offset, column 0xd - .uleb128 0xb - .byte 0x8c # DW_CFA_offset, column 0xc - .uleb128 0xc - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI11-.LCFI10 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0xc0 - .align 4 -.LEFDE2: - -#else - -.text - - # r2: cif->bytes - # r3: &ecif - # r4: ffi_prep_args - # r5: ret_type - # r6: ecif.rvalue - # ov: fn - - # This assumes we are using gas. - .globl ffi_call_SYSV - .type ffi_call_SYSV,%function -ffi_call_SYSV: -.LFB1: - stmg %r6,%r15,48(%r15) # Save registers -.LCFI0: - larl %r13,.Lbase # Set up base register - lgr %r11,%r15 # Set up frame pointer -.LCFI1: - sgr %r15,%r2 - aghi %r15,-160-80 # Allocate stack - lgr %r8,%r6 # Save ecif.rvalue - llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address - lg %r7,160(%r11) # Load function address - stg %r11,0(%r15) # Set up back chain - aghi %r11,-80 # Register save area -.LCFI2: - - la %r2,160(%r15) # Save area - # r3 already holds &ecif - basr %r14,%r4 # Call ffi_prep_args - - lmg %r2,%r6,0(%r11) # Load arguments - ld %f0,48(%r11) - ld %f2,56(%r11) - ld %f4,64(%r11) - ld %f6,72(%r11) - la %r14,0(%r13,%r9) # Set return address - br %r7 # ... and call function - -.Lbase: -.LretNone: # Return void - lg %r4,80+112(%r11) - lmg %r6,%r15,80+48(%r11) - br %r4 - -.LretFloat: - lg %r4,80+112(%r11) - ste %f0,0(%r8) # Return float - lmg %r6,%r15,80+48(%r11) - br %r4 - -.LretDouble: - lg %r4,80+112(%r11) - std %f0,0(%r8) # Return double - lmg %r6,%r15,80+48(%r11) - br %r4 - -.LretInt32: - lg %r4,80+112(%r11) - st %r2,0(%r8) # Return int - lmg %r6,%r15,80+48(%r11) - br %r4 - -.LretInt64: - lg %r4,80+112(%r11) - stg %r2,0(%r8) # Return long - lmg %r6,%r15,80+48(%r11) - br %r4 - -.Ltable: - .byte .LretNone-.Lbase # FFI390_RET_VOID - .byte .LretNone-.Lbase # FFI390_RET_STRUCT - .byte .LretFloat-.Lbase # FFI390_RET_FLOAT - .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE - .byte .LretInt32-.Lbase # FFI390_RET_INT32 - .byte .LretInt64-.Lbase # FFI390_RET_INT64 - -.LFE1: -.ffi_call_SYSV_end: - .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV - - - .globl ffi_closure_SYSV - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: -.LFB2: - stmg %r14,%r15,112(%r15) # Save registers -.LCFI10: - stmg %r2,%r6,16(%r15) # Save arguments - std %f0,128(%r15) - std %f2,136(%r15) - std %f4,144(%r15) - std %f6,152(%r15) - lgr %r1,%r15 # Set up stack frame - aghi %r15,-160 -.LCFI11: - lgr %r2,%r0 # Closure - la %r3,16(%r1) # GPRs - la %r4,128(%r1) # FPRs - la %r5,160(%r1) # Overflow - stg %r1,0(%r15) # Set up back chain - - brasl %r14,ffi_closure_helper_SYSV # Call helper - - lg %r14,160+112(%r15) - ld %f0,160+128(%r15) # Load return registers - lg %r2,160+16(%r15) - la %r15,160(%r15) - br %r14 -.LFE2: - -.ffi_closure_SYSV_end: - .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV - - - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry -.LSCIE1: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 -8 # CIE Data Alignment Factor - .byte 0xe # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x1b # FDE Encoding (pcrel sdata4) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0xf - .uleb128 0xa0 - .align 8 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # FDE Length -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # FDE CIE offset - .4byte .LFB1-. # FDE initial location - .4byte .LFE1-.LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI0-.LFB1 - .byte 0x8f # DW_CFA_offset, column 0xf - .uleb128 0x5 - .byte 0x8e # DW_CFA_offset, column 0xe - .uleb128 0x6 - .byte 0x8d # DW_CFA_offset, column 0xd - .uleb128 0x7 - .byte 0x8c # DW_CFA_offset, column 0xc - .uleb128 0x8 - .byte 0x8b # DW_CFA_offset, column 0xb - .uleb128 0x9 - .byte 0x8a # DW_CFA_offset, column 0xa - .uleb128 0xa - .byte 0x89 # DW_CFA_offset, column 0x9 - .uleb128 0xb - .byte 0x88 # DW_CFA_offset, column 0x8 - .uleb128 0xc - .byte 0x87 # DW_CFA_offset, column 0x7 - .uleb128 0xd - .byte 0x86 # DW_CFA_offset, column 0x6 - .uleb128 0xe - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI1-.LCFI0 - .byte 0xd # DW_CFA_def_cfa_register - .uleb128 0xb - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI2-.LCFI1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0xf0 - .align 8 -.LEFDE1: -.LSFDE2: - .4byte .LEFDE2-.LASFDE2 # FDE Length -.LASFDE2: - .4byte .LASFDE2-.Lframe1 # FDE CIE offset - .4byte .LFB2-. # FDE initial location - .4byte .LFE2-.LFB2 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI10-.LFB2 - .byte 0x8f # DW_CFA_offset, column 0xf - .uleb128 0x5 - .byte 0x8e # DW_CFA_offset, column 0xe - .uleb128 0x6 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI11-.LCFI10 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x140 - .align 8 -.LEFDE2: - -#endif - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/sh/ffi.c deleted file mode 100644 index 9ec86bfb2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh/ffi.c +++ /dev/null @@ -1,717 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima - Copyright (c) 2008 Red Hat, Inc. - - SuperH Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -#define NGREGARG 4 -#if defined(__SH4__) -#define NFREGARG 8 -#endif - -#if defined(__HITACHI__) -#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 -#else -#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 -#endif - -/* If the structure has essentially an unique element, return its type. */ -static int -simple_type (ffi_type *arg) -{ - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - else if (arg->elements[1]) - return FFI_TYPE_STRUCT; - - return simple_type (arg->elements[0]); -} - -static int -return_type (ffi_type *arg) -{ - unsigned short type; - - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - - type = simple_type (arg->elements[0]); - if (! arg->elements[1]) - { - switch (type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - return FFI_TYPE_INT; - - default: - return type; - } - } - - /* gcc uses r0/r1 pair for some kind of structures. */ - if (arg->size <= 2 * sizeof (int)) - { - int i = 0; - ffi_type *e; - - while ((e = arg->elements[i++])) - { - type = simple_type (e); - switch (type) - { - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - return FFI_TYPE_UINT64; - - default: - break; - } - } - } - - return FFI_TYPE_STRUCT; -} - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register int tmp; - register unsigned int avn; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - int greg, ireg; -#if defined(__SH4__) - int freg = 0; -#endif - - tmp = 0; - argp = stack; - - if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; - } - else - ireg = 0; - - /* Set arguments for registers. */ - greg = ireg; - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ >= NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - argp += z; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ >= NFREGARG) - continue; - } - else -#endif - { - if (greg++ >= NGREGARG) - continue; - } - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - argp += z; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - continue; - freg = (freg + 1) & ~1; - freg += 2; - memcpy (argp, *p_argv, z); - argp += z; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); -#if defined(__SH4__) - if (greg + n - 1 >= NGREGARG) - continue; -#else - if (greg >= NGREGARG) - continue; -#endif - greg += n; - memcpy (argp, *p_argv, z); - argp += n * sizeof (int); - } - } - - /* Set arguments on stack. */ - greg = ireg; -#if defined(__SH4__) - freg = 0; -#endif - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ < NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - argp += z; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ < NFREGARG) - continue; - } - else -#endif - { - if (greg++ < NGREGARG) - continue; - } - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - argp += z; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 < NFREGARG) - { - freg = (freg + 1) & ~1; - freg += 2; - continue; - } - memcpy (argp, *p_argv, z); - argp += z; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 < NGREGARG) - { - greg += n; - continue; - } -#if (! defined(__SH4__)) - else if (greg < NGREGARG) - { - greg = NGREGARG; - continue; - } -#endif - memcpy (argp, *p_argv, z); - argp += n * sizeof (int); - } - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int i, j; - int size, type; - int n, m; - int greg; -#if defined(__SH4__) - int freg = 0; -#endif - - cif->flags = 0; - - greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && - STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; - -#if defined(__SH4__) - for (i = j = 0; i < cif->nargs && j < 12; i++) - { - type = (cif->arg_types)[i]->type; - switch (type) - { - case FFI_TYPE_FLOAT: - if (freg >= NFREGARG) - continue; - freg++; - cif->flags += ((cif->arg_types)[i]->type) << (2 * j); - j++; - break; - - case FFI_TYPE_DOUBLE: - if ((freg + 1) >= NFREGARG) - continue; - freg = (freg + 1) & ~1; - freg += 2; - cif->flags += ((cif->arg_types)[i]->type) << (2 * j); - j++; - break; - - default: - size = (cif->arg_types)[i]->size; - n = (size + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 >= NGREGARG) - continue; - greg += n; - for (m = 0; m < n; m++) - cif->flags += FFI_TYPE_INT << (2 * j++); - break; - } - } -#else - for (i = j = 0; i < cif->nargs && j < 4; i++) - { - size = (cif->arg_types)[i]->size; - n = (size + sizeof (int) - 1) / sizeof (int); - if (greg >= NGREGARG) - continue; - else if (greg + n - 1 >= NGREGARG) - n = NGREGARG - greg; - greg += n; - for (m = 0; m < n; m++) - cif->flags += FFI_TYPE_INT << (2 * j++); - } -#endif - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - cif->flags += (unsigned) (return_type (cif->rtype)) << 24; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags += (unsigned) cif->rtype->type << 24; - break; - - default: - cif->flags += FFI_TYPE_INT << 24; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - UINT64 trvalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if (cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - ecif.rvalue = &trvalue; - else if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, - fn); - break; - default: - FFI_ASSERT(0); - break; - } - - if (rvalue - && cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - memcpy (rvalue, &trvalue, cif->rtype->size); -} - -extern void ffi_closure_SYSV (void); -#if defined(__SH4__) -extern void __ic_invalidate (void *line); -#endif - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - unsigned int insn; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - /* Set T bit if the function returns a struct pointed with R2. */ - insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT - ? 0x0018 /* sett */ - : 0x0008 /* clrt */); - -#ifdef __LITTLE_ENDIAN__ - tramp[0] = 0xd301d102; - tramp[1] = 0x0000412b | (insn << 16); -#else - tramp[0] = 0xd102d301; - tramp[1] = 0x412b0000 | insn; -#endif - *(void **) &tramp[2] = (void *)codeloc; /* ctx */ - *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - -#if defined(__SH4__) - /* Flush the icache. */ - __ic_invalidate(codeloc); -#endif - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - * entry, r3 holds the address of the closure. - * After storing the registers that could possibly contain - * parameters to be passed into the stack frame and setting - * up space for a return value, ffi_closure_SYSV invokes the - * following helper function to do most of the work. - */ - -#ifdef __LITTLE_ENDIAN__ -#define OFS_INT8 0 -#define OFS_INT16 0 -#else -#define OFS_INT8 3 -#define OFS_INT16 2 -#endif - -int -ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, - unsigned long *pgr, unsigned long *pfr, - unsigned long *pst) -{ - void **avalue; - ffi_type **p_arg; - int i, avn; - int ireg, greg = 0; -#if defined(__SH4__) - int freg = 0; -#endif - ffi_cif *cif; - - cif = closure->cif; - avalue = alloca(cif->nargs * sizeof(void *)); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG) - { - rvalue = (void *) *pgr++; - ireg = 1; - } - else - ireg = 0; - - cif = closure->cif; - greg = ireg; - avn = cif->nargs; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ >= NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = (((char *)pgr) + OFS_INT8); - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = (((char *)pgr) + OFS_INT16); - break; - - case FFI_TYPE_STRUCT: - avalue[i] = pgr; - break; - - default: - FFI_ASSERT(0); - } - pgr++; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ >= NFREGARG) - continue; - avalue[i] = pfr; - pfr++; - } - else -#endif - { - if (greg++ >= NGREGARG) - continue; - avalue[i] = pgr; - pgr++; - } - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - continue; - if (freg & 1) - pfr++; - freg = (freg + 1) & ~1; - freg += 2; - avalue[i] = pfr; - pfr += 2; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); -#if defined(__SH4__) - if (greg + n - 1 >= NGREGARG) - continue; -#else - if (greg >= NGREGARG) - continue; -#endif - greg += n; - avalue[i] = pgr; - pgr += n; - } - } - - greg = ireg; -#if defined(__SH4__) - freg = 0; -#endif - - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ < NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = (((char *)pst) + OFS_INT8); - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = (((char *)pst) + OFS_INT16); - break; - - case FFI_TYPE_STRUCT: - avalue[i] = pst; - break; - - default: - FFI_ASSERT(0); - } - pst++; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ < NFREGARG) - continue; - } - else -#endif - { - if (greg++ < NGREGARG) - continue; - } - avalue[i] = pst; - pst++; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 < NFREGARG) - { - freg = (freg + 1) & ~1; - freg += 2; - continue; - } - avalue[i] = pst; - pst += 2; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 < NGREGARG) - { - greg += n; - continue; - } -#if (! defined(__SH4__)) - else if (greg < NGREGARG) - { - greg += n; - pst += greg - NGREGARG; - continue; - } -#endif - avalue[i] = pst; - pst += n; - } - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. */ - return return_type (cif->rtype); -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/sh/ffitarget.h deleted file mode 100644 index a36bf4207..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SuperH. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/sh/sysv.S deleted file mode 100644 index 5be7516d6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh/sysv.S +++ /dev/null @@ -1,850 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima - - SuperH Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): -#endif - -#if defined(__HITACHI__) -#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 -#else -#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 -#endif - -.text - - # r4: ffi_prep_args - # r5: &ecif - # r6: bytes - # r7: flags - # sp+0: rvalue - # sp+4: fn - - # This assumes we are using gas. -ENTRY(ffi_call_SYSV) - # Save registers -.LFB1: - mov.l r8,@-r15 -.LCFI0: - mov.l r9,@-r15 -.LCFI1: - mov.l r10,@-r15 -.LCFI2: - mov.l r12,@-r15 -.LCFI3: - mov.l r14,@-r15 -.LCFI4: - sts.l pr,@-r15 -.LCFI5: - mov r15,r14 -.LCFI6: -#if defined(__SH4__) - mov r6,r8 - mov r7,r9 - - sub r6,r15 - add #-16,r15 - mov #~7,r0 - and r0,r15 - - mov r4,r0 - jsr @r0 - mov r15,r4 - - mov r9,r1 - shlr8 r9 - shlr8 r9 - shlr8 r9 - - mov #FFI_TYPE_STRUCT,r2 - cmp/eq r2,r9 - bf 1f -#if STRUCT_VALUE_ADDRESS_WITH_ARG - mov.l @r15+,r4 - bra 2f - mov #5,r2 -#else - mov.l @r15+,r10 -#endif -1: - mov #4,r2 -2: - mov #4,r3 - -L_pass: - cmp/pl r8 - bf L_call_it - - mov r1,r0 - and #3,r0 - -L_pass_d: - cmp/eq #FFI_TYPE_DOUBLE,r0 - bf L_pass_f - - mov r3,r0 - and #1,r0 - tst r0,r0 - bt 1f - add #1,r3 -1: - mov #12,r0 - cmp/hs r0,r3 - bt/s 3f - shlr2 r1 - bsr L_pop_d - nop -3: - add #2,r3 - bra L_pass - add #-8,r8 - -L_pop_d: - mov r3,r0 - add r0,r0 - add r3,r0 - add #-12,r0 - braf r0 - nop -#ifdef __LITTLE_ENDIAN__ - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr4 - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr6 - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr8 - fmov.s @r15+,fr11 - rts - fmov.s @r15+,fr10 -#else - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr5 - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr7 - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr9 - fmov.s @r15+,fr10 - rts - fmov.s @r15+,fr11 -#endif - -L_pass_f: - cmp/eq #FFI_TYPE_FLOAT,r0 - bf L_pass_i - - mov #12,r0 - cmp/hs r0,r3 - bt/s 2f - shlr2 r1 - bsr L_pop_f - nop -2: - add #1,r3 - bra L_pass - add #-4,r8 - -L_pop_f: - mov r3,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop -#ifdef __LITTLE_ENDIAN__ - rts - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr11 - rts - fmov.s @r15+,fr10 -#else - rts - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr10 - rts - fmov.s @r15+,fr11 -#endif - -L_pass_i: - cmp/eq #FFI_TYPE_INT,r0 - bf L_call_it - - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r1 - bsr L_pop_i - nop -2: - add #1,r2 - bra L_pass - add #-4,r8 - -L_pop_i: - mov r2,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop - rts - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - -L_call_it: - # call function -#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) - mov r10, r2 -#endif - mov.l @(28,r14),r1 - jsr @r1 - nop - -L_ret_d: - mov #FFI_TYPE_DOUBLE,r2 - cmp/eq r2,r9 - bf L_ret_ll - - mov.l @(24,r14),r1 -#ifdef __LITTLE_ENDIAN__ - fmov.s fr1,@r1 - add #4,r1 - bra L_epilogue - fmov.s fr0,@r1 -#else - fmov.s fr0,@r1 - add #4,r1 - bra L_epilogue - fmov.s fr1,@r1 -#endif - -L_ret_ll: - mov #FFI_TYPE_SINT64,r2 - cmp/eq r2,r9 - bt/s 1f - mov #FFI_TYPE_UINT64,r2 - cmp/eq r2,r9 - bf L_ret_f - -1: - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_f: - mov #FFI_TYPE_FLOAT,r2 - cmp/eq r2,r9 - bf L_ret_i - - mov.l @(24,r14),r1 - bra L_epilogue - fmov.s fr0,@r1 - -L_ret_i: - mov #FFI_TYPE_INT,r2 - cmp/eq r2,r9 - bf L_epilogue - - mov.l @(24,r14),r1 - bra L_epilogue - mov.l r0,@r1 - -L_epilogue: - # Remove the space we pushed for the args - mov r14,r15 - - lds.l @r15+,pr - mov.l @r15+,r14 - mov.l @r15+,r12 - mov.l @r15+,r10 - mov.l @r15+,r9 - rts - mov.l @r15+,r8 -#else - mov r6,r8 - mov r7,r9 - - sub r6,r15 - add #-16,r15 - mov #~7,r0 - and r0,r15 - - mov r4,r0 - jsr @r0 - mov r15,r4 - - mov r9,r3 - shlr8 r9 - shlr8 r9 - shlr8 r9 - - mov #FFI_TYPE_STRUCT,r2 - cmp/eq r2,r9 - bf 1f -#if STRUCT_VALUE_ADDRESS_WITH_ARG - mov.l @r15+,r4 - bra 2f - mov #5,r2 -#else - mov.l @r15+,r10 -#endif -1: - mov #4,r2 -2: - -L_pass: - cmp/pl r8 - bf L_call_it - - mov r3,r0 - and #3,r0 - -L_pass_d: - cmp/eq #FFI_TYPE_DOUBLE,r0 - bf L_pass_i - - mov r15,r0 - and #7,r0 - tst r0,r0 - bt 1f - add #4,r15 -1: - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r3 - bsr L_pop_d - nop -2: - add #2,r2 - bra L_pass - add #-8,r8 - -L_pop_d: - mov r2,r0 - add r0,r0 - add r2,r0 - add #-12,r0 - add r0,r0 - braf r0 - nop - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - rts - mov.l @r15+,r7 - -L_pass_i: - cmp/eq #FFI_TYPE_INT,r0 - bf L_call_it - - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r3 - bsr L_pop_i - nop -2: - add #1,r2 - bra L_pass - add #-4,r8 - -L_pop_i: - mov r2,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop - rts - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - -L_call_it: - # call function -#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) - mov r10, r2 -#endif - mov.l @(28,r14),r1 - jsr @r1 - nop - -L_ret_d: - mov #FFI_TYPE_DOUBLE,r2 - cmp/eq r2,r9 - bf L_ret_ll - - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_ll: - mov #FFI_TYPE_SINT64,r2 - cmp/eq r2,r9 - bt/s 1f - mov #FFI_TYPE_UINT64,r2 - cmp/eq r2,r9 - bf L_ret_i - -1: - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_i: - mov #FFI_TYPE_FLOAT,r2 - cmp/eq r2,r9 - bt 1f - mov #FFI_TYPE_INT,r2 - cmp/eq r2,r9 - bf L_epilogue -1: - mov.l @(24,r14),r1 - bra L_epilogue - mov.l r0,@r1 - -L_epilogue: - # Remove the space we pushed for the args - mov r14,r15 - - lds.l @r15+,pr - mov.l @r15+,r14 - mov.l @r15+,r12 - mov.l @r15+,r10 - mov.l @r15+,r9 - rts - mov.l @r15+,r8 -#endif -.LFE1: -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - -.globl ffi_closure_helper_SYSV - -ENTRY(ffi_closure_SYSV) -.LFB2: - mov.l r7,@-r15 -.LCFI7: - mov.l r6,@-r15 -.LCFI8: - mov.l r5,@-r15 -.LCFI9: - mov.l r4,@-r15 -.LCFIA: - mov.l r14,@-r15 -.LCFIB: - sts.l pr,@-r15 - - /* Stack layout: - xx bytes (on stack parameters) - 16 bytes (register parameters) - 4 bytes (saved frame pointer) - 4 bytes (saved return address) - 32 bytes (floating register parameters, SH-4 only) - 8 bytes (result) - 4 bytes (pad) - 4 bytes (5th arg) - <- new stack pointer - */ -.LCFIC: -#if defined(__SH4__) - add #-48,r15 -#else - add #-16,r15 -#endif -.LCFID: - mov r15,r14 -.LCFIE: - -#if defined(__SH4__) - mov r14,r1 - add #48,r1 -#ifdef __LITTLE_ENDIAN__ - fmov.s fr10,@-r1 - fmov.s fr11,@-r1 - fmov.s fr8,@-r1 - fmov.s fr9,@-r1 - fmov.s fr6,@-r1 - fmov.s fr7,@-r1 - fmov.s fr4,@-r1 - fmov.s fr5,@-r1 -#else - fmov.s fr11,@-r1 - fmov.s fr10,@-r1 - fmov.s fr9,@-r1 - fmov.s fr8,@-r1 - fmov.s fr7,@-r1 - fmov.s fr6,@-r1 - fmov.s fr5,@-r1 - fmov.s fr4,@-r1 -#endif - mov r1,r7 - mov r14,r6 - add #56,r6 -#else - mov r14,r6 - add #24,r6 -#endif - - bt/s 10f - mov r2, r5 - mov r14,r1 - add #8,r1 - mov r1,r5 -10: - - mov r14,r1 -#if defined(__SH4__) - add #72,r1 -#else - add #40,r1 -#endif - mov.l r1,@r14 - -#ifdef PIC - mov.l L_got,r1 - mova L_got,r0 - add r0,r1 - mov.l L_helper,r0 - add r1,r0 -#else - mov.l L_helper,r0 -#endif - jsr @r0 - mov r3,r4 - - shll r0 - mov r0,r1 - mova L_table,r0 - add r1,r0 - mov.w @r0,r0 - mov r14,r2 - braf r0 - add #8,r2 -0: - .align 2 -#ifdef PIC -L_got: - .long _GLOBAL_OFFSET_TABLE_ -L_helper: - .long ffi_closure_helper_SYSV@GOTOFF -#else -L_helper: - .long ffi_closure_helper_SYSV -#endif -L_table: - .short L_case_v - 0b /* FFI_TYPE_VOID */ - .short L_case_i - 0b /* FFI_TYPE_INT */ -#if defined(__SH4__) - .short L_case_f - 0b /* FFI_TYPE_FLOAT */ - .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ - .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ -#else - .short L_case_i - 0b /* FFI_TYPE_FLOAT */ - .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ - .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ -#endif - .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ - .short L_case_q - 0b /* FFI_TYPE_SINT8 */ - .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ - .short L_case_h - 0b /* FFI_TYPE_SINT16 */ - .short L_case_i - 0b /* FFI_TYPE_UINT32 */ - .short L_case_i - 0b /* FFI_TYPE_SINT32 */ - .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ - .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ - .short L_case_v - 0b /* FFI_TYPE_STRUCT */ - .short L_case_i - 0b /* FFI_TYPE_POINTER */ - -#if defined(__SH4__) -L_case_d: -#ifdef __LITTLE_ENDIAN__ - fmov.s @r2+,fr1 - bra L_case_v - fmov.s @r2,fr0 -#else - fmov.s @r2+,fr0 - bra L_case_v - fmov.s @r2,fr1 -#endif - -L_case_f: - bra L_case_v - fmov.s @r2,fr0 -#endif - -L_case_ll: - mov.l @r2+,r0 - bra L_case_v - mov.l @r2,r1 - -L_case_i: - bra L_case_v - mov.l @r2,r0 - -L_case_q: -#ifdef __LITTLE_ENDIAN__ -#else - add #3,r2 -#endif - bra L_case_v - mov.b @r2,r0 - -L_case_uq: -#ifdef __LITTLE_ENDIAN__ -#else - add #3,r2 -#endif - mov.b @r2,r0 - bra L_case_v - extu.b r0,r0 - -L_case_h: -#ifdef __LITTLE_ENDIAN__ -#else - add #2,r2 -#endif - bra L_case_v - mov.w @r2,r0 - -L_case_uh: -#ifdef __LITTLE_ENDIAN__ -#else - add #2,r2 -#endif - mov.w @r2,r0 - extu.w r0,r0 - /* fall through */ - -L_case_v: -#if defined(__SH4__) - add #48,r15 -#else - add #16,r15 -#endif - lds.l @r15+,pr - mov.l @r15+,r14 - rts - add #16,r15 -.LFE2: -.ffi_closure_SYSV_end: - .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif - - .section ".eh_frame","aw",@progbits -__FRAME_BEGIN__: - .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .4byte 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef PIC - .ascii "zR\0" /* CIE Augmentation */ -#else - .byte 0x0 /* CIE Augmentation */ -#endif - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ - .byte 0x11 /* CIE RA Column */ -#ifdef PIC - .uleb128 0x1 /* Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0xf /* uleb128 0xf */ - .byte 0x0 /* uleb128 0x0 */ - .align 2 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ -#ifdef PIC - .4byte .LFB1-. /* FDE initial location */ -#else - .4byte .LFB1 /* FDE initial location */ -#endif - .4byte .LFE1-.LFB1 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI0-.LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI1-.LCFI0 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI2-.LCFI1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0xc /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI3-.LCFI2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x10 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI4-.LCFI3 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x14 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI5-.LCFI4 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x18 /* uleb128 0x4 */ - .byte 0x91 /* DW_CFA_offset, column 0x11 */ - .byte 0x6 /* uleb128 0x6 */ - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .byte 0x5 /* uleb128 0x5 */ - .byte 0x8c /* DW_CFA_offset, column 0xc */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x8a /* DW_CFA_offset, column 0xa */ - .byte 0x3 /* uleb128 0x3 */ - .byte 0x89 /* DW_CFA_offset, column 0x9 */ - .byte 0x2 /* uleb128 0x2 */ - .byte 0x88 /* DW_CFA_offset, column 0x8 */ - .byte 0x1 /* uleb128 0x1 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI6-.LCFI5 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0xe /* uleb128 0xe */ - .align 2 -.LEFDE1: - -.LSFDE3: - .4byte .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ -#ifdef PIC - .4byte .LFB2-. /* FDE initial location */ -#else - .4byte .LFB2 /* FDE initial location */ -#endif - .4byte .LFE2-.LFB2 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI7-.LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI8-.LCFI7 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI9-.LCFI8 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0xc /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIA-.LCFI9 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x10 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIB-.LCFIA - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x14 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIC-.LCFIB - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x18 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFID-.LCFIC - .byte 0xe /* DW_CFA_def_cfa_offset */ -#if defined(__SH4__) - .byte 24+48 /* uleb128 24+48 */ -#else - .byte 24+16 /* uleb128 24+16 */ -#endif - .byte 0x91 /* DW_CFA_offset, column 0x11 */ - .byte 0x6 /* uleb128 0x6 */ - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .byte 0x5 /* uleb128 0x5 */ - .byte 0x84 /* DW_CFA_offset, column 0x4 */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x3 /* uleb128 0x3 */ - .byte 0x86 /* DW_CFA_offset, column 0x6 */ - .byte 0x2 /* uleb128 0x2 */ - .byte 0x87 /* DW_CFA_offset, column 0x7 */ - .byte 0x1 /* uleb128 0x1 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIE-.LCFID - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0xe /* uleb128 0xe */ - .align 2 -.LEFDE3: diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh64/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/sh64/ffi.c deleted file mode 100644 index 123b87ace..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh64/ffi.c +++ /dev/null @@ -1,469 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima - Copyright (c) 2008 Anthony Green - - SuperH SHmedia Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -#define NGREGARG 8 -#define NFREGARG 12 - -static int -return_type (ffi_type *arg) -{ - - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - - /* gcc uses r2 if the result can be packed in on register. */ - if (arg->size <= sizeof (UINT8)) - return FFI_TYPE_UINT8; - else if (arg->size <= sizeof (UINT16)) - return FFI_TYPE_UINT16; - else if (arg->size <= sizeof (UINT32)) - return FFI_TYPE_UINT32; - else if (arg->size <= sizeof (UINT64)) - return FFI_TYPE_UINT64; - - return FFI_TYPE_STRUCT; -} - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register unsigned int avn; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += sizeof (UINT64); - } - - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - int align; - - z = (*p_arg)->size; - align = (*p_arg)->alignment; - if (z < sizeof (UINT32)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv); - break; - - case FFI_TYPE_UINT8: - *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv); - break; - - case FFI_TYPE_SINT16: - *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT16: - *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv); - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT(0); - } - argp += sizeof (UINT64); - } - else if (z == sizeof (UINT32) && align == sizeof (UINT32)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT32: - case FFI_TYPE_STRUCT: - *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv); - break; - - default: - FFI_ASSERT(0); - break; - } - argp += sizeof (UINT64); - } - else if (z == sizeof (UINT64) - && align == sizeof (UINT64) - && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0) - { - *(UINT64 *) argp = *(UINT64 *) (*p_argv); - argp += sizeof (UINT64); - } - else - { - int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); - - memcpy (argp, *p_argv, z); - argp += n * sizeof (UINT64); - } - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int i, j; - int size, type; - int n, m; - int greg; - int freg; - int fpair = -1; - - greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0); - freg = 0; - cif->flags2 = 0; - - for (i = j = 0; i < cif->nargs; i++) - { - type = (cif->arg_types)[i]->type; - switch (type) - { - case FFI_TYPE_FLOAT: - greg++; - cif->bytes += sizeof (UINT64) - sizeof (float); - if (freg >= NFREGARG - 1) - continue; - if (fpair < 0) - { - fpair = freg; - freg += 2; - } - else - fpair = -1; - cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); - break; - - case FFI_TYPE_DOUBLE: - if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG) - continue; - if ((freg + 1) < NFREGARG) - { - freg += 2; - cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); - } - else - cif->flags2 += FFI_TYPE_INT << (2 * j++); - break; - - default: - size = (cif->arg_types)[i]->size; - if (size < sizeof (UINT64)) - cif->bytes += sizeof (UINT64) - size; - n = (size + sizeof (UINT64) - 1) / sizeof (UINT64); - if (greg >= NGREGARG) - continue; - else if (greg + n - 1 >= NGREGARG) - greg = NGREGARG; - else - greg += n; - for (m = 0; m < n; m++) - cif->flags2 += FFI_TYPE_INT << (2 * j++); - break; - } - } - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - cif->flags = return_type (cif->rtype); - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = cif->rtype->type; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -/*@-declundef@*/ -/*@-exportheader@*/ -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, long long, - /*@out@*/ unsigned *, - void (*fn)(void)); -/*@=declundef@*/ -/*@=exportheader@*/ - -void ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(void), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue) -{ - extended_cif ecif; - UINT64 trvalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if (cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - ecif.rvalue = &trvalue; - else if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2, - ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } - - if (rvalue - && cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - memcpy (rvalue, &trvalue, cif->rtype->size); -} - -extern void ffi_closure_SYSV (void); -extern void __ic_invalidate (void *line); - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - /* Since ffi_closure is an aligned object, the ffi trampoline is - called as an SHcompact code. Sigh. - SHcompact part: - mova @(1,pc),r0; add #1,r0; jmp @r0; nop; - SHmedia part: - movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 - movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */ -#ifdef __LITTLE_ENDIAN__ - tramp[0] = 0x7001c701; - tramp[1] = 0x0009402b; -#else - tramp[0] = 0xc7017001; - tramp[1] = 0x402b0009; -#endif - tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10; - tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10; - tramp[4] = 0x6bf10600; - tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10; - tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10; - tramp[7] = 0x4401fff0; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the icache. */ - asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp), - "r"(codeloc)); - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - * entry, r3 holds the address of the closure. - * After storing the registers that could possibly contain - * parameters to be passed into the stack frame and setting - * up space for a return value, ffi_closure_SYSV invokes the - * following helper function to do most of the work. - */ - -int -ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, - UINT64 *pgr, UINT64 *pfr, UINT64 *pst) -{ - void **avalue; - ffi_type **p_arg; - int i, avn; - int greg, freg; - ffi_cif *cif; - int fpair = -1; - - cif = closure->cif; - avalue = alloca (cif->nargs * sizeof (void *)); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. */ - if (return_type (cif->rtype) == FFI_TYPE_STRUCT) - { - rvalue = (UINT64 *) *pgr; - greg = 1; - } - else - greg = 0; - - freg = 0; - cif = closure->cif; - avn = cif->nargs; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - void *p; - - z = (*p_arg)->size; - if (z < sizeof (UINT32)) - { - p = pgr + greg++; - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_STRUCT: -#ifdef __LITTLE_ENDIAN__ - avalue[i] = p; -#else - avalue[i] = ((char *) p) + sizeof (UINT32) - z; -#endif - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof (UINT32)) - { - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg < NFREGARG - 1) - { - if (fpair >= 0) - { - avalue[i] = (UINT32 *) pfr + fpair; - fpair = -1; - } - else - { -#ifdef __LITTLE_ENDIAN__ - fpair = freg; - avalue[i] = (UINT32 *) pfr + (1 ^ freg); -#else - fpair = 1 ^ freg; - avalue[i] = (UINT32 *) pfr + freg; -#endif - freg += 2; - } - } - else -#ifdef __LITTLE_ENDIAN__ - avalue[i] = pgr + greg; -#else - avalue[i] = (UINT32 *) (pgr + greg) + 1; -#endif - } - else -#ifdef __LITTLE_ENDIAN__ - avalue[i] = pgr + greg; -#else - avalue[i] = (UINT32 *) (pgr + greg) + 1; -#endif - greg++; - } - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - avalue[i] = pgr + greg; - else - { - avalue[i] = pfr + (freg >> 1); - freg += 2; - } - greg++; - } - else - { - int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); - - avalue[i] = pgr + greg; - greg += n; - } - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. */ - return return_type (cif->rtype); -} - diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh64/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/sh64/ffitarget.h deleted file mode 100644 index 08a6fe96c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh64/ffitarget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SuperH - SHmedia. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; - -#define FFI_EXTRA_CIF_FIELDS long long flags2 -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 32 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/sh64/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/sh64/sysv.S deleted file mode 100644 index c4587d5f3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sh64/sysv.S +++ /dev/null @@ -1,539 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima - - SuperH SHmedia Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): -#endif - -#ifdef __LITTLE_ENDIAN__ -#define OFS_FLT 0 -#else -#define OFS_FLT 4 -#endif - - .section .text..SHmedia32,"ax" - - # r2: ffi_prep_args - # r3: &ecif - # r4: bytes - # r5: flags - # r6: flags2 - # r7: rvalue - # r8: fn - - # This assumes we are using gas. - .align 5 -ENTRY(ffi_call_SYSV) - # Save registers -.LFB1: - addi.l r15, -48, r15 -.LCFI0: - st.q r15, 40, r32 - st.q r15, 32, r31 - st.q r15, 24, r30 - st.q r15, 16, r29 - st.q r15, 8, r28 - st.l r15, 4, r18 - st.l r15, 0, r14 -.LCFI1: - add.l r15, r63, r14 -.LCFI2: -# add r4, r63, r28 - add r5, r63, r29 - add r6, r63, r30 - add r7, r63, r31 - add r8, r63, r32 - - addi r4, (64 + 7), r4 - andi r4, ~7, r4 - sub.l r15, r4, r15 - - ptabs/l r2, tr0 - add r15, r63, r2 - blink tr0, r18 - - addi r15, 64, r22 - movi 0, r0 - movi 0, r1 - movi -1, r23 - - pt/l 1f, tr1 - bnei/l r29, FFI_TYPE_STRUCT, tr1 - ld.l r15, 0, r19 - addi r15, 8, r15 - addi r0, 1, r0 -1: - -.L_pass: - andi r30, 3, r20 - shlri r30, 2, r30 - - pt/l .L_call_it, tr0 - pt/l .L_pass_i, tr1 - pt/l .L_pass_f, tr2 - - beqi/l r20, FFI_TYPE_VOID, tr0 - beqi/l r20, FFI_TYPE_INT, tr1 - beqi/l r20, FFI_TYPE_FLOAT, tr2 - -.L_pass_d: - addi r0, 1, r0 - pt/l 3f, tr0 - movi 12, r20 - bge/l r1, r20, tr0 - - pt/l .L_pop_d, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - addi r1, 2, r1 - blink tr0, r63 - -.L_pop_d: - pt/l .L_pop_d_tbl, tr1 - gettr tr1, r20 - shlli r1, 2, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_d_tbl: - fld.d r15, 0, dr0 - blink tr0, r63 - fld.d r15, 0, dr2 - blink tr0, r63 - fld.d r15, 0, dr4 - blink tr0, r63 - fld.d r15, 0, dr6 - blink tr0, r63 - fld.d r15, 0, dr8 - blink tr0, r63 - fld.d r15, 0, dr10 - blink tr0, r63 - -.L_pass_f: - addi r0, 1, r0 - pt/l 3f, tr0 - movi 12, r20 - bge/l r1, r20, tr0 - - pt/l .L_pop_f, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - blink tr0, r63 - -.L_pop_f: - pt/l .L_pop_f_tbl, tr1 - pt/l 5f, tr2 - gettr tr1, r20 - bge/l r23, r63, tr2 - add r1, r63, r23 - shlli r1, 3, r21 - addi r1, 2, r1 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 -5: - addi r23, 1, r21 - movi -1, r23 - shlli r21, 3, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_f_tbl: - fld.s r15, OFS_FLT, fr0 - blink tr0, r63 - fld.s r15, OFS_FLT, fr1 - blink tr0, r63 - fld.s r15, OFS_FLT, fr2 - blink tr0, r63 - fld.s r15, OFS_FLT, fr3 - blink tr0, r63 - fld.s r15, OFS_FLT, fr4 - blink tr0, r63 - fld.s r15, OFS_FLT, fr5 - blink tr0, r63 - fld.s r15, OFS_FLT, fr6 - blink tr0, r63 - fld.s r15, OFS_FLT, fr7 - blink tr0, r63 - fld.s r15, OFS_FLT, fr8 - blink tr0, r63 - fld.s r15, OFS_FLT, fr9 - blink tr0, r63 - fld.s r15, OFS_FLT, fr10 - blink tr0, r63 - fld.s r15, OFS_FLT, fr11 - blink tr0, r63 - -.L_pass_i: - pt/l 3f, tr0 - movi 8, r20 - bge/l r0, r20, tr0 - - pt/l .L_pop_i, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - addi r0, 1, r0 - blink tr0, r63 - -.L_pop_i: - pt/l .L_pop_i_tbl, tr1 - gettr tr1, r20 - shlli r0, 3, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_i_tbl: - ld.q r15, 0, r2 - blink tr0, r63 - ld.q r15, 0, r3 - blink tr0, r63 - ld.q r15, 0, r4 - blink tr0, r63 - ld.q r15, 0, r5 - blink tr0, r63 - ld.q r15, 0, r6 - blink tr0, r63 - ld.q r15, 0, r7 - blink tr0, r63 - ld.q r15, 0, r8 - blink tr0, r63 - ld.q r15, 0, r9 - blink tr0, r63 - -.L_call_it: - # call function - pt/l 1f, tr1 - bnei/l r29, FFI_TYPE_STRUCT, tr1 - add r19, r63, r2 -1: - add r22, r63, r15 - ptabs/l r32, tr0 - blink tr0, r18 - - pt/l .L_ret_i, tr0 - pt/l .L_ret_ll, tr1 - pt/l .L_ret_d, tr2 - pt/l .L_ret_f, tr3 - pt/l .L_epilogue, tr4 - - beqi/l r29, FFI_TYPE_INT, tr0 - beqi/l r29, FFI_TYPE_UINT32, tr0 - beqi/l r29, FFI_TYPE_SINT64, tr1 - beqi/l r29, FFI_TYPE_UINT64, tr1 - beqi/l r29, FFI_TYPE_DOUBLE, tr2 - beqi/l r29, FFI_TYPE_FLOAT, tr3 - - pt/l .L_ret_q, tr0 - pt/l .L_ret_h, tr1 - - beqi/l r29, FFI_TYPE_UINT8, tr0 - beqi/l r29, FFI_TYPE_UINT16, tr1 - blink tr4, r63 - -.L_ret_d: - fst.d r31, 0, dr0 - blink tr4, r63 - -.L_ret_ll: - st.q r31, 0, r2 - blink tr4, r63 - -.L_ret_f: - fst.s r31, OFS_FLT, fr0 - blink tr4, r63 - -.L_ret_q: - st.b r31, 0, r2 - blink tr4, r63 - -.L_ret_h: - st.w r31, 0, r2 - blink tr4, r63 - -.L_ret_i: - st.l r31, 0, r2 - # Fall - -.L_epilogue: - # Remove the space we pushed for the args - add r14, r63, r15 - - ld.l r15, 0, r14 - ld.l r15, 4, r18 - ld.q r15, 8, r28 - ld.q r15, 16, r29 - ld.q r15, 24, r30 - ld.q r15, 32, r31 - ld.q r15, 40, r32 - addi.l r15, 48, r15 - ptabs r18, tr0 - blink tr0, r63 - -.LFE1: -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - - .align 5 -ENTRY(ffi_closure_SYSV) -.LFB2: - addi.l r15, -136, r15 -.LCFI3: - st.l r15, 12, r18 - st.l r15, 8, r14 - st.l r15, 4, r12 -.LCFI4: - add r15, r63, r14 -.LCFI5: - /* Stack layout: - ... - 64 bytes (register parameters) - 48 bytes (floating register parameters) - 8 bytes (result) - 4 bytes (r18) - 4 bytes (r14) - 4 bytes (r12) - 4 bytes (for align) - <- new stack pointer - */ - fst.d r14, 24, dr0 - fst.d r14, 32, dr2 - fst.d r14, 40, dr4 - fst.d r14, 48, dr6 - fst.d r14, 56, dr8 - fst.d r14, 64, dr10 - st.q r14, 72, r2 - st.q r14, 80, r3 - st.q r14, 88, r4 - st.q r14, 96, r5 - st.q r14, 104, r6 - st.q r14, 112, r7 - st.q r14, 120, r8 - st.q r14, 128, r9 - - add r1, r63, r2 - addi r14, 16, r3 - addi r14, 72, r4 - addi r14, 24, r5 - addi r14, 136, r6 -#ifdef PIC - movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 - shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 -.LPCS0: ptrel/u r12, tr0 - movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 - gettr tr0, r12 - ldx.l r1, r12, r1 - ptabs r1, tr0 -#else - pt/l ffi_closure_helper_SYSV, tr0 -#endif - blink tr0, r18 - - shlli r2, 1, r1 - movi (((datalabel .L_table) >> 16) & 65535), r2 - shori ((datalabel .L_table) & 65535), r2 - ldx.w r2, r1, r1 - add r1, r2, r1 - pt/l .L_case_v, tr1 - ptabs r1, tr0 - blink tr0, r63 - - .align 2 -.L_table: - .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ - .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ - .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ - .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ - .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ - .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ - .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ - .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ - .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ - .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ - .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ - - .align 2 -.L_case_d: - fld.d r14, 16, dr0 - blink tr1, r63 -.L_case_f: - fld.s r14, 16, fr0 - blink tr1, r63 -.L_case_ll: - ld.q r14, 16, r2 - blink tr1, r63 -.L_case_i: - ld.l r14, 16, r2 - blink tr1, r63 -.L_case_q: - ld.b r14, 16, r2 - blink tr1, r63 -.L_case_uq: - ld.ub r14, 16, r2 - blink tr1, r63 -.L_case_h: - ld.w r14, 16, r2 - blink tr1, r63 -.L_case_uh: - ld.uw r14, 16, r2 - blink tr1, r63 -.L_case_v: - add.l r14, r63, r15 - ld.l r15, 4, r12 - ld.l r15, 8, r14 - ld.l r15, 12, r18 - addi.l r15, 136, r15 - ptabs r18, tr0 - blink tr0, r63 - -.LFE2: -.ffi_closure_SYSV_end: - .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif - - .section ".eh_frame","aw",@progbits -__FRAME_BEGIN__: - .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .4byte 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef PIC - .ascii "zR\0" /* CIE Augmentation */ -#else - .byte 0x0 /* CIE Augmentation */ -#endif - .uleb128 0x1 /* CIE Code Alignment Factor */ - .sleb128 -4 /* CIE Data Alignment Factor */ - .byte 0x12 /* CIE RA Column */ -#ifdef PIC - .uleb128 0x1 /* Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .uleb128 0xf - .uleb128 0x0 - .align 2 -.LECIE1: -.LSFDE1: - .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ -.LASFDE1: - .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ -#ifdef PIC - .4byte .LFB1-. /* FDE initial location */ -#else - .4byte .LFB1 /* FDE initial location */ -#endif - .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI0-datalabel .LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 0x30 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI1-datalabel .LCFI0 - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .uleb128 0xc - .byte 0x92 /* DW_CFA_offset, column 0x12 */ - .uleb128 0xb - .byte 0x9c /* DW_CFA_offset, column 0x1c */ - .uleb128 0xa - .byte 0x9d /* DW_CFA_offset, column 0x1d */ - .uleb128 0x8 - .byte 0x9e /* DW_CFA_offset, column 0x1e */ - .uleb128 0x6 - .byte 0x9f /* DW_CFA_offset, column 0x1f */ - .uleb128 0x4 - .byte 0xa0 /* DW_CFA_offset, column 0x20 */ - .uleb128 0x2 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI2-datalabel .LCFI1 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0xe - .align 2 -.LEFDE1: - -.LSFDE3: - .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ -.LASFDE3: - .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ -#ifdef PIC - .4byte .LFB2-. /* FDE initial location */ -#else - .4byte .LFB2 /* FDE initial location */ -#endif - .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI3-datalabel .LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 0x88 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI4-datalabel .LCFI3 - .byte 0x8c /* DW_CFA_offset, column 0xc */ - .uleb128 0x21 - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .uleb128 0x20 - .byte 0x92 /* DW_CFA_offset, column 0x12 */ - .uleb128 0x1f - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI5-datalabel .LCFI4 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0xe - .align 2 -.LEFDE3: diff --git a/third_party/python/Modules/_ctypes/libffi/src/sparc/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/sparc/ffi.c deleted file mode 100644 index 9f0fded48..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sparc/ffi.c +++ /dev/null @@ -1,681 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011, 2013 Anthony Green - Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. - - SPARC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args_v8(char *stack, extended_cif *ecif) -{ - int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - - /* Skip 16 words for the window save area */ - argp = stack + 16*sizeof(int); - - /* This should only really be done when we are returning a structure, - however, it's faster just to do it all the time... - - if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) */ - *(int *) argp = (long)ecif->rvalue; - - /* And 1 word for the structure return value. */ - argp += sizeof(int); - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, unless we - zero out this memory. */ - - ((int*)argp)[0] = 0; - ((int*)argp)[1] = 0; - ((int*)argp)[2] = 0; - ((int*)argp)[3] = 0; - ((int*)argp)[4] = 0; - ((int*)argp)[5] = 0; -#endif - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) - { - size_t z; - - if ((*p_arg)->type == FFI_TYPE_STRUCT -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - || (*p_arg)->type == FFI_TYPE_LONGDOUBLE -#endif - ) - { - *(unsigned int *) argp = (unsigned long)(* p_argv); - z = sizeof(int); - } - else - { - z = (*p_arg)->size; - if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = *(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = *(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = *(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = *(UINT16 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else - { - memcpy(argp, *p_argv, z); - } - } - p_argv++; - argp += z; - } - - return; -} - -int ffi_prep_args_v9(char *stack, extended_cif *ecif) -{ - int i, ret = 0; - int tmp; - void **p_argv; - char *argp; - ffi_type **p_arg; - - tmp = 0; - - /* Skip 16 words for the window save area */ - argp = stack + 16*sizeof(long long); - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, unless we - zero out this memory. */ - - ((long long*)argp)[0] = 0; - ((long long*)argp)[1] = 0; - ((long long*)argp)[2] = 0; - ((long long*)argp)[3] = 0; - ((long long*)argp)[4] = 0; - ((long long*)argp)[5] = 0; -#endif - - p_argv = ecif->avalue; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && - ecif->cif->rtype->size > 32) - { - *(unsigned long long *) argp = (unsigned long)ecif->rvalue; - argp += sizeof(long long); - tmp = 1; - } - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - switch ((*p_arg)->type) - { - case FFI_TYPE_STRUCT: - if (z > 16) - { - /* For structures larger than 16 bytes we pass reference. */ - *(unsigned long long *) argp = (unsigned long)* p_argv; - argp += sizeof(long long); - tmp++; - p_argv++; - continue; - } - /* FALLTHROUGH */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - ret = 1; /* We should promote into FP regs as well as integer. */ - break; - } - if (z < sizeof(long long)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed long long *) argp = *(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned long long *) argp = *(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed long long *) argp = *(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned long long *) argp = *(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(signed long long *) argp = *(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: - *(unsigned long long *) argp = *(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_FLOAT: - *(float *) (argp + 4) = *(FLOAT32 *)(* p_argv); /* Right justify */ - break; - - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, z); - break; - - default: - FFI_ASSERT(0); - } - z = sizeof(long long); - tmp++; - } - else if (z == sizeof(long long)) - { - memcpy(argp, *p_argv, z); - z = sizeof(long long); - tmp++; - } - else - { - if ((tmp & 1) && (*p_arg)->alignment > 8) - { - tmp++; - argp += sizeof(long long); - } - memcpy(argp, *p_argv, z); - z = 2 * sizeof(long long); - tmp += 2; - } - p_argv++; - argp += z; - } - - return ret; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int wordsize; - - if (cif->abi != FFI_V9) - { - wordsize = 4; - - /* If we are returning a struct, this will already have been added. - Otherwise we need to add it because it's always got to be there! */ - - if (cif->rtype->type != FFI_TYPE_STRUCT) - cif->bytes += wordsize; - - /* sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - - if (cif->bytes < 4*6+4) - cif->bytes = 4*6+4; - } - else - { - wordsize = 8; - - /* sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - - if (cif->bytes < 8*6) - cif->bytes = 8*6; - } - - /* Adjust cif->bytes. to include 16 words for the window save area, - and maybe the struct/union return pointer area, */ - - cif->bytes += 16 * wordsize; - - /* The stack must be 2 word aligned, so round bytes up - appropriately. */ - - cif->bytes = ALIGN(cif->bytes, 2 * wordsize); - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - cif->flags = cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - if (cif->abi == FFI_V9 && cif->rtype->size > 32) - cif->flags = FFI_TYPE_VOID; - else - cif->flags = FFI_TYPE_STRUCT; - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - if (cif->abi == FFI_V9) - cif->flags = FFI_TYPE_INT; - else - cif->flags = cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - if (cif->abi == FFI_V9) - cif->flags = FFI_TYPE_INT; - else - cif->flags = FFI_TYPE_SINT64; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - return FFI_OK; -} - -int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt) -{ - ffi_type **ptr = &arg->elements[0]; - - while (*ptr != NULL) - { - if (off & ((*ptr)->alignment - 1)) - off = ALIGN(off, (*ptr)->alignment); - - switch ((*ptr)->type) - { - case FFI_TYPE_STRUCT: - off = ffi_v9_layout_struct(*ptr, off, ret, intg, flt); - off = ALIGN(off, FFI_SIZEOF_ARG); - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - memmove(ret + off, flt + off, (*ptr)->size); - off += (*ptr)->size; - break; - default: - memmove(ret + off, intg + off, (*ptr)->size); - off += (*ptr)->size; - break; - } - ptr++; - } - return off; -} - - -#ifdef SPARC64 -extern int ffi_call_v9(void *, extended_cif *, unsigned, - unsigned, unsigned *, void (*fn)(void)); -#else -extern int ffi_call_v8(void *, extended_cif *, unsigned, - unsigned, unsigned *, void (*fn)(void)); -#endif - -#ifndef __GNUC__ -void ffi_flush_icache (void *, size_t); -#endif - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - void *rval = rvalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - ecif.rvalue = rvalue; - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - if (cif->rtype->size <= 32) - rval = alloca(64); - else - { - rval = NULL; - if (rvalue == NULL) - ecif.rvalue = alloca(cif->rtype->size); - } - } - - switch (cif->abi) - { - case FFI_V8: -#ifdef SPARC64 - /* We don't yet support calling 32bit code from 64bit */ - FFI_ASSERT(0); -#else - if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - || cif->flags == FFI_TYPE_LONGDOUBLE -#endif - )) - { - /* For v8, we need an "unimp" with size of returning struct */ - /* behind "call", so we alloc some executable space for it. */ - /* l7 is used, we need to make sure v8.S doesn't use %l7. */ - unsigned int *call_struct = NULL; - ffi_closure_alloc(32, (void **)&call_struct); - if (call_struct) - { - unsigned long f = (unsigned long)fn; - call_struct[0] = 0xae10001f; /* mov %i7, %l7 */ - call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */ - call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */ - call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */ - call_struct[4] = 0x01000000; /* nop */ - if (cif->rtype->size < 0x7f) - call_struct[5] = cif->rtype->size; /* unimp */ - else - call_struct[5] = 0x01000000; /* nop */ - call_struct[6] = 0x81c7e008; /* ret */ - call_struct[7] = 0xbe100017; /* mov %l7, %i7 */ -#ifdef __GNUC__ - asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : : - "r" (call_struct) : "memory"); - /* SPARC v8 requires 5 instructions for flush to be visible */ - asm volatile ("nop; nop; nop; nop; nop"); -#else - ffi_flush_icache (call_struct, 32); -#endif - ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, - cif->flags, rvalue, call_struct); - ffi_closure_free(call_struct); - } - else - { - ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, - cif->flags, rvalue, fn); - } - } - else - { - ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, - cif->flags, rvalue, fn); - } -#endif - break; - case FFI_V9: -#ifdef SPARC64 - ffi_call_v9(ffi_prep_args_v9, &ecif, cif->bytes, - cif->flags, rval, fn); - if (rvalue && rval && cif->rtype->type == FFI_TYPE_STRUCT) - ffi_v9_layout_struct(cif->rtype, 0, (char *)rvalue, (char *)rval, ((char *)rval)+32); -#else - /* And vice versa */ - FFI_ASSERT(0); -#endif - break; - default: - FFI_ASSERT(0); - break; - } -} - - -#ifdef SPARC64 -extern void ffi_closure_v9(void); -#else -extern void ffi_closure_v8(void); -#endif - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - unsigned long fn; -#ifdef SPARC64 - /* Trampoline address is equal to the closure address. We take advantage - of that to reduce the trampoline size by 8 bytes. */ - if (cif->abi != FFI_V9) - return FFI_BAD_ABI; - fn = (unsigned long) ffi_closure_v9; - tramp[0] = 0x83414000; /* rd %pc, %g1 */ - tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ - tramp[2] = 0x81c14000; /* jmp %g5 */ - tramp[3] = 0x01000000; /* nop */ - *((unsigned long *) &tramp[4]) = fn; -#else - unsigned long ctx = (unsigned long) codeloc; - if (cif->abi != FFI_V8) - return FFI_BAD_ABI; - fn = (unsigned long) ffi_closure_v8; - tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ - tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ - tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ - tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the Icache. closure is 8 bytes aligned. */ -#ifdef __GNUC__ -#ifdef SPARC64 - asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory"); -#else - asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory"); - /* SPARC v8 requires 5 instructions for flush to be visible */ - asm volatile ("nop; nop; nop; nop; nop"); -#endif -#else - ffi_flush_icache (closure, 16); -#endif - - return FFI_OK; -} - -int -ffi_closure_sparc_inner_v8(ffi_closure *closure, - void *rvalue, unsigned long *gpr, unsigned long *scratch) -{ - ffi_cif *cif; - ffi_type **arg_types; - void **avalue; - int i, argn; - - cif = closure->cif; - arg_types = cif->arg_types; - avalue = alloca(cif->nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - || cif->flags == FFI_TYPE_LONGDOUBLE -#endif - ) - rvalue = (void *) gpr[0]; - - /* Always skip the structure return address. */ - argn = 1; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < cif->nargs; i++) - { - if (arg_types[i]->type == FFI_TYPE_STRUCT -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - || arg_types[i]->type == FFI_TYPE_LONGDOUBLE -#endif - ) - { - /* Straight copy of invisible reference. */ - avalue[i] = (void *)gpr[argn++]; - } - else if ((arg_types[i]->type == FFI_TYPE_DOUBLE - || arg_types[i]->type == FFI_TYPE_SINT64 - || arg_types[i]->type == FFI_TYPE_UINT64) - /* gpr is 8-byte aligned. */ - && (argn % 2) != 0) - { - /* Align on a 8-byte boundary. */ - scratch[0] = gpr[argn]; - scratch[1] = gpr[argn+1]; - avalue[i] = scratch; - scratch -= 2; - argn += 2; - } - else - { - /* Always right-justify. */ - argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; - } - } - - /* Invoke the closure. */ - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return cif->rtype->type; -} - -int -ffi_closure_sparc_inner_v9(ffi_closure *closure, - void *rvalue, unsigned long *gpr, double *fpr) -{ - ffi_cif *cif; - ffi_type **arg_types; - void **avalue; - int i, argn, fp_slot_max; - - cif = closure->cif; - arg_types = cif->arg_types; - avalue = alloca(cif->nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_VOID - && cif->rtype->type == FFI_TYPE_STRUCT) - { - rvalue = (void *) gpr[0]; - /* Skip the structure return address. */ - argn = 1; - } - else - argn = 0; - - fp_slot_max = 16 - argn; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < cif->nargs; i++) - { - if (arg_types[i]->type == FFI_TYPE_STRUCT) - { - if (arg_types[i]->size > 16) - { - /* Straight copy of invisible reference. */ - avalue[i] = (void *)gpr[argn++]; - } - else - { - /* Left-justify. */ - ffi_v9_layout_struct(arg_types[i], - 0, - (char *) &gpr[argn], - (char *) &gpr[argn], - (char *) &fpr[argn]); - avalue[i] = &gpr[argn]; - argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - } - } - else - { - /* Right-justify. */ - argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - - /* Align on a 16-byte boundary. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (arg_types[i]->type == FFI_TYPE_LONGDOUBLE && (argn % 2) != 0) - argn++; -#endif - if (i < fp_slot_max - && (arg_types[i]->type == FFI_TYPE_FLOAT - || arg_types[i]->type == FFI_TYPE_DOUBLE -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - || arg_types[i]->type == FFI_TYPE_LONGDOUBLE -#endif - )) - avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size; - else - avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; - } - } - - /* Invoke the closure. */ - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return cif->rtype->type; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/sparc/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/sparc/ffitarget.h deleted file mode 100644 index d89f7877a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sparc/ffitarget.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SPARC. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#if defined(__arch64__) || defined(__sparcv9) -#ifndef SPARC64 -#define SPARC64 -#endif -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_V8, - FFI_V8PLUS, - FFI_V9, - FFI_LAST_ABI, -#ifdef SPARC64 - FFI_DEFAULT_ABI = FFI_V9 -#else - FFI_DEFAULT_ABI = FFI_V8 -#endif -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#ifdef SPARC64 -#define FFI_TRAMPOLINE_SIZE 24 -#else -#define FFI_TRAMPOLINE_SIZE 16 -#endif - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/sparc/v8.S b/third_party/python/Modules/_ctypes/libffi/src/sparc/v8.S deleted file mode 100644 index 6bf7ac056..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sparc/v8.S +++ /dev/null @@ -1,346 +0,0 @@ -/* ----------------------------------------------------------------------- - v8.S - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. - - SPARC Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#define STACKFRAME 96 /* Minimum stack framesize for SPARC */ -#define ARGS (64+4) /* Offset of register area in frame */ - -#ifndef __GNUC__ - .text - .align 8 -.globl ffi_flush_icache -.globl _ffi_flush_icache - -ffi_flush_icache: -_ffi_flush_icache: - add %o0, %o1, %o2 -#ifdef SPARC64 -1: flush %o0 -#else -1: iflush %o0 -#endif - add %o0, 8, %o0 - cmp %o0, %o2 - blt 1b - nop - nop - nop - nop - nop - retl - nop -.ffi_flush_icache_end: - .size ffi_flush_icache,.ffi_flush_icache_end-ffi_flush_icache -#endif - - .text - .align 8 -.globl ffi_call_v8 -.globl _ffi_call_v8 - -ffi_call_v8: -_ffi_call_v8: -.LLFB1: - save %sp, -STACKFRAME, %sp -.LLCFI0: - - sub %sp, %i2, %sp ! alloca() space in stack for frame to set up - add %sp, STACKFRAME, %l0 ! %l0 has start of - ! frame to set up - - mov %l0, %o0 ! call routine to set up frame - call %i0 - mov %i1, %o1 ! (delay) - - ld [%l0+ARGS], %o0 ! call foreign function - ld [%l0+ARGS+4], %o1 - ld [%l0+ARGS+8], %o2 - ld [%l0+ARGS+12], %o3 - ld [%l0+ARGS+16], %o4 - ld [%l0+ARGS+20], %o5 - call %i5 - mov %l0, %sp ! (delay) switch to frame - nop ! STRUCT returning functions skip 12 instead of 8 bytes - - ! If the return value pointer is NULL, assume no return value. - tst %i4 - bz done - nop - - cmp %i3, FFI_TYPE_INT - be,a done - st %o0, [%i4] ! (delay) - - cmp %i3, FFI_TYPE_FLOAT - be,a done - st %f0, [%i4+0] ! (delay) - - cmp %i3, FFI_TYPE_DOUBLE - be,a double - st %f0, [%i4+0] ! (delay) - - cmp %i3, FFI_TYPE_SINT8 - be,a sint8 - sll %o0, 24, %o0 ! (delay) - - cmp %i3, FFI_TYPE_UINT8 - be,a uint8 - sll %o0, 24, %o0 ! (delay) - - cmp %i3, FFI_TYPE_SINT16 - be,a sint16 - sll %o0, 16, %o0 ! (delay) - - cmp %i3, FFI_TYPE_UINT16 - be,a uint16 - sll %o0, 16, %o0 ! (delay) - - cmp %i3, FFI_TYPE_SINT64 - be,a longlong - st %o0, [%i4+0] ! (delay) -done: - ret - restore - -double: - st %f1, [%i4+4] - ret - restore - -sint8: - sra %o0, 24, %o0 - st %o0, [%i4+0] - ret - restore - -uint8: - srl %o0, 24, %o0 - st %o0, [%i4+0] - ret - restore - -sint16: - sra %o0, 16, %o0 - st %o0, [%i4+0] - ret - restore - -uint16: - srl %o0, 16, %o0 - st %o0, [%i4+0] - ret - restore - -longlong: - st %o1, [%i4+4] - ret - restore -.LLFE1: - -.ffi_call_v8_end: - .size ffi_call_v8,.ffi_call_v8_end-ffi_call_v8 - - -#undef STACKFRAME -#define STACKFRAME 104 /* 16*4 register window + - 1*4 struct return + - 6*4 args backing store + - 3*4 locals */ - -/* ffi_closure_v8(...) - - Receives the closure argument in %g2. */ - - .text - .align 8 - .globl ffi_closure_v8 - -ffi_closure_v8: -#ifdef HAVE_AS_REGISTER_PSEUDO_OP - .register %g2, #scratch -#endif -.LLFB2: - ! Reserve frame space for all arguments in case - ! we need to align them on a 8-byte boundary. - ld [%g2+FFI_TRAMPOLINE_SIZE], %g1 - ld [%g1+4], %g1 - sll %g1, 3, %g1 - add %g1, STACKFRAME, %g1 - ! %g1 == STACKFRAME + 8*nargs - neg %g1 - save %sp, %g1, %sp -.LLCFI1: - - ! Store all of the potential argument registers in va_list format. - st %i0, [%fp+68+0] - st %i1, [%fp+68+4] - st %i2, [%fp+68+8] - st %i3, [%fp+68+12] - st %i4, [%fp+68+16] - st %i5, [%fp+68+20] - - ! Call ffi_closure_sparc_inner to do the bulk of the work. - mov %g2, %o0 - add %fp, -8, %o1 - add %fp, 64, %o2 - call ffi_closure_sparc_inner_v8 - add %fp, -16, %o3 - - ! Load up the return value in the proper type. - ! See ffi_prep_cif_machdep for the list of cases. - cmp %o0, FFI_TYPE_VOID - be done1 - - cmp %o0, FFI_TYPE_INT - be done1 - ld [%fp-8], %i0 - - cmp %o0, FFI_TYPE_FLOAT - be,a done1 - ld [%fp-8], %f0 - - cmp %o0, FFI_TYPE_DOUBLE - be,a done1 - ldd [%fp-8], %f0 - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - cmp %o0, FFI_TYPE_LONGDOUBLE - be done2 -#endif - - cmp %o0, FFI_TYPE_STRUCT - be done2 - - cmp %o0, FFI_TYPE_SINT64 - be,a done1 - ldd [%fp-8], %i0 - - cmp %o0, FFI_TYPE_UINT64 - be,a done1 - ldd [%fp-8], %i0 - - ld [%fp-8], %i0 -done1: - jmp %i7+8 - restore -done2: - ! Skip 'unimp'. - jmp %i7+12 - restore -.LLFE2: - -.ffi_closure_v8_end: - .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8 - -#ifdef SPARC64 -#define WS 8 -#define nword xword -#define uanword uaxword -#else -#define WS 4 -#define nword long -#define uanword uaword -#endif - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif -.LLframe1: - .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry -.LLSCIE1: - .uaword 0x0 ! CIE Identifier Tag - .byte 0x1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor - .byte 0x80-WS ! sleb128 -WS; CIE Data Alignment Factor - .byte 0xf ! CIE RA Column - .byte 0x1 ! uleb128 0x1; Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc ! DW_CFA_def_cfa - .byte 0xe ! uleb128 0xe - .byte 0x0 ! uleb128 0x0 - .align WS -.LLECIE1: -.LLSFDE1: - .uaword .LLEFDE1-.LLASFDE1 ! FDE Length -.LLASFDE1: - .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset -#ifdef HAVE_AS_SPARC_UA_PCREL - .uaword %r_disp32(.LLFB1) - .uaword .LLFE1-.LLFB1 ! FDE address range -#else - .align WS - .nword .LLFB1 - .uanword .LLFE1-.LLFB1 ! FDE address range -#endif - .byte 0x0 ! uleb128 0x0; Augmentation size - .byte 0x4 ! DW_CFA_advance_loc4 - .uaword .LLCFI0-.LLFB1 - .byte 0xd ! DW_CFA_def_cfa_register - .byte 0x1e ! uleb128 0x1e - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9 ! DW_CFA_register - .byte 0xf ! uleb128 0xf - .byte 0x1f ! uleb128 0x1f - .align WS -.LLEFDE1: -.LLSFDE2: - .uaword .LLEFDE2-.LLASFDE2 ! FDE Length -.LLASFDE2: - .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset -#ifdef HAVE_AS_SPARC_UA_PCREL - .uaword %r_disp32(.LLFB2) - .uaword .LLFE2-.LLFB2 ! FDE address range -#else - .align WS - .nword .LLFB2 - .uanword .LLFE2-.LLFB2 ! FDE address range -#endif - .byte 0x0 ! uleb128 0x0; Augmentation size - .byte 0x4 ! DW_CFA_advance_loc4 - .uaword .LLCFI1-.LLFB2 - .byte 0xd ! DW_CFA_def_cfa_register - .byte 0x1e ! uleb128 0x1e - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9 ! DW_CFA_register - .byte 0xf ! uleb128 0xf - .byte 0x1f ! uleb128 0x1f - .align WS -.LLEFDE2: - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/sparc/v9.S b/third_party/python/Modules/_ctypes/libffi/src/sparc/v9.S deleted file mode 100644 index bf31a2b51..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/sparc/v9.S +++ /dev/null @@ -1,307 +0,0 @@ -/* ----------------------------------------------------------------------- - v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. - - SPARC 64-bit Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifdef SPARC64 -/* Only compile this in for 64bit builds, because otherwise the object file - will have inproper architecture due to used instructions. */ - -#define STACKFRAME 176 /* Minimum stack framesize for SPARC 64-bit */ -#define STACK_BIAS 2047 -#define ARGS (128) /* Offset of register area in frame */ - -.text - .align 8 -.globl ffi_call_v9 -.globl _ffi_call_v9 - -ffi_call_v9: -_ffi_call_v9: -.LLFB1: - save %sp, -STACKFRAME, %sp -.LLCFI0: - - sub %sp, %i2, %sp ! alloca() space in stack for frame to set up - add %sp, STACKFRAME+STACK_BIAS, %l0 ! %l0 has start of - ! frame to set up - - mov %l0, %o0 ! call routine to set up frame - call %i0 - mov %i1, %o1 ! (delay) - brz,pt %o0, 1f - ldx [%l0+ARGS], %o0 ! call foreign function - - ldd [%l0+ARGS], %f0 - ldd [%l0+ARGS+8], %f2 - ldd [%l0+ARGS+16], %f4 - ldd [%l0+ARGS+24], %f6 - ldd [%l0+ARGS+32], %f8 - ldd [%l0+ARGS+40], %f10 - ldd [%l0+ARGS+48], %f12 - ldd [%l0+ARGS+56], %f14 - ldd [%l0+ARGS+64], %f16 - ldd [%l0+ARGS+72], %f18 - ldd [%l0+ARGS+80], %f20 - ldd [%l0+ARGS+88], %f22 - ldd [%l0+ARGS+96], %f24 - ldd [%l0+ARGS+104], %f26 - ldd [%l0+ARGS+112], %f28 - ldd [%l0+ARGS+120], %f30 - -1: ldx [%l0+ARGS+8], %o1 - ldx [%l0+ARGS+16], %o2 - ldx [%l0+ARGS+24], %o3 - ldx [%l0+ARGS+32], %o4 - ldx [%l0+ARGS+40], %o5 - call %i5 - sub %l0, STACK_BIAS, %sp ! (delay) switch to frame - - ! If the return value pointer is NULL, assume no return value. - brz,pn %i4, done - nop - - cmp %i3, FFI_TYPE_INT - be,a,pt %icc, done - stx %o0, [%i4+0] ! (delay) - - cmp %i3, FFI_TYPE_FLOAT - be,a,pn %icc, done - st %f0, [%i4+0] ! (delay) - - cmp %i3, FFI_TYPE_DOUBLE - be,a,pn %icc, done - std %f0, [%i4+0] ! (delay) - - cmp %i3, FFI_TYPE_STRUCT - be,pn %icc, dostruct - - cmp %i3, FFI_TYPE_LONGDOUBLE - bne,pt %icc, done - nop - std %f0, [%i4+0] - std %f2, [%i4+8] - -done: ret - restore - -dostruct: - /* This will not work correctly for unions. */ - stx %o0, [%i4+0] - stx %o1, [%i4+8] - stx %o2, [%i4+16] - stx %o3, [%i4+24] - std %f0, [%i4+32] - std %f2, [%i4+40] - std %f4, [%i4+48] - std %f6, [%i4+56] - ret - restore -.LLFE1: - -.ffi_call_v9_end: - .size ffi_call_v9,.ffi_call_v9_end-ffi_call_v9 - - -#undef STACKFRAME -#define STACKFRAME 336 /* 16*8 register window + - 6*8 args backing store + - 20*8 locals */ -#define FP %fp+STACK_BIAS - -/* ffi_closure_v9(...) - - Receives the closure argument in %g1. */ - - .text - .align 8 - .globl ffi_closure_v9 - -ffi_closure_v9: -.LLFB2: - save %sp, -STACKFRAME, %sp -.LLCFI1: - - ! Store all of the potential argument registers in va_list format. - stx %i0, [FP+128+0] - stx %i1, [FP+128+8] - stx %i2, [FP+128+16] - stx %i3, [FP+128+24] - stx %i4, [FP+128+32] - stx %i5, [FP+128+40] - - ! Store possible floating point argument registers too. - std %f0, [FP-128] - std %f2, [FP-120] - std %f4, [FP-112] - std %f6, [FP-104] - std %f8, [FP-96] - std %f10, [FP-88] - std %f12, [FP-80] - std %f14, [FP-72] - std %f16, [FP-64] - std %f18, [FP-56] - std %f20, [FP-48] - std %f22, [FP-40] - std %f24, [FP-32] - std %f26, [FP-24] - std %f28, [FP-16] - std %f30, [FP-8] - - ! Call ffi_closure_sparc_inner to do the bulk of the work. - mov %g1, %o0 - add %fp, STACK_BIAS-160, %o1 - add %fp, STACK_BIAS+128, %o2 - call ffi_closure_sparc_inner_v9 - add %fp, STACK_BIAS-128, %o3 - - ! Load up the return value in the proper type. - ! See ffi_prep_cif_machdep for the list of cases. - cmp %o0, FFI_TYPE_VOID - be,pn %icc, done1 - - cmp %o0, FFI_TYPE_INT - be,pn %icc, integer - - cmp %o0, FFI_TYPE_FLOAT - be,a,pn %icc, done1 - ld [FP-160], %f0 - - cmp %o0, FFI_TYPE_DOUBLE - be,a,pn %icc, done1 - ldd [FP-160], %f0 - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - cmp %o0, FFI_TYPE_LONGDOUBLE - be,a,pn %icc, longdouble1 - ldd [FP-160], %f0 -#endif - - ! FFI_TYPE_STRUCT - ldx [FP-152], %i1 - ldx [FP-144], %i2 - ldx [FP-136], %i3 - ldd [FP-160], %f0 - ldd [FP-152], %f2 - ldd [FP-144], %f4 - ldd [FP-136], %f6 - -integer: - ldx [FP-160], %i0 - -done1: - ret - restore - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -longdouble1: - ldd [FP-152], %f2 - ret - restore -#endif -.LLFE2: - -.ffi_closure_v9_end: - .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif -.LLframe1: - .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry -.LLSCIE1: - .uaword 0x0 ! CIE Identifier Tag - .byte 0x1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor - .byte 0x78 ! sleb128 -8; CIE Data Alignment Factor - .byte 0xf ! CIE RA Column - .byte 0x1 ! uleb128 0x1; Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc ! DW_CFA_def_cfa - .byte 0xe ! uleb128 0xe - .byte 0xff,0xf ! uleb128 0x7ff - .align 8 -.LLECIE1: -.LLSFDE1: - .uaword .LLEFDE1-.LLASFDE1 ! FDE Length -.LLASFDE1: - .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset -#ifdef HAVE_AS_SPARC_UA_PCREL - .uaword %r_disp32(.LLFB1) - .uaword .LLFE1-.LLFB1 ! FDE address range -#else - .align 8 - .xword .LLFB1 - .uaxword .LLFE1-.LLFB1 ! FDE address range -#endif - .byte 0x0 ! uleb128 0x0; Augmentation size - .byte 0x4 ! DW_CFA_advance_loc4 - .uaword .LLCFI0-.LLFB1 - .byte 0xd ! DW_CFA_def_cfa_register - .byte 0x1e ! uleb128 0x1e - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9 ! DW_CFA_register - .byte 0xf ! uleb128 0xf - .byte 0x1f ! uleb128 0x1f - .align 8 -.LLEFDE1: -.LLSFDE2: - .uaword .LLEFDE2-.LLASFDE2 ! FDE Length -.LLASFDE2: - .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset -#ifdef HAVE_AS_SPARC_UA_PCREL - .uaword %r_disp32(.LLFB2) - .uaword .LLFE2-.LLFB2 ! FDE address range -#else - .align 8 - .xword .LLFB2 - .uaxword .LLFE2-.LLFB2 ! FDE address range -#endif - .byte 0x0 ! uleb128 0x0; Augmentation size - .byte 0x4 ! DW_CFA_advance_loc4 - .uaword .LLCFI1-.LLFB2 - .byte 0xd ! DW_CFA_def_cfa_register - .byte 0x1e ! uleb128 0x1e - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9 ! DW_CFA_register - .byte 0xf ! uleb128 0xf - .byte 0x1f ! uleb128 0x1f - .align 8 -.LLEFDE2: -#endif - -#ifdef __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/tile/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/tile/ffi.c deleted file mode 100644 index 3a94469c7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/tile/ffi.c +++ /dev/null @@ -1,355 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Tilera Corp. - - TILE Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include - - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -/* Performs a raw function call with the given NUM_ARG_REGS register arguments - and the specified additional stack arguments (if any). */ -extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], - const ffi_sarg *stack_args, - size_t stack_args_bytes, - void (*fnaddr)(void)) - FFI_HIDDEN; - -/* This handles the raw call from the closure stub, cleaning up the - parameters and delegating to ffi_closure_tile_inner. */ -extern void ffi_closure_tile(void) FFI_HIDDEN; - - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* We always allocate room for all registers. Even if we don't - use them as parameters, they get returned in the same array - as struct return values so we need to make room. */ - if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; - - if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->flags = FFI_TYPE_STRUCT; - else - cif->flags = FFI_TYPE_INT; - - /* Nothing to do. */ - return FFI_OK; -} - - -static long -assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, - int write_to_reg) -{ - switch (type->type) - { - case FFI_TYPE_SINT8: - *out = *(SINT8 *)in; - return 1; - - case FFI_TYPE_UINT8: - *out = *(UINT8 *)in; - return 1; - - case FFI_TYPE_SINT16: - *out = *(SINT16 *)in; - return 1; - - case FFI_TYPE_UINT16: - *out = *(UINT16 *)in; - return 1; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LP64__ - case FFI_TYPE_POINTER: -#endif - /* Note that even unsigned 32-bit quantities are sign extended - on tilegx when stored in a register. */ - *out = *(SINT32 *)in; - return 1; - - case FFI_TYPE_FLOAT: -#ifdef __tilegx__ - if (write_to_reg) - { - /* Properly sign extend the value. */ - union { float f; SINT32 s32; } val; - val.f = *(float *)in; - *out = val.s32; - } - else -#endif - { - *(float *)out = *(float *)in; - } - return 1; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: -#ifdef __LP64__ - case FFI_TYPE_POINTER: -#endif - *(UINT64 *)out = *(UINT64 *)in; - return sizeof(UINT64) / FFI_SIZEOF_ARG; - - case FFI_TYPE_STRUCT: - memcpy(out, in, type->size); - return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - case FFI_TYPE_VOID: - /* Must be a return type. Nothing to do. */ - return 0; - - default: - FFI_ASSERT(0); - return -1; - } -} - - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_sarg * const arg_mem = alloca(cif->bytes); - ffi_sarg * const reg_args = arg_mem; - ffi_sarg * const stack_args = ®_args[NUM_ARG_REGS]; - ffi_sarg *argp = arg_mem; - ffi_type ** const arg_types = cif->arg_types; - const long num_args = cif->nargs; - long i; - - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Pass a hidden pointer to the return value. We make sure there - is scratch space for the callee to store the return value even if - our caller doesn't care about it. */ - *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); - - /* No more work needed to return anything. */ - rvalue = NULL; - } - - for (i = 0; i < num_args; i++) - { - ffi_type *type = arg_types[i]; - void * const arg_in = avalue[i]; - ptrdiff_t arg_word = argp - arg_mem; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (type->type == FFI_TYPE_STRUCT) - { - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - if (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS) - { - /* Args are not allowed to span registers and the stack. */ - argp = stack_args; - } - - memcpy(argp, arg_in, type->size); - argp += arg_size_in_words; - } - else - { - argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); - } - } - - /* Actually do the call. */ - ffi_call_tile(reg_args, stack_args, - cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); - - if (rvalue != NULL) - assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); -} - - -/* Template code for closure. */ -extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; - - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ -#ifdef __tilegx__ - /* TILE-Gx */ - SINT64 c; - SINT64 h; - int s; - UINT64 *out; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - - c = (intptr_t)closure; - h = (intptr_t)ffi_closure_tile; - s = 0; - - /* Find the smallest shift count that doesn't lose information - (i.e. no need to explicitly insert high bits of the address that - are just the sign extension of the low bits). */ - while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) - s += 16; - -#define OPS(a, b, shift) \ - (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) - - /* Emit the moveli. */ - *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); - for (s -= 16; s >= 0; s -= 16) - *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); - -#undef OPS - - *out++ = ffi_template_tramp_tile[2]; - -#else - /* TILEPro */ - UINT64 *out; - intptr_t delta; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; - - *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - invalidate_icache(closure->tramp, (char *)out - closure->tramp, - getpagesize()); - - return FFI_OK; -} - - -/* This is called by the assembly wrapper for closures. This does - all of the work. On entry reg_args[0] holds the values the registers - had when the closure was invoked. On return reg_args[1] holds the register - values to be returned to the caller (many of which may be garbage). */ -void FFI_HIDDEN -ffi_closure_tile_inner(ffi_closure *closure, - ffi_sarg reg_args[2][NUM_ARG_REGS], - ffi_sarg *stack_args) -{ - ffi_cif * const cif = closure->cif; - void ** const avalue = alloca(cif->nargs * sizeof(void *)); - void *rvalue; - ffi_type ** const arg_types = cif->arg_types; - ffi_sarg * const reg_args_in = reg_args[0]; - ffi_sarg * const reg_args_out = reg_args[1]; - ffi_sarg * argp; - long i, arg_word, nargs = cif->nargs; - /* Use a union to guarantee proper alignment for double. */ - union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; - - /* Start out reading register arguments. */ - argp = reg_args_in; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Return by reference via hidden pointer. */ - rvalue = (void *)(intptr_t)*argp++; - arg_word = 1; - } - else - { - /* Return the value in registers. */ - rvalue = &closure_ret; - arg_word = 0; - } - - /* Grab the addresses of the arguments. */ - for (i = 0; i < nargs; i++) - { - ffi_type * const type = arg_types[i]; - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (arg_word == NUM_ARG_REGS || - (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS)) - { - /* Switch to reading arguments from the stack. */ - argp = stack_args; - arg_word = NUM_ARG_REGS; - } - - avalue[i] = argp; - argp += arg_size_in_words; - arg_word += arg_size_in_words; - } - - /* Invoke the closure. */ - closure->fun(cif, rvalue, avalue, closure->user_data); - - if (cif->flags != FFI_TYPE_STRUCT) - { - /* Canonicalize for register representation. */ - assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); - } -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/tile/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/tile/ffitarget.h deleted file mode 100644 index 679fb5d90..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/tile/ffitarget.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Tilera Corp. - Target configuration macros for TILE. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM - -#include - -typedef uint_reg_t ffi_arg; -typedef int_reg_t ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_UNIX, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ -#define FFI_CLOSURES 1 - -#ifdef __tilegx__ -/* We always pass 8-byte values, even in -m32 mode. */ -# define FFI_SIZEOF_ARG 8 -# ifdef __LP64__ -# define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ -# else -# define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ -# endif -#else -# define FFI_SIZEOF_ARG 4 -# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ -#endif -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/tile/tile.S b/third_party/python/Modules/_ctypes/libffi/src/tile/tile.S deleted file mode 100644 index d1f82cb3d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/tile/tile.S +++ /dev/null @@ -1,360 +0,0 @@ -/* ----------------------------------------------------------------------- - tile.S - Copyright (c) 2011 Tilera Corp. - - Tilera TILEPro and TILE-Gx Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Number of bytes in a register. */ -#define REG_SIZE FFI_SIZEOF_ARG - -/* Number of bytes in stack linkage area for backtracing. - - A note about the ABI: on entry to a procedure, sp points to a stack - slot where it must spill the return address if it's not a leaf. - REG_SIZE bytes beyond that is a slot owned by the caller which - contains the sp value that the caller had when it was originally - entered (i.e. the caller's frame pointer). */ -#define LINKAGE_SIZE (2 * REG_SIZE) - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -#ifdef __tilegx__ -#define SW st -#define LW ld -#define BGZT bgtzt -#else -#define SW sw -#define LW lw -#define BGZT bgzt -#endif - - -/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], - const int_reg_t *stack_args, - unsigned long stack_args_bytes, - void (*fnaddr)(void)); - - On entry, REG_ARGS contain the outgoing register values, - and STACK_ARGS contains STACK_ARG_BYTES of additional values - to be passed on the stack. If STACK_ARG_BYTES is zero, then - STACK_ARGS is ignored. - - When the invoked function returns, the values of r0-r9 are - blindly stored back into REG_ARGS for the caller to examine. */ - - .section .text.ffi_call_tile, "ax", @progbits - .align 8 - .globl ffi_call_tile - FFI_HIDDEN(ffi_call_tile) -ffi_call_tile: - -/* Incoming arguments. */ -#define REG_ARGS r0 -#define INCOMING_STACK_ARGS r1 -#define STACK_ARG_BYTES r2 -#define ORIG_FNADDR r3 - -/* Temporary values. */ -#define FRAME_SIZE r10 -#define TMP r11 -#define TMP2 r12 -#define OUTGOING_STACK_ARGS r13 -#define REG_ADDR_PTR r14 -#define RETURN_REG_ADDR r15 -#define FNADDR r16 - - .cfi_startproc - { - /* Save return address. */ - SW sp, lr - .cfi_offset lr, 0 - /* Prepare to spill incoming r52. */ - addi TMP, sp, -REG_SIZE - /* Increase frame size to have room to spill r52 and REG_ARGS. - The +7 is to round up mod 8. */ - addi FRAME_SIZE, STACK_ARG_BYTES, \ - REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 - } - { - /* Round stack frame size to a multiple of 8 to satisfy ABI. */ - andi FRAME_SIZE, FRAME_SIZE, -8 - /* Compute where to spill REG_ARGS value. */ - addi TMP2, sp, -(REG_SIZE * 2) - } - { - /* Spill incoming r52. */ - SW TMP, r52 - .cfi_offset r52, -REG_SIZE - /* Set up our frame pointer. */ - move r52, sp - .cfi_def_cfa_register r52 - /* Push stack frame. */ - sub sp, sp, FRAME_SIZE - } - { - /* Prepare to set up stack linkage. */ - addi TMP, sp, REG_SIZE - /* Prepare to memcpy stack args. */ - addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE - /* Save REG_ARGS which we will need after we call the subroutine. */ - SW TMP2, REG_ARGS - } - { - /* Set up linkage info to hold incoming stack pointer. */ - SW TMP, r52 - } - { - /* Skip stack args memcpy if we don't have any stack args (common). */ - blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy - } - -.Lmemcpy_stack_args: - { - /* Load incoming argument from stack_args. */ - LW TMP, INCOMING_STACK_ARGS - addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE - } - { - /* Store stack argument into outgoing stack argument area. */ - SW OUTGOING_STACK_ARGS, TMP - addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE - addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE - } - { - BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args - } -.Ldone_stack_args_memcpy: - - { - /* Copy aside ORIG_FNADDR so we can overwrite its register. */ - move FNADDR, ORIG_FNADDR - /* Prepare to load argument registers. */ - addi REG_ADDR_PTR, r0, REG_SIZE - /* Load outgoing r0. */ - LW r0, r0 - } - - /* Load up argument registers from the REG_ARGS array. */ -#define LOAD_REG(REG, PTR) \ - { \ - LW REG, PTR ; \ - addi PTR, PTR, REG_SIZE \ - } - - LOAD_REG(r1, REG_ADDR_PTR) - LOAD_REG(r2, REG_ADDR_PTR) - LOAD_REG(r3, REG_ADDR_PTR) - LOAD_REG(r4, REG_ADDR_PTR) - LOAD_REG(r5, REG_ADDR_PTR) - LOAD_REG(r6, REG_ADDR_PTR) - LOAD_REG(r7, REG_ADDR_PTR) - LOAD_REG(r8, REG_ADDR_PTR) - LOAD_REG(r9, REG_ADDR_PTR) - - { - /* Call the subroutine. */ - jalr FNADDR - } - - { - /* Restore original lr. */ - LW lr, r52 - /* Prepare to recover ARGS, which we spilled earlier. */ - addi TMP, r52, -(2 * REG_SIZE) - } - { - /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ - LW RETURN_REG_ADDR, TMP - /* Prepare to restore original r52. */ - addi TMP, r52, -REG_SIZE - } - - { - /* Pop stack frame. */ - move sp, r52 - /* Restore original r52. */ - LW r52, TMP - } - -#define STORE_REG(REG, PTR) \ - { \ - SW PTR, REG ; \ - addi PTR, PTR, REG_SIZE \ - } - - /* Return all register values by reference. */ - STORE_REG(r0, RETURN_REG_ADDR) - STORE_REG(r1, RETURN_REG_ADDR) - STORE_REG(r2, RETURN_REG_ADDR) - STORE_REG(r3, RETURN_REG_ADDR) - STORE_REG(r4, RETURN_REG_ADDR) - STORE_REG(r5, RETURN_REG_ADDR) - STORE_REG(r6, RETURN_REG_ADDR) - STORE_REG(r7, RETURN_REG_ADDR) - STORE_REG(r8, RETURN_REG_ADDR) - STORE_REG(r9, RETURN_REG_ADDR) - - { - jrp lr - } - - .cfi_endproc - .size ffi_call_tile, .-ffi_call_tile - -/* ffi_closure_tile(...) - - On entry, lr points to the closure plus 8 bytes, and r10 - contains the actual return address. - - This function simply dumps all register parameters into a stack array - and passes the closure, the registers array, and the stack arguments - to C code that does all of the actual closure processing. */ - - .section .text.ffi_closure_tile, "ax", @progbits - .align 8 - .globl ffi_closure_tile - FFI_HIDDEN(ffi_closure_tile) - - .cfi_startproc -/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ -#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) -ffi_closure_tile: - { -#ifdef __tilegx__ - st sp, lr - .cfi_offset lr, 0 -#else - /* Save return address (in r10 due to closure stub wrapper). */ - SW sp, r10 - .cfi_return_column r10 - .cfi_offset r10, 0 -#endif - /* Compute address for stack frame linkage. */ - addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - } - { - /* Save incoming stack pointer in linkage area. */ - SW r10, sp - .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - /* Push a new stack frame. */ - addli sp, sp, -CLOSURE_FRAME_SIZE - .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE - } - - { - /* Create pointer to where to start spilling registers. */ - addi r10, sp, LINKAGE_SIZE - } - - /* Spill all the incoming registers. */ - STORE_REG(r0, r10) - STORE_REG(r1, r10) - STORE_REG(r2, r10) - STORE_REG(r3, r10) - STORE_REG(r4, r10) - STORE_REG(r5, r10) - STORE_REG(r6, r10) - STORE_REG(r7, r10) - STORE_REG(r8, r10) - { - /* Save r9. */ - SW r10, r9 -#ifdef __tilegx__ - /* Pointer to closure is passed in r11. */ - move r0, r11 -#else - /* Compute pointer to the closure object. Because the closure - starts with a "jal ffi_closure_tile", we can just take the - value of lr (a phony return address pointing into the closure) - and subtract 8. */ - addi r0, lr, -8 -#endif - /* Compute a pointer to the register arguments we just spilled. */ - addi r1, sp, LINKAGE_SIZE - } - { - /* Compute a pointer to the extra stack arguments (if any). */ - addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE - /* Call C code to deal with all of the grotty details. */ - jal ffi_closure_tile_inner - } - { - addli r10, sp, CLOSURE_FRAME_SIZE - } - { - /* Restore the return address. */ - LW lr, r10 - /* Compute pointer to registers array. */ - addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) - } - /* Return all the register values, which C code may have set. */ - LOAD_REG(r0, r10) - LOAD_REG(r1, r10) - LOAD_REG(r2, r10) - LOAD_REG(r3, r10) - LOAD_REG(r4, r10) - LOAD_REG(r5, r10) - LOAD_REG(r6, r10) - LOAD_REG(r7, r10) - LOAD_REG(r8, r10) - LOAD_REG(r9, r10) - { - /* Pop the frame. */ - addli sp, sp, CLOSURE_FRAME_SIZE - jrp lr - } - - .cfi_endproc - .size ffi_closure_tile, . - ffi_closure_tile - - -/* What follows are code template instructions that get copied to the - closure trampoline by ffi_prep_closure_loc. The zeroed operands - get replaced by their proper values at runtime. */ - - .section .text.ffi_template_tramp_tile, "ax", @progbits - .align 8 - .globl ffi_template_tramp_tile - FFI_HIDDEN(ffi_template_tramp_tile) -ffi_template_tramp_tile: -#ifdef __tilegx__ - { - moveli r11, 0 /* backpatched to address of containing closure. */ - moveli r10, 0 /* backpatched to ffi_closure_tile. */ - } - /* Note: the following bundle gets generated multiple times - depending on the pointer value (esp. useful for -m32 mode). */ - { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } - { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } -#else - /* 'jal .' yields a PC-relative offset of zero so we can OR in the - right offset at runtime. */ - { move r10, lr ; jal . /* ffi_closure_tile */ } -#endif - - .size ffi_template_tramp_tile, . - ffi_template_tramp_tile diff --git a/third_party/python/Modules/_ctypes/libffi/src/types.c b/third_party/python/Modules/_ctypes/libffi/src/types.c deleted file mode 100644 index 0de599423..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/types.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ----------------------------------------------------------------------- - types.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Predefined ffi_types needed by libffi. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* Hide the basic type definitions from the header file, so that we - can redefine them here as "const". */ -#define LIBFFI_HIDE_BASIC_TYPES - -#include -#include - -/* Type definitions */ - -#define FFI_TYPEDEF(name, type, id) \ -struct struct_align_##name { \ - char c; \ - type x; \ -}; \ -const ffi_type ffi_type_##name = { \ - sizeof(type), \ - offsetof(struct struct_align_##name, x), \ - id, NULL \ -} - -#define FFI_NONCONST_TYPEDEF(name, type, id) \ -struct struct_align_##name { \ - char c; \ - type x; \ -}; \ -ffi_type ffi_type_##name = { \ - sizeof(type), \ - offsetof(struct struct_align_##name, x), \ - id, NULL \ -} - -/* Size and alignment are fake here. They must not be 0. */ -const ffi_type ffi_type_void = { - 1, 1, FFI_TYPE_VOID, NULL -}; - -FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8); -FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8); -FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16); -FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16); -FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32); -FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32); -FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64); -FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64); - -FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER); - -FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT); -FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE); - -#ifdef __alpha__ -/* Even if we're not configured to default to 128-bit long double, - maintain binary compatibility, as -mlong-double-128 can be used - at any time. */ -/* Validate the hard-coded number below. */ -# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; -#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if HAVE_LONG_DOUBLE_VARIANT -FFI_NONCONST_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); -# else -FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); -# endif -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/vax/elfbsd.S b/third_party/python/Modules/_ctypes/libffi/src/vax/elfbsd.S deleted file mode 100644 index 01ca31340..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/vax/elfbsd.S +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * vax Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * void * %r0 - * ffi_call_elfbsd(extended_cif *ecif, 4(%ap) - * unsigned bytes, 8(%ap) - * unsigned flags, 12(%ap) - * void *rvalue, 16(%ap) - * void (*fn)()); 20(%ap) - */ - .globl ffi_call_elfbsd - .type ffi_call_elfbsd,@function - .align 2 -ffi_call_elfbsd: - .word 0x00c # save R2 and R3 - - # Allocate stack space for the args - subl2 8(%ap), %sp - - # Call ffi_prep_args - pushl %sp - pushl 4(%ap) - calls $2, ffi_prep_args - - # Get function pointer - movl 20(%ap), %r1 - - # Build a CALLS frame - ashl $-2, 8(%ap), %r0 - pushl %r0 # argument stack usage - movl %sp, %r0 # future %ap - # saved registers - bbc $11, 0(%r1), 1f - pushl %r11 -1: bbc $10, 0(%r1), 1f - pushl %r10 -1: bbc $9, 0(%r1), 1f - pushl %r9 -1: bbc $8, 0(%r1), 1f - pushl %r8 -1: bbc $7, 0(%r1), 1f - pushl %r7 -1: bbc $6, 0(%r1), 1f - pushl %r6 -1: bbc $5, 0(%r1), 1f - pushl %r5 -1: bbc $4, 0(%r1), 1f - pushl %r4 -1: bbc $3, 0(%r1), 1f - pushl %r3 -1: bbc $2, 0(%r1), 1f - pushl %r2 -1: - pushal 9f - pushl %fp - pushl %ap - movl 16(%ap), %r3 # struct return address, if needed - movl %r0, %ap - movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask - bisl2 $0x20000000, %r0 # calls frame - movzwl 0(%r1), %r2 - bicw2 $0xf003, %r2 # only keep R11-R2 - ashl $16, %r2, %r2 - bisl2 %r2, %r0 # saved register mask of the called function - pushl %r0 - pushl $0 - movl %sp, %fp - - # Invoke the function - pushal 2(%r1) # skip procedure entry mask - movl %r3, %r1 - bicpsw $0x000f - rsb - -9: - # Copy return value if necessary - tstl 16(%ap) - jeql 9f - movl 16(%ap), %r2 - - bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR - movb %r0, 0(%r2) - brb 9f -1: - bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT - movw %r0, 0(%r2) - brb 9f -1: - bbc $2, 12(%ap), 1f # CIF_FLAGS_INT - movl %r0, 0(%r2) - brb 9f -1: - bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT - movq %r0, 0(%r2) - brb 9f -1: - movl %r1, %r0 # might have been a struct - #brb 9f - -9: - ret - -/* - * ffi_closure_elfbsd(void); - * invoked with %r0: ffi_closure *closure - */ - .globl ffi_closure_elfbsd - .type ffi_closure_elfbsd, @function - .align 2 -ffi_closure_elfbsd: - .word 0 - - # Allocate room on stack for return value - subl2 $8, %sp - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushal 4(%sp) # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - # Copy return value if necessary - bitb $1, %r0 # CIF_FLAGS_CHAR - beql 1f - movb 0(%sp), %r0 - brb 9f -1: - bitb $2, %r0 # CIF_FLAGS_SHORT - beql 1f - movw 0(%sp), %r0 - brb 9f -1: - bitb $4, %r0 # CIF_FLAGS_INT - beql 1f - movl 0(%sp), %r0 - brb 9f -1: - bitb $8, %r0 # CIF_FLAGS_DINT - beql 1f - movq 0(%sp), %r0 - #brb 9f -1: - -9: - ret - -/* - * ffi_closure_struct_elfbsd(void); - * invoked with %r0: ffi_closure *closure - * %r1: struct return address - */ - .globl ffi_closure_struct_elfbsd - .type ffi_closure_struct_elfbsd, @function - .align 2 -ffi_closure_struct_elfbsd: - .word 0 - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushl %r1 # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - ret diff --git a/third_party/python/Modules/_ctypes/libffi/src/vax/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/vax/ffi.c deleted file mode 100644 index f4d6bbb4f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/vax/ffi.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * vax Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - */ - -#include -#include - -#include -#include - -#define CIF_FLAGS_CHAR 1 /* for struct only */ -#define CIF_FLAGS_SHORT 2 /* for struct only */ -#define CIF_FLAGS_INT 4 -#define CIF_FLAGS_DINT 8 - -/* - * Foreign Function Interface API - */ - -void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *, - void (*) ()); -void *ffi_prep_args (extended_cif *ecif, void *stack); - -void * -ffi_prep_args (extended_cif *ecif, void *stack) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - void *struct_value_ptr; - - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && !ecif->cif->flags) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof (int)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else - { - memcpy (argp, *p_argv, z); - - /* Align if necessary. */ - if ((sizeof(int) - 1) & z) - z = ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } - - return struct_value_ptr; -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - if (cif->rtype->size == sizeof (char)) - cif->flags = CIF_FLAGS_CHAR; - else if (cif->rtype->size == sizeof (short)) - cif->flags = CIF_FLAGS_SHORT; - else if (cif->rtype->size == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else if (cif->rtype->size == 2 * sizeof (int)) - cif->flags = CIF_FLAGS_DINT; - else - cif->flags = 0; - break; - - default: - if (cif->rtype->size <= sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = CIF_FLAGS_DINT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && cif->flags == 0) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_ELFBSD: - ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -void ffi_closure_elfbsd (void); -void ffi_closure_struct_elfbsd (void); -unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *); - -static void -ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp) -{ - unsigned int i; - void **p_argv; - ffi_type **p_arg; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - *p_argv = stackp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = ALIGN(z, sizeof (int)); - - p_argv++; - stackp += z; - } -} - -unsigned int -ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_elfbsd (cif, arg_area, stack); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif *, void *, void **, void *), - void *user_data, void *codeloc) -{ - char *tramp = (char *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_ELFBSD); - - /* entry mask */ - *(unsigned short *)(tramp + 0) = 0x0000; - /* movl #closure, r0 */ - tramp[2] = 0xd0; - tramp[3] = 0x8f; - *(unsigned int *)(tramp + 4) = (unsigned int) closure; - tramp[8] = 0x50; - - if (cif->rtype->type == FFI_TYPE_STRUCT - && !cif->flags) - fn = &ffi_closure_struct_elfbsd; - else - fn = &ffi_closure_elfbsd; - - /* jmpl #fn */ - tramp[9] = 0x17; - tramp[10] = 0xef; - *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 - - (unsigned int)tramp - 9 - 6; - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/vax/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/vax/ffitarget.h deleted file mode 100644 index 2fc94881a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/vax/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * vax Foreign Function Interface - */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_ELFBSD, - FFI_DEFAULT_ABI = FFI_ELFBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 15 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/darwin.S b/third_party/python/Modules/_ctypes/libffi/src/x86/darwin.S deleted file mode 100644 index 8f0f0707a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/darwin.S +++ /dev/null @@ -1,444 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. - Copyright (C) 2008 Free Software Foundation, Inc. - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- - */ - -#ifndef __x86_64__ - -#define LIBFFI_ASM -#include -#include - -.text - -.globl _ffi_prep_args - - .align 4 -.globl _ffi_call_SYSV - -_ffi_call_SYSV: -.LFB1: - pushl %ebp -.LCFI0: - movl %esp,%ebp -.LCFI1: - subl $8,%esp - /* Make room for all of the new args. */ - movl 16(%ebp),%ecx - subl %ecx,%esp - - movl %esp,%eax - - /* Place all of the ffi_prep_args in position */ - subl $8,%esp - pushl 12(%ebp) - pushl %eax - call *8(%ebp) - - /* Return stack to previous state and call the function */ - addl $16,%esp - - call *28(%ebp) - - /* Load %ecx with the return type code */ - movl 20(%ebp),%ecx - - /* Protect %esi. We're going to pop it in the epilogue. */ - pushl %esi - - /* If the return value pointer is NULL, assume no return value. */ - cmpl $0,24(%ebp) - jne 0f - - /* Even if there is no space for the return value, we are - obliged to handle floating-point values. */ - cmpl $FFI_TYPE_FLOAT,%ecx - jne noretval - fstp %st(0) - - jmp epilogue -0: - .align 4 - call 1f -.Lstore_table: - .long noretval-.Lstore_table /* FFI_TYPE_VOID */ - .long retint-.Lstore_table /* FFI_TYPE_INT */ - .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ - .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ - .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ - .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ - .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ - .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ - .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ - .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ - .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ - .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ - .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ - .long retint-.Lstore_table /* FFI_TYPE_POINTER */ - .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ -1: - pop %esi - add (%esi, %ecx, 4), %esi - jmp *%esi - - /* Sign/zero extend as appropriate. */ -retsint8: - movsbl %al, %eax - jmp retint - -retsint16: - movswl %ax, %eax - jmp retint - -retuint8: - movzbl %al, %eax - jmp retint - -retuint16: - movzwl %ax, %eax - jmp retint - -retfloat: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstps (%ecx) - jmp epilogue - -retdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpl (%ecx) - jmp epilogue - -retlongdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpt (%ecx) - jmp epilogue - -retint64: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - movl %edx,4(%ecx) - jmp epilogue - -retstruct1b: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movb %al,0(%ecx) - jmp epilogue - -retstruct2b: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movw %ax,0(%ecx) - jmp epilogue - -retint: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - -retstruct: - /* Nothing to do! */ - -noretval: -epilogue: - popl %esi - movl %ebp,%esp - popl %ebp - ret - -.LFE1: -.ffi_call_SYSV_end: - - .align 4 -FFI_HIDDEN (ffi_closure_SYSV) -.globl _ffi_closure_SYSV - -_ffi_closure_SYSV: -.LFB2: - pushl %ebp -.LCFI2: - movl %esp, %ebp -.LCFI3: - subl $40, %esp - leal -24(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 8(%ebp), %edx - movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ - movl %ebx, 8(%esp) -.LCFI7: - call L_ffi_closure_SYSV_inner$stub - movl 8(%esp), %ebx - movl -12(%ebp), %ecx - cmpl $FFI_TYPE_INT, %eax - je .Lcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lcls_retint - -0: cmpl $FFI_TYPE_FLOAT, %eax - je .Lcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lcls_retllong - cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax - je .Lcls_retstruct1b - cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax - je .Lcls_retstruct2b - cmpl $FFI_TYPE_STRUCT, %eax - je .Lcls_retstruct -.Lcls_epilogue: - movl %ebp, %esp - popl %ebp - ret -.Lcls_retint: - movl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retfloat: - flds (%ecx) - jmp .Lcls_epilogue -.Lcls_retdouble: - fldl (%ecx) - jmp .Lcls_epilogue -.Lcls_retldouble: - fldt (%ecx) - jmp .Lcls_epilogue -.Lcls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp .Lcls_epilogue -.Lcls_retstruct1b: - movsbl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retstruct2b: - movswl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retstruct: - lea -8(%ebp),%esp - movl %ebp, %esp - popl %ebp - ret $4 -.LFE2: - -#if !FFI_NO_RAW_API - -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#define CIF_FLAGS_OFFSET 20 - - .align 4 -FFI_HIDDEN (ffi_closure_raw_SYSV) -.globl _ffi_closure_raw_SYSV - -_ffi_closure_raw_SYSV: -.LFB3: - pushl %ebp -.LCFI4: - movl %esp, %ebp -.LCFI5: - pushl %esi -.LCFI6: - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ - movl %edx, 8(%esp) /* raw_args */ - leal -24(%ebp), %edx - movl %edx, 4(%esp) /* &res */ - movl %esi, (%esp) /* cif */ - call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ - movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ - cmpl $FFI_TYPE_INT, %eax - je .Lrcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lrcls_retint -0: - cmpl $FFI_TYPE_FLOAT, %eax - je .Lrcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lrcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lrcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lrcls_retllong -.Lrcls_epilogue: - addl $36, %esp - popl %esi - popl %ebp - ret -.Lrcls_retint: - movl -24(%ebp), %eax - jmp .Lrcls_epilogue -.Lrcls_retfloat: - flds -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retdouble: - fldl -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retldouble: - fldt -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retllong: - movl -24(%ebp), %eax - movl -20(%ebp), %edx - jmp .Lrcls_epilogue -.LFE3: -#endif - -.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 -L_ffi_closure_SYSV_inner$stub: - .indirect_symbol _ffi_closure_SYSV_inner - hlt ; hlt ; hlt ; hlt ; hlt - - -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 -LSCIE1: - .long 0x0 - .byte 0x1 - .ascii "zR\0" - .byte 0x1 - .byte 0x7c - .byte 0x8 - .byte 0x1 - .byte 0x10 - .byte 0xc - .byte 0x5 - .byte 0x4 - .byte 0x88 - .byte 0x1 - .align 2 -LECIE1: -.globl _ffi_call_SYSV.eh -_ffi_call_SYSV.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 -LASFDE1: - .long LASFDE1-EH_frame1 - .long .LFB1-. - .set L$set$2,.LFE1-.LFB1 - .long L$set$2 - .byte 0x0 - .byte 0x4 - .set L$set$3,.LCFI0-.LFB1 - .long L$set$3 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$4,.LCFI1-.LCFI0 - .long L$set$4 - .byte 0xd - .byte 0x4 - .align 2 -LEFDE1: -.globl _ffi_closure_SYSV.eh -_ffi_closure_SYSV.eh: -LSFDE2: - .set L$set$5,LEFDE2-LASFDE2 - .long L$set$5 -LASFDE2: - .long LASFDE2-EH_frame1 - .long .LFB2-. - .set L$set$6,.LFE2-.LFB2 - .long L$set$6 - .byte 0x0 - .byte 0x4 - .set L$set$7,.LCFI2-.LFB2 - .long L$set$7 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$8,.LCFI3-.LCFI2 - .long L$set$8 - .byte 0xd - .byte 0x4 - .align 2 -LEFDE2: - -#if !FFI_NO_RAW_API - -.globl _ffi_closure_raw_SYSV.eh -_ffi_closure_raw_SYSV.eh: -LSFDE3: - .set L$set$10,LEFDE3-LASFDE3 - .long L$set$10 -LASFDE3: - .long LASFDE3-EH_frame1 - .long .LFB3-. - .set L$set$11,.LFE3-.LFB3 - .long L$set$11 - .byte 0x0 - .byte 0x4 - .set L$set$12,.LCFI4-.LFB3 - .long L$set$12 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$13,.LCFI5-.LCFI4 - .long L$set$13 - .byte 0xd - .byte 0x4 - .byte 0x4 - .set L$set$14,.LCFI6-.LCFI5 - .long L$set$14 - .byte 0x85 - .byte 0x3 - .align 2 -LEFDE3: - -#endif - -#endif /* ifndef __x86_64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/darwin64.S b/third_party/python/Modules/_ctypes/libffi/src/x86/darwin64.S deleted file mode 100644 index 0c72ed292..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/darwin64.S +++ /dev/null @@ -1,416 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. - Copyright (c) 2008 Red Hat, Inc. - derived from unix64.S - - x86-64 Foreign Function Interface for Darwin. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include - - .file "darwin64.S" -.text - -/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)); - - Bit o trickiness here -- ARGS+BYTES is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 3 - .globl _ffi_call_unix64 - -_ffi_call_unix64: -LUW0: - movq (%rsp), %r10 /* Load return address. */ - leaq (%rdi, %rsi), %rax /* Find local stack base. */ - movq %rdx, (%rax) /* Save flags. */ - movq %rcx, 8(%rax) /* Save raddr. */ - movq %rbp, 16(%rax) /* Save old frame pointer. */ - movq %r10, 24(%rax) /* Relocate return address. */ - movq %rax, %rbp /* Finalize local stack frame. */ -LUW1: - movq %rdi, %r10 /* Save a copy of the register area. */ - movq %r8, %r11 /* Save a copy of the target fn. */ - movl %r9d, %eax /* Set number of SSE registers. */ - - /* Load up all argument registers. */ - movq (%r10), %rdi - movq 8(%r10), %rsi - movq 16(%r10), %rdx - movq 24(%r10), %rcx - movq 32(%r10), %r8 - movq 40(%r10), %r9 - testl %eax, %eax - jnz Lload_sse -Lret_from_load_sse: - - /* Deallocate the reg arg area. */ - leaq 176(%r10), %rsp - - /* Call the user function. */ - call *%r11 - - /* Deallocate stack arg area; local stack frame in redzone. */ - leaq 24(%rbp), %rsp - - movq 0(%rbp), %rcx /* Reload flags. */ - movq 8(%rbp), %rdi /* Reload raddr. */ - movq 16(%rbp), %rbp /* Reload old frame pointer. */ -LUW2: - - /* The first byte of the flags contains the FFI_TYPE. */ - movzbl %cl, %r10d - leaq Lstore_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -Lstore_table: - .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ - .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ - .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ - .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ - .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ - .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ - .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ - .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ - .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ - .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ - .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ - .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ - .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ - .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ - - .text - .align 3 -Lst_void: - ret - .align 3 -Lst_uint8: - movzbq %al, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_sint8: - movsbq %al, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_uint16: - movzwq %ax, %rax - movq %rax, (%rdi) - .align 3 -Lst_sint16: - movswq %ax, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_uint32: - movl %eax, %eax - movq %rax, (%rdi) - .align 3 -Lst_sint32: - cltq - movq %rax, (%rdi) - ret - .align 3 -Lst_int64: - movq %rax, (%rdi) - ret - .align 3 -Lst_float: - movss %xmm0, (%rdi) - ret - .align 3 -Lst_double: - movsd %xmm0, (%rdi) - ret -Lst_ldouble: - fstpt (%rdi) - ret - .align 3 -Lst_struct: - leaq -20(%rsp), %rsi /* Scratch area in redzone. */ - - /* We have to locate the values now, and since we don't want to - write too much data into the user's return value, we spill the - value to a 16 byte scratch area first. Bits 8, 9, and 10 - control where the values are located. Only one of the three - bits will be set; see ffi_prep_cif_machdep for the pattern. */ - movd %xmm0, %r10 - movd %xmm1, %r11 - testl $0x100, %ecx - cmovnz %rax, %rdx - cmovnz %r10, %rax - testl $0x200, %ecx - cmovnz %r10, %rdx - testl $0x400, %ecx - cmovnz %r10, %rax - cmovnz %r11, %rdx - movq %rax, (%rsi) - movq %rdx, 8(%rsi) - - /* Bits 12-31 contain the true size of the structure. Copy from - the scratch area to the true destination. */ - shrl $12, %ecx - rep movsb - ret - - /* Many times we can avoid loading any SSE registers at all. - It's not worth an indirect jump to load the exact set of - SSE registers needed; zero or all is a good compromise. */ - .align 3 -LUW3: -Lload_sse: - movdqa 48(%r10), %xmm0 - movdqa 64(%r10), %xmm1 - movdqa 80(%r10), %xmm2 - movdqa 96(%r10), %xmm3 - movdqa 112(%r10), %xmm4 - movdqa 128(%r10), %xmm5 - movdqa 144(%r10), %xmm6 - movdqa 160(%r10), %xmm7 - jmp Lret_from_load_sse - -LUW4: - .align 3 - .globl _ffi_closure_unix64 - -_ffi_closure_unix64: -LUW5: - /* The carry flag is set by the trampoline iff SSE registers - are used. Don't clobber it before the branch instruction. */ - leaq -200(%rsp), %rsp -LUW6: - movq %rdi, (%rsp) - movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - jc Lsave_sse -Lret_from_save_sse: - - movq %r10, %rdi - leaq 176(%rsp), %rsi - movq %rsp, %rdx - leaq 208(%rsp), %rcx - call _ffi_closure_unix64_inner - - /* Deallocate stack frame early; return value is now in redzone. */ - addq $200, %rsp -LUW7: - - /* The first byte of the return value contains the FFI_TYPE. */ - movzbl %al, %r10d - leaq Lload_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -Lload_table: - .long Lld_void-Lload_table /* FFI_TYPE_VOID */ - .long Lld_int32-Lload_table /* FFI_TYPE_INT */ - .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ - .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ - .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ - .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ - .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ - .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ - .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ - .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ - .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ - .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ - .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ - .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ - .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ - - .text - .align 3 -Lld_void: - ret - .align 3 -Lld_int8: - movzbl -24(%rsp), %eax - ret - .align 3 -Lld_int16: - movzwl -24(%rsp), %eax - ret - .align 3 -Lld_int32: - movl -24(%rsp), %eax - ret - .align 3 -Lld_int64: - movq -24(%rsp), %rax - ret - .align 3 -Lld_float: - movss -24(%rsp), %xmm0 - ret - .align 3 -Lld_double: - movsd -24(%rsp), %xmm0 - ret - .align 3 -Lld_ldouble: - fldt -24(%rsp) - ret - .align 3 -Lld_struct: - /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, - %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading - both rdx and xmm1 with the second word. For the remaining, - bit 8 set means xmm0 gets the second word, and bit 9 means - that rax gets the second word. */ - movq -24(%rsp), %rcx - movq -16(%rsp), %rdx - movq -16(%rsp), %xmm1 - testl $0x100, %eax - cmovnz %rdx, %rcx - movd %rcx, %xmm0 - testl $0x200, %eax - movq -24(%rsp), %rax - cmovnz %rdx, %rax - ret - - /* See the comment above Lload_sse; the same logic applies here. */ - .align 3 -LUW8: -Lsave_sse: - movdqa %xmm0, 48(%rsp) - movdqa %xmm1, 64(%rsp) - movdqa %xmm2, 80(%rsp) - movdqa %xmm3, 96(%rsp) - movdqa %xmm4, 112(%rsp) - movdqa %xmm5, 128(%rsp) - movdqa %xmm6, 144(%rsp) - movdqa %xmm7, 160(%rsp) - jmp Lret_from_save_sse - -LUW9: -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ - .long L$set$0 -LSCIE1: - .long 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ - .byte 0x10 /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel sdata4) */ - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x7 /* uleb128 0x7 */ - .byte 0x8 /* uleb128 0x8 */ - .byte 0x90 /* DW_CFA_offset, column 0x10 */ - .byte 0x1 - .align 3 -LECIE1: - .globl _ffi_call_unix64.eh -_ffi_call_unix64.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ - .long L$set$1 -LASFDE1: - .long LASFDE1-EH_frame1 /* FDE CIE offset */ - .quad LUW0-. /* FDE initial location */ - .set L$set$2,LUW4-LUW0 /* FDE address range */ - .quad L$set$2 - .byte 0x0 /* Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$3,LUW1-LUW0 - .long L$set$3 - - /* New stack frame based off rbp. This is an itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-8, so from the - perspective of the unwind info, it hasn't moved. */ - .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ - .byte 0x6 - .byte 0x20 - .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ - .byte 0x2 - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$4,LUW2-LUW1 - .long L$set$4 - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x7 - .byte 0x8 - .byte 0xc0+6 /* DW_CFA_restore, %rbp */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$5,LUW3-LUW2 - .long L$set$5 - .byte 0xb /* DW_CFA_restore_state */ - - .align 3 -LEFDE1: - .globl _ffi_closure_unix64.eh -_ffi_closure_unix64.eh: -LSFDE3: - .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ - .long L$set$6 -LASFDE3: - .long LASFDE3-EH_frame1 /* FDE CIE offset */ - .quad LUW5-. /* FDE initial location */ - .set L$set$7,LUW9-LUW5 /* FDE address range */ - .quad L$set$7 - .byte 0x0 /* Augmentation size */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$8,LUW6-LUW5 - .long L$set$8 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 208,1 /* uleb128 208 */ - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$9,LUW7-LUW6 - .long L$set$9 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$10,LUW8-LUW7 - .long L$set$10 - .byte 0xb /* DW_CFA_restore_state */ - - .align 3 -LEFDE3: - .subsections_via_symbols - -#endif /* __x86_64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/x86/ffi.c deleted file mode 100644 index dbf9c8e32..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/ffi.c +++ /dev/null @@ -1,867 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2002 Bo Thorsen - Copyright (c) 2002 Roger Sayle - Copyright (C) 2008, 2010 Free Software Foundation, Inc. - - x86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#if !defined(__x86_64__) || defined(_WIN64) - -#ifdef _WIN64 -#include -#endif - -#include -#include - -#include - - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif); -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; -#ifndef X86_WIN64 - size_t p_stack_args[2]; - void *p_stack_data[2]; - char *argp2 = stack; - int stack_args_count = 0; - int cabi = ecif->cif->abi; -#endif - - argp = stack; - - if ((ecif->cif->flags == FFI_TYPE_STRUCT - || ecif->cif->flags == FFI_TYPE_MS_STRUCT) -#ifdef X86_WIN64 - && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2 - && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8) -#endif - ) - { - *(void **) argp = ecif->rvalue; -#ifndef X86_WIN64 - /* For fastcall/thiscall this is first register-passed - argument. */ - if (cabi == FFI_THISCALL || cabi == FFI_FASTCALL) - { - p_stack_args[stack_args_count] = sizeof (void*); - p_stack_data[stack_args_count] = argp; - ++stack_args_count; - } -#endif - argp += sizeof(void*); - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(void*) - 1) & (size_t) argp) - argp = (char *) ALIGN(argp, sizeof(void*)); - - z = (*p_arg)->size; -#ifdef X86_WIN64 - if (z > sizeof(ffi_arg) - || ((*p_arg)->type == FFI_TYPE_STRUCT - && (z != 1 && z != 2 && z != 4 && z != 8)) -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE) -#endif - ) - { - z = sizeof(ffi_arg); - *(void **)argp = *p_argv; - } - else if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - memcpy(argp, *p_argv, z); - } - else -#endif - if (z < sizeof(ffi_arg)) - { - z = sizeof(ffi_arg); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: - *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(ffi_arg *) argp = *(ffi_arg *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else - { - memcpy(argp, *p_argv, z); - } - -#ifndef X86_WIN64 - /* For thiscall/fastcall convention register-passed arguments - are the first two none-floating-point arguments with a size - smaller or equal to sizeof (void*). */ - if ((cabi == FFI_THISCALL && stack_args_count < 1) - || (cabi == FFI_FASTCALL && stack_args_count < 2)) - { - if (z <= 4 - && ((*p_arg)->type != FFI_TYPE_FLOAT - && (*p_arg)->type != FFI_TYPE_STRUCT)) - { - p_stack_args[stack_args_count] = z; - p_stack_data[stack_args_count] = argp; - ++stack_args_count; - } - } -#endif - p_argv++; -#ifdef X86_WIN64 - argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); -#else - argp += z; -#endif - } - -#ifndef X86_WIN64 - /* We need to move the register-passed arguments for thiscall/fastcall - on top of stack, so that those can be moved to registers ecx/edx by - call-handler. */ - if (stack_args_count > 0) - { - size_t zz = (p_stack_args[0] + 3) & ~3; - char *h; - - /* Move first argument to top-stack position. */ - if (p_stack_data[0] != argp2) - { - h = alloca (zz + 1); - memcpy (h, p_stack_data[0], zz); - memmove (argp2 + zz, argp2, - (size_t) ((char *) p_stack_data[0] - (char*)argp2)); - memcpy (argp2, h, zz); - } - - argp2 += zz; - --stack_args_count; - if (zz > 4) - stack_args_count = 0; - - /* If we have a second argument, then move it on top - after the first one. */ - if (stack_args_count > 0 && p_stack_data[1] != argp2) - { - zz = p_stack_args[1]; - zz = (zz + 3) & ~3; - h = alloca (zz + 1); - h = alloca (zz + 1); - memcpy (h, p_stack_data[1], zz); - memmove (argp2 + zz, argp2, (size_t) ((char*) p_stack_data[1] - (char*)argp2)); - memcpy (argp2, h, zz); - } - } -#endif - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - unsigned int i; - ffi_type **ptr; - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: -#ifdef X86_WIN64 - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: -#endif - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: -#ifndef X86_WIN64 -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif -#endif - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_UINT64: -#ifdef X86_WIN64 - case FFI_TYPE_POINTER: -#endif - cif->flags = FFI_TYPE_SINT64; - break; - - case FFI_TYPE_STRUCT: -#ifndef X86 - if (cif->rtype->size == 1) - { - cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */ - } - else if (cif->rtype->size == 2) - { - cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */ - } - else if (cif->rtype->size == 4) - { -#ifdef X86_WIN64 - cif->flags = FFI_TYPE_SMALL_STRUCT_4B; -#else - cif->flags = FFI_TYPE_INT; /* same as int type */ -#endif - } - else if (cif->rtype->size == 8) - { - cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ - } - else -#endif - { -#ifdef X86_WIN32 - if (cif->abi == FFI_MS_CDECL) - cif->flags = FFI_TYPE_MS_STRUCT; - else -#endif - cif->flags = FFI_TYPE_STRUCT; - /* allocate space for return value pointer */ - cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG); - } - break; - - default: -#ifdef X86_WIN64 - cif->flags = FFI_TYPE_SINT64; - break; - case FFI_TYPE_INT: - cif->flags = FFI_TYPE_SINT32; -#else - cif->flags = FFI_TYPE_INT; -#endif - break; - } - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - if (((*ptr)->alignment - 1) & cif->bytes) - cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment); - cif->bytes += (unsigned)ALIGN((*ptr)->size, FFI_SIZEOF_ARG); - } - -#ifdef X86_WIN64 - /* ensure space for storing four registers */ - cif->bytes += 4 * sizeof(ffi_arg); -#endif - -#ifndef X86_WIN32 -#ifndef X86_WIN64 - if (cif->abi != FFI_STDCALL && cif->abi != FFI_THISCALL && cif->abi != FFI_FASTCALL) -#endif - cif->bytes = (cif->bytes + 15) & ~0xF; -#endif - - return FFI_OK; -} - -#ifdef X86_WIN64 -extern int -ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); -#elif defined(X86_WIN32) -extern void -ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned, unsigned *, void (*fn)(void)); -#else -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); -#endif - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - -#ifdef X86_WIN64 - if (rvalue == NULL - && cif->flags == FFI_TYPE_STRUCT - && cif->rtype->size != 1 && cif->rtype->size != 2 - && cif->rtype->size != 4 && cif->rtype->size != 8) - { - ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF); - } -#else - if (rvalue == NULL - && (cif->flags == FFI_TYPE_STRUCT - || cif->flags == FFI_TYPE_MS_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } -#endif - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { -#ifdef X86_WIN64 - case FFI_WIN64: - ffi_call_win64(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; -#elif defined(X86_WIN32) - case FFI_SYSV: - case FFI_MS_CDECL: - case FFI_STDCALL: - ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; - case FFI_THISCALL: - case FFI_FASTCALL: - { - unsigned int abi = cif->abi; - unsigned int i, passed_regs = 0; - - if (cif->flags == FFI_TYPE_STRUCT) - ++passed_regs; - - for (i=0; i < cif->nargs && passed_regs < 2;i++) - { - size_t sz; - - if (cif->arg_types[i]->type == FFI_TYPE_FLOAT - || cif->arg_types[i]->type == FFI_TYPE_STRUCT) - continue; - sz = (cif->arg_types[i]->size + 3) & ~3; - if (sz == 0 || sz > 4) - continue; - ++passed_regs; - } - if (passed_regs < 2 && abi == FFI_FASTCALL) - abi = FFI_THISCALL; - if (passed_regs < 1 && abi == FFI_THISCALL) - abi = FFI_STDCALL; - ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags, - ecif.rvalue, fn); - } - break; -#else - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, - fn); - break; -#endif - default: - FFI_ASSERT(0); - break; - } -} - - -/** private members **/ - -/* The following __attribute__((regparm(1))) decorations will have no effect - on MSVC or SUNPRO_C -- standard conventions apply. */ -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif); -void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) - __attribute__ ((regparm(1))); -unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) - __attribute__ ((regparm(1))); -void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) - __attribute__ ((regparm(1))); -#ifdef X86_WIN32 -void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *) - __attribute__ ((regparm(1))); -#endif -#ifndef X86_WIN64 -void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *) - __attribute__ ((regparm(1))); -void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *) - __attribute__ ((regparm(1))); -void FFI_HIDDEN ffi_closure_FASTCALL (ffi_closure *) - __attribute__ ((regparm(1))); -#else -void FFI_HIDDEN ffi_closure_win64 (ffi_closure *); -#endif - -/* This function is jumped to by the trampoline */ - -#ifdef X86_WIN64 -void * FFI_HIDDEN -ffi_closure_win64_inner (ffi_closure *closure, void *args) { - ffi_cif *cif; - void **arg_area; - void *result; - void *resp = &result; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will change RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - /* The result is returned in rax. This does the right thing for - result types except for floats; we have to 'mov xmm0, rax' in the - caller to correct this. - TODO: structure sizes of 3 5 6 7 are returned by reference, too!!! - */ - return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp; -} - -#else -unsigned int FFI_HIDDEN __attribute__ ((regparm(1))) -ffi_closure_SYSV_inner (ffi_closure *closure, void **respp, void *args) -{ - /* our various things... */ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will change RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); - - (closure->fun) (cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} -#endif /* !X86_WIN64 */ - -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, - ffi_cif *cif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - -#ifdef X86_WIN64 - if (cif->rtype->size > sizeof(ffi_arg) - || (cif->flags == FFI_TYPE_STRUCT - && (cif->rtype->size != 1 && cif->rtype->size != 2 - && cif->rtype->size != 4 && cif->rtype->size != 8))) { - *rvalue = *(void **) argp; - argp += sizeof(void *); - } -#else - if ( cif->flags == FFI_TYPE_STRUCT - || cif->flags == FFI_TYPE_MS_STRUCT ) { - *rvalue = *(void **) argp; - argp += sizeof(void *); - } -#endif - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(void*) - 1) & (size_t) argp) { - argp = (char *) ALIGN(argp, sizeof(void*)); - } - -#ifdef X86_WIN64 - if ((*p_arg)->size > sizeof(ffi_arg) - || ((*p_arg)->type == FFI_TYPE_STRUCT - && ((*p_arg)->size != 1 && (*p_arg)->size != 2 - && (*p_arg)->size != 4 && (*p_arg)->size != 8))) - { - z = sizeof(void *); - *p_argv = *(void **)argp; - } - else -#endif - { - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - - *p_argv = (void*) argp; - } - - p_argv++; -#ifdef X86_WIN64 - argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); -#else - argp += z; -#endif - } - - return; -} - -#define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \ -{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - void* __fun = (void*)(FUN); \ - void* __ctx = (void*)(CTX); \ - *(unsigned char*) &__tramp[0] = 0x41; \ - *(unsigned char*) &__tramp[1] = 0xbb; \ - *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \ - *(unsigned char*) &__tramp[6] = 0x48; \ - *(unsigned char*) &__tramp[7] = 0xb8; \ - *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \ - *(unsigned char *) &__tramp[16] = 0x49; \ - *(unsigned char *) &__tramp[17] = 0xba; \ - *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \ - *(unsigned char *) &__tramp[26] = 0x41; \ - *(unsigned char *) &__tramp[27] = 0xff; \ - *(unsigned char *) &__tramp[28] = 0xe2; /* jmp %r10 */ \ - } - -/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ - -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ -{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned int __dis = __fun - (__ctx + 10); \ - *(unsigned char*) &__tramp[0] = 0xb8; \ - *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ - *(unsigned char *) &__tramp[5] = 0xe9; \ - *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ - } - -#define FFI_INIT_TRAMPOLINE_RAW_THISCALL(TRAMP,FUN,CTX,SIZE) \ -{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned int __dis = __fun - (__ctx + 49); \ - unsigned short __size = (unsigned short)(SIZE); \ - *(unsigned int *) &__tramp[0] = 0x8324048b; /* mov (%esp), %eax */ \ - *(unsigned int *) &__tramp[4] = 0x4c890cec; /* sub $12, %esp */ \ - *(unsigned int *) &__tramp[8] = 0x04890424; /* mov %ecx, 4(%esp) */ \ - *(unsigned char*) &__tramp[12] = 0x24; /* mov %eax, (%esp) */ \ - *(unsigned char*) &__tramp[13] = 0xb8; \ - *(unsigned int *) &__tramp[14] = __size; /* mov __size, %eax */ \ - *(unsigned int *) &__tramp[18] = 0x08244c8d; /* lea 8(%esp), %ecx */ \ - *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \ - *(unsigned short*) &__tramp[26] = 0x0b74; /* jz 1f */ \ - *(unsigned int *) &__tramp[28] = 0x8908518b; /* 2b: mov 8(%ecx), %edx */ \ - *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %ecx */ \ - *(unsigned char*) &__tramp[36] = 0x48; /* dec %eax */ \ - *(unsigned short*) &__tramp[37] = 0xf575; /* jnz 2b ; 1f: */ \ - *(unsigned char*) &__tramp[39] = 0xb8; \ - *(unsigned int*) &__tramp[40] = __ctx; /* movl __ctx, %eax */ \ - *(unsigned char *) &__tramp[44] = 0xe8; \ - *(unsigned int*) &__tramp[45] = __dis; /* call __fun */ \ - *(unsigned char*) &__tramp[49] = 0xc2; /* ret */ \ - *(unsigned short*) &__tramp[50] = (__size + 8); /* ret (__size + 8) */ \ - } - -#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX) \ -{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned int __dis = __fun - (__ctx + 10); \ - *(unsigned char*) &__tramp[0] = 0xb8; \ - *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ - *(unsigned char *) &__tramp[5] = 0xe8; \ - *(unsigned int*) &__tramp[6] = __dis; /* call __fun */ \ - } - -/* the cif must already be prep'ed */ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ -#ifdef X86_WIN64 -#define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE) -#define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0) - if (cif->abi == FFI_WIN64) - { - int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3); - FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0], - &ffi_closure_win64, - codeloc, mask); - /* make sure we can execute here */ - } -#else - if (cif->abi == FFI_SYSV) - { - FFI_INIT_TRAMPOLINE (&closure->tramp[0], - &ffi_closure_SYSV, - (void*)codeloc); - } - else if (cif->abi == FFI_FASTCALL) - { - FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], - &ffi_closure_FASTCALL, - (void*)codeloc); - } - else if (cif->abi == FFI_THISCALL) - { - FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], - &ffi_closure_THISCALL, - (void*)codeloc); - } - else if (cif->abi == FFI_STDCALL) - { - FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], - &ffi_closure_STDCALL, - (void*)codeloc); - } -#ifdef X86_WIN32 - else if (cif->abi == FFI_MS_CDECL) - { - FFI_INIT_TRAMPOLINE (&closure->tramp[0], - &ffi_closure_SYSV, - (void*)codeloc); - } -#endif /* X86_WIN32 */ -#endif /* !X86_WIN64 */ - else - { - return FFI_BAD_ABI; - } - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -/* ------- Native raw API support -------------------------------- */ - -#if !FFI_NO_RAW_API - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc) -{ - int i; - - if (cif->abi != FFI_SYSV -#ifdef X86_WIN32 - && cif->abi != FFI_THISCALL -#endif - ) - return FFI_BAD_ABI; - - /* we currently don't support certain kinds of arguments for raw - closures. This should be implemented by a separate assembly - language routine, since it would require argument processing, - something we don't do now for performance. */ - - for (i = cif->nargs-1; i >= 0; i--) - { - FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); - FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); - } - -#ifdef X86_WIN32 - if (cif->abi == FFI_SYSV) - { -#endif - FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, - codeloc); -#ifdef X86_WIN32 - } - else if (cif->abi == FFI_THISCALL) - { - FFI_INIT_TRAMPOLINE_RAW_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL, codeloc, cif->bytes); - } -#endif - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -static void -ffi_prep_args_raw(char *stack, extended_cif *ecif) -{ - memcpy (stack, ecif->avalue, ecif->cif->bytes); -} - -/* we borrow this routine from libffi (it must be changed, though, to - * actually call the function passed in the first argument. as of - * libffi-1.20, this is not the case.) - */ - -void -ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue) -{ - extended_cif ecif; - void **avalue = (void **)fake_avalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - -#ifdef X86_WIN64 - if (rvalue == NULL - && cif->flags == FFI_TYPE_STRUCT - && cif->rtype->size != 1 && cif->rtype->size != 2 - && cif->rtype->size != 4 && cif->rtype->size != 8) - { - ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF); - } -#else - if (rvalue == NULL - && (cif->flags == FFI_TYPE_STRUCT - || cif->flags == FFI_TYPE_MS_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } -#endif - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { -#ifdef X86_WIN64 - case FFI_WIN64: - ffi_call_win64(ffi_prep_args_raw, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; -#elif defined(X86_WIN32) - case FFI_SYSV: - case FFI_MS_CDECL: - case FFI_STDCALL: - ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; - case FFI_THISCALL: - case FFI_FASTCALL: - { - unsigned int abi = cif->abi; - unsigned int i, passed_regs = 0; - - if (cif->flags == FFI_TYPE_STRUCT) - ++passed_regs; - - for (i=0; i < cif->nargs && passed_regs < 2;i++) - { - size_t sz; - - if (cif->arg_types[i]->type == FFI_TYPE_FLOAT - || cif->arg_types[i]->type == FFI_TYPE_STRUCT) - continue; - sz = (cif->arg_types[i]->size + 3) & ~3; - if (sz == 0 || sz > 4) - continue; - ++passed_regs; - } - if (passed_regs < 2 && abi == FFI_FASTCALL) - abi = FFI_THISCALL; - if (passed_regs < 1 && abi == FFI_THISCALL) - abi = FFI_STDCALL; - ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags, - ecif.rvalue, fn); - } - break; -#else - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ecif.rvalue, - fn); - break; -#endif - default: - FFI_ASSERT(0); - break; - } -} - -#endif - -#endif /* !__x86_64__ || X86_WIN64 */ - diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/ffi64.c b/third_party/python/Modules/_ctypes/libffi/src/x86/ffi64.c deleted file mode 100644 index 5a5e04383..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/ffi64.c +++ /dev/null @@ -1,676 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi64.c - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 2011 Anthony Green - Copyright (c) 2008, 2010 Red Hat, Inc. - Copyright (c) 2002, 2007 Bo Thorsen - - x86-64 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#ifdef __x86_64__ - -#define MAX_GPR_REGS 6 -#define MAX_SSE_REGS 8 - -#if defined(__INTEL_COMPILER) -#include "xmmintrin.h" -#define UINT128 __m128 -#else -#if defined(__SUNPRO_C) -#include -#define UINT128 __m128i -#else -#define UINT128 __int128_t -#endif -#endif - -union big_int_union -{ - UINT32 i32; - UINT64 i64; - UINT128 i128; -}; - -struct register_args -{ - /* Registers for argument passing. */ - UINT64 gpr[MAX_GPR_REGS]; - union big_int_union sse[MAX_SSE_REGS]; -}; - -extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void), unsigned ssecount); - -/* All reference to register classes here is identical to the code in - gcc/config/i386/i386.c. Do *not* change one without the other. */ - -/* Register class used for passing given 64bit part of the argument. - These represent classes as documented by the PS ABI, with the - exception of SSESF, SSEDF classes, that are basically SSE class, - just gcc will use SF or DFmode move instead of DImode to avoid - reformatting penalties. - - Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves - whenever possible (upper half does contain padding). */ -enum x86_64_reg_class - { - X86_64_NO_CLASS, - X86_64_INTEGER_CLASS, - X86_64_INTEGERSI_CLASS, - X86_64_SSE_CLASS, - X86_64_SSESF_CLASS, - X86_64_SSEDF_CLASS, - X86_64_SSEUP_CLASS, - X86_64_X87_CLASS, - X86_64_X87UP_CLASS, - X86_64_COMPLEX_X87_CLASS, - X86_64_MEMORY_CLASS - }; - -#define MAX_CLASSES 4 - -#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) - -/* x86-64 register passing implementation. See x86-64 ABI for details. Goal - of this code is to classify each 8bytes of incoming argument by the register - class and assign registers accordingly. */ - -/* Return the union class of CLASS1 and CLASS2. - See the x86-64 PS ABI for details. */ - -static enum x86_64_reg_class -merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) -{ - /* Rule #1: If both classes are equal, this is the resulting class. */ - if (class1 == class2) - return class1; - - /* Rule #2: If one of the classes is NO_CLASS, the resulting class is - the other class. */ - if (class1 == X86_64_NO_CLASS) - return class2; - if (class2 == X86_64_NO_CLASS) - return class1; - - /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ - if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ - if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) - || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) - return X86_64_INTEGERSI_CLASS; - if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS - || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) - return X86_64_INTEGER_CLASS; - - /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, - MEMORY is used. */ - if (class1 == X86_64_X87_CLASS - || class1 == X86_64_X87UP_CLASS - || class1 == X86_64_COMPLEX_X87_CLASS - || class2 == X86_64_X87_CLASS - || class2 == X86_64_X87UP_CLASS - || class2 == X86_64_COMPLEX_X87_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #6: Otherwise class SSE is used. */ - return X86_64_SSE_CLASS; -} - -/* Classify the argument of type TYPE and mode MODE. - CLASSES will be filled by the register class used to pass each word - of the operand. The number of words is returned. In case the parameter - should be passed in memory, 0 is returned. As a special case for zero - sized containers, classes[0] will be NO_CLASS and 1 is returned. - - See the x86-64 PS ABI for details. -*/ -static size_t -classify_argument (ffi_type *type, enum x86_64_reg_class classes[], - size_t byte_offset) -{ - switch (type->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - { - size_t size = byte_offset + type->size; - - if (size <= 4) - { - classes[0] = X86_64_INTEGERSI_CLASS; - return 1; - } - else if (size <= 8) - { - classes[0] = X86_64_INTEGER_CLASS; - return 1; - } - else if (size <= 12) - { - classes[0] = X86_64_INTEGER_CLASS; - classes[1] = X86_64_INTEGERSI_CLASS; - return 2; - } - else if (size <= 16) - { - classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; - return 2; - } - else - FFI_ASSERT (0); - } - case FFI_TYPE_FLOAT: - if (!(byte_offset % 8)) - classes[0] = X86_64_SSESF_CLASS; - else - classes[0] = X86_64_SSE_CLASS; - return 1; - case FFI_TYPE_DOUBLE: - classes[0] = X86_64_SSEDF_CLASS; - return 1; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_X87_CLASS; - classes[1] = X86_64_X87UP_CLASS; - return 2; -#endif - case FFI_TYPE_STRUCT: - { - const size_t UNITS_PER_WORD = 8; - size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; - ffi_type **ptr; - int i; - enum x86_64_reg_class subclasses[MAX_CLASSES]; - - /* If the struct is larger than 32 bytes, pass it on the stack. */ - if (type->size > 32) - return 0; - - for (i = 0; i < words; i++) - classes[i] = X86_64_NO_CLASS; - - /* Zero sized arrays or structures are NO_CLASS. We return 0 to - signalize memory class, so handle it as special case. */ - if (!words) - { - classes[0] = X86_64_NO_CLASS; - return 1; - } - - /* Merge the fields of structure. */ - for (ptr = type->elements; *ptr != NULL; ptr++) - { - size_t num; - - byte_offset = ALIGN (byte_offset, (*ptr)->alignment); - - num = classify_argument (*ptr, subclasses, byte_offset % 8); - if (num == 0) - return 0; - for (i = 0; i < num; i++) - { - size_t pos = byte_offset / 8; - classes[i + pos] = - merge_classes (subclasses[i], classes[i + pos]); - } - - byte_offset += (*ptr)->size; - } - - if (words > 2) - { - /* When size > 16 bytes, if the first one isn't - X86_64_SSE_CLASS or any other ones aren't - X86_64_SSEUP_CLASS, everything should be passed in - memory. */ - if (classes[0] != X86_64_SSE_CLASS) - return 0; - - for (i = 1; i < words; i++) - if (classes[i] != X86_64_SSEUP_CLASS) - return 0; - } - - /* Final merger cleanup. */ - for (i = 0; i < words; i++) - { - /* If one class is MEMORY, everything should be passed in - memory. */ - if (classes[i] == X86_64_MEMORY_CLASS) - return 0; - - /* The X86_64_SSEUP_CLASS should be always preceded by - X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ - if (classes[i] == X86_64_SSEUP_CLASS - && classes[i - 1] != X86_64_SSE_CLASS - && classes[i - 1] != X86_64_SSEUP_CLASS) - { - /* The first one should never be X86_64_SSEUP_CLASS. */ - FFI_ASSERT (i != 0); - classes[i] = X86_64_SSE_CLASS; - } - - /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, - everything should be passed in memory. */ - if (classes[i] == X86_64_X87UP_CLASS - && (classes[i - 1] != X86_64_X87_CLASS)) - { - /* The first one should never be X86_64_X87UP_CLASS. */ - FFI_ASSERT (i != 0); - return 0; - } - } - return words; - } - - default: - FFI_ASSERT(0); - } - return 0; /* Never reached. */ -} - -/* Examine the argument and return set number of register required in each - class. Return zero iff parameter should be passed in memory, otherwise - the number of registers. */ - -static size_t -examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], - _Bool in_return, int *pngpr, int *pnsse) -{ - size_t n; - int i, ngpr, nsse; - - n = classify_argument (type, classes, 0); - if (n == 0) - return 0; - - ngpr = nsse = 0; - for (i = 0; i < n; ++i) - switch (classes[i]) - { - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - ngpr++; - break; - case X86_64_SSE_CLASS: - case X86_64_SSESF_CLASS: - case X86_64_SSEDF_CLASS: - nsse++; - break; - case X86_64_NO_CLASS: - case X86_64_SSEUP_CLASS: - break; - case X86_64_X87_CLASS: - case X86_64_X87UP_CLASS: - case X86_64_COMPLEX_X87_CLASS: - return in_return != 0; - default: - abort (); - } - - *pngpr = ngpr; - *pnsse = nsse; - - return n; -} - -/* Perform machine dependent cif processing. */ - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - int gprcount, ssecount, i, avn, ngpr, nsse, flags; - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t bytes, n; - - gprcount = ssecount = 0; - - flags = cif->rtype->type; - if (flags != FFI_TYPE_VOID) - { - n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); - if (n == 0) - { - /* The return value is passed in memory. A pointer to that - memory is the first argument. Allocate a register for it. */ - gprcount++; - /* We don't have to do anything in asm for the return. */ - flags = FFI_TYPE_VOID; - } - else if (flags == FFI_TYPE_STRUCT) - { - /* Mark which registers the result appears in. */ - _Bool sse0 = SSE_CLASS_P (classes[0]); - _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); - if (sse0 && !sse1) - flags |= 1 << 8; - else if (!sse0 && sse1) - flags |= 1 << 9; - else if (sse0 && sse1) - flags |= 1 << 10; - /* Mark the true size of the structure. */ - flags |= cif->rtype->size << 12; - } - } - - /* Go over all arguments and determine the way they should be passed. - If it's in a register and there is space for it, let that be so. If - not, add it's size to the stack byte count. */ - for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) - { - if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = cif->arg_types[i]->alignment; - - if (align < 8) - align = 8; - - bytes = ALIGN (bytes, align); - bytes += cif->arg_types[i]->size; - } - else - { - gprcount += ngpr; - ssecount += nsse; - } - } - if (ssecount) - flags |= 1 << 11; - cif->flags = flags; - cif->bytes = (unsigned)ALIGN (bytes, 8); - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - enum x86_64_reg_class classes[MAX_CLASSES]; - char *stack, *argp; - ffi_type **arg_types; - int gprcount, ssecount, ngpr, nsse, i, avn; - _Bool ret_in_memory; - struct register_args *reg_args; - - /* Can't call 32-bit mode from 64-bit mode. */ - FFI_ASSERT (cif->abi == FFI_UNIX64); - - /* If the return value is a struct and we don't have a return value - address then we need to make one. Note the setting of flags to - VOID above in ffi_prep_cif_machdep. */ - ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT - && (cif->flags & 0xff) == FFI_TYPE_VOID); - if (rvalue == NULL && ret_in_memory) - rvalue = alloca (cif->rtype->size); - - /* Allocate the space for the arguments, plus 4 words of temp space. */ - stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); - reg_args = (struct register_args *) stack; - argp = stack + sizeof (struct register_args); - - gprcount = ssecount = 0; - - /* If the return value is passed in memory, add the pointer as the - first integer argument. */ - if (ret_in_memory) - reg_args->gpr[gprcount++] = (unsigned long) rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - size_t n, size = arg_types[i]->size; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) ALIGN (argp, align); - memcpy (argp, avalue[i], size); - argp += size; - } - else - { - /* The argument is passed entirely in registers. */ - char *a = (char *) avalue[i]; - int j; - - for (j = 0; j < n; j++, a += 8, size -= 8) - { - switch (classes[j]) - { - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - /* Sign-extend integer arguments passed in general - purpose registers, to cope with the fact that - LLVM incorrectly assumes that this will be done - (the x86-64 PS ABI does not specify this). */ - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); - break; - case FFI_TYPE_SINT16: - *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); - break; - case FFI_TYPE_SINT32: - *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); - break; - default: - reg_args->gpr[gprcount] = 0; - memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); - } - gprcount++; - break; - case X86_64_SSE_CLASS: - case X86_64_SSEDF_CLASS: - reg_args->sse[ssecount++].i64 = *(UINT64 *) a; - break; - case X86_64_SSESF_CLASS: - reg_args->sse[ssecount++].i32 = *(UINT32 *) a; - break; - default: - abort(); - } - } - } - } - - ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), - cif->flags, rvalue, fn, ssecount); -} - - -extern void ffi_closure_unix64(void); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - volatile unsigned short *tramp; - - /* Sanity check on the cif ABI. */ - { - int abi = cif->abi; - if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))) - return FFI_BAD_ABI; - } - - tramp = (volatile unsigned short *) &closure->tramp[0]; - - tramp[0] = 0xbb49; /* mov , %r11 */ - *((unsigned long long * volatile) &tramp[1]) - = (unsigned long) ffi_closure_unix64; - tramp[5] = 0xba49; /* mov , %r10 */ - *((unsigned long long * volatile) &tramp[6]) - = (unsigned long) codeloc; - - /* Set the carry bit iff the function uses any sse registers. - This is clc or stc, together with the first byte of the jmp. */ - tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; - - tramp[11] = 0xe3ff; /* jmp *%r11 */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -int -ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue, - struct register_args *reg_args, char *argp) -{ - ffi_cif *cif; - void **avalue; - ffi_type **arg_types; - long i, avn; - int gprcount, ssecount, ngpr, nsse; - int ret; - - cif = closure->cif; - avalue = alloca(cif->nargs * sizeof(void *)); - gprcount = ssecount = 0; - - ret = cif->rtype->type; - if (ret != FFI_TYPE_VOID) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); - if (n == 0) - { - /* The return value goes in memory. Arrange for the closure - return value to go directly back to the original caller. */ - rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++]; - /* We don't have to do anything in asm for the return. */ - ret = FFI_TYPE_VOID; - } - else if (ret == FFI_TYPE_STRUCT && n == 2) - { - /* Mark which register the second word of the structure goes in. */ - _Bool sse0 = SSE_CLASS_P (classes[0]); - _Bool sse1 = SSE_CLASS_P (classes[1]); - if (!sse0 && sse1) - ret |= 1 << 8; - else if (sse0 && !sse1) - ret |= 1 << 9; - } - } - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t n; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) ALIGN (argp, align); - avalue[i] = argp; - argp += arg_types[i]->size; - } - /* If the argument is in a single register, or two consecutive - integer registers, then we can use that address directly. */ - else if (n == 1 - || (n == 2 && !(SSE_CLASS_P (classes[0]) - || SSE_CLASS_P (classes[1])))) - { - /* The argument is in a single register. */ - if (SSE_CLASS_P (classes[0])) - { - avalue[i] = ®_args->sse[ssecount]; - ssecount += n; - } - else - { - avalue[i] = ®_args->gpr[gprcount]; - gprcount += n; - } - } - /* Otherwise, allocate space to make them consecutive. */ - else - { - char *a = alloca (16); - int j; - - avalue[i] = a; - for (j = 0; j < n; j++, a += 8) - { - if (SSE_CLASS_P (classes[j])) - memcpy (a, ®_args->sse[ssecount++], 8); - else - memcpy (a, ®_args->gpr[gprcount++], 8); - } - } - } - - /* Invoke the closure. */ - closure->fun (cif, rvalue, avalue, closure->user_data); - - /* Tell assembly how to perform return type promotions. */ - return ret; -} - -#endif /* __x86_64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/x86/ffitarget.h deleted file mode 100644 index b2afe9112..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/ffitarget.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003, 2010 Red Hat, Inc. - Copyright (C) 2008 Free Software Foundation, Inc. - - Target configuration macros for x86 and x86-64. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -/* For code common to all platforms on x86 and x86_64. */ -#define X86_ANY - -#if defined (X86_64) && defined (__i386__) -#undef X86_64 -#define X86 -#endif - -#ifdef X86_WIN64 -#define FFI_SIZEOF_ARG 8 -#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -#ifdef X86_WIN64 -#ifdef _MSC_VER -typedef unsigned __int64 ffi_arg; -typedef __int64 ffi_sarg; -#else -typedef unsigned long long ffi_arg; -typedef long long ffi_sarg; -#endif -#else -#if defined __x86_64__ && defined __ILP32__ -#define FFI_SIZEOF_ARG 8 -#define FFI_SIZEOF_JAVA_RAW 4 -typedef unsigned long long ffi_arg; -typedef long long ffi_sarg; -#else -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; -#endif -#endif - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - - /* ---- Intel x86 Win32 ---------- */ -#ifdef X86_WIN32 - FFI_SYSV, - FFI_STDCALL, - FFI_THISCALL, - FFI_FASTCALL, - FFI_MS_CDECL, - FFI_LAST_ABI, -#ifdef _MSC_VER - FFI_DEFAULT_ABI = FFI_MS_CDECL -#else - FFI_DEFAULT_ABI = FFI_SYSV -#endif - -#elif defined(X86_WIN64) - FFI_WIN64, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_WIN64 - -#else - /* ---- Intel x86 and AMD x86-64 - */ - FFI_SYSV, - FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ - FFI_THISCALL, - FFI_FASTCALL, - FFI_STDCALL, - FFI_LAST_ABI, -#if defined(__i386__) || defined(__i386) - FFI_DEFAULT_ABI = FFI_SYSV -#else - FFI_DEFAULT_ABI = FFI_UNIX64 -#endif -#endif -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) -#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) -#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) -#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) - -#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 -#else -#ifdef X86_WIN32 -#define FFI_TRAMPOLINE_SIZE 52 -#else -#ifdef X86_WIN64 -#define FFI_TRAMPOLINE_SIZE 29 -#define FFI_NATIVE_RAW_API 0 -#define FFI_NO_RAW_API 1 -#else -#define FFI_TRAMPOLINE_SIZE 10 -#endif -#endif -#ifndef X86_WIN64 -#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif -#endif - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/freebsd.S b/third_party/python/Modules/_ctypes/libffi/src/x86/freebsd.S deleted file mode 100644 index 97e0b4eb8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/freebsd.S +++ /dev/null @@ -1,463 +0,0 @@ -/* ----------------------------------------------------------------------- - freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. - Copyright (c) 2008 Björn König - - X86 Foreign Function Interface for FreeBSD - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------ */ - -#ifndef __x86_64__ - -#define LIBFFI_ASM -#include -#include - -.text - -.globl ffi_prep_args - - .align 4 -.globl ffi_call_SYSV - .type ffi_call_SYSV,@function - -ffi_call_SYSV: -.LFB1: - pushl %ebp -.LCFI0: - movl %esp,%ebp -.LCFI1: - /* Make room for all of the new args. */ - movl 16(%ebp),%ecx - subl %ecx,%esp - - /* Align the stack pointer to 16-bytes */ - andl $0xfffffff0, %esp - - movl %esp,%eax - - /* Place all of the ffi_prep_args in position */ - pushl 12(%ebp) - pushl %eax - call *8(%ebp) - - /* Return stack to previous state and call the function */ - addl $8,%esp - - call *28(%ebp) - - /* Load %ecx with the return type code */ - movl 20(%ebp),%ecx - - /* Protect %esi. We're going to pop it in the epilogue. */ - pushl %esi - - /* If the return value pointer is NULL, assume no return value. */ - cmpl $0,24(%ebp) - jne 0f - - /* Even if there is no space for the return value, we are - obliged to handle floating-point values. */ - cmpl $FFI_TYPE_FLOAT,%ecx - jne noretval - fstp %st(0) - - jmp epilogue - -0: - call 1f - -.Lstore_table: - .long noretval-.Lstore_table /* FFI_TYPE_VOID */ - .long retint-.Lstore_table /* FFI_TYPE_INT */ - .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ - .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ - .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ - .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ - .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ - .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ - .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ - .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ - .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ - .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ - .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ - .long retint-.Lstore_table /* FFI_TYPE_POINTER */ - .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ - -1: - pop %esi - add (%esi, %ecx, 4), %esi - jmp *%esi - - /* Sign/zero extend as appropriate. */ -retsint8: - movsbl %al, %eax - jmp retint - -retsint16: - movswl %ax, %eax - jmp retint - -retuint8: - movzbl %al, %eax - jmp retint - -retuint16: - movzwl %ax, %eax - jmp retint - -retfloat: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstps (%ecx) - jmp epilogue - -retdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpl (%ecx) - jmp epilogue - -retlongdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpt (%ecx) - jmp epilogue - -retint64: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - movl %edx,4(%ecx) - jmp epilogue - -retstruct1b: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movb %al,0(%ecx) - jmp epilogue - -retstruct2b: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movw %ax,0(%ecx) - jmp epilogue - -retint: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - -retstruct: - /* Nothing to do! */ - -noretval: -epilogue: - popl %esi - movl %ebp,%esp - popl %ebp - ret -.LFE1: -.ffi_call_SYSV_end: - .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV - - .align 4 -FFI_HIDDEN (ffi_closure_SYSV) -.globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function - -ffi_closure_SYSV: -.LFB2: - pushl %ebp -.LCFI2: - movl %esp, %ebp -.LCFI3: - subl $40, %esp - leal -24(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 8(%ebp), %edx - movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ -#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ - call ffi_closure_SYSV_inner -#else - movl %ebx, 8(%esp) -.LCFI7: - call 1f -1: popl %ebx - addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx - call ffi_closure_SYSV_inner@PLT - movl 8(%esp), %ebx -#endif - movl -12(%ebp), %ecx - cmpl $FFI_TYPE_INT, %eax - je .Lcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lcls_retint - -0: cmpl $FFI_TYPE_FLOAT, %eax - je .Lcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lcls_retllong - cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax - je .Lcls_retstruct1b - cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax - je .Lcls_retstruct2b - cmpl $FFI_TYPE_STRUCT, %eax - je .Lcls_retstruct -.Lcls_epilogue: - movl %ebp, %esp - popl %ebp - ret -.Lcls_retint: - movl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retfloat: - flds (%ecx) - jmp .Lcls_epilogue -.Lcls_retdouble: - fldl (%ecx) - jmp .Lcls_epilogue -.Lcls_retldouble: - fldt (%ecx) - jmp .Lcls_epilogue -.Lcls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp .Lcls_epilogue -.Lcls_retstruct1b: - movsbl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retstruct2b: - movswl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retstruct: - movl %ebp, %esp - popl %ebp - ret $4 -.LFE2: - .size ffi_closure_SYSV, .-ffi_closure_SYSV - -#if !FFI_NO_RAW_API - -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#define CIF_FLAGS_OFFSET 20 - - .align 4 -FFI_HIDDEN (ffi_closure_raw_SYSV) -.globl ffi_closure_raw_SYSV - .type ffi_closure_raw_SYSV, @function - -ffi_closure_raw_SYSV: -.LFB3: - pushl %ebp -.LCFI4: - movl %esp, %ebp -.LCFI5: - pushl %esi -.LCFI6: - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ - movl %edx, 8(%esp) /* raw_args */ - leal -24(%ebp), %edx - movl %edx, 4(%esp) /* &res */ - movl %esi, (%esp) /* cif */ - call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ - movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ - cmpl $FFI_TYPE_INT, %eax - je .Lrcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lrcls_retint -0: - cmpl $FFI_TYPE_FLOAT, %eax - je .Lrcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lrcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lrcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lrcls_retllong -.Lrcls_epilogue: - addl $36, %esp - popl %esi - popl %ebp - ret -.Lrcls_retint: - movl -24(%ebp), %eax - jmp .Lrcls_epilogue -.Lrcls_retfloat: - flds -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retdouble: - fldl -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retldouble: - fldt -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retllong: - movl -24(%ebp), %eax - movl -20(%ebp), %edx - jmp .Lrcls_epilogue -.LFE3: - .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV -#endif - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .long 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef __PIC__ - .ascii "zR\0" /* CIE Augmentation */ -#else - .ascii "\0" /* CIE Augmentation */ -#endif - .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ -#ifdef __PIC__ - .byte 0x1 /* .uleb128 0x1; Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x88 /* DW_CFA_offset, column 0x8 */ - .byte 0x1 /* .uleb128 0x1 */ - .align 4 -.LECIE1: -.LSFDE1: - .long .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .long .LASFDE1-.Lframe1 /* FDE CIE offset */ -#ifdef __PIC__ - .long .LFB1-. /* FDE initial location */ -#else - .long .LFB1 /* FDE initial location */ -#endif - .long .LFE1-.LFB1 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI0-.LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI1-.LCFI0 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ - .align 4 -.LEFDE1: -.LSFDE2: - .long .LEFDE2-.LASFDE2 /* FDE Length */ -.LASFDE2: - .long .LASFDE2-.Lframe1 /* FDE CIE offset */ -#ifdef __PIC__ - .long .LFB2-. /* FDE initial location */ -#else - .long .LFB2 -#endif - .long .LFE2-.LFB2 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI2-.LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI3-.LCFI2 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ -#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI7-.LCFI3 - .byte 0x83 /* DW_CFA_offset, column 0x3 */ - .byte 0xa /* .uleb128 0xa */ -#endif - .align 4 -.LEFDE2: - -#if !FFI_NO_RAW_API - -.LSFDE3: - .long .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .long .LASFDE3-.Lframe1 /* FDE CIE offset */ -#ifdef __PIC__ - .long .LFB3-. /* FDE initial location */ -#else - .long .LFB3 -#endif - .long .LFE3-.LFB3 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI4-.LFB3 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI5-.LCFI4 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI6-.LCFI5 - .byte 0x86 /* DW_CFA_offset, column 0x6 */ - .byte 0x3 /* .uleb128 0x3 */ - .align 4 -.LEFDE3: - -#endif - -#endif /* ifndef __x86_64__ */ - - .section .note.GNU-stack,"",%progbits diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/x86/sysv.S deleted file mode 100644 index 3bd5477e4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/sysv.S +++ /dev/null @@ -1,483 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef __x86_64__ - -#define LIBFFI_ASM -#include -#include - -.text - -.globl ffi_prep_args - - .align 4 -.globl ffi_call_SYSV - .type ffi_call_SYSV,@function - -ffi_call_SYSV: -.LFB1: - pushl %ebp -.LCFI0: - movl %esp,%ebp -.LCFI1: - /* Make room for all of the new args. */ - movl 16(%ebp),%ecx - subl %ecx,%esp - - /* Align the stack pointer to 16-bytes */ - andl $0xfffffff0, %esp - - movl %esp,%eax - - /* Place all of the ffi_prep_args in position */ - pushl 12(%ebp) - pushl %eax - call *8(%ebp) - - /* Return stack to previous state and call the function */ - addl $8,%esp - - call *28(%ebp) - - /* Load %ecx with the return type code */ - movl 20(%ebp),%ecx - - /* Protect %esi. We're going to pop it in the epilogue. */ - pushl %esi - - /* If the return value pointer is NULL, assume no return value. */ - cmpl $0,24(%ebp) - jne 0f - - /* Even if there is no space for the return value, we are - obliged to handle floating-point values. */ - cmpl $FFI_TYPE_FLOAT,%ecx - jne noretval - fstp %st(0) - - jmp epilogue - -0: - call 1f - -.Lstore_table: - .long noretval-.Lstore_table /* FFI_TYPE_VOID */ - .long retint-.Lstore_table /* FFI_TYPE_INT */ - .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ - .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ - .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ - .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ - .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ - .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ - .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ - .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ - .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ - .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ - .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ - .long retint-.Lstore_table /* FFI_TYPE_POINTER */ - -1: - pop %esi - add (%esi, %ecx, 4), %esi - jmp *%esi - - /* Sign/zero extend as appropriate. */ -retsint8: - movsbl %al, %eax - jmp retint - -retsint16: - movswl %ax, %eax - jmp retint - -retuint8: - movzbl %al, %eax - jmp retint - -retuint16: - movzwl %ax, %eax - jmp retint - -retfloat: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstps (%ecx) - jmp epilogue - -retdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpl (%ecx) - jmp epilogue - -retlongdouble: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpt (%ecx) - jmp epilogue - -retint64: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - movl %edx,4(%ecx) - jmp epilogue - -retint: - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - -retstruct: - /* Nothing to do! */ - -noretval: -epilogue: - popl %esi - movl %ebp,%esp - popl %ebp - ret -.LFE1: -.ffi_call_SYSV_end: - .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV - - .align 4 -FFI_HIDDEN (ffi_closure_SYSV) -.globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function - -ffi_closure_SYSV: -.LFB2: - pushl %ebp -.LCFI2: - movl %esp, %ebp -.LCFI3: - subl $40, %esp - leal -24(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 8(%ebp), %edx -#ifdef __SUNPRO_C - /* The SUNPRO compiler doesn't support GCC's regparm function - attribute, so we have to pass all three arguments to - ffi_closure_SYSV_inner on the stack. */ - movl %edx, 8(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, 4(%esp) /* &resp */ - movl %eax, (%esp) /* closure */ -#else - movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ -#endif -#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ - call ffi_closure_SYSV_inner -#else - movl %ebx, 8(%esp) -.LCFI7: - call 1f -1: popl %ebx - addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx - call ffi_closure_SYSV_inner@PLT - movl 8(%esp), %ebx -#endif - movl -12(%ebp), %ecx - cmpl $FFI_TYPE_INT, %eax - je .Lcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lcls_retint - -0: cmpl $FFI_TYPE_FLOAT, %eax - je .Lcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lcls_retllong - cmpl $FFI_TYPE_STRUCT, %eax - je .Lcls_retstruct -.Lcls_epilogue: - movl %ebp, %esp - popl %ebp - ret -.Lcls_retint: - movl (%ecx), %eax - jmp .Lcls_epilogue -.Lcls_retfloat: - flds (%ecx) - jmp .Lcls_epilogue -.Lcls_retdouble: - fldl (%ecx) - jmp .Lcls_epilogue -.Lcls_retldouble: - fldt (%ecx) - jmp .Lcls_epilogue -.Lcls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp .Lcls_epilogue -.Lcls_retstruct: - movl %ebp, %esp - popl %ebp - ret $4 -.LFE2: - .size ffi_closure_SYSV, .-ffi_closure_SYSV - -#if !FFI_NO_RAW_API - -/* Precalculate for e.g. the Solaris 10/x86 assembler. */ -#if FFI_TRAMPOLINE_SIZE == 10 -#define RAW_CLOSURE_CIF_OFFSET 12 -#define RAW_CLOSURE_FUN_OFFSET 16 -#define RAW_CLOSURE_USER_DATA_OFFSET 20 -#elif FFI_TRAMPOLINE_SIZE == 24 -#define RAW_CLOSURE_CIF_OFFSET 24 -#define RAW_CLOSURE_FUN_OFFSET 28 -#define RAW_CLOSURE_USER_DATA_OFFSET 32 -#else -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#endif -#define CIF_FLAGS_OFFSET 20 - - .align 4 -FFI_HIDDEN (ffi_closure_raw_SYSV) -.globl ffi_closure_raw_SYSV - .type ffi_closure_raw_SYSV, @function - -ffi_closure_raw_SYSV: -.LFB3: - pushl %ebp -.LCFI4: - movl %esp, %ebp -.LCFI5: - pushl %esi -.LCFI6: - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ - movl %edx, 8(%esp) /* raw_args */ - leal -24(%ebp), %edx - movl %edx, 4(%esp) /* &res */ - movl %esi, (%esp) /* cif */ - call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ - movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ - cmpl $FFI_TYPE_INT, %eax - je .Lrcls_retint - - /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, - FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ - cmpl $FFI_TYPE_UINT64, %eax - jge 0f - cmpl $FFI_TYPE_UINT8, %eax - jge .Lrcls_retint -0: - cmpl $FFI_TYPE_FLOAT, %eax - je .Lrcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je .Lrcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je .Lrcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je .Lrcls_retllong -.Lrcls_epilogue: - addl $36, %esp - popl %esi - popl %ebp - ret -.Lrcls_retint: - movl -24(%ebp), %eax - jmp .Lrcls_epilogue -.Lrcls_retfloat: - flds -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retdouble: - fldl -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retldouble: - fldt -24(%ebp) - jmp .Lrcls_epilogue -.Lrcls_retllong: - movl -24(%ebp), %eax - movl -20(%ebp), %edx - jmp .Lrcls_epilogue -.LFE3: - .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV -#endif - -#if defined __GNUC__ -/* Only emit dwarf unwind info when building with GNU toolchain. */ - -#if defined __PIC__ -# if defined __sun__ && defined __svr4__ -/* 32-bit Solaris 2/x86 uses datarel encoding for PIC. GNU ld before 2.22 - doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this. */ -# define FDE_ENCODING 0x30 /* datarel */ -# define FDE_ENCODE(X) X@GOTOFF -# else -# define FDE_ENCODING 0x1b /* pcrel sdata4 */ -# if defined HAVE_AS_X86_PCREL -# define FDE_ENCODE(X) X-. -# else -# define FDE_ENCODE(X) X@rel -# endif -# endif -#else -# define FDE_ENCODING 0 /* absolute */ -# define FDE_ENCODE(X) X -#endif - - .section .eh_frame,EH_FRAME_FLAGS,@progbits -.Lframe1: - .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .long 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef HAVE_AS_ASCII_PSEUDO_OP -#ifdef __PIC__ - .ascii "zR\0" /* CIE Augmentation */ -#else - .ascii "\0" /* CIE Augmentation */ -#endif -#elif defined HAVE_AS_STRING_PSEUDO_OP -#ifdef __PIC__ - .string "zR" /* CIE Augmentation */ -#else - .string "" /* CIE Augmentation */ -#endif -#else -#error missing .ascii/.string -#endif - .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ -#ifdef __PIC__ - .byte 0x1 /* .uleb128 0x1; Augmentation size */ - .byte FDE_ENCODING -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x88 /* DW_CFA_offset, column 0x8 */ - .byte 0x1 /* .uleb128 0x1 */ - .align 4 -.LECIE1: -.LSFDE1: - .long .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .long .LASFDE1-.Lframe1 /* FDE CIE offset */ - .long FDE_ENCODE(.LFB1) /* FDE initial location */ - .long .LFE1-.LFB1 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI0-.LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI1-.LCFI0 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ - .align 4 -.LEFDE1: -.LSFDE2: - .long .LEFDE2-.LASFDE2 /* FDE Length */ -.LASFDE2: - .long .LASFDE2-.Lframe1 /* FDE CIE offset */ - .long FDE_ENCODE(.LFB2) /* FDE initial location */ - .long .LFE2-.LFB2 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI2-.LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI3-.LCFI2 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ -#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI7-.LCFI3 - .byte 0x83 /* DW_CFA_offset, column 0x3 */ - .byte 0xa /* .uleb128 0xa */ -#endif - .align 4 -.LEFDE2: - -#if !FFI_NO_RAW_API - -.LSFDE3: - .long .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .long .LASFDE3-.Lframe1 /* FDE CIE offset */ - .long FDE_ENCODE(.LFB3) /* FDE initial location */ - .long .LFE3-.LFB3 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI4-.LFB3 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x2 /* .uleb128 0x2 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI5-.LCFI4 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x5 /* .uleb128 0x5 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI6-.LCFI5 - .byte 0x86 /* DW_CFA_offset, column 0x6 */ - .byte 0x3 /* .uleb128 0x3 */ - .align 4 -.LEFDE3: - -#endif -#endif - -#endif /* ifndef __x86_64__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/unix64.S b/third_party/python/Modules/_ctypes/libffi/src/x86/unix64.S deleted file mode 100644 index 45a0ed746..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/unix64.S +++ /dev/null @@ -1,432 +0,0 @@ -/* ----------------------------------------------------------------------- - unix64.S - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 2008 Red Hat, Inc - - Copyright (c) 2002 Bo Thorsen - - x86-64 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include - -.text - -/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)); - - Bit o trickiness here -- ARGS+BYTES is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 2 - .globl ffi_call_unix64 - .type ffi_call_unix64,@function - -ffi_call_unix64: -.LUW0: - movq (%rsp), %r10 /* Load return address. */ - leaq (%rdi, %rsi), %rax /* Find local stack base. */ - movq %rdx, (%rax) /* Save flags. */ - movq %rcx, 8(%rax) /* Save raddr. */ - movq %rbp, 16(%rax) /* Save old frame pointer. */ - movq %r10, 24(%rax) /* Relocate return address. */ - movq %rax, %rbp /* Finalize local stack frame. */ -.LUW1: - movq %rdi, %r10 /* Save a copy of the register area. */ - movq %r8, %r11 /* Save a copy of the target fn. */ - movl %r9d, %eax /* Set number of SSE registers. */ - - /* Load up all argument registers. */ - movq (%r10), %rdi - movq 8(%r10), %rsi - movq 16(%r10), %rdx - movq 24(%r10), %rcx - movq 32(%r10), %r8 - movq 40(%r10), %r9 - testl %eax, %eax - jnz .Lload_sse -.Lret_from_load_sse: - - /* Deallocate the reg arg area. */ - leaq 176(%r10), %rsp - - /* Call the user function. */ - call *%r11 - - /* Deallocate stack arg area; local stack frame in redzone. */ - leaq 24(%rbp), %rsp - - movq 0(%rbp), %rcx /* Reload flags. */ - movq 8(%rbp), %rdi /* Reload raddr. */ - movq 16(%rbp), %rbp /* Reload old frame pointer. */ -.LUW2: - - /* The first byte of the flags contains the FFI_TYPE. */ - movzbl %cl, %r10d - leaq .Lstore_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -.Lstore_table: - .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */ - .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */ - .long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */ - .long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */ - .long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */ - .long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */ - .long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */ - .long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */ - .long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */ - .long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */ - .long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */ - .long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */ - .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */ - .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */ - - .align 2 -.Lst_void: - ret - .align 2 - -.Lst_uint8: - movzbq %al, %rax - movq %rax, (%rdi) - ret - .align 2 -.Lst_sint8: - movsbq %al, %rax - movq %rax, (%rdi) - ret - .align 2 -.Lst_uint16: - movzwq %ax, %rax - movq %rax, (%rdi) - .align 2 -.Lst_sint16: - movswq %ax, %rax - movq %rax, (%rdi) - ret - .align 2 -.Lst_uint32: - movl %eax, %eax - movq %rax, (%rdi) - .align 2 -.Lst_sint32: - cltq - movq %rax, (%rdi) - ret - .align 2 -.Lst_int64: - movq %rax, (%rdi) - ret - - .align 2 -.Lst_float: - movss %xmm0, (%rdi) - ret - .align 2 -.Lst_double: - movsd %xmm0, (%rdi) - ret -.Lst_ldouble: - fstpt (%rdi) - ret - - .align 2 -.Lst_struct: - leaq -20(%rsp), %rsi /* Scratch area in redzone. */ - - /* We have to locate the values now, and since we don't want to - write too much data into the user's return value, we spill the - value to a 16 byte scratch area first. Bits 8, 9, and 10 - control where the values are located. Only one of the three - bits will be set; see ffi_prep_cif_machdep for the pattern. */ - movd %xmm0, %r10 - movd %xmm1, %r11 - testl $0x100, %ecx - cmovnz %rax, %rdx - cmovnz %r10, %rax - testl $0x200, %ecx - cmovnz %r10, %rdx - testl $0x400, %ecx - cmovnz %r10, %rax - cmovnz %r11, %rdx - movq %rax, (%rsi) - movq %rdx, 8(%rsi) - - /* Bits 12-31 contain the true size of the structure. Copy from - the scratch area to the true destination. */ - shrl $12, %ecx - rep movsb - ret - - /* Many times we can avoid loading any SSE registers at all. - It's not worth an indirect jump to load the exact set of - SSE registers needed; zero or all is a good compromise. */ - .align 2 -.LUW3: -.Lload_sse: - movdqa 48(%r10), %xmm0 - movdqa 64(%r10), %xmm1 - movdqa 80(%r10), %xmm2 - movdqa 96(%r10), %xmm3 - movdqa 112(%r10), %xmm4 - movdqa 128(%r10), %xmm5 - movdqa 144(%r10), %xmm6 - movdqa 160(%r10), %xmm7 - jmp .Lret_from_load_sse - -.LUW4: - .size ffi_call_unix64,.-ffi_call_unix64 - - .align 2 - .globl ffi_closure_unix64 - .type ffi_closure_unix64,@function - -ffi_closure_unix64: -.LUW5: - /* The carry flag is set by the trampoline iff SSE registers - are used. Don't clobber it before the branch instruction. */ - leaq -200(%rsp), %rsp -.LUW6: - movq %rdi, (%rsp) - movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - jc .Lsave_sse -.Lret_from_save_sse: - - movq %r10, %rdi - leaq 176(%rsp), %rsi - movq %rsp, %rdx - leaq 208(%rsp), %rcx - call ffi_closure_unix64_inner@PLT - - /* Deallocate stack frame early; return value is now in redzone. */ - addq $200, %rsp -.LUW7: - - /* The first byte of the return value contains the FFI_TYPE. */ - movzbl %al, %r10d - leaq .Lload_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -.Lload_table: - .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */ - .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */ - .long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */ - .long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */ - .long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */ - .long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */ - .long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */ - .long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */ - .long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */ - .long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */ - .long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */ - .long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */ - .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */ - .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */ - - .align 2 -.Lld_void: - ret - - .align 2 -.Lld_int8: - movzbl -24(%rsp), %eax - ret - .align 2 -.Lld_int16: - movzwl -24(%rsp), %eax - ret - .align 2 -.Lld_int32: - movl -24(%rsp), %eax - ret - .align 2 -.Lld_int64: - movq -24(%rsp), %rax - ret - - .align 2 -.Lld_float: - movss -24(%rsp), %xmm0 - ret - .align 2 -.Lld_double: - movsd -24(%rsp), %xmm0 - ret - .align 2 -.Lld_ldouble: - fldt -24(%rsp) - ret - - .align 2 -.Lld_struct: - /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, - %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading - both rdx and xmm1 with the second word. For the remaining, - bit 8 set means xmm0 gets the second word, and bit 9 means - that rax gets the second word. */ - movq -24(%rsp), %rcx - movq -16(%rsp), %rdx - movq -16(%rsp), %xmm1 - testl $0x100, %eax - cmovnz %rdx, %rcx - movd %rcx, %xmm0 - testl $0x200, %eax - movq -24(%rsp), %rax - cmovnz %rdx, %rax - ret - - /* See the comment above .Lload_sse; the same logic applies here. */ - .align 2 -.LUW8: -.Lsave_sse: - movdqa %xmm0, 48(%rsp) - movdqa %xmm1, 64(%rsp) - movdqa %xmm2, 80(%rsp) - movdqa %xmm3, 96(%rsp) - movdqa %xmm4, 112(%rsp) - movdqa %xmm5, 128(%rsp) - movdqa %xmm6, 144(%rsp) - movdqa %xmm7, 160(%rsp) - jmp .Lret_from_save_sse - -.LUW9: - .size ffi_closure_unix64,.-ffi_closure_unix64 - -#ifdef __GNUC__ -/* Only emit DWARF unwind info when building with the GNU toolchain. */ - -#ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE - .section .eh_frame,"a",@unwind -#else - .section .eh_frame,"a",@progbits -#endif -.Lframe1: - .long .LECIE1-.LSCIE1 /* CIE Length */ -.LSCIE1: - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .uleb128 1 /* CIE Code Alignment Factor */ - .sleb128 -8 /* CIE Data Alignment Factor */ - .byte 0x10 /* CIE RA Column */ - .uleb128 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .uleb128 7 - .uleb128 8 - .byte 0x80+16 /* DW_CFA_offset, %rip offset 1*-8 */ - .uleb128 1 - .align 8 -.LECIE1: -.LSFDE1: - .long .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .long .LASFDE1-.Lframe1 /* FDE CIE offset */ -#if HAVE_AS_X86_PCREL - .long .LUW0-. /* FDE initial location */ -#else - .long .LUW0@rel -#endif - .long .LUW4-.LUW0 /* FDE address range */ - .uleb128 0x0 /* Augmentation size */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW1-.LUW0 - - /* New stack frame based off rbp. This is an itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-8, so from the - perspective of the unwind info, it hasn't moved. */ - .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ - .uleb128 6 - .uleb128 32 - .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ - .uleb128 2 - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW2-.LUW1 - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .uleb128 7 - .uleb128 8 - .byte 0xc0+6 /* DW_CFA_restore, %rbp */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW3-.LUW2 - .byte 0xb /* DW_CFA_restore_state */ - - .align 8 -.LEFDE1: -.LSFDE3: - .long .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .long .LASFDE3-.Lframe1 /* FDE CIE offset */ -#if HAVE_AS_X86_PCREL - .long .LUW5-. /* FDE initial location */ -#else - .long .LUW5@rel -#endif - .long .LUW9-.LUW5 /* FDE address range */ - .uleb128 0x0 /* Augmentation size */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW6-.LUW5 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 208 - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW7-.LUW6 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 8 - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LUW8-.LUW7 - .byte 0xb /* DW_CFA_restore_state */ - - .align 8 -.LEFDE3: - -#endif /* __GNUC__ */ - -#endif /* __x86_64__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/win32.S b/third_party/python/Modules/_ctypes/libffi/src/x86/win32.S deleted file mode 100644 index daf0e799c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/win32.S +++ /dev/null @@ -1,1306 +0,0 @@ -/* ----------------------------------------------------------------------- - win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc. - Copyright (c) 2001 John Beniton - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2009 Daniel Witte - - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- - */ - -#define LIBFFI_ASM -#include -#include - -#define CIF_ABI_OFFSET 0 -#define CIF_BYTES_OFFSET 16 - -#ifdef _MSC_VER - -#define CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3) - -.386 -.MODEL FLAT, C - -EXTRN ffi_closure_SYSV_inner:NEAR - -_TEXT SEGMENT - -ffi_call_win32 PROC NEAR, - ffi_prep_args : NEAR PTR DWORD, - ecif : NEAR PTR DWORD, - cif_abi : DWORD, - cif_bytes : DWORD, - cif_flags : DWORD, - rvalue : NEAR PTR DWORD, - fn : NEAR PTR DWORD - - ;; Make room for all of the new args. - mov ecx, cif_bytes - sub esp, ecx - - mov eax, esp - - ;; Place all of the ffi_prep_args in position - push ecif - push eax - call ffi_prep_args - - ;; Return stack to previous state and call the function - add esp, 8 - - ;; Handle thiscall and fastcall - cmp cif_abi, 3 ;; FFI_THISCALL - jz do_thiscall - cmp cif_abi, 4 ;; FFI_FASTCALL - jnz do_stdcall - mov ecx, DWORD PTR [esp] - mov edx, DWORD PTR [esp+4] - add esp, 8 - jmp do_stdcall -do_thiscall: - mov ecx, DWORD PTR [esp] - add esp, 4 -do_stdcall: - call fn - - ;; cdecl: we restore esp in the epilogue, so there's no need to - ;; remove the space we pushed for the args. - ;; stdcall: the callee has already cleaned the stack. - - ;; Load ecx with the return type code - mov ecx, cif_flags - - ;; If the return value pointer is NULL, assume no return value. - cmp rvalue, 0 - jne ca_jumptable - - ;; Even if there is no space for the return value, we are - ;; obliged to handle floating-point values. - cmp ecx, FFI_TYPE_FLOAT - jne ca_epilogue - fstp st(0) - - jmp ca_epilogue - -ca_jumptable: - jmp [ca_jumpdata + 4 * ecx] -ca_jumpdata: - ;; Do not insert anything here between label and jump table. - dd offset ca_epilogue ;; FFI_TYPE_VOID - dd offset ca_retint ;; FFI_TYPE_INT - dd offset ca_retfloat ;; FFI_TYPE_FLOAT - dd offset ca_retdouble ;; FFI_TYPE_DOUBLE - dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE - dd offset ca_retuint8 ;; FFI_TYPE_UINT8 - dd offset ca_retsint8 ;; FFI_TYPE_SINT8 - dd offset ca_retuint16 ;; FFI_TYPE_UINT16 - dd offset ca_retsint16 ;; FFI_TYPE_SINT16 - dd offset ca_retint ;; FFI_TYPE_UINT32 - dd offset ca_retint ;; FFI_TYPE_SINT32 - dd offset ca_retint64 ;; FFI_TYPE_UINT64 - dd offset ca_retint64 ;; FFI_TYPE_SINT64 - dd offset ca_epilogue ;; FFI_TYPE_STRUCT - dd offset ca_retint ;; FFI_TYPE_POINTER - dd offset ca_retstruct1b ;; FFI_TYPE_SMALL_STRUCT_1B - dd offset ca_retstruct2b ;; FFI_TYPE_SMALL_STRUCT_2B - dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B - dd offset ca_epilogue ;; FFI_TYPE_MS_STRUCT - - /* Sign/zero extend as appropriate. */ -ca_retuint8: - movzx eax, al - jmp ca_retint - -ca_retsint8: - movsx eax, al - jmp ca_retint - -ca_retuint16: - movzx eax, ax - jmp ca_retint - -ca_retsint16: - movsx eax, ax - jmp ca_retint - -ca_retint: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - mov [ecx + 0], eax - jmp ca_epilogue - -ca_retint64: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - mov [ecx + 0], eax - mov [ecx + 4], edx - jmp ca_epilogue - -ca_retfloat: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - fstp DWORD PTR [ecx] - jmp ca_epilogue - -ca_retdouble: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - fstp QWORD PTR [ecx] - jmp ca_epilogue - -ca_retlongdouble: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - fstp TBYTE PTR [ecx] - jmp ca_epilogue - -ca_retstruct1b: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - mov [ecx + 0], al - jmp ca_epilogue - -ca_retstruct2b: - ;; Load %ecx with the pointer to storage for the return value - mov ecx, rvalue - mov [ecx + 0], ax - jmp ca_epilogue - -ca_epilogue: - ;; Epilogue code is autogenerated. - ret -ffi_call_win32 ENDP - -ffi_closure_THISCALL PROC NEAR - ;; Insert the register argument on the stack as the first argument - xchg DWORD PTR [esp+4], ecx - xchg DWORD PTR [esp], ecx - push ecx - jmp ffi_closure_STDCALL -ffi_closure_THISCALL ENDP - -ffi_closure_FASTCALL PROC NEAR - ;; Insert the register argument on the stack as the first argument - xchg DWORD PTR [esp+4], edx - xchg DWORD PTR [esp], ecx - push edx - push ecx - jmp ffi_closure_STDCALL -ffi_closure_FASTCALL ENDP - -ffi_closure_SYSV PROC NEAR FORCEFRAME - ;; the ffi_closure ctx is passed in eax by the trampoline. - - sub esp, 40 - lea edx, [ebp - 24] - mov [ebp - 12], edx ;; resp - lea edx, [ebp + 8] -stub:: - mov [esp + 8], edx ;; args - lea edx, [ebp - 12] - mov [esp + 4], edx ;; &resp - mov [esp], eax ;; closure - call ffi_closure_SYSV_inner - mov ecx, [ebp - 12] - -cs_jumptable: - jmp [cs_jumpdata + 4 * eax] -cs_jumpdata: - ;; Do not insert anything here between the label and jump table. - dd offset cs_epilogue ;; FFI_TYPE_VOID - dd offset cs_retint ;; FFI_TYPE_INT - dd offset cs_retfloat ;; FFI_TYPE_FLOAT - dd offset cs_retdouble ;; FFI_TYPE_DOUBLE - dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE - dd offset cs_retuint8 ;; FFI_TYPE_UINT8 - dd offset cs_retsint8 ;; FFI_TYPE_SINT8 - dd offset cs_retuint16 ;; FFI_TYPE_UINT16 - dd offset cs_retsint16 ;; FFI_TYPE_SINT16 - dd offset cs_retint ;; FFI_TYPE_UINT32 - dd offset cs_retint ;; FFI_TYPE_SINT32 - dd offset cs_retint64 ;; FFI_TYPE_UINT64 - dd offset cs_retint64 ;; FFI_TYPE_SINT64 - dd offset cs_retstruct ;; FFI_TYPE_STRUCT - dd offset cs_retint ;; FFI_TYPE_POINTER - dd offset cs_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B - dd offset cs_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B - dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B - dd offset cs_retmsstruct ;; FFI_TYPE_MS_STRUCT - -cs_retuint8: - movzx eax, BYTE PTR [ecx] - jmp cs_epilogue - -cs_retsint8: - movsx eax, BYTE PTR [ecx] - jmp cs_epilogue - -cs_retuint16: - movzx eax, WORD PTR [ecx] - jmp cs_epilogue - -cs_retsint16: - movsx eax, WORD PTR [ecx] - jmp cs_epilogue - -cs_retint: - mov eax, [ecx] - jmp cs_epilogue - -cs_retint64: - mov eax, [ecx + 0] - mov edx, [ecx + 4] - jmp cs_epilogue - -cs_retfloat: - fld DWORD PTR [ecx] - jmp cs_epilogue - -cs_retdouble: - fld QWORD PTR [ecx] - jmp cs_epilogue - -cs_retlongdouble: - fld TBYTE PTR [ecx] - jmp cs_epilogue - -cs_retstruct: - ;; Caller expects us to pop struct return value pointer hidden arg. - ;; Epilogue code is autogenerated. - ret 4 - -cs_retmsstruct: - ;; Caller expects us to return a pointer to the real return value. - mov eax, ecx - ;; Caller doesn't expects us to pop struct return value pointer hidden arg. - jmp cs_epilogue - -cs_epilogue: - ;; Epilogue code is autogenerated. - ret -ffi_closure_SYSV ENDP - -#if !FFI_NO_RAW_API - -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#define CIF_FLAGS_OFFSET 20 - -ffi_closure_raw_THISCALL PROC NEAR USES esi FORCEFRAME - sub esp, 36 - mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif - mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data - mov [esp + 12], edx - lea edx, [ebp + 12] - jmp stubraw -ffi_closure_raw_THISCALL ENDP - -ffi_closure_raw_SYSV PROC NEAR USES esi FORCEFRAME - ;; the ffi_closure ctx is passed in eax by the trampoline. - - sub esp, 40 - mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif - mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data - mov [esp + 12], edx ;; user_data - lea edx, [ebp + 8] -stubraw:: - mov [esp + 8], edx ;; raw_args - lea edx, [ebp - 24] - mov [esp + 4], edx ;; &res - mov [esp], esi ;; cif - call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun - mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags - lea ecx, [ebp - 24] - -cr_jumptable: - jmp [cr_jumpdata + 4 * eax] -cr_jumpdata: - ;; Do not insert anything here between the label and jump table. - dd offset cr_epilogue ;; FFI_TYPE_VOID - dd offset cr_retint ;; FFI_TYPE_INT - dd offset cr_retfloat ;; FFI_TYPE_FLOAT - dd offset cr_retdouble ;; FFI_TYPE_DOUBLE - dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE - dd offset cr_retuint8 ;; FFI_TYPE_UINT8 - dd offset cr_retsint8 ;; FFI_TYPE_SINT8 - dd offset cr_retuint16 ;; FFI_TYPE_UINT16 - dd offset cr_retsint16 ;; FFI_TYPE_SINT16 - dd offset cr_retint ;; FFI_TYPE_UINT32 - dd offset cr_retint ;; FFI_TYPE_SINT32 - dd offset cr_retint64 ;; FFI_TYPE_UINT64 - dd offset cr_retint64 ;; FFI_TYPE_SINT64 - dd offset cr_epilogue ;; FFI_TYPE_STRUCT - dd offset cr_retint ;; FFI_TYPE_POINTER - dd offset cr_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B - dd offset cr_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B - dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B - dd offset cr_epilogue ;; FFI_TYPE_MS_STRUCT - -cr_retuint8: - movzx eax, BYTE PTR [ecx] - jmp cr_epilogue - -cr_retsint8: - movsx eax, BYTE PTR [ecx] - jmp cr_epilogue - -cr_retuint16: - movzx eax, WORD PTR [ecx] - jmp cr_epilogue - -cr_retsint16: - movsx eax, WORD PTR [ecx] - jmp cr_epilogue - -cr_retint: - mov eax, [ecx] - jmp cr_epilogue - -cr_retint64: - mov eax, [ecx + 0] - mov edx, [ecx + 4] - jmp cr_epilogue - -cr_retfloat: - fld DWORD PTR [ecx] - jmp cr_epilogue - -cr_retdouble: - fld QWORD PTR [ecx] - jmp cr_epilogue - -cr_retlongdouble: - fld TBYTE PTR [ecx] - jmp cr_epilogue - -cr_epilogue: - ;; Epilogue code is autogenerated. - ret -ffi_closure_raw_SYSV ENDP - -#endif /* !FFI_NO_RAW_API */ - -ffi_closure_STDCALL PROC NEAR FORCEFRAME - ;; the ffi_closure ctx is passed in eax by the trampoline. - - sub esp, 40 - lea edx, [ebp - 24] - mov [ebp - 12], edx ;; resp - lea edx, [ebp + 12] ;; account for stub return address on stack - mov [esp + 8], edx ;; args - lea edx, [ebp - 12] - mov [esp + 4], edx ;; &resp - mov [esp], eax ;; closure - call ffi_closure_SYSV_inner - mov ecx, [ebp - 12] - -cd_jumptable: - jmp [cd_jumpdata + 4 * eax] -cd_jumpdata: - ;; Do not insert anything here between the label and jump table. - dd offset cd_epilogue ;; FFI_TYPE_VOID - dd offset cd_retint ;; FFI_TYPE_INT - dd offset cd_retfloat ;; FFI_TYPE_FLOAT - dd offset cd_retdouble ;; FFI_TYPE_DOUBLE - dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE - dd offset cd_retuint8 ;; FFI_TYPE_UINT8 - dd offset cd_retsint8 ;; FFI_TYPE_SINT8 - dd offset cd_retuint16 ;; FFI_TYPE_UINT16 - dd offset cd_retsint16 ;; FFI_TYPE_SINT16 - dd offset cd_retint ;; FFI_TYPE_UINT32 - dd offset cd_retint ;; FFI_TYPE_SINT32 - dd offset cd_retint64 ;; FFI_TYPE_UINT64 - dd offset cd_retint64 ;; FFI_TYPE_SINT64 - dd offset cd_epilogue ;; FFI_TYPE_STRUCT - dd offset cd_retint ;; FFI_TYPE_POINTER - dd offset cd_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B - dd offset cd_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B - dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B - -cd_retuint8: - movzx eax, BYTE PTR [ecx] - jmp cd_epilogue - -cd_retsint8: - movsx eax, BYTE PTR [ecx] - jmp cd_epilogue - -cd_retuint16: - movzx eax, WORD PTR [ecx] - jmp cd_epilogue - -cd_retsint16: - movsx eax, WORD PTR [ecx] - jmp cd_epilogue - -cd_retint: - mov eax, [ecx] - jmp cd_epilogue - -cd_retint64: - mov eax, [ecx + 0] - mov edx, [ecx + 4] - jmp cd_epilogue - -cd_retfloat: - fld DWORD PTR [ecx] - jmp cd_epilogue - -cd_retdouble: - fld QWORD PTR [ecx] - jmp cd_epilogue - -cd_retlongdouble: - fld TBYTE PTR [ecx] - jmp cd_epilogue - -cd_epilogue: - mov esp, ebp - pop ebp - pop ecx - pop edx - mov ecx, DWORD PTR [ecx + (CLOSURE_CIF_OFFSET-10)] - add esp, DWORD PTR [ecx + CIF_BYTES_OFFSET] - mov ecx, DWORD PTR [ecx + CIF_ABI_OFFSET] - cmp ecx, 3 - je cd_thiscall - cmp ecx, 4 - jne cd_not_fastcall - - add esp, 4 -cd_thiscall: - add esp, 4 -cd_not_fastcall: - jmp edx -ffi_closure_STDCALL ENDP - -_TEXT ENDS -END - -#else - -#define CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) - -#if defined(SYMBOL_UNDERSCORE) -#define USCORE_SYMBOL(x) _##x -#else -#define USCORE_SYMBOL(x) x -#endif - .text - - # This assumes we are using gas. - .balign 16 -FFI_HIDDEN(ffi_call_win32) - .globl USCORE_SYMBOL(ffi_call_win32) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_call_win32; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_call_win32): -.LFB1: - pushl %ebp -.LCFI0: - movl %esp,%ebp -.LCFI1: - # Make room for all of the new args. - movl 20(%ebp),%ecx - subl %ecx,%esp - - movl %esp,%eax - - # Place all of the ffi_prep_args in position - pushl 12(%ebp) - pushl %eax - call *8(%ebp) - - # Return stack to previous state and call the function - addl $8,%esp - - # Handle fastcall and thiscall - cmpl $3, 16(%ebp) # FFI_THISCALL - jz .do_thiscall - cmpl $4, 16(%ebp) # FFI_FASTCALL - jnz .do_fncall - movl (%esp), %ecx - movl 4(%esp), %edx - addl $8, %esp - jmp .do_fncall -.do_thiscall: - movl (%esp), %ecx - addl $4, %esp - -.do_fncall: - - # FIXME: Align the stack to a 128-bit boundary to avoid - # potential performance hits. - - call *32(%ebp) - - # stdcall functions pop arguments off the stack themselves - - # Load %ecx with the return type code - movl 24(%ebp),%ecx - - # If the return value pointer is NULL, assume no return value. - cmpl $0,28(%ebp) - jne 0f - - # Even if there is no space for the return value, we are - # obliged to handle floating-point values. - cmpl $FFI_TYPE_FLOAT,%ecx - jne .Lnoretval - fstp %st(0) - - jmp .Lepilogue - -0: - call 1f - # Do not insert anything here between the call and the jump table. -.Lstore_table: - .long .Lnoretval-.Lstore_table /* FFI_TYPE_VOID */ - .long .Lretint-.Lstore_table /* FFI_TYPE_INT */ - .long .Lretfloat-.Lstore_table /* FFI_TYPE_FLOAT */ - .long .Lretdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ - .long .Lretlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lretuint8-.Lstore_table /* FFI_TYPE_UINT8 */ - .long .Lretsint8-.Lstore_table /* FFI_TYPE_SINT8 */ - .long .Lretuint16-.Lstore_table /* FFI_TYPE_UINT16 */ - .long .Lretsint16-.Lstore_table /* FFI_TYPE_SINT16 */ - .long .Lretint-.Lstore_table /* FFI_TYPE_UINT32 */ - .long .Lretint-.Lstore_table /* FFI_TYPE_SINT32 */ - .long .Lretint64-.Lstore_table /* FFI_TYPE_UINT64 */ - .long .Lretint64-.Lstore_table /* FFI_TYPE_SINT64 */ - .long .Lretstruct-.Lstore_table /* FFI_TYPE_STRUCT */ - .long .Lretint-.Lstore_table /* FFI_TYPE_POINTER */ - .long .Lretstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long .Lretstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ - .long .Lretstruct4b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_4B */ - .long .Lretstruct-.Lstore_table /* FFI_TYPE_MS_STRUCT */ -1: - shl $2, %ecx - add (%esp),%ecx - mov (%ecx),%ecx - add (%esp),%ecx - add $4, %esp - jmp *%ecx - - /* Sign/zero extend as appropriate. */ -.Lretsint8: - movsbl %al, %eax - jmp .Lretint - -.Lretsint16: - movswl %ax, %eax - jmp .Lretint - -.Lretuint8: - movzbl %al, %eax - jmp .Lretint - -.Lretuint16: - movzwl %ax, %eax - jmp .Lretint - -.Lretint: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - movl %eax,0(%ecx) - jmp .Lepilogue - -.Lretfloat: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - fstps (%ecx) - jmp .Lepilogue - -.Lretdouble: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - fstpl (%ecx) - jmp .Lepilogue - -.Lretlongdouble: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - fstpt (%ecx) - jmp .Lepilogue - -.Lretint64: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - movl %eax,0(%ecx) - movl %edx,4(%ecx) - jmp .Lepilogue - -.Lretstruct1b: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - movb %al,0(%ecx) - jmp .Lepilogue - -.Lretstruct2b: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - movw %ax,0(%ecx) - jmp .Lepilogue - -.Lretstruct4b: - # Load %ecx with the pointer to storage for the return value - movl 28(%ebp),%ecx - movl %eax,0(%ecx) - jmp .Lepilogue - -.Lretstruct: - # Nothing to do! - -.Lnoretval: -.Lepilogue: - movl %ebp,%esp - popl %ebp - ret -.ffi_call_win32_end: - .balign 16 -FFI_HIDDEN(ffi_closure_THISCALL) - .globl USCORE_SYMBOL(ffi_closure_THISCALL) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_THISCALL): - /* Insert the register argument on the stack as the first argument */ - xchg %ecx, 4(%esp) - xchg %ecx, (%esp) - push %ecx - jmp .ffi_closure_STDCALL_internal - - .balign 16 -FFI_HIDDEN(ffi_closure_FASTCALL) - .globl USCORE_SYMBOL(ffi_closure_FASTCALL) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_FASTCALL; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_FASTCALL): - /* Insert the register arguments on the stack as the first two arguments */ - xchg %edx, 4(%esp) - xchg %ecx, (%esp) - push %edx - push %ecx - jmp .ffi_closure_STDCALL_internal -.LFE1: - - # This assumes we are using gas. - .balign 16 -FFI_HIDDEN(ffi_closure_SYSV) -#if defined(X86_WIN32) - .globl USCORE_SYMBOL(ffi_closure_SYSV) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_SYSV; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_SYSV): -#endif -.LFB3: - pushl %ebp -.LCFI4: - movl %esp, %ebp -.LCFI5: - subl $40, %esp - leal -24(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 8(%ebp), %edx - movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ -#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__) - call USCORE_SYMBOL(ffi_closure_SYSV_inner) -#elif defined(X86_DARWIN) - calll L_ffi_closure_SYSV_inner$stub -#else - movl %ebx, 8(%esp) - call 1f -1: popl %ebx - addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx - call ffi_closure_SYSV_inner@PLT - movl 8(%esp), %ebx -#endif - movl -12(%ebp), %ecx - -0: - call 1f - # Do not insert anything here between the call and the jump table. -.Lcls_store_table: - .long .Lcls_noretval-.Lcls_store_table /* FFI_TYPE_VOID */ - .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_INT */ - .long .Lcls_retfloat-.Lcls_store_table /* FFI_TYPE_FLOAT */ - .long .Lcls_retdouble-.Lcls_store_table /* FFI_TYPE_DOUBLE */ - .long .Lcls_retldouble-.Lcls_store_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lcls_retuint8-.Lcls_store_table /* FFI_TYPE_UINT8 */ - .long .Lcls_retsint8-.Lcls_store_table /* FFI_TYPE_SINT8 */ - .long .Lcls_retuint16-.Lcls_store_table /* FFI_TYPE_UINT16 */ - .long .Lcls_retsint16-.Lcls_store_table /* FFI_TYPE_SINT16 */ - .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_UINT32 */ - .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_SINT32 */ - .long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_UINT64 */ - .long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_SINT64 */ - .long .Lcls_retstruct-.Lcls_store_table /* FFI_TYPE_STRUCT */ - .long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_POINTER */ - .long .Lcls_retstruct1-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long .Lcls_retstruct2-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ - .long .Lcls_retstruct4-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ - .long .Lcls_retmsstruct-.Lcls_store_table /* FFI_TYPE_MS_STRUCT */ - -1: - shl $2, %eax - add (%esp),%eax - mov (%eax),%eax - add (%esp),%eax - add $4, %esp - jmp *%eax - - /* Sign/zero extend as appropriate. */ -.Lcls_retsint8: - movsbl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retsint16: - movswl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retuint8: - movzbl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retuint16: - movzwl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retint: - movl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retfloat: - flds (%ecx) - jmp .Lcls_epilogue - -.Lcls_retdouble: - fldl (%ecx) - jmp .Lcls_epilogue - -.Lcls_retldouble: - fldt (%ecx) - jmp .Lcls_epilogue - -.Lcls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp .Lcls_epilogue - -.Lcls_retstruct1: - movsbl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retstruct2: - movswl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retstruct4: - movl (%ecx), %eax - jmp .Lcls_epilogue - -.Lcls_retstruct: - # Caller expects us to pop struct return value pointer hidden arg. - movl %ebp, %esp - popl %ebp - ret $0x4 - -.Lcls_retmsstruct: - # Caller expects us to return a pointer to the real return value. - mov %ecx, %eax - # Caller doesn't expects us to pop struct return value pointer hidden arg. - jmp .Lcls_epilogue - -.Lcls_noretval: -.Lcls_epilogue: - movl %ebp, %esp - popl %ebp - ret -.ffi_closure_SYSV_end: -.LFE3: - -#if !FFI_NO_RAW_API - -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#define CIF_FLAGS_OFFSET 20 - -#ifdef X86_WIN32 - .balign 16 -FFI_HIDDEN(ffi_closure_raw_THISCALL) - .globl USCORE_SYMBOL(ffi_closure_raw_THISCALL) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_raw_THISCALL): - pushl %ebp - movl %esp, %ebp - pushl %esi - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */ - jmp .stubraw -#endif /* X86_WIN32 */ - - # This assumes we are using gas. - .balign 16 -#if defined(X86_WIN32) - .globl USCORE_SYMBOL(ffi_closure_raw_SYSV) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_raw_SYSV): -#endif /* defined(X86_WIN32) */ -.LFB4: - pushl %ebp -.LCFI6: - movl %esp, %ebp -.LCFI7: - pushl %esi -.LCFI8: - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ -.stubraw: - movl %edx, 8(%esp) /* raw_args */ - leal -24(%ebp), %edx - movl %edx, 4(%esp) /* &res */ - movl %esi, (%esp) /* cif */ - call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ - movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ -0: - call 1f - # Do not insert anything here between the call and the jump table. -.Lrcls_store_table: - .long .Lrcls_noretval-.Lrcls_store_table /* FFI_TYPE_VOID */ - .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_INT */ - .long .Lrcls_retfloat-.Lrcls_store_table /* FFI_TYPE_FLOAT */ - .long .Lrcls_retdouble-.Lrcls_store_table /* FFI_TYPE_DOUBLE */ - .long .Lrcls_retldouble-.Lrcls_store_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lrcls_retuint8-.Lrcls_store_table /* FFI_TYPE_UINT8 */ - .long .Lrcls_retsint8-.Lrcls_store_table /* FFI_TYPE_SINT8 */ - .long .Lrcls_retuint16-.Lrcls_store_table /* FFI_TYPE_UINT16 */ - .long .Lrcls_retsint16-.Lrcls_store_table /* FFI_TYPE_SINT16 */ - .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_UINT32 */ - .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_SINT32 */ - .long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_UINT64 */ - .long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_SINT64 */ - .long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_STRUCT */ - .long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_POINTER */ - .long .Lrcls_retstruct1-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long .Lrcls_retstruct2-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ - .long .Lrcls_retstruct4-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ - .long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_MS_STRUCT */ -1: - shl $2, %eax - add (%esp),%eax - mov (%eax),%eax - add (%esp),%eax - add $4, %esp - jmp *%eax - - /* Sign/zero extend as appropriate. */ -.Lrcls_retsint8: - movsbl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retsint16: - movswl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retuint8: - movzbl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retuint16: - movzwl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retint: - movl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retfloat: - flds -24(%ebp) - jmp .Lrcls_epilogue - -.Lrcls_retdouble: - fldl -24(%ebp) - jmp .Lrcls_epilogue - -.Lrcls_retldouble: - fldt -24(%ebp) - jmp .Lrcls_epilogue - -.Lrcls_retllong: - movl -24(%ebp), %eax - movl -20(%ebp), %edx - jmp .Lrcls_epilogue - -.Lrcls_retstruct1: - movsbl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retstruct2: - movswl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retstruct4: - movl -24(%ebp), %eax - jmp .Lrcls_epilogue - -.Lrcls_retstruct: - # Nothing to do! - -.Lrcls_noretval: -.Lrcls_epilogue: - addl $36, %esp - popl %esi - popl %ebp - ret -.ffi_closure_raw_SYSV_end: -.LFE4: - -#endif /* !FFI_NO_RAW_API */ - - # This assumes we are using gas. - .balign 16 -FFI_HIDDEN(ffi_closure_STDCALL) - .globl USCORE_SYMBOL(ffi_closure_STDCALL) -#if defined(X86_WIN32) && !defined(__OS2__) - .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef -#endif -USCORE_SYMBOL(ffi_closure_STDCALL): -.ffi_closure_STDCALL_internal: -.LFB5: - pushl %ebp -.LCFI9: - movl %esp, %ebp -.LCFI10: - subl $40, %esp - leal -24(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 12(%ebp), %edx /* account for stub return address on stack */ - movl %edx, 4(%esp) /* args */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ -#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__) - call USCORE_SYMBOL(ffi_closure_SYSV_inner) -#elif defined(X86_DARWIN) - calll L_ffi_closure_SYSV_inner$stub -#else - movl %ebx, 8(%esp) - call 1f -1: popl %ebx - addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx - call ffi_closure_SYSV_inner@PLT - movl 8(%esp), %ebx -#endif - movl -12(%ebp), %ecx -0: - call 1f - # Do not insert anything here between the call and the jump table. -.Lscls_store_table: - .long .Lscls_noretval-.Lscls_store_table /* FFI_TYPE_VOID */ - .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_INT */ - .long .Lscls_retfloat-.Lscls_store_table /* FFI_TYPE_FLOAT */ - .long .Lscls_retdouble-.Lscls_store_table /* FFI_TYPE_DOUBLE */ - .long .Lscls_retldouble-.Lscls_store_table /* FFI_TYPE_LONGDOUBLE */ - .long .Lscls_retuint8-.Lscls_store_table /* FFI_TYPE_UINT8 */ - .long .Lscls_retsint8-.Lscls_store_table /* FFI_TYPE_SINT8 */ - .long .Lscls_retuint16-.Lscls_store_table /* FFI_TYPE_UINT16 */ - .long .Lscls_retsint16-.Lscls_store_table /* FFI_TYPE_SINT16 */ - .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_UINT32 */ - .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_SINT32 */ - .long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_UINT64 */ - .long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_SINT64 */ - .long .Lscls_retstruct-.Lscls_store_table /* FFI_TYPE_STRUCT */ - .long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_POINTER */ - .long .Lscls_retstruct1-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */ - .long .Lscls_retstruct2-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */ - .long .Lscls_retstruct4-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */ -1: - shl $2, %eax - add (%esp),%eax - mov (%eax),%eax - add (%esp),%eax - add $4, %esp - jmp *%eax - - /* Sign/zero extend as appropriate. */ -.Lscls_retsint8: - movsbl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retsint16: - movswl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retuint8: - movzbl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retuint16: - movzwl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retint: - movl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retfloat: - flds (%ecx) - jmp .Lscls_epilogue - -.Lscls_retdouble: - fldl (%ecx) - jmp .Lscls_epilogue - -.Lscls_retldouble: - fldt (%ecx) - jmp .Lscls_epilogue - -.Lscls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp .Lscls_epilogue - -.Lscls_retstruct1: - movsbl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retstruct2: - movswl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retstruct4: - movl (%ecx), %eax - jmp .Lscls_epilogue - -.Lscls_retstruct: - # Nothing to do! - -.Lscls_noretval: -.Lscls_epilogue: - movl %ebp, %esp - popl %ebp - popl %ecx - popl %edx - movl (CLOSURE_CIF_OFFSET-10)(%ecx), %ecx - addl CIF_BYTES_OFFSET(%ecx), %esp - movl CIF_ABI_OFFSET(%ecx), %ecx - cmpl $3, %ecx /* FFI_THISCALL */ - je 1f - cmpl $4, %ecx /* FFI_FASTCALL */ - jne 2f - - addl $4, %esp -1: addl $4, %esp -2: jmp *%edx -.ffi_closure_STDCALL_end: -.LFE5: - -#if defined(X86_DARWIN) -.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 -L_ffi_closure_SYSV_inner$stub: - .indirect_symbol _ffi_closure_SYSV_inner - hlt ; hlt ; hlt ; hlt ; hlt -#endif - -#if defined(X86_WIN32) && !defined(__OS2__) - .section .eh_frame,"w" -#endif -.Lframe1: -.LSCIE1: - .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */ -.LASCIE1: - .long 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef __PIC__ - .ascii "zR\0" /* CIE Augmentation */ -#else - .ascii "\0" /* CIE Augmentation */ -#endif - .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ -#ifdef __PIC__ - .byte 0x1 /* .uleb128 0x1; Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ -#endif - .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x4 /* .uleb128 0x4 */ - .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */ - .byte 0x1 /* .uleb128 0x1 */ - .align 4 -.LECIE1: - -.LSFDE1: - .long .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .long .LASFDE1-.Lframe1 /* FDE CIE offset */ -#if defined __PIC__ && defined HAVE_AS_X86_PCREL - .long .LFB1-. /* FDE initial location */ -#else - .long .LFB1 -#endif - .long .LFE1-.LFB1 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - /* DW_CFA_xxx CFI instructions go here. */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI0-.LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ - .byte 0x2 /* .uleb128 0x2 */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI1-.LCFI0 - .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ - .byte 0x5 /* .uleb128 0x5 */ - - /* End of DW_CFA_xxx CFI instructions. */ - .align 4 -.LEFDE1: - -.LSFDE3: - .long .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .long .LASFDE3-.Lframe1 /* FDE CIE offset */ -#if defined __PIC__ && defined HAVE_AS_X86_PCREL - .long .LFB3-. /* FDE initial location */ -#else - .long .LFB3 -#endif - .long .LFE3-.LFB3 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - /* DW_CFA_xxx CFI instructions go here. */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI4-.LFB3 - .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ - .byte 0x2 /* .uleb128 0x2 */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI5-.LCFI4 - .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ - .byte 0x5 /* .uleb128 0x5 */ - - /* End of DW_CFA_xxx CFI instructions. */ - .align 4 -.LEFDE3: - -#if !FFI_NO_RAW_API - -.LSFDE4: - .long .LEFDE4-.LASFDE4 /* FDE Length */ -.LASFDE4: - .long .LASFDE4-.Lframe1 /* FDE CIE offset */ -#if defined __PIC__ && defined HAVE_AS_X86_PCREL - .long .LFB4-. /* FDE initial location */ -#else - .long .LFB4 -#endif - .long .LFE4-.LFB4 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - /* DW_CFA_xxx CFI instructions go here. */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI6-.LFB4 - .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ - .byte 0x2 /* .uleb128 0x2 */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI7-.LCFI6 - .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ - .byte 0x5 /* .uleb128 0x5 */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI8-.LCFI7 - .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */ - .byte 0x3 /* .uleb128 0x3 */ - - /* End of DW_CFA_xxx CFI instructions. */ - .align 4 -.LEFDE4: - -#endif /* !FFI_NO_RAW_API */ - -.LSFDE5: - .long .LEFDE5-.LASFDE5 /* FDE Length */ -.LASFDE5: - .long .LASFDE5-.Lframe1 /* FDE CIE offset */ -#if defined __PIC__ && defined HAVE_AS_X86_PCREL - .long .LFB5-. /* FDE initial location */ -#else - .long .LFB5 -#endif - .long .LFE5-.LFB5 /* FDE address range */ -#ifdef __PIC__ - .byte 0x0 /* .uleb128 0x0; Augmentation size */ -#endif - /* DW_CFA_xxx CFI instructions go here. */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI9-.LFB5 - .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ - .byte 0x8 /* .uleb128 0x8 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ - .byte 0x2 /* .uleb128 0x2 */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .long .LCFI10-.LCFI9 - .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ - .byte 0x5 /* .uleb128 0x5 */ - - /* End of DW_CFA_xxx CFI instructions. */ - .align 4 -.LEFDE5: - -#endif /* !_MSC_VER */ - diff --git a/third_party/python/Modules/_ctypes/libffi/src/x86/win64.S b/third_party/python/Modules/_ctypes/libffi/src/x86/win64.S deleted file mode 100644 index fcdb270fa..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/x86/win64.S +++ /dev/null @@ -1,468 +0,0 @@ -#define LIBFFI_ASM -#include -#include - -/* Constants for ffi_call_win64 */ -#define STACK 0 -#define PREP_ARGS_FN 32 -#define ECIF 40 -#define CIF_BYTES 48 -#define CIF_FLAGS 56 -#define RVALUE 64 -#define FN 72 - -/* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *), - extended_cif *ecif, unsigned bytes, unsigned flags, - unsigned *rvalue, void (*fn)()); - */ - -#ifdef _MSC_VER -PUBLIC ffi_call_win64 - -EXTRN __chkstk:NEAR -EXTRN ffi_closure_win64_inner:NEAR - -_TEXT SEGMENT - -;;; ffi_closure_win64 will be called with these registers set: -;;; rax points to 'closure' -;;; r11 contains a bit mask that specifies which of the -;;; first four parameters are float or double -;;; -;;; It must move the parameters passed in registers to their stack location, -;;; call ffi_closure_win64_inner for the actual work, then return the result. -;;; -ffi_closure_win64 PROC FRAME - ;; copy register arguments onto stack - test r11, 1 - jne first_is_float - mov QWORD PTR [rsp+8], rcx - jmp second -first_is_float: - movlpd QWORD PTR [rsp+8], xmm0 - -second: - test r11, 2 - jne second_is_float - mov QWORD PTR [rsp+16], rdx - jmp third -second_is_float: - movlpd QWORD PTR [rsp+16], xmm1 - -third: - test r11, 4 - jne third_is_float - mov QWORD PTR [rsp+24], r8 - jmp fourth -third_is_float: - movlpd QWORD PTR [rsp+24], xmm2 - -fourth: - test r11, 8 - jne fourth_is_float - mov QWORD PTR [rsp+32], r9 - jmp done -fourth_is_float: - movlpd QWORD PTR [rsp+32], xmm3 - -done: - .ALLOCSTACK 40 - sub rsp, 40 - .ENDPROLOG - mov rcx, rax ; context is first parameter - mov rdx, rsp ; stack is second parameter - add rdx, 48 ; point to start of arguments - mov rax, ffi_closure_win64_inner - call rax ; call the real closure function - add rsp, 40 - movd xmm0, rax ; If the closure returned a float, - ; ffi_closure_win64_inner wrote it to rax - ret 0 -ffi_closure_win64 ENDP - -ffi_call_win64 PROC FRAME - ;; copy registers onto stack - mov QWORD PTR [rsp+32], r9 - mov QWORD PTR [rsp+24], r8 - mov QWORD PTR [rsp+16], rdx - mov QWORD PTR [rsp+8], rcx - .PUSHREG rbp - push rbp - .ALLOCSTACK 48 - sub rsp, 48 ; 00000030H - .SETFRAME rbp, 32 - lea rbp, QWORD PTR [rsp+32] - .ENDPROLOG - - mov eax, DWORD PTR CIF_BYTES[rbp] - add rax, 15 - and rax, -16 - call __chkstk - sub rsp, rax - lea rax, QWORD PTR [rsp+32] - mov QWORD PTR STACK[rbp], rax - - mov rdx, QWORD PTR ECIF[rbp] - mov rcx, QWORD PTR STACK[rbp] - call QWORD PTR PREP_ARGS_FN[rbp] - - mov rsp, QWORD PTR STACK[rbp] - - movlpd xmm3, QWORD PTR [rsp+24] - movd r9, xmm3 - - movlpd xmm2, QWORD PTR [rsp+16] - movd r8, xmm2 - - movlpd xmm1, QWORD PTR [rsp+8] - movd rdx, xmm1 - - movlpd xmm0, QWORD PTR [rsp] - movd rcx, xmm0 - - call QWORD PTR FN[rbp] -ret_struct4b$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B - jne ret_struct2b$ - - mov rcx, QWORD PTR RVALUE[rbp] - mov DWORD PTR [rcx], eax - jmp ret_void$ - -ret_struct2b$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B - jne ret_struct1b$ - - mov rcx, QWORD PTR RVALUE[rbp] - mov WORD PTR [rcx], ax - jmp ret_void$ - -ret_struct1b$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B - jne ret_uint8$ - - mov rcx, QWORD PTR RVALUE[rbp] - mov BYTE PTR [rcx], al - jmp ret_void$ - -ret_uint8$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8 - jne ret_sint8$ - - mov rcx, QWORD PTR RVALUE[rbp] - movzx rax, al - mov QWORD PTR [rcx], rax - jmp ret_void$ - -ret_sint8$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8 - jne ret_uint16$ - - mov rcx, QWORD PTR RVALUE[rbp] - movsx rax, al - mov QWORD PTR [rcx], rax - jmp ret_void$ - -ret_uint16$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16 - jne ret_sint16$ - - mov rcx, QWORD PTR RVALUE[rbp] - movzx rax, ax - mov QWORD PTR [rcx], rax - jmp SHORT ret_void$ - -ret_sint16$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16 - jne ret_uint32$ - - mov rcx, QWORD PTR RVALUE[rbp] - movsx rax, ax - mov QWORD PTR [rcx], rax - jmp SHORT ret_void$ - -ret_uint32$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32 - jne ret_sint32$ - - mov rcx, QWORD PTR RVALUE[rbp] - mov eax, eax - mov QWORD PTR [rcx], rax - jmp SHORT ret_void$ - -ret_sint32$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32 - jne ret_float$ - - mov rcx, QWORD PTR RVALUE[rbp] - cdqe - mov QWORD PTR [rcx], rax - jmp SHORT ret_void$ - -ret_float$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT - jne SHORT ret_double$ - - mov rax, QWORD PTR RVALUE[rbp] - movss DWORD PTR [rax], xmm0 - jmp SHORT ret_void$ - -ret_double$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE - jne SHORT ret_sint64$ - - mov rax, QWORD PTR RVALUE[rbp] - movlpd QWORD PTR [rax], xmm0 - jmp SHORT ret_void$ - -ret_sint64$: - cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64 - jne ret_void$ - - mov rcx, QWORD PTR RVALUE[rbp] - mov QWORD PTR [rcx], rax - jmp SHORT ret_void$ - -ret_void$: - xor rax, rax - - lea rsp, QWORD PTR [rbp+16] - pop rbp - ret 0 -ffi_call_win64 ENDP -_TEXT ENDS -END - -#else - -#ifdef SYMBOL_UNDERSCORE -#define SYMBOL_NAME(name) _##name -#else -#define SYMBOL_NAME(name) name -#endif - -.text - -.extern SYMBOL_NAME(ffi_closure_win64_inner) - -# ffi_closure_win64 will be called with these registers set: -# rax points to 'closure' -# r11 contains a bit mask that specifies which of the -# first four parameters are float or double -# -# It must move the parameters passed in registers to their stack location, -# call ffi_closure_win64_inner for the actual work, then return the result. -# - .balign 16 - .globl SYMBOL_NAME(ffi_closure_win64) -SYMBOL_NAME(ffi_closure_win64): - # copy register arguments onto stack - test $1,%r11 - jne .Lfirst_is_float - mov %rcx, 8(%rsp) - jmp .Lsecond -.Lfirst_is_float: - movlpd %xmm0, 8(%rsp) - -.Lsecond: - test $2, %r11 - jne .Lsecond_is_float - mov %rdx, 16(%rsp) - jmp .Lthird -.Lsecond_is_float: - movlpd %xmm1, 16(%rsp) - -.Lthird: - test $4, %r11 - jne .Lthird_is_float - mov %r8,24(%rsp) - jmp .Lfourth -.Lthird_is_float: - movlpd %xmm2, 24(%rsp) - -.Lfourth: - test $8, %r11 - jne .Lfourth_is_float - mov %r9, 32(%rsp) - jmp .Ldone -.Lfourth_is_float: - movlpd %xmm3, 32(%rsp) - -.Ldone: -#.ALLOCSTACK 40 - sub $40, %rsp -#.ENDPROLOG - mov %rax, %rcx # context is first parameter - mov %rsp, %rdx # stack is second parameter - add $48, %rdx # point to start of arguments - mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax - callq *%rax # call the real closure function - add $40, %rsp - movq %rax, %xmm0 # If the closure returned a float, - # ffi_closure_win64_inner wrote it to rax - retq -.ffi_closure_win64_end: - - .balign 16 - .globl SYMBOL_NAME(ffi_call_win64) -SYMBOL_NAME(ffi_call_win64): - # copy registers onto stack - mov %r9,32(%rsp) - mov %r8,24(%rsp) - mov %rdx,16(%rsp) - mov %rcx,8(%rsp) - #.PUSHREG rbp - push %rbp - #.ALLOCSTACK 48 - sub $48,%rsp - #.SETFRAME rbp, 32 - lea 32(%rsp),%rbp - #.ENDPROLOG - - mov CIF_BYTES(%rbp),%eax - add $15, %rax - and $-16, %rax - cmpq $0x1000, %rax - jb Lch_done -Lch_probe: - subq $0x1000,%rsp - orl $0x0, (%rsp) - subq $0x1000,%rax - cmpq $0x1000,%rax - ja Lch_probe -Lch_done: - subq %rax, %rsp - orl $0x0, (%rsp) - lea 32(%rsp), %rax - mov %rax, STACK(%rbp) - - mov ECIF(%rbp), %rdx - mov STACK(%rbp), %rcx - callq *PREP_ARGS_FN(%rbp) - - mov STACK(%rbp), %rsp - - movlpd 24(%rsp), %xmm3 - movd %xmm3, %r9 - - movlpd 16(%rsp), %xmm2 - movd %xmm2, %r8 - - movlpd 8(%rsp), %xmm1 - movd %xmm1, %rdx - - movlpd (%rsp), %xmm0 - movd %xmm0, %rcx - - callq *FN(%rbp) -.Lret_struct4b: - cmpl $FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp) - jne .Lret_struct2b - - mov RVALUE(%rbp), %rcx - mov %eax, (%rcx) - jmp .Lret_void - -.Lret_struct2b: - cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp) - jne .Lret_struct1b - - mov RVALUE(%rbp), %rcx - mov %ax, (%rcx) - jmp .Lret_void - -.Lret_struct1b: - cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp) - jne .Lret_uint8 - - mov RVALUE(%rbp), %rcx - mov %al, (%rcx) - jmp .Lret_void - -.Lret_uint8: - cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp) - jne .Lret_sint8 - - mov RVALUE(%rbp), %rcx - movzbq %al, %rax - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_sint8: - cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp) - jne .Lret_uint16 - - mov RVALUE(%rbp), %rcx - movsbq %al, %rax - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_uint16: - cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp) - jne .Lret_sint16 - - mov RVALUE(%rbp), %rcx - movzwq %ax, %rax - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_sint16: - cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp) - jne .Lret_uint32 - - mov RVALUE(%rbp), %rcx - movswq %ax, %rax - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_uint32: - cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp) - jne .Lret_sint32 - - mov RVALUE(%rbp), %rcx - movl %eax, %eax - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_sint32: - cmpl $FFI_TYPE_SINT32, CIF_FLAGS(%rbp) - jne .Lret_float - - mov RVALUE(%rbp), %rcx - cltq - movq %rax, (%rcx) - jmp .Lret_void - -.Lret_float: - cmpl $FFI_TYPE_FLOAT, CIF_FLAGS(%rbp) - jne .Lret_double - - mov RVALUE(%rbp), %rax - movss %xmm0, (%rax) - jmp .Lret_void - -.Lret_double: - cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp) - jne .Lret_sint64 - - mov RVALUE(%rbp), %rax - movlpd %xmm0, (%rax) - jmp .Lret_void - -.Lret_sint64: - cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp) - jne .Lret_void - - mov RVALUE(%rbp), %rcx - mov %rax, (%rcx) - jmp .Lret_void - -.Lret_void: - xor %rax, %rax - - lea 16(%rbp), %rsp - pop %rbp - retq -.ffi_call_win64_end: -#endif /* !_MSC_VER */ - diff --git a/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffi.c b/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffi.c deleted file mode 100644 index fd94dafbe..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffi.c +++ /dev/null @@ -1,298 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Tensilica, Inc. - - XTENSA Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -/* - |----------------------------------------| - | | - on entry to ffi_call ----> |----------------------------------------| - | caller stack frame for registers a0-a3 | - |----------------------------------------| - | | - | additional arguments | - entry of the function ---> |----------------------------------------| - | copy of function arguments a2-a7 | - | - - - - - - - - - - - - - | - | | - - The area below the entry line becomes the new stack frame for the function. - -*/ - - -#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST - - -extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, - void(*fn)(void), unsigned nbytes, extended_cif*); -extern void ffi_closure_SYSV(void) FFI_HIDDEN; - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - switch(cif->rtype->type) { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - cif->flags = cif->rtype->type; - break; - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - cif->flags = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; - break; - case FFI_TYPE_STRUCT: - cif->flags = FFI_TYPE_STRUCT; //_REGS; - /* Up to 16 bytes are returned in registers */ - if (cif->rtype->size > 4 * 4) { - /* returned structure is referenced by a register; use 8 bytes - (including 4 bytes for potential additional alignment) */ - cif->flags = FFI_TYPE_STRUCT; - cif->bytes += 8; - } - break; - - default: - cif->flags = FFI_TYPE_UINT32; - break; - } - - /* Round the stack up to a full 4 register frame, just in case - (we use this size in movsp). This way, it's also a multiple of - 8 bytes for 64-bit arguments. */ - cif->bytes = ALIGN(cif->bytes, 16); - - return FFI_OK; -} - -void ffi_prep_args(extended_cif *ecif, unsigned char* stack) -{ - unsigned int i; - unsigned long *addr; - ffi_type **ptr; - - union { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **i; - long long **ll; - float **f; - double **d; - } p_argv; - - /* Verify that everything is aligned up properly */ - FFI_ASSERT (((unsigned long) stack & 0x7) == 0); - - p_argv.v = ecif->avalue; - addr = (unsigned long*)stack; - - /* structures with a size greater than 16 bytes are passed in memory */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) - { - *addr++ = (unsigned long)ecif->rvalue; - } - - for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; - i > 0; - i--, ptr++, p_argv.v++) - { - switch ((*ptr)->type) - { - case FFI_TYPE_SINT8: - *addr++ = **p_argv.sc; - break; - case FFI_TYPE_UINT8: - *addr++ = **p_argv.uc; - break; - case FFI_TYPE_SINT16: - *addr++ = **p_argv.ss; - break; - case FFI_TYPE_UINT16: - *addr++ = **p_argv.us; - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *addr++ = **p_argv.i; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (((unsigned long)addr & 4) != 0) - addr++; - *(unsigned long long*)addr = **p_argv.ll; - addr += sizeof(unsigned long long) / sizeof (addr); - break; - - case FFI_TYPE_STRUCT: - { - unsigned long offs; - unsigned long size; - - if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) - addr++; - - offs = (unsigned long) addr - (unsigned long) stack; - size = (*ptr)->size; - - /* Entire structure must fit the argument registers or referenced */ - if (offs < FFI_REGISTER_NARGS * 4 - && offs + size > FFI_REGISTER_NARGS * 4) - addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); - - memcpy((char*) addr, *p_argv.c, size); - addr += (size + 3) / 4; - break; - } - - default: - FFI_ASSERT(0); - } - } -} - - -void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - unsigned long rsize = cif->rtype->size; - int flags = cif->flags; - void *alloc = NULL; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Note that for structures that are returned in registers (size <= 16 bytes) - we allocate a temporary buffer and use memcpy to copy it to the final - destination. The reason is that the target address might be misaligned or - the length not a multiple of 4 bytes. Handling all those cases would be - very complex. */ - - if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) - { - alloc = alloca(ALIGN(rsize, 4)); - ecif.rvalue = alloc; - } - else - { - ecif.rvalue = rvalue; - } - - if (cif->abi != FFI_SYSV) - FFI_ASSERT(0); - - ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); - - if (alloc != NULL && rvalue != NULL) - memcpy(rvalue, alloc, rsize); -} - -extern void ffi_trampoline(); -extern void ffi_cacheflush(void* start, void* end); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ - memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); - *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; - - // Do we have this function? - // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) - ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - return FFI_OK; -} - - -long FFI_HIDDEN -ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) -{ - ffi_cif *cif; - ffi_type **arg_types; - void **avalue; - int i, areg; - - cif = closure->cif; - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - areg = 0; - - int rtype = cif->rtype->type; - if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) - { - rvalue = *values; - areg++; - } - - cif = closure->cif; - arg_types = cif->arg_types; - avalue = alloca(cif->nargs * sizeof(void *)); - - for (i = 0; i < cif->nargs; i++) - { - if (arg_types[i]->alignment == 8 && (areg & 1) != 0) - areg++; - - // skip the entry 16,a1 framework, add 16 bytes (4 registers) - if (areg == FFI_REGISTER_NARGS) - areg += 4; - - if (arg_types[i]->type == FFI_TYPE_STRUCT) - { - int numregs = ((arg_types[i]->size + 3) & ~3) / 4; - if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) - areg = FFI_REGISTER_NARGS + 4; - } - - avalue[i] = &values[areg]; - areg += (arg_types[i]->size + 3) / 4; - } - - (closure->fun)(cif, rvalue, avalue, closure->user_data); - - return rtype; -} diff --git a/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffitarget.h b/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffitarget.h deleted file mode 100644 index 0ba728bc9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/xtensa/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Tensilica, Inc. - Target configuration macros for XTENSA. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_REGISTER_NARGS 6 - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE 24 - -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/src/xtensa/sysv.S b/third_party/python/Modules/_ctypes/libffi/src/xtensa/sysv.S deleted file mode 100644 index 64e6a0918..000000000 --- a/third_party/python/Modules/_ctypes/libffi/src/xtensa/sysv.S +++ /dev/null @@ -1,253 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Tensilica, Inc. - - XTENSA Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#define ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: -#define END(name) .size name , . - name - -/* Assert that the table below is in sync with ffi.h. */ - -#if FFI_TYPE_UINT8 != 5 \ - || FFI_TYPE_SINT8 != 6 \ - || FFI_TYPE_UINT16 != 7 \ - || FFI_TYPE_SINT16 != 8 \ - || FFI_TYPE_UINT32 != 9 \ - || FFI_TYPE_SINT32 != 10 \ - || FFI_TYPE_UINT64 != 11 -#error "xtensa/sysv.S out of sync with ffi.h" -#endif - - -/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) - void *rvalue; a2 - unsigned long rbytes; a3 - unsigned flags; a4 - void (*fnaddr)(); a5 - unsigned long bytes; a6 - extended_cif* ecif) a7 -*/ - -ENTRY(ffi_call_SYSV) - - entry a1, 32 # 32 byte frame for using call8 below - - mov a10, a7 # a10(->arg0): ecif - sub a11, a1, a6 # a11(->arg1): stack pointer - mov a7, a1 # fp - movsp a1, a11 # set new sp = old_sp - bytes - - movi a8, ffi_prep_args - callx8 a8 # ffi_prep_args(ecif, stack) - - # prepare to move stack pointer back up to 6 arguments - # note that 'bytes' is already aligned - - movi a10, 6*4 - sub a11, a6, a10 - movgez a6, a10, a11 - add a6, a1, a6 - - - # we can pass up to 6 arguments in registers - # for simplicity, just load 6 arguments - # (the stack size is at least 32 bytes, so no risk to cross boundaries) - - l32i a10, a1, 0 - l32i a11, a1, 4 - l32i a12, a1, 8 - l32i a13, a1, 12 - l32i a14, a1, 16 - l32i a15, a1, 20 - - # move stack pointer - - movsp a1, a6 - - callx8 a5 # (*fn)(args...) - - # Handle return value(s) - - beqz a2, .Lexit - - movi a5, FFI_TYPE_STRUCT - bne a4, a5, .Lstore - movi a5, 16 - blt a5, a3, .Lexit - - s32i a10, a2, 0 - blti a3, 5, .Lexit - addi a3, a3, -1 - s32i a11, a2, 4 - blti a3, 8, .Lexit - s32i a12, a2, 8 - blti a3, 12, .Lexit - s32i a13, a2, 12 - -.Lexit: retw - -.Lstore: - addi a4, a4, -FFI_TYPE_UINT8 - bgei a4, 7, .Lexit # should never happen - movi a6, store_calls - add a4, a4, a4 - addx4 a6, a4, a6 # store_table + idx * 8 - jx a6 - - .align 8 -store_calls: - # UINT8 - s8i a10, a2, 0 - retw - - # SINT8 - .align 8 - s8i a10, a2, 0 - retw - - # UINT16 - .align 8 - s16i a10, a2, 0 - retw - - # SINT16 - .align 8 - s16i a10, a2, 0 - retw - - # UINT32 - .align 8 - s32i a10, a2, 0 - retw - - # SINT32 - .align 8 - s32i a10, a2, 0 - retw - - # UINT64 - .align 8 - s32i a10, a2, 0 - s32i a11, a2, 4 - retw - -END(ffi_call_SYSV) - - -/* - * void ffi_cacheflush (unsigned long start, unsigned long end) - */ - -#define EXTRA_ARGS_SIZE 24 - -ENTRY(ffi_cacheflush) - - entry a1, 16 - -1: dhwbi a2, 0 - ihi a2, 0 - addi a2, a2, 4 - blt a2, a3, 1b - - retw - -END(ffi_cacheflush) - -/* ffi_trampoline is copied to the stack */ - -ENTRY(ffi_trampoline) - - entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] - j 2f # [ 3] - .align 4 # [ 6] -1: .long 0 # [ 8] -2: l32r a15, 1b # [12] - _mov a14, a0 # [15] - callx0 a15 # [18] - # [21] -END(ffi_trampoline) - -/* - * ffi_closure() - * - * a0: closure + 21 - * a14: return address (a0) - */ - -ENTRY(ffi_closure_SYSV) - - /* intentionally omitting entry here */ - - # restore return address (a0) and move pointer to closure to a10 - addi a10, a0, -21 - mov a0, a14 - - # allow up to 4 arguments as return values - addi a11, a1, 4 * 4 - - # save up to 6 arguments to stack (allocated by entry below) - s32i a2, a11, 0 - s32i a3, a11, 4 - s32i a4, a11, 8 - s32i a5, a11, 12 - s32i a6, a11, 16 - s32i a7, a11, 20 - - movi a8, ffi_closure_SYSV_inner - mov a12, a1 - callx8 a8 # .._inner(*closure, **avalue, *rvalue) - - # load up to four return arguments - l32i a2, a1, 0 - l32i a3, a1, 4 - l32i a4, a1, 8 - l32i a5, a1, 12 - - # (sign-)extend return value - movi a11, FFI_TYPE_UINT8 - bne a10, a11, 1f - extui a2, a2, 0, 8 - retw - -1: movi a11, FFI_TYPE_SINT8 - bne a10, a11, 1f - sext a2, a2, 7 - retw - -1: movi a11, FFI_TYPE_UINT16 - bne a10, a11, 1f - extui a2, a2, 0, 16 - retw - -1: movi a11, FFI_TYPE_SINT16 - bne a10, a11, 1f - sext a2, a2, 15 - -1: retw - -END(ffi_closure_SYSV) diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.am b/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.am deleted file mode 100644 index da10465d2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.am +++ /dev/null @@ -1,85 +0,0 @@ -## Process this file with automake to produce Makefile.in. - -AUTOMAKE_OPTIONS = foreign dejagnu - -EXTRA_DEJAGNU_SITE_CONFIG=../local.exp - -CLEANFILES = *.exe core* *.log *.sum - -EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ -libffi.call/cls_align_longdouble_split.c \ -libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ -libffi.call/closure_fn1.c \ -libffi.call/return_ul.c libffi.call/cls_align_double.c \ -libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ -libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ -libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ -libffi.call/ffitest.h libffi.call/nested_struct4.c \ -libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ -libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ -libffi.call/struct8.c libffi.call/nested_struct8.c \ -libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ -libffi.call/cls_pointer.c \ -libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ -libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ -libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ -libffi.call/call.exp libffi.call/cls_double.c \ -libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ -libffi.call/return_ll1.c libffi.call/nested_struct3.c \ -libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ -libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ -libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ -libffi.call/return_fl.c libffi.call/struct5.c \ -libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ -libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ -libffi.call/return_fl3.c libffi.call/stret_medium.c \ -libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ -libffi.call/float3.c libffi.call/many2.c \ -libffi.call/closure_simple.c libffi.call/cls_align_uint16.c \ -libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ -libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ -libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ -libffi.call/cls_sshort.c \ -libffi.call/nested_struct.c libffi.call/cls_20byte.c \ -libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ -libffi.call/return_uc.c \ -libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ -libffi.call/promotion.c \ -libffi.call/return_dbl.c libffi.call/cls_24byte.c \ -libffi.call/struct4.c libffi.call/cls_6byte.c \ -libffi.call/cls_align_uint32.c libffi.call/float.c \ -libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ -libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ -libffi.call/cls_align_float.c libffi.call/return_fl1.c \ -libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ -libffi.call/cls_align_sint64.c \ -libffi.call/stret_large2.c libffi.call/return_sl.c \ -libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ -libffi.call/cls_2byte.c libffi.call/float2.c \ -libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ -libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ -libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ -libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ -libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ -libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ -libffi.call/struct1.c libffi.call/nested_struct9.c \ -libffi.call/huge_struct.c libffi.call/problem1.c \ -libffi.call/float4.c \ -libffi.call/return_ldl.c \ -libffi.call/closure_fn5.c \ -libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ -libffi.call/return_sc.c libffi.call/struct7.c \ -libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ -libffi.call/cls_6_1_byte.c \ -libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc \ -libffi.call/unwindtest_ffi_call.cc \ -lib/wrapper.exp lib/target-libpath.exp \ -lib/libffi.exp libffi.call/cls_struct_va1.c \ -libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ -libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ -libffi.call/nested_struct11.c libffi.call/uninitialized.c \ -libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ -libffi.call/va_struct3.c \ -libffi.call/strlen2.c \ -libffi.call/strlen3.c \ -libffi.call/strlen4.c diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.in b/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.in deleted file mode 100644 index 99e226c40..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/Makefile.in +++ /dev/null @@ -1,590 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = testsuite -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/m4/ax_compiler_vendor.m4 \ - $(top_srcdir)/m4/ax_configure_args.m4 \ - $(top_srcdir)/m4/ax_enable_builddir.m4 \ - $(top_srcdir)/m4/ax_gcc_archflag.m4 \ - $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DEJATOOL = $(PACKAGE) -RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir -EXPECT = expect -RUNTEST = runtest -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AM_LTLDFLAGS = @AM_LTLDFLAGS@ -AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ -HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PRTDIAG = @PRTDIAG@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TARGET = @TARGET@ -TARGETDIR = @TARGETDIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -ax_enable_builddir_sed = @ax_enable_builddir_sed@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sys_symbol_underscore = @sys_symbol_underscore@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -toolexecdir = @toolexecdir@ -toolexeclibdir = @toolexeclibdir@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = foreign dejagnu -EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp -CLEANFILES = *.exe core* *.log *.sum -EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ -libffi.call/cls_align_longdouble_split.c \ -libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ -libffi.call/closure_fn1.c \ -libffi.call/return_ul.c libffi.call/cls_align_double.c \ -libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ -libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ -libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ -libffi.call/ffitest.h libffi.call/nested_struct4.c \ -libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ -libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ -libffi.call/struct8.c libffi.call/nested_struct8.c \ -libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ -libffi.call/cls_pointer.c \ -libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ -libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ -libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ -libffi.call/call.exp libffi.call/cls_double.c \ -libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ -libffi.call/return_ll1.c libffi.call/nested_struct3.c \ -libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ -libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ -libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ -libffi.call/return_fl.c libffi.call/struct5.c \ -libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ -libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ -libffi.call/return_fl3.c libffi.call/stret_medium.c \ -libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ -libffi.call/float3.c libffi.call/many2.c \ -libffi.call/closure_simple.c libffi.call/cls_align_uint16.c \ -libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ -libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ -libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ -libffi.call/cls_sshort.c \ -libffi.call/nested_struct.c libffi.call/cls_20byte.c \ -libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ -libffi.call/return_uc.c \ -libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ -libffi.call/promotion.c \ -libffi.call/return_dbl.c libffi.call/cls_24byte.c \ -libffi.call/struct4.c libffi.call/cls_6byte.c \ -libffi.call/cls_align_uint32.c libffi.call/float.c \ -libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ -libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ -libffi.call/cls_align_float.c libffi.call/return_fl1.c \ -libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ -libffi.call/cls_align_sint64.c \ -libffi.call/stret_large2.c libffi.call/return_sl.c \ -libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ -libffi.call/cls_2byte.c libffi.call/float2.c \ -libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ -libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ -libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ -libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ -libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ -libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ -libffi.call/struct1.c libffi.call/nested_struct9.c \ -libffi.call/huge_struct.c libffi.call/problem1.c \ -libffi.call/float4.c \ -libffi.call/return_ldl.c \ -libffi.call/closure_fn5.c \ -libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ -libffi.call/return_sc.c libffi.call/struct7.c \ -libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ -libffi.call/cls_6_1_byte.c \ -libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc \ -libffi.call/unwindtest_ffi_call.cc \ -lib/wrapper.exp lib/target-libpath.exp \ -lib/libffi.exp libffi.call/cls_struct_va1.c \ -libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ -libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ -libffi.call/nested_struct11.c libffi.call/uninitialized.c \ -libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ -libffi.call/va_struct3.c \ -libffi.call/strlen2.c \ -libffi.call/strlen3.c \ -libffi.call/strlen4.c - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign testsuite/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -check-DEJAGNU: site.exp - srcdir='$(srcdir)'; export srcdir; \ - EXPECT=$(EXPECT); export EXPECT; \ - if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \ - exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ - if $(RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ - then :; else exit_status=1; fi; \ - done; \ - else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\ - fi; \ - exit $$exit_status -site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG) - @echo 'Making a new site.exp file ...' - @echo '## these variables are automatically generated by make ##' >site.tmp - @echo '# Do not edit here. If you wish to override these values' >>site.tmp - @echo '# edit the last section' >>site.tmp - @echo 'set srcdir "$(srcdir)"' >>site.tmp - @echo "set objdir `pwd`" >>site.tmp - @echo 'set build_alias "$(build_alias)"' >>site.tmp - @echo 'set build_triplet $(build_triplet)' >>site.tmp - @echo 'set host_alias "$(host_alias)"' >>site.tmp - @echo 'set host_triplet $(host_triplet)' >>site.tmp - @echo 'set target_alias "$(target_alias)"' >>site.tmp - @echo 'set target_triplet $(target_triplet)' >>site.tmp - @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \ - echo "## Begin content included from file $$f. Do not modify. ##" \ - && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \ - && echo "## End content included from file $$f. ##" \ - || exit 1; \ - done >> site.tmp - @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp - @if test -f site.exp; then \ - sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \ - fi - @-rm -f site.bak - @test ! -f site.exp || mv site.exp site.bak - @mv site.tmp site.exp - -distclean-DEJAGNU: - -rm -f site.exp site.bak - -l='$(DEJATOOL)'; for tool in $$l; do \ - rm -f $$tool.sum $$tool.log; \ - done - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-DEJAGNU distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ - clean-libtool cscopelist-am ctags-am distclean \ - distclean-DEJAGNU distclean-generic distclean-libtool distdir \ - dvi dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ - uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/config/default.exp b/third_party/python/Modules/_ctypes/libffi/testsuite/config/default.exp deleted file mode 100644 index 90967cccc..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/config/default.exp +++ /dev/null @@ -1 +0,0 @@ -load_lib "standard.exp" diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/libffi.exp b/third_party/python/Modules/_ctypes/libffi/testsuite/lib/libffi.exp deleted file mode 100644 index dbdd1a2f2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/libffi.exp +++ /dev/null @@ -1,413 +0,0 @@ -# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -proc load_gcc_lib { filename } { - global srcdir - load_file $srcdir/lib/$filename -} - -load_lib dg.exp -load_lib libgloss.exp -load_gcc_lib target-libpath.exp -load_gcc_lib wrapper.exp - - -# Define libffi callbacks for dg.exp. - -proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { - - # To get all \n in dg-output test strings to match printf output - # in a system that outputs it as \015\012 (i.e. not just \012), we - # need to change all \n into \r?\n. As there is no dejagnu flag - # or hook to do that, we simply change the text being tested. - # Unfortunately, we have to know that the variable is called - # dg-output-text and lives in the caller of libffi-dg-test, which - # is two calls up. Overriding proc dg-output would be longer and - # would necessarily have the same assumption. - upvar 2 dg-output-text output_match - - if { [llength $output_match] > 1 } { - regsub -all "\n" [lindex $output_match 1] "\r?\n" x - set output_match [lreplace $output_match 1 1 $x] - } - - # Set up the compiler flags, based on what we're going to do. - - set options [list] - switch $do_what { - "compile" { - set compile_type "assembly" - set output_file "[file rootname [file tail $prog]].s" - } - "link" { - set compile_type "executable" - set output_file "[file rootname [file tail $prog]].exe" - # The following line is needed for targets like the i960 where - # the default output file is b.out. Sigh. - } - "run" { - set compile_type "executable" - # FIXME: "./" is to cope with "." not being in $PATH. - # Should this be handled elsewhere? - # YES. - set output_file "./[file rootname [file tail $prog]].exe" - # This is the only place where we care if an executable was - # created or not. If it was, dg.exp will try to run it. - remote_file build delete $output_file; - } - default { - perror "$do_what: not a valid dg-do keyword" - return "" - } - } - - if { $extra_tool_flags != "" } { - lappend options "additional_flags=$extra_tool_flags" - } - - set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; - - - return [list $comp_output $output_file] -} - - -proc libffi-dg-test { prog do_what extra_tool_flags } { - return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] -} - -proc libffi-init { args } { - global gluefile wrap_flags; - global srcdir - global blddirffi - global objdir - global TOOL_OPTIONS - global tool - global libffi_include - global libffi_link_flags - global tool_root_dir - global ld_library_path - - global using_gcc - - set blddirffi [pwd]/.. - verbose "libffi $blddirffi" - - # Are we building with GCC? - set tmp [grep ../config.status "GCC='yes'"] - if { [string match $tmp "GCC='yes'"] } { - - set using_gcc "yes" - - set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] - if {$gccdir != ""} { - set gccdir [file dirname $gccdir] - } - verbose "gccdir $gccdir" - - set ld_library_path "." - append ld_library_path ":${gccdir}" - - set compiler "${gccdir}/xgcc" - if { [is_remote host] == 0 && [which $compiler] != 0 } { - foreach i "[exec $compiler --print-multi-lib]" { - set mldir "" - regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir - set mldir [string trimright $mldir "\;@"] - if { "$mldir" == "." } { - continue - } - if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { - append ld_library_path ":${gccdir}/${mldir}" - } - } - } - - } else { - - set using_gcc "no" - - } - - # add the library path for libffi. - append ld_library_path ":${blddirffi}/.libs" - - verbose "ld_library_path: $ld_library_path" - - # Point to the Libffi headers in libffi. - set libffi_include "${blddirffi}/include" - verbose "libffi_include $libffi_include" - - set libffi_dir "${blddirffi}/.libs" - verbose "libffi_dir $libffi_dir" - if { $libffi_dir != "" } { - set libffi_dir [file dirname ${libffi_dir}] - set libffi_link_flags "-L${libffi_dir}/.libs" - } - - set_ld_library_path_env_vars - libffi_maybe_build_wrapper "${objdir}/testglue.o" -} - -proc libffi_exit { } { - global gluefile; - - if [info exists gluefile] { - file_on_build delete $gluefile; - unset gluefile; - } -} - -proc libffi_target_compile { source dest type options } { - global gluefile wrap_flags; - global srcdir - global blddirffi - global TOOL_OPTIONS - global libffi_link_flags - global libffi_include - global target_triplet - - - if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { - lappend options "libs=${gluefile}" - lappend options "ldflags=$wrap_flags" - } - - # TOOL_OPTIONS must come first, so that it doesn't override testcase - # specific options. - if [info exists TOOL_OPTIONS] { - lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; - } - - # search for ffi_mips.h in srcdir, too - lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." - lappend options "additional_flags=${libffi_link_flags}" - - # Darwin needs a stack execution allowed flag. - - if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] - || [istarget "*-*-darwin2*"] } { - lappend options "additional_flags=-Wl,-allow_stack_execute" - } - - # If you're building the compiler with --prefix set to a place - # where it's not yet installed, then the linker won't be able to - # find the libgcc used by libffi.dylib. We could pass the - # -dylib_file option, but that's complicated, and it's much easier - # to just make the linker find libgcc using -L options. - if { [string match "*-*-darwin*" $target_triplet] } { - lappend options "libs= -shared-libgcc" - } - - if { [string match "*-*-openbsd*" $target_triplet] } { - lappend options "libs= -lpthread" - } - - lappend options "libs= -lffi" - - if { [string match "aarch64*-*-linux*" $target_triplet] } { - lappend options "libs= -lpthread" - } - - if { [string match "*.cc" $source] } { - lappend options "c++" - } - - verbose "options: $options" - return [target_compile $source $dest $type $options] -} - -# Utility routines. - -# -# search_for -- looks for a string match in a file -# -proc search_for { file pattern } { - set fd [open $file r] - while { [gets $fd cur_line]>=0 } { - if [string match "*$pattern*" $cur_line] then { - close $fd - return 1 - } - } - close $fd - return 0 -} - -# Modified dg-runtest that can cycle through a list of optimization options -# as c-torture does. -proc libffi-dg-runtest { testcases default-extra-flags } { - global runtests - - foreach test $testcases { - # If we're only testing specific files and this isn't one of - # them, skip it. - if ![runtest_file_p $runtests $test] { - continue - } - - # Look for a loop within the source code - if we don't find one, - # don't pass -funroll[-all]-loops. - global torture_with_loops torture_without_loops - if [expr [search_for $test "for*("]+[search_for $test "while*("]] { - set option_list $torture_with_loops - } else { - set option_list $torture_without_loops - } - - set nshort [file tail [file dirname $test]]/[file tail $test] - - foreach flags $option_list { - verbose "Testing $nshort, $flags" 1 - dg-test $test $flags ${default-extra-flags} - } - } -} - -proc run-many-tests { testcases extra_flags } { - global using_gcc - if { [string match $using_gcc "yes"] } { - set common "-W -Wall" - set optimizations { "-O0" "-O2" "-O3" "-Os" "-O2 -fomit-frame-pointer" } - } else { - # Assume we are using the vendor compiler. - set common "" - set optimizations { "" } - } - - set targetabis { "" } - if [string match $using_gcc "yes"] { - if [istarget "i?86-*-*"] { - set targetabis { - "" - "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__" - "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" - "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" - } - } - } - - set common [ concat $common $extra_flags ] - foreach test $testcases { - set testname [file tail $test] - if [search_for $test "ABI_NUM"] { - set abis $targetabis - } else { - set abis { "" } - } - foreach opt $optimizations { - foreach abi $abis { - set options [concat $common $opt $abi] - verbose "Testing $testname, $options" 1 - dg-test $test $options "" - } - } - } -} - -# Like check_conditional_xfail, but callable from a dg test. - -proc dg-xfail-if { args } { - set args [lreplace $args 0 0] - set selector "target [join [lindex $args 1]]" - if { [dg-process-target $selector] == "S" } { - global compiler_conditional_xfail_data - set compiler_conditional_xfail_data $args - } -} - -proc check-flags { args } { - - # The args are within another list; pull them out. - set args [lindex $args 0] - - # The next two arguments are optional. If they were not specified, - # use the defaults. - if { [llength $args] == 2 } { - lappend $args [list "*"] - } - if { [llength $args] == 3 } { - lappend $args [list ""] - } - - # If the option strings are the defaults, or the same as the - # defaults, there is no need to call check_conditional_xfail to - # compare them to the actual options. - if { [string compare [lindex $args 2] "*"] == 0 - && [string compare [lindex $args 3] "" ] == 0 } { - set result 1 - } else { - # The target list might be an effective-target keyword, so replace - # the original list with "*-*-*", since we already know it matches. - set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] - } - - return $result -} - -proc dg-skip-if { args } { - # Verify the number of arguments. The last two are optional. - set args [lreplace $args 0 0] - if { [llength $args] < 2 || [llength $args] > 4 } { - error "dg-skip-if 2: need 2, 3, or 4 arguments" - } - - # Don't bother if we're already skipping the test. - upvar dg-do-what dg-do-what - if { [lindex ${dg-do-what} 1] == "N" } { - return - } - - set selector [list target [lindex $args 1]] - if { [dg-process-target $selector] == "S" } { - if [check-flags $args] { - upvar dg-do-what dg-do-what - set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] - } - } -} - -# We need to make sure that additional_files and additional_sources -# are both cleared out after every test. It is not enough to clear -# them out *before* the next test run because gcc-target-compile gets -# run directly from some .exp files (outside of any test). (Those -# uses should eventually be eliminated.) - -# Because the DG framework doesn't provide a hook that is run at the -# end of a test, we must replace dg-test with a wrapper. - -if { [info procs saved-dg-test] == [list] } { - rename dg-test saved-dg-test - - proc dg-test { args } { - global additional_files - global additional_sources - global errorInfo - - if { [ catch { eval saved-dg-test $args } errmsg ] } { - set saved_info $errorInfo - set additional_files "" - set additional_sources "" - error $errmsg $saved_info - } - set additional_files "" - set additional_sources "" - } -} - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp b/third_party/python/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp deleted file mode 100644 index 6b7beba93..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp +++ /dev/null @@ -1,283 +0,0 @@ -# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GCC; see the file COPYING3. If not see -# . - -# This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca) - -set orig_environment_saved 0 -set orig_ld_library_path_saved 0 -set orig_ld_run_path_saved 0 -set orig_shlib_path_saved 0 -set orig_ld_libraryn32_path_saved 0 -set orig_ld_library64_path_saved 0 -set orig_ld_library_path_32_saved 0 -set orig_ld_library_path_64_saved 0 -set orig_dyld_library_path_saved 0 -set orig_path_saved 0 - -####################################### -# proc set_ld_library_path_env_vars { } -####################################### - -proc set_ld_library_path_env_vars { } { - global ld_library_path - global orig_environment_saved - global orig_ld_library_path_saved - global orig_ld_run_path_saved - global orig_shlib_path_saved - global orig_ld_libraryn32_path_saved - global orig_ld_library64_path_saved - global orig_ld_library_path_32_saved - global orig_ld_library_path_64_saved - global orig_dyld_library_path_saved - global orig_path_saved - global orig_ld_library_path - global orig_ld_run_path - global orig_shlib_path - global orig_ld_libraryn32_path - global orig_ld_library64_path - global orig_ld_library_path_32 - global orig_ld_library_path_64 - global orig_dyld_library_path - global orig_path - global GCC_EXEC_PREFIX - - # Set the relocated compiler prefix, but only if the user hasn't specified one. - if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } { - setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX" - } - - # Setting the ld library path causes trouble when testing cross-compilers. - if { [is_remote target] } { - return - } - - if { $orig_environment_saved == 0 } { - global env - - set orig_environment_saved 1 - - # Save the original environment. - if [info exists env(LD_LIBRARY_PATH)] { - set orig_ld_library_path "$env(LD_LIBRARY_PATH)" - set orig_ld_library_path_saved 1 - } - if [info exists env(LD_RUN_PATH)] { - set orig_ld_run_path "$env(LD_RUN_PATH)" - set orig_ld_run_path_saved 1 - } - if [info exists env(SHLIB_PATH)] { - set orig_shlib_path "$env(SHLIB_PATH)" - set orig_shlib_path_saved 1 - } - if [info exists env(LD_LIBRARYN32_PATH)] { - set orig_ld_libraryn32_path "$env(LD_LIBRARYN32_PATH)" - set orig_ld_libraryn32_path_saved 1 - } - if [info exists env(LD_LIBRARY64_PATH)] { - set orig_ld_library64_path "$env(LD_LIBRARY64_PATH)" - set orig_ld_library64_path_saved 1 - } - if [info exists env(LD_LIBRARY_PATH_32)] { - set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)" - set orig_ld_library_path_32_saved 1 - } - if [info exists env(LD_LIBRARY_PATH_64)] { - set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)" - set orig_ld_library_path_64_saved 1 - } - if [info exists env(DYLD_LIBRARY_PATH)] { - set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)" - set orig_dyld_library_path_saved 1 - } - if [info exists env(PATH)] { - set orig_path "$env(PATH)" - set orig_path_saved 1 - } - } - - # We need to set ld library path in the environment. Currently, - # unix.exp doesn't set the environment correctly for all systems. - # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a - # program. We also need the environment set for compilations, etc. - # - # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but - # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH - # (for the 64-bit ABI). The same applies to Darwin (DYLD_LIBRARY_PATH), - # Solaris 32 bit (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), - # and HP-UX (SHLIB_PATH). In some cases, the variables are independent - # of LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the - # variable is not defined. - # - # Doing this is somewhat of a hack as ld_library_path gets repeated in - # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables. - if { $orig_ld_library_path_saved } { - setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path" - } else { - setenv LD_LIBRARY_PATH "$ld_library_path" - } - if { $orig_ld_run_path_saved } { - setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path" - } else { - setenv LD_RUN_PATH "$ld_library_path" - } - # The default shared library dynamic path search for 64-bit - # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH. - # LD_LIBRARY_PATH isn't used for 32-bit executables. Thus, we - # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent. - if { $orig_shlib_path_saved } { - setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path" - } else { - setenv SHLIB_PATH "$ld_library_path" - } - if { $orig_ld_libraryn32_path_saved } { - setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_libraryn32_path" - } elseif { $orig_ld_library_path_saved } { - setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_library_path" - } else { - setenv LD_LIBRARYN32_PATH "$ld_library_path" - } - if { $orig_ld_library64_path_saved } { - setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library64_path" - } elseif { $orig_ld_library_path_saved } { - setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library_path" - } else { - setenv LD_LIBRARY64_PATH "$ld_library_path" - } - if { $orig_ld_library_path_32_saved } { - setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32" - } elseif { $orig_ld_library_path_saved } { - setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path" - } else { - setenv LD_LIBRARY_PATH_32 "$ld_library_path" - } - if { $orig_ld_library_path_64_saved } { - setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64" - } elseif { $orig_ld_library_path_saved } { - setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path" - } else { - setenv LD_LIBRARY_PATH_64 "$ld_library_path" - } - if { $orig_dyld_library_path_saved } { - setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path" - } else { - setenv DYLD_LIBRARY_PATH "$ld_library_path" - } - if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { - if { $orig_path_saved } { - setenv PATH "$ld_library_path:$orig_path" - } else { - setenv PATH "$ld_library_path" - } - } - - verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path" -} - -####################################### -# proc restore_ld_library_path_env_vars { } -####################################### - -proc restore_ld_library_path_env_vars { } { - global orig_environment_saved - global orig_ld_library_path_saved - global orig_ld_run_path_saved - global orig_shlib_path_saved - global orig_ld_libraryn32_path_saved - global orig_ld_library64_path_saved - global orig_ld_library_path_32_saved - global orig_ld_library_path_64_saved - global orig_dyld_library_path_saved - global orig_path_saved - global orig_ld_library_path - global orig_ld_run_path - global orig_shlib_path - global orig_ld_libraryn32_path - global orig_ld_library64_path - global orig_ld_library_path_32 - global orig_ld_library_path_64 - global orig_dyld_library_path - global orig_path - - if { $orig_environment_saved == 0 } { - return - } - - if { $orig_ld_library_path_saved } { - setenv LD_LIBRARY_PATH "$orig_ld_library_path" - } elseif [info exists env(LD_LIBRARY_PATH)] { - unsetenv LD_LIBRARY_PATH - } - if { $orig_ld_run_path_saved } { - setenv LD_RUN_PATH "$orig_ld_run_path" - } elseif [info exists env(LD_RUN_PATH)] { - unsetenv LD_RUN_PATH - } - if { $orig_shlib_path_saved } { - setenv SHLIB_PATH "$orig_shlib_path" - } elseif [info exists env(SHLIB_PATH)] { - unsetenv SHLIB_PATH - } - if { $orig_ld_libraryn32_path_saved } { - setenv LD_LIBRARYN32_PATH "$orig_ld_libraryn32_path" - } elseif [info exists env(LD_LIBRARYN32_PATH)] { - unsetenv LD_LIBRARYN32_PATH - } - if { $orig_ld_library64_path_saved } { - setenv LD_LIBRARY64_PATH "$orig_ld_library64_path" - } elseif [info exists env(LD_LIBRARY64_PATH)] { - unsetenv LD_LIBRARY64_PATH - } - if { $orig_ld_library_path_32_saved } { - setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32" - } elseif [info exists env(LD_LIBRARY_PATH_32)] { - unsetenv LD_LIBRARY_PATH_32 - } - if { $orig_ld_library_path_64_saved } { - setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64" - } elseif [info exists env(LD_LIBRARY_PATH_64)] { - unsetenv LD_LIBRARY_PATH_64 - } - if { $orig_dyld_library_path_saved } { - setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path" - } elseif [info exists env(DYLD_LIBRARY_PATH)] { - unsetenv DYLD_LIBRARY_PATH - } - if { $orig_path_saved } { - setenv PATH "$orig_path" - } elseif [info exists env(PATH)] { - unsetenv PATH - } -} - -####################################### -# proc get_shlib_extension { } -####################################### - -proc get_shlib_extension { } { - global shlib_ext - - if { [ istarget *-*-darwin* ] } { - set shlib_ext "dylib" - } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } { - set shlib_ext "dll" - } elseif { [ istarget hppa*-*-hpux* ] } { - set shlib_ext "sl" - } else { - set shlib_ext "so" - } - return $shlib_ext -} - diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/wrapper.exp b/third_party/python/Modules/_ctypes/libffi/testsuite/lib/wrapper.exp deleted file mode 100644 index 4e5ae435a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/lib/wrapper.exp +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (C) 2004, 2007 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GCC; see the file COPYING3. If not see -# . - -# This file contains GCC-specifics for status wrappers for test programs. - -# ${tool}_maybe_build_wrapper -- Build wrapper object if the target -# needs it. FILENAME is the path to the wrapper file. If there are -# additional arguments, they are command-line options to provide to -# the compiler when compiling FILENAME. - -proc ${tool}_maybe_build_wrapper { filename args } { - global gluefile wrap_flags - - if { [target_info needs_status_wrapper] != "" \ - && [target_info needs_status_wrapper] != "0" \ - && ![info exists gluefile] } { - set saved_wrap_compile_flags [target_info wrap_compile_flags] - set flags [join $args " "] - # The wrapper code may contain code that gcc objects on. This - # became true for dejagnu-1.4.4. The set of warnings and code - # that gcc objects on may change, so just make sure -w is always - # passed to turn off all warnings. - set_currtarget_info wrap_compile_flags \ - "$saved_wrap_compile_flags -w $flags" - set result [build_wrapper $filename] - set_currtarget_info wrap_compile_flags "$saved_wrap_compile_flags" - if { $result != "" } { - set gluefile [lindex $result 0] - set wrap_flags [lindex $result 1] - } - } -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp deleted file mode 100644 index 36d13d8e0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir - -run-many-tests [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] "" - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn0.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn0.c deleted file mode 100644 index a579ff6c9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn0.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + - (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + - (int)(*(signed short *)args[4]) + - (int)(*(unsigned long long *)args[5]) + - (int)*(int *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(int *)args[3], (int)(*(signed short *)args[4]), - (int)(*(unsigned long long *)args[5]), - (int)*(int *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]),*(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long, - int, signed short, unsigned long long, int, - int, double, int, int, float, int, int, - int, int); - -int main (void) -{ - ffi_cif cif; - void * code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_sint; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_sint; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_uint64; - cl_arg_types[6] = &ffi_type_sint; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn1.c deleted file mode 100644 index 91231738c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn1.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: closure_call. - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - - -static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double*)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); -} - -typedef int (*closure_test_type1)(float, float, float, float, signed short, - float, float, int, double, int, int, float, - int, int, int, int); -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type1)code)) - (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn2.c deleted file mode 100644 index 08ff9d922..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn2.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(double *)args[0] +(int)(*(double *)args[1]) + - (int)(*(double *)args[2]) + (int)*(double *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) + - (int)*(double *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(float *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(double *)args[0], (int)(*(double *)args[1]), - (int)(*(double *)args[2]), (int)*(double *)args[3], - (int)(*(signed short *)args[4]), (int)(*(double *)args[5]), - (int)*(double *)args[6], (int)(*(int *)args[7]), - (int)(*(double*)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(float *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, - (int)*(ffi_arg *)resp); -} - -typedef int (*closure_test_type2)(double, double, double, double, signed short, - double, double, int, double, int, int, float, - int, float, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_double; - cl_arg_types[1] = &ffi_type_double; - cl_arg_types[2] = &ffi_type_double; - cl_arg_types[3] = &ffi_type_double; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_double; - cl_arg_types[6] = &ffi_type_double; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_float; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type2)code)) - (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13, - 19.0, 21, 1); - /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn3.c deleted file mode 100644 index 9b54d805c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn3.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) - { - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(float *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(float *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(float *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(float *)args[13]) + - (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(float *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(float *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(float *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(float *)args[13]), - (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, - (int)*(ffi_arg *)resp); - - } - -typedef int (*closure_test_type3)(float, float, float, float, float, float, - float, float, double, int, float, float, int, - float, float, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_float; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_float; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_float; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_float; - cl_arg_types[14] = &ffi_type_float; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type3)code)) - (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13, - 19.19, 21.21, 1); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 135" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn4.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn4.c deleted file mode 100644 index d4a1530b0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn4.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple long long values passing. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20031026 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + - (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + - (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + - (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + - (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + - (int)*(unsigned long long *)args[10] + - (int)*(unsigned long long *)args[11] + - (int)*(unsigned long long *)args[12] + - (int)*(unsigned long long *)args[13] + - (int)*(unsigned long long *)args[14] + - *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)*(unsigned long long *)args[1], - (int)*(unsigned long long *)args[2], - (int)*(unsigned long long *)args[3], - (int)*(unsigned long long *)args[4], - (int)*(unsigned long long *)args[5], - (int)*(unsigned long long *)args[6], - (int)*(unsigned long long *)args[7], - (int)*(unsigned long long *)args[8], - (int)*(unsigned long long *)args[9], - (int)*(unsigned long long *)args[10], - (int)*(unsigned long long *)args[11], - (int)*(unsigned long long *)args[12], - (int)*(unsigned long long *)args[13], - (int)*(unsigned long long *)args[14], - *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int i, res; - - for (i = 0; i < 15; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, - 13LL, 19LL, 21LL, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn5.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn5.c deleted file mode 100644 index 99074426c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn5.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple long long values passing. - Exceed the limit of gpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20031026 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + - (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + - (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + - (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + - (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + - (int)*(int *)args[10] + - (int)*(unsigned long long *)args[11] + - (int)*(unsigned long long *)args[12] + - (int)*(unsigned long long *)args[13] + - (int)*(unsigned long long *)args[14] + - *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)*(unsigned long long *)args[1], - (int)*(unsigned long long *)args[2], - (int)*(unsigned long long *)args[3], - (int)*(unsigned long long *)args[4], - (int)*(unsigned long long *)args[5], - (int)*(unsigned long long *)args[6], - (int)*(unsigned long long *)args[7], - (int)*(unsigned long long *)args[8], - (int)*(unsigned long long *)args[9], - (int)*(int *)args[10], - (int)*(unsigned long long *)args[11], - (int)*(unsigned long long *)args[12], - (int)*(unsigned long long *)args[13], - (int)*(unsigned long long *)args[14], - *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - int, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int i, res; - - for (i = 0; i < 10; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[10] = &ffi_type_sint; - for (i = 11; i < 15; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, - 13LL, 19LL, 21LL, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn6.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn6.c deleted file mode 100644 index 73c54fd6b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn6.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC. - Limitations: none. - PR: PR23404 - Originator: 20050830 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + - (int)(*(unsigned long long *)args[1]) + - (int)(*(unsigned long long *)args[2]) + - (int)*(unsigned long long *)args[3] + - (int)(*(int *)args[4]) + (int)(*(double *)args[5]) + - (int)*(double *)args[6] + (int)(*(float *)args[7]) + - (int)(*(double *)args[8]) + (int)*(double *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(double *)args[14]) + (int)*(double *)args[15] + - (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)(*(unsigned long long *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(unsigned long long *)args[3], - (int)(*(int *)args[4]), (int)(*(double *)args[5]), - (int)*(double *)args[6], (int)(*(float *)args[7]), - (int)(*(double *)args[8]), (int)*(double *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(double *)args[14]), (int)(*(double *)args[15]), - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, - unsigned long long, - unsigned long long, - unsigned long long, - int, double, double, float, double, double, - int, float, int, int, double, double); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_uint64; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_uint64; - cl_arg_types[4] = &ffi_type_sint; - cl_arg_types[5] = &ffi_type_double; - cl_arg_types[6] = &ffi_type_double; - cl_arg_types[7] = &ffi_type_float; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_double; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_double; - cl_arg_types[15] = &ffi_type_double; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13, - 19, 21., 1.); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_loc_fn0.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_loc_fn0.c deleted file mode 100644 index b3afa0bbd..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_loc_fn0.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + - (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + - (int)(*(signed short *)args[4]) + - (int)(*(unsigned long long *)args[5]) + - (int)*(int *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(int *)args[3], (int)(*(signed short *)args[4]), - (int)(*(unsigned long long *)args[5]), - (int)*(int *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]),*(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long, - int, signed short, unsigned long long, int, - int, double, int, int, float, int, int, - int, int); - -int main (void) -{ - ffi_cif cif; - ffi_closure *pcl; - ffi_type * cl_arg_types[17]; - int res; - void *codeloc; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_sint; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_sint; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_uint64; - cl_arg_types[6] = &ffi_type_sint; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc); - CHECK(pcl != NULL); - CHECK(codeloc != NULL); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0, - (void *) 3 /* userdata */, codeloc) == FFI_OK); - - CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0); - - res = (*((closure_loc_test_type0)codeloc)) - (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_simple.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_simple.c deleted file mode 100644 index 5a4e728d4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/closure_simple.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: closure_call - Purpose: Check simple closure handling with all ABIs - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) -{ - *(ffi_arg*)resp = - (int)*(int *)args[0] + (int)(*(int *)args[1]) - + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) - + (int)(intptr_t)userdata; - - printf("%d %d %d %d: %d\n", - (int)*(int *)args[0], (int)(*(int *)args[1]), - (int)(*(int *)args[2]), (int)(*(int *)args[3]), - (int)*(ffi_arg *)resp); - -} - -typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = &ffi_type_uint; - cl_arg_types[2] = &ffi_type_uint; - cl_arg_types[3] = &ffi_type_uint; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*(closure_test_type0)code)(0, 1, 2, 3); - /* { dg-output "0 1 2 3: 9" } */ - - printf("res: %d\n",res); - /* { dg-output "\nres: 9" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c deleted file mode 100644 index ea0825d17..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_12byte { - int a; - int b; - int c; -} cls_struct_12byte; - -cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1, - struct cls_struct_12byte b2) -{ - struct cls_struct_12byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - result.c = b1.c + b2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, - result.a, result.b, result.c); - - return result; -} - -static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args , void* userdata __UNUSED__) -{ - struct cls_struct_12byte b1, b2; - - b1 = *(struct cls_struct_12byte*)(args[0]); - b2 = *(struct cls_struct_12byte*)(args[1]); - - *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_12byte h_dbl = { 7, 4, 9 }; - struct cls_struct_12byte j_dbl = { 1, 5, 3 }; - struct cls_struct_12byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 4 9 1 5 3: 8 9 12" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 9 12" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK); - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - - res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 9 12" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c deleted file mode 100644 index 89a08a2d9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte { - int a; - double b; - int c; -} cls_struct_16byte; - -cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1, - struct cls_struct_16byte b2) -{ - struct cls_struct_16byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - result.c = b1.c + b2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, - result.a, result.b, result.c); - - return result; -} - -static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_16byte b1, b2; - - b1 = *(struct cls_struct_16byte*)(args[0]); - b2 = *(struct cls_struct_16byte*)(args[1]); - - *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; - struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; - struct cls_struct_16byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 9 1 9 3: 8 17 12" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 17 12" } */ - - res_dbl.a = 0; - res_dbl.b = 0.0; - res_dbl.c = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 17 12" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c deleted file mode 100644 index 9f75da80a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Double alignment check on darwin. - Limitations: none. - PR: none. - Originator: 20030915 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_18byte { - double a; - unsigned char b; - unsigned char c; - double d; -} cls_struct_18byte; - -cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1, - struct cls_struct_18byte a2) -{ - struct cls_struct_18byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - - printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - return result; -} - -static void -cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_18byte a1, a2; - - a1 = *(struct cls_struct_18byte*)(args[0]); - a2 = *(struct cls_struct_18byte*)(args[1]); - - *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; - struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; - struct cls_struct_18byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */ - printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 5 252 250 8" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */ - printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 5 252 250 8" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c deleted file mode 100644 index 278794b5b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c +++ /dev/null @@ -1,102 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Double alignment check on darwin. - Limitations: none. - PR: none. - Originator: 20030915 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_19byte { - double a; - unsigned char b; - unsigned char c; - double d; - unsigned char e; -} cls_struct_19byte; - -cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1, - struct cls_struct_19byte a2) -{ - struct cls_struct_19byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - - - printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, - a2.a, a2.b, a2.c, a2.d, a2.e, - result.a, result.b, result.c, result.d, result.e); - return result; -} - -static void -cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_19byte a1, a2; - - a1 = *(struct cls_struct_19byte*)(args[0]); - a2 = *(struct cls_struct_19byte*)(args[1]); - - *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[6]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; - struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; - struct cls_struct_19byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ - printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 5 252 250 8 239" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ - printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 5 252 250 8 239" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c deleted file mode 100644 index 82492c020..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_1_1byte { - unsigned char a; -} cls_struct_1_1byte; - -cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1, - struct cls_struct_1_1byte a2) -{ - struct cls_struct_1_1byte result; - - result.a = a1.a + a2.a; - - printf("%d %d: %d\n", a1.a, a2.a, result.a); - - return result; -} - -static void -cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_1_1byte a1, a2; - - a1 = *(struct cls_struct_1_1byte*)(args[0]); - a2 = *(struct cls_struct_1_1byte*)(args[1]); - - *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[2]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_1_1byte g_dbl = { 12 }; - struct cls_struct_1_1byte f_dbl = { 178 }; - struct cls_struct_1_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 178: 190" } */ - printf("res: %d\n", res_dbl.a); - /* { dg-output "\nres: 190" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 178: 190" } */ - printf("res: %d\n", res_dbl.a); - /* { dg-output "\nres: 190" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c deleted file mode 100644 index 3f8bb28ad..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_20byte { - double a; - double b; - int c; -} cls_struct_20byte; - -cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, - struct cls_struct_20byte a2) -{ - struct cls_struct_20byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, - result.a, result.b, result.c); - return result; -} - -static void -cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_20byte a1, a2; - - a1 = *(struct cls_struct_20byte*)(args[0]); - a2 = *(struct cls_struct_20byte*)(args[1]); - - *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; - struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; - struct cls_struct_20byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ - printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ - printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c deleted file mode 100644 index 65627273c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_20byte { - int a; - double b; - double c; -} cls_struct_20byte; - -cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, - struct cls_struct_20byte a2) -{ - struct cls_struct_20byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, - result.a, result.b, result.c); - return result; -} - -static void -cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_20byte a1, a2; - - a1 = *(struct cls_struct_20byte*)(args[0]); - a2 = *(struct cls_struct_20byte*)(args[1]); - - *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; - struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; - struct cls_struct_20byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ - printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ - printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c deleted file mode 100644 index 1d82f6e4a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_24byte { - double a; - double b; - int c; - float d; -} cls_struct_24byte; - -cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0, - struct cls_struct_24byte b1, - struct cls_struct_24byte b2, - struct cls_struct_24byte b3) -{ - struct cls_struct_24byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - - printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n", - b0.a, b0.b, b0.c, b0.d, - b1.a, b1.b, b1.c, b1.d, - b2.a, b2.b, b2.c, b2.d, - b3.a, b3.b, b3.c, b2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_24byte b0, b1, b2, b3; - - b0 = *(struct cls_struct_24byte*)(args[0]); - b1 = *(struct cls_struct_24byte*)(args[1]); - b2 = *(struct cls_struct_24byte*)(args[2]); - b3 = *(struct cls_struct_24byte*)(args[3]); - - *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; - struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; - struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; - struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; - struct cls_struct_24byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = &ffi_type_float; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ - printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 22 15 17 25" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte, - cls_struct_24byte, - cls_struct_24byte, - cls_struct_24byte)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ - printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 22 15 17 25" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c deleted file mode 100644 index 81bb0a64a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_2byte { - unsigned char a; - unsigned char b; -} cls_struct_2byte; - -cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1, - struct cls_struct_2byte a2) -{ - struct cls_struct_2byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_2byte a1, a2; - - a1 = *(struct cls_struct_2byte*)(args[0]); - a2 = *(struct cls_struct_2byte*)(args[1]); - - *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_2byte g_dbl = { 12, 127 }; - struct cls_struct_2byte f_dbl = { 1, 13 }; - struct cls_struct_2byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 127 1 13: 13 140" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 127 1 13: 13 140" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c deleted file mode 100644 index b7827466f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3_1byte { - unsigned char a; - unsigned char b; - unsigned char c; -} cls_struct_3_1byte; - -cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1, - struct cls_struct_3_1byte a2) -{ - struct cls_struct_3_1byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, - result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3_1byte a1, a2; - - a1 = *(struct cls_struct_3_1byte*)(args[0]); - a2 = *(struct cls_struct_3_1byte*)(args[1]); - - *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; - struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; - struct cls_struct_3_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 13 14 178 179 180: 190 192 194" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 190 192 194" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 190 192 194" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c deleted file mode 100644 index a02c463af..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3byte { - unsigned short a; - unsigned char b; -} cls_struct_3byte; - -cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1, - struct cls_struct_3byte a2) -{ - struct cls_struct_3byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3byte a1, a2; - - a1 = *(struct cls_struct_3byte*)(args[0]); - a2 = *(struct cls_struct_3byte*)(args[1]); - - *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3byte g_dbl = { 12, 119 }; - struct cls_struct_3byte f_dbl = { 1, 15 }; - struct cls_struct_3byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 119 1 15: 13 134" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 134" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 119 1 15: 13 134" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 134" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c deleted file mode 100644 index c7251cead..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3byte_1 { - unsigned char a; - unsigned short b; -} cls_struct_3byte_1; - -cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1, - struct cls_struct_3byte_1 a2) -{ - struct cls_struct_3byte_1 result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3byte_1 a1, a2; - - a1 = *(struct cls_struct_3byte_1*)(args[0]); - a2 = *(struct cls_struct_3byte_1*)(args[1]); - - *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3byte_1 g_dbl = { 15, 125 }; - struct cls_struct_3byte_1 f_dbl = { 9, 19 }; - struct cls_struct_3byte_1 res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl); - /* { dg-output "15 125 9 19: 24 144" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 24 144" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl); - /* { dg-output "\n15 125 9 19: 24 144" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 24 144" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c deleted file mode 100644 index 2d6d8b622..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_4_1byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; -} cls_struct_4_1byte; - -cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1, - struct cls_struct_4_1byte a2) -{ - struct cls_struct_4_1byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_4_1byte a1, a2; - - a1 = *(struct cls_struct_4_1byte*)(args[0]); - a2 = *(struct cls_struct_4_1byte*)(args[1]); - - *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; - struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; - struct cls_struct_4_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 190 192 194 196" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 190 192 194 196" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c deleted file mode 100644 index 4ac378776..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_4byte { - unsigned short a; - unsigned short b; -} cls_struct_4byte; - -cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1, - struct cls_struct_4byte a2) -{ - struct cls_struct_4byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_4byte a1, a2; - - a1 = *(struct cls_struct_4byte*)(args[0]); - a2 = *(struct cls_struct_4byte*)(args[1]); - - *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_4byte g_dbl = { 127, 120 }; - struct cls_struct_4byte f_dbl = { 12, 128 }; - struct cls_struct_4byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 12 128: 139 248" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 139 248" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 12 128: 139 248" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 139 248" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c deleted file mode 100644 index ad9d51c24..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c +++ /dev/null @@ -1,109 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_5byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; -} cls_struct_5byte; - -cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, - struct cls_struct_5byte a2) -{ - struct cls_struct_5byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - - printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, - a2.a, a2.b, a2.c, a2.d, a2.e, - result.a, result.b, result.c, result.d, result.e); - - return result; -} - -static void -cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_5byte a1, a2; - - a1 = *(struct cls_struct_5byte*)(args[0]); - a2 = *(struct cls_struct_5byte*)(args[1]); - - *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[6]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; - struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; - struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ - printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 139 248 10 6 8" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ - printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 139 248 10 6 8" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c deleted file mode 100644 index 4e0c0003c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_5byte { - unsigned short a; - unsigned short b; - unsigned char c; -} cls_struct_5byte; - -cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, - struct cls_struct_5byte a2) -{ - struct cls_struct_5byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, - result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_5byte a1, a2; - - a1 = *(struct cls_struct_5byte*)(args[0]); - a2 = *(struct cls_struct_5byte*)(args[1]); - - *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_5byte g_dbl = { 127, 120, 1 }; - struct cls_struct_5byte f_dbl = { 12, 128, 9 }; - struct cls_struct_5byte res_dbl = { 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 12 128 9: 139 248 10" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 139 248 10" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 139 248 10" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c deleted file mode 100644 index a55edc2c7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_64byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; -} cls_struct_64byte; - -cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0, - struct cls_struct_64byte b1, - struct cls_struct_64byte b2, - struct cls_struct_64byte b3) -{ - struct cls_struct_64byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - - printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h); - - return result; -} - -static void -cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_64byte b0, b1, b2, b3; - - b0 = *(struct cls_struct_64byte*)(args[0]); - b1 = *(struct cls_struct_64byte*)(args[1]); - b2 = *(struct cls_struct_64byte*)(args[2]); - b3 = *(struct cls_struct_64byte*)(args[3]); - - *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[9]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; - struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; - struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; - struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; - struct cls_struct_64byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18" } */ - printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte, - cls_struct_64byte, - cls_struct_64byte, - cls_struct_64byte)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18" } */ - printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c deleted file mode 100644 index b4dcdba47..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_6byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; - unsigned char f; -} cls_struct_6byte; - -cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, - struct cls_struct_6byte a2) -{ - struct cls_struct_6byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - result.f = a1.f + a2.f; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, - result.a, result.b, result.c, result.d, result.e, result.f); - - return result; -} - -static void -cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_6byte a1, a2; - - a1 = *(struct cls_struct_6byte*)(args[0]); - a2 = *(struct cls_struct_6byte*)(args[1]); - - *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[7]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; - struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; - struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = &ffi_type_uchar; - cls_struct_fields[6] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ - printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f); - /* { dg-output "\nres: 139 248 10 6 8 10" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - res_dbl.f = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ - printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f); - /* { dg-output "\nres: 139 248 10 6 8 10" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c deleted file mode 100644 index 740678017..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_6byte { - unsigned short a; - unsigned short b; - unsigned char c; - unsigned char d; -} cls_struct_6byte; - -cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, - struct cls_struct_6byte a2) -{ - struct cls_struct_6byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_6byte a1, a2; - - a1 = *(struct cls_struct_6byte*)(args[0]); - a2 = *(struct cls_struct_6byte*)(args[1]); - - *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; - struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; - struct cls_struct_6byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 255" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 255" } */ - - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c deleted file mode 100644 index 14a7e96f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_7byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; - unsigned char f; - unsigned char g; -} cls_struct_7byte; - -cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, - struct cls_struct_7byte a2) -{ - struct cls_struct_7byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - result.f = a1.f + a2.f; - result.g = a1.g + a2.g; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - result.a, result.b, result.c, result.d, result.e, result.f, result.g); - - return result; -} - -static void -cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_7byte a1, a2; - - a1 = *(struct cls_struct_7byte*)(args[0]); - a2 = *(struct cls_struct_7byte*)(args[1]); - - *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; - struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; - struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = &ffi_type_uchar; - cls_struct_fields[6] = &ffi_type_uchar; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ - printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - res_dbl.f = 0; - res_dbl.g = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ - printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c deleted file mode 100644 index 1645cc635..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_7byte { - unsigned short a; - unsigned short b; - unsigned char c; - unsigned short d; -} cls_struct_7byte; - -cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, - struct cls_struct_7byte a2) -{ - struct cls_struct_7byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_7byte a1, a2; - - a1 = *(struct cls_struct_7byte*)(args[0]); - a2 = *(struct cls_struct_7byte*)(args[1]); - - *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; - struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; - struct cls_struct_7byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_ushort; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 509" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 509" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c deleted file mode 100644 index f6c1ea570..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_8byte { - int a; - float b; -} cls_struct_8byte; - -cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1, - struct cls_struct_8byte a2) -{ - struct cls_struct_8byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_8byte a1, a2; - - a1 = *(struct cls_struct_8byte*)(args[0]); - a2 = *(struct cls_struct_8byte*)(args[1]); - - *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_8byte g_dbl = { 1, 2.0 }; - struct cls_struct_8byte f_dbl = { 4, 5.0 }; - struct cls_struct_8byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 4 5: 5 7" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 5 7" } */ - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 4 5: 5 7" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 5 7" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c deleted file mode 100644 index 0b8572223..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Darwin/AIX do double-word - alignment of the struct if the first element is a double. - Check that it does not here. - Limitations: none. - PR: none. - Originator: 20030914 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_9byte { - int a; - double b; -} cls_struct_9byte; - -cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, - struct cls_struct_9byte b2) -{ - struct cls_struct_9byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - - printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, - result.a, result.b); - - return result; -} - -static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_9byte b1, b2; - - b1 = *(struct cls_struct_9byte*)(args[0]); - b2 = *(struct cls_struct_9byte*)(args[1]); - - *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_9byte h_dbl = { 7, 8.0}; - struct cls_struct_9byte j_dbl = { 1, 9.0}; - struct cls_struct_9byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 1 9: 8 17" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 1 9: 8 17" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c deleted file mode 100644 index edf991de7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Darwin/AIX do double-word - alignment of the struct if the first element is a double. - Check that it does here. - Limitations: none. - PR: none. - Originator: 20030914 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_9byte { - double a; - int b; -} cls_struct_9byte; - -cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, - struct cls_struct_9byte b2) -{ - struct cls_struct_9byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - - printf("%g %d %g %d: %g %d\n", b1.a, b1.b, b2.a, b2.b, - result.a, result.b); - - return result; -} - -static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_9byte b1, b2; - - b1 = *(struct cls_struct_9byte*)(args[0]); - b2 = *(struct cls_struct_9byte*)(args[1]); - - *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_9byte h_dbl = { 7.0, 8}; - struct cls_struct_9byte j_dbl = { 1.0, 9}; - struct cls_struct_9byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 1 9: 8 17" } */ - printf("res: %g %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 1 9: 8 17" } */ - printf("res: %g %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c deleted file mode 100644 index aad5f3ced..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of double. - Limitations: none. - PR: none. - Originator: 20031203 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - double b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c deleted file mode 100644 index 37e085529..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of float. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - float b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c deleted file mode 100644 index b3322d861..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - long double b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c deleted file mode 100644 index 15f936546..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +++ /dev/null @@ -1,134 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ -/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - long double a; - long double b; - long double c; - long double d; - long double e; - long double f; - long double g; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn( - cls_struct_align a1, - cls_struct_align a2) -{ - struct cls_struct_align r; - - r.a = a1.a + a2.a; - r.b = a1.b + a2.b; - r.c = a1.c + a2.c; - r.d = a1.d + a2.d; - r.e = a1.e + a2.e; - r.f = a1.f + a2.f; - r.g = a1.g + a2.g; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " - "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -cls_struct_align cls_struct_align_fn2( - cls_struct_align a1) -{ - struct cls_struct_align r; - - r.a = a1.a + 1; - r.b = a1.b + 1; - r.c = a1.c + 1; - r.d = a1.d + 1; - r.e = a1.e + 1; - r.f = a1.f + 1; - r.g = a1.g + 1; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: " - "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; - struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_longdouble; - cls_struct_fields[3] = &ffi_type_longdouble; - cls_struct_fields[4] = &ffi_type_longdouble; - cls_struct_fields[5] = &ffi_type_longdouble; - cls_struct_fields[6] = &ffi_type_longdouble; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c deleted file mode 100644 index ca1c356cb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/18/2007 -*/ - -/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ -/* { dg-do run { xfail strongarm*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ -/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - long double a; - long double b; - long double c; - long double d; - long double e; - double f; - long double g; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn( - cls_struct_align a1, - cls_struct_align a2) -{ - struct cls_struct_align r; - - r.a = a1.a + a2.a; - r.b = a1.b + a2.b; - r.c = a1.c + a2.c; - r.d = a1.d + a2.d; - r.e = a1.e + a2.e; - r.f = a1.f + a2.f; - r.g = a1.g + a2.g; - - printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: " - "%Lg %Lg %Lg %Lg %Lg %g %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; - struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_longdouble; - cls_struct_fields[3] = &ffi_type_longdouble; - cls_struct_fields[4] = &ffi_type_longdouble; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_longdouble; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - exit(0); -} - - - diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c deleted file mode 100644 index 8fbf36a5c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of pointer. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - void *b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b); - result.c = a1.c + a2.c; - - printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", - a1.a, (uintptr_t)a1.b, a1.c, - a2.a, (uintptr_t)a2.b, a2.c, - result.a, (uintptr_t)result.b, - result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; - struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_pointer; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c deleted file mode 100644 index 039b87473..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint16. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed short b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sshort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c deleted file mode 100644 index c96c6d136..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint32. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed int b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c deleted file mode 100644 index 9aa7bdddf..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint64. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed long long b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sint64; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c deleted file mode 100644 index 97620b79d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint16. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned short b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c deleted file mode 100644 index 5766fadf0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint32. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned int b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c deleted file mode 100644 index a52cb8939..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint64. - Limitations: none. - PR: none. - Originator: 20031203 */ - - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned long long b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint64; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c deleted file mode 100644 index d6637911e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check double arguments in structs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/23/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct Dbls { - double x; - double y; -} Dbls; - -void -closure_test_fn(Dbls p) -{ - printf("%.1f %.1f\n", p.x, p.y); -} - -void -closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - closure_test_fn(*(Dbls*)args[0]); -} - -int main(int argc __UNUSED__, char** argv __UNUSED__) -{ - ffi_cif cif; - - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* cl_arg_types[1]; - - ffi_type ts1_type; - ffi_type* ts1_type_elements[4]; - - Dbls arg = { 1.0, 2.0 }; - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - - ts1_type_elements[0] = &ffi_type_double; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = NULL; - - cl_arg_types[0] = &ts1_type; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_void, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); - - ((void*(*)(Dbls))(code))(arg); - /* { dg-output "1.0 2.0\n" } */ - - closure_test_fn(arg); - /* { dg-output "1.0 2.0\n" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double.c deleted file mode 100644 index 84ad4cb7d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(double *)resp = *(double *)args[0]; - - printf("%f: %f\n",*(double *)args[0], - *(double *)resp); - } -typedef double (*cls_ret_double)(double); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - double res; - - cl_arg_types[0] = &ffi_type_double; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_double)code))(21474.789); - /* { dg-output "21474.789000: 21474.789000" } */ - printf("res: %.6f\n", res); - /* { dg-output "\nres: 21474.789000" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c deleted file mode 100644 index e077f92b8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-output "" { xfail avr32*-*-* } } */ -/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ - -#include "ffitest.h" - -static void -cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - double doubleValue = *(double*)args[1]; - - *(ffi_arg*)resp = printf(format, doubleValue); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - ffi_type* arg_types[3]; - - char* format = "%.1f\n"; - double doubleArg = 7; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_double; - arg_types[2] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &doubleArg; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(printf), &res, args); - /* { dg-output "7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, - code) == FFI_OK); - - res = ((int(*)(char*, ...))(code))(format, doubleArg); - /* { dg-output "\n7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_float.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_float.c deleted file mode 100644 index 0090fed90..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_float.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(float *)resp = *(float *)args[0]; - - printf("%g: %g\n",*(float *)args[0], - *(float *)resp); - } - -typedef float (*cls_ret_float)(float); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - float res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_float, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_float)code)(-2122.12))); - /* { dg-output "\\-2122.12: \\-2122.12" } */ - printf("res: %.6f\n", res); - /* { dg-output "\nres: \-2122.120117" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c deleted file mode 100644 index 5dc9ac768..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check long double arguments. - Limitations: none. - PR: none. - Originator: Blake Chaffin */ - -/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ -/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have - remove the xfail for arm*-*-* below, until we know more. */ -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ -/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ - -#include "ffitest.h" - -long double cls_ldouble_fn( - long double a1, - long double a2, - long double a3, - long double a4, - long double a5, - long double a6, - long double a7, - long double a8) -{ - long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", - a1, a2, a3, a4, a5, a6, a7, a8, r); - - return r; -} - -static void -cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - long double a1 = *(long double*)args[0]; - long double a2 = *(long double*)args[1]; - long double a3 = *(long double*)args[2]; - long double a4 = *(long double*)args[3]; - long double a5 = *(long double*)args[4]; - long double a6 = *(long double*)args[5]; - long double a7 = *(long double*)args[6]; - long double a8 = *(long double*)args[7]; - - *(long double*)resp = cls_ldouble_fn( - a1, a2, a3, a4, a5, a6, a7, a8); -} - -int main(void) -{ - ffi_cif cif; - void* code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[9]; - ffi_type* arg_types[9]; - long double res = 0; - - long double arg1 = 1; - long double arg2 = 2; - long double arg3 = 3; - long double arg4 = 4; - long double arg5 = 5; - long double arg6 = 6; - long double arg7 = 7; - long double arg8 = 8; - - arg_types[0] = &ffi_type_longdouble; - arg_types[1] = &ffi_type_longdouble; - arg_types[2] = &ffi_type_longdouble; - arg_types[3] = &ffi_type_longdouble; - arg_types[4] = &ffi_type_longdouble; - arg_types[5] = &ffi_type_longdouble; - arg_types[6] = &ffi_type_longdouble; - arg_types[7] = &ffi_type_longdouble; - arg_types[8] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = &arg3; - args[3] = &arg4; - args[4] = &arg5; - args[5] = &arg6; - args[6] = &arg7; - args[7] = &arg8; - args[8] = NULL; - - ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); - /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ - printf("res: %Lg\n", res); - /* { dg-output "\nres: 36" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); - - res = ((long double(*)(long double, long double, long double, long double, - long double, long double, long double, long double))(code))(arg1, arg2, - arg3, arg4, arg5, arg6, arg7, arg8); - /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ - printf("res: %Lg\n", res); - /* { dg-output "\nres: 36" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c deleted file mode 100644 index 39b438b28..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test long doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ -/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ - -#include "ffitest.h" - -static void -cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - long double ldValue = *(long double*)args[1]; - - *(ffi_arg*)resp = printf(format, ldValue); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - ffi_type* arg_types[3]; - - char* format = "%.1Lf\n"; - long double ldArg = 7; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_longdouble; - arg_types[2] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &ldArg; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(printf), &res, args); - /* { dg-output "7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, - code) == FFI_OK); - - res = ((int(*)(char*, ...))(code))(format, ldArg); - /* { dg-output "\n7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_schar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_schar.c deleted file mode 100644 index 71df7b651..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_schar.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed char test_func_fn(signed char a1, signed char a2) -{ - signed char result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed char a1, a2; - - a1 = *(signed char *)avals[0]; - a2 = *(signed char *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef signed char (*test_type)(signed char, signed char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - signed char a, b, res_closure; - - a = 2; - b = 125; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = &ffi_type_schar; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_schar, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 125: 127" } */ - printf("res: %d\n", (signed char)res_call); - /* { dg-output "\nres: 127" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 125); - /* { dg-output "\n2 125: 127" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshort.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshort.c deleted file mode 100644 index 4c3915326..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed short values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed short test_func_fn(signed short a1, signed short a2) -{ - signed short result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed short a1, a2; - - a1 = *(signed short *)avals[0]; - a2 = *(signed short *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef signed short (*test_type)(signed short, signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - unsigned short a, b, res_closure; - - a = 2; - b = 32765; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_sshort; - cl_arg_types[1] = &ffi_type_sshort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 32765: 32767" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 32767" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 32765); - /* { dg-output "\n2 32765: 32767" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32767" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshortchar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshortchar.c deleted file mode 100644 index 1c3aeb5a6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed short/char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed short test_func_fn(signed char a1, signed short a2, - signed char a3, signed short a4) -{ - signed short result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed char a1, a3; - signed short a2, a4; - - a1 = *(signed char *)avals[0]; - a2 = *(signed short *)avals[1]; - a3 = *(signed char *)avals[2]; - a4 = *(signed short *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef signed short (*test_type)(signed char, signed short, - signed char, signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - signed char a, c; - signed short b, d, res_closure; - - a = 1; - b = 32765; - c = 127; - d = -128; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = &ffi_type_sshort; - cl_arg_types[2] = &ffi_type_schar; - cl_arg_types[3] = &ffi_type_sshort; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 32765 127 -128: 32765" } */ - printf("res: %d\n", (signed short)res_call); - /* { dg-output "\nres: 32765" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 32765, 127, -128); - /* { dg-output "\n1 32765 127 -128: 32765" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32765" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_uchar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_uchar.c deleted file mode 100644 index 009c02c72..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_uchar.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned char test_func_fn(unsigned char a1, unsigned char a2, - unsigned char a3, unsigned char a4) -{ - unsigned char result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned char a1, a2, a3, a4; - - a1 = *(unsigned char *)avals[0]; - a2 = *(unsigned char *)avals[1]; - a3 = *(unsigned char *)avals[2]; - a4 = *(unsigned char *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef unsigned char (*test_type)(unsigned char, unsigned char, - unsigned char, unsigned char); - -void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, - void *data __UNUSED__) -{ - printf("%d %d %d %d\n", *(unsigned char *)avals[0], - *(unsigned char *)avals[1], *(unsigned char *)avals[2], - *(unsigned char *)avals[3]); -} -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - unsigned char a, b, c, d, res_closure; - - a = 1; - b = 2; - c = 127; - d = 125; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_uchar; - cl_arg_types[2] = &ffi_type_uchar; - cl_arg_types[3] = &ffi_type_uchar; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 2 127 125: 255" } */ - printf("res: %d\n", (unsigned char)res_call); - /* { dg-output "\nres: 255" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 2, 127, 125); - /* { dg-output "\n1 2 127 125: 255" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 255" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushort.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushort.c deleted file mode 100644 index dd10ca734..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned short values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned short test_func_fn(unsigned short a1, unsigned short a2) -{ - unsigned short result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned short a1, a2; - - a1 = *(unsigned short *)avals[0]; - a2 = *(unsigned short *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef unsigned short (*test_type)(unsigned short, unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - unsigned short a, b, res_closure; - - a = 2; - b = 32765; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 32765: 32767" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 32767" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 32765); - /* { dg-output "\n2 32765: 32767" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32767" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushortchar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushortchar.c deleted file mode 100644 index 2588e97f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned short/char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned short test_func_fn(unsigned char a1, unsigned short a2, - unsigned char a3, unsigned short a4) -{ - unsigned short result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned char a1, a3; - unsigned short a2, a4; - - a1 = *(unsigned char *)avals[0]; - a2 = *(unsigned short *)avals[1]; - a3 = *(unsigned char *)avals[2]; - a4 = *(unsigned short *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef unsigned short (*test_type)(unsigned char, unsigned short, - unsigned char, unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - unsigned char a, c; - unsigned short b, d, res_closure; - - a = 1; - b = 2; - c = 127; - d = 128; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = &ffi_type_uchar; - cl_arg_types[3] = &ffi_type_ushort; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 2 127 128: 258" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 258" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 2, 127, 128); - /* { dg-output "\n1 2 127 128: 258" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 258" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c deleted file mode 100644 index d82a87a71..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check pointer arguments. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -void* cls_pointer_fn(void* a1, void* a2) -{ - void* result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(uintptr_t) a1, - (unsigned int)(uintptr_t) a2, - (unsigned int)(uintptr_t) result); - - return result; -} - -static void -cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - void* a1 = *(void**)(args[0]); - void* a2 = *(void**)(args[1]); - - *(void**)resp = cls_pointer_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - /* ffi_type cls_pointer_type; */ - ffi_type* arg_types[3]; - -/* cls_pointer_type.size = sizeof(void*); - cls_pointer_type.alignment = 0; - cls_pointer_type.type = FFI_TYPE_POINTER; - cls_pointer_type.elements = NULL;*/ - - void* arg1 = (void*)0x12345678; - void* arg2 = (void*)0x89abcdef; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_pointer; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); - /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\nres: 0x9be02467" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); - - res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); - /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\nres: 0x9be02467" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c deleted file mode 100644 index 1f1d9157b..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check pointer arguments across multiple hideous stack frames. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/7/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -static long dummyVar; - -long dummy_func( - long double a1, char b1, - long double a2, char b2, - long double a3, char b3, - long double a4, char b4) -{ - return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4; -} - -void* cls_pointer_fn2(void* a1, void* a2) -{ - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(uintptr_t) a1, - (unsigned int)(uintptr_t) a2, - (unsigned int)(uintptr_t) result); - - return result; -} - -void* cls_pointer_fn1(void* a1, void* a2) -{ - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(intptr_t) a1, - (unsigned int)(intptr_t) a2, - (unsigned int)(intptr_t) result); - - result = cls_pointer_fn2(result, a1); - - return result; -} - -static void -cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - void* a1 = *(void**)(args[0]); - void* a2 = *(void**)(args[1]); - - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - *(void**)resp = cls_pointer_fn1(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - /* ffi_type cls_pointer_type; */ - ffi_type* arg_types[3]; - -/* cls_pointer_type.size = sizeof(void*); - cls_pointer_type.alignment = 0; - cls_pointer_type.type = FFI_TYPE_POINTER; - cls_pointer_type.elements = NULL;*/ - - void* arg1 = (void*)0x01234567; - void* arg2 = (void*)0x89abcdef; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_pointer; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = NULL; - - printf("\n"); - ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); - - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ - /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ - /* { dg-output "\nres: 0x8bf258bd" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); - - res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); - - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ - /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ - /* { dg-output "\nres: 0x8bf258bd" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_schar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_schar.c deleted file mode 100644 index 82986b172..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_schar.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Check return value schar. - Limitations: none. - PR: none. - Originator: 20031108 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed char *)args[0]; - printf("%d: %d\n",*(signed char *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed char (*cls_ret_schar)(signed char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed char res; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_schar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_schar)code))(127); - /* { dg-output "127: 127" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sint.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sint.c deleted file mode 100644 index c7e13b73a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sint.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value sint32. - Limitations: none. - PR: none. - Originator: 20031108 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed int *)args[0]; - printf("%d: %d\n",*(signed int *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed int (*cls_ret_sint)(signed int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed int res; - - cl_arg_types[0] = &ffi_type_sint; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_sint)code))(65534); - /* { dg-output "65534: 65534" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 65534" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sshort.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sshort.c deleted file mode 100644 index 846d57ed1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_sshort.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value sshort. - Limitations: none. - PR: none. - Originator: 20031108 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed short *)args[0]; - printf("%d: %d\n",*(signed short *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed short (*cls_ret_sshort)(signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed short res; - - cl_arg_types[0] = &ffi_type_sshort; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_sshort)code))(255); - /* { dg-output "255: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c deleted file mode 100644 index 6d1fdaeb6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ -#include "ffitest.h" - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static void -test_fn (ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - int n = *(int*)args[0]; - struct small_tag s1 = * (struct small_tag *) args[1]; - struct large_tag l1 = * (struct large_tag *) args[2]; - struct small_tag s2 = * (struct small_tag *) args[3]; - - printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, - l1.a, l1.b, l1.c, l1.d, l1.e, - s2.a, s2.b); - * (ffi_arg*) resp = 42; -} - -int -main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); - ffi_type* arg_types[5]; - - ffi_arg res = 0; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int si; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, - arg_types) == FFI_OK); - - si = 4; - s1.a = 5; - s1.b = 6; - - s2.a = 20; - s2.b = 21; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); - - res = ((int (*)(int, ...))(code))(si, s1, l1, s2); - /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar.c deleted file mode 100644 index c1317e795..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value uchar. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(unsigned char *)args[0]; - printf("%d: %d\n",*(unsigned char *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned char (*cls_ret_uchar)(unsigned char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned char res; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_uchar)code))(127); - /* { dg-output "127: 127" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c deleted file mode 100644 index 6491c5b3d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uchar_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned char argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned char T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_uchar; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint.c deleted file mode 100644 index 885cff5c3..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value uint. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg *)resp = *(unsigned int *)args[0]; - - printf("%d: %d\n",*(unsigned int *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned int (*cls_ret_uint)(unsigned int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned int res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_uint)code))(2147483647); - /* { dg-output "2147483647: 2147483647" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 2147483647" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint_va.c deleted file mode 100644 index b04cfd19c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_uint_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned int argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned int T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = &ffi_type_uint; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c deleted file mode 100644 index 0315082e0..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulong_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned long argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned long T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(T *)resp = *(T *)args[0]; - - printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_ulong; - cl_arg_types[1] = &ffi_type_ulong; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ulong, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %ld\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c deleted file mode 100644 index 62f2cae63..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ulonglong.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Area: closure_call - Purpose: Check return value long long. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0]; - - printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], - *(unsigned long long *)(resp)); -} -typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned long long res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint64, cl_arg_types) == FFI_OK); - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); - res = (*((cls_ret_ulonglong)code))(214LL); - /* { dg-output "214: 1152921504606846761" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 1152921504606846761" } */ - - res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); - /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 8070450533247928831" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort.c deleted file mode 100644 index a00100e07..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value ushort. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(unsigned short *)args[0]; - - printf("%d: %d\n",*(unsigned short *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned short (*cls_ret_ushort)(unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned short res; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_ushort)code))(65535); - /* { dg-output "65535: 65535" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 65535" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c deleted file mode 100644 index 37aa1064e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/cls_ushort_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned short argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned short T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c deleted file mode 100644 index f5a73179e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_prep_cif, ffi_prep_closure - Purpose: Test error return for bad ABIs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static void -dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args __UNUSED__, void* userdata __UNUSED__) -{} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* arg_types[1]; - - arg_types[0] = NULL; - - CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void, - arg_types) == FFI_BAD_ABI); - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, - arg_types) == FFI_OK); - - cif.abi= 255; - - CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c deleted file mode 100644 index bf6016186..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Area: ffi_prep_cif - Purpose: Test error return for bad typedefs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -int main (void) -{ - ffi_cif cif; - ffi_type* arg_types[1]; - - ffi_type badType = ffi_type_void; - - arg_types[0] = NULL; - - badType.size = 0; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, - arg_types) == FFI_BAD_TYPEDEF); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h deleted file mode 100644 index 15d5e4412..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#include -#include -#include "fficonfig.h" - -#if defined HAVE_STDINT_H -#include -#endif - -#if defined HAVE_INTTYPES_H -#include -#endif - -#define MAX_ARGS 256 - -#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) - -/* Define macros so that compilers other than gcc can run the tests. */ -#undef __UNUSED__ -#if defined(__GNUC__) -#define __UNUSED__ __attribute__((__unused__)) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#else -#define __UNUSED__ -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#define ABI_ATTR -#endif - -/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a - file open. */ -#ifdef HAVE_MMAP_ANON -# undef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) -# define MAP_ANONYMOUS MAP_ANON -# endif -# define USING_MMAP - -#endif - -#ifdef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# define USING_MMAP - -#endif - -/* MinGW kludge. */ -#ifdef _WIN64 -#define PRIdLL "I64d" -#define PRIuLL "I64u" -#else -#define PRIdLL "lld" -#define PRIuLL "llu" -#endif - -/* Tru64 UNIX kludge. */ -#if defined(__alpha__) && defined(__osf__) -/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ -#undef PRIdLL -#define PRIdLL "ld" -#undef PRIuLL -#define PRIuLL "lu" -#define PRId8 "hd" -#define PRIu8 "hu" -#define PRId64 "ld" -#define PRIu64 "lu" -#define PRIuPTR "lu" -#endif - -/* PA HP-UX kludge. */ -#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) -#define PRIuPTR "lu" -#endif - -/* IRIX kludge. */ -#if defined(__sgi) -/* IRIX 6.5 provides all definitions, but only for C99 - compilations. */ -#define PRId8 "hhd" -#define PRIu8 "hhu" -#if (_MIPS_SZLONG == 32) -#define PRId64 "lld" -#define PRIu64 "llu" -#endif -/* This doesn't match , which always has "lld" here, but the - arguments are uint64_t, int64_t, which are unsigned long, long for - 64-bit in . */ -#if (_MIPS_SZLONG == 64) -#define PRId64 "ld" -#define PRIu64 "lu" -#endif -/* This doesn't match , which has "u" here, but the arguments - are uintptr_t, which is always unsigned long. */ -#define PRIuPTR "lu" -#endif - -/* Solaris < 10 kludge. */ -#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) -#if defined(__arch64__) || defined (__x86_64__) -#define PRIuPTR "lu" -#else -#define PRIuPTR "u" -#endif -#endif - -/* MSVC kludge. */ -#if defined _MSC_VER -#define PRIuPTR "lu" -#define PRIu8 "u" -#define PRId8 "d" -#define PRIu64 "I64u" -#define PRId64 "I64d" -#endif - -#ifndef PRIuPTR -#define PRIuPTR "u" -#endif diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float.c deleted file mode 100644 index fbc272d84..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static int floating(int a, float b, double c, long double d) -{ - int i; - - i = (int) ((float)a/b + ((float)c/(float)d)); - - return i; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - float f; - signed int si1; - double d; - long double ld; - - args[0] = &ffi_type_sint; - values[0] = &si1; - args[1] = &ffi_type_float; - values[1] = &f; - args[2] = &ffi_type_double; - values[2] = &d; - args[3] = &ffi_type_longdouble; - values[3] = &ld; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sint, args) == FFI_OK); - - si1 = 6; - f = 3.14159; - d = (double)1.0/(double)3.0; - ld = 2.71828182846L; - - floating (si1, f, d, ld); - - ffi_call(&cif, FFI_FN(floating), &rint, values); - - printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld)); - - CHECK((int)rint == floating(si1, f, d, ld)); - - exit (0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float1.c deleted file mode 100644 index 991d059fe..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float1.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -#include "float.h" - -typedef union -{ - double d; - unsigned char c[sizeof (double)]; -} value_type; - -#define CANARY 0xba - -static double dblit(float f) -{ - return f/3.0; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float f; - value_type result[2]; - unsigned int i; - - args[0] = &ffi_type_float; - values[0] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - f = 3.14159; - - /* Put a canary in the return array. This is a regression test for - a buffer overrun. */ - memset(result[1].c, CANARY, sizeof (double)); - - ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); - - /* These are not always the same!! Check for a reasonable delta */ - - CHECK(result[0].d - dblit(f) < DBL_EPSILON); - - /* Check the canary. */ - for (i = 0; i < sizeof (double); ++i) - CHECK(result[1].c[i] == CANARY); - - exit(0); - -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float2.c deleted file mode 100644 index a0b296cf4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float2.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */ -/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ - -#include "ffitest.h" -#include "float.h" - -static long double ldblit(float f) -{ - return (long double) (((long double) f)/ (long double) 3.0); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float f; - long double ld; - - args[0] = &ffi_type_float; - values[0] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_longdouble, args) == FFI_OK); - - f = 3.14159; - -#if 1 - /* This is ifdef'd out for now. long double support under SunOS/gcc - is pretty much non-existent. You'll get the odd bus error in library - routines like printf(). */ - printf ("%Lf\n", ldblit(f)); -#endif - ld = 666; - ffi_call(&cif, FFI_FN(ldblit), &ld, values); - -#if 1 - /* This is ifdef'd out for now. long double support under SunOS/gcc - is pretty much non-existent. You'll get the odd bus error in library - routines like printf(). */ - printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); -#endif - - /* These are not always the same!! Check for a reasonable delta */ - if (ld - ldblit(f) < LDBL_EPSILON) - puts("long double return value tests ok!"); - else - CHECK(0); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float3.c deleted file mode 100644 index 76bd5f287..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float3.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Area: ffi_call - Purpose: Check float arguments with different orders. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" -#include "float.h" - -static double floating_1(float a, double b, long double c) -{ - return (double) a + b + (double) c; -} - -static double floating_2(long double a, double b, float c) -{ - return (double) a + b + (double) c; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double rd; - - float f; - double d; - long double ld; - - args[0] = &ffi_type_float; - values[0] = &f; - args[1] = &ffi_type_double; - values[1] = &d; - args[2] = &ffi_type_longdouble; - values[2] = &ld; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_double, args) == FFI_OK); - - f = 3.14159; - d = (double)1.0/(double)3.0; - ld = 2.71828182846L; - - floating_1 (f, d, ld); - - ffi_call(&cif, FFI_FN(floating_1), &rd, values); - - CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON); - - args[0] = &ffi_type_longdouble; - values[0] = &ld; - args[1] = &ffi_type_double; - values[1] = &d; - args[2] = &ffi_type_float; - values[2] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_double, args) == FFI_OK); - - floating_2 (ld, d, f); - - ffi_call(&cif, FFI_FN(floating_2), &rd, values); - - CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON); - - exit (0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float4.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float4.c deleted file mode 100644 index 0dd6d85e7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float4.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Area: ffi_call - Purpose: Check denorm double value. - Limitations: none. - PR: PR26483. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -/* { dg-options "-mieee" { target alpha*-*-* } } */ - -#include "ffitest.h" -#include "float.h" - -typedef union -{ - double d; - unsigned char c[sizeof (double)]; -} value_type; - -#define CANARY 0xba - -static double dblit(double d) -{ - return d; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double d; - value_type result[2]; - unsigned int i; - - args[0] = &ffi_type_double; - values[0] = &d; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - d = DBL_MIN / 2; - - /* Put a canary in the return array. This is a regression test for - a buffer overrun. */ - memset(result[1].c, CANARY, sizeof (double)); - - ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); - - /* The standard delta check doesn't work for denorms. Since we didn't do - any arithmetic, we should get the original result back, and hence an - exact check should be OK here. */ - - CHECK(result[0].d == dblit(d)); - - /* Check the canary. */ - for (i = 0; i < sizeof (double); ++i) - CHECK(result[1].c[i] == CANARY); - - exit(0); - -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c deleted file mode 100644 index 5acff91f6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Area: fp and variadics - Purpose: check fp inputs and returns work on variadics, even the fixed params - Limitations: None - PR: none - Originator: 2011-01-25 - - Intended to stress the difference in ABI on ARM vfp -*/ - -/* { dg-do run } */ - -#include - -#include "ffitest.h" - -/* prints out all the parameters, and returns the sum of them all. - * 'x' is the number of variadic parameters all of which are double in this test - */ -double float_va_fn(unsigned int x, double y,...) -{ - double total=0.0; - va_list ap; - unsigned int i; - - total+=(double)x; - total+=y; - - printf("%u: %.1f :", x, y); - - va_start(ap, y); - for(i=0;i -#include -#include - -static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) -{ -#if 0 - printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", - (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, - (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, - (double) f11, (double) f12, (double) f13); -#endif - - return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[13]; - void *values[13]; - float fa[13]; - float f, ff; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &ffi_type_float; - values[i] = &fa[i]; - fa[i] = (float) i; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 13, - &ffi_type_float, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &f, values); - - ff = many(fa[0], fa[1], - fa[2], fa[3], - fa[4], fa[5], - fa[6], fa[7], - fa[8], fa[9], - fa[10],fa[11],fa[12]); - - if (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c deleted file mode 100644 index 1c85746e4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Area: ffi_call - Purpose: Check uint8_t arguments. - Limitations: none. - PR: PR45677. - Originator: Dan Witte 20100916 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -#define NARGS 7 - -typedef unsigned char u8; - -#ifdef __GNUC__ -__attribute__((noinline)) -#endif -uint8_t -foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return a + b + c + d + e + f + g; -} - -uint8_t ABI_ATTR -bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return foo (a, b, c, d, e, f, g); -} - -int -main (void) -{ - ffi_type *ffitypes[NARGS]; - int i; - ffi_cif cif; - ffi_arg result = 0; - uint8_t args[NARGS]; - void *argptrs[NARGS]; - - for (i = 0; i < NARGS; ++i) - ffitypes[i] = &ffi_type_uint8; - - CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS, - &ffi_type_uint8, ffitypes) == FFI_OK); - - for (i = 0; i < NARGS; ++i) - { - args[i] = i; - argptrs[i] = &args[i]; - } - ffi_call (&cif, FFI_FN (bar), &result, argptrs); - - CHECK (result == 21); - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/negint.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/negint.c deleted file mode 100644 index 6e2f26fc1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/negint.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Area: ffi_call - Purpose: Check that negative integers are passed correctly. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static int checking(int a, short b, signed char c) -{ - - return (a < 0 && b < 0 && c < 0); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - signed int si; - signed short ss; - signed char sc; - - args[0] = &ffi_type_sint; - values[0] = &si; - args[1] = &ffi_type_sshort; - values[1] = &ss; - args[2] = &ffi_type_schar; - values[2] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint, args) == FFI_OK); - - si = -6; - ss = -12; - sc = -1; - - checking (si, ss, sc); - - ffi_call(&cif, FFI_FN(checking), &rint, values); - - printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); - - CHECK(rint != 0); - - exit (0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c deleted file mode 100644 index c15e3a033..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte1 { - double a; - float b; - int c; -} cls_struct_16byte1; - -typedef struct cls_struct_16byte2 { - int ii; - double dd; - float ff; -} cls_struct_16byte2; - -typedef struct cls_struct_combined { - cls_struct_16byte1 d; - cls_struct_16byte2 e; -} cls_struct_combined; - -cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, - struct cls_struct_16byte2 b1, - struct cls_struct_combined b2) -{ - struct cls_struct_combined result; - - result.d.a = b0.a + b1.dd + b2.d.a; - result.d.b = b0.b + b1.ff + b2.d.b; - result.d.c = b0.c + b1.ii + b2.d.c; - result.e.ii = b0.c + b1.ii + b2.e.ii; - result.e.dd = b0.a + b1.dd + b2.e.dd; - result.e.ff = b0.b + b1.ff + b2.e.ff; - - printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n", - b0.a, b0.b, b0.c, - b1.ii, b1.dd, b1.ff, - b2.d.a, b2.d.b, b2.d.c, - b2.e.ii, b2.e.dd, b2.e.ff, - result.d.a, result.d.b, result.d.c, - result.e.ii, result.e.dd, result.e.ff); - - return result; -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_16byte1 b0; - struct cls_struct_16byte2 b1; - struct cls_struct_combined b2; - - b0 = *(struct cls_struct_16byte1*)(args[0]); - b1 = *(struct cls_struct_16byte2*)(args[1]); - b2 = *(struct cls_struct_combined*)(args[2]); - - - *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type* cls_struct_fields1[5]; - ffi_type* cls_struct_fields2[5]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; - struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; - struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, - {3, 1.0, 8.0}}; - struct cls_struct_combined res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - cls_struct_fields1[0] = &ffi_type_sint; - cls_struct_fields1[1] = &ffi_type_double; - cls_struct_fields1[2] = &ffi_type_float; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &cls_struct_type; - cls_struct_fields2[1] = &cls_struct_type1; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, - cls_struct_16byte2, - cls_struct_combined)) - (code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c deleted file mode 100644 index 477a6b9bd..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c +++ /dev/null @@ -1,161 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte1 { - double a; - float b; - int c; -} cls_struct_16byte1; - -typedef struct cls_struct_16byte2 { - int ii; - double dd; - float ff; -} cls_struct_16byte2; - -typedef struct cls_struct_combined { - cls_struct_16byte1 d; - cls_struct_16byte2 e; -} cls_struct_combined; - -cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, - struct cls_struct_16byte2 b1, - struct cls_struct_combined b2, - struct cls_struct_16byte1 b3) -{ - struct cls_struct_combined result; - - result.d.a = b0.a + b1.dd + b2.d.a; - result.d.b = b0.b + b1.ff + b2.d.b; - result.d.c = b0.c + b1.ii + b2.d.c; - result.e.ii = b0.c + b1.ii + b2.e.ii; - result.e.dd = b0.a + b1.dd + b2.e.dd; - result.e.ff = b0.b + b1.ff + b2.e.ff; - - printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n", - b0.a, b0.b, b0.c, - b1.ii, b1.dd, b1.ff, - b2.d.a, b2.d.b, b2.d.c, - b2.e.ii, b2.e.dd, b2.e.ff, - b3.a, b3.b, b3.c, - result.d.a, result.d.b, result.d.c, - result.e.ii, result.e.dd, result.e.ff); - - return result; -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_16byte1 b0; - struct cls_struct_16byte2 b1; - struct cls_struct_combined b2; - struct cls_struct_16byte1 b3; - - b0 = *(struct cls_struct_16byte1*)(args[0]); - b1 = *(struct cls_struct_16byte2*)(args[1]); - b2 = *(struct cls_struct_combined*)(args[2]); - b3 = *(struct cls_struct_16byte1*)(args[3]); - - - *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type* cls_struct_fields1[5]; - ffi_type* cls_struct_fields2[5]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; - struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; - struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, - {3, 1.0, 8.0}}; - struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; - struct cls_struct_combined res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - cls_struct_fields1[0] = &ffi_type_sint; - cls_struct_fields1[1] = &ffi_type_double; - cls_struct_fields1[2] = &ffi_type_float; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &cls_struct_type; - cls_struct_fields2[1] = &cls_struct_type1; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, - cls_struct_16byte2, - cls_struct_combined, - cls_struct_16byte1)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - /* CHECK( 1 == 0); */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c deleted file mode 100644 index 34a74e718..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - unsigned char y; - struct A x; - unsigned int z; -} B; - -typedef struct C { - unsigned long long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b3.z + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[4]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = { 99, {12LL , 127}, 255}; - struct C g_dbl = { 2LL, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &ffi_type_uchar; - cls_struct_fields1[1] = &cls_struct_type; - cls_struct_fields1[2] = &ffi_type_uint; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &ffi_type_uint64; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct11.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct11.c deleted file mode 100644 index 351049382..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct11.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check parameter passing with nested structs - of a single type. This tests the special cases - for homogeneous floating-point aggregates in the - AArch64 PCS. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - float a_x; - float a_y; -} A; - -typedef struct B { - float b_x; - float b_y; -} B; - -typedef struct C { - A a; - B b; -} C; - -static C C_fn (int x, int y, int z, C source, int i, int j, int k) -{ - C result; - result.a.a_x = source.a.a_x; - result.a.a_y = source.a.a_y; - result.b.b_x = source.b.b_x; - result.b.b_y = source.b.b_y; - - printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); - - printf ("%.1f, %.1f, %.1f, %.1f, " - "%.1f, %.1f, %.1f, %.1f\n", - source.a.a_x, source.a.a_y, - source.b.b_x, source.b.b_y, - result.a.a_x, result.a.a_y, - result.b.b_x, result.b.b_y); - - return result; -} - -int main (void) -{ - ffi_cif cif; - - ffi_type* struct_fields_source_a[3]; - ffi_type* struct_fields_source_b[3]; - ffi_type* struct_fields_source_c[3]; - ffi_type* arg_types[8]; - - ffi_type struct_type_a, struct_type_b, struct_type_c; - - struct A source_fld_a = {1.0, 2.0}; - struct B source_fld_b = {4.0, 8.0}; - int k = 1; - - struct C result; - struct C source = {source_fld_a, source_fld_b}; - - struct_type_a.size = 0; - struct_type_a.alignment = 0; - struct_type_a.type = FFI_TYPE_STRUCT; - struct_type_a.elements = struct_fields_source_a; - - struct_type_b.size = 0; - struct_type_b.alignment = 0; - struct_type_b.type = FFI_TYPE_STRUCT; - struct_type_b.elements = struct_fields_source_b; - - struct_type_c.size = 0; - struct_type_c.alignment = 0; - struct_type_c.type = FFI_TYPE_STRUCT; - struct_type_c.elements = struct_fields_source_c; - - struct_fields_source_a[0] = &ffi_type_float; - struct_fields_source_a[1] = &ffi_type_float; - struct_fields_source_a[2] = NULL; - - struct_fields_source_b[0] = &ffi_type_float; - struct_fields_source_b[1] = &ffi_type_float; - struct_fields_source_b[2] = NULL; - - struct_fields_source_c[0] = &struct_type_a; - struct_fields_source_c[1] = &struct_type_b; - struct_fields_source_c[2] = NULL; - - arg_types[0] = &ffi_type_sint32; - arg_types[1] = &ffi_type_sint32; - arg_types[2] = &ffi_type_sint32; - arg_types[3] = &struct_type_c; - arg_types[4] = &ffi_type_sint32; - arg_types[5] = &ffi_type_sint32; - arg_types[6] = &ffi_type_sint32; - arg_types[7] = NULL; - - void *args[7]; - args[0] = &k; - args[1] = &k; - args[2] = &k; - args[3] = &source; - args[4] = &k; - args[5] = &k; - args[6] = &k; - CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, - arg_types) == FFI_OK); - - ffi_call (&cif, FFI_FN (C_fn), &result, args); - /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ - /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ - CHECK (result.a.a_x == source.a.a_x); - CHECK (result.a.a_y == source.a.a_y); - CHECK (result.b.b_x == source.b.b_x); - CHECK (result.b.b_y == source.b.b_y); - exit (0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c deleted file mode 100644 index 69268cdb8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20030911 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -B B_fn(struct A b0, struct B b1) -{ - struct B result; - - result.x.a = b0.a + b1.x.a; - result.x.b = b0.b + b1.x.b + b1.y; - result.y = b0.b + b1.x.b; - - printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y, - result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1, 7}; - struct B f_dbl = {{12 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_ulong; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c deleted file mode 100644 index ab18cad73..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20030911 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -B B_fn(struct A b0, struct B b1) -{ - struct B result; - - result.x.a = b0.a + b1.x.a; - result.x.b = b0.b + b1.x.b + b1.y; - result.y = b0.b + b1.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b, - (int)b1.x.a, b1.x.b, b1.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12LL , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c deleted file mode 100644 index 2ffb4d65a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: PR 25630. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c deleted file mode 100644 index 6c79845d9..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c +++ /dev/null @@ -1,112 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - long double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c deleted file mode 100644 index 59d35796f..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: PR 25630. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - struct C g_dbl = { 2, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_slong; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c deleted file mode 100644 index 27595e6f5..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c deleted file mode 100644 index 0e6c68281..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - unsigned long long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12LL , 127}, 99}; - struct C g_dbl = { 2LL, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_uint64; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c deleted file mode 100644 index 5f7ac6775..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned char a; - unsigned long long b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - unsigned long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b, - b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e, - result.x.a, (int)result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1, 7LL}; - struct B f_dbl = {{12.0 , 127}, 99}; - struct C g_dbl = { 2, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint64; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_ulong; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/problem1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/problem1.c deleted file mode 100644 index 6a91555a1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/problem1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct my_ffi_struct { - double a; - double b; - double c; -} my_ffi_struct; - -my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2) -{ - struct my_ffi_struct result; - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - - printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -void stub(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct my_ffi_struct a1; - struct my_ffi_struct a2; - - a1 = *(struct my_ffi_struct*)(args[0]); - a2 = *(struct my_ffi_struct*)(args[1]); - - *(my_ffi_struct *)resp = callee(a1, a2); -} - - -int main(void) -{ - ffi_type* my_ffi_struct_fields[4]; - ffi_type my_ffi_struct_type; - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[4]; - ffi_type* arg_types[3]; - - struct my_ffi_struct g = { 1.0, 2.0, 3.0 }; - struct my_ffi_struct f = { 1.0, 2.0, 3.0 }; - struct my_ffi_struct res; - - my_ffi_struct_type.size = 0; - my_ffi_struct_type.alignment = 0; - my_ffi_struct_type.type = FFI_TYPE_STRUCT; - my_ffi_struct_type.elements = my_ffi_struct_fields; - - my_ffi_struct_fields[0] = &ffi_type_double; - my_ffi_struct_fields[1] = &ffi_type_double; - my_ffi_struct_fields[2] = &ffi_type_double; - my_ffi_struct_fields[3] = NULL; - - arg_types[0] = &my_ffi_struct_type; - arg_types[1] = &my_ffi_struct_type; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, - arg_types) == FFI_OK); - - args[0] = &g; - args[1] = &f; - args[2] = NULL; - ffi_call(&cif, FFI_FN(callee), &res, args); - /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res.a, res.b, res.c); - /* { dg-output "\nres: 2 4 6" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK); - - res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f); - /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res.a, res.b, res.c); - /* { dg-output "\nres: 2 4 6" } */ - - exit(0);; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/promotion.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/promotion.c deleted file mode 100644 index 44561615d..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/promotion.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Area: ffi_call - Purpose: Promotion test. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -static int promotion(signed char sc, signed short ss, - unsigned char uc, unsigned short us) -{ - int r = (int) sc + (int) ss + (int) uc + (int) us; - - return r; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - signed char sc; - unsigned char uc; - signed short ss; - unsigned short us; - unsigned long ul; - - args[0] = &ffi_type_schar; - args[1] = &ffi_type_sshort; - args[2] = &ffi_type_uchar; - args[3] = &ffi_type_ushort; - values[0] = ≻ - values[1] = &ss; - values[2] = &uc; - values[3] = &us; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sint, args) == FFI_OK); - - us = 0; - ul = 0; - - for (sc = (signed char) -127; - sc <= (signed char) 120; sc += 1) - for (ss = -30000; ss <= 30000; ss += 10000) - for (uc = (unsigned char) 0; - uc <= (unsigned char) 200; uc += 20) - for (us = 0; us <= 60000; us += 10000) - { - ul++; - ffi_call(&cif, FFI_FN(promotion), &rint, values); - CHECK((int)rint == (signed char) sc + (signed short) ss + - (unsigned char) uc + (unsigned short) us); - } - printf("%lu promotion tests run\n", ul); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c deleted file mode 100644 index e29bd6c28..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Area: ffi_call - Purpose: Check different structures. - Limitations: none. - PR: none. - Originator: Ronald Oussoren 20030824 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct Point { - float x; - float y; -} Point; - -typedef struct Size { - float h; - float w; -} Size; - -typedef struct Rect { - Point o; - Size s; -} Rect; - -int doit(int o, char* s, Point p, Rect r, int last) -{ - printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", - o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); - return 42; -} - - -int main(void) -{ - ffi_type point_type; - ffi_type size_type; - ffi_type rect_type; - ffi_cif cif; - ffi_type* arglist[6]; - void* values[6]; - int r; - - /* - * First set up FFI types for the 3 struct types - */ - - point_type.size = 0; /*sizeof(Point);*/ - point_type.alignment = 0; /*__alignof__(Point);*/ - point_type.type = FFI_TYPE_STRUCT; - point_type.elements = malloc(3 * sizeof(ffi_type*)); - point_type.elements[0] = &ffi_type_float; - point_type.elements[1] = &ffi_type_float; - point_type.elements[2] = NULL; - - size_type.size = 0;/* sizeof(Size);*/ - size_type.alignment = 0;/* __alignof__(Size);*/ - size_type.type = FFI_TYPE_STRUCT; - size_type.elements = malloc(3 * sizeof(ffi_type*)); - size_type.elements[0] = &ffi_type_float; - size_type.elements[1] = &ffi_type_float; - size_type.elements[2] = NULL; - - rect_type.size = 0;/*sizeof(Rect);*/ - rect_type.alignment =0;/* __alignof__(Rect);*/ - rect_type.type = FFI_TYPE_STRUCT; - rect_type.elements = malloc(3 * sizeof(ffi_type*)); - rect_type.elements[0] = &point_type; - rect_type.elements[1] = &size_type; - rect_type.elements[2] = NULL; - - /* - * Create a CIF - */ - arglist[0] = &ffi_type_sint; - arglist[1] = &ffi_type_pointer; - arglist[2] = &point_type; - arglist[3] = &rect_type; - arglist[4] = &ffi_type_sint; - arglist[5] = NULL; - - r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, - 5, &ffi_type_sint, arglist); - if (r != FFI_OK) { - abort(); - } - - - /* And call the function through the CIF */ - - { - Point p = { 1.0, 2.0 }; - Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; - int o = 0; - int l = 42; - char* m = "myMethod"; - ffi_arg result; - - values[0] = &o; - values[1] = &m; - values[2] = &p; - values[3] = &r; - values[4] = &l; - values[5] = NULL; - - printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", - o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); - - ffi_call(&cif, FFI_FN(doit), &result, values); - - printf ("The result is %d\n", (int)result); - - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl.c deleted file mode 100644 index fd07e5017..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl) -{ - printf ("%f\n", dbl); - return 2 * dbl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl, rdbl; - - args[0] = &ffi_type_double; - values[0] = &dbl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - for (dbl = -127.3; dbl < 127; dbl++) - { - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl)); - CHECK(rdbl == 2 * dbl); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl1.c deleted file mode 100644 index 0ea5d5055..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4) -{ - return dbl1 + fl2 + in3 + dbl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl1, dbl4, rdbl; - float fl2; - unsigned int in3; - args[0] = &ffi_type_double; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_double; - values[0] = &dbl1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &dbl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_double, args) == FFI_OK); - dbl1 = 127.0; - fl2 = 128.0; - in3 = 255; - dbl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4)); - CHECK(rdbl == dbl1 + fl2 + in3 + dbl4); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl2.c deleted file mode 100644 index b3818f866..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_dbl2.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4) -{ - return dbl1 + dbl2 + in3 + dbl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl1, dbl2, dbl4, rdbl; - unsigned int in3; - args[0] = &ffi_type_double; - args[1] = &ffi_type_double; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_double; - values[0] = &dbl1; - values[1] = &dbl2; - values[2] = &in3; - values[3] = &dbl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_double, args) == FFI_OK); - dbl1 = 127.0; - dbl2 = 128.0; - in3 = 255; - dbl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4)); - CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl.c deleted file mode 100644 index fb8a09e32..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl) -{ - return 2 * fl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl, rfl; - - args[0] = &ffi_type_float; - values[0] = &fl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_float, args) == FFI_OK); - - for (fl = -127.0; fl < 127; fl++) - { - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl)); - CHECK(rfl == 2 * fl); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl1.c deleted file mode 100644 index c3d92c283..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl1.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl1, float fl2) -{ - return fl1 + fl2; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, rfl; - - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2)); - CHECK(rfl == fl1 + fl2); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl2.c deleted file mode 100644 index ddb976cc2..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -/* Use volatile float to avoid false negative on ix86. See PR target/323. */ -static float return_fl(float fl1, float fl2, float fl3, float fl4) -{ - volatile float sum; - - sum = fl1 + fl2 + fl3 + fl4; - return sum; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, fl3, fl4, rfl; - volatile float sum; - - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - args[2] = &ffi_type_float; - args[3] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - values[2] = &fl3; - values[3] = &fl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - fl3 = 255.1; - fl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4)); - - sum = fl1 + fl2 + fl3 + fl4; - CHECK(rfl == sum); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl3.c deleted file mode 100644 index c37877b18..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_fl3.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl1, float fl2, unsigned int in3, float fl4) -{ - return fl1 + fl2 + in3 + fl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, fl4, rfl; - unsigned int in3; - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &fl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - in3 = 255; - fl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4)); - CHECK(rfl == fl1 + fl2 + in3 + fl4); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ldl.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ldl.c deleted file mode 100644 index 5c2fe65ae..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ldl.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: 20071113 */ - -/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ -#include "ffitest.h" - -static long double return_ldl(long double ldl) -{ - return 2*ldl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long double ldl, rldl; - - args[0] = &ffi_type_longdouble; - values[0] = &ldl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_longdouble, args) == FFI_OK); - - for (ldl = -127.0; ldl < 127.0; ldl++) - { - ffi_call(&cif, FFI_FN(return_ldl), &rldl, values); - CHECK(rldl == 2 * ldl); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll.c deleted file mode 100644 index ea4a1e447..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long long. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -static long long return_ll(long long ll) -{ - return ll; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long long rlonglong; - long long ll; - - args[0] = &ffi_type_sint64; - values[0] = ≪ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint64, args) == FFI_OK); - - for (ll = 0LL; ll < 100LL; ll++) - { - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - CHECK(rlonglong == ll); - } - - for (ll = 55555555555000LL; ll < 55555555555100LL; ll++) - { - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - CHECK(rlonglong == ll); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll1.c deleted file mode 100644 index 593e8a307..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ll1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: ffi_call - Purpose: Check if long long are passed in the corresponding regs on ppc. - Limitations: none. - PR: 20104. - Originator: 20050222 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" -static long long return_ll(int ll0, long long ll1, int ll2) -{ - return ll0 + ll1 + ll2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long long rlonglong; - long long ll1; - unsigned ll0, ll2; - - args[0] = &ffi_type_sint; - args[1] = &ffi_type_sint64; - args[2] = &ffi_type_sint; - values[0] = &ll0; - values[1] = &ll1; - values[2] = &ll2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint64, args) == FFI_OK); - - ll0 = 11111111; - ll1 = 11111111111000LL; - ll2 = 11111111; - - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2); - /* { dg-output "res: 11111133333222, 11111133333222" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c deleted file mode 100644 index a36cf3eb8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value signed char. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static signed char return_sc(signed char sc) -{ - return sc; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - signed char sc; - - args[0] = &ffi_type_schar; - values[0] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_schar, args) == FFI_OK); - - for (sc = (signed char) -127; - sc < (signed char) 127; sc++) - { - ffi_call(&cif, FFI_FN(return_sc), &rint, values); - CHECK((signed char)rint == sc); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sl.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sl.c deleted file mode 100644 index f0fd345f7..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_sl.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check if long as return type is handled correctly. - Limitations: none. - PR: none. - */ - -/* { dg-do run } */ -#include "ffitest.h" -static long return_sl(long l1, long l2) -{ - return l1 - l2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg res; - unsigned long l1, l2; - - args[0] = &ffi_type_slong; - args[1] = &ffi_type_slong; - values[0] = &l1; - values[1] = &l2; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_slong, args) == FFI_OK); - - l1 = 1073741823L; - l2 = 1073741824L; - - ffi_call(&cif, FFI_FN(return_sl), &res, values); - printf("res: %ld, %ld\n", (long)res, l1 - l2); - /* { dg-output "res: -1, -1" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_uc.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_uc.c deleted file mode 100644 index 6fe554619..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_uc.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value unsigned char. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static unsigned char return_uc(unsigned char uc) -{ - return uc; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - unsigned char uc; - - args[0] = &ffi_type_uchar; - values[0] = &uc; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uchar, args) == FFI_OK); - - for (uc = (unsigned char) '\x00'; - uc < (unsigned char) '\xff'; uc++) - { - ffi_call(&cif, FFI_FN(return_uc), &rint, values); - CHECK((unsigned char)rint == uc); - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ul.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ul.c deleted file mode 100644 index 12b266f03..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/return_ul.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check if unsigned long as return type is handled correctly. - Limitations: none. - PR: none. - Originator: 20060724 */ - -/* { dg-do run } */ -#include "ffitest.h" -static unsigned long return_ul(unsigned long ul1, unsigned long ul2) -{ - return ul1 + ul2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg res; - unsigned long ul1, ul2; - - args[0] = &ffi_type_ulong; - args[1] = &ffi_type_ulong; - values[0] = &ul1; - values[1] = &ul2; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_ulong, args) == FFI_OK); - - ul1 = 1073741823L; - ul2 = 1073741824L; - - ffi_call(&cif, FFI_FN(return_ul), &res, values); - printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2); - /* { dg-output "res: 2147483647, 2147483647" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c deleted file mode 100644 index 71c2469e1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c +++ /dev/null @@ -1,145 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -/* 13 FPRs: 104 bytes */ -/* 14 FPRs: 112 bytes */ - -typedef struct struct_108byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; - double j; - double k; - double l; - double m; - int n; -} struct_108byte; - -struct_108byte cls_struct_108byte_fn( - struct_108byte b0, - struct_108byte b1, - struct_108byte b2, - struct_108byte b3) -{ - struct_108byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - result.j = b0.j + b1.j + b2.j + b3.j; - result.k = b0.k + b1.k + b2.k + b3.k; - result.l = b0.l + b1.l + b2.l + b3.l; - result.m = b0.m + b1.m + b2.m + b3.m; - result.n = b0.n + b1.n + b2.n + b3.n; - - printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i, - result.j, result.k, result.l, result.m, result.n); - - return result; -} - -static void -cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_108byte b0, b1, b2, b3; - - b0 = *(struct_108byte*)(args[0]); - b1 = *(struct_108byte*)(args[1]); - b2 = *(struct_108byte*)(args[2]); - b3 = *(struct_108byte*)(args[3]); - - *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[15]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; - struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; - struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; - struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; - struct_108byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = &ffi_type_double; - cls_struct_fields[10] = &ffi_type_double; - cls_struct_fields[11] = &ffi_type_double; - cls_struct_fields[12] = &ffi_type_double; - cls_struct_fields[13] = &ffi_type_sint32; - cls_struct_fields[14] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte, - struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c deleted file mode 100644 index d9c750ee1..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c +++ /dev/null @@ -1,148 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -/* 13 FPRs: 104 bytes */ -/* 14 FPRs: 112 bytes */ - -typedef struct struct_116byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; - double j; - double k; - double l; - double m; - double n; - int o; -} struct_116byte; - -struct_116byte cls_struct_116byte_fn( - struct_116byte b0, - struct_116byte b1, - struct_116byte b2, - struct_116byte b3) -{ - struct_116byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - result.j = b0.j + b1.j + b2.j + b3.j; - result.k = b0.k + b1.k + b2.k + b3.k; - result.l = b0.l + b1.l + b2.l + b3.l; - result.m = b0.m + b1.m + b2.m + b3.m; - result.n = b0.n + b1.n + b2.n + b3.n; - result.o = b0.o + b1.o + b2.o + b3.o; - - printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i, - result.j, result.k, result.l, result.m, result.n, result.o); - - return result; -} - -static void -cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_116byte b0, b1, b2, b3; - - b0 = *(struct_116byte*)(args[0]); - b1 = *(struct_116byte*)(args[1]); - b2 = *(struct_116byte*)(args[2]); - b3 = *(struct_116byte*)(args[3]); - - *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[16]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; - struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; - struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; - struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; - struct_116byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = &ffi_type_double; - cls_struct_fields[10] = &ffi_type_double; - cls_struct_fields[11] = &ffi_type_double; - cls_struct_fields[12] = &ffi_type_double; - cls_struct_fields[13] = &ffi_type_double; - cls_struct_fields[14] = &ffi_type_sint32; - cls_struct_fields[15] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte, - struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c deleted file mode 100644 index 973ee02ed..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -typedef struct struct_72byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; -} struct_72byte; - -struct_72byte cls_struct_72byte_fn( - struct_72byte b0, - struct_72byte b1, - struct_72byte b2, - struct_72byte b3) -{ - struct_72byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - - printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i); - - return result; -} - -static void -cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_72byte b0, b1, b2, b3; - - b0 = *(struct_72byte*)(args[0]); - b1 = *(struct_72byte*)(args[1]); - b2 = *(struct_72byte*)(args[2]); - b3 = *(struct_72byte*)(args[3]); - - *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[10]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; - struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; - struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; - struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; - struct_72byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, - struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c deleted file mode 100644 index 84323d16a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct struct_72byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - long long i; -} struct_72byte; - -struct_72byte cls_struct_72byte_fn( - struct_72byte b0, - struct_72byte b1, - struct_72byte b2, - struct_72byte b3) -{ - struct_72byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - - printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i); - - return result; -} - -static void -cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_72byte b0, b1, b2, b3; - - b0 = *(struct_72byte*)(args[0]); - b1 = *(struct_72byte*)(args[1]); - b2 = *(struct_72byte*)(args[2]); - b3 = *(struct_72byte*)(args[3]); - - *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[10]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; - struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; - struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; - struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; - struct_72byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_sint64; - cls_struct_fields[9] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, - struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen.c deleted file mode 100644 index 35b70ea4e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static size_t ABI_ATTR my_strlen(char *s) -{ - return (strlen(s)); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - - args[0] = &ffi_type_pointer; - values[0] = (void*) &s; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 7); - - s = "1234567890123456789012345"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 25); - - exit (0); -} - diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2.c deleted file mode 100644 index 96282bc0a..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(char *s, float a) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[0] = &ffi_type_pointer; - args[1] = &ffi_type_float; - values[0] = (void*) &s; - values[1] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen3.c deleted file mode 100644 index beba86e9e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen3.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen4.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen4.c deleted file mode 100644 index d5d42b4f6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/strlen4.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s, int i) -{ - return (size_t) ((int) strlen(s) + (int) a + i); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - int v1; - float v2; - args[2] = &ffi_type_sint; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[2] = (void*) &v1; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v1 = 1; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 2); - - s = "1234567"; - v2 = -1.0; - v1 = -2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 4); - - s = "1234567890123456789012345"; - v2 = 1.0; - v1 = 2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 28); - - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c deleted file mode 100644 index c13e23f87..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned char uc; - double d; - unsigned int ui; -} test_structure_1; - -static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) -{ - ts.uc++; - ts.d--; - ts.ui++; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts1_type; - ffi_type *ts1_type_elements[4]; - - test_structure_1 ts1_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_1 *ts1_result = - (test_structure_1 *) malloc (sizeof(test_structure_1)); - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - ts1_type_elements[0] = &ffi_type_uchar; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = &ffi_type_uint; - ts1_type_elements[3] = NULL; - - args[0] = &ts1_type; - values[0] = &ts1_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ts1_type, args) == FFI_OK); - - ts1_arg.uc = '\x01'; - ts1_arg.d = 3.14159; - ts1_arg.ui = 555; - - ffi_call(&cif, FFI_FN(struct1), ts1_result, values); - - CHECK(ts1_result->ui == 556); - CHECK(ts1_result->d == 3.14159 - 1); - - free (ts1_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c deleted file mode 100644 index 5077a5ee4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - double d1; - double d2; -} test_structure_2; - -static test_structure_2 ABI_ATTR struct2(test_structure_2 ts) -{ - ts.d1--; - ts.d2--; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - test_structure_2 ts2_arg; - ffi_type ts2_type; - ffi_type *ts2_type_elements[3]; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_2 *ts2_result = - (test_structure_2 *) malloc (sizeof(test_structure_2)); - - ts2_type.size = 0; - ts2_type.alignment = 0; - ts2_type.type = FFI_TYPE_STRUCT; - ts2_type.elements = ts2_type_elements; - ts2_type_elements[0] = &ffi_type_double; - ts2_type_elements[1] = &ffi_type_double; - ts2_type_elements[2] = NULL; - - args[0] = &ts2_type; - values[0] = &ts2_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK); - - ts2_arg.d1 = 5.55; - ts2_arg.d2 = 6.66; - - printf ("%g\n", ts2_arg.d1); - printf ("%g\n", ts2_arg.d2); - - ffi_call(&cif, FFI_FN(struct2), ts2_result, values); - - printf ("%g\n", ts2_result->d1); - printf ("%g\n", ts2_result->d2); - - CHECK(ts2_result->d1 == 5.55 - 1); - CHECK(ts2_result->d2 == 6.66 - 1); - - free (ts2_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c deleted file mode 100644 index 7eba0ead6..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - int si; -} test_structure_3; - -static test_structure_3 ABI_ATTR struct3(test_structure_3 ts) -{ - ts.si = -(ts.si*2); - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - int compare_value; - ffi_type ts3_type; - ffi_type *ts3_type_elements[2]; - - test_structure_3 ts3_arg; - test_structure_3 *ts3_result = - (test_structure_3 *) malloc (sizeof(test_structure_3)); - - ts3_type.size = 0; - ts3_type.alignment = 0; - ts3_type.type = FFI_TYPE_STRUCT; - ts3_type.elements = ts3_type_elements; - ts3_type_elements[0] = &ffi_type_sint; - ts3_type_elements[1] = NULL; - - args[0] = &ts3_type; - values[0] = &ts3_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ts3_type, args) == FFI_OK); - - ts3_arg.si = -123; - compare_value = ts3_arg.si; - - ffi_call(&cif, FFI_FN(struct3), ts3_result, values); - - printf ("%d %d\n", ts3_result->si, -(compare_value*2)); - - CHECK(ts3_result->si == -(compare_value*2)); - - free (ts3_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c deleted file mode 100644 index 66a9551dd..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned ui1; - unsigned ui2; - unsigned ui3; -} test_structure_4; - -static test_structure_4 ABI_ATTR struct4(test_structure_4 ts) -{ - ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts4_type; - ffi_type *ts4_type_elements[4]; - - test_structure_4 ts4_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_4 *ts4_result = - (test_structure_4 *) malloc (sizeof(test_structure_4)); - - ts4_type.size = 0; - ts4_type.alignment = 0; - ts4_type.type = FFI_TYPE_STRUCT; - ts4_type.elements = ts4_type_elements; - ts4_type_elements[0] = &ffi_type_uint; - ts4_type_elements[1] = &ffi_type_uint; - ts4_type_elements[2] = &ffi_type_uint; - ts4_type_elements[3] = NULL; - - args[0] = &ts4_type; - values[0] = &ts4_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK); - - ts4_arg.ui1 = 2; - ts4_arg.ui2 = 3; - ts4_arg.ui3 = 4; - - ffi_call (&cif, FFI_FN(struct4), ts4_result, values); - - CHECK(ts4_result->ui3 == 2U * 3U * 4U); - - - free (ts4_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c deleted file mode 100644 index 23e2a3f74..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - char c1; - char c2; -} test_structure_5; - -static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2) -{ - ts1.c1 += ts2.c1; - ts1.c2 -= ts2.c2; - - return ts1; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts5_type; - ffi_type *ts5_type_elements[3]; - - test_structure_5 ts5_arg1, ts5_arg2; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_5 *ts5_result = - (test_structure_5 *) malloc (sizeof(test_structure_5)); - - ts5_type.size = 0; - ts5_type.alignment = 0; - ts5_type.type = FFI_TYPE_STRUCT; - ts5_type.elements = ts5_type_elements; - ts5_type_elements[0] = &ffi_type_schar; - ts5_type_elements[1] = &ffi_type_schar; - ts5_type_elements[2] = NULL; - - args[0] = &ts5_type; - args[1] = &ts5_type; - values[0] = &ts5_arg1; - values[1] = &ts5_arg2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK); - - ts5_arg1.c1 = 2; - ts5_arg1.c2 = 6; - ts5_arg2.c1 = 5; - ts5_arg2.c2 = 3; - - ffi_call (&cif, FFI_FN(struct5), ts5_result, values); - - CHECK(ts5_result->c1 == 7); - CHECK(ts5_result->c2 == 3); - - - free (ts5_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c deleted file mode 100644 index 173c66eb4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f; - double d; -} test_structure_6; - -static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts) -{ - ts.f += 1; - ts.d += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts6_type; - ffi_type *ts6_type_elements[3]; - - test_structure_6 ts6_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_6 *ts6_result = - (test_structure_6 *) malloc (sizeof(test_structure_6)); - - ts6_type.size = 0; - ts6_type.alignment = 0; - ts6_type.type = FFI_TYPE_STRUCT; - ts6_type.elements = ts6_type_elements; - ts6_type_elements[0] = &ffi_type_float; - ts6_type_elements[1] = &ffi_type_double; - ts6_type_elements[2] = NULL; - - args[0] = &ts6_type; - values[0] = &ts6_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK); - - ts6_arg.f = 5.55f; - ts6_arg.d = 6.66; - - printf ("%g\n", ts6_arg.f); - printf ("%g\n", ts6_arg.d); - - ffi_call(&cif, FFI_FN(struct6), ts6_result, values); - - CHECK(ts6_result->f == 5.55f + 1); - CHECK(ts6_result->d == 6.66 + 1); - - free (ts6_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c deleted file mode 100644 index badc7e055..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f1; - float f2; - double d; -} test_structure_7; - -static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts) -{ - ts.f1 += 1; - ts.f2 += 1; - ts.d += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts7_type; - ffi_type *ts7_type_elements[4]; - - test_structure_7 ts7_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_7 *ts7_result = - (test_structure_7 *) malloc (sizeof(test_structure_7)); - - ts7_type.size = 0; - ts7_type.alignment = 0; - ts7_type.type = FFI_TYPE_STRUCT; - ts7_type.elements = ts7_type_elements; - ts7_type_elements[0] = &ffi_type_float; - ts7_type_elements[1] = &ffi_type_float; - ts7_type_elements[2] = &ffi_type_double; - ts7_type_elements[3] = NULL; - - args[0] = &ts7_type; - values[0] = &ts7_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK); - - ts7_arg.f1 = 5.55f; - ts7_arg.f2 = 55.5f; - ts7_arg.d = 6.66; - - printf ("%g\n", ts7_arg.f1); - printf ("%g\n", ts7_arg.f2); - printf ("%g\n", ts7_arg.d); - - ffi_call(&cif, FFI_FN(struct7), ts7_result, values); - - printf ("%g\n", ts7_result->f1); - printf ("%g\n", ts7_result->f2); - printf ("%g\n", ts7_result->d); - - CHECK(ts7_result->f1 == 5.55f + 1); - CHECK(ts7_result->f2 == 55.5f + 1); - CHECK(ts7_result->d == 6.66 + 1); - - free (ts7_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c deleted file mode 100644 index ef204ecbb..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f1; - float f2; - float f3; - float f4; -} test_structure_8; - -static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts) -{ - ts.f1 += 1; - ts.f2 += 1; - ts.f3 += 1; - ts.f4 += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts8_type; - ffi_type *ts8_type_elements[5]; - - test_structure_8 ts8_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_8 *ts8_result = - (test_structure_8 *) malloc (sizeof(test_structure_8)); - - ts8_type.size = 0; - ts8_type.alignment = 0; - ts8_type.type = FFI_TYPE_STRUCT; - ts8_type.elements = ts8_type_elements; - ts8_type_elements[0] = &ffi_type_float; - ts8_type_elements[1] = &ffi_type_float; - ts8_type_elements[2] = &ffi_type_float; - ts8_type_elements[3] = &ffi_type_float; - ts8_type_elements[4] = NULL; - - args[0] = &ts8_type; - values[0] = &ts8_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK); - - ts8_arg.f1 = 5.55f; - ts8_arg.f2 = 55.5f; - ts8_arg.f3 = -5.55f; - ts8_arg.f4 = -55.5f; - - printf ("%g\n", ts8_arg.f1); - printf ("%g\n", ts8_arg.f2); - printf ("%g\n", ts8_arg.f3); - printf ("%g\n", ts8_arg.f4); - - ffi_call(&cif, FFI_FN(struct8), ts8_result, values); - - printf ("%g\n", ts8_result->f1); - printf ("%g\n", ts8_result->f2); - printf ("%g\n", ts8_result->f3); - printf ("%g\n", ts8_result->f4); - - CHECK(ts8_result->f1 == 5.55f + 1); - CHECK(ts8_result->f2 == 55.5f + 1); - CHECK(ts8_result->f3 == -5.55f + 1); - CHECK(ts8_result->f4 == -55.5f + 1); - - free (ts8_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c deleted file mode 100644 index 4a13b818c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - float f; - int i; -} test_structure_9; - -static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts) -{ - ts.f += 1; - ts.i += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts9_type; - ffi_type *ts9_type_elements[3]; - - test_structure_9 ts9_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_9 *ts9_result = - (test_structure_9 *) malloc (sizeof(test_structure_9)); - - ts9_type.size = 0; - ts9_type.alignment = 0; - ts9_type.type = FFI_TYPE_STRUCT; - ts9_type.elements = ts9_type_elements; - ts9_type_elements[0] = &ffi_type_float; - ts9_type_elements[1] = &ffi_type_sint; - ts9_type_elements[2] = NULL; - - args[0] = &ts9_type; - values[0] = &ts9_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK); - - ts9_arg.f = 5.55f; - ts9_arg.i = 5; - - printf ("%g\n", ts9_arg.f); - printf ("%d\n", ts9_arg.i); - - ffi_call(&cif, FFI_FN(struct9), ts9_result, values); - - printf ("%g\n", ts9_result->f); - printf ("%d\n", ts9_result->i); - - CHECK(ts9_result->f == 5.55f + 1); - CHECK(ts9_result->i == 5 + 1); - - free (ts9_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c deleted file mode 100644 index ca31056d8..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: closure_call - Purpose: Check return value float. - Limitations: none. - PR: 41908. - Originator: 20091102 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_combined { - float a; - float b; - float c; - float d; -} cls_struct_combined; - -void cls_struct_combined_fn(struct cls_struct_combined arg) -{ - printf("%g %g %g %g\n", - arg.a, arg.b, - arg.c, arg.d); - fflush(stdout); -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_combined a0; - - a0 = *(struct cls_struct_combined*)(args[0]); - - cls_struct_combined_fn(a0); -} - - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* cls_struct_fields0[5]; - ffi_type cls_struct_type0; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; - - cls_struct_type0.size = 0; - cls_struct_type0.alignment = 0; - cls_struct_type0.type = FFI_TYPE_STRUCT; - cls_struct_type0.elements = cls_struct_fields0; - - cls_struct_fields0[0] = &ffi_type_float; - cls_struct_fields0[1] = &ffi_type_float; - cls_struct_fields0[2] = &ffi_type_float; - cls_struct_fields0[3] = &ffi_type_float; - cls_struct_fields0[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type0; - dbl_arg_types[1] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, - dbl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - ((void(*)(cls_struct_combined)) (code))(g_dbl); - /* { dg-output "4 5 1 8" } */ - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/uninitialized.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/uninitialized.c deleted file mode 100644 index f00d83023..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/uninitialized.c +++ /dev/null @@ -1,61 +0,0 @@ -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned char uc; - double d; - unsigned int ui; -} test_structure_1; - -static test_structure_1 struct1(test_structure_1 ts) -{ - ts.uc++; - ts.d--; - ts.ui++; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts1_type; - ffi_type *ts1_type_elements[4]; - - memset(&cif, 1, sizeof(cif)); - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - ts1_type_elements[0] = &ffi_type_uchar; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = &ffi_type_uint; - ts1_type_elements[3] = NULL; - - test_structure_1 ts1_arg; - /* This is a hack to get a properly aligned result buffer */ - test_structure_1 *ts1_result = - (test_structure_1 *) malloc (sizeof(test_structure_1)); - - args[0] = &ts1_type; - values[0] = &ts1_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ts1_type, args) == FFI_OK); - - ts1_arg.uc = '\x01'; - ts1_arg.d = 3.14159; - ts1_arg.ui = 555; - - ffi_call(&cif, FFI_FN(struct1), ts1_result, values); - - CHECK(ts1_result->ui == 556); - CHECK(ts1_result->d == 3.14159 - 1); - - free (ts1_result); - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest.cc b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest.cc deleted file mode 100644 index 67cfefeca..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest.cc +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_closure, unwind info - Purpose: Check if the unwind information is passed correctly. - Limitations: none. - PR: none. - Originator: Jeff Sturm */ - -/* { dg-do run } */ - -#include "ffitest.h" - -void ABI_ATTR -closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args __UNUSED__, void* userdata __UNUSED__) -{ - throw 9; -} - -typedef void (*closure_test_type)(); - -void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) - { - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double*)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); - - throw (int)*(ffi_arg*)resp; -} - -typedef int (*closure_test_type1)(float, float, float, float, signed short, - float, float, int, double, int, int, float, - int, int, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - - { - cl_arg_types[1] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, - &ffi_type_void, cl_arg_types) == FFI_OK); - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); - - try - { - (*((closure_test_type)(code)))(); - } catch (int exception_code) - { - CHECK(exception_code == 9); - } - - printf("part one OK\n"); - /* { dg-output "part one OK" } */ - } - - { - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_uint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_uint; - cl_arg_types[10] = &ffi_type_uint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_uint; - cl_arg_types[13] = &ffi_type_uint; - cl_arg_types[14] = &ffi_type_uint; - cl_arg_types[15] = &ffi_type_uint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, - (void *) 3 /* userdata */, code) == FFI_OK); - try - { - (*((closure_test_type1)code)) - (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, - 19, 21, 1); - /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - } catch (int exception_code) - { - CHECK(exception_code == 255); - } - printf("part two OK\n"); - /* { dg-output "\npart two OK" } */ - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc deleted file mode 100644 index ec611647e..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +++ /dev/null @@ -1,54 +0,0 @@ -/* Area: ffi_call, unwind info - Purpose: Check if the unwind information is passed correctly. - Limitations: none. - PR: none. - Originator: Andreas Tobler 20061213 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static int checking(int a __UNUSED__, short b __UNUSED__, - signed char c __UNUSED__) -{ - throw 9; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - signed int si; - signed short ss; - signed char sc; - - args[0] = &ffi_type_sint; - values[0] = &si; - args[1] = &ffi_type_sshort; - values[1] = &ss; - args[2] = &ffi_type_schar; - values[2] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint, args) == FFI_OK); - - si = -6; - ss = -12; - sc = -1; - { - try - { - ffi_call(&cif, FFI_FN(checking), &rint, values); - } catch (int exception_code) - { - CHECK(exception_code == 9); - } - printf("part one OK\n"); - /* { dg-output "part one OK" } */ - } - exit(0); -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c deleted file mode 100644 index 7f96809ea..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c +++ /dev/null @@ -1,196 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - float f; - double d; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - - uc = va_arg (ap, unsigned); - sc = va_arg (ap, signed); - - us = va_arg (ap, unsigned); - ss = va_arg (ap, signed); - - ui = va_arg (ap, unsigned int); - si = va_arg (ap, signed int); - - ul = va_arg (ap, unsigned long); - sl = va_arg (ap, signed long); - - f = va_arg (ap, double); /* C standard promotes float->double - when anonymous */ - d = va_arg (ap, double); - - printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", - s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b, - uc, sc, - us, ss, - ui, si, - ul, sl, - f, d); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[15]; - ffi_type* arg_types[15]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - double d1; - double f1; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = &ffi_type_uchar; - arg_types[5] = &ffi_type_schar; - arg_types[6] = &ffi_type_ushort; - arg_types[7] = &ffi_type_sshort; - arg_types[8] = &ffi_type_uint; - arg_types[9] = &ffi_type_sint; - arg_types[10] = &ffi_type_ulong; - arg_types[11] = &ffi_type_slong; - arg_types[12] = &ffi_type_double; - arg_types[13] = &ffi_type_double; - arg_types[14] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - uc = 9; - sc = 10; - us = 11; - ss = 12; - ui = 13; - si = 14; - ul = 15; - sl = 16; - f1 = 2.12; - d1 = 3.13; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = &uc; - args[5] = ≻ - args[6] = &us; - args[7] = &ss; - args[8] = &ui; - args[9] = &si; - args[10] = &ul; - args[11] = &sl; - args[12] = &f1; - args[13] = &d1; - args[14] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct1.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct1.c deleted file mode 100644 index e6452061c..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct1.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct2.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct2.c deleted file mode 100644 index 56f5b9c75..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct2.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct small_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - s1.a += s2.a; - s1.b += s2.b; - return s1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct small_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d\n", res.a, res.b); - /* { dg-output "\nres: 12 14" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct3.c b/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct3.c deleted file mode 100644 index 9a27e7fd4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/testsuite/libffi.call/va_struct3.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct large_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - l.a += s1.a; - l.b += s1.b; - l.c += s2.a; - l.d += s2.b; - return l; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct large_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); - /* { dg-output "\nres: 15 17 19 21 14" } */ - - return 0; -} diff --git a/third_party/python/Modules/_ctypes/libffi/texinfo.tex b/third_party/python/Modules/_ctypes/libffi/texinfo.tex deleted file mode 100644 index 85f184cc4..000000000 --- a/third_party/python/Modules/_ctypes/libffi/texinfo.tex +++ /dev/null @@ -1,10079 +0,0 @@ -% texinfo.tex -- TeX macros to handle Texinfo files. -% -% Load plain if necessary, i.e., if running under initex. -\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi -% -\def\texinfoversion{2013-02-01.11} -% -% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, -% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -% 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. -% -% This texinfo.tex file is free software: you can redistribute it and/or -% modify it under the terms of the GNU General Public License as -% published by the Free Software Foundation, either version 3 of the -% License, or (at your option) any later version. -% -% This texinfo.tex file is distributed in the hope that it will be -% useful, but WITHOUT ANY WARRANTY; without even the implied warranty -% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -% General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this program. If not, see . -% -% As a special exception, when this file is read by TeX when processing -% a Texinfo source document, you may use the result without -% restriction. This Exception is an additional permission under section 7 -% of the GNU General Public License, version 3 ("GPLv3"). -% -% Please try the latest version of texinfo.tex before submitting bug -% reports; you can get the latest version from: -% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or -% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or -% http://www.gnu.org/software/texinfo/ (the Texinfo home page) -% The texinfo.tex in any given distribution could well be out -% of date, so if that's what you're using, please check. -% -% Send bug reports to bug-texinfo@gnu.org. Please include including a -% complete document in each bug report with which we can reproduce the -% problem. Patches are, of course, greatly appreciated. -% -% To process a Texinfo manual with TeX, it's most reliable to use the -% texi2dvi shell script that comes with the distribution. For a simple -% manual foo.texi, however, you can get away with this: -% tex foo.texi -% texindex foo.?? -% tex foo.texi -% tex foo.texi -% dvips foo.dvi -o # or whatever; this makes foo.ps. -% The extra TeX runs get the cross-reference information correct. -% Sometimes one run after texindex suffices, and sometimes you need more -% than two; texi2dvi does it as many times as necessary. -% -% It is possible to adapt texinfo.tex for other languages, to some -% extent. You can get the existing language-specific files from the -% full Texinfo distribution. -% -% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. - - -\message{Loading texinfo [version \texinfoversion]:} - -% If in a .fmt file, print the version number -% and turn on active characters that we couldn't do earlier because -% they might have appeared in the input file name. -\everyjob{\message{[Texinfo version \texinfoversion]}% - \catcode`+=\active \catcode`\_=\active} - -\chardef\other=12 - -% We never want plain's \outer definition of \+ in Texinfo. -% For @tex, we can use \tabalign. -\let\+ = \relax - -% Save some plain tex macros whose names we will redefine. -\let\ptexb=\b -\let\ptexbullet=\bullet -\let\ptexc=\c -\let\ptexcomma=\, -\let\ptexdot=\. -\let\ptexdots=\dots -\let\ptexend=\end -\let\ptexequiv=\equiv -\let\ptexexclam=\! -\let\ptexfootnote=\footnote -\let\ptexgtr=> -\let\ptexhat=^ -\let\ptexi=\i -\let\ptexindent=\indent -\let\ptexinsert=\insert -\let\ptexlbrace=\{ -\let\ptexless=< -\let\ptexnewwrite\newwrite -\let\ptexnoindent=\noindent -\let\ptexplus=+ -\let\ptexraggedright=\raggedright -\let\ptexrbrace=\} -\let\ptexslash=\/ -\let\ptexstar=\* -\let\ptext=\t -\let\ptextop=\top -{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode - -% If this character appears in an error message or help string, it -% starts a new line in the output. -\newlinechar = `^^J - -% Use TeX 3.0's \inputlineno to get the line number, for better error -% messages, but if we're using an old version of TeX, don't do anything. -% -\ifx\inputlineno\thisisundefined - \let\linenumber = \empty % Pre-3.0. -\else - \def\linenumber{l.\the\inputlineno:\space} -\fi - -% Set up fixed words for English if not already set. -\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi -\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi -\ifx\putworderror\undefined \gdef\putworderror{error}\fi -\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi -\ifx\putwordin\undefined \gdef\putwordin{in}\fi -\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi -\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi -\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi -\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi -\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi -\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi -\ifx\putwordof\undefined \gdef\putwordof{of}\fi -\ifx\putwordon\undefined \gdef\putwordon{on}\fi -\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi -\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi -\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi -\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi -\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi -\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi -\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi -% -\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi -\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi -\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi -\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi -\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi -\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi -\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi -\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi -\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi -\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi -\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi -\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi -% -\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi -\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi -\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi -\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi -\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi - -% Since the category of space is not known, we have to be careful. -\chardef\spacecat = 10 -\def\spaceisspace{\catcode`\ =\spacecat} - -% sometimes characters are active, so we need control sequences. -\chardef\ampChar = `\& -\chardef\colonChar = `\: -\chardef\commaChar = `\, -\chardef\dashChar = `\- -\chardef\dotChar = `\. -\chardef\exclamChar= `\! -\chardef\hashChar = `\# -\chardef\lquoteChar= `\` -\chardef\questChar = `\? -\chardef\rquoteChar= `\' -\chardef\semiChar = `\; -\chardef\slashChar = `\/ -\chardef\underChar = `\_ - -% Ignore a token. -% -\def\gobble#1{} - -% The following is used inside several \edef's. -\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} - -% Hyphenation fixes. -\hyphenation{ - Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script - ap-pen-dix bit-map bit-maps - data-base data-bases eshell fall-ing half-way long-est man-u-script - man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm - par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces - spell-ing spell-ings - stand-alone strong-est time-stamp time-stamps which-ever white-space - wide-spread wrap-around -} - -% Margin to add to right of even pages, to left of odd pages. -\newdimen\bindingoffset -\newdimen\normaloffset -\newdimen\pagewidth \newdimen\pageheight - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt } - -% Sometimes it is convenient to have everything in the transcript file -% and nothing on the terminal. We don't just call \tracingall here, -% since that produces some useless output on the terminal. We also make -% some effort to order the tracing commands to reduce output in the log -% file; cf. trace.sty in LaTeX. -% -\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% -\def\loggingall{% - \tracingstats2 - \tracingpages1 - \tracinglostchars2 % 2 gives us more in etex - \tracingparagraphs1 - \tracingoutput1 - \tracingmacros2 - \tracingrestores1 - \showboxbreadth\maxdimen \showboxdepth\maxdimen - \ifx\eTeXversion\thisisundefined\else % etex gives us more logging - \tracingscantokens1 - \tracingifs1 - \tracinggroups1 - \tracingnesting2 - \tracingassigns1 - \fi - \tracingcommands3 % 3 gives us more in etex - \errorcontextlines16 -}% - -% @errormsg{MSG}. Do the index-like expansions on MSG, but if things -% aren't perfect, it's not the end of the world, being an error message, -% after all. -% -\def\errormsg{\begingroup \indexnofonts \doerrormsg} -\def\doerrormsg#1{\errmessage{#1}} - -% add check for \lastpenalty to plain's definitions. If the last thing -% we did was a \nobreak, we don't want to insert more space. -% -\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount - \removelastskip\penalty-50\smallskip\fi\fi} -\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount - \removelastskip\penalty-100\medskip\fi\fi} -\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount - \removelastskip\penalty-200\bigskip\fi\fi} - -% Do @cropmarks to get crop marks. -% -\newif\ifcropmarks -\let\cropmarks = \cropmarkstrue -% -% Dimensions to add cropmarks at corners. -% Added by P. A. MacKay, 12 Nov. 1986 -% -\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines -\newdimen\cornerlong \cornerlong=1pc -\newdimen\cornerthick \cornerthick=.3pt -\newdimen\topandbottommargin \topandbottommargin=.75in - -% Output a mark which sets \thischapter, \thissection and \thiscolor. -% We dump everything together because we only have one kind of mark. -% This works because we only use \botmark / \topmark, not \firstmark. -% -% A mark contains a subexpression of the \ifcase ... \fi construct. -% \get*marks macros below extract the needed part using \ifcase. -% -% Another complication is to let the user choose whether \thischapter -% (\thissection) refers to the chapter (section) in effect at the top -% of a page, or that at the bottom of a page. The solution is -% described on page 260 of The TeXbook. It involves outputting two -% marks for the sectioning macros, one before the section break, and -% one after. I won't pretend I can describe this better than DEK... -\def\domark{% - \toks0=\expandafter{\lastchapterdefs}% - \toks2=\expandafter{\lastsectiondefs}% - \toks4=\expandafter{\prevchapterdefs}% - \toks6=\expandafter{\prevsectiondefs}% - \toks8=\expandafter{\lastcolordefs}% - \mark{% - \the\toks0 \the\toks2 - \noexpand\or \the\toks4 \the\toks6 - \noexpand\else \the\toks8 - }% -} -% \topmark doesn't work for the very first chapter (after the title -% page or the contents), so we use \firstmark there -- this gets us -% the mark with the chapter defs, unless the user sneaks in, e.g., -% @setcolor (or @url, or @link, etc.) between @contents and the very -% first @chapter. -\def\gettopheadingmarks{% - \ifcase0\topmark\fi - \ifx\thischapter\empty \ifcase0\firstmark\fi \fi -} -\def\getbottomheadingmarks{\ifcase1\botmark\fi} -\def\getcolormarks{\ifcase2\topmark\fi} - -% Avoid "undefined control sequence" errors. -\def\lastchapterdefs{} -\def\lastsectiondefs{} -\def\prevchapterdefs{} -\def\prevsectiondefs{} -\def\lastcolordefs{} - -% Main output routine. -\chardef\PAGE = 255 -\output = {\onepageout{\pagecontents\PAGE}} - -\newbox\headlinebox -\newbox\footlinebox - -% \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions, but you have to call it yourself. -\def\onepageout#1{% - \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi - % - \ifodd\pageno \advance\hoffset by \bindingoffset - \else \advance\hoffset by -\bindingoffset\fi - % - % Do this outside of the \shipout so @code etc. will be expanded in - % the headline as they should be, not taken literally (outputting ''code). - \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% - \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi - \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% - % - {% - % Have to do this stuff outside the \shipout because we want it to - % take effect in \write's, yet the group defined by the \vbox ends - % before the \shipout runs. - % - \indexdummies % don't expand commands in the output. - \normalturnoffactive % \ in index entries must not stay \, e.g., if - % the page break happens to be in the middle of an example. - % We don't want .vr (or whatever) entries like this: - % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} - % "\acronym" won't work when it's read back in; - % it needs to be - % {\code {{\tt \backslashcurfont }acronym} - \shipout\vbox{% - % Do this early so pdf references go to the beginning of the page. - \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi - % - \ifcropmarks \vbox to \outervsize\bgroup - \hsize = \outerhsize - \vskip-\topandbottommargin - \vtop to0pt{% - \line{\ewtop\hfil\ewtop}% - \nointerlineskip - \line{% - \vbox{\moveleft\cornerthick\nstop}% - \hfill - \vbox{\moveright\cornerthick\nstop}% - }% - \vss}% - \vskip\topandbottommargin - \line\bgroup - \hfil % center the page within the outer (page) hsize. - \ifodd\pageno\hskip\bindingoffset\fi - \vbox\bgroup - \fi - % - \unvbox\headlinebox - \pagebody{#1}% - \ifdim\ht\footlinebox > 0pt - % Only leave this space if the footline is nonempty. - % (We lessened \vsize for it in \oddfootingyyy.) - % The \baselineskip=24pt in plain's \makefootline has no effect. - \vskip 24pt - \unvbox\footlinebox - \fi - % - \ifcropmarks - \egroup % end of \vbox\bgroup - \hfil\egroup % end of (centering) \line\bgroup - \vskip\topandbottommargin plus1fill minus1fill - \boxmaxdepth = \cornerthick - \vbox to0pt{\vss - \line{% - \vbox{\moveleft\cornerthick\nsbot}% - \hfill - \vbox{\moveright\cornerthick\nsbot}% - }% - \nointerlineskip - \line{\ewbot\hfil\ewbot}% - }% - \egroup % \vbox from first cropmarks clause - \fi - }% end of \shipout\vbox - }% end of group with \indexdummies - \advancepageno - \ifnum\outputpenalty>-20000 \else\dosupereject\fi -} - -\newinsert\margin \dimen\margin=\maxdimen - -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} -{\catcode`\@ =11 -\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi -% marginal hacks, juha@viisa.uucp (Juha Takala) -\ifvoid\margin\else % marginal info is present - \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi -\dimen@=\dp#1\relax \unvbox#1\relax -\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi -\ifr@ggedbottom \kern-\dimen@ \vfil \fi} -} - -% Here are the rules for the cropmarks. Note that they are -% offset so that the space between them is truly \outerhsize or \outervsize -% (P. A. MacKay, 12 November, 1986) -% -\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} -\def\nstop{\vbox - {\hrule height\cornerthick depth\cornerlong width\cornerthick}} -\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} -\def\nsbot{\vbox - {\hrule height\cornerlong depth\cornerthick width\cornerthick}} - -% Parse an argument, then pass it to #1. The argument is the rest of -% the input line (except we remove a trailing comment). #1 should be a -% macro which expects an ordinary undelimited TeX argument. -% -\def\parsearg{\parseargusing{}} -\def\parseargusing#1#2{% - \def\argtorun{#2}% - \begingroup - \obeylines - \spaceisspace - #1% - \parseargline\empty% Insert the \empty token, see \finishparsearg below. -} - -{\obeylines % - \gdef\parseargline#1^^M{% - \endgroup % End of the group started in \parsearg. - \argremovecomment #1\comment\ArgTerm% - }% -} - -% First remove any @comment, then any @c comment. -\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} -\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} - -% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. -% -% \argremovec might leave us with trailing space, e.g., -% @end itemize @c foo -% This space token undergoes the same procedure and is eventually removed -% by \finishparsearg. -% -\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} -\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} -\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% - \def\temp{#3}% - \ifx\temp\empty - % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: - \let\temp\finishparsearg - \else - \let\temp\argcheckspaces - \fi - % Put the space token in: - \temp#1 #3\ArgTerm -} - -% If a _delimited_ argument is enclosed in braces, they get stripped; so -% to get _exactly_ the rest of the line, we had to prevent such situation. -% We prepended an \empty token at the very beginning and we expand it now, -% just before passing the control to \argtorun. -% (Similarly, we have to think about #3 of \argcheckspacesY above: it is -% either the null string, or it ends with \^^M---thus there is no danger -% that a pair of braces would be stripped. -% -% But first, we have to remove the trailing space token. -% -\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} - -% \parseargdef\foo{...} -% is roughly equivalent to -% \def\foo{\parsearg\Xfoo} -% \def\Xfoo#1{...} -% -% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my -% favourite TeX trick. --kasal, 16nov03 - -\def\parseargdef#1{% - \expandafter \doparseargdef \csname\string#1\endcsname #1% -} -\def\doparseargdef#1#2{% - \def#2{\parsearg#1}% - \def#1##1% -} - -% Several utility definitions with active space: -{ - \obeyspaces - \gdef\obeyedspace{ } - - % Make each space character in the input produce a normal interword - % space in the output. Don't allow a line break at this space, as this - % is used only in environments like @example, where each line of input - % should produce a line of output anyway. - % - \gdef\sepspaces{\obeyspaces\let =\tie} - - % If an index command is used in an @example environment, any spaces - % therein should become regular spaces in the raw index file, not the - % expansion of \tie (\leavevmode \penalty \@M \ ). - \gdef\unsepspaces{\let =\space} -} - - -\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} - -% Define the framework for environments in texinfo.tex. It's used like this: -% -% \envdef\foo{...} -% \def\Efoo{...} -% -% It's the responsibility of \envdef to insert \begingroup before the -% actual body; @end closes the group after calling \Efoo. \envdef also -% defines \thisenv, so the current environment is known; @end checks -% whether the environment name matches. The \checkenv macro can also be -% used to check whether the current environment is the one expected. -% -% Non-false conditionals (@iftex, @ifset) don't fit into this, so they -% are not treated as environments; they don't open a group. (The -% implementation of @end takes care not to call \endgroup in this -% special case.) - - -% At run-time, environments start with this: -\def\startenvironment#1{\begingroup\def\thisenv{#1}} -% initialize -\let\thisenv\empty - -% ... but they get defined via ``\envdef\foo{...}'': -\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} -\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} - -% Check whether we're in the right environment: -\def\checkenv#1{% - \def\temp{#1}% - \ifx\thisenv\temp - \else - \badenverr - \fi -} - -% Environment mismatch, #1 expected: -\def\badenverr{% - \errhelp = \EMsimple - \errmessage{This command can appear only \inenvironment\temp, - not \inenvironment\thisenv}% -} -\def\inenvironment#1{% - \ifx#1\empty - outside of any environment% - \else - in environment \expandafter\string#1% - \fi -} - -% @end foo executes the definition of \Efoo. -% But first, it executes a specialized version of \checkenv -% -\parseargdef\end{% - \if 1\csname iscond.#1\endcsname - \else - % The general wording of \badenverr may not be ideal. - \expandafter\checkenv\csname#1\endcsname - \csname E#1\endcsname - \endgroup - \fi -} - -\newhelp\EMsimple{Press RETURN to continue.} - - -% Be sure we're in horizontal mode when doing a tie, since we make space -% equivalent to this in @example-like environments. Otherwise, a space -% at the beginning of a line will start with \penalty -- and -% since \penalty is valid in vertical mode, we'd end up putting the -% penalty on the vertical list instead of in the new paragraph. -{\catcode`@ = 11 - % Avoid using \@M directly, because that causes trouble - % if the definition is written into an index file. - \global\let\tiepenalty = \@M - \gdef\tie{\leavevmode\penalty\tiepenalty\ } -} - -% @: forces normal size whitespace following. -\def\:{\spacefactor=1000 } - -% @* forces a line break. -\def\*{\unskip\hfil\break\hbox{}\ignorespaces} - -% @/ allows a line break. -\let\/=\allowbreak - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=\endofsentencespacefactor\space} - -% @! is an end-of-sentence bang. -\def\!{!\spacefactor=\endofsentencespacefactor\space} - -% @? is an end-of-sentence query. -\def\?{?\spacefactor=\endofsentencespacefactor\space} - -% @frenchspacing on|off says whether to put extra space after punctuation. -% -\def\onword{on} -\def\offword{off} -% -\parseargdef\frenchspacing{% - \def\temp{#1}% - \ifx\temp\onword \plainfrenchspacing - \else\ifx\temp\offword \plainnonfrenchspacing - \else - \errhelp = \EMsimple - \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% - \fi\fi -} - -% @w prevents a word break. Without the \leavevmode, @w at the -% beginning of a paragraph, when TeX is still in vertical mode, would -% produce a whole line of output instead of starting the paragraph. -\def\w#1{\leavevmode\hbox{#1}} - -% @group ... @end group forces ... to be all on one page, by enclosing -% it in a TeX vbox. We use \vtop instead of \vbox to construct the box -% to keep its height that of a normal line. According to the rules for -% \topskip (p.114 of the TeXbook), the glue inserted is -% max (\topskip - \ht (first item), 0). If that height is large, -% therefore, no glue is inserted, and the space between the headline and -% the text is small, which looks bad. -% -% Another complication is that the group might be very large. This can -% cause the glue on the previous page to be unduly stretched, because it -% does not have much material. In this case, it's better to add an -% explicit \vfill so that the extra space is at the bottom. The -% threshold for doing this is if the group is more than \vfilllimit -% percent of a page (\vfilllimit can be changed inside of @tex). -% -\newbox\groupbox -\def\vfilllimit{0.7} -% -\envdef\group{% - \ifnum\catcode`\^^M=\active \else - \errhelp = \groupinvalidhelp - \errmessage{@group invalid in context where filling is enabled}% - \fi - \startsavinginserts - % - \setbox\groupbox = \vtop\bgroup - % Do @comment since we are called inside an environment such as - % @example, where each end-of-line in the input causes an - % end-of-line in the output. We don't want the end-of-line after - % the `@group' to put extra space in the output. Since @group - % should appear on a line by itself (according to the Texinfo - % manual), we don't worry about eating any user text. - \comment -} -% -% The \vtop produces a box with normal height and large depth; thus, TeX puts -% \baselineskip glue before it, and (when the next line of text is done) -% \lineskip glue after it. Thus, space below is not quite equal to space -% above. But it's pretty close. -\def\Egroup{% - % To get correct interline space between the last line of the group - % and the first line afterwards, we have to propagate \prevdepth. - \endgraf % Not \par, as it may have been set to \lisppar. - \global\dimen1 = \prevdepth - \egroup % End the \vtop. - % \dimen0 is the vertical size of the group's box. - \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox - % \dimen2 is how much space is left on the page (more or less). - \dimen2 = \pageheight \advance\dimen2 by -\pagetotal - % if the group doesn't fit on the current page, and it's a big big - % group, force a page break. - \ifdim \dimen0 > \dimen2 - \ifdim \pagetotal < \vfilllimit\pageheight - \page - \fi - \fi - \box\groupbox - \prevdepth = \dimen1 - \checkinserts -} -% -% TeX puts in an \escapechar (i.e., `@') at the beginning of the help -% message, so this ends up printing `@group can only ...'. -% -\newhelp\groupinvalidhelp{% -group can only be used in environments such as @example,^^J% -where each line of input produces a line of output.} - -% @need space-in-mils -% forces a page break if there is not space-in-mils remaining. - -\newdimen\mil \mil=0.001in - -\parseargdef\need{% - % Ensure vertical mode, so we don't make a big box in the middle of a - % paragraph. - \par - % - % If the @need value is less than one line space, it's useless. - \dimen0 = #1\mil - \dimen2 = \ht\strutbox - \advance\dimen2 by \dp\strutbox - \ifdim\dimen0 > \dimen2 - % - % Do a \strut just to make the height of this box be normal, so the - % normal leading is inserted relative to the preceding line. - % And a page break here is fine. - \vtop to #1\mil{\strut\vfil}% - % - % TeX does not even consider page breaks if a penalty added to the - % main vertical list is 10000 or more. But in order to see if the - % empty box we just added fits on the page, we must make it consider - % page breaks. On the other hand, we don't want to actually break the - % page after the empty box. So we use a penalty of 9999. - % - % There is an extremely small chance that TeX will actually break the - % page at this \penalty, if there are no other feasible breakpoints in - % sight. (If the user is using lots of big @group commands, which - % almost-but-not-quite fill up a page, TeX will have a hard time doing - % good page breaking, for example.) However, I could not construct an - % example where a page broke at this \penalty; if it happens in a real - % document, then we can reconsider our strategy. - \penalty9999 - % - % Back up by the size of the box, whether we did a page break or not. - \kern -#1\mil - % - % Do not allow a page break right after this kern. - \nobreak - \fi -} - -% @br forces paragraph break (and is undocumented). - -\let\br = \par - -% @page forces the start of a new page. -% -\def\page{\par\vfill\supereject} - -% @exdent text.... -% outputs text on separate line in roman font, starting at standard page margin - -% This records the amount of indent in the innermost environment. -% That's how much \exdent should take out. -\newskip\exdentamount - -% This defn is used inside fill environments such as @defun. -\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} - -% This defn is used inside nofill environments such as @example. -\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount - \leftline{\hskip\leftskip{\rm#1}}}} - -% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current -% paragraph. For more general purposes, use the \margin insertion -% class. WHICH is `l' or `r'. Not documented, written for gawk manual. -% -\newskip\inmarginspacing \inmarginspacing=1cm -\def\strutdepth{\dp\strutbox} -% -\def\doinmargin#1#2{\strut\vadjust{% - \nobreak - \kern-\strutdepth - \vtop to \strutdepth{% - \baselineskip=\strutdepth - \vss - % if you have multiple lines of stuff to put here, you'll need to - % make the vbox yourself of the appropriate size. - \ifx#1l% - \llap{\ignorespaces #2\hskip\inmarginspacing}% - \else - \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% - \fi - \null - }% -}} -\def\inleftmargin{\doinmargin l} -\def\inrightmargin{\doinmargin r} -% -% @inmargin{TEXT [, RIGHT-TEXT]} -% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; -% else use TEXT for both). -% -\def\inmargin#1{\parseinmargin #1,,\finish} -\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \def\lefttext{#1}% have both texts - \def\righttext{#2}% - \else - \def\lefttext{#1}% have only one text - \def\righttext{#1}% - \fi - % - \ifodd\pageno - \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin - \else - \def\temp{\inleftmargin\lefttext}% - \fi - \temp -} - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). This command -% is not documented, not supported, and doesn't work. -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} - -% @include FILE -- \input text of FILE. -% -\def\include{\parseargusing\filenamecatcodes\includezzz} -\def\includezzz#1{% - \pushthisfilestack - \def\thisfile{#1}% - {% - \makevalueexpandable % we want to expand any @value in FILE. - \turnoffactive % and allow special characters in the expansion - \indexnofonts % Allow `@@' and other weird things in file names. - \wlog{texinfo.tex: doing @include of #1^^J}% - \edef\temp{\noexpand\input #1 }% - % - % This trickery is to read FILE outside of a group, in case it makes - % definitions, etc. - \expandafter - }\temp - \popthisfilestack -} -\def\filenamecatcodes{% - \catcode`\\=\other - \catcode`~=\other - \catcode`^=\other - \catcode`_=\other - \catcode`|=\other - \catcode`<=\other - \catcode`>=\other - \catcode`+=\other - \catcode`-=\other - \catcode`\`=\other - \catcode`\'=\other -} - -\def\pushthisfilestack{% - \expandafter\pushthisfilestackX\popthisfilestack\StackTerm -} -\def\pushthisfilestackX{% - \expandafter\pushthisfilestackY\thisfile\StackTerm -} -\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% - \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% -} - -\def\popthisfilestack{\errthisfilestackempty} -\def\errthisfilestackempty{\errmessage{Internal error: - the stack of filenames is empty.}} -% -\def\thisfile{} - -% @center line -% outputs that line, centered. -% -\parseargdef\center{% - \ifhmode - \let\centersub\centerH - \else - \let\centersub\centerV - \fi - \centersub{\hfil \ignorespaces#1\unskip \hfil}% - \let\centersub\relax % don't let the definition persist, just in case -} -\def\centerH#1{{% - \hfil\break - \advance\hsize by -\leftskip - \advance\hsize by -\rightskip - \line{#1}% - \break -}} -% -\newcount\centerpenalty -\def\centerV#1{% - % The idea here is the same as in \startdefun, \cartouche, etc.: if - % @center is the first thing after a section heading, we need to wipe - % out the negative parskip inserted by \sectionheading, but still - % prevent a page break here. - \centerpenalty = \lastpenalty - \ifnum\centerpenalty>10000 \vskip\parskip \fi - \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi - \line{\kern\leftskip #1\kern\rightskip}% -} - -% @sp n outputs n lines of vertical space -% -\parseargdef\sp{\vskip #1\baselineskip} - -% @comment ...line which is ignored... -% @c is the same as @comment -% @ignore ... @end ignore is another way to write a comment -% -\def\comment{\begingroup \catcode`\^^M=\other% -\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% -\commentxxx} -{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} -% -\let\c=\comment - -% @paragraphindent NCHARS -% We'll use ems for NCHARS, close enough. -% NCHARS can also be the word `asis' or `none'. -% We cannot feasibly implement @paragraphindent asis, though. -% -\def\asisword{asis} % no translation, these are keywords -\def\noneword{none} -% -\parseargdef\paragraphindent{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \defaultparindent = 0pt - \else - \defaultparindent = #1em - \fi - \fi - \parindent = \defaultparindent -} - -% @exampleindent NCHARS -% We'll use ems for NCHARS like @paragraphindent. -% It seems @exampleindent asis isn't necessary, but -% I preserve it to make it similar to @paragraphindent. -\parseargdef\exampleindent{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \lispnarrowing = 0pt - \else - \lispnarrowing = #1em - \fi - \fi -} - -% @firstparagraphindent WORD -% If WORD is `none', then suppress indentation of the first paragraph -% after a section heading. If WORD is `insert', then do indent at such -% paragraphs. -% -% The paragraph indentation is suppressed or not by calling -% \suppressfirstparagraphindent, which the sectioning commands do. -% We switch the definition of this back and forth according to WORD. -% By default, we suppress indentation. -% -\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} -\def\insertword{insert} -% -\parseargdef\firstparagraphindent{% - \def\temp{#1}% - \ifx\temp\noneword - \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent - \else\ifx\temp\insertword - \let\suppressfirstparagraphindent = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @firstparagraphindent option `\temp'}% - \fi\fi -} - -% Here is how we actually suppress indentation. Redefine \everypar to -% \kern backwards by \parindent, and then reset itself to empty. -% -% We also make \indent itself not actually do anything until the next -% paragraph. -% -\gdef\dosuppressfirstparagraphindent{% - \gdef\indent{% - \restorefirstparagraphindent - \indent - }% - \gdef\noindent{% - \restorefirstparagraphindent - \noindent - }% - \global\everypar = {% - \kern -\parindent - \restorefirstparagraphindent - }% -} - -\gdef\restorefirstparagraphindent{% - \global \let \indent = \ptexindent - \global \let \noindent = \ptexnoindent - \global \everypar = {}% -} - - -% @refill is a no-op. -\let\refill=\relax - -% If working on a large document in chapters, it is convenient to -% be able to disable indexing, cross-referencing, and contents, for test runs. -% This is done with @novalidate (before @setfilename). -% -\newif\iflinks \linkstrue % by default we want the aux files. -\let\novalidate = \linksfalse - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \iflinks - \tryauxfile - % Open the new aux file. TeX will close it automatically at exit. - \immediate\openout\auxfile=\jobname.aux - \fi % \openindices needs to do some work in any case. - \openindices - \let\setfilename=\comment % Ignore extra @setfilename cmds. - % - % If texinfo.cnf is present on the system, read it. - % Useful for site-wide @afourpaper, etc. - \openin 1 texinfo.cnf - \ifeof 1 \else \input texinfo.cnf \fi - \closein 1 - % - \comment % Ignore the actual filename. -} - -% Called from \setfilename. -% -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} - -% @bye. -\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} - - -\message{pdf,} -% adobe `portable' document format -\newcount\tempnum -\newcount\lnkcount -\newtoks\filename -\newcount\filenamelength -\newcount\pgn -\newtoks\toksA -\newtoks\toksB -\newtoks\toksC -\newtoks\toksD -\newbox\boxA -\newcount\countA -\newif\ifpdf -\newif\ifpdfmakepagedest - -% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 -% can be set). So we test for \relax and 0 as well as being undefined. -\ifx\pdfoutput\thisisundefined -\else - \ifx\pdfoutput\relax - \else - \ifcase\pdfoutput - \else - \pdftrue - \fi - \fi -\fi - -% PDF uses PostScript string constants for the names of xref targets, -% for display in the outlines, and in other places. Thus, we have to -% double any backslashes. Otherwise, a name like "\node" will be -% interpreted as a newline (\n), followed by o, d, e. Not good. -% -% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and -% related messages. The final outcome is that it is up to the TeX user -% to double the backslashes and otherwise make the string valid, so -% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to -% do this reliably, so we use it. - -% #1 is a control sequence in which to do the replacements, -% which we \xdef. -\def\txiescapepdf#1{% - \ifx\pdfescapestring\thisisundefined - % No primitive available; should we give a warning or log? - % Many times it won't matter. - \else - % The expandable \pdfescapestring primitive escapes parentheses, - % backslashes, and other special chars. - \xdef#1{\pdfescapestring{#1}}% - \fi -} - -\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images -with PDF output, and none of those formats could be found. (.eps cannot -be supported due to the design of the PDF format; use regular TeX (DVI -output) for that.)} - -\ifpdf - % - % Color manipulation macros based on pdfcolor.tex, - % except using rgb instead of cmyk; the latter is said to render as a - % very dark gray on-screen and a very dark halftone in print, instead - % of actual black. - \def\rgbDarkRed{0.50 0.09 0.12} - \def\rgbBlack{0 0 0} - % - % k sets the color for filling (usual text, etc.); - % K sets the color for stroking (thin rules, e.g., normal _'s). - \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} - % - % Set color, and create a mark which defines \thiscolor accordingly, - % so that \makeheadline knows which color to restore. - \def\setcolor#1{% - \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% - \domark - \pdfsetcolor{#1}% - } - % - \def\maincolor{\rgbBlack} - \pdfsetcolor{\maincolor} - \edef\thiscolor{\maincolor} - \def\lastcolordefs{} - % - \def\makefootline{% - \baselineskip24pt - \line{\pdfsetcolor{\maincolor}\the\footline}% - } - % - \def\makeheadline{% - \vbox to 0pt{% - \vskip-22.5pt - \line{% - \vbox to8.5pt{}% - % Extract \thiscolor definition from the marks. - \getcolormarks - % Typeset the headline with \maincolor, then restore the color. - \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% - }% - \vss - }% - \nointerlineskip - } - % - % - \pdfcatalog{/PageMode /UseOutlines} - % - % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). - \def\dopdfimage#1#2#3{% - \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% - \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% - % - % pdftex (and the PDF format) support .pdf, .png, .jpg (among - % others). Let's try in that order, PDF first since if - % someone has a scalable image, presumably better to use that than a - % bitmap. - \let\pdfimgext=\empty - \begingroup - \openin 1 #1.pdf \ifeof 1 - \openin 1 #1.PDF \ifeof 1 - \openin 1 #1.png \ifeof 1 - \openin 1 #1.jpg \ifeof 1 - \openin 1 #1.jpeg \ifeof 1 - \openin 1 #1.JPG \ifeof 1 - \errhelp = \nopdfimagehelp - \errmessage{Could not find image file #1 for pdf}% - \else \gdef\pdfimgext{JPG}% - \fi - \else \gdef\pdfimgext{jpeg}% - \fi - \else \gdef\pdfimgext{jpg}% - \fi - \else \gdef\pdfimgext{png}% - \fi - \else \gdef\pdfimgext{PDF}% - \fi - \else \gdef\pdfimgext{pdf}% - \fi - \closein 1 - \endgroup - % - % without \immediate, ancient pdftex seg faults when the same image is - % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) - \ifnum\pdftexversion < 14 - \immediate\pdfimage - \else - \immediate\pdfximage - \fi - \ifdim \wd0 >0pt width \pdfimagewidth \fi - \ifdim \wd2 >0pt height \pdfimageheight \fi - \ifnum\pdftexversion<13 - #1.\pdfimgext - \else - {#1.\pdfimgext}% - \fi - \ifnum\pdftexversion < 14 \else - \pdfrefximage \pdflastximage - \fi} - % - \def\pdfmkdest#1{{% - % We have to set dummies so commands such as @code, and characters - % such as \, aren't expanded when present in a section title. - \indexnofonts - \turnoffactive - \makevalueexpandable - \def\pdfdestname{#1}% - \txiescapepdf\pdfdestname - \safewhatsit{\pdfdest name{\pdfdestname} xyz}% - }} - % - % used to mark target names; must be expandable. - \def\pdfmkpgn#1{#1} - % - % by default, use a color that is dark enough to print on paper as - % nearly black, but still distinguishable for online viewing. - \def\urlcolor{\rgbDarkRed} - \def\linkcolor{\rgbDarkRed} - \def\endlink{\setcolor{\maincolor}\pdfendlink} - % - % Adding outlines to PDF; macros for calculating structure of outlines - % come from Petr Olsak - \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% - \else \csname#1\endcsname \fi} - \def\advancenumber#1{\tempnum=\expnumber{#1}\relax - \advance\tempnum by 1 - \expandafter\xdef\csname#1\endcsname{\the\tempnum}} - % - % #1 is the section text, which is what will be displayed in the - % outline by the pdf viewer. #2 is the pdf expression for the number - % of subentries (or empty, for subsubsections). #3 is the node text, - % which might be empty if this toc entry had no corresponding node. - % #4 is the page number - % - \def\dopdfoutline#1#2#3#4{% - % Generate a link to the node text if that exists; else, use the - % page number. We could generate a destination for the section - % text in the case where a section has no node, but it doesn't - % seem worth the trouble, since most documents are normally structured. - \edef\pdfoutlinedest{#3}% - \ifx\pdfoutlinedest\empty - \def\pdfoutlinedest{#4}% - \else - \txiescapepdf\pdfoutlinedest - \fi - % - % Also escape PDF chars in the display string. - \edef\pdfoutlinetext{#1}% - \txiescapepdf\pdfoutlinetext - % - \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% - } - % - \def\pdfmakeoutlines{% - \begingroup - % Read toc silently, to get counts of subentries for \pdfoutline. - \def\partentry##1##2##3##4{}% ignore parts in the outlines - \def\numchapentry##1##2##3##4{% - \def\thischapnum{##2}% - \def\thissecnum{0}% - \def\thissubsecnum{0}% - }% - \def\numsecentry##1##2##3##4{% - \advancenumber{chap\thischapnum}% - \def\thissecnum{##2}% - \def\thissubsecnum{0}% - }% - \def\numsubsecentry##1##2##3##4{% - \advancenumber{sec\thissecnum}% - \def\thissubsecnum{##2}% - }% - \def\numsubsubsecentry##1##2##3##4{% - \advancenumber{subsec\thissubsecnum}% - }% - \def\thischapnum{0}% - \def\thissecnum{0}% - \def\thissubsecnum{0}% - % - % use \def rather than \let here because we redefine \chapentry et - % al. a second time, below. - \def\appentry{\numchapentry}% - \def\appsecentry{\numsecentry}% - \def\appsubsecentry{\numsubsecentry}% - \def\appsubsubsecentry{\numsubsubsecentry}% - \def\unnchapentry{\numchapentry}% - \def\unnsecentry{\numsecentry}% - \def\unnsubsecentry{\numsubsecentry}% - \def\unnsubsubsecentry{\numsubsubsecentry}% - \readdatafile{toc}% - % - % Read toc second time, this time actually producing the outlines. - % The `-' means take the \expnumber as the absolute number of - % subentries, which we calculated on our first read of the .toc above. - % - % We use the node names as the destinations. - \def\numchapentry##1##2##3##4{% - \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% - \def\numsecentry##1##2##3##4{% - \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% - \def\numsubsecentry##1##2##3##4{% - \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% - \def\numsubsubsecentry##1##2##3##4{% count is always zero - \dopdfoutline{##1}{}{##3}{##4}}% - % - % PDF outlines are displayed using system fonts, instead of - % document fonts. Therefore we cannot use special characters, - % since the encoding is unknown. For example, the eogonek from - % Latin 2 (0xea) gets translated to a | character. Info from - % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. - % - % TODO this right, we have to translate 8-bit characters to - % their "best" equivalent, based on the @documentencoding. Too - % much work for too little return. Just use the ASCII equivalents - % we use for the index sort strings. - % - \indexnofonts - \setupdatafile - % We can have normal brace characters in the PDF outlines, unlike - % Texinfo index files. So set that up. - \def\{{\lbracecharliteral}% - \def\}{\rbracecharliteral}% - \catcode`\\=\active \otherbackslash - \input \tocreadfilename - \endgroup - } - {\catcode`[=1 \catcode`]=2 - \catcode`{=\other \catcode`}=\other - \gdef\lbracecharliteral[{]% - \gdef\rbracecharliteral[}]% - ] - % - \def\skipspaces#1{\def\PP{#1}\def\D{|}% - \ifx\PP\D\let\nextsp\relax - \else\let\nextsp\skipspaces - \addtokens{\filename}{\PP}% - \advance\filenamelength by 1 - \fi - \nextsp} - \def\getfilename#1{% - \filenamelength=0 - % If we don't expand the argument now, \skipspaces will get - % snagged on things like "@value{foo}". - \edef\temp{#1}% - \expandafter\skipspaces\temp|\relax - } - \ifnum\pdftexversion < 14 - \let \startlink \pdfannotlink - \else - \let \startlink \pdfstartlink - \fi - % make a live url in pdf output. - \def\pdfurl#1{% - \begingroup - % it seems we really need yet another set of dummies; have not - % tried to figure out what each command should do in the context - % of @url. for now, just make @/ a no-op, that's the only one - % people have actually reported a problem with. - % - \normalturnoffactive - \def\@{@}% - \let\/=\empty - \makevalueexpandable - % do we want to go so far as to use \indexnofonts instead of just - % special-casing \var here? - \def\var##1{##1}% - % - \leavevmode\setcolor{\urlcolor}% - \startlink attr{/Border [0 0 0]}% - user{/Subtype /Link /A << /S /URI /URI (#1) >>}% - \endgroup} - \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} - \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} - \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} - \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} - \def\maketoks{% - \expandafter\poptoks\the\toksA|ENDTOKS|\relax - \ifx\first0\adn0 - \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 - \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 - \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 - \else - \ifnum0=\countA\else\makelink\fi - \ifx\first.\let\next=\done\else - \let\next=\maketoks - \addtokens{\toksB}{\the\toksD} - \ifx\first,\addtokens{\toksB}{\space}\fi - \fi - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \next} - \def\makelink{\addtokens{\toksB}% - {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} - \def\pdflink#1{% - \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} - \setcolor{\linkcolor}#1\endlink} - \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} -\else - % non-pdf mode - \let\pdfmkdest = \gobble - \let\pdfurl = \gobble - \let\endlink = \relax - \let\setcolor = \gobble - \let\pdfsetcolor = \gobble - \let\pdfmakeoutlines = \relax -\fi % \ifx\pdfoutput - - -\message{fonts,} - -% Change the current font style to #1, remembering it in \curfontstyle. -% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in -% italics, not bold italics. -% -\def\setfontstyle#1{% - \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. - \csname ten#1\endcsname % change the current font -} - -% Select #1 fonts with the current style. -% -\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} - -\def\rm{\fam=0 \setfontstyle{rm}} -\def\it{\fam=\itfam \setfontstyle{it}} -\def\sl{\fam=\slfam \setfontstyle{sl}} -\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} -\def\tt{\fam=\ttfam \setfontstyle{tt}} - -% Unfortunately, we have to override this for titles and the like, since -% in those cases "rm" is bold. Sigh. -\def\rmisbold{\rm\def\curfontstyle{bf}} - -% Texinfo sort of supports the sans serif font style, which plain TeX does not. -% So we set up a \sf. -\newfam\sffam -\def\sf{\fam=\sffam \setfontstyle{sf}} -\let\li = \sf % Sometimes we call it \li, not \sf. - -% We don't need math for this font style. -\def\ttsl{\setfontstyle{ttsl}} - - -% Set the baselineskip to #1, and the lineskip and strut size -% correspondingly. There is no deep meaning behind these magic numbers -% used as factors; they just match (closely enough) what Knuth defined. -% -\def\lineskipfactor{.08333} -\def\strutheightpercent{.70833} -\def\strutdepthpercent {.29167} -% -% can get a sort of poor man's double spacing by redefining this. -\def\baselinefactor{1} -% -\newdimen\textleading -\def\setleading#1{% - \dimen0 = #1\relax - \normalbaselineskip = \baselinefactor\dimen0 - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% PDF CMaps. See also LaTeX's t1.cmap. -% -% do nothing with this by default. -\expandafter\let\csname cmapOT1\endcsname\gobble -\expandafter\let\csname cmapOT1IT\endcsname\gobble -\expandafter\let\csname cmapOT1TT\endcsname\gobble - -% if we are producing pdf, and we have \pdffontattr, then define cmaps. -% (\pdffontattr was introduced many years ago, but people still run -% older pdftex's; it's easy to conditionalize, so we do.) -\ifpdf \ifx\pdffontattr\thisisundefined \else - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1-0) -%%Title: (TeX-OT1-0 TeX OT1 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1) -/Supplement 0 ->> def -/CMapName /TeX-OT1-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -8 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<23> <26> <0023> -<28> <3B> <0028> -<3F> <5B> <003F> -<5D> <5E> <005D> -<61> <7A> <0061> -<7B> <7C> <2013> -endbfrange -40 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <00660066> -<0C> <00660069> -<0D> <0066006C> -<0E> <006600660069> -<0F> <00660066006C> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<21> <0021> -<22> <201D> -<27> <2019> -<3C> <00A1> -<3D> <003D> -<3E> <00BF> -<5C> <201C> -<5F> <02D9> -<60> <2018> -<7D> <02DD> -<7E> <007E> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -% -% \cmapOT1IT - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1IT-0) -%%Title: (TeX-OT1IT-0 TeX OT1IT 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1IT) -/Supplement 0 ->> def -/CMapName /TeX-OT1IT-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -8 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<25> <26> <0025> -<28> <3B> <0028> -<3F> <5B> <003F> -<5D> <5E> <005D> -<61> <7A> <0061> -<7B> <7C> <2013> -endbfrange -42 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <00660066> -<0C> <00660069> -<0D> <0066006C> -<0E> <006600660069> -<0F> <00660066006C> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<21> <0021> -<22> <201D> -<23> <0023> -<24> <00A3> -<27> <2019> -<3C> <00A1> -<3D> <003D> -<3E> <00BF> -<5C> <201C> -<5F> <02D9> -<60> <2018> -<7D> <02DD> -<7E> <007E> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1IT\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -% -% \cmapOT1TT - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1TT-0) -%%Title: (TeX-OT1TT-0 TeX OT1TT 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1TT) -/Supplement 0 ->> def -/CMapName /TeX-OT1TT-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -5 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<21> <26> <0021> -<28> <5F> <0028> -<61> <7E> <0061> -endbfrange -32 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <2191> -<0C> <2193> -<0D> <0027> -<0E> <00A1> -<0F> <00BF> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<20> <2423> -<27> <2019> -<60> <2018> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1TT\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -\fi\fi - - -% Set the font macro #1 to the font named \fontprefix#2. -% #3 is the font's design size, #4 is a scale factor, #5 is the CMap -% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). -% Example: -% #1 = \textrm -% #2 = \rmshape -% #3 = 10 -% #4 = \mainmagstep -% #5 = OT1 -% -\def\setfont#1#2#3#4#5{% - \font#1=\fontprefix#2#3 scaled #4 - \csname cmap#5\endcsname#1% -} -% This is what gets called when #5 of \setfont is empty. -\let\cmap\gobble -% -% (end of cmaps) - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\thisisundefined -\def\fontprefix{cm} -\fi -% Support font families that don't use the same naming scheme as CM. -\def\rmshape{r} -\def\rmbshape{bx} % where the normal face is bold -\def\bfshape{b} -\def\bxshape{bx} -\def\ttshape{tt} -\def\ttbshape{tt} -\def\ttslshape{sltt} -\def\itshape{ti} -\def\itbshape{bxti} -\def\slshape{sl} -\def\slbshape{bxsl} -\def\sfshape{ss} -\def\sfbshape{ss} -\def\scshape{csc} -\def\scbshape{csc} - -% Definitions for a main text size of 11pt. (The default in Texinfo.) -% -\def\definetextfontsizexi{% -% Text fonts (11.2pt, magstep1). -\def\textnominalsize{11pt} -\edef\mainmagstep{\magstephalf} -\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} -\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} -\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} -\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} -\setfont\textsl\slshape{10}{\mainmagstep}{OT1} -\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} -\setfont\textsc\scshape{10}{\mainmagstep}{OT1} -\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep -\def\textecsize{1095} - -% A few fonts for @defun names and args. -\setfont\defbf\bfshape{10}{\magstep1}{OT1} -\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} -\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} - -% Fonts for indices, footnotes, small examples (9pt). -\def\smallnominalsize{9pt} -\setfont\smallrm\rmshape{9}{1000}{OT1} -\setfont\smalltt\ttshape{9}{1000}{OT1TT} -\setfont\smallbf\bfshape{10}{900}{OT1} -\setfont\smallit\itshape{9}{1000}{OT1IT} -\setfont\smallsl\slshape{9}{1000}{OT1} -\setfont\smallsf\sfshape{9}{1000}{OT1} -\setfont\smallsc\scshape{10}{900}{OT1} -\setfont\smallttsl\ttslshape{10}{900}{OT1TT} -\font\smalli=cmmi9 -\font\smallsy=cmsy9 -\def\smallecsize{0900} - -% Fonts for small examples (8pt). -\def\smallernominalsize{8pt} -\setfont\smallerrm\rmshape{8}{1000}{OT1} -\setfont\smallertt\ttshape{8}{1000}{OT1TT} -\setfont\smallerbf\bfshape{10}{800}{OT1} -\setfont\smallerit\itshape{8}{1000}{OT1IT} -\setfont\smallersl\slshape{8}{1000}{OT1} -\setfont\smallersf\sfshape{8}{1000}{OT1} -\setfont\smallersc\scshape{10}{800}{OT1} -\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} -\font\smalleri=cmmi8 -\font\smallersy=cmsy8 -\def\smallerecsize{0800} - -% Fonts for title page (20.4pt): -\def\titlenominalsize{20pt} -\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} -\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} -\setfont\titlesl\slbshape{10}{\magstep4}{OT1} -\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} -\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} -\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4}{OT1} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\titleecsize{2074} - -% Chapter (and unnumbered) fonts (17.28pt). -\def\chapnominalsize{17pt} -\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} -\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} -\setfont\chapsl\slbshape{10}{\magstep3}{OT1} -\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} -\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} -\setfont\chapsf\sfbshape{17}{1000}{OT1} -\let\chapbf=\chaprm -\setfont\chapsc\scbshape{10}{\magstep3}{OT1} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 -\def\chapecsize{1728} - -% Section fonts (14.4pt). -\def\secnominalsize{14pt} -\setfont\secrm\rmbshape{12}{\magstep1}{OT1} -\setfont\secit\itbshape{10}{\magstep2}{OT1IT} -\setfont\secsl\slbshape{10}{\magstep2}{OT1} -\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} -\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} -\setfont\secsf\sfbshape{12}{\magstep1}{OT1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep2}{OT1} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 -\def\sececsize{1440} - -% Subsection fonts (13.15pt). -\def\ssecnominalsize{13pt} -\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} -\setfont\ssecit\itbshape{10}{1315}{OT1IT} -\setfont\ssecsl\slbshape{10}{1315}{OT1} -\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} -\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} -\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{1315}{OT1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled 1315 -\def\ssececsize{1200} - -% Reduced fonts for @acro in text (10pt). -\def\reducednominalsize{10pt} -\setfont\reducedrm\rmshape{10}{1000}{OT1} -\setfont\reducedtt\ttshape{10}{1000}{OT1TT} -\setfont\reducedbf\bfshape{10}{1000}{OT1} -\setfont\reducedit\itshape{10}{1000}{OT1IT} -\setfont\reducedsl\slshape{10}{1000}{OT1} -\setfont\reducedsf\sfshape{10}{1000}{OT1} -\setfont\reducedsc\scshape{10}{1000}{OT1} -\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} -\font\reducedi=cmmi10 -\font\reducedsy=cmsy10 -\def\reducedecsize{1000} - -\textleading = 13.2pt % line spacing for 11pt CM -\textfonts % reset the current fonts -\rm -} % end of 11pt text font size definitions, \definetextfontsizexi - - -% Definitions to make the main text be 10pt Computer Modern, with -% section, chapter, etc., sizes following suit. This is for the GNU -% Press printing of the Emacs 22 manual. Maybe other manuals in the -% future. Used with @smallbook, which sets the leading to 12pt. -% -\def\definetextfontsizex{% -% Text fonts (10pt). -\def\textnominalsize{10pt} -\edef\mainmagstep{1000} -\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} -\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} -\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} -\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} -\setfont\textsl\slshape{10}{\mainmagstep}{OT1} -\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} -\setfont\textsc\scshape{10}{\mainmagstep}{OT1} -\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep -\def\textecsize{1000} - -% A few fonts for @defun names and args. -\setfont\defbf\bfshape{10}{\magstephalf}{OT1} -\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} -\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} - -% Fonts for indices, footnotes, small examples (9pt). -\def\smallnominalsize{9pt} -\setfont\smallrm\rmshape{9}{1000}{OT1} -\setfont\smalltt\ttshape{9}{1000}{OT1TT} -\setfont\smallbf\bfshape{10}{900}{OT1} -\setfont\smallit\itshape{9}{1000}{OT1IT} -\setfont\smallsl\slshape{9}{1000}{OT1} -\setfont\smallsf\sfshape{9}{1000}{OT1} -\setfont\smallsc\scshape{10}{900}{OT1} -\setfont\smallttsl\ttslshape{10}{900}{OT1TT} -\font\smalli=cmmi9 -\font\smallsy=cmsy9 -\def\smallecsize{0900} - -% Fonts for small examples (8pt). -\def\smallernominalsize{8pt} -\setfont\smallerrm\rmshape{8}{1000}{OT1} -\setfont\smallertt\ttshape{8}{1000}{OT1TT} -\setfont\smallerbf\bfshape{10}{800}{OT1} -\setfont\smallerit\itshape{8}{1000}{OT1IT} -\setfont\smallersl\slshape{8}{1000}{OT1} -\setfont\smallersf\sfshape{8}{1000}{OT1} -\setfont\smallersc\scshape{10}{800}{OT1} -\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} -\font\smalleri=cmmi8 -\font\smallersy=cmsy8 -\def\smallerecsize{0800} - -% Fonts for title page (20.4pt): -\def\titlenominalsize{20pt} -\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} -\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} -\setfont\titlesl\slbshape{10}{\magstep4}{OT1} -\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} -\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} -\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4}{OT1} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\titleecsize{2074} - -% Chapter fonts (14.4pt). -\def\chapnominalsize{14pt} -\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} -\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} -\setfont\chapsl\slbshape{10}{\magstep2}{OT1} -\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} -\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} -\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} -\let\chapbf\chaprm -\setfont\chapsc\scbshape{10}{\magstep2}{OT1} -\font\chapi=cmmi12 scaled \magstep1 -\font\chapsy=cmsy10 scaled \magstep2 -\def\chapecsize{1440} - -% Section fonts (12pt). -\def\secnominalsize{12pt} -\setfont\secrm\rmbshape{12}{1000}{OT1} -\setfont\secit\itbshape{10}{\magstep1}{OT1IT} -\setfont\secsl\slbshape{10}{\magstep1}{OT1} -\setfont\sectt\ttbshape{12}{1000}{OT1TT} -\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} -\setfont\secsf\sfbshape{12}{1000}{OT1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep1}{OT1} -\font\seci=cmmi12 -\font\secsy=cmsy10 scaled \magstep1 -\def\sececsize{1200} - -% Subsection fonts (10pt). -\def\ssecnominalsize{10pt} -\setfont\ssecrm\rmbshape{10}{1000}{OT1} -\setfont\ssecit\itbshape{10}{1000}{OT1IT} -\setfont\ssecsl\slbshape{10}{1000}{OT1} -\setfont\ssectt\ttbshape{10}{1000}{OT1TT} -\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} -\setfont\ssecsf\sfbshape{10}{1000}{OT1} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{1000}{OT1} -\font\sseci=cmmi10 -\font\ssecsy=cmsy10 -\def\ssececsize{1000} - -% Reduced fonts for @acro in text (9pt). -\def\reducednominalsize{9pt} -\setfont\reducedrm\rmshape{9}{1000}{OT1} -\setfont\reducedtt\ttshape{9}{1000}{OT1TT} -\setfont\reducedbf\bfshape{10}{900}{OT1} -\setfont\reducedit\itshape{9}{1000}{OT1IT} -\setfont\reducedsl\slshape{9}{1000}{OT1} -\setfont\reducedsf\sfshape{9}{1000}{OT1} -\setfont\reducedsc\scshape{10}{900}{OT1} -\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} -\font\reducedi=cmmi9 -\font\reducedsy=cmsy9 -\def\reducedecsize{0900} - -\divide\parskip by 2 % reduce space between paragraphs -\textleading = 12pt % line spacing for 10pt CM -\textfonts % reset the current fonts -\rm -} % end of 10pt text font size definitions, \definetextfontsizex - - -% We provide the user-level command -% @fonttextsize 10 -% (or 11) to redefine the text font size. pt is assumed. -% -\def\xiword{11} -\def\xword{10} -\def\xwordpt{10pt} -% -\parseargdef\fonttextsize{% - \def\textsizearg{#1}% - %\wlog{doing @fonttextsize \textsizearg}% - % - % Set \globaldefs so that documents can use this inside @tex, since - % makeinfo 4.8 does not support it, but we need it nonetheless. - % - \begingroup \globaldefs=1 - \ifx\textsizearg\xword \definetextfontsizex - \else \ifx\textsizearg\xiword \definetextfontsizexi - \else - \errhelp=\EMsimple - \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} - \fi\fi - \endgroup -} - - -% In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts except -% in the main text, we don't bother to reset \scriptfont and -% \scriptscriptfont (which would also require loading a lot more fonts). -% -\def\resetmathfonts{% - \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy - \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf - \textfont\ttfam=\tentt \textfont\sffam=\tensf -} - -% The font-changing commands redefine the meanings of \tenSTYLE, instead -% of just \STYLE. We do this because \STYLE needs to also set the -% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire -% \tenSTYLE to set the current font. -% -% Each font-changing command also sets the names \lsize (one size lower) -% and \lllsize (three sizes lower). These relative commands are used in -% the LaTeX logo and acronyms. -% -% This all needs generalizing, badly. -% -\def\textfonts{% - \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl - \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy - \let\tenttsl=\textttsl - \def\curfontsize{text}% - \def\lsize{reduced}\def\lllsize{smaller}% - \resetmathfonts \setleading{\textleading}} -\def\titlefonts{% - \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl - \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc - \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy - \let\tenttsl=\titlettsl - \def\curfontsize{title}% - \def\lsize{chap}\def\lllsize{subsec}% - \resetmathfonts \setleading{27pt}} -\def\titlefont#1{{\titlefonts\rmisbold #1}} -\def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl - \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy - \let\tenttsl=\chapttsl - \def\curfontsize{chap}% - \def\lsize{sec}\def\lllsize{text}% - \resetmathfonts \setleading{19pt}} -\def\secfonts{% - \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy - \let\tenttsl=\secttsl - \def\curfontsize{sec}% - \def\lsize{subsec}\def\lllsize{reduced}% - \resetmathfonts \setleading{16pt}} -\def\subsecfonts{% - \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl - \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy - \let\tenttsl=\ssecttsl - \def\curfontsize{ssec}% - \def\lsize{text}\def\lllsize{small}% - \resetmathfonts \setleading{15pt}} -\let\subsubsecfonts = \subsecfonts -\def\reducedfonts{% - \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl - \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc - \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy - \let\tenttsl=\reducedttsl - \def\curfontsize{reduced}% - \def\lsize{small}\def\lllsize{smaller}% - \resetmathfonts \setleading{10.5pt}} -\def\smallfonts{% - \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl - \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc - \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy - \let\tenttsl=\smallttsl - \def\curfontsize{small}% - \def\lsize{smaller}\def\lllsize{smaller}% - \resetmathfonts \setleading{10.5pt}} -\def\smallerfonts{% - \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl - \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc - \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy - \let\tenttsl=\smallerttsl - \def\curfontsize{smaller}% - \def\lsize{smaller}\def\lllsize{smaller}% - \resetmathfonts \setleading{9.5pt}} - -% Fonts for short table of contents. -\setfont\shortcontrm\rmshape{12}{1000}{OT1} -\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 -\setfont\shortcontsl\slshape{12}{1000}{OT1} -\setfont\shortconttt\ttshape{12}{1000}{OT1TT} - -% Define these just so they can be easily changed for other fonts. -\def\angleleft{$\langle$} -\def\angleright{$\rangle$} - -% Set the fonts to use with the @small... environments. -\let\smallexamplefonts = \smallfonts - -% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample -% can fit this many characters: -% 8.5x11=86 smallbook=72 a4=90 a5=69 -% If we use \scriptfonts (8pt), then we can fit this many characters: -% 8.5x11=90+ smallbook=80 a4=90+ a5=77 -% For me, subjectively, the few extra characters that fit aren't worth -% the additional smallness of 8pt. So I'm making the default 9pt. -% -% By the way, for comparison, here's what fits with @example (10pt): -% 8.5x11=71 smallbook=60 a4=75 a5=58 -% --karl, 24jan03. - -% Set up the default fonts, so we can use them for creating boxes. -% -\definetextfontsizexi - - -\message{markup,} - -% Check if we are currently using a typewriter font. Since all the -% Computer Modern typewriter fonts have zero interword stretch (and -% shrink), and it is reasonable to expect all typewriter fonts to have -% this property, we can check that font parameter. -% -\def\ifmonospace{\ifdim\fontdimen3\font=0pt } - -% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will -% define and register \INITMACRO to be called on markup style changes. -% \INITMACRO can check \currentmarkupstyle for the innermost -% style and the set of \ifmarkupSTYLE switches for all styles -% currently in effect. -\newif\ifmarkupvar -\newif\ifmarkupsamp -\newif\ifmarkupkey -%\newif\ifmarkupfile % @file == @samp. -%\newif\ifmarkupoption % @option == @samp. -\newif\ifmarkupcode -\newif\ifmarkupkbd -%\newif\ifmarkupenv % @env == @code. -%\newif\ifmarkupcommand % @command == @code. -\newif\ifmarkuptex % @tex (and part of @math, for now). -\newif\ifmarkupexample -\newif\ifmarkupverb -\newif\ifmarkupverbatim - -\let\currentmarkupstyle\empty - -\def\setupmarkupstyle#1{% - \csname markup#1true\endcsname - \def\currentmarkupstyle{#1}% - \markupstylesetup -} - -\let\markupstylesetup\empty - -\def\defmarkupstylesetup#1{% - \expandafter\def\expandafter\markupstylesetup - \expandafter{\markupstylesetup #1}% - \def#1% -} - -% Markup style setup for left and right quotes. -\defmarkupstylesetup\markupsetuplq{% - \expandafter\let\expandafter \temp - \csname markupsetuplq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuplqdefault \else \temp \fi -} - -\defmarkupstylesetup\markupsetuprq{% - \expandafter\let\expandafter \temp - \csname markupsetuprq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuprqdefault \else \temp \fi -} - -{ -\catcode`\'=\active -\catcode`\`=\active - -\gdef\markupsetuplqdefault{\let`\lq} -\gdef\markupsetuprqdefault{\let'\rq} - -\gdef\markupsetcodequoteleft{\let`\codequoteleft} -\gdef\markupsetcodequoteright{\let'\codequoteright} -} - -\let\markupsetuplqcode \markupsetcodequoteleft -\let\markupsetuprqcode \markupsetcodequoteright -% -\let\markupsetuplqexample \markupsetcodequoteleft -\let\markupsetuprqexample \markupsetcodequoteright -% -\let\markupsetuplqkbd \markupsetcodequoteleft -\let\markupsetuprqkbd \markupsetcodequoteright -% -\let\markupsetuplqsamp \markupsetcodequoteleft -\let\markupsetuprqsamp \markupsetcodequoteright -% -\let\markupsetuplqverb \markupsetcodequoteleft -\let\markupsetuprqverb \markupsetcodequoteright -% -\let\markupsetuplqverbatim \markupsetcodequoteleft -\let\markupsetuprqverbatim \markupsetcodequoteright - -% Allow an option to not use regular directed right quote/apostrophe -% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). -% The undirected quote is ugly, so don't make it the default, but it -% works for pasting with more pdf viewers (at least evince), the -% lilypond developers report. xpdf does work with the regular 0x27. -% -\def\codequoteright{% - \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax - \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax - '% - \else \char'15 \fi - \else \char'15 \fi -} -% -% and a similar option for the left quote char vs. a grave accent. -% Modern fonts display ASCII 0x60 as a grave accent, so some people like -% the code environments to do likewise. -% -\def\codequoteleft{% - \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax - \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax - % [Knuth] pp. 380,381,391 - % \relax disables Spanish ligatures ?` and !` of \tt font. - \relax`% - \else \char'22 \fi - \else \char'22 \fi -} - -% Commands to set the quote options. -% -\parseargdef\codequoteundirected{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxicodequoteundirected\endcsname - = t% - \else\ifx\temp\offword - \expandafter\let\csname SETtxicodequoteundirected\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% - \fi\fi -} -% -\parseargdef\codequotebacktick{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxicodequotebacktick\endcsname - = t% - \else\ifx\temp\offword - \expandafter\let\csname SETtxicodequotebacktick\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% - \fi\fi -} - -% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. -\def\noligaturesquoteleft{\relax\lq} - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Font commands. - -% #1 is the font command (\sl or \it), #2 is the text to slant. -% If we are in a monospaced environment, however, 1) always use \ttsl, -% and 2) do not add an italic correction. -\def\dosmartslant#1#2{% - \ifusingtt - {{\ttsl #2}\let\next=\relax}% - {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% - \next -} -\def\smartslanted{\dosmartslant\sl} -\def\smartitalic{\dosmartslant\it} - -% Output an italic correction unless \next (presumed to be the following -% character) is such as not to need one. -\def\smartitaliccorrection{% - \ifx\next,% - \else\ifx\next-% - \else\ifx\next.% - \else\ptexslash - \fi\fi\fi - \aftersmartic -} - -% Unconditional use \ttsl, and no ic. @var is set to this for defuns. -\def\ttslanted#1{{\ttsl #1}} - -% @cite is like \smartslanted except unconditionally use \sl. We never want -% ttsl for book titles, do we? -\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} - -\def\aftersmartic{} -\def\var#1{% - \let\saveaftersmartic = \aftersmartic - \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% - \smartslanted{#1}% -} - -\let\i=\smartitalic -\let\slanted=\smartslanted -\let\dfn=\smartslanted -\let\emph=\smartitalic - -% Explicit font changes: @r, @sc, undocumented @ii. -\def\r#1{{\rm #1}} % roman font -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font - -% @b, explicit bold. Also @strong. -\def\b#1{{\bf #1}} -\let\strong=\b - -% @sansserif, explicit sans. -\def\sansserif#1{{\sf #1}} - -% We can't just use \exhyphenpenalty, because that only has effect at -% the end of a paragraph. Restore normal hyphenation at the end of the -% group within which \nohyphenation is presumably called. -% -\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} -\def\restorehyphenation{\hyphenchar\font = `- } - -% Set sfcode to normal for the chars that usually have another value. -% Can't use plain's \frenchspacing because it uses the `\x notation, and -% sometimes \x has an active definition that messes things up. -% -\catcode`@=11 - \def\plainfrenchspacing{% - \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m - \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m - \def\endofsentencespacefactor{1000}% for @. and friends - } - \def\plainnonfrenchspacing{% - \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 - \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 - \def\endofsentencespacefactor{3000}% for @. and friends - } -\catcode`@=\other -\def\endofsentencespacefactor{3000}% default - -% @t, explicit typewriter. -\def\t#1{% - {\tt \rawbackslash \plainfrenchspacing #1}% - \null -} - -% @samp. -\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} - -% @indicateurl is \samp, that is, with quotes. -\let\indicateurl=\samp - -% @code (and similar) prints in typewriter, but with spaces the same -% size as normal in the surrounding text, without hyphenation, etc. -% This is a subroutine for that. -\def\tclose#1{% - {% - % Change normal interword space to be same as for the current font. - \spaceskip = \fontdimen2\font - % - % Switch to typewriter. - \tt - % - % But `\ ' produces the large typewriter interword space. - \def\ {{\spaceskip = 0pt{} }}% - % - % Turn off hyphenation. - \nohyphenation - % - \rawbackslash - \plainfrenchspacing - #1% - }% - \null % reset spacefactor to 1000 -} - -% We *must* turn on hyphenation at `-' and `_' in @code. -% Otherwise, it is too hard to avoid overfull hboxes -% in the Emacs manual, the Library manual, etc. -% -% Unfortunately, TeX uses one parameter (\hyphenchar) to control -% both hyphenation at - and hyphenation within words. -% We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate at a dash. -% -- rms. -{ - \catcode`\-=\active \catcode`\_=\active - \catcode`\'=\active \catcode`\`=\active - \global\let'=\rq \global\let`=\lq % default definitions - % - \global\def\code{\begingroup - \setupmarkupstyle{code}% - % The following should really be moved into \setupmarkupstyle handlers. - \catcode\dashChar=\active \catcode\underChar=\active - \ifallowcodebreaks - \let-\codedash - \let_\codeunder - \else - \let-\normaldash - \let_\realunder - \fi - \codex - } -} - -\def\codex #1{\tclose{#1}\endgroup} - -\def\normaldash{-} -\def\codedash{-\discretionary{}{}{}} -\def\codeunder{% - % this is all so @math{@code{var_name}+1} can work. In math mode, _ - % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) - % will therefore expand the active definition of _, which is us - % (inside @code that is), therefore an endless loop. - \ifusingtt{\ifmmode - \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. - \else\normalunderscore \fi - \discretionary{}{}{}}% - {\_}% -} - -% An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__. This is bad. -% @allowcodebreaks provides a document-level way to turn breaking at - -% and _ on and off. -% -\newif\ifallowcodebreaks \allowcodebreakstrue - -\def\keywordtrue{true} -\def\keywordfalse{false} - -\parseargdef\allowcodebreaks{% - \def\txiarg{#1}% - \ifx\txiarg\keywordtrue - \allowcodebreakstrue - \else\ifx\txiarg\keywordfalse - \allowcodebreaksfalse - \else - \errhelp = \EMsimple - \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% - \fi\fi -} - -% For @command, @env, @file, @option quotes seem unnecessary, -% so use \code rather than \samp. -\let\command=\code -\let\env=\code -\let\file=\code -\let\option=\code - -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself. First (mandatory) arg is the url. -% (This \urefnobreak definition isn't used now, leaving it for a while -% for comparison.) -\def\urefnobreak#1{\dourefnobreak #1,,,\finish} -\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup - \unsepspaces - \pdfurl{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \code{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} - -% This \urefbreak definition is the active one. -\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} -\let\uref=\urefbreak -\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} -\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example - \unsepspaces - \pdfurl{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \urefcode{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} - -% Allow line breaks around only a few characters (only). -\def\urefcatcodes{% - \catcode\ampChar=\active \catcode\dotChar=\active - \catcode\hashChar=\active \catcode\questChar=\active - \catcode\slashChar=\active -} -{ - \urefcatcodes - % - \global\def\urefcode{\begingroup - \setupmarkupstyle{code}% - \urefcatcodes - \let&\urefcodeamp - \let.\urefcodedot - \let#\urefcodehash - \let?\urefcodequest - \let/\urefcodeslash - \codex - } - % - % By default, they are just regular characters. - \global\def&{\normalamp} - \global\def.{\normaldot} - \global\def#{\normalhash} - \global\def?{\normalquest} - \global\def/{\normalslash} -} - -% we put a little stretch before and after the breakable chars, to help -% line breaking of long url's. The unequal skips make look better in -% cmtt at least, especially for dots. -\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } -\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } -% -\def\urefcodeamp{\urefprestretch \&\urefpoststretch} -\def\urefcodedot{\urefprestretch .\urefpoststretch} -\def\urefcodehash{\urefprestretch \#\urefpoststretch} -\def\urefcodequest{\urefprestretch ?\urefpoststretch} -\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} -{ - \catcode`\/=\active - \global\def\urefcodeslashfinish{% - \urefprestretch \slashChar - % Allow line break only after the final / in a sequence of - % slashes, to avoid line break between the slashes in http://. - \ifx\next/\else \urefpoststretch \fi - } -} - -% One more complication: by default we'll break after the special -% characters, but some people like to break before the special chars, so -% allow that. Also allow no breaking at all, for manual control. -% -\parseargdef\urefbreakstyle{% - \def\txiarg{#1}% - \ifx\txiarg\wordnone - \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} - \else\ifx\txiarg\wordbefore - \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} - \else\ifx\txiarg\wordafter - \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} - \else - \errhelp = \EMsimple - \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% - \fi\fi\fi -} -\def\wordafter{after} -\def\wordbefore{before} -\def\wordnone{none} - -\urefbreakstyle after - -% @url synonym for @uref, since that's how everyone uses it. -% -\let\url=\uref - -% rms does not like angle brackets --karl, 17may97. -% So now @email is just like @uref, unless we are pdf. -% -%\def\email#1{\angleleft{\tt #1}\angleright} -\ifpdf - \def\email#1{\doemail#1,,\finish} - \def\doemail#1,#2,#3\finish{\begingroup - \unsepspaces - \pdfurl{mailto:#1}% - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi - \endlink - \endgroup} -\else - \let\email=\uref -\fi - -% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), -% `example' (@kbd uses ttsl only inside of @example and friends), -% or `code' (@kbd uses normal tty font always). -\parseargdef\kbdinputstyle{% - \def\txiarg{#1}% - \ifx\txiarg\worddistinct - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% - \else\ifx\txiarg\wordexample - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% - \else\ifx\txiarg\wordcode - \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% - \else - \errhelp = \EMsimple - \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% - \fi\fi\fi -} -\def\worddistinct{distinct} -\def\wordexample{example} -\def\wordcode{code} - -% Default is `distinct'. -\kbdinputstyle distinct - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. -\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} - -\def\xkey{\key} -\def\kbdsub#1#2#3\par{% - \def\one{#1}\def\three{#3}\def\threex{??}% - \ifx\one\xkey\ifx\threex\three \key{#2}% - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi -} - -% definition of @key that produces a lozenge. Doesn't adjust to text size. -%\setfont\keyrm\rmshape{8}{1000}{OT1} -%\font\keysy=cmsy9 -%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% -% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% -% \vbox{\hrule\kern-0.4pt -% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% -% \kern-0.4pt\hrule}% -% \kern-.06em\raise0.4pt\hbox{\angleright}}}} - -% definition of @key with no lozenge. If the current font is already -% monospace, don't change it; that way, we respect @kbdinputstyle. But -% if it isn't monospace, then use \tt. -% -\def\key#1{{\setupmarkupstyle{key}% - \nohyphenation - \ifmonospace\else\tt\fi - #1}\null} - -% @clicksequence{File @click{} Open ...} -\def\clicksequence#1{\begingroup #1\endgroup} - -% @clickstyle @arrow (by default) -\parseargdef\clickstyle{\def\click{#1}} -\def\click{\arrow} - -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. -% -\def\dmn#1{\thinspace #1} - -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find. We need it for -% Polish suppressed-l. --karl, 22sep96. -%\def\l#1{{\li #1}\null} - -% @acronym for "FBI", "NATO", and the like. -% We print this one point size smaller, since it's intended for -% all-uppercase. -% -\def\acronym#1{\doacronym #1,,\finish} -\def\doacronym#1,#2,#3\finish{% - {\selectfonts\lsize #1}% - \def\temp{#2}% - \ifx\temp\empty \else - \space ({\unsepspaces \ignorespaces \temp \unskip})% - \fi - \null % reset \spacefactor=1000 -} - -% @abbr for "Comput. J." and the like. -% No font change, but don't do end-of-sentence spacing. -% -\def\abbr#1{\doabbr #1,,\finish} -\def\doabbr#1,#2,#3\finish{% - {\plainfrenchspacing #1}% - \def\temp{#2}% - \ifx\temp\empty \else - \space ({\unsepspaces \ignorespaces \temp \unskip})% - \fi - \null % reset \spacefactor=1000 -} - -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math outputs its argument in math mode. -% -% One complication: _ usually means subscripts, but it could also mean -% an actual _ character, as in @math{@var{some_variable} + 1}. So make -% _ active, and distinguish by seeing if the current family is \slfam, -% which is what @var uses. -{ - \catcode`\_ = \active - \gdef\mathunderscore{% - \catcode`\_=\active - \def_{\ifnum\fam=\slfam \_\else\sb\fi}% - } -} -% Another complication: we want \\ (and @\) to output a math (or tt) \. -% FYI, plain.tex uses \\ as a temporary control sequence (for no -% particular reason), but this is not advertised and we don't care. -% -% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. -\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} -% -\def\math{% - \tex - \mathunderscore - \let\\ = \mathbackslash - \mathactive - % make the texinfo accent commands work in math mode - \let\"=\ddot - \let\'=\acute - \let\==\bar - \let\^=\hat - \let\`=\grave - \let\u=\breve - \let\v=\check - \let\~=\tilde - \let\dotaccent=\dot - $\finishmath -} -\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. - -% Some active characters (such as <) are spaced differently in math. -% We have to reset their definitions in case the @math was an argument -% to a command which sets the catcodes (such as @item or @section). -% -{ - \catcode`^ = \active - \catcode`< = \active - \catcode`> = \active - \catcode`+ = \active - \catcode`' = \active - \gdef\mathactive{% - \let^ = \ptexhat - \let< = \ptexless - \let> = \ptexgtr - \let+ = \ptexplus - \let' = \ptexquoteright - } -} - -% ctrl is no longer a Texinfo command, but leave this definition for fun. -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. -% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, -% except specified as a normal braced arg, so no newlines to worry about. -% -\def\outfmtnametex{tex} -% -\long\def\inlinefmt#1{\doinlinefmt #1,\finish} -\long\def\doinlinefmt#1,#2,\finish{% - \def\inlinefmtname{#1}% - \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi -} -% For raw, must switch into @tex before parsing the argument, to avoid -% setting catcodes prematurely. Doing it this way means that, for -% example, @inlineraw{html, foo{bar} gets a parse error instead of being -% ignored. But this isn't important because if people want a literal -% *right* brace they would have to use a command anyway, so they may as -% well use a command to get a left brace too. We could re-use the -% delimiter character idea from \verb, but it seems like overkill. -% -\long\def\inlineraw{\tex \doinlineraw} -\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} -\def\doinlinerawtwo#1,#2,\finish{% - \def\inlinerawname{#1}% - \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi - \endgroup % close group opened by \tex. -} - - -\message{glyphs,} -% and logos. - -% @@ prints an @, as does @atchar{}. -\def\@{\char64 } -\let\atchar=\@ - -% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. -% Unless we're in typewriter, use \ecfont because the CM text fonts do -% not have braces, and we don't want to switch into math. -\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} -\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} -\let\{=\mylbrace \let\lbracechar=\{ -\let\}=\myrbrace \let\rbracechar=\} -\begingroup - % Definitions to produce \{ and \} commands for indices, - % and @{ and @} for the aux/toc files. - \catcode`\{ = \other \catcode`\} = \other - \catcode`\[ = 1 \catcode`\] = 2 - \catcode`\! = 0 \catcode`\\ = \other - !gdef!lbracecmd[\{]% - !gdef!rbracecmd[\}]% - !gdef!lbraceatcmd[@{]% - !gdef!rbraceatcmd[@}]% -!endgroup - -% @comma{} to avoid , parsing problems. -\let\comma = , - -% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. -\let\, = \ptexc -\let\dotaccent = \ptexdot -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \ptext -\let\ubaraccent = \ptexb -\let\udotaccent = \d - -% Other special characters: @questiondown @exclamdown @ordf @ordm -% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. -\def\questiondown{?`} -\def\exclamdown{!`} -\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} -\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} - -% Dotless i and dotless j, used for accents. -\def\imacro{i} -\def\jmacro{j} -\def\dotless#1{% - \def\temp{#1}% - \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi - \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi - \else \errmessage{@dotless can be used only with i or j}% - \fi\fi -} - -% The \TeX{} logo, as in plain, but resetting the spacing so that a -% period following counts as ending a sentence. (Idea found in latex.) -% -\edef\TeX{\TeX \spacefactor=1000 } - -% @LaTeX{} logo. Not quite the same results as the definition in -% latex.ltx, since we use a different font for the raised A; it's most -% convenient for us to use an explicitly smaller font, rather than using -% the \scriptstyle font (since we don't reset \scriptstyle and -% \scriptscriptstyle). -% -\def\LaTeX{% - L\kern-.36em - {\setbox0=\hbox{T}% - \vbox to \ht0{\hbox{% - \ifx\textnominalsize\xwordpt - % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. - % Revert to plain's \scriptsize, which is 7pt. - \count255=\the\fam $\fam\count255 \scriptstyle A$% - \else - % For 11pt, we can use our lllsize. - \selectfonts\lllsize A% - \fi - }% - \vss - }}% - \kern-.15em - \TeX -} - -% Some math mode symbols. -\def\bullet{$\ptexbullet$} -\def\geq{\ifmmode \ge\else $\ge$\fi} -\def\leq{\ifmmode \le\else $\le$\fi} -\def\minus{\ifmmode -\else $-$\fi} - -% @dots{} outputs an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in the cm -% typewriter fonts as three actual period characters; on the other hand, -% in other typewriter fonts three periods are wider than 1.5em. So do -% whichever is larger. -% -\def\dots{% - \leavevmode - \setbox0=\hbox{...}% get width of three periods - \ifdim\wd0 > 1.5em - \dimen0 = \wd0 - \else - \dimen0 = 1.5em - \fi - \hbox to \dimen0{% - \hskip 0pt plus.25fil - .\hskip 0pt plus1fil - .\hskip 0pt plus1fil - .\hskip 0pt plus.5fil - }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% - \dots - \spacefactor=\endofsentencespacefactor -} - -% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. -% -% Since these characters are used in examples, they should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% -\def\point{$\star$} -\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} -\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} -\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% The @error{} command. -% Adapted from the TeXbook's \boxit. -% -\newbox\errorbox -% -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} -% -\setbox\errorbox=\hbox to \dimen0{\hfil - \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. - \advance\hsize by -2\dimen2 % Rules. - \vbox{% - \hrule height\dimen2 - \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. - \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. - \kern3pt\vrule width\dimen2}% Space to right. - \hrule height\dimen2} - \hfil} -% -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @pounds{} is a sterling sign, which Knuth put in the CM italic font. -% -\def\pounds{{\it\$}} - -% @euro{} comes from a separate font, depending on the current style. -% We use the free feym* fonts from the eurosym package by Henrik -% Theiling, which support regular, slanted, bold and bold slanted (and -% "outlined" (blackboard board, sort of) versions, which we don't need). -% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. -% -% Although only regular is the truly official Euro symbol, we ignore -% that. The Euro is designed to be slightly taller than the regular -% font height. -% -% feymr - regular -% feymo - slanted -% feybr - bold -% feybo - bold slanted -% -% There is no good (free) typewriter version, to my knowledge. -% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. -% Hmm. -% -% Also doesn't work in math. Do we need to do math with euro symbols? -% Hope not. -% -% -\def\euro{{\eurofont e}} -\def\eurofont{% - % We set the font at each command, rather than predefining it in - % \textfonts and the other font-switching commands, so that - % installations which never need the symbol don't have to have the - % font installed. - % - % There is only one designed size (nominal 10pt), so we always scale - % that to the current nominal size. - % - % By the way, simply using "at 1em" works for cmr10 and the like, but - % does not work for cmbx10 and other extended/shrunken fonts. - % - \def\eurosize{\csname\curfontsize nominalsize\endcsname}% - % - \ifx\curfontstyle\bfstylename - % bold: - \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize - \else - % regular: - \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize - \fi - \thiseurofont -} - -% Glyphs from the EC fonts. We don't use \let for the aliases, because -% sometimes we redefine the original macro, and the alias should reflect -% the redefinition. -% -% Use LaTeX names for the Icelandic letters. -\def\DH{{\ecfont \char"D0}} % Eth -\def\dh{{\ecfont \char"F0}} % eth -\def\TH{{\ecfont \char"DE}} % Thorn -\def\th{{\ecfont \char"FE}} % thorn -% -\def\guillemetleft{{\ecfont \char"13}} -\def\guillemotleft{\guillemetleft} -\def\guillemetright{{\ecfont \char"14}} -\def\guillemotright{\guillemetright} -\def\guilsinglleft{{\ecfont \char"0E}} -\def\guilsinglright{{\ecfont \char"0F}} -\def\quotedblbase{{\ecfont \char"12}} -\def\quotesinglbase{{\ecfont \char"0D}} -% -% This positioning is not perfect (see the ogonek LaTeX package), but -% we have the precomposed glyphs for the most common cases. We put the -% tests to use those glyphs in the single \ogonek macro so we have fewer -% dummy definitions to worry about for index entries, etc. -% -% ogonek is also used with other letters in Lithuanian (IOU), but using -% the precomposed glyphs for those is not so easy since they aren't in -% the same EC font. -\def\ogonek#1{{% - \def\temp{#1}% - \ifx\temp\macrocharA\Aogonek - \else\ifx\temp\macrochara\aogonek - \else\ifx\temp\macrocharE\Eogonek - \else\ifx\temp\macrochare\eogonek - \else - \ecfont \setbox0=\hbox{#1}% - \ifdim\ht0=1ex\accent"0C #1% - \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% - \fi - \fi\fi\fi\fi - }% -} -\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} -\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} -\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} -\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} -% -% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. -\def\ecfont{% - % We can't distinguish serif/sans and italic/slanted, but this - % is used for crude hacks anyway (like adding French and German - % quotes to documents typeset with CM, where we lose kerning), so - % hopefully nobody will notice/care. - \edef\ecsize{\csname\curfontsize ecsize\endcsname}% - \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% - \ifmonospace - % typewriter: - \font\thisecfont = ectt\ecsize \space at \nominalsize - \else - \ifx\curfontstyle\bfstylename - % bold: - \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize - \else - % regular: - \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize - \fi - \fi - \thisecfont -} - -% @registeredsymbol - R in a circle. The font for the R should really -% be smaller yet, but lllsize is the best we can do for now. -% Adapted from the plain.tex definition of \copyright. -% -\def\registeredsymbol{% - $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% - \hfil\crcr\Orb}}% - }$% -} - -% @textdegree - the normal degrees sign. -% -\def\textdegree{$^\circ$} - -% Laurent Siebenmann reports \Orb undefined with: -% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 -% so we'll define it if necessary. -% -\ifx\Orb\thisisundefined -\def\Orb{\mathhexbox20D} -\fi - -% Quotes. -\chardef\quotedblleft="5C -\chardef\quotedblright=`\" -\chardef\quoteleft=`\` -\chardef\quoteright=`\' - - -\message{page headings,} - -\newskip\titlepagetopglue \titlepagetopglue = 1.5in -\newskip\titlepagebottomglue \titlepagebottomglue = 2pc - -% First the title page. Must do @settitle before @titlepage. -\newif\ifseenauthor -\newif\iffinishedtitlepage - -% Do an implicit @contents or @shortcontents after @end titlepage if the -% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. -% -\newif\ifsetcontentsaftertitlepage - \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue -\newif\ifsetshortcontentsaftertitlepage - \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue - -\parseargdef\shorttitlepage{% - \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} - -\envdef\titlepage{% - % Open one extra group, as we want to close it in the middle of \Etitlepage. - \begingroup - \parindent=0pt \textfonts - % Leave some space at the very top of the page. - \vglue\titlepagetopglue - % No rule at page bottom unless we print one at the top with @title. - \finishedtitlepagetrue - % - % Most title ``pages'' are actually two pages long, with space - % at the top of the second. We don't want the ragged left on the second. - \let\oldpage = \page - \def\page{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - \let\page = \oldpage - \page - \null - }% -} - -\def\Etitlepage{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - % It is important to do the page break before ending the group, - % because the headline and footline are only empty inside the group. - % If we use the new definition of \page, we always get a blank page - % after the title page, which we certainly don't want. - \oldpage - \endgroup - % - % Need this before the \...aftertitlepage checks so that if they are - % in effect the toc pages will come out with page numbers. - \HEADINGSon - % - % If they want short, they certainly want long too. - \ifsetshortcontentsaftertitlepage - \shortcontents - \contents - \global\let\shortcontents = \relax - \global\let\contents = \relax - \fi - % - \ifsetcontentsaftertitlepage - \contents - \global\let\contents = \relax - \global\let\shortcontents = \relax - \fi -} - -\def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue -} - -% Settings used for typesetting titles: no hyphenation, no indentation, -% don't worry much about spacing, ragged right. This should be used -% inside a \vbox, and fonts need to be set appropriately first. Because -% it is always used for titles, nothing else, we call \rmisbold. \par -% should be specified before the end of the \vbox, since a vbox is a group. -% -\def\raggedtitlesettings{% - \rmisbold - \hyphenpenalty=10000 - \parindent=0pt - \tolerance=5000 - \ptexraggedright -} - -% Macros to be used within @titlepage: - -\let\subtitlerm=\tenrm -\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} - -\parseargdef\title{% - \checkenv\titlepage - \vbox{\titlefonts \raggedtitlesettings #1\par}% - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt width \hsize \vskip4pt -} - -\parseargdef\subtitle{% - \checkenv\titlepage - {\subtitlefont \rightline{#1}}% -} - -% @author should come last, but may come many times. -% It can also be used inside @quotation. -% -\parseargdef\author{% - \def\temp{\quotation}% - \ifx\thisenv\temp - \def\quotationauthor{#1}% printed in \Equotation. - \else - \checkenv\titlepage - \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi - {\secfonts\rmisbold \leftline{#1}}% - \fi -} - - -% Set up page headings and footings. - -\let\thispage=\folio - -\newtoks\evenheadline % headline on even pages -\newtoks\oddheadline % headline on odd pages -\newtoks\evenfootline % footline on even pages -\newtoks\oddfootline % footline on odd pages - -% Now make TeX use those variables -\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline - \else \the\evenheadline \fi}} -\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline - \else \the\evenfootline \fi}\HEADINGShook} -\let\HEADINGShook=\relax - -% Commands to set those variables. -% For example, this is what @headings on does -% @evenheading @thistitle|@thispage|@thischapter -% @oddheading @thischapter|@thispage|@thistitle -% @evenfooting @thisfile|| -% @oddfooting ||@thisfile - - -\def\evenheading{\parsearg\evenheadingxxx} -\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} -\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\def\oddheading{\parsearg\oddheadingxxx} -\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} -\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% - -\def\evenfooting{\parsearg\evenfootingxxx} -\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} -\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\def\oddfooting{\parsearg\oddfootingxxx} -\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} -\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% - \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% - % - % Leave some space for the footline. Hopefully ok to assume - % @evenfooting will not be used by itself. - \global\advance\pageheight by -12pt - \global\advance\vsize by -12pt -} - -\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} - -% @evenheadingmarks top \thischapter <- chapter at the top of a page -% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page -% -% The same set of arguments for: -% -% @oddheadingmarks -% @evenfootingmarks -% @oddfootingmarks -% @everyheadingmarks -% @everyfootingmarks - -\def\evenheadingmarks{\headingmarks{even}{heading}} -\def\oddheadingmarks{\headingmarks{odd}{heading}} -\def\evenfootingmarks{\headingmarks{even}{footing}} -\def\oddfootingmarks{\headingmarks{odd}{footing}} -\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} - \headingmarks{odd}{heading}{#1} } -\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} - \headingmarks{odd}{footing}{#1} } -% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. -\def\headingmarks#1#2#3 {% - \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname - \global\expandafter\let\csname get#1#2marks\endcsname \temp -} - -\everyheadingmarks bottom -\everyfootingmarks bottom - -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. -% @headings singleafter turns on single-sided headings after this page. -% By default, they are off at the start of a document, -% and turned `on' after @end titlepage. - -\def\headings #1 {\csname HEADINGS#1\endcsname} - -\def\headingsoff{% non-global headings elimination - \evenheadline={\hfil}\evenfootline={\hfil}% - \oddheadline={\hfil}\oddfootline={\hfil}% -} - -\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting -\HEADINGSoff % it's the default - -% When we turn headings on, set the page number to 1. -% For double-sided printing, put current file name in lower left corner, -% chapter name on inside top of right hand pages, document -% title on inside top of left hand pages, and page numbers on outside top -% edge of all pages. -\def\HEADINGSdouble{% -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} -\let\contentsalignmacro = \chappager - -% For single-sided printing, chapter title goes across top left of page, -% page number on top right. -\def\HEADINGSsingle{% -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} -\def\HEADINGSon{\HEADINGSdouble} - -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} -\let\HEADINGSdoubleafter=\HEADINGSafter -\def\HEADINGSdoublex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} - -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} -\def\HEADINGSsinglex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} - -% Subroutines used in generating headings -% This produces Day Month Year style of output. -% Only define if not already defined, in case a txi-??.tex file has set -% up a different format (e.g., txi-cs.tex does this). -\ifx\today\thisisundefined -\def\today{% - \number\day\space - \ifcase\month - \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr - \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug - \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec - \fi - \space\number\year} -\fi - -% @settitle line... specifies the title of the document, for headings. -% It generates no output of its own. -\def\thistitle{\putwordNoTitle} -\def\settitle{\parsearg{\gdef\thistitle}} - - -\message{tables,} -% Tables -- @table, @ftable, @vtable, @item(x). - -% default indentation of table text -\newdimen\tableindent \tableindent=.8in -% default indentation of @itemize and @enumerate text -\newdimen\itemindent \itemindent=.3in -% margin between end of table item and start of table text. -\newdimen\itemmargin \itemmargin=.1in - -% used internally for \itemindent minus \itemmargin -\newdimen\itemmax - -% Note @table, @ftable, and @vtable define @item, @itemx, etc., with -% these defs. -% They also define \itemindex -% to index the item name in whatever manner is desired (perhaps none). - -\newif\ifitemxneedsnegativevskip - -\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} - -\def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\itemxpar \parsearg\itemzzz} - -\def\itemzzz #1{\begingroup % - \advance\hsize by -\rightskip - \advance\hsize by -\tableindent - \setbox0=\hbox{\itemindicate{#1}}% - \itemindex{#1}% - \nobreak % This prevents a break before @itemx. - % - % If the item text does not fit in the space we have, put it on a line - % by itself, and do not allow a page break either before or after that - % line. We do not start a paragraph here because then if the next - % command is, e.g., @kindex, the whatsit would get put into the - % horizontal list on a line by itself, resulting in extra blank space. - \ifdim \wd0>\itemmax - % - % Make this a paragraph so we get the \parskip glue and wrapping, - % but leave it ragged-right. - \begingroup - \advance\leftskip by-\tableindent - \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil\relax - \leavevmode\unhbox0\par - \endgroup - % - % We're going to be starting a paragraph, but we don't want the - % \parskip glue -- logically it's part of the @item we just started. - \nobreak \vskip-\parskip - % - % Stop a page break at the \parskip glue coming up. However, if - % what follows is an environment such as @example, there will be no - % \parskip glue; then the negative vskip we just inserted would - % cause the example and the item to crash together. So we use this - % bizarre value of 10001 as a signal to \aboveenvbreak to insert - % \parskip glue after all. Section titles are handled this way also. - % - \penalty 10001 - \endgroup - \itemxneedsnegativevskipfalse - \else - % The item text fits into the space. Start a paragraph, so that the - % following text (if any) will end up on the same line. - \noindent - % Do this with kerns and \unhbox so that if there is a footnote in - % the item text, it can migrate to the main vertical list and - % eventually be printed. - \nobreak\kern-\tableindent - \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 - \unhbox0 - \nobreak\kern\dimen0 - \endgroup - \itemxneedsnegativevskiptrue - \fi -} - -\def\item{\errmessage{@item while not in a list environment}} -\def\itemx{\errmessage{@itemx while not in a list environment}} - -% @table, @ftable, @vtable. -\envdef\table{% - \let\itemindex\gobble - \tablecheck{table}% -} -\envdef\ftable{% - \def\itemindex ##1{\doind {fn}{\code{##1}}}% - \tablecheck{ftable}% -} -\envdef\vtable{% - \def\itemindex ##1{\doind {vr}{\code{##1}}}% - \tablecheck{vtable}% -} -\def\tablecheck#1{% - \ifnum \the\catcode`\^^M=\active - \endgroup - \errmessage{This command won't work in this context; perhaps the problem is - that we are \inenvironment\thisenv}% - \def\next{\doignore{#1}}% - \else - \let\next\tablex - \fi - \next -} -\def\tablex#1{% - \def\itemindicate{#1}% - \parsearg\tabley -} -\def\tabley#1{% - {% - \makevalueexpandable - \edef\temp{\noexpand\tablez #1\space\space\space}% - \expandafter - }\temp \endtablez -} -\def\tablez #1 #2 #3 #4\endtablez{% - \aboveenvbreak - \ifnum 0#1>0 \advance \leftskip by #1\mil \fi - \ifnum 0#2>0 \tableindent=#2\mil \fi - \ifnum 0#3>0 \advance \rightskip by #3\mil \fi - \itemmax=\tableindent - \advance \itemmax by -\itemmargin - \advance \leftskip by \tableindent - \exdentamount=\tableindent - \parindent = 0pt - \parskip = \smallskipamount - \ifdim \parskip=0pt \parskip=2pt \fi - \let\item = \internalBitem - \let\itemx = \internalBitemx -} -\def\Etable{\endgraf\afterenvbreak} -\let\Eftable\Etable -\let\Evtable\Etable -\let\Eitemize\Etable -\let\Eenumerate\Etable - -% This is the counter used by @enumerate, which is really @itemize - -\newcount \itemno - -\envdef\itemize{\parsearg\doitemize} - -\def\doitemize#1{% - \aboveenvbreak - \itemmax=\itemindent - \advance\itemmax by -\itemmargin - \advance\leftskip by \itemindent - \exdentamount=\itemindent - \parindent=0pt - \parskip=\smallskipamount - \ifdim\parskip=0pt \parskip=2pt \fi - % - % Try typesetting the item mark that if the document erroneously says - % something like @itemize @samp (intending @table), there's an error - % right away at the @itemize. It's not the best error message in the - % world, but it's better than leaving it to the @item. This means if - % the user wants an empty mark, they have to say @w{} not just @w. - \def\itemcontents{#1}% - \setbox0 = \hbox{\itemcontents}% - % - % @itemize with no arg is equivalent to @itemize @bullet. - \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi - % - \let\item=\itemizeitem -} - -% Definition of @item while inside @itemize and @enumerate. -% -\def\itemizeitem{% - \advance\itemno by 1 % for enumerations - {\let\par=\endgraf \smallbreak}% reasonable place to break - {% - % If the document has an @itemize directly after a section title, a - % \nobreak will be last on the list, and \sectionheading will have - % done a \vskip-\parskip. In that case, we don't want to zero - % parskip, or the item text will crash with the heading. On the - % other hand, when there is normal text preceding the item (as there - % usually is), we do want to zero parskip, or there would be too much - % space. In that case, we won't have a \nobreak before. At least - % that's the theory. - \ifnum\lastpenalty<10000 \parskip=0in \fi - \noindent - \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% - % - \vadjust{\penalty 1200}}% not good to break after first line of item. - \flushcr -} - -% \splitoff TOKENS\endmark defines \first to be the first token in -% TOKENS, and \rest to be the remainder. -% -\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% - -% Allow an optional argument of an uppercase letter, lowercase letter, -% or number, to specify the first label in the enumerated list. No -% argument is the same as `1'. -% -\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} -\def\enumeratey #1 #2\endenumeratey{% - % If we were given no argument, pretend we were given `1'. - \def\thearg{#1}% - \ifx\thearg\empty \def\thearg{1}\fi - % - % Detect if the argument is a single token. If so, it might be a - % letter. Otherwise, the only valid thing it can be is a number. - % (We will always have one token, because of the test we just made. - % This is a good thing, since \splitoff doesn't work given nothing at - % all -- the first parameter is undelimited.) - \expandafter\splitoff\thearg\endmark - \ifx\rest\empty - % Only one token in the argument. It could still be anything. - % A ``lowercase letter'' is one whose \lccode is nonzero. - % An ``uppercase letter'' is one whose \lccode is both nonzero, and - % not equal to itself. - % Otherwise, we assume it's a number. - % - % We need the \relax at the end of the \ifnum lines to stop TeX from - % continuing to look for a . - % - \ifnum\lccode\expandafter`\thearg=0\relax - \numericenumerate % a number (we hope) - \else - % It's a letter. - \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax - \lowercaseenumerate % lowercase letter - \else - \uppercaseenumerate % uppercase letter - \fi - \fi - \else - % Multiple tokens in the argument. We hope it's a number. - \numericenumerate - \fi -} - -% An @enumerate whose labels are integers. The starting integer is -% given in \thearg. -% -\def\numericenumerate{% - \itemno = \thearg - \startenumeration{\the\itemno}% -} - -% The starting (lowercase) letter is in \thearg. -\def\lowercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more lowercase letters in @enumerate; get a bigger - alphabet}% - \fi - \char\lccode\itemno - }% -} - -% The starting (uppercase) letter is in \thearg. -\def\uppercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more uppercase letters in @enumerate; get a bigger - alphabet} - \fi - \char\uccode\itemno - }% -} - -% Call \doitemize, adding a period to the first argument and supplying the -% common last two arguments. Also subtract one from the initial value in -% \itemno, since @item increments \itemno. -% -\def\startenumeration#1{% - \advance\itemno by -1 - \doitemize{#1.}\flushcr -} - -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - - -% @multitable macros -% Amy Hendrickson, 8/18/94, 3/6/96 -% -% @multitable ... @end multitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @columnfractions .25 .3 .45 -% @item ... -% -% Numbers following @columnfractions are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab do not need to be on their own lines, but it will not hurt -% if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @end multitable - -% Default dimensions may be reset by user. -% @multitableparskip is vertical space between paragraphs in table. -% @multitableparindent is paragraph indent in table. -% @multitablecolmargin is horizontal space to be left between columns. -% @multitablelinespace is space to leave between table items, baseline -% to baseline. -% 0pt means it depends on current normal line spacing. -% -\newskip\multitableparskip -\newskip\multitableparindent -\newdimen\multitablecolspace -\newskip\multitablelinespace -\multitableparskip=0pt -\multitableparindent=6pt -\multitablecolspace=12pt -\multitablelinespace=0pt - -% Macros used to set up halign preamble: -% -\let\endsetuptable\relax -\def\xendsetuptable{\endsetuptable} -\let\columnfractions\relax -\def\xcolumnfractions{\columnfractions} -\newif\ifsetpercent - -% #1 is the @columnfraction, usually a decimal number like .5, but might -% be just 1. We just use it, whatever it is. -% -\def\pickupwholefraction#1 {% - \global\advance\colcount by 1 - \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% - \setuptable -} - -\newcount\colcount -\def\setuptable#1{% - \def\firstarg{#1}% - \ifx\firstarg\xendsetuptable - \let\go = \relax - \else - \ifx\firstarg\xcolumnfractions - \global\setpercenttrue - \else - \ifsetpercent - \let\go\pickupwholefraction - \else - \global\advance\colcount by 1 - \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a - % separator; typically that is always in the input, anyway. - \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% - \fi - \fi - \ifx\go\pickupwholefraction - % Put the argument back for the \pickupwholefraction call, so - % we'll always have a period there to be parsed. - \def\go{\pickupwholefraction#1}% - \else - \let\go = \setuptable - \fi% - \fi - \go -} - -% multitable-only commands. -% -% @headitem starts a heading row, which we typeset in bold. -% Assignments have to be global since we are inside the implicit group -% of an alignment entry. \everycr resets \everytab so we don't have to -% undo it ourselves. -\def\headitemfont{\b}% for people to use in the template row; not changeable -\def\headitem{% - \checkenv\multitable - \crcr - \global\everytab={\bf}% can't use \headitemfont since the parsing differs - \the\everytab % for the first item -}% -% -% A \tab used to include \hskip1sp. But then the space in a template -% line is not enough. That is bad. So let's go back to just `&' until -% we again encounter the problem the 1sp was intended to solve. -% --karl, nathan@acm.org, 20apr99. -\def\tab{\checkenv\multitable &\the\everytab}% - -% @multitable ... @end multitable definitions: -% -\newtoks\everytab % insert after every tab. -% -\envdef\multitable{% - \vskip\parskip - \startsavinginserts - % - % @item within a multitable starts a normal row. - % We use \def instead of \let so that if one of the multitable entries - % contains an @itemize, we don't choke on the \item (seen as \crcr aka - % \endtemplate) expanding \doitemize. - \def\item{\crcr}% - % - \tolerance=9500 - \hbadness=9500 - \setmultitablespacing - \parskip=\multitableparskip - \parindent=\multitableparindent - \overfullrule=0pt - \global\colcount=0 - % - \everycr = {% - \noalign{% - \global\everytab={}% - \global\colcount=0 % Reset the column counter. - % Check for saved footnotes, etc. - \checkinserts - % Keeps underfull box messages off when table breaks over pages. - %\filbreak - % Maybe so, but it also creates really weird page breaks when the - % table breaks over pages. Wouldn't \vfil be better? Wait until the - % problem manifests itself, so it can be fixed for real --karl. - }% - }% - % - \parsearg\domultitable -} -\def\domultitable#1{% - % To parse everything between @multitable and @item: - \setuptable#1 \endsetuptable - % - % This preamble sets up a generic column definition, which will - % be used as many times as user calls for columns. - % \vtop will set a single line and will also let text wrap and - % continue for many paragraphs if desired. - \halign\bgroup &% - \global\advance\colcount by 1 - \multistrut - \vtop{% - % Use the current \colcount to find the correct column width: - \hsize=\expandafter\csname col\the\colcount\endcsname - % - % In order to keep entries from bumping into each other - % we will add a \leftskip of \multitablecolspace to all columns after - % the first one. - % - % If a template has been used, we will add \multitablecolspace - % to the width of each template entry. - % - % If the user has set preamble in terms of percent of \hsize we will - % use that dimension as the width of the column, and the \leftskip - % will keep entries from bumping into each other. Table will start at - % left margin and final column will justify at right margin. - % - % Make sure we don't inherit \rightskip from the outer environment. - \rightskip=0pt - \ifnum\colcount=1 - % The first column will be indented with the surrounding text. - \advance\hsize by\leftskip - \else - \ifsetpercent \else - % If user has not set preamble in terms of percent of \hsize - % we will advance \hsize by \multitablecolspace. - \advance\hsize by \multitablecolspace - \fi - % In either case we will make \leftskip=\multitablecolspace: - \leftskip=\multitablecolspace - \fi - % Ignoring space at the beginning and end avoids an occasional spurious - % blank line, when TeX decides to break the line at the space before the - % box from the multistrut, so the strut ends up on a line by itself. - % For example: - % @multitable @columnfractions .11 .89 - % @item @code{#} - % @tab Legal holiday which is valid in major parts of the whole country. - % Is automatically provided with highlighting sequences respectively - % marking characters. - \noindent\ignorespaces##\unskip\multistrut - }\cr -} -\def\Emultitable{% - \crcr - \egroup % end the \halign - \global\setpercentfalse -} - -\def\setmultitablespacing{% - \def\multistrut{\strut}% just use the standard line spacing - % - % Compute \multitablelinespace (if not defined by user) for use in - % \multitableparskip calculation. We used define \multistrut based on - % this, but (ironically) that caused the spacing to be off. - % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. -\ifdim\multitablelinespace=0pt -\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip -\global\advance\multitablelinespace by-\ht0 -\fi -% Test to see if parskip is larger than space between lines of -% table. If not, do nothing. -% If so, set to same dimension as multitablelinespace. -\ifdim\multitableparskip>\multitablelinespace -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller - % than skip between lines in the table. -\fi% -\ifdim\multitableparskip=0pt -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller - % than skip between lines in the table. -\fi} - - -\message{conditionals,} - -% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, -% @ifnotxml always succeed. They currently do nothing; we don't -% attempt to check whether the conditionals are properly nested. But we -% have to remember that they are conditionals, so that @end doesn't -% attempt to close an environment group. -% -\def\makecond#1{% - \expandafter\let\csname #1\endcsname = \relax - \expandafter\let\csname iscond.#1\endcsname = 1 -} -\makecond{iftex} -\makecond{ifnotdocbook} -\makecond{ifnothtml} -\makecond{ifnotinfo} -\makecond{ifnotplaintext} -\makecond{ifnotxml} - -% Ignore @ignore, @ifhtml, @ifinfo, and the like. -% -\def\direntry{\doignore{direntry}} -\def\documentdescription{\doignore{documentdescription}} -\def\docbook{\doignore{docbook}} -\def\html{\doignore{html}} -\def\ifdocbook{\doignore{ifdocbook}} -\def\ifhtml{\doignore{ifhtml}} -\def\ifinfo{\doignore{ifinfo}} -\def\ifnottex{\doignore{ifnottex}} -\def\ifplaintext{\doignore{ifplaintext}} -\def\ifxml{\doignore{ifxml}} -\def\ignore{\doignore{ignore}} -\def\menu{\doignore{menu}} -\def\xml{\doignore{xml}} - -% Ignore text until a line `@end #1', keeping track of nested conditionals. -% -% A count to remember the depth of nesting. -\newcount\doignorecount - -\def\doignore#1{\begingroup - % Scan in ``verbatim'' mode: - \obeylines - \catcode`\@ = \other - \catcode`\{ = \other - \catcode`\} = \other - % - % Make sure that spaces turn into tokens that match what \doignoretext wants. - \spaceisspace - % - % Count number of #1's that we've seen. - \doignorecount = 0 - % - % Swallow text until we reach the matching `@end #1'. - \dodoignore{#1}% -} - -{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. - \obeylines % - % - \gdef\dodoignore#1{% - % #1 contains the command name as a string, e.g., `ifinfo'. - % - % Define a command to find the next `@end #1'. - \long\def\doignoretext##1^^M@end #1{% - \doignoretextyyy##1^^M@#1\_STOP_}% - % - % And this command to find another #1 command, at the beginning of a - % line. (Otherwise, we would consider a line `@c @ifset', for - % example, to count as an @ifset for nesting.) - \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% - % - % And now expand that command. - \doignoretext ^^M% - }% -} - -\def\doignoreyyy#1{% - \def\temp{#1}% - \ifx\temp\empty % Nothing found. - \let\next\doignoretextzzz - \else % Found a nested condition, ... - \advance\doignorecount by 1 - \let\next\doignoretextyyy % ..., look for another. - % If we're here, #1 ends with ^^M\ifinfo (for example). - \fi - \next #1% the token \_STOP_ is present just after this macro. -} - -% We have to swallow the remaining "\_STOP_". -% -\def\doignoretextzzz#1{% - \ifnum\doignorecount = 0 % We have just found the outermost @end. - \let\next\enddoignore - \else % Still inside a nested condition. - \advance\doignorecount by -1 - \let\next\doignoretext % Look for the next @end. - \fi - \next -} - -% Finish off ignored text. -{ \obeylines% - % Ignore anything after the last `@end #1'; this matters in verbatim - % environments, where otherwise the newline after an ignored conditional - % would result in a blank line in the output. - \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% -} - - -% @set VAR sets the variable VAR to an empty value. -% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. -% -% Since we want to separate VAR from REST-OF-LINE (which might be -% empty), we can't just use \parsearg; we have to insert a space of our -% own to delimit the rest of the line, and then take it out again if we -% didn't need it. -% We rely on the fact that \parsearg sets \catcode`\ =10. -% -\parseargdef\set{\setyyy#1 \endsetyyy} -\def\setyyy#1 #2\endsetyyy{% - {% - \makevalueexpandable - \def\temp{#2}% - \edef\next{\gdef\makecsname{SET#1}}% - \ifx\temp\empty - \next{}% - \else - \setzzz#2\endsetzzz - \fi - }% -} -% Remove the trailing space \setxxx inserted. -\def\setzzz#1 \endsetzzz{\next{#1}} - -% @clear VAR clears (i.e., unsets) the variable VAR. -% -\parseargdef\clear{% - {% - \makevalueexpandable - \global\expandafter\let\csname SET#1\endcsname=\relax - }% -} - -% @value{foo} gets the text saved in variable foo. -\def\value{\begingroup\makevalueexpandable\valuexxx} -\def\valuexxx#1{\expandablevalue{#1}\endgroup} -{ - \catcode`\- = \active \catcode`\_ = \active - % - \gdef\makevalueexpandable{% - \let\value = \expandablevalue - % We don't want these characters active, ... - \catcode`\-=\other \catcode`\_=\other - % ..., but we might end up with active ones in the argument if - % we're called from @code, as @code{@value{foo-bar_}}, though. - % So \let them to their normal equivalents. - \let-\normaldash \let_\normalunderscore - } -} - -% We have this subroutine so that we can handle at least some @value's -% properly in indexes (we call \makevalueexpandable in \indexdummies). -% The command has to be fully expandable (if the variable is set), since -% the result winds up in the index file. This means that if the -% variable's value contains other Texinfo commands, it's almost certain -% it will fail (although perhaps we could fix that with sufficient work -% to do a one-level expansion on the result, instead of complete). -% -\def\expandablevalue#1{% - \expandafter\ifx\csname SET#1\endcsname\relax - {[No value for ``#1'']}% - \message{Variable `#1', used in @value, is not set.}% - \else - \csname SET#1\endcsname - \fi -} - -% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined -% with @set. -% -% To get special treatment of `@end ifset,' call \makeond and the redefine. -% -\makecond{ifset} -\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} -\def\doifset#1#2{% - {% - \makevalueexpandable - \let\next=\empty - \expandafter\ifx\csname SET#2\endcsname\relax - #1% If not set, redefine \next. - \fi - \expandafter - }\next -} -\def\ifsetfail{\doignore{ifset}} - -% @ifclear VAR ... @end executes the `...' iff VAR has never been -% defined with @set, or has been undefined with @clear. -% -% The `\else' inside the `\doifset' parameter is a trick to reuse the -% above code: if the variable is not set, do nothing, if it is set, -% then redefine \next to \ifclearfail. -% -\makecond{ifclear} -\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} -\def\ifclearfail{\doignore{ifclear}} - -% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written -% without the @) is in fact defined. We can only feasibly check at the -% TeX level, so something like `mathcode' is going to considered -% defined even though it is not a Texinfo command. -% -\makecond{ifcommanddefined} -\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} -% -\def\doifcmddefined#1#2{{% - \makevalueexpandable - \let\next=\empty - \expandafter\ifx\csname #2\endcsname\relax - #1% If not defined, \let\next as above. - \fi - \expandafter - }\next -} -\def\ifcmddefinedfail{\doignore{ifcommanddefined}} - -% @ifcommandnotdefined CMD ... handled similar to @ifclear above. -\makecond{ifcommandnotdefined} -\def\ifcommandnotdefined{% - \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} -\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} - -% Set the `txicommandconditionals' variable, so documents have a way to -% test if the @ifcommand...defined conditionals are available. -\set txicommandconditionals - -% @dircategory CATEGORY -- specify a category of the dir file -% which this file should belong to. Ignore this in TeX. -\let\dircategory=\comment - -% @defininfoenclose. -\let\definfoenclose=\comment - - -\message{indexing,} -% Index generation facilities - -% Define \newwrite to be identical to plain tex's \newwrite -% except not \outer, so it can be used within macros and \if's. -\edef\newwrite{\makecsname{ptexnewwrite}} - -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. -% The name of an index should be no more than 2 characters long -% for the sake of vms. -% -\def\newindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 % Open the file - \fi - \expandafter\xdef\csname#1index\endcsname{% % Define @#1index - \noexpand\doindex{#1}} -} - -% @defindex foo == \newindex{foo} -% -\def\defindex{\parsearg\newindex} - -% Define @defcodeindex, like @defindex except put all entries in @code. -% -\def\defcodeindex{\parsearg\newcodeindex} -% -\def\newcodeindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 - \fi - \expandafter\xdef\csname#1index\endcsname{% - \noexpand\docodeindex{#1}}% -} - - -% @synindex foo bar makes index foo feed into index bar. -% Do this instead of @defindex foo if you don't want it as a separate index. -% -% @syncodeindex foo bar similar, but put all entries made for index foo -% inside @code. -% -\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} -\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} - -% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), -% #3 the target index (bar). -\def\dosynindex#1#2#3{% - % Only do \closeout if we haven't already done it, else we'll end up - % closing the target index. - \expandafter \ifx\csname donesynindex#2\endcsname \relax - % The \closeout helps reduce unnecessary open files; the limit on the - % Acorn RISC OS is a mere 16 files. - \expandafter\closeout\csname#2indfile\endcsname - \expandafter\let\csname donesynindex#2\endcsname = 1 - \fi - % redefine \fooindfile: - \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname - \expandafter\let\csname#2indfile\endcsname=\temp - % redefine \fooindex: - \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% -} - -% Define \doindex, the driver for all \fooindex macros. -% Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. - -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} - -% like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} - -% Take care of Texinfo commands that can appear in an index entry. -% Since there are some commands we want to expand, and others we don't, -% we have to laboriously prevent expansion for those that we don't. -% -\def\indexdummies{% - \escapechar = `\\ % use backslash in output files. - \def\@{@}% change to @@ when we switch to @ as escape char in index files. - \def\ {\realbackslash\space }% - % - % Need these unexpandable (because we define \tt as a dummy) - % definitions when @{ or @} appear in index entry text. Also, more - % complicated, when \tex is in effect and \{ is a \delimiter again. - % We can't use \lbracecmd and \rbracecmd because texindex assumes - % braces and backslashes are used only as delimiters. Perhaps we - % should define @lbrace and @rbrace commands a la @comma. - \def\{{{\tt\char123}}% - \def\}{{\tt\char125}}% - % - % I don't entirely understand this, but when an index entry is - % generated from a macro call, the \endinput which \scanmacro inserts - % causes processing to be prematurely terminated. This is, - % apparently, because \indexsorttmp is fully expanded, and \endinput - % is an expandable command. The redefinition below makes \endinput - % disappear altogether for that purpose -- although logging shows that - % processing continues to some further point. On the other hand, it - % seems \endinput does not hurt in the printed index arg, since that - % is still getting written without apparent harm. - % - % Sample source (mac-idx3.tex, reported by Graham Percival to - % help-texinfo, 22may06): - % @macro funindex {WORD} - % @findex xyz - % @end macro - % ... - % @funindex commtest - % - % The above is not enough to reproduce the bug, but it gives the flavor. - % - % Sample whatsit resulting: - % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} - % - % So: - \let\endinput = \empty - % - % Do the redefinitions. - \commondummies -} - -% For the aux and toc files, @ is the escape character. So we want to -% redefine everything using @ as the escape character (instead of -% \realbackslash, still used for index files). When everything uses @, -% this will be simpler. -% -\def\atdummies{% - \def\@{@@}% - \def\ {@ }% - \let\{ = \lbraceatcmd - \let\} = \rbraceatcmd - % - % Do the redefinitions. - \commondummies - \otherbackslash -} - -% Called from \indexdummies and \atdummies. -% -\def\commondummies{% - % - % \definedummyword defines \#1 as \string\#1\space, thus effectively - % preventing its expansion. This is used only for control words, - % not control letters, because the \space would be incorrect for - % control characters, but is needed to separate the control word - % from whatever follows. - % - % For control letters, we have \definedummyletter, which omits the - % space. - % - % These can be used both for control words that take an argument and - % those that do not. If it is followed by {arg} in the input, then - % that will dutifully get written to the index (or wherever). - % - \def\definedummyword ##1{\def##1{\string##1\space}}% - \def\definedummyletter##1{\def##1{\string##1}}% - \let\definedummyaccent\definedummyletter - % - \commondummiesnofonts - % - \definedummyletter\_% - \definedummyletter\-% - % - % Non-English letters. - \definedummyword\AA - \definedummyword\AE - \definedummyword\DH - \definedummyword\L - \definedummyword\O - \definedummyword\OE - \definedummyword\TH - \definedummyword\aa - \definedummyword\ae - \definedummyword\dh - \definedummyword\exclamdown - \definedummyword\l - \definedummyword\o - \definedummyword\oe - \definedummyword\ordf - \definedummyword\ordm - \definedummyword\questiondown - \definedummyword\ss - \definedummyword\th - % - % Although these internal commands shouldn't show up, sometimes they do. - \definedummyword\bf - \definedummyword\gtr - \definedummyword\hat - \definedummyword\less - \definedummyword\sf - \definedummyword\sl - \definedummyword\tclose - \definedummyword\tt - % - \definedummyword\LaTeX - \definedummyword\TeX - % - % Assorted special characters. - \definedummyword\arrow - \definedummyword\bullet - \definedummyword\comma - \definedummyword\copyright - \definedummyword\registeredsymbol - \definedummyword\dots - \definedummyword\enddots - \definedummyword\entrybreak - \definedummyword\equiv - \definedummyword\error - \definedummyword\euro - \definedummyword\expansion - \definedummyword\geq - \definedummyword\guillemetleft - \definedummyword\guillemetright - \definedummyword\guilsinglleft - \definedummyword\guilsinglright - \definedummyword\lbracechar - \definedummyword\leq - \definedummyword\minus - \definedummyword\ogonek - \definedummyword\pounds - \definedummyword\point - \definedummyword\print - \definedummyword\quotedblbase - \definedummyword\quotedblleft - \definedummyword\quotedblright - \definedummyword\quoteleft - \definedummyword\quoteright - \definedummyword\quotesinglbase - \definedummyword\rbracechar - \definedummyword\result - \definedummyword\textdegree - % - % We want to disable all macros so that they are not expanded by \write. - \macrolist - % - \normalturnoffactive - % - % Handle some cases of @value -- where it does not contain any - % (non-fully-expandable) commands. - \makevalueexpandable -} - -% \commondummiesnofonts: common to \commondummies and \indexnofonts. -% -\def\commondummiesnofonts{% - % Control letters and accents. - \definedummyletter\!% - \definedummyaccent\"% - \definedummyaccent\'% - \definedummyletter\*% - \definedummyaccent\,% - \definedummyletter\.% - \definedummyletter\/% - \definedummyletter\:% - \definedummyaccent\=% - \definedummyletter\?% - \definedummyaccent\^% - \definedummyaccent\`% - \definedummyaccent\~% - \definedummyword\u - \definedummyword\v - \definedummyword\H - \definedummyword\dotaccent - \definedummyword\ogonek - \definedummyword\ringaccent - \definedummyword\tieaccent - \definedummyword\ubaraccent - \definedummyword\udotaccent - \definedummyword\dotless - % - % Texinfo font commands. - \definedummyword\b - \definedummyword\i - \definedummyword\r - \definedummyword\sansserif - \definedummyword\sc - \definedummyword\slanted - \definedummyword\t - % - % Commands that take arguments. - \definedummyword\abbr - \definedummyword\acronym - \definedummyword\anchor - \definedummyword\cite - \definedummyword\code - \definedummyword\command - \definedummyword\dfn - \definedummyword\dmn - \definedummyword\email - \definedummyword\emph - \definedummyword\env - \definedummyword\file - \definedummyword\image - \definedummyword\indicateurl - \definedummyword\inforef - \definedummyword\kbd - \definedummyword\key - \definedummyword\math - \definedummyword\option - \definedummyword\pxref - \definedummyword\ref - \definedummyword\samp - \definedummyword\strong - \definedummyword\tie - \definedummyword\uref - \definedummyword\url - \definedummyword\var - \definedummyword\verb - \definedummyword\w - \definedummyword\xref -} - -% \indexnofonts is used when outputting the strings to sort the index -% by, and when constructing control sequence names. It eliminates all -% control sequences and just writes whatever the best ASCII sort string -% would be for a given command (usually its argument). -% -\def\indexnofonts{% - % Accent commands should become @asis. - \def\definedummyaccent##1{\let##1\asis}% - % We can just ignore other control letters. - \def\definedummyletter##1{\let##1\empty}% - % All control words become @asis by default; overrides below. - \let\definedummyword\definedummyaccent - % - \commondummiesnofonts - % - % Don't no-op \tt, since it isn't a user-level command - % and is used in the definitions of the active chars like <, >, |, etc. - % Likewise with the other plain tex font commands. - %\let\tt=\asis - % - \def\ { }% - \def\@{@}% - \def\_{\normalunderscore}% - \def\-{}% @- shouldn't affect sorting - % - % Unfortunately, texindex is not prepared to handle braces in the - % content at all. So for index sorting, we map @{ and @} to strings - % starting with |, since that ASCII character is between ASCII { and }. - \def\{{|a}% - \def\lbracechar{|a}% - % - \def\}{|b}% - \def\rbracechar{|b}% - % - % Non-English letters. - \def\AA{AA}% - \def\AE{AE}% - \def\DH{DZZ}% - \def\L{L}% - \def\OE{OE}% - \def\O{O}% - \def\TH{ZZZ}% - \def\aa{aa}% - \def\ae{ae}% - \def\dh{dzz}% - \def\exclamdown{!}% - \def\l{l}% - \def\oe{oe}% - \def\ordf{a}% - \def\ordm{o}% - \def\o{o}% - \def\questiondown{?}% - \def\ss{ss}% - \def\th{zzz}% - % - \def\LaTeX{LaTeX}% - \def\TeX{TeX}% - % - % Assorted special characters. - % (The following {} will end up in the sort string, but that's ok.) - \def\arrow{->}% - \def\bullet{bullet}% - \def\comma{,}% - \def\copyright{copyright}% - \def\dots{...}% - \def\enddots{...}% - \def\equiv{==}% - \def\error{error}% - \def\euro{euro}% - \def\expansion{==>}% - \def\geq{>=}% - \def\guillemetleft{<<}% - \def\guillemetright{>>}% - \def\guilsinglleft{<}% - \def\guilsinglright{>}% - \def\leq{<=}% - \def\minus{-}% - \def\point{.}% - \def\pounds{pounds}% - \def\print{-|}% - \def\quotedblbase{"}% - \def\quotedblleft{"}% - \def\quotedblright{"}% - \def\quoteleft{`}% - \def\quoteright{'}% - \def\quotesinglbase{,}% - \def\registeredsymbol{R}% - \def\result{=>}% - \def\textdegree{o}% - % - \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax - \else \indexlquoteignore \fi - % - % We need to get rid of all macros, leaving only the arguments (if present). - % Of course this is not nearly correct, but it is the best we can do for now. - % makeinfo does not expand macros in the argument to @deffn, which ends up - % writing an index entry, and texindex isn't prepared for an index sort entry - % that starts with \. - % - % Since macro invocations are followed by braces, we can just redefine them - % to take a single TeX argument. The case of a macro invocation that - % goes to end-of-line is not handled. - % - \macrolist -} - -% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us -% ignore left quotes in the sort term. -{\catcode`\`=\active - \gdef\indexlquoteignore{\let`=\empty}} - -\let\indexbackslash=0 %overridden during \printindex. -\let\SETmarginindex=\relax % put index entries in margin (undocumented)? - -% Most index entries go through here, but \dosubind is the general case. -% #1 is the index name, #2 is the entry text. -\def\doind#1#2{\dosubind{#1}{#2}{}} - -% Workhorse for all \fooindexes. -% #1 is name of index, #2 is stuff to put there, #3 is subentry -- -% empty if called from \doind, as we usually are (the main exception -% is with most defuns, which call us directly). -% -\def\dosubind#1#2#3{% - \iflinks - {% - % Store the main index entry text (including the third arg). - \toks0 = {#2}% - % If third arg is present, precede it with a space. - \def\thirdarg{#3}% - \ifx\thirdarg\empty \else - \toks0 = \expandafter{\the\toks0 \space #3}% - \fi - % - \edef\writeto{\csname#1indfile\endcsname}% - % - \safewhatsit\dosubindwrite - }% - \fi -} - -% Write the entry in \toks0 to the index file: -% -\def\dosubindwrite{% - % Put the index entry in the margin if desired. - \ifx\SETmarginindex\relax\else - \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% - \fi - % - % Remember, we are within a group. - \indexdummies % Must do this here, since \bf, etc expand at this stage - \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now - % so it will be output as is; and it will print as backslash. - % - % Process the index entry with all font commands turned off, to - % get the string to sort by. - {\indexnofonts - \edef\temp{\the\toks0}% need full expansion - \xdef\indexsorttmp{\temp}% - }% - % - % Set up the complete index entry, with both the sort key and - % the original text, including any font commands. We write - % three arguments to \entry to the .?? file (four in the - % subentry case), texindex reduces to two when writing the .??s - % sorted result. - \edef\temp{% - \write\writeto{% - \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% - }% - \temp -} - -% Take care of unwanted page breaks/skips around a whatsit: -% -% If a skip is the last thing on the list now, preserve it -% by backing up by \lastskip, doing the \write, then inserting -% the skip again. Otherwise, the whatsit generated by the -% \write or \pdfdest will make \lastskip zero. The result is that -% sequences like this: -% @end defun -% @tindex whatever -% @defun ... -% will have extra space inserted, because the \medbreak in the -% start of the @defun won't see the skip inserted by the @end of -% the previous defun. -% -% But don't do any of this if we're not in vertical mode. We -% don't want to do a \vskip and prematurely end a paragraph. -% -% Avoid page breaks due to these extra skips, too. -% -% But wait, there is a catch there: -% We'll have to check whether \lastskip is zero skip. \ifdim is not -% sufficient for this purpose, as it ignores stretch and shrink parts -% of the skip. The only way seems to be to check the textual -% representation of the skip. -% -% The following is almost like \def\zeroskipmacro{0.0pt} except that -% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). -% -\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} -% -\newskip\whatsitskip -\newcount\whatsitpenalty -% -% ..., ready, GO: -% -\def\safewhatsit#1{\ifhmode - #1% - \else - % \lastskip and \lastpenalty cannot both be nonzero simultaneously. - \whatsitskip = \lastskip - \edef\lastskipmacro{\the\lastskip}% - \whatsitpenalty = \lastpenalty - % - % If \lastskip is nonzero, that means the last item was a - % skip. And since a skip is discardable, that means this - % -\whatsitskip glue we're inserting is preceded by a - % non-discardable item, therefore it is not a potential - % breakpoint, therefore no \nobreak needed. - \ifx\lastskipmacro\zeroskipmacro - \else - \vskip-\whatsitskip - \fi - % - #1% - % - \ifx\lastskipmacro\zeroskipmacro - % If \lastskip was zero, perhaps the last item was a penalty, and - % perhaps it was >=10000, e.g., a \nobreak. In that case, we want - % to re-insert the same penalty (values >10000 are used for various - % signals); since we just inserted a non-discardable item, any - % following glue (such as a \parskip) would be a breakpoint. For example: - % @deffn deffn-whatever - % @vindex index-whatever - % Description. - % would allow a break between the index-whatever whatsit - % and the "Description." paragraph. - \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi - \else - % On the other hand, if we had a nonzero \lastskip, - % this make-up glue would be preceded by a non-discardable item - % (the whatsit from the \write), so we must insert a \nobreak. - \nobreak\vskip\whatsitskip - \fi -\fi} - -% The index entry written in the file actually looks like -% \entry {sortstring}{page}{topic} -% or -% \entry {sortstring}{page}{topic}{subtopic} -% The texindex program reads in these files and writes files -% containing these kinds of lines: -% \initial {c} -% before the first topic whose initial is c -% \entry {topic}{pagelist} -% for a topic that is used without subtopics -% \primary {topic} -% for the beginning of a topic that is used with subtopics -% \secondary {subtopic}{pagelist} -% for each subtopic. - -% Define the user-accessible indexing commands -% @findex, @vindex, @kindex, @cindex. - -\def\findex {\fnindex} -\def\kindex {\kyindex} -\def\cindex {\cpindex} -\def\vindex {\vrindex} -\def\tindex {\tpindex} -\def\pindex {\pgindex} - -\def\cindexsub {\begingroup\obeylines\cindexsub} -{\obeylines % -\gdef\cindexsub "#1" #2^^M{\endgroup % -\dosubind{cp}{#2}{#1}}} - -% Define the macros used in formatting output of the sorted index material. - -% @printindex causes a particular index (the ??s file) to get printed. -% It does not print any chapter heading (usually an @unnumbered). -% -\parseargdef\printindex{\begingroup - \dobreak \chapheadingskip{10000}% - % - \smallfonts \rm - \tolerance = 9500 - \plainfrenchspacing - \everypar = {}% don't want the \kern\-parindent from indentation suppression. - % - % See if the index file exists and is nonempty. - % Change catcode of @ here so that if the index file contains - % \initial {@} - % as its first line, TeX doesn't complain about mismatched braces - % (because it thinks @} is a control sequence). - \catcode`\@ = 11 - \openin 1 \jobname.#1s - \ifeof 1 - % \enddoublecolumns gets confused if there is no text in the index, - % and it loses the chapter title and the aux file entries for the - % index. The easiest way to prevent this problem is to make sure - % there is some text. - \putwordIndexNonexistent - \else - % - % If the index file exists but is empty, then \openin leaves \ifeof - % false. We have to make TeX try to read something from the file, so - % it can discover if there is anything in it. - \read 1 to \temp - \ifeof 1 - \putwordIndexIsEmpty - \else - % Index files are almost Texinfo source, but we use \ as the escape - % character. It would be better to use @, but that's too big a change - % to make right now. - \def\indexbackslash{\backslashcurfont}% - \catcode`\\ = 0 - \escapechar = `\\ - \begindoublecolumns - \input \jobname.#1s - \enddoublecolumns - \fi - \fi - \closein 1 -\endgroup} - -% These macros are used by the sorted index file itself. -% Change them to control the appearance of the index. - -\def\initial#1{{% - % Some minor font changes for the special characters. - \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt - % - % Remove any glue we may have, we'll be inserting our own. - \removelastskip - % - % We like breaks before the index initials, so insert a bonus. - \nobreak - \vskip 0pt plus 3\baselineskip - \penalty 0 - \vskip 0pt plus -3\baselineskip - % - % Typeset the initial. Making this add up to a whole number of - % baselineskips increases the chance of the dots lining up from column - % to column. It still won't often be perfect, because of the stretch - % we need before each entry, but it's better. - % - % No shrink because it confuses \balancecolumns. - \vskip 1.67\baselineskip plus .5\baselineskip - \leftline{\secbf #1}% - % Do our best not to break after the initial. - \nobreak - \vskip .33\baselineskip plus .1\baselineskip -}} - -% \entry typesets a paragraph consisting of the text (#1), dot leaders, and -% then page number (#2) flushed to the right margin. It is used for index -% and table of contents entries. The paragraph is indented by \leftskip. -% -% A straightforward implementation would start like this: -% \def\entry#1#2{... -% But this freezes the catcodes in the argument, and can cause problems to -% @code, which sets - active. This problem was fixed by a kludge--- -% ``-'' was active throughout whole index, but this isn't really right. -% The right solution is to prevent \entry from swallowing the whole text. -% --kasal, 21nov03 -\def\entry{% - \begingroup - % - % Start a new paragraph if necessary, so our assignments below can't - % affect previous text. - \par - % - % Do not fill out the last line with white space. - \parfillskip = 0in - % - % No extra space above this paragraph. - \parskip = 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent = 2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % A bit of stretch before each entry for the benefit of balancing - % columns. - \vskip 0pt plus1pt - % - % When reading the text of entry, convert explicit line breaks - % from @* into spaces. The user might give these in long section - % titles, for instance. - \def\*{\unskip\space\ignorespaces}% - \def\entrybreak{\hfil\break}% - % - % Swallow the left brace of the text (first parameter): - \afterassignment\doentry - \let\temp = -} -\def\entrybreak{\unskip\space\ignorespaces}% -\def\doentry{% - \bgroup % Instead of the swallowed brace. - \noindent - \aftergroup\finishentry - % And now comes the text of the entry. -} -\def\finishentry#1{% - % #1 is the page number. - % - % The following is kludged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \setbox\boxA = \hbox{#1}% - \ifdim\wd\boxA = 0pt - \ % - \else - % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 - \null\nobreak\indexdotfill % Have leaders before the page number. - % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. - \ifpdf - \pdfgettoks#1.% - \ \the\toksA - \else - \ #1% - \fi - \fi - \par - \endgroup -} - -% Like plain.tex's \dotfill, except uses up at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} - -\def\primary #1{\line{#1\hfil}} - -\newskip\secondaryindent \secondaryindent=0.5cm -\def\secondary#1#2{{% - \parfillskip=0in - \parskip=0in - \hangindent=1in - \hangafter=1 - \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill - \ifpdf - \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. - \else - #2 - \fi - \par -}} - -% Define two-column mode, which we use to typeset indexes. -% Adapted from the TeXbook, page 416, which is to say, -% the manmac.tex format used to print the TeXbook itself. -\catcode`\@=11 - -\newbox\partialpage -\newdimen\doublecolumnhsize - -\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns - % Grab any single-column material above us. - \output = {% - % - % Here is a possibility not foreseen in manmac: if we accumulate a - % whole lot of material, we might end up calling this \output - % routine twice in a row (see the doublecol-lose test, which is - % essentially a couple of indexes with @setchapternewpage off). In - % that case we just ship out what is in \partialpage with the normal - % output routine. Generally, \partialpage will be empty when this - % runs and this will be a no-op. See the indexspread.tex test case. - \ifvoid\partialpage \else - \onepageout{\pagecontents\partialpage}% - \fi - % - \global\setbox\partialpage = \vbox{% - % Unvbox the main output page. - \unvbox\PAGE - \kern-\topskip \kern\baselineskip - }% - }% - \eject % run that output routine to set \partialpage - % - % Use the double-column output routine for subsequent pages. - \output = {\doublecolumnout}% - % - % Change the page size parameters. We could do this once outside this - % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 - % format, but then we repeat the same computation. Repeating a couple - % of assignments once per index is clearly meaningless for the - % execution time, so we may as well do it in one place. - % - % First we halve the line length, less a little for the gutter between - % the columns. We compute the gutter based on the line length, so it - % changes automatically with the paper format. The magic constant - % below is chosen so that the gutter has the same value (well, +-<1pt) - % as it did when we hard-coded it. - % - % We put the result in a separate register, \doublecolumhsize, so we - % can restore it in \pagesofar, after \hsize itself has (potentially) - % been clobbered. - % - \doublecolumnhsize = \hsize - \advance\doublecolumnhsize by -.04154\hsize - \divide\doublecolumnhsize by 2 - \hsize = \doublecolumnhsize - % - % Double the \vsize as well. (We don't need a separate register here, - % since nobody clobbers \vsize.) - \vsize = 2\vsize -} - -% The double-column output routine for all double-column pages except -% the last. -% -\def\doublecolumnout{% - \splittopskip=\topskip \splitmaxdepth=\maxdepth - % Get the available space for the double columns -- the normal - % (undoubled) page height minus any material left over from the - % previous page. - \dimen@ = \vsize - \divide\dimen@ by 2 - \advance\dimen@ by -\ht\partialpage - % - % box0 will be the left-hand column, box2 the right. - \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ - \onepageout\pagesofar - \unvbox255 - \penalty\outputpenalty -} -% -% Re-output the contents of the output page -- any previous material, -% followed by the two boxes we just split, in box0 and box2. -\def\pagesofar{% - \unvbox\partialpage - % - \hsize = \doublecolumnhsize - \wd0=\hsize \wd2=\hsize - \hbox to\pagewidth{\box0\hfil\box2}% -} -% -% All done with double columns. -\def\enddoublecolumns{% - % The following penalty ensures that the page builder is exercised - % _before_ we change the output routine. This is necessary in the - % following situation: - % - % The last section of the index consists only of a single entry. - % Before this section, \pagetotal is less than \pagegoal, so no - % break occurs before the last section starts. However, the last - % section, consisting of \initial and the single \entry, does not - % fit on the page and has to be broken off. Without the following - % penalty the page builder will not be exercised until \eject - % below, and by that time we'll already have changed the output - % routine to the \balancecolumns version, so the next-to-last - % double-column page will be processed with \balancecolumns, which - % is wrong: The two columns will go to the main vertical list, with - % the broken-off section in the recent contributions. As soon as - % the output routine finishes, TeX starts reconsidering the page - % break. The two columns and the broken-off section both fit on the - % page, because the two columns now take up only half of the page - % goal. When TeX sees \eject from below which follows the final - % section, it invokes the new output routine that we've set after - % \balancecolumns below; \onepageout will try to fit the two columns - % and the final section into the vbox of \pageheight (see - % \pagebody), causing an overfull box. - % - % Note that glue won't work here, because glue does not exercise the - % page builder, unlike penalties (see The TeXbook, pp. 280-281). - \penalty0 - % - \output = {% - % Split the last of the double-column material. Leave it on the - % current page, no automatic page break. - \balancecolumns - % - % If we end up splitting too much material for the current page, - % though, there will be another page break right after this \output - % invocation ends. Having called \balancecolumns once, we do not - % want to call it again. Therefore, reset \output to its normal - % definition right away. (We hope \balancecolumns will never be - % called on to balance too much material, but if it is, this makes - % the output somewhat more palatable.) - \global\output = {\onepageout{\pagecontents\PAGE}}% - }% - \eject - \endgroup % started in \begindoublecolumns - % - % \pagegoal was set to the doubled \vsize above, since we restarted - % the current page. We're now back to normal single-column - % typesetting, so reset \pagegoal to the normal \vsize (after the - % \endgroup where \vsize got restored). - \pagegoal = \vsize -} -% -% Called at the end of the double column material. -\def\balancecolumns{% - \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. - \dimen@ = \ht0 - \advance\dimen@ by \topskip - \advance\dimen@ by-\baselineskip - \divide\dimen@ by 2 % target to split to - %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% - \splittopskip = \topskip - % Loop until we get a decent breakpoint. - {% - \vbadness = 10000 - \loop - \global\setbox3 = \copy0 - \global\setbox1 = \vsplit3 to \dimen@ - \ifdim\ht3>\dimen@ - \global\advance\dimen@ by 1pt - \repeat - }% - %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% - \setbox0=\vbox to\dimen@{\unvbox1}% - \setbox2=\vbox to\dimen@{\unvbox3}% - % - \pagesofar -} -\catcode`\@ = \other - - -\message{sectioning,} -% Chapters, sections, etc. - -% Let's start with @part. -\outer\parseargdef\part{\partzzz{#1}} -\def\partzzz#1{% - \chapoddpage - \null - \vskip.3\vsize % move it down on the page a bit - \begingroup - \noindent \titlefonts\rmisbold #1\par % the text - \let\lastnode=\empty % no node to associate with - \writetocentry{part}{#1}{}% but put it in the toc - \headingsoff % no headline or footline on the part page - \chapoddpage - \endgroup -} - -% \unnumberedno is an oxymoron. But we count the unnumbered -% sections so that we can refer to them unambiguously in the pdf -% outlines by their "section number". We avoid collisions with chapter -% numbers by starting them at 10000. (If a document ever has 10000 -% chapters, we're in trouble anyway, I'm sure.) -\newcount\unnumberedno \unnumberedno = 10000 -\newcount\chapno -\newcount\secno \secno=0 -\newcount\subsecno \subsecno=0 -\newcount\subsubsecno \subsubsecno=0 - -% This counter is funny since it counts through charcodes of letters A, B, ... -\newcount\appendixno \appendixno = `\@ -% -% \def\appendixletter{\char\the\appendixno} -% We do the following ugly conditional instead of the above simple -% construct for the sake of pdftex, which needs the actual -% letter in the expansion, not just typeset. -% -\def\appendixletter{% - \ifnum\appendixno=`A A% - \else\ifnum\appendixno=`B B% - \else\ifnum\appendixno=`C C% - \else\ifnum\appendixno=`D D% - \else\ifnum\appendixno=`E E% - \else\ifnum\appendixno=`F F% - \else\ifnum\appendixno=`G G% - \else\ifnum\appendixno=`H H% - \else\ifnum\appendixno=`I I% - \else\ifnum\appendixno=`J J% - \else\ifnum\appendixno=`K K% - \else\ifnum\appendixno=`L L% - \else\ifnum\appendixno=`M M% - \else\ifnum\appendixno=`N N% - \else\ifnum\appendixno=`O O% - \else\ifnum\appendixno=`P P% - \else\ifnum\appendixno=`Q Q% - \else\ifnum\appendixno=`R R% - \else\ifnum\appendixno=`S S% - \else\ifnum\appendixno=`T T% - \else\ifnum\appendixno=`U U% - \else\ifnum\appendixno=`V V% - \else\ifnum\appendixno=`W W% - \else\ifnum\appendixno=`X X% - \else\ifnum\appendixno=`Y Y% - \else\ifnum\appendixno=`Z Z% - % The \the is necessary, despite appearances, because \appendixletter is - % expanded while writing the .toc file. \char\appendixno is not - % expandable, thus it is written literally, thus all appendixes come out - % with the same letter (or @) in the toc without it. - \else\char\the\appendixno - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} - -% Each @chapter defines these (using marks) as the number+name, number -% and name of the chapter. Page headings and footings can use -% these. @section does likewise. -\def\thischapter{} -\def\thischapternum{} -\def\thischaptername{} -\def\thissection{} -\def\thissectionnum{} -\def\thissectionname{} - -\newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count - -% @raisesections: treat @section as chapter, @subsection as section, etc. -\def\raisesections{\global\advance\secbase by -1} -\let\up=\raisesections % original BFox name - -% @lowersections: treat @chapter as section, @section as subsection, etc. -\def\lowersections{\global\advance\secbase by 1} -\let\down=\lowersections % original BFox name - -% we only have subsub. -\chardef\maxseclevel = 3 -% -% A numbered section within an unnumbered changes to unnumbered too. -% To achieve this, remember the "biggest" unnum. sec. we are currently in: -\chardef\unnlevel = \maxseclevel -% -% Trace whether the current chapter is an appendix or not: -% \chapheadtype is "N" or "A", unnumbered chapters are ignored. -\def\chapheadtype{N} - -% Choose a heading macro -% #1 is heading type -% #2 is heading level -% #3 is text for heading -\def\genhead#1#2#3{% - % Compute the abs. sec. level: - \absseclevel=#2 - \advance\absseclevel by \secbase - % Make sure \absseclevel doesn't fall outside the range: - \ifnum \absseclevel < 0 - \absseclevel = 0 - \else - \ifnum \absseclevel > 3 - \absseclevel = 3 - \fi - \fi - % The heading type: - \def\headtype{#1}% - \if \headtype U% - \ifnum \absseclevel < \unnlevel - \chardef\unnlevel = \absseclevel - \fi - \else - % Check for appendix sections: - \ifnum \absseclevel = 0 - \edef\chapheadtype{\headtype}% - \else - \if \headtype A\if \chapheadtype N% - \errmessage{@appendix... within a non-appendix chapter}% - \fi\fi - \fi - % Check for numbered within unnumbered: - \ifnum \absseclevel > \unnlevel - \def\headtype{U}% - \else - \chardef\unnlevel = 3 - \fi - \fi - % Now print the heading: - \if \headtype U% - \ifcase\absseclevel - \unnumberedzzz{#3}% - \or \unnumberedseczzz{#3}% - \or \unnumberedsubseczzz{#3}% - \or \unnumberedsubsubseczzz{#3}% - \fi - \else - \if \headtype A% - \ifcase\absseclevel - \appendixzzz{#3}% - \or \appendixsectionzzz{#3}% - \or \appendixsubseczzz{#3}% - \or \appendixsubsubseczzz{#3}% - \fi - \else - \ifcase\absseclevel - \chapterzzz{#3}% - \or \seczzz{#3}% - \or \numberedsubseczzz{#3}% - \or \numberedsubsubseczzz{#3}% - \fi - \fi - \fi - \suppressfirstparagraphindent -} - -% an interface: -\def\numhead{\genhead N} -\def\apphead{\genhead A} -\def\unnmhead{\genhead U} - -% @chapter, @appendix, @unnumbered. Increment top-level counter, reset -% all lower-level sectioning counters to zero. -% -% Also set \chaplevelprefix, which we prepend to @float sequence numbers -% (e.g., figures), q.v. By default (before any chapter), that is empty. -\let\chaplevelprefix = \empty -% -\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz -\def\chapterzzz#1{% - % section resetting is \global in case the chapter is in a group, such - % as an @include file. - \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 - \global\advance\chapno by 1 - % - % Used for \float. - \gdef\chaplevelprefix{\the\chapno.}% - \resetallfloatnos - % - % \putwordChapter can contain complex things in translations. - \toks0=\expandafter{\putwordChapter}% - \message{\the\toks0 \space \the\chapno}% - % - % Write the actual heading. - \chapmacro{#1}{Ynumbered}{\the\chapno}% - % - % So @section and the like are numbered underneath this chapter. - \global\let\section = \numberedsec - \global\let\subsection = \numberedsubsec - \global\let\subsubsection = \numberedsubsubsec -} - -\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz -% -\def\appendixzzz#1{% - \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 - \global\advance\appendixno by 1 - \gdef\chaplevelprefix{\appendixletter.}% - \resetallfloatnos - % - % \putwordAppendix can contain complex things in translations. - \toks0=\expandafter{\putwordAppendix}% - \message{\the\toks0 \space \appendixletter}% - % - \chapmacro{#1}{Yappendix}{\appendixletter}% - % - \global\let\section = \appendixsec - \global\let\subsection = \appendixsubsec - \global\let\subsubsection = \appendixsubsubsec -} - -% normally unnmhead0 calls unnumberedzzz: -\outer\parseargdef\unnumbered{\unnmhead0{#1}} -\def\unnumberedzzz#1{% - \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 - \global\advance\unnumberedno by 1 - % - % Since an unnumbered has no number, no prefix for figures. - \global\let\chaplevelprefix = \empty - \resetallfloatnos - % - % This used to be simply \message{#1}, but TeX fully expands the - % argument to \message. Therefore, if #1 contained @-commands, TeX - % expanded them. For example, in `@unnumbered The @cite{Book}', TeX - % expanded @cite (which turns out to cause errors because \cite is meant - % to be executed, not expanded). - % - % Anyway, we don't want the fully-expanded definition of @cite to appear - % as a result of the \message, we just want `@cite' itself. We use - % \the to achieve this: TeX expands \the only once, - % simply yielding the contents of . (We also do this for - % the toc entries.) - \toks0 = {#1}% - \message{(\the\toks0)}% - % - \chapmacro{#1}{Ynothing}{\the\unnumberedno}% - % - \global\let\section = \unnumberedsec - \global\let\subsection = \unnumberedsubsec - \global\let\subsubsection = \unnumberedsubsubsec -} - -% @centerchap is like @unnumbered, but the heading is centered. -\outer\parseargdef\centerchap{% - % Well, we could do the following in a group, but that would break - % an assumption that \chapmacro is called at the outermost level. - % Thus we are safer this way: --kasal, 24feb04 - \let\centerparametersmaybe = \centerparameters - \unnmhead0{#1}% - \let\centerparametersmaybe = \relax -} - -% @top is like @unnumbered. -\let\top\unnumbered - -% Sections. -% -\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz -\def\seczzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% -} - -% normally calls appendixsectionzzz: -\outer\parseargdef\appendixsection{\apphead1{#1}} -\def\appendixsectionzzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% -} -\let\appendixsec\appendixsection - -% normally calls unnumberedseczzz: -\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} -\def\unnumberedseczzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% -} - -% Subsections. -% -% normally calls numberedsubseczzz: -\outer\parseargdef\numberedsubsec{\numhead2{#1}} -\def\numberedsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% -} - -% normally calls appendixsubseczzz: -\outer\parseargdef\appendixsubsec{\apphead2{#1}} -\def\appendixsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Yappendix}% - {\appendixletter.\the\secno.\the\subsecno}% -} - -% normally calls unnumberedsubseczzz: -\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} -\def\unnumberedsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Ynothing}% - {\the\unnumberedno.\the\secno.\the\subsecno}% -} - -% Subsubsections. -% -% normally numberedsubsubseczzz: -\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} -\def\numberedsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Ynumbered}% - {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% -} - -% normally appendixsubsubseczzz: -\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} -\def\appendixsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Yappendix}% - {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% -} - -% normally unnumberedsubsubseczzz: -\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} -\def\unnumberedsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Ynothing}% - {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% -} - -% These macros control what the section commands do, according -% to what kind of chapter we are in (ordinary, appendix, or unnumbered). -% Define them by default for a numbered chapter. -\let\section = \numberedsec -\let\subsection = \numberedsubsec -\let\subsubsection = \numberedsubsubsec - -% Define @majorheading, @heading and @subheading - -\def\majorheading{% - {\advance\chapheadingskip by 10pt \chapbreak }% - \parsearg\chapheadingzzz -} - -\def\chapheading{\chapbreak \parsearg\chapheadingzzz} -\def\chapheadingzzz#1{% - \vbox{\chapfonts \raggedtitlesettings #1\par}% - \nobreak\bigskip \nobreak - \suppressfirstparagraphindent -} - -% @heading, @subheading, @subsubheading. -\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} - \suppressfirstparagraphindent} -\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} - \suppressfirstparagraphindent} -\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} - \suppressfirstparagraphindent} - -% These macros generate a chapter, section, etc. heading only -% (including whitespace, linebreaking, etc. around it), -% given all the information in convenient, parsed form. - -% Args are the skip and penalty (usually negative) -\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} - -% Parameter controlling skip before chapter headings (if needed) -\newskip\chapheadingskip - -% Define plain chapter starts, and page on/off switching for it. -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -% Because \domark is called before \chapoddpage, the filler page will -% get the headings for the next chapter, which is wrong. But we don't -% care -- we just disable all headings on the filler page. -\def\chapoddpage{% - \chappager - \ifodd\pageno \else - \begingroup - \headingsoff - \null - \chappager - \endgroup - \fi -} - -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} - -\def\CHAPPAGoff{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chapbreak -\global\let\pagealignmacro=\chappager} - -\def\CHAPPAGon{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chappager -\global\let\pagealignmacro=\chappager -\global\def\HEADINGSon{\HEADINGSsingle}} - -\def\CHAPPAGodd{% -\global\let\contentsalignmacro = \chapoddpage -\global\let\pchapsepmacro=\chapoddpage -\global\let\pagealignmacro=\chapoddpage -\global\def\HEADINGSon{\HEADINGSdouble}} - -\CHAPPAGon - -% Chapter opening. -% -% #1 is the text, #2 is the section type (Ynumbered, Ynothing, -% Yappendix, Yomitfromtoc), #3 the chapter number. -% -% To test against our argument. -\def\Ynothingkeyword{Ynothing} -\def\Yomitfromtockeyword{Yomitfromtoc} -\def\Yappendixkeyword{Yappendix} -% -\def\chapmacro#1#2#3{% - % Insert the first mark before the heading break (see notes for \domark). - \let\prevchapterdefs=\lastchapterdefs - \let\prevsectiondefs=\lastsectiondefs - \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% - \gdef\thissection{}}% - % - \def\temptype{#2}% - \ifx\temptype\Ynothingkeyword - \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% - \gdef\thischapter{\thischaptername}}% - \else\ifx\temptype\Yomitfromtockeyword - \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% - \gdef\thischapter{}}% - \else\ifx\temptype\Yappendixkeyword - \toks0={#1}% - \xdef\lastchapterdefs{% - \gdef\noexpand\thischaptername{\the\toks0}% - \gdef\noexpand\thischapternum{\appendixletter}% - % \noexpand\putwordAppendix avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} - \noexpand\thischapternum: - \noexpand\thischaptername}% - }% - \else - \toks0={#1}% - \xdef\lastchapterdefs{% - \gdef\noexpand\thischaptername{\the\toks0}% - \gdef\noexpand\thischapternum{\the\chapno}% - % \noexpand\putwordChapter avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thischapter{\noexpand\putwordChapter{} - \noexpand\thischapternum: - \noexpand\thischaptername}% - }% - \fi\fi\fi - % - % Output the mark. Pass it through \safewhatsit, to take care of - % the preceding space. - \safewhatsit\domark - % - % Insert the chapter heading break. - \pchapsepmacro - % - % Now the second mark, after the heading break. No break points - % between here and the heading. - \let\prevchapterdefs=\lastchapterdefs - \let\prevsectiondefs=\lastsectiondefs - \domark - % - {% - \chapfonts \rmisbold - % - % Have to define \lastsection before calling \donoderef, because the - % xref code eventually uses it. On the other hand, it has to be called - % after \pchapsepmacro, or the headline will change too soon. - \gdef\lastsection{#1}% - % - % Only insert the separating space if we have a chapter/appendix - % number, and don't print the unnumbered ``number''. - \ifx\temptype\Ynothingkeyword - \setbox0 = \hbox{}% - \def\toctype{unnchap}% - \else\ifx\temptype\Yomitfromtockeyword - \setbox0 = \hbox{}% contents like unnumbered, but no toc entry - \def\toctype{omit}% - \else\ifx\temptype\Yappendixkeyword - \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% - \def\toctype{app}% - \else - \setbox0 = \hbox{#3\enspace}% - \def\toctype{numchap}% - \fi\fi\fi - % - % Write the toc entry for this chapter. Must come before the - % \donoderef, because we include the current node name in the toc - % entry, and \donoderef resets it to empty. - \writetocentry{\toctype}{#1}{#3}% - % - % For pdftex, we have to write out the node definition (aka, make - % the pdfdest) after any page break, but before the actual text has - % been typeset. If the destination for the pdf outline is after the - % text, then jumping from the outline may wind up with the text not - % being visible, for instance under high magnification. - \donoderef{#2}% - % - % Typeset the actual heading. - \nobreak % Avoid page breaks at the interline glue. - \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe - \unhbox0 #1\par}% - }% - \nobreak\bigskip % no page break after a chapter title - \nobreak -} - -% @centerchap -- centered and unnumbered. -\let\centerparametersmaybe = \relax -\def\centerparameters{% - \advance\rightskip by 3\rightskip - \leftskip = \rightskip - \parfillskip = 0pt -} - - -% I don't think this chapter style is supported any more, so I'm not -% updating it with the new noderef stuff. We'll see. --karl, 11aug03. -% -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} -% -\def\unnchfopen #1{% - \chapoddpage - \vbox{\chapfonts \raggedtitlesettings #1\par}% - \nobreak\bigskip\nobreak -} -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} -\def\centerchfopen #1{% - \chapoddpage - \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% - \nobreak\bigskip \nobreak -} -\def\CHAPFopen{% - \global\let\chapmacro=\chfopen - \global\let\centerchapmacro=\centerchfopen} - - -% Section titles. These macros combine the section number parts and -% call the generic \sectionheading to do the printing. -% -\newskip\secheadingskip -\def\secheadingbreak{\dobreak \secheadingskip{-1000}} - -% Subsection titles. -\newskip\subsecheadingskip -\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} - -% Subsubsection titles. -\def\subsubsecheadingskip{\subsecheadingskip} -\def\subsubsecheadingbreak{\subsecheadingbreak} - - -% Print any size, any type, section title. -% -% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is -% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the -% section number. -% -\def\seckeyword{sec} -% -\def\sectionheading#1#2#3#4{% - {% - \checkenv{}% should not be in an environment. - % - % Switch to the right set of fonts. - \csname #2fonts\endcsname \rmisbold - % - \def\sectionlevel{#2}% - \def\temptype{#3}% - % - % Insert first mark before the heading break (see notes for \domark). - \let\prevsectiondefs=\lastsectiondefs - \ifx\temptype\Ynothingkeyword - \ifx\sectionlevel\seckeyword - \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% - \gdef\thissection{\thissectionname}}% - \fi - \else\ifx\temptype\Yomitfromtockeyword - % Don't redefine \thissection. - \else\ifx\temptype\Yappendixkeyword - \ifx\sectionlevel\seckeyword - \toks0={#1}% - \xdef\lastsectiondefs{% - \gdef\noexpand\thissectionname{\the\toks0}% - \gdef\noexpand\thissectionnum{#4}% - % \noexpand\putwordSection avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thissection{\noexpand\putwordSection{} - \noexpand\thissectionnum: - \noexpand\thissectionname}% - }% - \fi - \else - \ifx\sectionlevel\seckeyword - \toks0={#1}% - \xdef\lastsectiondefs{% - \gdef\noexpand\thissectionname{\the\toks0}% - \gdef\noexpand\thissectionnum{#4}% - % \noexpand\putwordSection avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thissection{\noexpand\putwordSection{} - \noexpand\thissectionnum: - \noexpand\thissectionname}% - }% - \fi - \fi\fi\fi - % - % Go into vertical mode. Usually we'll already be there, but we - % don't want the following whatsit to end up in a preceding paragraph - % if the document didn't happen to have a blank line. - \par - % - % Output the mark. Pass it through \safewhatsit, to take care of - % the preceding space. - \safewhatsit\domark - % - % Insert space above the heading. - \csname #2headingbreak\endcsname - % - % Now the second mark, after the heading break. No break points - % between here and the heading. - \let\prevsectiondefs=\lastsectiondefs - \domark - % - % Only insert the space after the number if we have a section number. - \ifx\temptype\Ynothingkeyword - \setbox0 = \hbox{}% - \def\toctype{unn}% - \gdef\lastsection{#1}% - \else\ifx\temptype\Yomitfromtockeyword - % for @headings -- no section number, don't include in toc, - % and don't redefine \lastsection. - \setbox0 = \hbox{}% - \def\toctype{omit}% - \let\sectionlevel=\empty - \else\ifx\temptype\Yappendixkeyword - \setbox0 = \hbox{#4\enspace}% - \def\toctype{app}% - \gdef\lastsection{#1}% - \else - \setbox0 = \hbox{#4\enspace}% - \def\toctype{num}% - \gdef\lastsection{#1}% - \fi\fi\fi - % - % Write the toc entry (before \donoderef). See comments in \chapmacro. - \writetocentry{\toctype\sectionlevel}{#1}{#4}% - % - % Write the node reference (= pdf destination for pdftex). - % Again, see comments in \chapmacro. - \donoderef{#3}% - % - % Interline glue will be inserted when the vbox is completed. - % That glue will be a valid breakpoint for the page, since it'll be - % preceded by a whatsit (usually from the \donoderef, or from the - % \writetocentry if there was no node). We don't want to allow that - % break, since then the whatsits could end up on page n while the - % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. - \nobreak - % - % Output the actual section heading. - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright - \hangindent=\wd0 % zero if no section number - \unhbox0 #1}% - }% - % Add extra space after the heading -- half of whatever came above it. - % Don't allow stretch, though. - \kern .5 \csname #2headingskip\endcsname - % - % Do not let the kern be a potential breakpoint, as it would be if it - % was followed by glue. - \nobreak - % - % We'll almost certainly start a paragraph next, so don't let that - % glue accumulate. (Not a breakpoint because it's preceded by a - % discardable item.) However, when a paragraph is not started next - % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out - % or the negative glue will cause weirdly wrong output, typically - % obscuring the section heading with something else. - \vskip-\parskip - % - % This is so the last item on the main vertical list is a known - % \penalty > 10000, so \startdefun, etc., can recognize the situation - % and do the needful. - \penalty 10001 -} - - -\message{toc,} -% Table of contents. -\newwrite\tocfile - -% Write an entry to the toc file, opening it if necessary. -% Called from @chapter, etc. -% -% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} -% We append the current node name (if any) and page number as additional -% arguments for the \{chap,sec,...}entry macros which will eventually -% read this. The node name is used in the pdf outlines as the -% destination to jump to. -% -% We open the .toc file for writing here instead of at @setfilename (or -% any other fixed time) so that @contents can be anywhere in the document. -% But if #1 is `omit', then we don't do anything. This is used for the -% table of contents chapter openings themselves. -% -\newif\iftocfileopened -\def\omitkeyword{omit}% -% -\def\writetocentry#1#2#3{% - \edef\writetoctype{#1}% - \ifx\writetoctype\omitkeyword \else - \iftocfileopened\else - \immediate\openout\tocfile = \jobname.toc - \global\tocfileopenedtrue - \fi - % - \iflinks - {\atdummies - \edef\temp{% - \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% - \temp - }% - \fi - \fi - % - % Tell \shipout to create a pdf destination on each page, if we're - % writing pdf. These are used in the table of contents. We can't - % just write one on every page because the title pages are numbered - % 1 and 2 (the page numbers aren't printed), and so are the first - % two pages of the document. Thus, we'd have two destinations named - % `1', and two named `2'. - \ifpdf \global\pdfmakepagedesttrue \fi -} - - -% These characters do not print properly in the Computer Modern roman -% fonts, so we must take special care. This is more or less redundant -% with the Texinfo input format setup at the end of this file. -% -\def\activecatcodes{% - \catcode`\"=\active - \catcode`\$=\active - \catcode`\<=\active - \catcode`\>=\active - \catcode`\\=\active - \catcode`\^=\active - \catcode`\_=\active - \catcode`\|=\active - \catcode`\~=\active -} - - -% Read the toc file, which is essentially Texinfo input. -\def\readtocfile{% - \setupdatafile - \activecatcodes - \input \tocreadfilename -} - -\newskip\contentsrightmargin \contentsrightmargin=1in -\newcount\savepageno -\newcount\lastnegativepageno \lastnegativepageno = -1 - -% Prepare to read what we've written to \tocfile. -% -\def\startcontents#1{% - % If @setchapternewpage on, and @headings double, the contents should - % start on an odd page, unlike chapters. Thus, we maintain - % \contentsalignmacro in parallel with \pagealignmacro. - % From: Torbjorn Granlund - \contentsalignmacro - \immediate\closeout\tocfile - % - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \chapmacro{#1}{Yomitfromtoc}{}% - % - \savepageno = \pageno - \begingroup % Set up to handle contents files properly. - \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. - % - % Roman numerals for page numbers. - \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi -} - -% redefined for the two-volume lispref. We always output on -% \jobname.toc even if this is redefined. -% -\def\tocreadfilename{\jobname.toc} - -% Normal (long) toc. -% -\def\contents{% - \startcontents{\putwordTOC}% - \openin 1 \tocreadfilename\space - \ifeof 1 \else - \readtocfile - \fi - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \ifeof 1 \else - \pdfmakeoutlines - \fi - \closein 1 - \endgroup - \lastnegativepageno = \pageno - \global\pageno = \savepageno -} - -% And just the chapters. -\def\summarycontents{% - \startcontents{\putwordShortTOC}% - % - \let\partentry = \shortpartentry - \let\numchapentry = \shortchapentry - \let\appentry = \shortchapentry - \let\unnchapentry = \shortunnchapentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=\shortcontrm \let\bf=\shortcontbf - \let\sl=\shortcontsl \let\tt=\shortconttt - \rm - \hyphenpenalty = 10000 - \advance\baselineskip by 1pt % Open it up a little. - \def\numsecentry##1##2##3##4{} - \let\appsecentry = \numsecentry - \let\unnsecentry = \numsecentry - \let\numsubsecentry = \numsecentry - \let\appsubsecentry = \numsecentry - \let\unnsubsecentry = \numsecentry - \let\numsubsubsecentry = \numsecentry - \let\appsubsubsecentry = \numsecentry - \let\unnsubsubsecentry = \numsecentry - \openin 1 \tocreadfilename\space - \ifeof 1 \else - \readtocfile - \fi - \closein 1 - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \endgroup - \lastnegativepageno = \pageno - \global\pageno = \savepageno -} -\let\shortcontents = \summarycontents - -% Typeset the label for a chapter or appendix for the short contents. -% The arg is, e.g., `A' for an appendix, or `3' for a chapter. -% -\def\shortchaplabel#1{% - % This space should be enough, since a single number is .5em, and the - % widest letter (M) is 1em, at least in the Computer Modern fonts. - % But use \hss just in case. - % (This space doesn't include the extra space that gets added after - % the label; that gets put in by \shortchapentry above.) - % - % We'd like to right-justify chapter numbers, but that looks strange - % with appendix letters. And right-justifying numbers and - % left-justifying letters looks strange when there is less than 10 - % chapters. Have to read the whole toc once to know how many chapters - % there are before deciding ... - \hbox to 1em{#1\hss}% -} - -% These macros generate individual entries in the table of contents. -% The first argument is the chapter or section name. -% The last argument is the page number. -% The arguments in between are the chapter number, section number, ... - -% Parts, in the main contents. Replace the part number, which doesn't -% exist, with an empty box. Let's hope all the numbers have the same width. -% Also ignore the page number, which is conventionally not printed. -\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} -\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} -% -% Parts, in the short toc. -\def\shortpartentry#1#2#3#4{% - \penalty-300 - \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip - \shortchapentry{{\bf #1}}{\numeralbox}{}{}% -} - -% Chapters, in the main contents. -\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} -% -% Chapters, in the short toc. -% See comments in \dochapentry re vbox and related settings. -\def\shortchapentry#1#2#3#4{% - \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% -} - -% Appendices, in the main contents. -% Need the word Appendix, and a fixed-size box. -% -\def\appendixbox#1{% - % We use M since it's probably the widest letter. - \setbox0 = \hbox{\putwordAppendix{} M}% - \hbox to \wd0{\putwordAppendix{} #1\hss}} -% -\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} - -% Unnumbered chapters. -\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} -\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} - -% Sections. -\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} -\let\appsecentry=\numsecentry -\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} - -% Subsections. -\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} -\let\appsubsecentry=\numsubsecentry -\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} - -% And subsubsections. -\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} -\let\appsubsubsecentry=\numsubsubsecentry -\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} - -% This parameter controls the indentation of the various levels. -% Same as \defaultparindent. -\newdimen\tocindent \tocindent = 15pt - -% Now for the actual typesetting. In all these, #1 is the text and #2 is the -% page number. -% -% If the toc has to be broken over pages, we want it to be at chapters -% if at all possible; hence the \penalty. -\def\dochapentry#1#2{% - \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip - \begingroup - \chapentryfonts - \tocentry{#1}{\dopageno\bgroup#2\egroup}% - \endgroup - \nobreak\vskip .25\baselineskip plus.1\baselineskip -} - -\def\dosecentry#1#2{\begingroup - \secentryfonts \leftskip=\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -\def\dosubsecentry#1#2{\begingroup - \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -\def\dosubsubsecentry#1#2{\begingroup - \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -% We use the same \entry macro as for the index entries. -\let\tocentry = \entry - -% Space between chapter (or whatever) number and the title. -\def\labelspace{\hskip1em \relax} - -\def\dopageno#1{{\rm #1}} -\def\doshortpageno#1{{\rm #1}} - -\def\chapentryfonts{\secfonts \rm} -\def\secentryfonts{\textfonts} -\def\subsecentryfonts{\textfonts} -\def\subsubsecentryfonts{\textfonts} - - -\message{environments,} -% @foo ... @end foo. - -% @tex ... @end tex escapes into raw TeX temporarily. -% One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain @ character. - -\envdef\tex{% - \setupmarkupstyle{tex}% - \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 - \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 - \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie - \catcode `\%=14 - \catcode `\+=\other - \catcode `\"=\other - \catcode `\|=\other - \catcode `\<=\other - \catcode `\>=\other - \catcode`\`=\other - \catcode`\'=\other - \escapechar=`\\ - % - % ' is active in math mode (mathcode"8000). So reset it, and all our - % other math active characters (just in case), to plain's definitions. - \mathactive - % - \let\b=\ptexb - \let\bullet=\ptexbullet - \let\c=\ptexc - \let\,=\ptexcomma - \let\.=\ptexdot - \let\dots=\ptexdots - \let\equiv=\ptexequiv - \let\!=\ptexexclam - \let\i=\ptexi - \let\indent=\ptexindent - \let\noindent=\ptexnoindent - \let\{=\ptexlbrace - \let\+=\tabalign - \let\}=\ptexrbrace - \let\/=\ptexslash - \let\*=\ptexstar - \let\t=\ptext - \expandafter \let\csname top\endcsname=\ptextop % outer - \let\frenchspacing=\plainfrenchspacing - % - \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% - \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% - \def\@{@}% -} -% There is no need to define \Etex. - -% Define @lisp ... @end lisp. -% @lisp environment forms a group so it can rebind things, -% including the definition of @end lisp (which normally is erroneous). - -% Amount to narrow the margins by for @lisp. -\newskip\lispnarrowing \lispnarrowing=0.4in - -% This is the definition that ^^M gets inside @lisp, @example, and other -% such environments. \null is better than a space, since it doesn't -% have any width. -\def\lisppar{\null\endgraf} - -% This space is always present above and below environments. -\newskip\envskipamount \envskipamount = 0pt - -% Make spacing and below environment symmetrical. We use \parskip here -% to help in doing that, since in @example-like environments \parskip -% is reset to zero; thus the \afterenvbreak inserts no space -- but the -% start of the next paragraph will insert \parskip. -% -\def\aboveenvbreak{{% - % =10000 instead of <10000 because of a special case in \itemzzz and - % \sectionheading, q.v. - \ifnum \lastpenalty=10000 \else - \advance\envskipamount by \parskip - \endgraf - \ifdim\lastskip<\envskipamount - \removelastskip - % it's not a good place to break if the last penalty was \nobreak - % or better ... - \ifnum\lastpenalty<10000 \penalty-50 \fi - \vskip\envskipamount - \fi - \fi -}} - -\let\afterenvbreak = \aboveenvbreak - -% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will -% also clear it, so that its embedded environments do the narrowing again. -\let\nonarrowing=\relax - -% @cartouche ... @end cartouche: draw rectangle w/rounded corners around -% environment contents. -\font\circle=lcircle10 -\newdimen\circthick -\newdimen\cartouter\newdimen\cartinner -\newskip\normbskip\newskip\normpskip\newskip\normlskip -\circthick=\fontdimen8\circle -% -\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth -\def\ctr{{\hskip 6pt\circle\char'010}} -\def\cbl{{\circle\char'012\hskip -6pt}} -\def\cbr{{\hskip 6pt\circle\char'011}} -\def\carttop{\hbox to \cartouter{\hskip\lskip - \ctl\leaders\hrule height\circthick\hfil\ctr - \hskip\rskip}} -\def\cartbot{\hbox to \cartouter{\hskip\lskip - \cbl\leaders\hrule height\circthick\hfil\cbr - \hskip\rskip}} -% -\newskip\lskip\newskip\rskip - -\envdef\cartouche{% - \ifhmode\par\fi % can't be in the midst of a paragraph. - \startsavinginserts - \lskip=\leftskip \rskip=\rightskip - \leftskip=0pt\rightskip=0pt % we want these *outside*. - \cartinner=\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=\hsize - \advance\cartouter by 18.4pt % allow for 3pt kerns on either - % side, and for 6pt waste from - % each corner char, and rule thickness - \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing = t% - % - % If this cartouche directly follows a sectioning command, we need the - % \parskip glue (backspaced over by default) or the cartouche can - % collide with the section heading. - \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi - % - \vbox\bgroup - \baselineskip=0pt\parskip=0pt\lineskip=0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \kern3pt - \hsize=\cartinner - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \vskip -\parskip - \comment % For explanation, see the end of def\group. -} -\def\Ecartouche{% - \ifhmode\par\fi - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup - \checkinserts -} - - -% This macro is called at the beginning of all the @example variants, -% inside a group. -\newdimen\nonfillparindent -\def\nonfillstart{% - \aboveenvbreak - \hfuzz = 12pt % Don't be fussy - \sepspaces % Make spaces be word-separators rather than space tokens. - \let\par = \lisppar % don't ignore blank lines - \obeylines % each line of input is a line of output - \parskip = 0pt - % Turn off paragraph indentation but redefine \indent to emulate - % the normal \indent. - \nonfillparindent=\parindent - \parindent = 0pt - \let\indent\nonfillindent - % - \emergencystretch = 0pt % don't try to avoid overfull boxes - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \else - \let\nonarrowing = \relax - \fi - \let\exdent=\nofillexdent -} - -\begingroup -\obeyspaces -% We want to swallow spaces (but not other tokens) after the fake -% @indent in our nonfill-environments, where spaces are normally -% active and set to @tie, resulting in them not being ignored after -% @indent. -\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% -\gdef\nonfillindentcheck{% -\ifx\temp % -\expandafter\nonfillindentgobble% -\else% -\leavevmode\nonfillindentbox% -\fi% -}% -\endgroup -\def\nonfillindentgobble#1{\nonfillindent} -\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} - -% If you want all examples etc. small: @set dispenvsize small. -% If you want even small examples the full size: @set dispenvsize nosmall. -% This affects the following displayed environments: -% @example, @display, @format, @lisp -% -\def\smallword{small} -\def\nosmallword{nosmall} -\let\SETdispenvsize\relax -\def\setnormaldispenv{% - \ifx\SETdispenvsize\smallword - % end paragraph for sake of leading, in case document has no blank - % line. This is redundant with what happens in \aboveenvbreak, but - % we need to do it before changing the fonts, and it's inconvenient - % to change the fonts afterward. - \ifnum \lastpenalty=10000 \else \endgraf \fi - \smallexamplefonts \rm - \fi -} -\def\setsmalldispenv{% - \ifx\SETdispenvsize\nosmallword - \else - \ifnum \lastpenalty=10000 \else \endgraf \fi - \smallexamplefonts \rm - \fi -} - -% We often define two environments, @foo and @smallfoo. -% Let's do it in one command. #1 is the env name, #2 the definition. -\def\makedispenvdef#1#2{% - \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% - \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% - \expandafter\let\csname E#1\endcsname \afterenvbreak - \expandafter\let\csname Esmall#1\endcsname \afterenvbreak -} - -% Define two environment synonyms (#1 and #2) for an environment. -\def\maketwodispenvdef#1#2#3{% - \makedispenvdef{#1}{#3}% - \makedispenvdef{#2}{#3}% -} -% -% @lisp: indented, narrowed, typewriter font; -% @example: same as @lisp. -% -% @smallexample and @smalllisp: use smaller fonts. -% Originally contributed by Pavel@xerox. -% -\maketwodispenvdef{lisp}{example}{% - \nonfillstart - \tt\setupmarkupstyle{example}% - \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return -} -% @display/@smalldisplay: same as @lisp except keep current font. -% -\makedispenvdef{display}{% - \nonfillstart - \gobble -} - -% @format/@smallformat: same as @display except don't narrow margins. -% -\makedispenvdef{format}{% - \let\nonarrowing = t% - \nonfillstart - \gobble -} - -% @flushleft: same as @format, but doesn't obey \SETdispenvsize. -\envdef\flushleft{% - \let\nonarrowing = t% - \nonfillstart - \gobble -} -\let\Eflushleft = \afterenvbreak - -% @flushright. -% -\envdef\flushright{% - \let\nonarrowing = t% - \nonfillstart - \advance\leftskip by 0pt plus 1fill\relax - \gobble -} -\let\Eflushright = \afterenvbreak - - -% @raggedright does more-or-less normal line breaking but no right -% justification. From plain.tex. -\envdef\raggedright{% - \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax -} -\let\Eraggedright\par - -\envdef\raggedleft{% - \parindent=0pt \leftskip0pt plus2em - \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt - \hbadness=10000 % Last line will usually be underfull, so turn off - % badness reporting. -} -\let\Eraggedleft\par - -\envdef\raggedcenter{% - \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em - \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt - \hbadness=10000 % Last line will usually be underfull, so turn off - % badness reporting. -} -\let\Eraggedcenter\par - - -% @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. We keep \parskip nonzero in general, since -% we're doing normal filling. So, when using \aboveenvbreak and -% \afterenvbreak, temporarily make \parskip 0. -% -\makedispenvdef{quotation}{\quotationstart} -% -\def\quotationstart{% - \indentedblockstart % same as \indentedblock, but increase right margin too. - \ifx\nonarrowing\relax - \advance\rightskip by \lispnarrowing - \fi - \parsearg\quotationlabel -} - -% We have retained a nonzero parskip for the environment, since we're -% doing normal filling. -% -\def\Equotation{% - \par - \ifx\quotationauthor\thisisundefined\else - % indent a bit. - \leftline{\kern 2\leftskip \sl ---\quotationauthor}% - \fi - {\parskip=0pt \afterenvbreak}% -} -\def\Esmallquotation{\Equotation} - -% If we're given an argument, typeset it in bold with a colon after. -\def\quotationlabel#1{% - \def\temp{#1}% - \ifx\temp\empty \else - {\bf #1: }% - \fi -} - -% @indentedblock is like @quotation, but indents only on the left and -% has no optional argument. -% -\makedispenvdef{indentedblock}{\indentedblockstart} -% -\def\indentedblockstart{% - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \parindent=0pt - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. - \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing - \exdentamount = \lispnarrowing - \else - \let\nonarrowing = \relax - \fi -} - -% Keep a nonzero parskip for the environment, since we're doing normal filling. -% -\def\Eindentedblock{% - \par - {\parskip=0pt \afterenvbreak}% -} -\def\Esmallindentedblock{\Eindentedblock} - - -% LaTeX-like @verbatim...@end verbatim and @verb{...} -% If we want to allow any as delimiter, -% we need the curly braces so that makeinfo sees the @verb command, eg: -% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org -% -% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. -% -% [Knuth] p.344; only we need to do the other characters Texinfo sets -% active too. Otherwise, they get lost as the first character on a -% verbatim line. -\def\dospecials{% - \do\ \do\\\do\{\do\}\do\$\do\&% - \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% - \do\<\do\>\do\|\do\@\do+\do\"% - % Don't do the quotes -- if we do, @set txicodequoteundirected and - % @set txicodequotebacktick will not have effect on @verb and - % @verbatim, and ?` and !` ligatures won't get disabled. - %\do\`\do\'% -} -% -% [Knuth] p. 380 -\def\uncatcodespecials{% - \def\do##1{\catcode`##1=\other}\dospecials} -% -% Setup for the @verb command. -% -% Eight spaces for a tab -\begingroup - \catcode`\^^I=\active - \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} -\endgroup -% -\def\setupverb{% - \tt % easiest (and conventionally used) font for verbatim - \def\par{\leavevmode\endgraf}% - \setupmarkupstyle{verb}% - \tabeightspaces - % Respect line breaks, - % print special symbols as themselves, and - % make each space count - % must do in this order: - \obeylines \uncatcodespecials \sepspaces -} - -% Setup for the @verbatim environment -% -% Real tab expansion. -\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount -% -% We typeset each line of the verbatim in an \hbox, so we can handle -% tabs. The \global is in case the verbatim line starts with an accent, -% or some other command that starts with a begin-group. Otherwise, the -% entire \verbbox would disappear at the corresponding end-group, before -% it is typeset. Meanwhile, we can't have nested verbatim commands -% (can we?), so the \global won't be overwriting itself. -\newbox\verbbox -\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} -% -\begingroup - \catcode`\^^I=\active - \gdef\tabexpand{% - \catcode`\^^I=\active - \def^^I{\leavevmode\egroup - \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab - \divide\dimen\verbbox by\tabw - \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw - \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw - \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox - }% - } -\endgroup - -% start the verbatim environment. -\def\setupverbatim{% - \let\nonarrowing = t% - \nonfillstart - \tt % easiest (and conventionally used) font for verbatim - % The \leavevmode here is for blank lines. Otherwise, we would - % never \starttabox and the \egroup would end verbatim mode. - \def\par{\leavevmode\egroup\box\verbbox\endgraf}% - \tabexpand - \setupmarkupstyle{verbatim}% - % Respect line breaks, - % print special symbols as themselves, and - % make each space count. - % Must do in this order: - \obeylines \uncatcodespecials \sepspaces - \everypar{\starttabbox}% -} - -% Do the @verb magic: verbatim text is quoted by unique -% delimiter characters. Before first delimiter expect a -% right brace, after last delimiter expect closing brace: -% -% \def\doverb'{'#1'}'{#1} -% -% [Knuth] p. 382; only eat outer {} -\begingroup - \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other - \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] -\endgroup -% -\def\verb{\begingroup\setupverb\doverb} -% -% -% Do the @verbatim magic: define the macro \doverbatim so that -% the (first) argument ends when '@end verbatim' is reached, ie: -% -% \def\doverbatim#1@end verbatim{#1} -% -% For Texinfo it's a lot easier than for LaTeX, -% because texinfo's \verbatim doesn't stop at '\end{verbatim}': -% we need not redefine '\', '{' and '}'. -% -% Inspired by LaTeX's verbatim command set [latex.ltx] -% -\begingroup - \catcode`\ =\active - \obeylines % - % ignore everything up to the first ^^M, that's the newline at the end - % of the @verbatim input line itself. Otherwise we get an extra blank - % line in the output. - \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% - % We really want {...\end verbatim} in the body of the macro, but - % without the active space; thus we have to use \xdef and \gobble. -\endgroup -% -\envdef\verbatim{% - \setupverbatim\doverbatim -} -\let\Everbatim = \afterenvbreak - - -% @verbatiminclude FILE - insert text of file in verbatim environment. -% -\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} -% -\def\doverbatiminclude#1{% - {% - \makevalueexpandable - \setupverbatim - \indexnofonts % Allow `@@' and other weird things in file names. - \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% - \input #1 - \afterenvbreak - }% -} - -% @copying ... @end copying. -% Save the text away for @insertcopying later. -% -% We save the uninterpreted tokens, rather than creating a box. -% Saving the text in a box would be much easier, but then all the -% typesetting commands (@smallbook, font changes, etc.) have to be done -% beforehand -- and a) we want @copying to be done first in the source -% file; b) letting users define the frontmatter in as flexible order as -% possible is very desirable. -% -\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} -\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} -% -\def\insertcopying{% - \begingroup - \parindent = 0pt % paragraph indentation looks wrong on title page - \scanexp\copyingtext - \endgroup -} - - -\message{defuns,} -% @defun etc. - -\newskip\defbodyindent \defbodyindent=.4in -\newskip\defargsindent \defargsindent=50pt -\newskip\deflastargmargin \deflastargmargin=18pt -\newcount\defunpenalty - -% Start the processing of @deffn: -\def\startdefun{% - \ifnum\lastpenalty<10000 - \medbreak - \defunpenalty=10003 % Will keep this @deffn together with the - % following @def command, see below. - \else - % If there are two @def commands in a row, we'll have a \nobreak, - % which is there to keep the function description together with its - % header. But if there's nothing but headers, we need to allow a - % break somewhere. Check specifically for penalty 10002, inserted - % by \printdefunline, instead of 10000, since the sectioning - % commands also insert a nobreak penalty, and we don't want to allow - % a break between a section heading and a defun. - % - % As a further refinement, we avoid "club" headers by signalling - % with penalty of 10003 after the very first @deffn in the - % sequence (see above), and penalty of 10002 after any following - % @def command. - \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi - % - % Similarly, after a section heading, do not allow a break. - % But do insert the glue. - \medskip % preceded by discardable penalty, so not a breakpoint - \fi - % - \parindent=0in - \advance\leftskip by \defbodyindent - \exdentamount=\defbodyindent -} - -\def\dodefunx#1{% - % First, check whether we are in the right environment: - \checkenv#1% - % - % As above, allow line break if we have multiple x headers in a row. - % It's not a great place, though. - \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi - % - % And now, it's time to reuse the body of the original defun: - \expandafter\gobbledefun#1% -} -\def\gobbledefun#1\startdefun{} - -% \printdefunline \deffnheader{text} -% -\def\printdefunline#1#2{% - \begingroup - % call \deffnheader: - #1#2 \endheader - % common ending: - \interlinepenalty = 10000 - \advance\rightskip by 0pt plus 1fil\relax - \endgraf - \nobreak\vskip -\parskip - \penalty\defunpenalty % signal to \startdefun and \dodefunx - % Some of the @defun-type tags do not enable magic parentheses, - % rendering the following check redundant. But we don't optimize. - \checkparencounts - \endgroup -} - -\def\Edefun{\endgraf\medbreak} - -% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; -% the only thing remaining is to define \deffnheader. -% -\def\makedefun#1{% - \expandafter\let\csname E#1\endcsname = \Edefun - \edef\temp{\noexpand\domakedefun - \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% - \temp -} - -% \domakedefun \deffn \deffnx \deffnheader -% -% Define \deffn and \deffnx, without parameters. -% \deffnheader has to be defined explicitly. -% -\def\domakedefun#1#2#3{% - \envdef#1{% - \startdefun - \doingtypefnfalse % distinguish typed functions from all else - \parseargusing\activeparens{\printdefunline#3}% - }% - \def#2{\dodefunx#1}% - \def#3% -} - -\newif\ifdoingtypefn % doing typed function? -\newif\ifrettypeownline % typeset return type on its own line? - -% @deftypefnnewline on|off says whether the return type of typed functions -% are printed on their own line. This affects @deftypefn, @deftypefun, -% @deftypeop, and @deftypemethod. -% -\parseargdef\deftypefnnewline{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxideftypefnnl\endcsname - = \empty - \else\ifx\temp\offword - \expandafter\let\csname SETtxideftypefnnl\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @txideftypefnnl value `\temp', - must be on|off}% - \fi\fi -} - -% Untyped functions: - -% @deffn category name args -\makedefun{deffn}{\deffngeneral{}} - -% @deffn category class name args -\makedefun{defop}#1 {\defopon{#1\ \putwordon}} - -% \defopon {category on}class name args -\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } - -% \deffngeneral {subind}category name args -% -\def\deffngeneral#1#2 #3 #4\endheader{% - % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. - \dosubind{fn}{\code{#3}}{#1}% - \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% -} - -% Typed functions: - -% @deftypefn category type name args -\makedefun{deftypefn}{\deftypefngeneral{}} - -% @deftypeop category class type name args -\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} - -% \deftypeopon {category on}class type name args -\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } - -% \deftypefngeneral {subind}category type name args -% -\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% - \dosubind{fn}{\code{#4}}{#1}% - \doingtypefntrue - \defname{#2}{#3}{#4}\defunargs{#5\unskip}% -} - -% Typed variables: - -% @deftypevr category type var args -\makedefun{deftypevr}{\deftypecvgeneral{}} - -% @deftypecv category class type var args -\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} - -% \deftypecvof {category of}class type var args -\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } - -% \deftypecvgeneral {subind}category type var args -% -\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% - \dosubind{vr}{\code{#4}}{#1}% - \defname{#2}{#3}{#4}\defunargs{#5\unskip}% -} - -% Untyped variables: - -% @defvr category var args -\makedefun{defvr}#1 {\deftypevrheader{#1} {} } - -% @defcv category class var args -\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} - -% \defcvof {category of}class var args -\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } - -% Types: - -% @deftp category name args -\makedefun{deftp}#1 #2 #3\endheader{% - \doind{tp}{\code{#2}}% - \defname{#1}{}{#2}\defunargs{#3\unskip}% -} - -% Remaining @defun-like shortcuts: -\makedefun{defun}{\deffnheader{\putwordDeffunc} } -\makedefun{defmac}{\deffnheader{\putwordDefmac} } -\makedefun{defspec}{\deffnheader{\putwordDefspec} } -\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } -\makedefun{defvar}{\defvrheader{\putwordDefvar} } -\makedefun{defopt}{\defvrheader{\putwordDefopt} } -\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } -\makedefun{defmethod}{\defopon\putwordMethodon} -\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} -\makedefun{defivar}{\defcvof\putwordInstanceVariableof} -\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} - -% \defname, which formats the name of the @def (not the args). -% #1 is the category, such as "Function". -% #2 is the return type, if any. -% #3 is the function name. -% -% We are followed by (but not passed) the arguments, if any. -% -\def\defname#1#2#3{% - \par - % Get the values of \leftskip and \rightskip as they were outside the @def... - \advance\leftskip by -\defbodyindent - % - % Determine if we are typesetting the return type of a typed function - % on a line by itself. - \rettypeownlinefalse - \ifdoingtypefn % doing a typed function specifically? - % then check user option for putting return type on its own line: - \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else - \rettypeownlinetrue - \fi - \fi - % - % How we'll format the category name. Putting it in brackets helps - % distinguish it from the body text that may end up on the next line - % just below it. - \def\temp{#1}% - \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} - % - % Figure out line sizes for the paragraph shape. We'll always have at - % least two. - \tempnum = 2 - % - % The first line needs space for \box0; but if \rightskip is nonzero, - % we need only space for the part of \box0 which exceeds it: - \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip - % - % If doing a return type on its own line, we'll have another line. - \ifrettypeownline - \advance\tempnum by 1 - \def\maybeshapeline{0in \hsize}% - \else - \def\maybeshapeline{}% - \fi - % - % The continuations: - \dimen2=\hsize \advance\dimen2 by -\defargsindent - % - % The final paragraph shape: - \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 - % - % Put the category name at the right margin. - \noindent - \hbox to 0pt{% - \hfil\box0 \kern-\hsize - % \hsize has to be shortened this way: - \kern\leftskip - % Intentionally do not respect \rightskip, since we need the space. - }% - % - % Allow all lines to be underfull without complaint: - \tolerance=10000 \hbadness=10000 - \exdentamount=\defbodyindent - {% - % defun fonts. We use typewriter by default (used to be bold) because: - % . we're printing identifiers, they should be in tt in principle. - % . in languages with many accents, such as Czech or French, it's - % common to leave accents off identifiers. The result looks ok in - % tt, but exceedingly strange in rm. - % . we don't want -- and --- to be treated as ligatures. - % . this still does not fix the ?` and !` ligatures, but so far no - % one has made identifiers using them :). - \df \tt - \def\temp{#2}% text of the return type - \ifx\temp\empty\else - \tclose{\temp}% typeset the return type - \ifrettypeownline - % put return type on its own line; prohibit line break following: - \hfil\vadjust{\nobreak}\break - \else - \space % type on same line, so just followed by a space - \fi - \fi % no return type - #3% output function name - }% - {\rm\enskip}% hskip 0.5 em of \tenrm - % - \boldbrax - % arguments will be output next, if any. -} - -% Print arguments in slanted roman (not ttsl), inconsistently with using -% tt for the name. This is because literal text is sometimes needed in -% the argument list (groff manual), and ttsl and tt are not very -% distinguishable. Prevent hyphenation at `-' chars. -% -\def\defunargs#1{% - % use sl by default (not ttsl), - % tt for the names. - \df \sl \hyphenchar\font=0 - % - % On the other hand, if an argument has two dashes (for instance), we - % want a way to get ttsl. We used to recommend @var for that, so - % leave the code in, but it's strange for @var to lead to typewriter. - % Nowadays we recommend @code, since the difference between a ttsl hyphen - % and a tt hyphen is pretty tiny. @code also disables ?` !`. - \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% - #1% - \sl\hyphenchar\font=45 -} - -% We want ()&[] to print specially on the defun line. -% -\def\activeparens{% - \catcode`\(=\active \catcode`\)=\active - \catcode`\[=\active \catcode`\]=\active - \catcode`\&=\active -} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen = ( \let\rparen = ) - -% Be sure that we always have a definition for `(', etc. For example, -% if the fn name has parens in it, \boldbrax will not be in effect yet, -% so TeX would otherwise complain about undefined control sequence. -{ - \activeparens - \global\let(=\lparen \global\let)=\rparen - \global\let[=\lbrack \global\let]=\rbrack - \global\let& = \& - - \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} - \gdef\magicamp{\let&=\amprm} -} - -\newcount\parencount - -% If we encounter &foo, then turn on ()-hacking afterwards -\newif\ifampseen -\def\amprm#1 {\ampseentrue{\bf\ }} - -\def\parenfont{% - \ifampseen - % At the first level, print parens in roman, - % otherwise use the default font. - \ifnum \parencount=1 \rm \fi - \else - % The \sf parens (in \boldbrax) actually are a little bolder than - % the contained text. This is especially needed for [ and ] . - \sf - \fi -} -\def\infirstlevel#1{% - \ifampseen - \ifnum\parencount=1 - #1% - \fi - \fi -} -\def\bfafterword#1 {#1 \bf} - -\def\opnr{% - \global\advance\parencount by 1 - {\parenfont(}% - \infirstlevel \bfafterword -} -\def\clnr{% - {\parenfont)}% - \infirstlevel \sl - \global\advance\parencount by -1 -} - -\newcount\brackcount -\def\lbrb{% - \global\advance\brackcount by 1 - {\bf[}% -} -\def\rbrb{% - {\bf]}% - \global\advance\brackcount by -1 -} - -\def\checkparencounts{% - \ifnum\parencount=0 \else \badparencount \fi - \ifnum\brackcount=0 \else \badbrackcount \fi -} -% these should not use \errmessage; the glibc manual, at least, actually -% has such constructs (when documenting function pointers). -\def\badparencount{% - \message{Warning: unbalanced parentheses in @def...}% - \global\parencount=0 -} -\def\badbrackcount{% - \message{Warning: unbalanced square brackets in @def...}% - \global\brackcount=0 -} - - -\message{macros,} -% @macro. - -% To do this right we need a feature of e-TeX, \scantokens, -% which we arrange to emulate with a temporary file in ordinary TeX. -\ifx\eTeXversion\thisisundefined - \newwrite\macscribble - \def\scantokens#1{% - \toks0={#1}% - \immediate\openout\macscribble=\jobname.tmp - \immediate\write\macscribble{\the\toks0}% - \immediate\closeout\macscribble - \input \jobname.tmp - } -\fi - -\def\scanmacro#1{\begingroup - \newlinechar`\^^M - \let\xeatspaces\eatspaces - % - % Undo catcode changes of \startcontents and \doprintindex - % When called from @insertcopying or (short)caption, we need active - % backslash to get it printed correctly. Previously, we had - % \catcode`\\=\other instead. We'll see whether a problem appears - % with macro expansion. --kasal, 19aug04 - \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ - % - % ... and for \example: - \spaceisspace - % - % The \empty here causes a following catcode 5 newline to be eaten as - % part of reading whitespace after a control sequence. It does not - % eat a catcode 13 newline. There's no good way to handle the two - % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX - % would then have different behavior). See the Macro Details node in - % the manual for the workaround we recommend for macros and - % line-oriented commands. - % - \scantokens{#1\empty}% -\endgroup} - -\def\scanexp#1{% - \edef\temp{\noexpand\scanmacro{#1}}% - \temp -} - -\newcount\paramno % Count of parameters -\newtoks\macname % Macro name -\newif\ifrecursive % Is it recursive? - -% List of all defined macros in the form -% \definedummyword\macro1\definedummyword\macro2... -% Currently is also contains all @aliases; the list can be split -% if there is a need. -\def\macrolist{} - -% Add the macro to \macrolist -\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} -\def\addtomacrolistxxx#1{% - \toks0 = \expandafter{\macrolist\definedummyword#1}% - \xdef\macrolist{\the\toks0}% -} - -% Utility routines. -% This does \let #1 = #2, with \csnames; that is, -% \let \csname#1\endcsname = \csname#2\endcsname -% (except of course we have to play expansion games). -% -\def\cslet#1#2{% - \expandafter\let - \csname#1\expandafter\endcsname - \csname#2\endcsname -} - -% Trim leading and trailing spaces off a string. -% Concepts from aro-bend problem 15 (see CTAN). -{\catcode`\@=11 -\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} -\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} -\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} -\def\unbrace#1{#1} -\unbrace{\gdef\trim@@@ #1 } #2@{#1} -} - -% Trim a single trailing ^^M off a string. -{\catcode`\^^M=\other \catcode`\Q=3% -\gdef\eatcr #1{\eatcra #1Q^^MQ}% -\gdef\eatcra#1^^MQ{\eatcrb#1Q}% -\gdef\eatcrb#1Q#2Q{#1}% -} - -% Macro bodies are absorbed as an argument in a context where -% all characters are catcode 10, 11 or 12, except \ which is active -% (as in normal texinfo). It is necessary to change the definition of \ -% to recognize macro arguments; this is the job of \mbodybackslash. -% -% Non-ASCII encodings make 8-bit characters active, so un-activate -% them to avoid their expansion. Must do this non-globally, to -% confine the change to the current group. -% -% It's necessary to have hard CRs when the macro is executed. This is -% done by making ^^M (\endlinechar) catcode 12 when reading the macro -% body, and then making it the \newlinechar in \scanmacro. -% -\def\scanctxt{% used as subroutine - \catcode`\"=\other - \catcode`\+=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\@=\other - \catcode`\^=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\~=\other - \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi -} - -\def\scanargctxt{% used for copying and captions, not macros. - \scanctxt - \catcode`\\=\other - \catcode`\^^M=\other -} - -\def\macrobodyctxt{% used for @macro definitions - \scanctxt - \catcode`\{=\other - \catcode`\}=\other - \catcode`\^^M=\other - \usembodybackslash -} - -\def\macroargctxt{% used when scanning invocations - \scanctxt - \catcode`\\=0 -} -% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" -% for the single characters \ { }. Thus, we end up with the "commands" -% that would be written @\ @{ @} in a Texinfo document. -% -% We already have @{ and @}. For @\, we define it here, and only for -% this purpose, to produce a typewriter backslash (so, the @\ that we -% define for @math can't be used with @macro calls): -% -\def\\{\normalbackslash}% -% -% We would like to do this for \, too, since that is what makeinfo does. -% But it is not possible, because Texinfo already has a command @, for a -% cedilla accent. Documents must use @comma{} instead. -% -% \anythingelse will almost certainly be an error of some kind. - - -% \mbodybackslash is the definition of \ in @macro bodies. -% It maps \foo\ => \csname macarg.foo\endcsname => #N -% where N is the macro parameter number. -% We define \csname macarg.\endcsname to be \realbackslash, so -% \\ in macro replacement text gets you a backslash. -% -{\catcode`@=0 @catcode`@\=@active - @gdef@usembodybackslash{@let\=@mbodybackslash} - @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} -} -\expandafter\def\csname macarg.\endcsname{\realbackslash} - -\def\margbackslash#1{\char`\#1 } - -\def\macro{\recursivefalse\parsearg\macroxxx} -\def\rmacro{\recursivetrue\parsearg\macroxxx} - -\def\macroxxx#1{% - \getargs{#1}% now \macname is the macname and \argl the arglist - \ifx\argl\empty % no arguments - \paramno=0\relax - \else - \expandafter\parsemargdef \argl;% - \if\paramno>256\relax - \ifx\eTeXversion\thisisundefined - \errhelp = \EMsimple - \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} - \fi - \fi - \fi - \if1\csname ismacro.\the\macname\endcsname - \message{Warning: redefining \the\macname}% - \else - \expandafter\ifx\csname \the\macname\endcsname \relax - \else \errmessage{Macro name \the\macname\space already defined}\fi - \global\cslet{macsave.\the\macname}{\the\macname}% - \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% - \addtomacrolist{\the\macname}% - \fi - \begingroup \macrobodyctxt - \ifrecursive \expandafter\parsermacbody - \else \expandafter\parsemacbody - \fi} - -\parseargdef\unmacro{% - \if1\csname ismacro.#1\endcsname - \global\cslet{#1}{macsave.#1}% - \global\expandafter\let \csname ismacro.#1\endcsname=0% - % Remove the macro name from \macrolist: - \begingroup - \expandafter\let\csname#1\endcsname \relax - \let\definedummyword\unmacrodo - \xdef\macrolist{\macrolist}% - \endgroup - \else - \errmessage{Macro #1 not defined}% - \fi -} - -% Called by \do from \dounmacro on each macro. The idea is to omit any -% macro definitions that have been changed to \relax. -% -\def\unmacrodo#1{% - \ifx #1\relax - % remove this - \else - \noexpand\definedummyword \noexpand#1% - \fi -} - -% This makes use of the obscure feature that if the last token of a -% is #, then the preceding argument is delimited by -% an opening brace, and that opening brace is not consumed. -\def\getargs#1{\getargsxxx#1{}} -\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} -\def\getmacname#1 #2\relax{\macname={#1}} -\def\getmacargs#1{\def\argl{#1}} - -% For macro processing make @ a letter so that we can make Texinfo private macro names. -\edef\texiatcatcode{\the\catcode`\@} -\catcode `@=11\relax - -% Parse the optional {params} list. Set up \paramno and \paramlist -% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH -% in the params list to some hook where the argument si to be expanded. If -% there are less than 10 arguments that hook is to be replaced by ##N where N -% is the position in that list, that is to say the macro arguments are to be -% defined `a la TeX in the macro body. -% -% That gets used by \mbodybackslash (above). -% -% We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX: let \hash be something -% unexpandable, insert that wherever you need a #, and then redefine -% it to # just before using the token list produced. -% -% The same technique is used to protect \eatspaces till just before -% the macro is used. -% -% If there are 10 or more arguments, a different technique is used, where the -% hook remains in the body, and when macro is to be expanded the body is -% processed again to replace the arguments. -% -% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the -% argument N value and then \edef the body (nothing else will expand because of -% the catcode regime underwhich the body was input). -% -% If you compile with TeX (not eTeX), and you have macros with 10 or more -% arguments, you need that no macro has more than 256 arguments, otherwise an -% error is produced. -\def\parsemargdef#1;{% - \paramno=0\def\paramlist{}% - \let\hash\relax - \let\xeatspaces\relax - \parsemargdefxxx#1,;,% - % In case that there are 10 or more arguments we parse again the arguments - % list to set new definitions for the \macarg.BLAH macros corresponding to - % each BLAH argument. It was anyhow needed to parse already once this list - % in order to count the arguments, and as macros with at most 9 arguments - % are by far more frequent than macro with 10 or more arguments, defining - % twice the \macarg.BLAH macros does not cost too much processing power. - \ifnum\paramno<10\relax\else - \paramno0\relax - \parsemmanyargdef@@#1,;,% 10 or more arguments - \fi -} -\def\parsemargdefxxx#1,{% - \if#1;\let\next=\relax - \else \let\next=\parsemargdefxxx - \advance\paramno by 1 - \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname - {\xeatspaces{\hash\the\paramno}}% - \edef\paramlist{\paramlist\hash\the\paramno,}% - \fi\next} - -\def\parsemmanyargdef@@#1,{% - \if#1;\let\next=\relax - \else - \let\next=\parsemmanyargdef@@ - \edef\tempb{\eatspaces{#1}}% - \expandafter\def\expandafter\tempa - \expandafter{\csname macarg.\tempb\endcsname}% - % Note that we need some extra \noexpand\noexpand, this is because we - % don't want \the to be expanded in the \parsermacbody as it uses an - % \xdef . - \expandafter\edef\tempa - {\noexpand\noexpand\noexpand\the\toks\the\paramno}% - \advance\paramno by 1\relax - \fi\next} - -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) -% - -\catcode `\@\texiatcatcode -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\catcode `\@=11\relax - -\let\endargs@\relax -\let\nil@\relax -\def\nilm@{\nil@}% -\long\def\nillm@{\nil@}% - -% This macro is expanded during the Texinfo macro expansion, not during its -% definition. It gets all the arguments values and assigns them to macros -% macarg.ARGNAME -% -% #1 is the macro name -% #2 is the list of argument names -% #3 is the list of argument values -\def\getargvals@#1#2#3{% - \def\macargdeflist@{}% - \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. - \def\paramlist{#2,\nil@}% - \def\macroname{#1}% - \begingroup - \macroargctxt - \def\argvaluelist{#3,\nil@}% - \def\@tempa{#3}% - \ifx\@tempa\empty - \setemptyargvalues@ - \else - \getargvals@@ - \fi -} - -% -\def\getargvals@@{% - \ifx\paramlist\nilm@ - % Some sanity check needed here that \argvaluelist is also empty. - \ifx\argvaluelist\nillm@ - \else - \errhelp = \EMsimple - \errmessage{Too many arguments in macro `\macroname'!}% - \fi - \let\next\macargexpandinbody@ - \else - \ifx\argvaluelist\nillm@ - % No more arguments values passed to macro. Set remaining named-arg - % macros to empty. - \let\next\setemptyargvalues@ - \else - % pop current arg name into \@tempb - \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% - \expandafter\@tempa\expandafter{\paramlist}% - % pop current argument value into \@tempc - \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% - \expandafter\@tempa\expandafter{\argvaluelist}% - % Here \@tempb is the current arg name and \@tempc is the current arg value. - % First place the new argument macro definition into \@tempd - \expandafter\macname\expandafter{\@tempc}% - \expandafter\let\csname macarg.\@tempb\endcsname\relax - \expandafter\def\expandafter\@tempe\expandafter{% - \csname macarg.\@tempb\endcsname}% - \edef\@tempd{\long\def\@tempe{\the\macname}}% - \push@\@tempd\macargdeflist@ - \let\next\getargvals@@ - \fi - \fi - \next -} - -\def\push@#1#2{% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter#2% - \expandafter\expandafter\expandafter{% - \expandafter#1#2}% -} - -% Replace arguments by their values in the macro body, and place the result -% in macro \@tempa -\def\macvalstoargs@{% - % To do this we use the property that token registers that are \the'ed - % within an \edef expand only once. So we are going to place all argument - % values into respective token registers. - % - % First we save the token context, and initialize argument numbering. - \begingroup - \paramno0\relax - % Then, for each argument number #N, we place the corresponding argument - % value into a new token list register \toks#N - \expandafter\putargsintokens@\saveparamlist@,;,% - % Then, we expand the body so that argument are replaced by their - % values. The trick for values not to be expanded themselves is that they - % are within tokens and that tokens expand only once in an \edef . - \edef\@tempc{\csname mac.\macroname .body\endcsname}% - % Now we restore the token stack pointer to free the token list registers - % which we have used, but we make sure that expanded body is saved after - % group. - \expandafter - \endgroup - \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% - } - -\def\macargexpandinbody@{% - %% Define the named-macro outside of this group and then close this group. - \expandafter - \endgroup - \macargdeflist@ - % First the replace in body the macro arguments by their values, the result - % is in \@tempa . - \macvalstoargs@ - % Then we point at the \norecurse or \gobble (for recursive) macro value - % with \@tempb . - \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname - % Depending on whether it is recursive or not, we need some tailing - % \egroup . - \ifx\@tempb\gobble - \let\@tempc\relax - \else - \let\@tempc\egroup - \fi - % And now we do the real job: - \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% - \@tempd -} - -\def\putargsintokens@#1,{% - \if#1;\let\next\relax - \else - \let\next\putargsintokens@ - % First we allocate the new token list register, and give it a temporary - % alias \@tempb . - \toksdef\@tempb\the\paramno - % Then we place the argument value into that token list register. - \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname - \expandafter\@tempb\expandafter{\@tempa}% - \advance\paramno by 1\relax - \fi - \next -} - -% Save the token stack pointer into macro #1 -\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} -% Restore the token stack pointer from number in macro #1 -\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} -% newtoks that can be used non \outer . -\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} - -% Tailing missing arguments are set to empty -\def\setemptyargvalues@{% - \ifx\paramlist\nilm@ - \let\next\macargexpandinbody@ - \else - \expandafter\setemptyargvaluesparser@\paramlist\endargs@ - \let\next\setemptyargvalues@ - \fi - \next -} - -\def\setemptyargvaluesparser@#1,#2\endargs@{% - \expandafter\def\expandafter\@tempa\expandafter{% - \expandafter\def\csname macarg.#1\endcsname{}}% - \push@\@tempa\macargdeflist@ - \def\paramlist{#2}% -} - -% #1 is the element target macro -% #2 is the list macro -% #3,#4\endargs@ is the list value -\def\pop@#1#2#3,#4\endargs@{% - \def#1{#3}% - \def#2{#4}% -} -\long\def\longpop@#1#2#3,#4\endargs@{% - \long\def#1{#3}% - \long\def#2{#4}% -} - -% This defines a Texinfo @macro. There are eight cases: recursive and -% nonrecursive macros of zero, one, up to nine, and many arguments. -% Much magic with \expandafter here. -% \xdef is used so that macro definitions will survive the file -% they're defined in; @include reads the file inside a group. -% -\def\defmacro{% - \let\hash=##% convert placeholders to macro parameter chars - \ifrecursive - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\scanmacro{\temp}}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup\noexpand\scanmacro{\temp}}% - \else - \ifnum\paramno<10\relax % at most 9 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{\egroup\noexpand\scanmacro{\temp}}% - \else % 10 or more - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\getargvals@{\the\macname}{\argl}% - }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp - \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble - \fi - \fi - \else - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \else % at most 9 - \ifnum\paramno<10\relax - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \expandafter\noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \else % 10 or more: - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\getargvals@{\the\macname}{\argl}% - }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp - \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse - \fi - \fi - \fi} - -\catcode `\@\texiatcatcode\relax - -\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} - -% \braceorline decides whether the next nonwhitespace character is a -% {. If so it reads up to the closing }, if not, it reads the whole -% line. Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg). -% -\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} -\def\braceorlinexxx{% - \ifx\nchar\bgroup\else - \expandafter\parsearg - \fi \macnamexxx} - - -% @alias. -% We need some trickery to remove the optional spaces around the equal -% sign. Make them active and then expand them all to nothing. -% -\def\alias{\parseargusing\obeyspaces\aliasxxx} -\def\aliasxxx #1{\aliasyyy#1\relax} -\def\aliasyyy #1=#2\relax{% - {% - \expandafter\let\obeyedspace=\empty - \addtomacrolist{#1}% - \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% - }% - \next -} - - -\message{cross references,} - -\newwrite\auxfile -\newif\ifhavexrefs % True if xref values are known. -\newif\ifwarnedxrefs % True if we warned once that they aren't known. - -% @inforef is relatively simple. -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{% - \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, - node \samp{\ignorespaces#1{}}} - -% @node's only job in TeX is to define \lastnode, which is used in -% cross-references. The @node line might or might not have commas, and -% might or might not have spaces before the first comma, like: -% @node foo , bar , ... -% We don't want such trailing spaces in the node name. -% -\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} -% -% also remove a trailing comma, in case of something like this: -% @node Help-Cross, , , Cross-refs -\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} -\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} - -\let\nwnode=\node -\let\lastnode=\empty - -% Write a cross-reference definition for the current node. #1 is the -% type (Ynumbered, Yappendix, Ynothing). -% -\def\donoderef#1{% - \ifx\lastnode\empty\else - \setref{\lastnode}{#1}% - \global\let\lastnode=\empty - \fi -} - -% @anchor{NAME} -- define xref target at arbitrary point. -% -\newcount\savesfregister -% -\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} -\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} -\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} - -% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an -% anchor), which consists of three parts: -% 1) NAME-title - the current sectioning name taken from \lastsection, -% or the anchor name. -% 2) NAME-snt - section number and type, passed as the SNT arg, or -% empty for anchors. -% 3) NAME-pg - the page number. -% -% This is called from \donoderef, \anchor, and \dofloat. In the case of -% floats, there is an additional part, which is not written here: -% 4) NAME-lof - the text as it should appear in a @listoffloats. -% -\def\setref#1#2{% - \pdfmkdest{#1}% - \iflinks - {% - \atdummies % preserve commands, but don't expand them - \edef\writexrdef##1##2{% - \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef - ##1}{##2}}% these are parameters of \writexrdef - }% - \toks0 = \expandafter{\lastsection}% - \immediate \writexrdef{title}{\the\toks0 }% - \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. - \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout - }% - \fi -} - -% @xrefautosectiontitle on|off says whether @section(ing) names are used -% automatically in xrefs, if the third arg is not explicitly specified. -% This was provided as a "secret" @set xref-automatic-section-title -% variable, now it's official. -% -\parseargdef\xrefautomaticsectiontitle{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETxref-automatic-section-title\endcsname - = \empty - \else\ifx\temp\offword - \expandafter\let\csname SETxref-automatic-section-title\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', - must be on|off}% - \fi\fi -} - -% -% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is -% the node name, #2 the name of the Info cross-reference, #3 the printed -% node name, #4 the name of the Info file, #5 the name of the printed -% manual. All but the node name can be omitted. -% -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -% -\newbox\toprefbox -\newbox\printedrefnamebox -\newbox\infofilenamebox -\newbox\printedmanualbox -% -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \unsepspaces - % - % Get args without leading/trailing spaces. - \def\printedrefname{\ignorespaces #3}% - \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% - % - \def\infofilename{\ignorespaces #4}% - \setbox\infofilenamebox = \hbox{\infofilename\unskip}% - % - \def\printedmanual{\ignorespaces #5}% - \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% - % - % If the printed reference name (arg #3) was not explicitly given in - % the @xref, figure out what we want to use. - \ifdim \wd\printedrefnamebox = 0pt - % No printed node name was explicitly given. - \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax - % Not auto section-title: use node name inside the square brackets. - \def\printedrefname{\ignorespaces #1}% - \else - % Auto section-title: use chapter/section title inside - % the square brackets if we have it. - \ifdim \wd\printedmanualbox > 0pt - % It is in another manual, so we don't have it; use node name. - \def\printedrefname{\ignorespaces #1}% - \else - \ifhavexrefs - % We (should) know the real title if we have the xref values. - \def\printedrefname{\refx{#1-title}{}}% - \else - % Otherwise just copy the Info node name. - \def\printedrefname{\ignorespaces #1}% - \fi% - \fi - \fi - \fi - % - % Make link in pdf output. - \ifpdf - {\indexnofonts - \turnoffactive - \makevalueexpandable - % This expands tokens, so do it after making catcode changes, so _ - % etc. don't get their TeX definitions. This ignores all spaces in - % #4, including (wrongly) those in the middle of the filename. - \getfilename{#4}% - % - % This (wrongly) does not take account of leading or trailing - % spaces in #1, which should be ignored. - \edef\pdfxrefdest{#1}% - \ifx\pdfxrefdest\empty - \def\pdfxrefdest{Top}% no empty targets - \else - \txiescapepdf\pdfxrefdest % escape PDF special chars - \fi - % - \leavevmode - \startlink attr{/Border [0 0 0]}% - \ifnum\filenamelength>0 - goto file{\the\filename.pdf} name{\pdfxrefdest}% - \else - goto name{\pdfmkpgn{\pdfxrefdest}}% - \fi - }% - \setcolor{\linkcolor}% - \fi - % - % Float references are printed completely differently: "Figure 1.2" - % instead of "[somenode], p.3". We distinguish them by the - % LABEL-title being set to a magic string. - {% - % Have to otherify everything special to allow the \csname to - % include an _ in the xref name, etc. - \indexnofonts - \turnoffactive - \expandafter\global\expandafter\let\expandafter\Xthisreftitle - \csname XR#1-title\endcsname - }% - \iffloat\Xthisreftitle - % If the user specified the print name (third arg) to the ref, - % print it instead of our usual "Figure 1.2". - \ifdim\wd\printedrefnamebox = 0pt - \refx{#1-snt}{}% - \else - \printedrefname - \fi - % - % If the user also gave the printed manual name (fifth arg), append - % "in MANUALNAME". - \ifdim \wd\printedmanualbox > 0pt - \space \putwordin{} \cite{\printedmanual}% - \fi - \else - % node/anchor (non-float) references. - % - % If we use \unhbox to print the node names, TeX does not insert - % empty discretionaries after hyphens, which means that it will not - % find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, - % this is a loss. Therefore, we give the text of the node name - % again, so it is as if TeX is seeing it for the first time. - % - \ifdim \wd\printedmanualbox > 0pt - % Cross-manual reference with a printed manual name. - % - \crossmanualxref{\cite{\printedmanual\unskip}}% - % - \else\ifdim \wd\infofilenamebox > 0pt - % Cross-manual reference with only an info filename (arg 4), no - % printed manual name (arg 5). This is essentially the same as - % the case above; we output the filename, since we have nothing else. - % - \crossmanualxref{\code{\infofilename\unskip}}% - % - \else - % Reference within this manual. - % - % _ (for example) has to be the character _ for the purposes of the - % control sequence corresponding to the node, but it has to expand - % into the usual \leavevmode...\vrule stuff for purposes of - % printing. So we \turnoffactive for the \refx-snt, back on for the - % printing, back off for the \refx-pg. - {\turnoffactive - % Only output a following space if the -snt ref is nonempty; for - % @unnumbered and @anchor, it won't be. - \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% - \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi - }% - % output the `[mynode]' via the macro below so it can be overridden. - \xrefprintnodename\printedrefname - % - % But we always want a comma and a space: - ,\space - % - % output the `page 3'. - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi\fi - \fi - \endlink -\endgroup} - -% Output a cross-manual xref to #1. Used just above (twice). -% -% Only include the text "Section ``foo'' in" if the foo is neither -% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply -% "see The Foo Manual", the idea being to refer to the whole manual. -% -% But, this being TeX, we can't easily compare our node name against the -% string "Top" while ignoring the possible spaces before and after in -% the input. By adding the arbitrary 7sp below, we make it much less -% likely that a real node name would have the same width as "Top" (e.g., -% in a monospaced font). Hopefully it will never happen in practice. -% -% For the same basic reason, we retypeset the "Top" at every -% reference, since the current font is indeterminate. -% -\def\crossmanualxref#1{% - \setbox\toprefbox = \hbox{Top\kern7sp}% - \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% - \ifdim \wd2 > 7sp % nonempty? - \ifdim \wd2 = \wd\toprefbox \else % same as Top? - \putwordSection{} ``\printedrefname'' \putwordin{}\space - \fi - \fi - #1% -} - -% This macro is called from \xrefX for the `[nodename]' part of xref -% output. It's a separate macro only so it can be changed more easily, -% since square brackets don't work well in some documents. Particularly -% one that Bob is working on :). -% -\def\xrefprintnodename#1{[#1]} - -% Things referred to by \setref. -% -\def\Ynothing{} -\def\Yomitfromtoc{} -\def\Ynumbered{% - \ifnum\secno=0 - \putwordChapter@tie \the\chapno - \else \ifnum\subsecno=0 - \putwordSection@tie \the\chapno.\the\secno - \else \ifnum\subsubsecno=0 - \putwordSection@tie \the\chapno.\the\secno.\the\subsecno - \else - \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno - \fi\fi\fi -} -\def\Yappendix{% - \ifnum\secno=0 - \putwordAppendix@tie @char\the\appendixno{}% - \else \ifnum\subsecno=0 - \putwordSection@tie @char\the\appendixno.\the\secno - \else \ifnum\subsubsecno=0 - \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno - \else - \putwordSection@tie - @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno - \fi\fi\fi -} - -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. -% -\def\refx#1#2{% - {% - \indexnofonts - \otherbackslash - \expandafter\global\expandafter\let\expandafter\thisrefX - \csname XR#1\endcsname - }% - \ifx\thisrefX\relax - % If not defined, say something at least. - \angleleft un\-de\-fined\angleright - \iflinks - \ifhavexrefs - {\toks0 = {#1}% avoid expansion of possibly-complex value - \message{\linenumber Undefined cross reference `\the\toks0'.}}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% - \fi - \fi - \fi - \else - % It's defined, so just use it. - \thisrefX - \fi - #2% Output the suffix in any case. -} - -% This is the macro invoked by entries in the aux file. Usually it's -% just a \def (we prepend XR to the control sequence name to avoid -% collisions). But if this is a float type, we have more work to do. -% -\def\xrdef#1#2{% - {% The node name might contain 8-bit characters, which in our current - % implementation are changed to commands like @'e. Don't let these - % mess up the control sequence name. - \indexnofonts - \turnoffactive - \xdef\safexrefname{#1}% - }% - % - \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref - % - % Was that xref control sequence that we just defined for a float? - \expandafter\iffloat\csname XR\safexrefname\endcsname - % it was a float, and we have the (safe) float type in \iffloattype. - \expandafter\let\expandafter\floatlist - \csname floatlist\iffloattype\endcsname - % - % Is this the first time we've seen this float type? - \expandafter\ifx\floatlist\relax - \toks0 = {\do}% yes, so just \do - \else - % had it before, so preserve previous elements in list. - \toks0 = \expandafter{\floatlist\do}% - \fi - % - % Remember this xref in the control sequence \floatlistFLOATTYPE, - % for later use in \listoffloats. - \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 - {\safexrefname}}% - \fi -} - -% Read the last existing aux file, if any. No error if none exists. -% -\def\tryauxfile{% - \openin 1 \jobname.aux - \ifeof 1 \else - \readdatafile{aux}% - \global\havexrefstrue - \fi - \closein 1 -} - -\def\setupdatafile{% - \catcode`\^^@=\other - \catcode`\^^A=\other - \catcode`\^^B=\other - \catcode`\^^C=\other - \catcode`\^^D=\other - \catcode`\^^E=\other - \catcode`\^^F=\other - \catcode`\^^G=\other - \catcode`\^^H=\other - \catcode`\^^K=\other - \catcode`\^^L=\other - \catcode`\^^N=\other - \catcode`\^^P=\other - \catcode`\^^Q=\other - \catcode`\^^R=\other - \catcode`\^^S=\other - \catcode`\^^T=\other - \catcode`\^^U=\other - \catcode`\^^V=\other - \catcode`\^^W=\other - \catcode`\^^X=\other - \catcode`\^^Z=\other - \catcode`\^^[=\other - \catcode`\^^\=\other - \catcode`\^^]=\other - \catcode`\^^^=\other - \catcode`\^^_=\other - % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. - % in xref tags, i.e., node names. But since ^^e4 notation isn't - % supported in the main text, it doesn't seem desirable. Furthermore, - % that is not enough: for node names that actually contain a ^ - % character, we would end up writing a line like this: 'xrdef {'hat - % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first - % argument, and \hat is not an expandable control sequence. It could - % all be worked out, but why? Either we support ^^ or we don't. - % - % The other change necessary for this was to define \auxhat: - % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter - % and then to call \auxhat in \setq. - % - \catcode`\^=\other - % - % Special characters. Should be turned off anyway, but... - \catcode`\~=\other - \catcode`\[=\other - \catcode`\]=\other - \catcode`\"=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\$=\other - \catcode`\#=\other - \catcode`\&=\other - \catcode`\%=\other - \catcode`+=\other % avoid \+ for paranoia even though we've turned it off - % - % This is to support \ in node names and titles, since the \ - % characters end up in a \csname. It's easier than - % leaving it active and making its active definition an actual \ - % character. What I don't understand is why it works in the *value* - % of the xrdef. Seems like it should be a catcode12 \, and that - % should not typeset properly. But it works, so I'm moving on for - % now. --karl, 15jan04. - \catcode`\\=\other - % - % Make the characters 128-255 be printing characters. - {% - \count1=128 - \def\loop{% - \catcode\count1=\other - \advance\count1 by 1 - \ifnum \count1<256 \loop \fi - }% - }% - % - % @ is our escape character in .aux files, and we need braces. - \catcode`\{=1 - \catcode`\}=2 - \catcode`\@=0 -} - -\def\readdatafile#1{% -\begingroup - \setupdatafile - \input\jobname.#1 -\endgroup} - - -\message{insertions,} -% including footnotes. - -\newcount \footnoteno - -% The trailing space in the following definition for supereject is -% vital for proper filling; pages come out unaligned when you do a -% pagealignmacro call if that space before the closing brace is -% removed. (Generally, numeric constants should always be followed by a -% space to prevent strange expansion errors.) -\def\supereject{\par\penalty -20000\footnoteno =0 } - -% @footnotestyle is meaningful for Info output only. -\let\footnotestyle=\comment - -{\catcode `\@=11 -% -% Auto-number footnotes. Otherwise like plain. -\gdef\footnote{% - \let\indent=\ptexindent - \let\noindent=\ptexnoindent - \global\advance\footnoteno by \@ne - \edef\thisfootno{$^{\the\footnoteno}$}% - % - % In case the footnote comes at the end of a sentence, preserve the - % extra spacing after we do the footnote number. - \let\@sf\empty - \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi - % - % Remove inadvertent blank space before typesetting the footnote number. - \unskip - \thisfootno\@sf - \dofootnote -}% - -% Don't bother with the trickery in plain.tex to not require the -% footnote text as a parameter. Our footnotes don't need to be so general. -% -% Oh yes, they do; otherwise, @ifset (and anything else that uses -% \parseargline) fails inside footnotes because the tokens are fixed when -% the footnote is read. --karl, 16nov96. -% -\gdef\dofootnote{% - \insert\footins\bgroup - % We want to typeset this text as a normal paragraph, even if the - % footnote reference occurs in (for example) a display environment. - % So reset some parameters. - \hsize=\pagewidth - \interlinepenalty\interfootnotelinepenalty - \splittopskip\ht\strutbox % top baseline for broken footnotes - \splitmaxdepth\dp\strutbox - \floatingpenalty\@MM - \leftskip\z@skip - \rightskip\z@skip - \spaceskip\z@skip - \xspaceskip\z@skip - \parindent\defaultparindent - % - \smallfonts \rm - % - % Because we use hanging indentation in footnotes, a @noindent appears - % to exdent this text, so make it be a no-op. makeinfo does not use - % hanging indentation so @noindent can still be needed within footnote - % text after an @example or the like (not that this is good style). - \let\noindent = \relax - % - % Hang the footnote text off the number. Use \everypar in case the - % footnote extends for more than one paragraph. - \everypar = {\hang}% - \textindent{\thisfootno}% - % - % Don't crash into the line above the footnote text. Since this - % expands into a box, it must come within the paragraph, lest it - % provide a place where TeX can split the footnote. - \footstrut - % - % Invoke rest of plain TeX footnote routine. - \futurelet\next\fo@t -} -}%end \catcode `\@=11 - -% In case a @footnote appears in a vbox, save the footnote text and create -% the real \insert just after the vbox finished. Otherwise, the insertion -% would be lost. -% Similarly, if a @footnote appears inside an alignment, save the footnote -% text to a box and make the \insert when a row of the table is finished. -% And the same can be done for other insert classes. --kasal, 16nov03. - -% Replace the \insert primitive by a cheating macro. -% Deeper inside, just make sure that the saved insertions are not spilled -% out prematurely. -% -\def\startsavinginserts{% - \ifx \insert\ptexinsert - \let\insert\saveinsert - \else - \let\checkinserts\relax - \fi -} - -% This \insert replacement works for both \insert\footins{foo} and -% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. -% -\def\saveinsert#1{% - \edef\next{\noexpand\savetobox \makeSAVEname#1}% - \afterassignment\next - % swallow the left brace - \let\temp = -} -\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} -\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} - -\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} - -\def\placesaveins#1{% - \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname - {\box#1}% -} - -% eat @SAVE -- beware, all of them have catcode \other: -{ - \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) - \gdef\gobblesave @SAVE{} -} - -% initialization: -\def\newsaveins #1{% - \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% - \next -} -\def\newsaveinsX #1{% - \csname newbox\endcsname #1% - \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts - \checksaveins #1}% -} - -% initialize: -\let\checkinserts\empty -\newsaveins\footins -\newsaveins\margin - - -% @image. We use the macros from epsf.tex to support this. -% If epsf.tex is not installed and @image is used, we complain. -% -% Check for and read epsf.tex up front. If we read it only at @image -% time, we might be inside a group, and then its definitions would get -% undone and the next image would fail. -\openin 1 = epsf.tex -\ifeof 1 \else - % Do not bother showing banner with epsf.tex v2.7k (available in - % doc/epsf.tex and on ctan). - \def\epsfannounce{\toks0 = }% - \input epsf.tex -\fi -\closein 1 -% -% We will only complain once about lack of epsf.tex. -\newif\ifwarnednoepsf -\newhelp\noepsfhelp{epsf.tex must be installed for images to - work. It is also included in the Texinfo distribution, or you can get - it from ftp://tug.org/tex/epsf.tex.} -% -\def\image#1{% - \ifx\epsfbox\thisisundefined - \ifwarnednoepsf \else - \errhelp = \noepsfhelp - \errmessage{epsf.tex not found, images will be ignored}% - \global\warnednoepsftrue - \fi - \else - \imagexxx #1,,,,,\finish - \fi -} -% -% Arguments to @image: -% #1 is (mandatory) image filename; we tack on .eps extension. -% #2 is (optional) width, #3 is (optional) height. -% #4 is (ignored optional) html alt text. -% #5 is (ignored optional) extension. -% #6 is just the usual extra ignored arg for parsing stuff. -\newif\ifimagevmode -\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup - \catcode`\^^M = 5 % in case we're inside an example - \normalturnoffactive % allow _ et al. in names - % If the image is by itself, center it. - \ifvmode - \imagevmodetrue - \else \ifx\centersub\centerV - % for @center @image, we need a vbox so we can have our vertical space - \imagevmodetrue - \vbox\bgroup % vbox has better behavior than vtop herev - \fi\fi - % - \ifimagevmode - \nobreak\medskip - % Usually we'll have text after the image which will insert - % \parskip glue, so insert it here too to equalize the space - % above and below. - \nobreak\vskip\parskip - \nobreak - \fi - % - % Leave vertical mode so that indentation from an enclosing - % environment such as @quotation is respected. - % However, if we're at the top level, we don't want the - % normal paragraph indentation. - % On the other hand, if we are in the case of @center @image, we don't - % want to start a paragraph, which will create a hsize-width box and - % eradicate the centering. - \ifx\centersub\centerV\else \noindent \fi - % - % Output the image. - \ifpdf - \dopdfimage{#1}{#2}{#3}% - \else - % \epsfbox itself resets \epsf?size at each figure. - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi - \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi - \epsfbox{#1.eps}% - \fi - % - \ifimagevmode - \medskip % space after a standalone image - \fi - \ifx\centersub\centerV \egroup \fi -\endgroup} - - -% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, -% etc. We don't actually implement floating yet, we always include the -% float "here". But it seemed the best name for the future. -% -\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} - -% There may be a space before second and/or third parameter; delete it. -\def\eatcommaspace#1, {#1,} - -% #1 is the optional FLOATTYPE, the text label for this float, typically -% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, -% this float will not be numbered and cannot be referred to. -% -% #2 is the optional xref label. Also must be present for the float to -% be referable. -% -% #3 is the optional positioning argument; for now, it is ignored. It -% will somehow specify the positions allowed to float to (here, top, bottom). -% -% We keep a separate counter for each FLOATTYPE, which we reset at each -% chapter-level command. -\let\resetallfloatnos=\empty -% -\def\dofloat#1,#2,#3,#4\finish{% - \let\thiscaption=\empty - \let\thisshortcaption=\empty - % - % don't lose footnotes inside @float. - % - % BEWARE: when the floats start float, we have to issue warning whenever an - % insert appears inside a float which could possibly float. --kasal, 26may04 - % - \startsavinginserts - % - % We can't be used inside a paragraph. - \par - % - \vtop\bgroup - \def\floattype{#1}% - \def\floatlabel{#2}% - \def\floatloc{#3}% we do nothing with this yet. - % - \ifx\floattype\empty - \let\safefloattype=\empty - \else - {% - % the floattype might have accents or other special characters, - % but we need to use it in a control sequence name. - \indexnofonts - \turnoffactive - \xdef\safefloattype{\floattype}% - }% - \fi - % - % If label is given but no type, we handle that as the empty type. - \ifx\floatlabel\empty \else - % We want each FLOATTYPE to be numbered separately (Figure 1, - % Table 1, Figure 2, ...). (And if no label, no number.) - % - \expandafter\getfloatno\csname\safefloattype floatno\endcsname - \global\advance\floatno by 1 - % - {% - % This magic value for \lastsection is output by \setref as the - % XREFLABEL-title value. \xrefX uses it to distinguish float - % labels (which have a completely different output format) from - % node and anchor labels. And \xrdef uses it to construct the - % lists of floats. - % - \edef\lastsection{\floatmagic=\safefloattype}% - \setref{\floatlabel}{Yfloat}% - }% - \fi - % - % start with \parskip glue, I guess. - \vskip\parskip - % - % Don't suppress indentation if a float happens to start a section. - \restorefirstparagraphindent -} - -% we have these possibilities: -% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap -% @float Foo,lbl & no caption: Foo 1.1 -% @float Foo & @caption{Cap}: Foo: Cap -% @float Foo & no caption: Foo -% @float ,lbl & Caption{Cap}: 1.1: Cap -% @float ,lbl & no caption: 1.1 -% @float & @caption{Cap}: Cap -% @float & no caption: -% -\def\Efloat{% - \let\floatident = \empty - % - % In all cases, if we have a float type, it comes first. - \ifx\floattype\empty \else \def\floatident{\floattype}\fi - % - % If we have an xref label, the number comes next. - \ifx\floatlabel\empty \else - \ifx\floattype\empty \else % if also had float type, need tie first. - \appendtomacro\floatident{\tie}% - \fi - % the number. - \appendtomacro\floatident{\chaplevelprefix\the\floatno}% - \fi - % - % Start the printed caption with what we've constructed in - % \floatident, but keep it separate; we need \floatident again. - \let\captionline = \floatident - % - \ifx\thiscaption\empty \else - \ifx\floatident\empty \else - \appendtomacro\captionline{: }% had ident, so need a colon between - \fi - % - % caption text. - \appendtomacro\captionline{\scanexp\thiscaption}% - \fi - % - % If we have anything to print, print it, with space before. - % Eventually this needs to become an \insert. - \ifx\captionline\empty \else - \vskip.5\parskip - \captionline - % - % Space below caption. - \vskip\parskip - \fi - % - % If have an xref label, write the list of floats info. Do this - % after the caption, to avoid chance of it being a breakpoint. - \ifx\floatlabel\empty \else - % Write the text that goes in the lof to the aux file as - % \floatlabel-lof. Besides \floatident, we include the short - % caption if specified, else the full caption if specified, else nothing. - {% - \atdummies - % - % since we read the caption text in the macro world, where ^^M - % is turned into a normal character, we have to scan it back, so - % we don't write the literal three characters "^^M" into the aux file. - \scanexp{% - \xdef\noexpand\gtemp{% - \ifx\thisshortcaption\empty - \thiscaption - \else - \thisshortcaption - \fi - }% - }% - \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident - \ifx\gtemp\empty \else : \gtemp \fi}}% - }% - \fi - \egroup % end of \vtop - % - % place the captured inserts - % - % BEWARE: when the floats start floating, we have to issue warning - % whenever an insert appears inside a float which could possibly - % float. --kasal, 26may04 - % - \checkinserts -} - -% Append the tokens #2 to the definition of macro #1, not expanding either. -% -\def\appendtomacro#1#2{% - \expandafter\def\expandafter#1\expandafter{#1#2}% -} - -% @caption, @shortcaption -% -\def\caption{\docaption\thiscaption} -\def\shortcaption{\docaption\thisshortcaption} -\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} -\def\defcaption#1#2{\egroup \def#1{#2}} - -% The parameter is the control sequence identifying the counter we are -% going to use. Create it if it doesn't exist and assign it to \floatno. -\def\getfloatno#1{% - \ifx#1\relax - % Haven't seen this figure type before. - \csname newcount\endcsname #1% - % - % Remember to reset this floatno at the next chap. - \expandafter\gdef\expandafter\resetallfloatnos - \expandafter{\resetallfloatnos #1=0 }% - \fi - \let\floatno#1% -} - -% \setref calls this to get the XREFLABEL-snt value. We want an @xref -% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we -% first read the @float command. -% -\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% - -% Magic string used for the XREFLABEL-title value, so \xrefX can -% distinguish floats from other xref types. -\def\floatmagic{!!float!!} - -% #1 is the control sequence we are passed; we expand into a conditional -% which is true if #1 represents a float ref. That is, the magic -% \lastsection value which we \setref above. -% -\def\iffloat#1{\expandafter\doiffloat#1==\finish} -% -% #1 is (maybe) the \floatmagic string. If so, #2 will be the -% (safe) float type for this float. We set \iffloattype to #2. -% -\def\doiffloat#1=#2=#3\finish{% - \def\temp{#1}% - \def\iffloattype{#2}% - \ifx\temp\floatmagic -} - -% @listoffloats FLOATTYPE - print a list of floats like a table of contents. -% -\parseargdef\listoffloats{% - \def\floattype{#1}% floattype - {% - % the floattype might have accents or other special characters, - % but we need to use it in a control sequence name. - \indexnofonts - \turnoffactive - \xdef\safefloattype{\floattype}% - }% - % - % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. - \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax - \ifhavexrefs - % if the user said @listoffloats foo but never @float foo. - \message{\linenumber No `\safefloattype' floats to list.}% - \fi - \else - \begingroup - \leftskip=\tocindent % indent these entries like a toc - \let\do=\listoffloatsdo - \csname floatlist\safefloattype\endcsname - \endgroup - \fi -} - -% This is called on each entry in a list of floats. We're passed the -% xref label, in the form LABEL-title, which is how we save it in the -% aux file. We strip off the -title and look up \XRLABEL-lof, which -% has the text we're supposed to typeset here. -% -% Figures without xref labels will not be included in the list (since -% they won't appear in the aux file). -% -\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} -\def\listoffloatsdoentry#1-title\finish{{% - % Can't fully expand XR#1-lof because it can contain anything. Just - % pass the control sequence. On the other hand, XR#1-pg is just the - % page number, and we want to fully expand that so we can get a link - % in pdf output. - \toksA = \expandafter{\csname XR#1-lof\endcsname}% - % - % use the same \entry macro we use to generate the TOC and index. - \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% - \writeentry -}} - - -\message{localization,} - -% For single-language documents, @documentlanguage is usually given very -% early, just after @documentencoding. Single argument is the language -% (de) or locale (de_DE) abbreviation. -% -{ - \catcode`\_ = \active - \globaldefs=1 -\parseargdef\documentlanguage{\begingroup - \let_=\normalunderscore % normal _ character for filenames - \tex % read txi-??.tex file in plain TeX. - % Read the file by the name they passed if it exists. - \openin 1 txi-#1.tex - \ifeof 1 - \documentlanguagetrywithoutunderscore{#1_\finish}% - \else - \globaldefs = 1 % everything in the txi-LL files needs to persist - \input txi-#1.tex - \fi - \closein 1 - \endgroup % end raw TeX -\endgroup} -% -% If they passed de_DE, and txi-de_DE.tex doesn't exist, -% try txi-de.tex. -% -\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% - \openin 1 txi-#1.tex - \ifeof 1 - \errhelp = \nolanghelp - \errmessage{Cannot read language file txi-#1.tex}% - \else - \globaldefs = 1 % everything in the txi-LL files needs to persist - \input txi-#1.tex - \fi - \closein 1 -} -}% end of special _ catcode -% -\newhelp\nolanghelp{The given language definition file cannot be found or -is empty. Maybe you need to install it? Putting it in the current -directory should work if nowhere else does.} - -% This macro is called from txi-??.tex files; the first argument is the -% \language name to set (without the "\lang@" prefix), the second and -% third args are \{left,right}hyphenmin. -% -% The language names to pass are determined when the format is built. -% See the etex.log file created at that time, e.g., -% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. -% -% With TeX Live 2008, etex now includes hyphenation patterns for all -% available languages. This means we can support hyphenation in -% Texinfo, at least to some extent. (This still doesn't solve the -% accented characters problem.) -% -\catcode`@=11 -\def\txisetlanguage#1#2#3{% - % do not set the language if the name is undefined in the current TeX. - \expandafter\ifx\csname lang@#1\endcsname \relax - \message{no patterns for #1}% - \else - \global\language = \csname lang@#1\endcsname - \fi - % but there is no harm in adjusting the hyphenmin values regardless. - \global\lefthyphenmin = #2\relax - \global\righthyphenmin = #3\relax -} - -% Helpers for encodings. -% Set the catcode of characters 128 through 255 to the specified number. -% -\def\setnonasciicharscatcode#1{% - \count255=128 - \loop\ifnum\count255<256 - \global\catcode\count255=#1\relax - \advance\count255 by 1 - \repeat -} - -\def\setnonasciicharscatcodenonglobal#1{% - \count255=128 - \loop\ifnum\count255<256 - \catcode\count255=#1\relax - \advance\count255 by 1 - \repeat -} - -% @documentencoding sets the definition of non-ASCII characters -% according to the specified encoding. -% -\parseargdef\documentencoding{% - % Encoding being declared for the document. - \def\declaredencoding{\csname #1.enc\endcsname}% - % - % Supported encodings: names converted to tokens in order to be able - % to compare them with \ifx. - \def\ascii{\csname US-ASCII.enc\endcsname}% - \def\latnine{\csname ISO-8859-15.enc\endcsname}% - \def\latone{\csname ISO-8859-1.enc\endcsname}% - \def\lattwo{\csname ISO-8859-2.enc\endcsname}% - \def\utfeight{\csname UTF-8.enc\endcsname}% - % - \ifx \declaredencoding \ascii - \asciichardefs - % - \else \ifx \declaredencoding \lattwo - \setnonasciicharscatcode\active - \lattwochardefs - % - \else \ifx \declaredencoding \latone - \setnonasciicharscatcode\active - \latonechardefs - % - \else \ifx \declaredencoding \latnine - \setnonasciicharscatcode\active - \latninechardefs - % - \else \ifx \declaredencoding \utfeight - \setnonasciicharscatcode\active - \utfeightchardefs - % - \else - \message{Unknown document encoding #1, ignoring.}% - % - \fi % utfeight - \fi % latnine - \fi % latone - \fi % lattwo - \fi % ascii -} - -% A message to be logged when using a character that isn't available -% the default font encoding (OT1). -% -\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} - -% Take account of \c (plain) vs. \, (Texinfo) difference. -\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} - -% First, make active non-ASCII characters in order for them to be -% correctly categorized when TeX reads the replacement text of -% macros containing the character definitions. -\setnonasciicharscatcode\active -% -% Latin1 (ISO-8859-1) character definitions. -\def\latonechardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\exclamdown} - \gdef^^a2{\missingcharmsg{CENT SIGN}} - \gdef^^a3{{\pounds}} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\missingcharmsg{YEN SIGN}} - \gdef^^a6{\missingcharmsg{BROKEN BAR}} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\copyright} - \gdef^^aa{\ordf} - \gdef^^ab{\guillemetleft} - \gdef^^ac{$\lnot$} - \gdef^^ad{\-} - \gdef^^ae{\registeredsymbol} - \gdef^^af{\={}} - % - \gdef^^b0{\textdegree} - \gdef^^b1{$\pm$} - \gdef^^b2{$^2$} - \gdef^^b3{$^3$} - \gdef^^b4{\'{}} - \gdef^^b5{$\mu$} - \gdef^^b6{\P} - % - \gdef^^b7{$^.$} - \gdef^^b8{\cedilla\ } - \gdef^^b9{$^1$} - \gdef^^ba{\ordm} - % - \gdef^^bb{\guillemetright} - \gdef^^bc{$1\over4$} - \gdef^^bd{$1\over2$} - \gdef^^be{$3\over4$} - \gdef^^bf{\questiondown} - % - \gdef^^c0{\`A} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\~A} - \gdef^^c4{\"A} - \gdef^^c5{\ringaccent A} - \gdef^^c6{\AE} - \gdef^^c7{\cedilla C} - \gdef^^c8{\`E} - \gdef^^c9{\'E} - \gdef^^ca{\^E} - \gdef^^cb{\"E} - \gdef^^cc{\`I} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\"I} - % - \gdef^^d0{\DH} - \gdef^^d1{\~N} - \gdef^^d2{\`O} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\~O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\O} - \gdef^^d9{\`U} - \gdef^^da{\'U} - \gdef^^db{\^U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\TH} - \gdef^^df{\ss} - % - \gdef^^e0{\`a} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\~a} - \gdef^^e4{\"a} - \gdef^^e5{\ringaccent a} - \gdef^^e6{\ae} - \gdef^^e7{\cedilla c} - \gdef^^e8{\`e} - \gdef^^e9{\'e} - \gdef^^ea{\^e} - \gdef^^eb{\"e} - \gdef^^ec{\`{\dotless i}} - \gdef^^ed{\'{\dotless i}} - \gdef^^ee{\^{\dotless i}} - \gdef^^ef{\"{\dotless i}} - % - \gdef^^f0{\dh} - \gdef^^f1{\~n} - \gdef^^f2{\`o} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\~o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\o} - \gdef^^f9{\`u} - \gdef^^fa{\'u} - \gdef^^fb{\^u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\th} - \gdef^^ff{\"y} -} - -% Latin9 (ISO-8859-15) encoding character definitions. -\def\latninechardefs{% - % Encoding is almost identical to Latin1. - \latonechardefs - % - \gdef^^a4{\euro} - \gdef^^a6{\v S} - \gdef^^a8{\v s} - \gdef^^b4{\v Z} - \gdef^^b8{\v z} - \gdef^^bc{\OE} - \gdef^^bd{\oe} - \gdef^^be{\"Y} -} - -% Latin2 (ISO-8859-2) character definitions. -\def\lattwochardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\ogonek{A}} - \gdef^^a2{\u{}} - \gdef^^a3{\L} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\v L} - \gdef^^a6{\'S} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\v S} - \gdef^^aa{\cedilla S} - \gdef^^ab{\v T} - \gdef^^ac{\'Z} - \gdef^^ad{\-} - \gdef^^ae{\v Z} - \gdef^^af{\dotaccent Z} - % - \gdef^^b0{\textdegree} - \gdef^^b1{\ogonek{a}} - \gdef^^b2{\ogonek{ }} - \gdef^^b3{\l} - \gdef^^b4{\'{}} - \gdef^^b5{\v l} - \gdef^^b6{\'s} - \gdef^^b7{\v{}} - \gdef^^b8{\cedilla\ } - \gdef^^b9{\v s} - \gdef^^ba{\cedilla s} - \gdef^^bb{\v t} - \gdef^^bc{\'z} - \gdef^^bd{\H{}} - \gdef^^be{\v z} - \gdef^^bf{\dotaccent z} - % - \gdef^^c0{\'R} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\u A} - \gdef^^c4{\"A} - \gdef^^c5{\'L} - \gdef^^c6{\'C} - \gdef^^c7{\cedilla C} - \gdef^^c8{\v C} - \gdef^^c9{\'E} - \gdef^^ca{\ogonek{E}} - \gdef^^cb{\"E} - \gdef^^cc{\v E} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\v D} - % - \gdef^^d0{\DH} - \gdef^^d1{\'N} - \gdef^^d2{\v N} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\H O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\v R} - \gdef^^d9{\ringaccent U} - \gdef^^da{\'U} - \gdef^^db{\H U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\cedilla T} - \gdef^^df{\ss} - % - \gdef^^e0{\'r} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\u a} - \gdef^^e4{\"a} - \gdef^^e5{\'l} - \gdef^^e6{\'c} - \gdef^^e7{\cedilla c} - \gdef^^e8{\v c} - \gdef^^e9{\'e} - \gdef^^ea{\ogonek{e}} - \gdef^^eb{\"e} - \gdef^^ec{\v e} - \gdef^^ed{\'{\dotless{i}}} - \gdef^^ee{\^{\dotless{i}}} - \gdef^^ef{\v d} - % - \gdef^^f0{\dh} - \gdef^^f1{\'n} - \gdef^^f2{\v n} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\H o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\v r} - \gdef^^f9{\ringaccent u} - \gdef^^fa{\'u} - \gdef^^fb{\H u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\cedilla t} - \gdef^^ff{\dotaccent{}} -} - -% UTF-8 character definitions. -% -% This code to support UTF-8 is based on LaTeX's utf8.def, with some -% changes for Texinfo conventions. It is included here under the GPL by -% permission from Frank Mittelbach and the LaTeX team. -% -\newcount\countUTFx -\newcount\countUTFy -\newcount\countUTFz - -\gdef\UTFviiiTwoOctets#1#2{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\endcsname} -% -\gdef\UTFviiiThreeOctets#1#2#3{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} -% -\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} - -\gdef\UTFviiiDefined#1{% - \ifx #1\relax - \message{\linenumber Unicode char \string #1 not defined for Texinfo}% - \else - \expandafter #1% - \fi -} - -\begingroup - \catcode`\~13 - \catcode`\"12 - - \def\UTFviiiLoop{% - \global\catcode\countUTFx\active - \uccode`\~\countUTFx - \uppercase\expandafter{\UTFviiiTmp}% - \advance\countUTFx by 1 - \ifnum\countUTFx < \countUTFy - \expandafter\UTFviiiLoop - \fi} - - \countUTFx = "C2 - \countUTFy = "E0 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiTwoOctets\string~}} - \UTFviiiLoop - - \countUTFx = "E0 - \countUTFy = "F0 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiThreeOctets\string~}} - \UTFviiiLoop - - \countUTFx = "F0 - \countUTFy = "F4 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiFourOctets\string~}} - \UTFviiiLoop -\endgroup - -\begingroup - \catcode`\"=12 - \catcode`\<=12 - \catcode`\.=12 - \catcode`\,=12 - \catcode`\;=12 - \catcode`\!=12 - \catcode`\~=13 - - \gdef\DeclareUnicodeCharacter#1#2{% - \countUTFz = "#1\relax - %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% - \begingroup - \parseXMLCharref - \def\UTFviiiTwoOctets##1##2{% - \csname u8:##1\string ##2\endcsname}% - \def\UTFviiiThreeOctets##1##2##3{% - \csname u8:##1\string ##2\string ##3\endcsname}% - \def\UTFviiiFourOctets##1##2##3##4{% - \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% - \expandafter\expandafter\expandafter\expandafter - \expandafter\expandafter\expandafter - \gdef\UTFviiiTmp{#2}% - \endgroup} - - \gdef\parseXMLCharref{% - \ifnum\countUTFz < "A0\relax - \errhelp = \EMsimple - \errmessage{Cannot define Unicode char value < 00A0}% - \else\ifnum\countUTFz < "800\relax - \parseUTFviiiA,% - \parseUTFviiiB C\UTFviiiTwoOctets.,% - \else\ifnum\countUTFz < "10000\relax - \parseUTFviiiA;% - \parseUTFviiiA,% - \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% - \else - \parseUTFviiiA;% - \parseUTFviiiA,% - \parseUTFviiiA!% - \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% - \fi\fi\fi - } - - \gdef\parseUTFviiiA#1{% - \countUTFx = \countUTFz - \divide\countUTFz by 64 - \countUTFy = \countUTFz - \multiply\countUTFz by 64 - \advance\countUTFx by -\countUTFz - \advance\countUTFx by 128 - \uccode `#1\countUTFx - \countUTFz = \countUTFy} - - \gdef\parseUTFviiiB#1#2#3#4{% - \advance\countUTFz by "#10\relax - \uccode `#3\countUTFz - \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} -\endgroup - -\def\utfeightchardefs{% - \DeclareUnicodeCharacter{00A0}{\tie} - \DeclareUnicodeCharacter{00A1}{\exclamdown} - \DeclareUnicodeCharacter{00A3}{\pounds} - \DeclareUnicodeCharacter{00A8}{\"{ }} - \DeclareUnicodeCharacter{00A9}{\copyright} - \DeclareUnicodeCharacter{00AA}{\ordf} - \DeclareUnicodeCharacter{00AB}{\guillemetleft} - \DeclareUnicodeCharacter{00AD}{\-} - \DeclareUnicodeCharacter{00AE}{\registeredsymbol} - \DeclareUnicodeCharacter{00AF}{\={ }} - - \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} - \DeclareUnicodeCharacter{00B4}{\'{ }} - \DeclareUnicodeCharacter{00B8}{\cedilla{ }} - \DeclareUnicodeCharacter{00BA}{\ordm} - \DeclareUnicodeCharacter{00BB}{\guillemetright} - \DeclareUnicodeCharacter{00BF}{\questiondown} - - \DeclareUnicodeCharacter{00C0}{\`A} - \DeclareUnicodeCharacter{00C1}{\'A} - \DeclareUnicodeCharacter{00C2}{\^A} - \DeclareUnicodeCharacter{00C3}{\~A} - \DeclareUnicodeCharacter{00C4}{\"A} - \DeclareUnicodeCharacter{00C5}{\AA} - \DeclareUnicodeCharacter{00C6}{\AE} - \DeclareUnicodeCharacter{00C7}{\cedilla{C}} - \DeclareUnicodeCharacter{00C8}{\`E} - \DeclareUnicodeCharacter{00C9}{\'E} - \DeclareUnicodeCharacter{00CA}{\^E} - \DeclareUnicodeCharacter{00CB}{\"E} - \DeclareUnicodeCharacter{00CC}{\`I} - \DeclareUnicodeCharacter{00CD}{\'I} - \DeclareUnicodeCharacter{00CE}{\^I} - \DeclareUnicodeCharacter{00CF}{\"I} - - \DeclareUnicodeCharacter{00D0}{\DH} - \DeclareUnicodeCharacter{00D1}{\~N} - \DeclareUnicodeCharacter{00D2}{\`O} - \DeclareUnicodeCharacter{00D3}{\'O} - \DeclareUnicodeCharacter{00D4}{\^O} - \DeclareUnicodeCharacter{00D5}{\~O} - \DeclareUnicodeCharacter{00D6}{\"O} - \DeclareUnicodeCharacter{00D8}{\O} - \DeclareUnicodeCharacter{00D9}{\`U} - \DeclareUnicodeCharacter{00DA}{\'U} - \DeclareUnicodeCharacter{00DB}{\^U} - \DeclareUnicodeCharacter{00DC}{\"U} - \DeclareUnicodeCharacter{00DD}{\'Y} - \DeclareUnicodeCharacter{00DE}{\TH} - \DeclareUnicodeCharacter{00DF}{\ss} - - \DeclareUnicodeCharacter{00E0}{\`a} - \DeclareUnicodeCharacter{00E1}{\'a} - \DeclareUnicodeCharacter{00E2}{\^a} - \DeclareUnicodeCharacter{00E3}{\~a} - \DeclareUnicodeCharacter{00E4}{\"a} - \DeclareUnicodeCharacter{00E5}{\aa} - \DeclareUnicodeCharacter{00E6}{\ae} - \DeclareUnicodeCharacter{00E7}{\cedilla{c}} - \DeclareUnicodeCharacter{00E8}{\`e} - \DeclareUnicodeCharacter{00E9}{\'e} - \DeclareUnicodeCharacter{00EA}{\^e} - \DeclareUnicodeCharacter{00EB}{\"e} - \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} - \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} - \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} - \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} - - \DeclareUnicodeCharacter{00F0}{\dh} - \DeclareUnicodeCharacter{00F1}{\~n} - \DeclareUnicodeCharacter{00F2}{\`o} - \DeclareUnicodeCharacter{00F3}{\'o} - \DeclareUnicodeCharacter{00F4}{\^o} - \DeclareUnicodeCharacter{00F5}{\~o} - \DeclareUnicodeCharacter{00F6}{\"o} - \DeclareUnicodeCharacter{00F8}{\o} - \DeclareUnicodeCharacter{00F9}{\`u} - \DeclareUnicodeCharacter{00FA}{\'u} - \DeclareUnicodeCharacter{00FB}{\^u} - \DeclareUnicodeCharacter{00FC}{\"u} - \DeclareUnicodeCharacter{00FD}{\'y} - \DeclareUnicodeCharacter{00FE}{\th} - \DeclareUnicodeCharacter{00FF}{\"y} - - \DeclareUnicodeCharacter{0100}{\=A} - \DeclareUnicodeCharacter{0101}{\=a} - \DeclareUnicodeCharacter{0102}{\u{A}} - \DeclareUnicodeCharacter{0103}{\u{a}} - \DeclareUnicodeCharacter{0104}{\ogonek{A}} - \DeclareUnicodeCharacter{0105}{\ogonek{a}} - \DeclareUnicodeCharacter{0106}{\'C} - \DeclareUnicodeCharacter{0107}{\'c} - \DeclareUnicodeCharacter{0108}{\^C} - \DeclareUnicodeCharacter{0109}{\^c} - \DeclareUnicodeCharacter{0118}{\ogonek{E}} - \DeclareUnicodeCharacter{0119}{\ogonek{e}} - \DeclareUnicodeCharacter{010A}{\dotaccent{C}} - \DeclareUnicodeCharacter{010B}{\dotaccent{c}} - \DeclareUnicodeCharacter{010C}{\v{C}} - \DeclareUnicodeCharacter{010D}{\v{c}} - \DeclareUnicodeCharacter{010E}{\v{D}} - - \DeclareUnicodeCharacter{0112}{\=E} - \DeclareUnicodeCharacter{0113}{\=e} - \DeclareUnicodeCharacter{0114}{\u{E}} - \DeclareUnicodeCharacter{0115}{\u{e}} - \DeclareUnicodeCharacter{0116}{\dotaccent{E}} - \DeclareUnicodeCharacter{0117}{\dotaccent{e}} - \DeclareUnicodeCharacter{011A}{\v{E}} - \DeclareUnicodeCharacter{011B}{\v{e}} - \DeclareUnicodeCharacter{011C}{\^G} - \DeclareUnicodeCharacter{011D}{\^g} - \DeclareUnicodeCharacter{011E}{\u{G}} - \DeclareUnicodeCharacter{011F}{\u{g}} - - \DeclareUnicodeCharacter{0120}{\dotaccent{G}} - \DeclareUnicodeCharacter{0121}{\dotaccent{g}} - \DeclareUnicodeCharacter{0124}{\^H} - \DeclareUnicodeCharacter{0125}{\^h} - \DeclareUnicodeCharacter{0128}{\~I} - \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} - \DeclareUnicodeCharacter{012A}{\=I} - \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} - \DeclareUnicodeCharacter{012C}{\u{I}} - \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} - - \DeclareUnicodeCharacter{0130}{\dotaccent{I}} - \DeclareUnicodeCharacter{0131}{\dotless{i}} - \DeclareUnicodeCharacter{0132}{IJ} - \DeclareUnicodeCharacter{0133}{ij} - \DeclareUnicodeCharacter{0134}{\^J} - \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} - \DeclareUnicodeCharacter{0139}{\'L} - \DeclareUnicodeCharacter{013A}{\'l} - - \DeclareUnicodeCharacter{0141}{\L} - \DeclareUnicodeCharacter{0142}{\l} - \DeclareUnicodeCharacter{0143}{\'N} - \DeclareUnicodeCharacter{0144}{\'n} - \DeclareUnicodeCharacter{0147}{\v{N}} - \DeclareUnicodeCharacter{0148}{\v{n}} - \DeclareUnicodeCharacter{014C}{\=O} - \DeclareUnicodeCharacter{014D}{\=o} - \DeclareUnicodeCharacter{014E}{\u{O}} - \DeclareUnicodeCharacter{014F}{\u{o}} - - \DeclareUnicodeCharacter{0150}{\H{O}} - \DeclareUnicodeCharacter{0151}{\H{o}} - \DeclareUnicodeCharacter{0152}{\OE} - \DeclareUnicodeCharacter{0153}{\oe} - \DeclareUnicodeCharacter{0154}{\'R} - \DeclareUnicodeCharacter{0155}{\'r} - \DeclareUnicodeCharacter{0158}{\v{R}} - \DeclareUnicodeCharacter{0159}{\v{r}} - \DeclareUnicodeCharacter{015A}{\'S} - \DeclareUnicodeCharacter{015B}{\'s} - \DeclareUnicodeCharacter{015C}{\^S} - \DeclareUnicodeCharacter{015D}{\^s} - \DeclareUnicodeCharacter{015E}{\cedilla{S}} - \DeclareUnicodeCharacter{015F}{\cedilla{s}} - - \DeclareUnicodeCharacter{0160}{\v{S}} - \DeclareUnicodeCharacter{0161}{\v{s}} - \DeclareUnicodeCharacter{0162}{\cedilla{t}} - \DeclareUnicodeCharacter{0163}{\cedilla{T}} - \DeclareUnicodeCharacter{0164}{\v{T}} - - \DeclareUnicodeCharacter{0168}{\~U} - \DeclareUnicodeCharacter{0169}{\~u} - \DeclareUnicodeCharacter{016A}{\=U} - \DeclareUnicodeCharacter{016B}{\=u} - \DeclareUnicodeCharacter{016C}{\u{U}} - \DeclareUnicodeCharacter{016D}{\u{u}} - \DeclareUnicodeCharacter{016E}{\ringaccent{U}} - \DeclareUnicodeCharacter{016F}{\ringaccent{u}} - - \DeclareUnicodeCharacter{0170}{\H{U}} - \DeclareUnicodeCharacter{0171}{\H{u}} - \DeclareUnicodeCharacter{0174}{\^W} - \DeclareUnicodeCharacter{0175}{\^w} - \DeclareUnicodeCharacter{0176}{\^Y} - \DeclareUnicodeCharacter{0177}{\^y} - \DeclareUnicodeCharacter{0178}{\"Y} - \DeclareUnicodeCharacter{0179}{\'Z} - \DeclareUnicodeCharacter{017A}{\'z} - \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} - \DeclareUnicodeCharacter{017C}{\dotaccent{z}} - \DeclareUnicodeCharacter{017D}{\v{Z}} - \DeclareUnicodeCharacter{017E}{\v{z}} - - \DeclareUnicodeCharacter{01C4}{D\v{Z}} - \DeclareUnicodeCharacter{01C5}{D\v{z}} - \DeclareUnicodeCharacter{01C6}{d\v{z}} - \DeclareUnicodeCharacter{01C7}{LJ} - \DeclareUnicodeCharacter{01C8}{Lj} - \DeclareUnicodeCharacter{01C9}{lj} - \DeclareUnicodeCharacter{01CA}{NJ} - \DeclareUnicodeCharacter{01CB}{Nj} - \DeclareUnicodeCharacter{01CC}{nj} - \DeclareUnicodeCharacter{01CD}{\v{A}} - \DeclareUnicodeCharacter{01CE}{\v{a}} - \DeclareUnicodeCharacter{01CF}{\v{I}} - - \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} - \DeclareUnicodeCharacter{01D1}{\v{O}} - \DeclareUnicodeCharacter{01D2}{\v{o}} - \DeclareUnicodeCharacter{01D3}{\v{U}} - \DeclareUnicodeCharacter{01D4}{\v{u}} - - \DeclareUnicodeCharacter{01E2}{\={\AE}} - \DeclareUnicodeCharacter{01E3}{\={\ae}} - \DeclareUnicodeCharacter{01E6}{\v{G}} - \DeclareUnicodeCharacter{01E7}{\v{g}} - \DeclareUnicodeCharacter{01E8}{\v{K}} - \DeclareUnicodeCharacter{01E9}{\v{k}} - - \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} - \DeclareUnicodeCharacter{01F1}{DZ} - \DeclareUnicodeCharacter{01F2}{Dz} - \DeclareUnicodeCharacter{01F3}{dz} - \DeclareUnicodeCharacter{01F4}{\'G} - \DeclareUnicodeCharacter{01F5}{\'g} - \DeclareUnicodeCharacter{01F8}{\`N} - \DeclareUnicodeCharacter{01F9}{\`n} - \DeclareUnicodeCharacter{01FC}{\'{\AE}} - \DeclareUnicodeCharacter{01FD}{\'{\ae}} - \DeclareUnicodeCharacter{01FE}{\'{\O}} - \DeclareUnicodeCharacter{01FF}{\'{\o}} - - \DeclareUnicodeCharacter{021E}{\v{H}} - \DeclareUnicodeCharacter{021F}{\v{h}} - - \DeclareUnicodeCharacter{0226}{\dotaccent{A}} - \DeclareUnicodeCharacter{0227}{\dotaccent{a}} - \DeclareUnicodeCharacter{0228}{\cedilla{E}} - \DeclareUnicodeCharacter{0229}{\cedilla{e}} - \DeclareUnicodeCharacter{022E}{\dotaccent{O}} - \DeclareUnicodeCharacter{022F}{\dotaccent{o}} - - \DeclareUnicodeCharacter{0232}{\=Y} - \DeclareUnicodeCharacter{0233}{\=y} - \DeclareUnicodeCharacter{0237}{\dotless{j}} - - \DeclareUnicodeCharacter{02DB}{\ogonek{ }} - - \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} - \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} - \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} - \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} - \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} - \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} - \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} - \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} - \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} - \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} - \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} - \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} - - \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} - \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} - - \DeclareUnicodeCharacter{1E20}{\=G} - \DeclareUnicodeCharacter{1E21}{\=g} - \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} - \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} - \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} - \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} - \DeclareUnicodeCharacter{1E26}{\"H} - \DeclareUnicodeCharacter{1E27}{\"h} - - \DeclareUnicodeCharacter{1E30}{\'K} - \DeclareUnicodeCharacter{1E31}{\'k} - \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} - \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} - \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} - \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} - \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} - \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} - \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} - \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} - \DeclareUnicodeCharacter{1E3E}{\'M} - \DeclareUnicodeCharacter{1E3F}{\'m} - - \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} - \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} - \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} - \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} - \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} - \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} - \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} - \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} - \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} - \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} - - \DeclareUnicodeCharacter{1E54}{\'P} - \DeclareUnicodeCharacter{1E55}{\'p} - \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} - \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} - \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} - \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} - \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} - \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} - \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} - \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} - - \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} - \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} - \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} - \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} - \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} - \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} - \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} - \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} - \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} - \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} - - \DeclareUnicodeCharacter{1E7C}{\~V} - \DeclareUnicodeCharacter{1E7D}{\~v} - \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} - \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} - - \DeclareUnicodeCharacter{1E80}{\`W} - \DeclareUnicodeCharacter{1E81}{\`w} - \DeclareUnicodeCharacter{1E82}{\'W} - \DeclareUnicodeCharacter{1E83}{\'w} - \DeclareUnicodeCharacter{1E84}{\"W} - \DeclareUnicodeCharacter{1E85}{\"w} - \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} - \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} - \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} - \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} - \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} - \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} - \DeclareUnicodeCharacter{1E8C}{\"X} - \DeclareUnicodeCharacter{1E8D}{\"x} - \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} - \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} - - \DeclareUnicodeCharacter{1E90}{\^Z} - \DeclareUnicodeCharacter{1E91}{\^z} - \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} - \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} - \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} - \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} - \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} - \DeclareUnicodeCharacter{1E97}{\"t} - \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} - \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} - - \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} - \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} - - \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} - \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} - \DeclareUnicodeCharacter{1EBC}{\~E} - \DeclareUnicodeCharacter{1EBD}{\~e} - - \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} - \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} - \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} - \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} - - \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} - \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} - - \DeclareUnicodeCharacter{1EF2}{\`Y} - \DeclareUnicodeCharacter{1EF3}{\`y} - \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} - - \DeclareUnicodeCharacter{1EF8}{\~Y} - \DeclareUnicodeCharacter{1EF9}{\~y} - - \DeclareUnicodeCharacter{2013}{--} - \DeclareUnicodeCharacter{2014}{---} - \DeclareUnicodeCharacter{2018}{\quoteleft} - \DeclareUnicodeCharacter{2019}{\quoteright} - \DeclareUnicodeCharacter{201A}{\quotesinglbase} - \DeclareUnicodeCharacter{201C}{\quotedblleft} - \DeclareUnicodeCharacter{201D}{\quotedblright} - \DeclareUnicodeCharacter{201E}{\quotedblbase} - \DeclareUnicodeCharacter{2022}{\bullet} - \DeclareUnicodeCharacter{2026}{\dots} - \DeclareUnicodeCharacter{2039}{\guilsinglleft} - \DeclareUnicodeCharacter{203A}{\guilsinglright} - \DeclareUnicodeCharacter{20AC}{\euro} - - \DeclareUnicodeCharacter{2192}{\expansion} - \DeclareUnicodeCharacter{21D2}{\result} - - \DeclareUnicodeCharacter{2212}{\minus} - \DeclareUnicodeCharacter{2217}{\point} - \DeclareUnicodeCharacter{2261}{\equiv} -}% end of \utfeightchardefs - - -% US-ASCII character definitions. -\def\asciichardefs{% nothing need be done - \relax -} - -% Make non-ASCII characters printable again for compatibility with -% existing Texinfo documents that may use them, even without declaring a -% document encoding. -% -\setnonasciicharscatcode \other - - -\message{formatting,} - -\newdimen\defaultparindent \defaultparindent = 15pt - -\chapheadingskip = 15pt plus 4pt minus 2pt -\secheadingskip = 12pt plus 3pt minus 2pt -\subsecheadingskip = 9pt plus 2pt minus 2pt - -% Prevent underfull vbox error messages. -\vbadness = 10000 - -% Don't be very finicky about underfull hboxes, either. -\hbadness = 6666 - -% Following George Bush, get rid of widows and orphans. -\widowpenalty=10000 -\clubpenalty=10000 - -% Use TeX 3.0's \emergencystretch to help line breaking, but if we're -% using an old version of TeX, don't do anything. We want the amount of -% stretch added to depend on the line length, hence the dependence on -% \hsize. We call this whenever the paper size is set. -% -\def\setemergencystretch{% - \ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% - \else - \emergencystretch = .15\hsize - \fi -} - -% Parameters in order: 1) textheight; 2) textwidth; -% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; -% 7) physical page height; 8) physical page width. -% -% We also call \setleading{\textleading}, so the caller should define -% \textleading. The caller should also set \parskip. -% -\def\internalpagesizes#1#2#3#4#5#6#7#8{% - \voffset = #3\relax - \topskip = #6\relax - \splittopskip = \topskip - % - \vsize = #1\relax - \advance\vsize by \topskip - \outervsize = \vsize - \advance\outervsize by 2\topandbottommargin - \pageheight = \vsize - % - \hsize = #2\relax - \outerhsize = \hsize - \advance\outerhsize by 0.5in - \pagewidth = \hsize - % - \normaloffset = #4\relax - \bindingoffset = #5\relax - % - \ifpdf - \pdfpageheight #7\relax - \pdfpagewidth #8\relax - % if we don't reset these, they will remain at "1 true in" of - % whatever layout pdftex was dumped with. - \pdfhorigin = 1 true in - \pdfvorigin = 1 true in - \fi - % - \setleading{\textleading} - % - \parindent = \defaultparindent - \setemergencystretch -} - -% @letterpaper (the default). -\def\letterpaper{{\globaldefs = 1 - \parskip = 3pt plus 2pt minus 1pt - \textleading = 13.2pt - % - % If page is nothing but text, make it come out even. - \internalpagesizes{607.2pt}{6in}% that's 46 lines - {\voffset}{.25in}% - {\bindingoffset}{36pt}% - {11in}{8.5in}% -}} - -% Use @smallbook to reset parameters for 7x9.25 trim size. -\def\smallbook{{\globaldefs = 1 - \parskip = 2pt plus 1pt - \textleading = 12pt - % - \internalpagesizes{7.5in}{5in}% - {-.2in}{0in}% - {\bindingoffset}{16pt}% - {9.25in}{7in}% - % - \lispnarrowing = 0.3in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = .5cm -}} - -% Use @smallerbook to reset parameters for 6x9 trim size. -% (Just testing, parameters still in flux.) -\def\smallerbook{{\globaldefs = 1 - \parskip = 1.5pt plus 1pt - \textleading = 12pt - % - \internalpagesizes{7.4in}{4.8in}% - {-.2in}{-.4in}% - {0pt}{14pt}% - {9in}{6in}% - % - \lispnarrowing = 0.25in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = .4cm -}} - -% Use @afourpaper to print on European A4 paper. -\def\afourpaper{{\globaldefs = 1 - \parskip = 3pt plus 2pt minus 1pt - \textleading = 13.2pt - % - % Double-side printing via postscript on Laserjet 4050 - % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. - % To change the settings for a different printer or situation, adjust - % \normaloffset until the front-side and back-side texts align. Then - % do the same for \bindingoffset. You can set these for testing in - % your texinfo source file like this: - % @tex - % \global\normaloffset = -6mm - % \global\bindingoffset = 10mm - % @end tex - \internalpagesizes{673.2pt}{160mm}% that's 51 lines - {\voffset}{\hoffset}% - {\bindingoffset}{44pt}% - {297mm}{210mm}% - % - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = 5mm -}} - -% Use @afivepaper to print on European A5 paper. -% From romildo@urano.iceb.ufop.br, 2 July 2000. -% He also recommends making @example and @lisp be small. -\def\afivepaper{{\globaldefs = 1 - \parskip = 2pt plus 1pt minus 0.1pt - \textleading = 12.5pt - % - \internalpagesizes{160mm}{120mm}% - {\voffset}{\hoffset}% - {\bindingoffset}{8pt}% - {210mm}{148mm}% - % - \lispnarrowing = 0.2in - \tolerance = 800 - \hfuzz = 1.2pt - \contentsrightmargin = 0pt - \defbodyindent = 2mm - \tableindent = 12mm -}} - -% A specific text layout, 24x15cm overall, intended for A4 paper. -\def\afourlatex{{\globaldefs = 1 - \afourpaper - \internalpagesizes{237mm}{150mm}% - {\voffset}{4.6mm}% - {\bindingoffset}{7mm}% - {297mm}{210mm}% - % - % Must explicitly reset to 0 because we call \afourpaper. - \globaldefs = 0 -}} - -% Use @afourwide to print on A4 paper in landscape format. -\def\afourwide{{\globaldefs = 1 - \afourpaper - \internalpagesizes{241mm}{165mm}% - {\voffset}{-2.95mm}% - {\bindingoffset}{7mm}% - {297mm}{210mm}% - \globaldefs = 0 -}} - -% @pagesizes TEXTHEIGHT[,TEXTWIDTH] -% Perhaps we should allow setting the margins, \topskip, \parskip, -% and/or leading, also. Or perhaps we should compute them somehow. -% -\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} -\def\pagesizesyyy#1,#2,#3\finish{{% - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi - \globaldefs = 1 - % - \parskip = 3pt plus 2pt minus 1pt - \setleading{\textleading}% - % - \dimen0 = #1\relax - \advance\dimen0 by \voffset - % - \dimen2 = \hsize - \advance\dimen2 by \normaloffset - % - \internalpagesizes{#1}{\hsize}% - {\voffset}{\normaloffset}% - {\bindingoffset}{44pt}% - {\dimen0}{\dimen2}% -}} - -% Set default to letter. -% -\letterpaper - - -\message{and turning on texinfo input format.} - -\def^^L{\par} % remove \outer, so ^L can appear in an @comment - -% DEL is a comment character, in case @c does not suffice. -\catcode`\^^? = 14 - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other \def\normaldoublequote{"} -\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix -\catcode`\+=\other \def\normalplus{+} -\catcode`\<=\other \def\normalless{<} -\catcode`\>=\other \def\normalgreater{>} -\catcode`\^=\other \def\normalcaret{^} -\catcode`\_=\other \def\normalunderscore{_} -\catcode`\|=\other \def\normalverticalbar{|} -\catcode`\~=\other \def\normaltilde{~} - -% This macro is used to make a character print one way in \tt -% (where it can probably be output as-is), and another way in other fonts, -% where something hairier probably needs to be done. -% -% #1 is what to print if we are indeed using \tt; #2 is what to print -% otherwise. Since all the Computer Modern typewriter fonts have zero -% interword stretch (and shrink), and it is reasonable to expect all -% typewriter fonts to have this, we can check that font parameter. -% -\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} - -% Same as above, but check for italic font. Actually this also catches -% non-italic slanted fonts since it is impossible to distinguish them from -% italic fonts. But since this is only used by $ and it uses \sl anyway -% this is not a problem. -\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} - -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). -% Most of these we simply print from the \tt font, but for some, we can -% use math or other variants that look better in normal text. - -\catcode`\"=\active -\def\activedoublequote{{\tt\char34}} -\let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} -\chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} - -\catcode`\_=\active -\def_{\ifusingtt\normalunderscore\_} -\let\realunder=_ -% Subroutine for the previous macro. -\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } - -\catcode`\|=\active -\def|{{\tt\char124}} -\chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} -\chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix - -% If a .fmt file is being used, characters that might appear in a file -% name cannot be active until we have parsed the command line. -% So turn them off again, and have \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} - -% Used sometimes to turn off (effectively) the active characters even after -% parsing them. -\def\turnoffactive{% - \normalturnoffactive - \otherbackslash -} - -\catcode`\@=0 - -% \backslashcurfont outputs one backslash character in current font, -% as in \char`\\. -\global\chardef\backslashcurfont=`\\ -\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work - -% \realbackslash is an actual character `\' with catcode other, and -% \doublebackslash is two of them (for the pdf outlines). -{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} - -% In texinfo, backslash is an active character; it prints the backslash -% in fixed width font. -\catcode`\\=\active % @ for escape char from now on. - -% The story here is that in math mode, the \char of \backslashcurfont -% ends up printing the roman \ from the math symbol font (because \char -% in math mode uses the \mathcode, and plain.tex sets -% \mathcode`\\="026E). It seems better for @backslashchar{} to always -% print a typewriter backslash, hence we use an explicit \mathchar, -% which is the decimal equivalent of "715c (class 7, e.g., use \fam; -% ignored family value; char position "5C). We can't use " for the -% usual hex value because it has already been made active. -@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} -@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. - -% On startup, @fixbackslash assigns: -% @let \ = @normalbackslash -% \rawbackslash defines an active \ to do \backslashcurfont. -% \otherbackslash defines an active \ to be a literal `\' character with -% catcode other. We switch back and forth between these. -@gdef@rawbackslash{@let\=@backslashcurfont} -@gdef@otherbackslash{@let\=@realbackslash} - -% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of -% the literal character `\'. Also revert - to its normal character, in -% case the active - from code has slipped in. -% -{@catcode`- = @active - @gdef@normalturnoffactive{% - @let-=@normaldash - @let"=@normaldoublequote - @let$=@normaldollar %$ font-lock fix - @let+=@normalplus - @let<=@normalless - @let>=@normalgreater - @let\=@normalbackslash - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let~=@normaltilde - @markupsetuplqdefault - @markupsetuprqdefault - @unsepspaces - } -} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive - -% If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing -% a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput - -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\' in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also turn back on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -% -@gdef@fixbackslash{% - @ifx\@eatinput @let\ = @normalbackslash @fi - @catcode`+=@active - @catcode`@_=@active -} - -% Say @foo, not \foo, in error messages. -@escapechar = `@@ - -% These (along with & and #) are made active for url-breaking, so need -% active definitions as the normal characters. -@def@normaldot{.} -@def@normalquest{?} -@def@normalslash{/} - -% These look ok in all fonts, so just make them not special. -% @hashchar{} gets its own user-level command, because of #line. -@catcode`@& = @other @def@normalamp{&} -@catcode`@# = @other @def@normalhash{#} -@catcode`@% = @other @def@normalpercent{%} - -@let @hashchar = @normalhash - -@c Finally, make ` and ' active, so that txicodequoteundirected and -@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we -@c don't make ` and ' active, @code will not get them as active chars. -@c Do this last of all since we use ` in the previous @catcode assignments. -@catcode`@'=@active -@catcode`@`=@active -@markupsetuplqdefault -@markupsetuprqdefault - -@c Local variables: -@c eval: (add-hook 'write-file-hooks 'time-stamp) -@c page-delimiter: "^\\\\message" -@c time-stamp-start: "def\\\\texinfoversion{" -@c time-stamp-format: "%:y-%02m-%02d.%02H" -@c time-stamp-end: "}" -@c End: - -@c vim:sw=2: - -@ignore - arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 -@end ignore diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/LICENSE b/third_party/python/Modules/_ctypes/libffi_msvc/LICENSE deleted file mode 100644 index f59179515..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -libffi - Copyright (c) 1996-2003 Red Hat, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/README b/third_party/python/Modules/_ctypes/libffi_msvc/README deleted file mode 100644 index 1fc27470d..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/README +++ /dev/null @@ -1,500 +0,0 @@ -This directory contains the libffi package, which is not part of GCC but -shipped with GCC as convenience. - -Status -====== - -libffi-2.00 has not been released yet! This is a development snapshot! - -libffi-1.20 was released on October 5, 1998. Check the libffi web -page for updates: . - - -What is libffi? -=============== - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling -convention". The "calling convention" is essentially a set of -assumptions made by the compiler about where function arguments will -be found on entry to a function. A "calling convention" also specifies -where the return value for a function is found. - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. Libffi can be used in such programs to provide a -bridge from the interpreter program to compiled code. - -The libffi library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -Ffi stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code -written in one language to call code written in another language. The -libffi library really only provides the lowest, machine dependent -layer of a fully featured foreign function interface. A layer must -exist above libffi that handles type conversions for values passed -between the two languages. - - -Supported Platforms and Prerequisites -===================================== - -Libffi has been ported to: - - SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) - - Irix 5.3 & 6.2 (System V/o32 & n32) - - Intel x86 - Linux (System V ABI) - - Alpha - Linux and OSF/1 - - m68k - Linux (System V ABI) - - PowerPC - Linux (System V ABI, Darwin, AIX) - - ARM - Linux (System V ABI) - -Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are -that other versions will work. Libffi has also been built and tested -with the SGI compiler tools. - -On PowerPC, the tests failed (see the note below). - -You must use GNU make to build libffi. SGI's make will not work. -Sun's probably won't either. - -If you port libffi to another platform, please let me know! I assume -that some will be easy (x86 NetBSD), and others will be more difficult -(HP). - - -Installing libffi -================= - -[Note: before actually performing any of these installation steps, - you may wish to read the "Platform Specific Notes" below.] - -First you must configure the distribution for your particular -system. Go to the directory you wish to build libffi in and run the -"configure" program found in the root directory of the libffi source -distribution. - -You may want to tell configure where to install the libffi library and -header files. To do that, use the --prefix configure switch. Libffi -will install under /usr/local by default. - -If you want to enable extra run-time debugging checks use the the ---enable-debug configure switch. This is useful when your program dies -mysteriously while using libffi. - -Another useful configure switch is --enable-purify-safety. Using this -will add some extra code which will suppress certain warnings when you -are using Purify with libffi. Only use this switch when using -Purify, as it will slow down the library. - -Configure has many other options. Use "configure --help" to see them all. - -Once configure has finished, type "make". Note that you must be using -GNU make. SGI's make will not work. Sun's probably won't either. -You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. - -To ensure that libffi is working as advertised, type "make test". - -To install the library and header files, type "make install". - - -Using libffi -============ - - The Basics - ---------- - -Libffi assumes that you have a pointer to the function you wish to -call and that you know the number and types of arguments to pass it, -as well as the return type of the function. - -The first thing you must do is create an ffi_cif object that matches -the signature of the function you wish to call. The cif in ffi_cif -stands for Call InterFace. To prepare a call interface object, use the -following function: - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, ffi_type **atypes); - - CIF is a pointer to the call interface object you wish - to initialize. - - ABI is an enum that specifies the calling convention - to use for the call. FFI_DEFAULT_ABI defaults - to the system's native calling convention. Other - ABI's may be used with care. They are system - specific. - - NARGS is the number of arguments this function accepts. - libffi does not yet support vararg functions. - - RTYPE is a pointer to an ffi_type structure that represents - the return type of the function. Ffi_type objects - describe the types of values. libffi provides - ffi_type objects for many of the native C types: - signed int, unsigned int, signed char, unsigned char, - etc. There is also a pointer ffi_type object and - a void ffi_type. Use &ffi_type_void for functions that - don't return values. - - ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. - If NARGS is 0, this is ignored. - - -ffi_prep_cif will return a status code that you are responsible -for checking. It will be one of the following: - - FFI_OK - All is good. - - FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif - came across is bad. - - -Before making the call, the VALUES vector should be initialized -with pointers to the appropriate argument values. - -To call the the function using the initialized ffi_cif, use the -ffi_call function: - -void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); - - CIF is a pointer to the ffi_cif initialized specifically - for this function. - - FN is a pointer to the function you want to call. - - RVALUE is a pointer to a chunk of memory that is to hold the - result of the function call. Currently, it must be - at least one word in size (except for the n32 version - under Irix 6.x, which must be a pointer to an 8 byte - aligned value (a long long). It must also be at least - word aligned (depending on the return type, and the - system's alignment requirements). If RTYPE is - &ffi_type_void, this is ignored. If RVALUE is NULL, - the return value is discarded. - - AVALUES is a vector of void* that point to the memory locations - holding the argument values for a call. - If NARGS is 0, this is ignored. - - -If you are expecting a return value from FN it will have been stored -at RVALUE. - - - - An Example - ---------- - -Here is a trivial example that calls puts() a few times. - - #include - #include - - int main() - { - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - int rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_uint; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint, args) == FFI_OK) - { - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - } - - return 0; - } - - - - Aggregate Types - --------------- - -Although libffi has no special support for unions or bit-fields, it is -perfectly happy passing structures back and forth. You must first -describe the structure to libffi by creating a new ffi_type object -for it. Here is the definition of ffi_type: - - typedef struct _ffi_type - { - unsigned size; - short alignment; - short type; - struct _ffi_type **elements; - } ffi_type; - -All structures must have type set to FFI_TYPE_STRUCT. You may set -size and alignment to 0. These will be calculated and reset to the -appropriate values by ffi_prep_cif(). - -elements is a NULL terminated array of pointers to ffi_type objects -that describe the type of the structure elements. These may, in turn, -be structure elements. - -The following example initializes a ffi_type object representing the -tm struct from Linux's time.h: - - struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; - }; - - { - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - } - - - -Platform Specific Notes -======================= - - Intel x86 - --------- - -There are no known problems with the x86 port. - - Sun SPARC - SunOS 4.1.3 & Solaris 2.x - ------------------------------------- - -You must use GNU Make to build libffi on Sun platforms. - - MIPS - Irix 5.3 & 6.x - --------------------- - -Irix 6.2 and better supports three different calling conventions: o32, -n32 and n64. Currently, libffi only supports both o32 and n32 under -Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be -configured for whichever calling convention it was built for. - -By default, the configure script will try to build libffi with the GNU -development tools. To build libffi with the SGI development tools, set -the environment variable CC to either "cc -32" or "cc -n32" before -running configure under Irix 6.x (depending on whether you want an o32 -or n32 library), or just "cc" for Irix 5.3. - -With the n32 calling convention, when returning structures smaller -than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. -Here's one way of forcing this: - - double struct_storage[2]; - my_small_struct *s = (my_small_struct *) struct_storage; - /* Use s for RVALUE */ - -If you don't do this you are liable to get spurious bus errors. - -"long long" values are not supported yet. - -You must use GNU Make to build libffi on SGI platforms. - - ARM - System V ABI - ------------------ - -The ARM port was performed on a NetWinder running ARM Linux ELF -(2.0.31) and gcc 2.8.1. - - - - PowerPC System V ABI - -------------------- - -There are two `System V ABI's which libffi implements for PowerPC. -They differ only in how small structures are returned from functions. - -In the FFI_SYSV version, structures that are 8 bytes or smaller are -returned in registers. This is what GCC does when it is configured -for solaris, and is what the System V ABI I have (dated September -1995) says. - -In the FFI_GCC_SYSV version, all structures are returned the same way: -by passing a pointer as the first argument to the function. This is -what GCC does when it is configured for linux or a generic sysv -target. - -EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a -inconsistency with the SysV ABI: When a procedure is called with many -floating-point arguments, some of them get put on the stack. They are -all supposed to be stored in double-precision format, even if they are -only single-precision, but EGCS stores single-precision arguments as -single-precision anyway. This causes one test to fail (the `many -arguments' test). - - -What's With The Crazy Comments? -=============================== - -You might notice a number of cryptic comments in the code, delimited -by /*@ and @*/. These are annotations read by the program LCLint, a -tool for statically checking C programs. You can read all about it at -. - - -History -======= - -1.20 Oct-5-98 - Raffaele Sena produces ARM port. - -1.19 Oct-5-98 - Fixed x86 long double and long long return support. - m68k bug fixes from Andreas Schwab. - Patch for DU assembler compatibility for the Alpha from Richard - Henderson. - -1.18 Apr-17-98 - Bug fixes and MIPS configuration changes. - -1.17 Feb-24-98 - Bug fixes and m68k port from Andreas Schwab. PowerPC port from - Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. - -1.16 Feb-11-98 - Richard Henderson produces Alpha port. - -1.15 Dec-4-97 - Fixed an n32 ABI bug. New libtool, auto* support. - -1.14 May-13-97 - libtool is now used to generate shared and static libraries. - Fixed a minor portability problem reported by Russ McManus - . - -1.13 Dec-2-96 - Added --enable-purify-safety to keep Purify from complaining - about certain low level code. - Sparc fix for calling functions with < 6 args. - Linux x86 a.out fix. - -1.12 Nov-22-96 - Added missing ffi_type_void, needed for supporting void return - types. Fixed test case for non MIPS machines. Cygnus Support - is now Cygnus Solutions. - -1.11 Oct-30-96 - Added notes about GNU make. - -1.10 Oct-29-96 - Added configuration fix for non GNU compilers. - -1.09 Oct-29-96 - Added --enable-debug configure switch. Clean-ups based on LCLint - feedback. ffi_mips.h is always installed. Many configuration - fixes. Fixed ffitest.c for sparc builds. - -1.08 Oct-15-96 - Fixed n32 problem. Many clean-ups. - -1.07 Oct-14-96 - Gordon Irlam rewrites v8.S again. Bug fixes. - -1.06 Oct-14-96 - Gordon Irlam improved the sparc port. - -1.05 Oct-14-96 - Interface changes based on feedback. - -1.04 Oct-11-96 - Sparc port complete (modulo struct passing bug). - -1.03 Oct-10-96 - Passing struct args, and returning struct values works for - all architectures/calling conventions. Expanded tests. - -1.02 Oct-9-96 - Added SGI n32 support. Fixed bugs in both o32 and Linux support. - Added "make test". - -1.01 Oct-8-96 - Fixed float passing bug in mips version. Restructured some - of the code. Builds cleanly with SGI tools. - -1.00 Oct-7-96 - First release. No public announcement. - - -Authors & Credits -================= - -libffi was written by Anthony Green . - -Portions of libffi were derived from Gianni Mariani's free gencall -library for Silicon Graphics machines. - -The closure mechanism was designed and implemented by Kresten Krab -Thorup. - -The Sparc port was derived from code contributed by the fine folks at -Visible Decisions Inc . Further enhancements were -made by Gordon Irlam at Cygnus Solutions . - -The Alpha port was written by Richard Henderson at Cygnus Solutions. - -Andreas Schwab ported libffi to m68k Linux and provided a number of -bug fixes. - -Geoffrey Keating ported libffi to the PowerPC. - -Raffaele Sena ported libffi to the ARM. - -Jesper Skov and Andrew Haley both did more than their fair share of -stepping through the code and tracking down bugs. - -Thanks also to Tom Tromey for bug fixes and configuration help. - -Thanks to Jim Blandy, who provided some useful feedback on the libffi -interface. - -If you have a problem, or have found a bug, please send a note to -green@cygnus.com. diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/README.ctypes b/third_party/python/Modules/_ctypes/libffi_msvc/README.ctypes deleted file mode 100644 index 17e8a40b8..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/README.ctypes +++ /dev/null @@ -1,7 +0,0 @@ -The purpose is to hack the libffi sources so that they can be compiled -with MSVC, and to extend them so that they have the features I need -for ctypes. - -I retrieved the libffi sources from the gcc cvs repository on -2004-01-27. Then I did 'configure' in a 'build' subdirectory on a x86 -linux system, and copied the files I found useful. diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/ffi.c b/third_party/python/Modules/_ctypes/libffi_msvc/ffi.c deleted file mode 100644 index d202b158b..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/ffi.c +++ /dev/null @@ -1,530 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2002 Bo Thorsen - Copyright (c) 2002 Roger Sayle - - x86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -extern void Py_FatalError(const char *msg); - -/*@-exportheader@*/ -void ffi_prep_args(char *stack, extended_cif *ecif) -/*@=exportheader@*/ -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += sizeof(void *); - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(void *) - 1) & (size_t) argp) - argp = (char *) ALIGN(argp, sizeof(void *)); - - z = (*p_arg)->size; - if (z < sizeof(intptr_t)) - { - z = sizeof(intptr_t); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(intptr_t *) argp = (intptr_t)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(uintptr_t *) argp = (uintptr_t)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(intptr_t *) argp = (intptr_t)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(uintptr_t *) argp = (uintptr_t)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(intptr_t *) argp = (intptr_t)*(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: - *(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_FLOAT: - *(uintptr_t *) argp = 0; - *(float *) argp = *(float *)(* p_argv); - break; - - // 64-bit value cases should never be used for x86 and AMD64 builds - case FFI_TYPE_SINT64: - *(intptr_t *) argp = (intptr_t)*(SINT64 *)(* p_argv); - break; - - case FFI_TYPE_UINT64: - *(uintptr_t *) argp = (uintptr_t)*(UINT64 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_DOUBLE: - *(uintptr_t *) argp = 0; - *(double *) argp = *(double *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } -#ifdef _WIN64 - else if (z > 8) - { - /* On Win64, if a single argument takes more than 8 bytes, - then it is always passed by reference. */ - *(void **)argp = *p_argv; - z = 8; - } -#endif - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } - - if (argp >= stack && (unsigned)(argp - stack) > ecif->cif->bytes) - { - Py_FatalError("FFI BUG: not enough stack space for arguments"); - } - return; -} - -/* -Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx -To be returned by value in RAX, user-defined types must have a length -of 1, 2, 4, 8, 16, 32, or 64 bits -*/ -int can_return_struct_as_int(size_t s) -{ - return s == 1 || s == 2 || s == 4; -} - -int can_return_struct_as_sint64(size_t s) -{ - return s == 8; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - /* MSVC returns small structures in registers. Put in cif->flags - the value FFI_TYPE_STRUCT only if the structure is big enough; - otherwise, put the 4- or 8-bytes integer type. */ - if (can_return_struct_as_int(cif->rtype->size)) - cif->flags = FFI_TYPE_INT; - else if (can_return_struct_as_sint64(cif->rtype->size)) - cif->flags = FFI_TYPE_SINT64; - else - cif->flags = FFI_TYPE_STRUCT; - break; - - case FFI_TYPE_UINT64: -#ifdef _WIN64 - case FFI_TYPE_POINTER: -#endif - cif->flags = FFI_TYPE_SINT64; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -#ifdef _WIN32 -extern int -ffi_call_x86(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, - /*@out@*/ unsigned *, - void (*fn)()); -#endif - -#ifdef _WIN64 -extern int -ffi_call_AMD64(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, - /*@out@*/ unsigned *, - void (*fn)()); -#endif - -int -ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - /*@-sysunrecog@*/ - ecif.rvalue = alloca(cif->rtype->size); - /*@=sysunrecog@*/ - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { -#if !defined(_WIN64) - case FFI_SYSV: - case FFI_STDCALL: - return ffi_call_x86(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; -#else - case FFI_SYSV: - /* If a single argument takes more than 8 bytes, - then a copy is passed by reference. */ - for (unsigned i = 0; i < cif->nargs; i++) { - size_t z = cif->arg_types[i]->size; - if (z > 8) { - void *temp = alloca(z); - memcpy(temp, avalue[i], z); - avalue[i] = temp; - } - } - /*@-usedef@*/ - return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - /*@=usedef@*/ - break; -#endif - - default: - FFI_ASSERT(0); - break; - } - return -1; /* theller: Hrm. */ -} - - -/** private members **/ - -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif); -/* This function is jumped to by the trampoline */ - -#ifdef _WIN64 -void * -#else -static void __fastcall -#endif -ffi_closure_SYSV (ffi_closure *closure, char *argp) -{ - // this is our return value storage - long double res; - - // our various things... - ffi_cif *cif; - void **arg_area; - unsigned short rtype; - void *resp = (void*)&res; - void *args = argp + sizeof(void*); - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, (void**)&resp, arg_area, cif); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - rtype = cif->flags; - -#if defined(_WIN32) && !defined(_WIN64) -#ifdef _MSC_VER - /* now, do a generic return based on the value of rtype */ - if (rtype == FFI_TYPE_INT) - { - _asm mov eax, resp ; - _asm mov eax, [eax] ; - } - else if (rtype == FFI_TYPE_FLOAT) - { - _asm mov eax, resp ; - _asm fld DWORD PTR [eax] ; -// asm ("flds (%0)" : : "r" (resp) : "st" ); - } - else if (rtype == FFI_TYPE_DOUBLE) - { - _asm mov eax, resp ; - _asm fld QWORD PTR [eax] ; -// asm ("fldl (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_LONGDOUBLE) - { -// asm ("fldt (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_SINT64) - { - _asm mov edx, resp ; - _asm mov eax, [edx] ; - _asm mov edx, [edx + 4] ; -// asm ("movl 0(%0),%%eax;" -// "movl 4(%0),%%edx" -// : : "r"(resp) -// : "eax", "edx"); - } -#else - /* now, do a generic return based on the value of rtype */ - if (rtype == FFI_TYPE_INT) - { - asm ("movl (%0),%%eax" : : "r" (resp) : "eax"); - } - else if (rtype == FFI_TYPE_FLOAT) - { - asm ("flds (%0)" : : "r" (resp) : "st" ); - } - else if (rtype == FFI_TYPE_DOUBLE) - { - asm ("fldl (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_LONGDOUBLE) - { - asm ("fldt (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_SINT64) - { - asm ("movl 0(%0),%%eax;" - "movl 4(%0),%%edx" - : : "r"(resp) - : "eax", "edx"); - } -#endif -#endif - -#ifdef _WIN64 - /* The result is returned in rax. This does the right thing for - result types except for floats; we have to 'mov xmm0, rax' in the - caller to correct this. - */ - return *(void **)resp; -#endif -} - -/*@-exportheader@*/ -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif) -/*@=exportheader@*/ -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( cif->rtype->type == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) argp; - argp += sizeof(void *); - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(char *) - 1) & (size_t) argp) { - argp = (char *) ALIGN(argp, sizeof(char*)); - } - - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - -#ifdef _WIN64 - if (z > 8) { - /* On Win64, if a single argument takes more than 8 bytes, - * then it is always passed by reference. - */ - *p_argv = *((void**) argp); - z = 8; - } - else -#endif - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/* the cif must already be prep'ed */ -extern void ffi_closure_OUTER(); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - short bytes; - char *tramp; -#ifdef _WIN64 - int mask = 0; -#endif - FFI_ASSERT (cif->abi == FFI_SYSV); - - if (cif->abi == FFI_SYSV) - bytes = 0; -#if !defined(_WIN64) - else if (cif->abi == FFI_STDCALL) - bytes = cif->bytes; -#endif - else - return FFI_BAD_ABI; - - tramp = &closure->tramp[0]; - -#define BYTES(text) memcpy(tramp, text, sizeof(text)), tramp += sizeof(text)-1 -#define POINTER(x) *(void**)tramp = (void*)(x), tramp += sizeof(void*) -#define SHORT(x) *(short*)tramp = x, tramp += sizeof(short) -#define INT(x) *(int*)tramp = x, tramp += sizeof(int) - -#ifdef _WIN64 - if (cif->nargs >= 1 && - (cif->arg_types[0]->type == FFI_TYPE_FLOAT - || cif->arg_types[0]->type == FFI_TYPE_DOUBLE)) - mask |= 1; - if (cif->nargs >= 2 && - (cif->arg_types[1]->type == FFI_TYPE_FLOAT - || cif->arg_types[1]->type == FFI_TYPE_DOUBLE)) - mask |= 2; - if (cif->nargs >= 3 && - (cif->arg_types[2]->type == FFI_TYPE_FLOAT - || cif->arg_types[2]->type == FFI_TYPE_DOUBLE)) - mask |= 4; - if (cif->nargs >= 4 && - (cif->arg_types[3]->type == FFI_TYPE_FLOAT - || cif->arg_types[3]->type == FFI_TYPE_DOUBLE)) - mask |= 8; - - /* 41 BB ---- mov r11d,mask */ - BYTES("\x41\xBB"); INT(mask); - - /* 48 B8 -------- mov rax, closure */ - BYTES("\x48\xB8"); POINTER(closure); - - /* 49 BA -------- mov r10, ffi_closure_OUTER */ - BYTES("\x49\xBA"); POINTER(ffi_closure_OUTER); - - /* 41 FF E2 jmp r10 */ - BYTES("\x41\xFF\xE2"); - -#else - - /* mov ecx, closure */ - BYTES("\xb9"); POINTER(closure); - - /* mov edx, esp */ - BYTES("\x8b\xd4"); - - /* call ffi_closure_SYSV */ - BYTES("\xe8"); POINTER((char*)&ffi_closure_SYSV - (tramp + 4)); - - /* ret bytes */ - BYTES("\xc2"); - SHORT(bytes); - -#endif - - if (tramp - &closure->tramp[0] > FFI_TRAMPOLINE_SIZE) - Py_FatalError("FFI_TRAMPOLINE_SIZE too small in " __FILE__); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - return FFI_OK; -} diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/ffi.h b/third_party/python/Modules/_ctypes/libffi_msvc/ffi.h deleted file mode 100644 index ba7420272..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/ffi.h +++ /dev/null @@ -1,322 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi 2.00-beta - Copyright (c) 1996-2003 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - The basic API is described in the README file. - - The raw API is designed to bypass some of the argument packing - and unpacking on architectures for which it can be avoided. - - The closure API allows interpreted functions to be packaged up - inside a C function pointer, so that they can be called as C functions, - with no understanding on the client side that they are interpreted. - It can also be used in other cases in which it is necessary to package - up a user specified parameter and a function pointer as a single - function pointer. - - The closure API must be implemented in order to get its functionality, - e.g. for use by gij. Routines are provided to emulate the raw API - if the underlying platform doesn't allow faster implementation. - - More details on the raw and cloure API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -//XXX #define X86 - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# ifdef _MSC_VER -# define FFI_LONG_LONG_MAX _I64_MAX -# endif -# endif -#endif - -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else - #error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else - #error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else - #error "int size not supported" -#endif - -#define ffi_type_ulong ffi_type_uint64 -#define ffi_type_slong ffi_type_sint64 -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != 9223372036854775807 - #error "no 64-bit data type supported" -# endif -#elif LONG_MAX != 9223372036854775807 - #error "long size not supported" -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t */ -/* can hold a pointer. */ - -typedef struct _ffi_type -{ - size_t size; - unsigned short alignment; - unsigned short type; - /*@null@*/ struct _ffi_type **elements; -} ffi_type; - -int can_return_struct_as_int(size_t); -int can_return_struct_as_sint64(size_t); - -/* These are defined in types.c */ -extern ffi_type ffi_type_void; -extern ffi_type ffi_type_uint8; -extern ffi_type ffi_type_sint8; -extern ffi_type ffi_type_uint16; -extern ffi_type ffi_type_sint16; -extern ffi_type ffi_type_uint32; -extern ffi_type ffi_type_sint32; -extern ffi_type ffi_type_uint64; -extern ffi_type ffi_type_sint64; -extern ffi_type ffi_type_float; -extern ffi_type ffi_type_double; -extern ffi_type ffi_type_longdouble; -extern ffi_type ffi_type_pointer; - - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef unsigned FFI_TYPE; - -typedef struct { - ffi_abi abi; - unsigned nargs; - /*@dependent@*/ ffi_type **arg_types; - /*@dependent@*/ ffi_type *rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifdef _WIN64 -#define FFI_SIZEOF_ARG 8 -#else -#define FFI_SIZEOF_ARG 4 -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -void ffi_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ ffi_raw *avalue); - -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); - -/* This is analogous to the raw API, except it uses Java parameter */ -/* packing, even on 64-bit machines. I.e. on 64-bit machines */ -/* longs and doubles are followed by an empty 64-bit word. */ - -void ffi_java_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ ffi_raw *avalue); - -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -typedef struct { - char tramp[FFI_TRAMPOLINE_SIZE]; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure; - -void ffi_closure_free(void *); -void *ffi_closure_alloc (size_t size, void **code); - -ffi_status -ffi_prep_closure_loc (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc); - -typedef struct { - char tramp[FFI_TRAMPOLINE_SIZE]; - - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* if this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void *user_data; - -} ffi_raw_closure; - -ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -ffi_status -ffi_prep_java_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -#endif /* FFI_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - /*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype, - /*@dependent@*/ ffi_type **atypes); - -int -ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue); - -/* Useful for eliminating compiler warnings */ -#define FFI_FN(f) ((void (*)())f) - -/* ---- Definitions shared with assembly code ---------------------------- */ - -#endif - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 -#if 1 -#define FFI_TYPE_LONGDOUBLE 4 -#else -#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 - -/* This should always refer to the last type code (for sanity checks) */ -#define FFI_TYPE_LAST FFI_TYPE_POINTER - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/ffi_common.h b/third_party/python/Modules/_ctypes/libffi_msvc/ffi_common.h deleted file mode 100644 index 43fb83b48..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/ffi_common.h +++ /dev/null @@ -1,77 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (c) 1996 Red Hat, Inc. - - Common internal definitions and macros. Only necessary for building - libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_COMMON_H -#define FFI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -/* Check for the existence of memcpy. */ -#if STDC_HEADERS -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - -#if defined(FFI_DEBUG) -#include -#endif - -#ifdef FFI_DEBUG -/*@exits@*/ void ffi_assert(/*@temp@*/ char *expr, /*@temp@*/ char *file, int line); -void ffi_stop_here(void); -void ffi_type_test(/*@temp@*/ /*@out@*/ ffi_type *a, /*@temp@*/ char *file, int line); - -#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) -#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) -#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) -#else -#define FFI_ASSERT(x) -#define FFI_ASSERT_AT(x, f, l) -#define FFI_ASSERT_VALID_TYPE(x) -#endif - -#define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif); - -/* Extended cif, used in callback from assembly routine */ -typedef struct -{ - /*@dependent@*/ ffi_cif *cif; - /*@dependent@*/ void *rvalue; - /*@dependent@*/ void **avalue; -} extended_cif; - -/* Terse sized type definitions. */ -typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); -typedef signed int SINT8 __attribute__((__mode__(__QI__))); -typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); -typedef signed int SINT16 __attribute__((__mode__(__HI__))); -typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); -typedef signed int SINT32 __attribute__((__mode__(__SI__))); -typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); -typedef signed int SINT64 __attribute__((__mode__(__DI__))); - -typedef float FLOAT32; - - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/fficonfig.h b/third_party/python/Modules/_ctypes/libffi_msvc/fficonfig.h deleted file mode 100644 index c14f653ec..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/fficonfig.h +++ /dev/null @@ -1,96 +0,0 @@ -/* fficonfig.h. Originally created by configure, now hand_maintained for MSVC. */ - -/* fficonfig.h. Generated automatically by configure. */ -/* fficonfig.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define this for MSVC, but not for mingw32! */ -#ifdef _MSC_VER -#define __attribute__(x) /* */ -#endif -#define alloca _alloca - -/*----------------------------------------------------------------*/ - -/* Define if using alloca.c. */ -/* #undef C_ALLOCA */ - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -/* #undef CRAY_STACKSEG_END */ - -/* Define if you have alloca, as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define if you have and it should be used (not on Ultrix). */ -/* #define HAVE_ALLOCA_H 1 */ - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -/* #undef STACK_DIRECTION */ - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if you have the memcpy function. */ -#define HAVE_MEMCPY 1 - -/* Define if read-only mmap of a plain file works. */ -//#define HAVE_MMAP_FILE 1 - -/* Define if mmap of /dev/zero works. */ -//#define HAVE_MMAP_DEV_ZERO 1 - -/* Define if mmap with MAP_ANON(YMOUS) works. */ -//#define HAVE_MMAP_ANON 1 - -/* The number of bytes in type double */ -#define SIZEOF_DOUBLE 8 - -/* The number of bytes in type long double */ -#define SIZEOF_LONG_DOUBLE 12 - -/* Define if you have the long double type and it is bigger than a double */ -#define HAVE_LONG_DOUBLE 1 - -/* whether byteorder is bigendian */ -/* #undef WORDS_BIGENDIAN */ - -/* Define if the host machine stores words of multi-word integers in - big-endian order. */ -/* #undef HOST_WORDS_BIG_ENDIAN */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 1234 - -/* Define if your assembler and linker support unaligned PC relative relocs. */ -/* #undef HAVE_AS_SPARC_UA_PCREL */ - -/* Define if your assembler supports .register. */ -/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ - -/* Define if .eh_frame sections should be read-only. */ -/* #undef HAVE_RO_EH_FRAME */ - -/* Define to the flags needed for the .section .eh_frame directive. */ -/* #define EH_FRAME_FLAGS "aw" */ - -/* Define to the flags needed for the .section .eh_frame directive. */ -/* #define EH_FRAME_FLAGS "aw" */ - -/* Define this if you want extra debugging. */ -/* #undef FFI_DEBUG */ - -/* Define this is you do not want support for aggregate types. */ -/* #undef FFI_NO_STRUCTS */ - -/* Define this is you do not want support for the raw API. */ -/* #undef FFI_NO_RAW_API */ - -/* Define this if you are using Purify and want to suppress spurious messages. */ -/* #undef USING_PURIFY */ - diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/ffitarget.h b/third_party/python/Modules/_ctypes/libffi_msvc/ffitarget.h deleted file mode 100644 index 85f5ee81b..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/ffitarget.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for x86 and x86-64. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#if defined (X86_64) && defined (__i386__) -#undef X86_64 -#define X86 -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -#ifndef _WIN64 -typedef unsigned long ffi_arg; -#else -typedef unsigned __int64 ffi_arg; -#endif -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - - /* ---- Intel x86 Win32 ---------- */ - FFI_SYSV, -#ifndef _WIN64 - FFI_STDCALL, -#endif - /* TODO: Add fastcall support for the sake of completeness */ - FFI_DEFAULT_ABI = FFI_SYSV, - - /* ---- Intel x86 and AMD x86-64 - */ -/* #if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) */ -/* FFI_SYSV, */ -/* FFI_UNIX64,*/ /* Unix variants all use the same ABI for x86-64 */ -/* #ifdef __i386__ */ -/* FFI_DEFAULT_ABI = FFI_SYSV, */ -/* #else */ -/* FFI_DEFAULT_ABI = FFI_UNIX64, */ -/* #endif */ -/* #endif */ - - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 - -#ifdef _WIN64 -#define FFI_TRAMPOLINE_SIZE 29 -#define FFI_NATIVE_RAW_API 0 -#else -#define FFI_TRAMPOLINE_SIZE 15 -#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/prep_cif.c b/third_party/python/Modules/_ctypes/libffi_msvc/prep_cif.c deleted file mode 100644 index 022435e53..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/prep_cif.c +++ /dev/null @@ -1,188 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include - - -/* Round up to FFI_SIZEOF_ARG. */ - -#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status initialize_aggregate(/*@out@*/ ffi_type *arg) -{ - ffi_type **ptr; - - FFI_ASSERT(arg != NULL); - - /*@-usedef@*/ - - FFI_ASSERT(arg->elements != NULL); - FFI_ASSERT(arg->size == 0); - FFI_ASSERT(arg->alignment == 0); - - ptr = &(arg->elements[0]); - - while ((*ptr) != NULL) - { - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - - arg->size = ALIGN(arg->size, (*ptr)->alignment); - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - /* Structure size includes tail padding. This is important for - structures that fit in one register on ABIs like the PowerPC64 - Linux ABI that right justify small structs in a register. - It's also needed for nested structure layout, for example - struct A { long a; char b; }; struct B { struct A x; char y; }; - should find y at an offset of 2*sizeof(long) and result in a - total size of 3*sizeof(long). */ - arg->size = ALIGN (arg->size, arg->alignment); - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; - - /*@=usedef@*/ -} - -/* Perform machine independent ffi_cif preparation, then call - machine dependent routine. */ - -ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, - ffi_abi abi, unsigned int nargs, - /*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype, - /*@dependent@*/ ffi_type **atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT(cif != NULL); - FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI)); - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = nargs; - cif->rtype = rtype; - - cif->flags = 0; - - /* Initialize the return type if necessary */ - /*@-usedef@*/ - if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - /*@=usedef@*/ - - /* Perform a sanity check on the return type */ - FFI_ASSERT_VALID_TYPE(cif->rtype); - - /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ -#if !defined M68K && !defined __x86_64__ && !defined S390 - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef _WIN32 - && !can_return_struct_as_int(cif->rtype->size) /* MSVC returns small structs in registers */ - && !can_return_struct_as_sint64(cif->rtype->size) -#endif -#ifdef SPARC - && (cif->abi != FFI_V9 || cif->rtype->size > 32) -#endif - ) - bytes = STACK_ARG_SIZE(sizeof(void*)); -#endif - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - - /* Initialize any uninitialized aggregate type definitions */ - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if !defined __x86_64__ && !defined S390 -#ifdef SPARC - if (((*ptr)->type == FFI_TYPE_STRUCT - && ((*ptr)->size > 16 || cif->abi != FFI_V9)) - || ((*ptr)->type == FFI_TYPE_LONGDOUBLE - && cif->abi != FFI_V9)) - bytes += sizeof(void*); - else -#elif defined (_WIN64) - if ((*ptr)->type == FFI_TYPE_STRUCT && - !can_return_struct_as_int((*ptr)->size) && - !can_return_struct_as_sint64((*ptr)->size)) - bytes += sizeof(void*); - else -#endif - { -#if !defined(_MSC_VER) && !defined(__MINGW32__) - /* Don't know if this is a libffi bug or not. At least on - Windows with MSVC, function call parameters are *not* - aligned in the same way as structure fields are, they are - only aligned in integer boundaries. - - This doesn't do any harm for cdecl functions and closures, - since the caller cleans up the stack, but it is wrong for - stdcall functions where the callee cleans. - */ - - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = ALIGN(bytes, (*ptr)->alignment); - -#endif - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - -#ifdef _WIN64 - /* Function call needs at least 40 bytes stack size, on win64 AMD64 */ - if (bytes < 40) - bytes = 40; -#endif - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ - return ffi_prep_cif_machdep(cif); -} diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/types.c b/third_party/python/Modules/_ctypes/libffi_msvc/types.c deleted file mode 100644 index 4433ac28c..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/types.c +++ /dev/null @@ -1,104 +0,0 @@ -/* ----------------------------------------------------------------------- - types.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Predefined ffi_types needed by libffi. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -/* Type definitions */ - -#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) ffi_type ffi_type_##n = { s, a, t, NULL } -#define FFI_AGGREGATE_TYPEDEF(n, e) ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } - -/* Size and alignment are fake here. They must not be 0. */ -FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); - -FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); -FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); -FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); -FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); -FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); -FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); -FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); - -#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \ - || defined IA64 || defined _WIN64 - -FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); - -#else - -FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); - -#endif - -#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); - -#elif defined SH - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); - -#else - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); - -#endif - - -#if defined X86 || defined X86_WIN32 || defined M68K - -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); - -#elif defined ARM || defined SH || defined POWERPC_AIX || defined POWERPC_DARWIN - -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); - -#elif defined SPARC - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -#ifdef SPARC64 -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -#else -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); -#endif - -#elif defined X86_64 - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); - -#else - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); - -#endif - diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/win32.c b/third_party/python/Modules/_ctypes/libffi_msvc/win32.c deleted file mode 100644 index f44a5fe36..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/win32.c +++ /dev/null @@ -1,162 +0,0 @@ -/* ----------------------------------------------------------------------- - win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc. - Copyright (c) 2001 John Beniton - Copyright (c) 2002 Ranjit Mathew - - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* theller: almost verbatim translation from gas syntax to MSVC inline - assembler code. */ - -/* theller: ffi_call_x86 now returns an integer - the difference of the stack - pointer before and after the function call. If everything is ok, zero is - returned. If stdcall functions are passed the wrong number of arguments, - the difference will be nonzero. */ - -#include -#include - -__declspec(naked) int -ffi_call_x86(void (* prepfunc)(char *, extended_cif *), /* 8 */ - extended_cif *ecif, /* 12 */ - unsigned bytes, /* 16 */ - unsigned flags, /* 20 */ - unsigned *rvalue, /* 24 */ - void (*fn)()) /* 28 */ -{ - _asm { - push ebp - mov ebp, esp - - push esi // NEW: this register must be preserved across function calls -// XXX SAVE ESP NOW! - mov esi, esp // save stack pointer before the call - -// Make room for all of the new args. - mov ecx, [ebp+16] - sub esp, ecx // sub esp, bytes - - mov eax, esp - -// Place all of the ffi_prep_args in position - push [ebp + 12] // ecif - push eax - call [ebp + 8] // prepfunc - -// Return stack to previous state and call the function - add esp, 8 -// FIXME: Align the stack to a 128-bit boundary to avoid -// potential performance hits. - call [ebp + 28] - -// Load ecif->cif->abi - mov ecx, [ebp + 12] - mov ecx, [ecx]ecif.cif - mov ecx, [ecx]ecif.cif.abi - - cmp ecx, FFI_STDCALL - je noclean -// STDCALL: Remove the space we pushed for the args - mov ecx, [ebp + 16] - add esp, ecx -// CDECL: Caller has already cleaned the stack -noclean: -// Check that esp has the same value as before! - sub esi, esp - -// Load %ecx with the return type code - mov ecx, [ebp + 20] - -// If the return value pointer is NULL, assume no return value. -/* - Intel asm is weird. We have to explicitly specify 'DWORD PTR' in the next instruction, - otherwise only one BYTE will be compared (instead of a DWORD)! - */ - cmp DWORD PTR [ebp + 24], 0 - jne sc_retint - -// Even if there is no space for the return value, we are -// obliged to handle floating-point values. - cmp ecx, FFI_TYPE_FLOAT - jne sc_noretval -// fstp %st(0) - fstp st(0) - - jmp sc_epilogue - -sc_retint: - cmp ecx, FFI_TYPE_INT - jne sc_retfloat -// # Load %ecx with the pointer to storage for the return value - mov ecx, [ebp + 24] - mov [ecx + 0], eax - jmp sc_epilogue - -sc_retfloat: - cmp ecx, FFI_TYPE_FLOAT - jne sc_retdouble -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] -// fstps (%ecx) - fstp DWORD PTR [ecx] - jmp sc_epilogue - -sc_retdouble: - cmp ecx, FFI_TYPE_DOUBLE - jne sc_retlongdouble -// movl 24(%ebp),%ecx - mov ecx, [ebp+24] - fstp QWORD PTR [ecx] - jmp sc_epilogue - - jmp sc_retlongdouble // avoid warning about unused label -sc_retlongdouble: - cmp ecx, FFI_TYPE_LONGDOUBLE - jne sc_retint64 -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] -// fstpt (%ecx) - fstp QWORD PTR [ecx] /* XXX ??? */ - jmp sc_epilogue - -sc_retint64: - cmp ecx, FFI_TYPE_SINT64 - jne sc_retstruct -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] - mov [ecx+0], eax - mov [ecx+4], edx - -sc_retstruct: -// Nothing to do! - -sc_noretval: -sc_epilogue: - mov eax, esi - pop esi // NEW restore: must be preserved across function calls - mov esp, ebp - pop ebp - ret - } -} diff --git a/third_party/python/Modules/_ctypes/libffi_msvc/win64.asm b/third_party/python/Modules/_ctypes/libffi_msvc/win64.asm deleted file mode 100644 index 301188bc9..000000000 --- a/third_party/python/Modules/_ctypes/libffi_msvc/win64.asm +++ /dev/null @@ -1,156 +0,0 @@ -PUBLIC ffi_call_AMD64 - -EXTRN __chkstk:NEAR -EXTRN ffi_closure_SYSV:NEAR - -_TEXT SEGMENT - -;;; ffi_closure_OUTER will be called with these registers set: -;;; rax points to 'closure' -;;; r11 contains a bit mask that specifies which of the -;;; first four parameters are float or double -;;; -;;; It must move the parameters passed in registers to their stack location, -;;; call ffi_closure_SYSV for the actual work, then return the result. -;;; -ffi_closure_OUTER PROC FRAME - ;; save actual arguments to their stack space. - test r11, 1 - jne first_is_float - mov QWORD PTR [rsp+8], rcx - jmp second -first_is_float: - movlpd QWORD PTR [rsp+8], xmm0 - -second: - test r11, 2 - jne second_is_float - mov QWORD PTR [rsp+16], rdx - jmp third -second_is_float: - movlpd QWORD PTR [rsp+16], xmm1 - -third: - test r11, 4 - jne third_is_float - mov QWORD PTR [rsp+24], r8 - jmp forth -third_is_float: - movlpd QWORD PTR [rsp+24], xmm2 - -forth: - test r11, 8 - jne forth_is_float - mov QWORD PTR [rsp+32], r9 - jmp done -forth_is_float: - movlpd QWORD PTR [rsp+32], xmm3 - -done: -.ALLOCSTACK 40 - sub rsp, 40 -.ENDPROLOG - mov rcx, rax ; context is first parameter - mov rdx, rsp ; stack is second parameter - add rdx, 40 ; correct our own area - mov rax, ffi_closure_SYSV - call rax ; call the real closure function - ;; Here, code is missing that handles float return values - add rsp, 40 - movd xmm0, rax ; In case the closure returned a float. - ret 0 -ffi_closure_OUTER ENDP - - -;;; ffi_call_AMD64 - -stack$ = 0 -prepfunc$ = 32 -ecif$ = 40 -bytes$ = 48 -flags$ = 56 -rvalue$ = 64 -fn$ = 72 - -ffi_call_AMD64 PROC FRAME - - mov QWORD PTR [rsp+32], r9 - mov QWORD PTR [rsp+24], r8 - mov QWORD PTR [rsp+16], rdx - mov QWORD PTR [rsp+8], rcx -.PUSHREG rbp - push rbp -.ALLOCSTACK 48 - sub rsp, 48 ; 00000030H -.SETFRAME rbp, 32 - lea rbp, QWORD PTR [rsp+32] -.ENDPROLOG - - mov eax, DWORD PTR bytes$[rbp] - add rax, 15 - and rax, -16 - call __chkstk - sub rsp, rax - lea rax, QWORD PTR [rsp+32] - mov QWORD PTR stack$[rbp], rax - - mov rdx, QWORD PTR ecif$[rbp] - mov rcx, QWORD PTR stack$[rbp] - call QWORD PTR prepfunc$[rbp] - - mov rsp, QWORD PTR stack$[rbp] - - movlpd xmm3, QWORD PTR [rsp+24] - movd r9, xmm3 - - movlpd xmm2, QWORD PTR [rsp+16] - movd r8, xmm2 - - movlpd xmm1, QWORD PTR [rsp+8] - movd rdx, xmm1 - - movlpd xmm0, QWORD PTR [rsp] - movd rcx, xmm0 - - call QWORD PTR fn$[rbp] -ret_int$: - cmp DWORD PTR flags$[rbp], 1 ; FFI_TYPE_INT - jne ret_float$ - - mov rcx, QWORD PTR rvalue$[rbp] - mov DWORD PTR [rcx], eax - jmp SHORT ret_nothing$ - -ret_float$: - cmp DWORD PTR flags$[rbp], 2 ; FFI_TYPE_FLOAT - jne SHORT ret_double$ - - mov rax, QWORD PTR rvalue$[rbp] - movlpd QWORD PTR [rax], xmm0 - jmp SHORT ret_nothing$ - -ret_double$: - cmp DWORD PTR flags$[rbp], 3 ; FFI_TYPE_DOUBLE - jne SHORT ret_int64$ - - mov rax, QWORD PTR rvalue$[rbp] - movlpd QWORD PTR [rax], xmm0 - jmp SHORT ret_nothing$ - -ret_int64$: - cmp DWORD PTR flags$[rbp], 12 ; FFI_TYPE_SINT64 - jne ret_nothing$ - - mov rcx, QWORD PTR rvalue$[rbp] - mov QWORD PTR [rcx], rax - jmp SHORT ret_nothing$ - -ret_nothing$: - xor eax, eax - - lea rsp, QWORD PTR [rbp+16] - pop rbp - ret 0 -ffi_call_AMD64 ENDP -_TEXT ENDS -END diff --git a/third_party/python/Modules/_ctypes/libffi_osx/LICENSE b/third_party/python/Modules/_ctypes/libffi_osx/LICENSE deleted file mode 100644 index f59179515..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -libffi - Copyright (c) 1996-2003 Red Hat, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/third_party/python/Modules/_ctypes/libffi_osx/README b/third_party/python/Modules/_ctypes/libffi_osx/README deleted file mode 100644 index 1fc27470d..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/README +++ /dev/null @@ -1,500 +0,0 @@ -This directory contains the libffi package, which is not part of GCC but -shipped with GCC as convenience. - -Status -====== - -libffi-2.00 has not been released yet! This is a development snapshot! - -libffi-1.20 was released on October 5, 1998. Check the libffi web -page for updates: . - - -What is libffi? -=============== - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling -convention". The "calling convention" is essentially a set of -assumptions made by the compiler about where function arguments will -be found on entry to a function. A "calling convention" also specifies -where the return value for a function is found. - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. Libffi can be used in such programs to provide a -bridge from the interpreter program to compiled code. - -The libffi library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -Ffi stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code -written in one language to call code written in another language. The -libffi library really only provides the lowest, machine dependent -layer of a fully featured foreign function interface. A layer must -exist above libffi that handles type conversions for values passed -between the two languages. - - -Supported Platforms and Prerequisites -===================================== - -Libffi has been ported to: - - SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) - - Irix 5.3 & 6.2 (System V/o32 & n32) - - Intel x86 - Linux (System V ABI) - - Alpha - Linux and OSF/1 - - m68k - Linux (System V ABI) - - PowerPC - Linux (System V ABI, Darwin, AIX) - - ARM - Linux (System V ABI) - -Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are -that other versions will work. Libffi has also been built and tested -with the SGI compiler tools. - -On PowerPC, the tests failed (see the note below). - -You must use GNU make to build libffi. SGI's make will not work. -Sun's probably won't either. - -If you port libffi to another platform, please let me know! I assume -that some will be easy (x86 NetBSD), and others will be more difficult -(HP). - - -Installing libffi -================= - -[Note: before actually performing any of these installation steps, - you may wish to read the "Platform Specific Notes" below.] - -First you must configure the distribution for your particular -system. Go to the directory you wish to build libffi in and run the -"configure" program found in the root directory of the libffi source -distribution. - -You may want to tell configure where to install the libffi library and -header files. To do that, use the --prefix configure switch. Libffi -will install under /usr/local by default. - -If you want to enable extra run-time debugging checks use the the ---enable-debug configure switch. This is useful when your program dies -mysteriously while using libffi. - -Another useful configure switch is --enable-purify-safety. Using this -will add some extra code which will suppress certain warnings when you -are using Purify with libffi. Only use this switch when using -Purify, as it will slow down the library. - -Configure has many other options. Use "configure --help" to see them all. - -Once configure has finished, type "make". Note that you must be using -GNU make. SGI's make will not work. Sun's probably won't either. -You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. - -To ensure that libffi is working as advertised, type "make test". - -To install the library and header files, type "make install". - - -Using libffi -============ - - The Basics - ---------- - -Libffi assumes that you have a pointer to the function you wish to -call and that you know the number and types of arguments to pass it, -as well as the return type of the function. - -The first thing you must do is create an ffi_cif object that matches -the signature of the function you wish to call. The cif in ffi_cif -stands for Call InterFace. To prepare a call interface object, use the -following function: - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, ffi_type **atypes); - - CIF is a pointer to the call interface object you wish - to initialize. - - ABI is an enum that specifies the calling convention - to use for the call. FFI_DEFAULT_ABI defaults - to the system's native calling convention. Other - ABI's may be used with care. They are system - specific. - - NARGS is the number of arguments this function accepts. - libffi does not yet support vararg functions. - - RTYPE is a pointer to an ffi_type structure that represents - the return type of the function. Ffi_type objects - describe the types of values. libffi provides - ffi_type objects for many of the native C types: - signed int, unsigned int, signed char, unsigned char, - etc. There is also a pointer ffi_type object and - a void ffi_type. Use &ffi_type_void for functions that - don't return values. - - ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. - If NARGS is 0, this is ignored. - - -ffi_prep_cif will return a status code that you are responsible -for checking. It will be one of the following: - - FFI_OK - All is good. - - FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif - came across is bad. - - -Before making the call, the VALUES vector should be initialized -with pointers to the appropriate argument values. - -To call the the function using the initialized ffi_cif, use the -ffi_call function: - -void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); - - CIF is a pointer to the ffi_cif initialized specifically - for this function. - - FN is a pointer to the function you want to call. - - RVALUE is a pointer to a chunk of memory that is to hold the - result of the function call. Currently, it must be - at least one word in size (except for the n32 version - under Irix 6.x, which must be a pointer to an 8 byte - aligned value (a long long). It must also be at least - word aligned (depending on the return type, and the - system's alignment requirements). If RTYPE is - &ffi_type_void, this is ignored. If RVALUE is NULL, - the return value is discarded. - - AVALUES is a vector of void* that point to the memory locations - holding the argument values for a call. - If NARGS is 0, this is ignored. - - -If you are expecting a return value from FN it will have been stored -at RVALUE. - - - - An Example - ---------- - -Here is a trivial example that calls puts() a few times. - - #include - #include - - int main() - { - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - int rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_uint; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint, args) == FFI_OK) - { - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - } - - return 0; - } - - - - Aggregate Types - --------------- - -Although libffi has no special support for unions or bit-fields, it is -perfectly happy passing structures back and forth. You must first -describe the structure to libffi by creating a new ffi_type object -for it. Here is the definition of ffi_type: - - typedef struct _ffi_type - { - unsigned size; - short alignment; - short type; - struct _ffi_type **elements; - } ffi_type; - -All structures must have type set to FFI_TYPE_STRUCT. You may set -size and alignment to 0. These will be calculated and reset to the -appropriate values by ffi_prep_cif(). - -elements is a NULL terminated array of pointers to ffi_type objects -that describe the type of the structure elements. These may, in turn, -be structure elements. - -The following example initializes a ffi_type object representing the -tm struct from Linux's time.h: - - struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; - }; - - { - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - } - - - -Platform Specific Notes -======================= - - Intel x86 - --------- - -There are no known problems with the x86 port. - - Sun SPARC - SunOS 4.1.3 & Solaris 2.x - ------------------------------------- - -You must use GNU Make to build libffi on Sun platforms. - - MIPS - Irix 5.3 & 6.x - --------------------- - -Irix 6.2 and better supports three different calling conventions: o32, -n32 and n64. Currently, libffi only supports both o32 and n32 under -Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be -configured for whichever calling convention it was built for. - -By default, the configure script will try to build libffi with the GNU -development tools. To build libffi with the SGI development tools, set -the environment variable CC to either "cc -32" or "cc -n32" before -running configure under Irix 6.x (depending on whether you want an o32 -or n32 library), or just "cc" for Irix 5.3. - -With the n32 calling convention, when returning structures smaller -than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. -Here's one way of forcing this: - - double struct_storage[2]; - my_small_struct *s = (my_small_struct *) struct_storage; - /* Use s for RVALUE */ - -If you don't do this you are liable to get spurious bus errors. - -"long long" values are not supported yet. - -You must use GNU Make to build libffi on SGI platforms. - - ARM - System V ABI - ------------------ - -The ARM port was performed on a NetWinder running ARM Linux ELF -(2.0.31) and gcc 2.8.1. - - - - PowerPC System V ABI - -------------------- - -There are two `System V ABI's which libffi implements for PowerPC. -They differ only in how small structures are returned from functions. - -In the FFI_SYSV version, structures that are 8 bytes or smaller are -returned in registers. This is what GCC does when it is configured -for solaris, and is what the System V ABI I have (dated September -1995) says. - -In the FFI_GCC_SYSV version, all structures are returned the same way: -by passing a pointer as the first argument to the function. This is -what GCC does when it is configured for linux or a generic sysv -target. - -EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a -inconsistency with the SysV ABI: When a procedure is called with many -floating-point arguments, some of them get put on the stack. They are -all supposed to be stored in double-precision format, even if they are -only single-precision, but EGCS stores single-precision arguments as -single-precision anyway. This causes one test to fail (the `many -arguments' test). - - -What's With The Crazy Comments? -=============================== - -You might notice a number of cryptic comments in the code, delimited -by /*@ and @*/. These are annotations read by the program LCLint, a -tool for statically checking C programs. You can read all about it at -. - - -History -======= - -1.20 Oct-5-98 - Raffaele Sena produces ARM port. - -1.19 Oct-5-98 - Fixed x86 long double and long long return support. - m68k bug fixes from Andreas Schwab. - Patch for DU assembler compatibility for the Alpha from Richard - Henderson. - -1.18 Apr-17-98 - Bug fixes and MIPS configuration changes. - -1.17 Feb-24-98 - Bug fixes and m68k port from Andreas Schwab. PowerPC port from - Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. - -1.16 Feb-11-98 - Richard Henderson produces Alpha port. - -1.15 Dec-4-97 - Fixed an n32 ABI bug. New libtool, auto* support. - -1.14 May-13-97 - libtool is now used to generate shared and static libraries. - Fixed a minor portability problem reported by Russ McManus - . - -1.13 Dec-2-96 - Added --enable-purify-safety to keep Purify from complaining - about certain low level code. - Sparc fix for calling functions with < 6 args. - Linux x86 a.out fix. - -1.12 Nov-22-96 - Added missing ffi_type_void, needed for supporting void return - types. Fixed test case for non MIPS machines. Cygnus Support - is now Cygnus Solutions. - -1.11 Oct-30-96 - Added notes about GNU make. - -1.10 Oct-29-96 - Added configuration fix for non GNU compilers. - -1.09 Oct-29-96 - Added --enable-debug configure switch. Clean-ups based on LCLint - feedback. ffi_mips.h is always installed. Many configuration - fixes. Fixed ffitest.c for sparc builds. - -1.08 Oct-15-96 - Fixed n32 problem. Many clean-ups. - -1.07 Oct-14-96 - Gordon Irlam rewrites v8.S again. Bug fixes. - -1.06 Oct-14-96 - Gordon Irlam improved the sparc port. - -1.05 Oct-14-96 - Interface changes based on feedback. - -1.04 Oct-11-96 - Sparc port complete (modulo struct passing bug). - -1.03 Oct-10-96 - Passing struct args, and returning struct values works for - all architectures/calling conventions. Expanded tests. - -1.02 Oct-9-96 - Added SGI n32 support. Fixed bugs in both o32 and Linux support. - Added "make test". - -1.01 Oct-8-96 - Fixed float passing bug in mips version. Restructured some - of the code. Builds cleanly with SGI tools. - -1.00 Oct-7-96 - First release. No public announcement. - - -Authors & Credits -================= - -libffi was written by Anthony Green . - -Portions of libffi were derived from Gianni Mariani's free gencall -library for Silicon Graphics machines. - -The closure mechanism was designed and implemented by Kresten Krab -Thorup. - -The Sparc port was derived from code contributed by the fine folks at -Visible Decisions Inc . Further enhancements were -made by Gordon Irlam at Cygnus Solutions . - -The Alpha port was written by Richard Henderson at Cygnus Solutions. - -Andreas Schwab ported libffi to m68k Linux and provided a number of -bug fixes. - -Geoffrey Keating ported libffi to the PowerPC. - -Raffaele Sena ported libffi to the ARM. - -Jesper Skov and Andrew Haley both did more than their fair share of -stepping through the code and tracking down bugs. - -Thanks also to Tom Tromey for bug fixes and configuration help. - -Thanks to Jim Blandy, who provided some useful feedback on the libffi -interface. - -If you have a problem, or have found a bug, please send a note to -green@cygnus.com. diff --git a/third_party/python/Modules/_ctypes/libffi_osx/README.pyobjc b/third_party/python/Modules/_ctypes/libffi_osx/README.pyobjc deleted file mode 100644 index 405d85fed..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/README.pyobjc +++ /dev/null @@ -1,5 +0,0 @@ -This directory contains a slightly modified version of libffi, extracted from -the GCC source-tree. - -The only modifications are those that are necessary to compile libffi using -the Apple provided compiler and outside of the GCC source tree. diff --git a/third_party/python/Modules/_ctypes/libffi_osx/ffi.c b/third_party/python/Modules/_ctypes/libffi_osx/ffi.c deleted file mode 100644 index 1776b795e..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/ffi.c +++ /dev/null @@ -1,227 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -/* Round up to FFI_SIZEOF_ARG. */ -#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status -initialize_aggregate( -/*@out@*/ ffi_type* arg) -{ -/*@-usedef@*/ - ffi_type** ptr; - - if (arg == NULL || arg->elements == NULL || - arg->size != 0 || arg->alignment != 0) - return FFI_BAD_TYPEDEF; - - ptr = &(arg->elements[0]); - - while ((*ptr) != NULL) - { - if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#ifdef POWERPC_DARWIN - int curalign = (*ptr)->alignment; - - if (ptr != &(arg->elements[0])) - { - if (curalign > 4 && curalign != 16) - curalign = 4; - } - - arg->size = ALIGN(arg->size, curalign); - arg->size += (*ptr)->size; - arg->alignment = (arg->alignment > curalign) ? - arg->alignment : curalign; -#else - arg->size = ALIGN(arg->size, (*ptr)->alignment); - arg->size += (*ptr)->size; - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; -#endif - - ptr++; - } - - /* Structure size includes tail padding. This is important for - structures that fit in one register on ABIs like the PowerPC64 - Linux ABI that right justify small structs in a register. - It's also needed for nested structure layout, for example - struct A { long a; char b; }; struct B { struct A x; char y; }; - should find y at an offset of 2*sizeof(long) and result in a - total size of 3*sizeof(long). */ - arg->size = ALIGN(arg->size, arg->alignment); - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - - return FFI_OK; - -/*@=usedef@*/ -} - -#ifndef __CRIS__ -/* The CRIS ABI specifies structure elements to have byte - alignment only, so it completely overrides this functions, - which assumes "natural" alignment and padding. */ - -/* Perform machine independent ffi_cif preparation, then call - machine dependent routine. */ - -#if defined(X86_DARWIN) && !defined __x86_64__ - -static inline bool -struct_on_stack( - int size) -{ - if (size > 8) - return true; - - /* This is not what the ABI says, but is what is really implemented */ - switch (size) - { - case 1: - case 2: - case 4: - case 8: - return false; - - default: - return true; - } -} - -#endif // defined(X86_DARWIN) && !defined __x86_64__ - -// Arguments' ffi_type->alignment must be nonzero. -ffi_status -ffi_prep_cif( -/*@out@*/ /*@partial@*/ ffi_cif* cif, - ffi_abi abi, - unsigned int nargs, -/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, -/*@dependent@*/ ffi_type** atypes) -{ - unsigned int bytes = 0; - unsigned int i; - ffi_type** ptr; - - if (cif == NULL) - return FFI_BAD_TYPEDEF; - - if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) - return FFI_BAD_ABI; - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = nargs; - cif->rtype = rtype; - cif->flags = 0; - - /* Initialize the return type if necessary */ - /*@-usedef@*/ - if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - /*@=usedef@*/ - - /* Perform a sanity check on the return type */ - FFI_ASSERT_VALID_TYPE(cif->rtype); - - /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ -#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef SPARC - && (cif->abi != FFI_V9 || cif->rtype->size > 32) -#endif -#ifdef X86_DARWIN - && (struct_on_stack(cif->rtype->size)) -#endif - ) - bytes = STACK_ARG_SIZE(sizeof(void*)); -#endif - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - /* Initialize any uninitialized aggregate type definitions */ - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - if ((*ptr)->alignment == 0) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if defined(X86_DARWIN) - { - int align = (*ptr)->alignment; - - if (align > 4) - align = 4; - - if ((align - 1) & bytes) - bytes = ALIGN(bytes, align); - - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#elif !defined __x86_64__ && !defined S390 && !defined PA -#ifdef SPARC - if (((*ptr)->type == FFI_TYPE_STRUCT - && ((*ptr)->size > 16 || cif->abi != FFI_V9)) - || ((*ptr)->type == FFI_TYPE_LONGDOUBLE - && cif->abi != FFI_V9)) - bytes += sizeof(void*); - else -#endif - { - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = ALIGN(bytes, (*ptr)->alignment); - - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ - return ffi_prep_cif_machdep(cif); -} -#endif /* not __CRIS__ */ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/ffi.h b/third_party/python/Modules/_ctypes/libffi_osx/include/ffi.h deleted file mode 100644 index c104a5c89..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/ffi.h +++ /dev/null @@ -1,355 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - The basic API is described in the README file. - - The raw API is designed to bypass some of the argument packing - and unpacking on architectures for which it can be avoided. - - The closure API allows interpreted functions to be packaged up - inside a C function pointer, so that they can be called as C functions, - with no understanding on the client side that they are interpreted. - It can also be used in other cases in which it is necessary to package - up a user specified parameter and a function pointer as a single - function pointer. - - The closure API must be implemented in order to get its functionality, - e.g. for use by gij. Routines are provided to emulate the raw API - if the underlying platform doesn't allow faster implementation. - - More details on the raw and closure API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -#ifdef MACOSX -# if defined(__i386__) || defined(__x86_64__) -# define X86_DARWIN -# elif defined(__ppc__) || defined(__ppc64__) -# define POWERPC_DARWIN -# else -# error "Unsupported MacOS X CPU type" -# endif -#else -#error "Unsupported OS type" -#endif - -/* ---- System configuration information --------------------------------- */ - -#include "ffitarget.h" -#include "fficonfig.h" - -#ifndef LIBFFI_ASM - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# endif -#endif - -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else -#error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else -#error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else -#error "int size not supported" -#endif - -#define ffi_type_ulong ffi_type_uint64 -#define ffi_type_slong ffi_type_sint64 - -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != 9223372036854775807 -# error "no 64-bit data type supported" -# endif -#elif LONG_MAX != 9223372036854775807 -#error "long size not supported" -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t - can hold a pointer. */ - -typedef struct _ffi_type { - size_t size; - unsigned short alignment; - unsigned short type; -/*@null@*/ struct _ffi_type** elements; -} ffi_type; - -/* These are defined in types.c */ -extern ffi_type ffi_type_void; -extern ffi_type ffi_type_uint8; -extern ffi_type ffi_type_sint8; -extern ffi_type ffi_type_uint16; -extern ffi_type ffi_type_sint16; -extern ffi_type ffi_type_uint32; -extern ffi_type ffi_type_sint32; -extern ffi_type ffi_type_uint64; -extern ffi_type ffi_type_sint64; -extern ffi_type ffi_type_float; -extern ffi_type ffi_type_double; -extern ffi_type ffi_type_longdouble; -extern ffi_type ffi_type_pointer; - -typedef enum ffi_status { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef unsigned FFI_TYPE; - -typedef struct ffi_cif { - ffi_abi abi; - unsigned nargs; -/*@dependent@*/ ffi_type** arg_types; -/*@dependent@*/ ffi_type* rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifndef FFI_SIZEOF_ARG -# if LONG_MAX == 2147483647 -# define FFI_SIZEOF_ARG 4 -# elif LONG_MAX == 9223372036854775807 -# define FFI_SIZEOF_ARG 8 -# endif -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -void -ffi_raw_call( -/*@dependent@*/ ffi_cif* cif, - void (*fn)(void), -/*@out@*/ void* rvalue, -/*@dependent@*/ ffi_raw* avalue); - -void -ffi_ptrarray_to_raw( - ffi_cif* cif, - void** args, - ffi_raw* raw); - -void -ffi_raw_to_ptrarray( - ffi_cif* cif, - ffi_raw* raw, - void** args); - -size_t -ffi_raw_size( - ffi_cif* cif); - -/* This is analogous to the raw API, except it uses Java parameter - packing, even on 64-bit machines. I.e. on 64-bit machines - longs and doubles are followed by an empty 64-bit word. */ -void -ffi_java_raw_call( -/*@dependent@*/ ffi_cif* cif, - void (*fn)(void), -/*@out@*/ void* rvalue, -/*@dependent@*/ ffi_raw* avalue); - -void -ffi_java_ptrarray_to_raw( - ffi_cif* cif, - void** args, - ffi_raw* raw); - -void -ffi_java_raw_to_ptrarray( - ffi_cif* cif, - ffi_raw* raw, - void** args); - -size_t -ffi_java_raw_size( - ffi_cif* cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -typedef struct ffi_closure { - char tramp[FFI_TRAMPOLINE_SIZE]; - ffi_cif* cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void* user_data; -} ffi_closure; - -ffi_status -ffi_prep_closure( - ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void* user_data); - -void ffi_closure_free(void *); -void *ffi_closure_alloc (size_t size, void **code); - -typedef struct ffi_raw_closure { - char tramp[FFI_TRAMPOLINE_SIZE]; - ffi_cif* cif; - -#if !FFI_NATIVE_RAW_API - /* if this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - void (*translate_args)(ffi_cif*,void*,void**,void*); - void* this_closure; -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void* user_data; -} ffi_raw_closure; - -ffi_status -ffi_prep_raw_closure( - ffi_raw_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void* user_data); - -ffi_status -ffi_prep_java_raw_closure( - ffi_raw_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void* user_data); - -#endif // FFI_CLOSURES - -/* ---- Public interface definition -------------------------------------- */ - -ffi_status -ffi_prep_cif( -/*@out@*/ /*@partial@*/ ffi_cif* cif, - ffi_abi abi, - unsigned int nargs, -/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, -/*@dependent@*/ ffi_type** atypes); - -void -ffi_call( -/*@dependent@*/ ffi_cif* cif, - void (*fn)(void), -/*@out@*/ void* rvalue, -/*@dependent@*/ void** avalue); - -/* Useful for eliminating compiler warnings */ -#define FFI_FN(f) ((void (*)(void))f) - -#endif // #ifndef LIBFFI_ASM -/* ---- Definitions shared with assembly code ---------------------------- */ - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 - -#ifdef HAVE_LONG_DOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#else -# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif - -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 - -/* This should always refer to the last type code (for sanity checks) */ -#define FFI_TYPE_LAST FFI_TYPE_POINTER - -#ifdef __cplusplus -} -#endif - -#endif // #ifndef LIBFFI_H diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/ffi_common.h b/third_party/python/Modules/_ctypes/libffi_osx/include/ffi_common.h deleted file mode 100644 index 685a3580f..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/ffi_common.h +++ /dev/null @@ -1,102 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (c) 1996 Red Hat, Inc. - - Common internal definitions and macros. Only necessary for building - libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_COMMON_H -#define FFI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fficonfig.h" - -/* Do not move this. Some versions of AIX are very picky about where - this is positioned. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX -# pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char* alloca(); -# endif -# endif -# endif -#endif - -/* Check for the existence of memcpy. */ -#if STDC_HEADERS -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -/*#if defined(FFI_DEBUG) -#include -#endif*/ - -#ifdef FFI_DEBUG -#include - -/*@exits@*/ void -ffi_assert( -/*@temp@*/ char* expr, -/*@temp@*/ char* file, - int line); -void -ffi_stop_here(void); -void -ffi_type_test( -/*@temp@*/ /*@out@*/ ffi_type* a, -/*@temp@*/ char* file, - int line); - -# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) -# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) -# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) -#else -# define FFI_ASSERT(x) -# define FFI_ASSERT_AT(x, f, l) -# define FFI_ASSERT_VALID_TYPE(x) -#endif // #ifdef FFI_DEBUG - -#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep( - ffi_cif* cif); - -/* Extended cif, used in callback from assembly routine */ -typedef struct extended_cif { -/*@dependent@*/ ffi_cif* cif; -/*@dependent@*/ void* rvalue; -/*@dependent@*/ void** avalue; -} extended_cif; - -/* Terse sized type definitions. */ -typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); -typedef signed int SINT8 __attribute__((__mode__(__QI__))); -typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); -typedef signed int SINT16 __attribute__((__mode__(__HI__))); -typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); -typedef signed int SINT32 __attribute__((__mode__(__SI__))); -typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); -typedef signed int SINT64 __attribute__((__mode__(__DI__))); -typedef float FLOAT32; - -#ifdef __cplusplus -} -#endif - -#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/fficonfig.h b/third_party/python/Modules/_ctypes/libffi_osx/include/fficonfig.h deleted file mode 100644 index 217249071..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/fficonfig.h +++ /dev/null @@ -1,150 +0,0 @@ -/* Manually created fficonfig.h for Darwin on PowerPC or Intel - - This file is manually generated to do away with the need for autoconf and - therefore make it easier to cross-compile and build fat binaries. - - NOTE: This file was added by PyObjC. -*/ - -#ifndef MACOSX -#error "This file is only supported on Mac OS X" -#endif - -#if defined(__i386__) -# define BYTEORDER 1234 -# undef HOST_WORDS_BIG_ENDIAN -# undef WORDS_BIGENDIAN -# define SIZEOF_DOUBLE 8 -# define HAVE_LONG_DOUBLE 1 -# define SIZEOF_LONG_DOUBLE 16 - -#elif defined(__x86_64__) -# define BYTEORDER 1234 -# undef HOST_WORDS_BIG_ENDIAN -# undef WORDS_BIGENDIAN -# define SIZEOF_DOUBLE 8 -# define HAVE_LONG_DOUBLE 1 -# define SIZEOF_LONG_DOUBLE 16 - -#elif defined(__ppc__) -# define BYTEORDER 4321 -# define HOST_WORDS_BIG_ENDIAN 1 -# define WORDS_BIGENDIAN 1 -# define SIZEOF_DOUBLE 8 -# if __GNUC__ >= 4 -# define HAVE_LONG_DOUBLE 1 -# define SIZEOF_LONG_DOUBLE 16 -# else -# undef HAVE_LONG_DOUBLE -# define SIZEOF_LONG_DOUBLE 8 -# endif - -#elif defined(__ppc64__) -# define BYTEORDER 4321 -# define HOST_WORDS_BIG_ENDIAN 1 -# define WORDS_BIGENDIAN 1 -# define SIZEOF_DOUBLE 8 -# define HAVE_LONG_DOUBLE 1 -# define SIZEOF_LONG_DOUBLE 16 - -#else -#error "Unknown CPU type" -#endif - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define to 1 if using `alloca.c'. */ -/* #undef C_ALLOCA */ - -/* Define to the flags needed for the .section .eh_frame directive. */ -#define EH_FRAME_FLAGS "aw" - -/* Define this if you want extra debugging. */ -/* #undef FFI_DEBUG */ - -/* Define this is you do not want support for the raw API. */ -#define FFI_NO_RAW_API 1 - -/* Define this if you do not want support for aggregate types. */ -/* #undef FFI_NO_STRUCTS */ - -/* Define to 1 if you have `alloca', as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define to 1 if you have and it should be used (not on Ultrix). */ -#define HAVE_ALLOCA_H 1 - -/* Define if your assembler supports .register. */ -/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ - -/* Define if your assembler and linker support unaligned PC relative relocs. */ -/* #undef HAVE_AS_SPARC_UA_PCREL */ - -/* Define to 1 if you have the `memcpy' function. */ -#define HAVE_MEMCPY 1 - -/* Define if mmap with MAP_ANON(YMOUS) works. */ -#define HAVE_MMAP_ANON 1 - -/* Define if mmap of /dev/zero works. */ -/* #undef HAVE_MMAP_DEV_ZERO */ - -/* Define if read-only mmap of a plain file works. */ -#define HAVE_MMAP_FILE 1 - -/* Define if .eh_frame sections should be read-only. */ -/* #undef HAVE_RO_EH_FRAME */ - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -/* #undef NO_MINUS_C_MINUS_O */ - -/* Name of package */ -#define PACKAGE "libffi" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "libffi" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libffi 2.1" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "libffi" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "2.1" - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -/* #undef STACK_DIRECTION */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define this if you are using Purify and want to suppress spurious messages. */ -/* #undef USING_PURIFY */ - -/* Version number of package */ -#define VERSION "2.1-pyobjc" - -#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -# ifdef LIBFFI_ASM -# define FFI_HIDDEN(name) .hidden name -# else -# define FFI_HIDDEN __attribute__((visibility ("hidden"))) -# endif -#else -# ifdef LIBFFI_ASM -# define FFI_HIDDEN(name) -# else -# define FFI_HIDDEN -# endif -#endif \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/ffitarget.h b/third_party/python/Modules/_ctypes/libffi_osx/include/ffitarget.h deleted file mode 100644 index faaa30de6..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/ffitarget.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a - normal build, the build environment copies the file to the right location or - sets up the right include flags. We want to do neither because that would - make building fat binaries harder. -*/ - -#if defined(__i386__) || defined(__x86_64__) -#include "x86-ffitarget.h" -#elif defined(__ppc__) || defined(__ppc64__) -#include "ppc-ffitarget.h" -#else -#error "Unsupported CPU type" -#endif \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h b/third_party/python/Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h deleted file mode 100644 index 231842199..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for PowerPC. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#if (defined(POWERPC) && defined(__powerpc64__)) || \ - (defined(POWERPC_DARWIN) && defined(__ppc64__)) -#define POWERPC64 -#endif - -#ifndef LIBFFI_ASM - -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - -#ifdef POWERPC - FFI_SYSV, - FFI_GCC_SYSV, - FFI_LINUX64, -# ifdef POWERPC64 - FFI_DEFAULT_ABI = FFI_LINUX64, -# else - FFI_DEFAULT_ABI = FFI_GCC_SYSV, -# endif -#endif - -#ifdef POWERPC_AIX - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_AIX, -#endif - -#ifdef POWERPC_DARWIN - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_DARWIN, -#endif - -#ifdef POWERPC_FREEBSD - FFI_SYSV, - FFI_GCC_SYSV, - FFI_LINUX64, - FFI_DEFAULT_ABI = FFI_SYSV, -#endif - - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; - -#endif // #ifndef LIBFFI_ASM - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -/* Needed for FFI_SYSV small structure returns. */ -#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) - -#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ -# define FFI_TRAMPOLINE_SIZE 48 -#elif defined(POWERPC_AIX) -# define FFI_TRAMPOLINE_SIZE 24 -#else -# define FFI_TRAMPOLINE_SIZE 40 -#endif - -#ifndef LIBFFI_ASM -# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) -typedef struct ffi_aix_trampoline_struct { - void* code_pointer; /* Pointer to ffi_closure_ASM */ - void* toc; /* TOC */ - void* static_chain; /* Pointer to closure */ -} ffi_aix_trampoline_struct; -# endif -#endif // #ifndef LIBFFI_ASM - -#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/include/x86-ffitarget.h b/third_party/python/Modules/_ctypes/libffi_osx/include/x86-ffitarget.h deleted file mode 100644 index 55c2b6c50..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for x86 and x86-64. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#if defined(X86_64) && defined(__i386__) -# undef X86_64 -# define X86 -#endif - -#if defined(__x86_64__) -# ifndef X86_64 -# define X86_64 -# endif -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM - -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - - /* ---- Intel x86 Win32 ---------- */ -#ifdef X86_WIN32 - FFI_SYSV, - FFI_STDCALL, - /* TODO: Add fastcall support for the sake of completeness */ - FFI_DEFAULT_ABI = FFI_SYSV, -#endif - - /* ---- Intel x86 and AMD x86-64 - */ -#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) - FFI_SYSV, - FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ -# ifdef __i386__ - FFI_DEFAULT_ABI = FFI_SYSV, -# else - FFI_DEFAULT_ABI = FFI_UNIX64, -# endif -#endif - - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; - -#endif // #ifndef LIBFFI_ASM - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 - -#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) -# define FFI_TRAMPOLINE_SIZE 24 -# define FFI_NATIVE_RAW_API 0 -#else -# define FFI_TRAMPOLINE_SIZE 10 -# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif - -#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S b/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S deleted file mode 100644 index f143dbd28..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +++ /dev/null @@ -1,365 +0,0 @@ -#if defined(__ppc__) || defined(__ppc64__) - -/* ----------------------------------------------------------------------- - ppc-darwin.S - Copyright (c) 2000 John Hornkvist - Copyright (c) 2004 Free Software Foundation, Inc. - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM - -#include -#include -#include -#include - -.text - .align 2 -.globl _ffi_prep_args - -.text - .align 2 -.globl _ffi_call_DARWIN - -.text - .align 2 -_ffi_call_DARWIN: -LFB0: - mr r12,r8 /* We only need r12 until the call, - so it doesn't have to be saved. */ - -LFB1: - /* Save the old stack pointer as AP. */ - mr r8,r1 - -LCFI0: -#if defined(__ppc64__) - /* Allocate the stack space we need. - r4 (size of input data) - 48 bytes (linkage area) - 40 bytes (saved registers) - 8 bytes (extra FPR) - r4 + 96 bytes total - */ - - addi r4,r4,-96 // Add our overhead. - li r0,-32 // Align to 32 bytes. - and r4,r4,r0 -#endif - stgux r1,r1,r4 // Grow the stack. - mflr r9 - - /* Save registers we use. */ -#if defined(__ppc64__) - std r27,-40(r8) -#endif - stg r28,MODE_CHOICE(-16,-32)(r8) - stg r29,MODE_CHOICE(-12,-24)(r8) - stg r30,MODE_CHOICE(-8,-16)(r8) - stg r31,MODE_CHOICE(-4,-8)(r8) - stg r9,SF_RETURN(r8) /* return address */ -#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ - stg r2,MODE_CHOICE(20,40)(r1) -#endif - -LCFI1: -#if defined(__ppc64__) - mr r27,r3 // our extended_cif -#endif - /* Save arguments over call. */ - mr r31,r5 /* flags, */ - mr r30,r6 /* rvalue, */ - mr r29,r7 /* function address, */ - mr r28,r8 /* our AP. */ - -LCFI2: - /* Call ffi_prep_args. */ - mr r4,r1 - li r9,0 - mtctr r12 /* r12 holds address of _ffi_prep_args. */ - bctrl -#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ - lg r2,MODE_CHOICE(20,40)(r1) -#endif - - /* Now do the call. - Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40,r31 - - /* Load all those argument registers. - We have set up a nice stack frame, just load it into registers. */ - lg r3,SF_ARG1(r1) - lg r4,SF_ARG2(r1) - lg r5,SF_ARG3(r1) - lg r6,SF_ARG4(r1) - nop - lg r7,SF_ARG5(r1) - lg r8,SF_ARG6(r1) - lg r9,SF_ARG7(r1) - lg r10,SF_ARG8(r1) - - /* Load all the FP registers. */ - bf 6,L2 /* No floats to load. */ -#if defined(__ppc64__) - lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) - lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) - lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) - lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) - nop - lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) - lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) - lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) - lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) - nop - lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) - lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) - lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) - lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) - nop - lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) - lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) -#elif defined(__ppc__) - lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) - lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) - lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) - lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) - nop - lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) - lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) - lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) - lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) - nop - lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) - lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) - lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) - lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) - nop - lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) -#else -#error undefined architecture -#endif - -L2: - mr r12,r29 // Put the target address in r12 as specified. - mtctr r12 // Get the address to call into CTR. - nop - nop - bctrl // Make the call. - - // Deal with the return value. -#if defined(__ppc64__) - mtcrf 0x3,r31 // flags in cr6 and cr7 - bt 27,L(st_return_value) -#elif defined(__ppc__) - mtcrf 0x1,r31 // flags in cr7 -#else -#error undefined architecture -#endif - - bt 30,L(done_return_value) - bt 29,L(fp_return_value) - stg r3,0(r30) -#if defined(__ppc__) - bf 28,L(done_return_value) // Store the second long if necessary. - stg r4,4(r30) -#endif - // Fall through - -L(done_return_value): - lg r1,0(r1) // Restore stack pointer. - // Restore the registers we used. - lg r9,SF_RETURN(r1) // return address - lg r31,MODE_CHOICE(-4,-8)(r1) - mtlr r9 - lg r30,MODE_CHOICE(-8,-16)(r1) - lg r29,MODE_CHOICE(-12,-24)(r1) - lg r28,MODE_CHOICE(-16,-32)(r1) -#if defined(__ppc64__) - ld r27,-40(r1) -#endif - blr - -#if defined(__ppc64__) -L(st_return_value): - // Grow the stack enough to fit the registers. Leave room for 8 args - // to trample the 1st 8 slots in param area. - stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 - - // Store GPRs - std r3,SF_ARG9(r1) - std r4,SF_ARG10(r1) - std r5,SF_ARG11(r1) - std r6,SF_ARG12(r1) - nop - std r7,SF_ARG13(r1) - std r8,SF_ARG14(r1) - std r9,SF_ARG15(r1) - std r10,SF_ARG16(r1) - - // Store FPRs - nop - bf 26,L(call_struct_to_ram_form) - stfd f1,SF_ARG17(r1) - stfd f2,SF_ARG18(r1) - stfd f3,SF_ARG19(r1) - stfd f4,SF_ARG20(r1) - nop - stfd f5,SF_ARG21(r1) - stfd f6,SF_ARG22(r1) - stfd f7,SF_ARG23(r1) - stfd f8,SF_ARG24(r1) - nop - stfd f9,SF_ARG25(r1) - stfd f10,SF_ARG26(r1) - stfd f11,SF_ARG27(r1) - stfd f12,SF_ARG28(r1) - nop - stfd f13,SF_ARG29(r1) - -L(call_struct_to_ram_form): - ld r3,0(r27) // extended_cif->cif* - ld r3,16(r3) // ffi_cif->rtype* - addi r4,r1,SF_ARG9 // stored GPRs - addi r6,r1,SF_ARG17 // stored FPRs - li r5,0 // GPR size ptr (NULL) - li r7,0 // FPR size ptr (NULL) - li r8,0 // FPR count ptr (NULL) - li r10,0 // struct offset (NULL) - mr r9,r30 // return area - bl Lffi64_struct_to_ram_form$stub - lg r1,0(r1) // Restore stack pointer. - b L(done_return_value) -#endif - -L(fp_return_value): - /* Do we have long double to store? */ - bf 31,L(fd_return_value) - stfd f1,0(r30) - stfd f2,8(r30) - b L(done_return_value) - -L(fd_return_value): - /* Do we have double to store? */ - bf 28,L(float_return_value) - stfd f1,0(r30) - b L(done_return_value) - -L(float_return_value): - /* We only have a float to store. */ - stfs f1,0(r30) - b L(done_return_value) - -LFE1: -/* END(_ffi_call_DARWIN) */ - -/* Provide a null definition of _ffi_call_AIX. */ -.text - .align 2 -.globl _ffi_call_AIX -.text - .align 2 -_ffi_call_AIX: - blr -/* END(_ffi_call_AIX) */ - -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: -.globl _ffi_call_DARWIN.eh -_ffi_call_DARWIN.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length - -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long LFB0-. ; FDE initial location - .set L$set$3,LFE1-LFB0 - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-LFB1 - .long L$set$4 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x08 ; uleb128 0x08 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$5,LCFI1-LCFI0 - .long L$set$5 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .byte 0x9f ; DW_CFA_offset, column 0x1f - .byte 0x1 ; uleb128 0x1 - .byte 0x9e ; DW_CFA_offset, column 0x1e - .byte 0x2 ; uleb128 0x2 - .byte 0x9d ; DW_CFA_offset, column 0x1d - .byte 0x3 ; uleb128 0x3 - .byte 0x9c ; DW_CFA_offset, column 0x1c - .byte 0x4 ; uleb128 0x4 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$6,LCFI2-LCFI1 - .long L$set$6 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x1c ; uleb128 0x1c - .align LOG2_GPR_BYTES -LEFDE1: - -#if defined(__ppc64__) -.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align LOG2_GPR_BYTES - -Lffi64_struct_to_ram_form$stub: - .indirect_symbol _ffi64_struct_to_ram_form - mflr r0 - bcl 20,31,LO$ffi64_struct_to_ram_form - -LO$ffi64_struct_to_ram_form: - mflr r11 - addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) - mtlr r0 - lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) - mtctr r12 - bctr - -.lazy_symbol_pointer -L_ffi64_struct_to_ram_form$lazy_ptr: - .indirect_symbol _ffi64_struct_to_ram_form - .g_long dyld_stub_binding_helper - -#endif // __ppc64__ -#endif // __ppc__ || __ppc64__ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h b/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h deleted file mode 100644 index cf4bd50f9..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +++ /dev/null @@ -1,85 +0,0 @@ -/* ----------------------------------------------------------------------- - ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, - Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define L(x) x - -#define SF_ARG9 MODE_CHOICE(56,112) -#define SF_ARG10 MODE_CHOICE(60,120) -#define SF_ARG11 MODE_CHOICE(64,128) -#define SF_ARG12 MODE_CHOICE(68,136) -#define SF_ARG13 MODE_CHOICE(72,144) -#define SF_ARG14 MODE_CHOICE(76,152) -#define SF_ARG15 MODE_CHOICE(80,160) -#define SF_ARG16 MODE_CHOICE(84,168) -#define SF_ARG17 MODE_CHOICE(88,176) -#define SF_ARG18 MODE_CHOICE(92,184) -#define SF_ARG19 MODE_CHOICE(96,192) -#define SF_ARG20 MODE_CHOICE(100,200) -#define SF_ARG21 MODE_CHOICE(104,208) -#define SF_ARG22 MODE_CHOICE(108,216) -#define SF_ARG23 MODE_CHOICE(112,224) -#define SF_ARG24 MODE_CHOICE(116,232) -#define SF_ARG25 MODE_CHOICE(120,240) -#define SF_ARG26 MODE_CHOICE(124,248) -#define SF_ARG27 MODE_CHOICE(128,256) -#define SF_ARG28 MODE_CHOICE(132,264) -#define SF_ARG29 MODE_CHOICE(136,272) - -#define ASM_NEEDS_REGISTERS 4 -#define NUM_GPR_ARG_REGISTERS 8 -#define NUM_FPR_ARG_REGISTERS 13 - -#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) -#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) -#define FFI_TYPE_4_BYTE(x) \ - ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ - (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) - -#if !defined(LIBFFI_ASM) - -enum { - FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 - FLAG_RETURNS_FP = 1 << (31 - 29), - FLAG_RETURNS_64BITS = 1 << (31 - 28), - FLAG_RETURNS_128BITS = 1 << (31 - 31), - - FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 - FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), - - FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), - FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI - FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), - FLAG_RETVAL_REFERENCE = 1 << (31 - 4) -}; - -#if defined(__ppc64__) -void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, - const char*, unsigned int*, unsigned int*, char*, unsigned int*); -void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, - unsigned int*, char*, unsigned int*, char*, unsigned int*); -bool ffi64_stret_needs_ptr(const ffi_type* inType, - unsigned short*, unsigned short*); -#endif - -#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S b/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S deleted file mode 100644 index c3d30c252..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +++ /dev/null @@ -1,308 +0,0 @@ -#if defined(__ppc__) - -/* ----------------------------------------------------------------------- - ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, - Inc. based on ppc_closure.S - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM - -#include -#include // for FFI_TRAMPOLINE_SIZE -#include -#include - - .file "ppc-darwin_closure.S" -.text - .align LOG2_GPR_BYTES - .globl _ffi_closure_ASM - -.text - .align LOG2_GPR_BYTES - -_ffi_closure_ASM: -LFB1: - mflr r0 // Save return address - stg r0,SF_RETURN(r1) - -LCFI0: - /* 24/48 bytes (Linkage Area) - 32/64 bytes (outgoing parameter area, always reserved) - 104 bytes (13*8 from FPR) - 16/32 bytes (result) - 176/232 total bytes */ - - /* skip over caller save area and keep stack aligned to 16/32. */ - stgu r1,-SF_ROUND(176)(r1) - -LCFI1: - /* We want to build up an area for the parameters passed - in registers. (both floating point and integer) */ - - /* 176/256 bytes (callee stack frame aligned to 16/32) - 24/48 bytes (caller linkage area) - 200/304 (start of caller parameter area aligned to 4/8) - */ - - /* Save GPRs 3 - 10 (aligned to 4/8) - in the parents outgoing area. */ - stg r3,200(r1) - stg r4,204(r1) - stg r5,208(r1) - stg r6,212(r1) - stg r7,216(r1) - stg r8,220(r1) - stg r9,224(r1) - stg r10,228(r1) - - /* Save FPRs 1 - 13. (aligned to 8) */ - stfd f1,56(r1) - stfd f2,64(r1) - stfd f3,72(r1) - stfd f4,80(r1) - stfd f5,88(r1) - stfd f6,96(r1) - stfd f7,104(r1) - stfd f8,112(r1) - stfd f9,120(r1) - stfd f10,128(r1) - stfd f11,136(r1) - stfd f12,144(r1) - stfd f13,152(r1) - - // Set up registers for the routine that actually does the work. - mr r3,r11 // context pointer from the trampoline - addi r4,r1,160 // result storage - addi r5,r1,200 // saved GPRs - addi r6,r1,56 // saved FPRs - bl Lffi_closure_helper_DARWIN$stub - - /* Now r3 contains the return type. Use it to look up in a table - so we know how to deal with each type. */ - addi r5,r1,160 // Copy result storage pointer. - bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. - mflr r4 // Move to r4. - slwi r3,r3,4 // Multiply return type by 16. - add r3,r3,r4 // Add contents of table to table address. - mtctr r3 - bctr - -LFE1: -/* Each of the ret_typeX code fragments has to be exactly 16 bytes long - (4 instructions). For cache effectiveness we align to a 16 byte boundary - first. */ - .align 4 - nop - nop - nop - -Lget_ret_type0_addr: - blrl - -/* case FFI_TYPE_VOID */ -Lret_type0: - b Lfinish - nop - nop - nop - -/* case FFI_TYPE_INT */ -Lret_type1: - lwz r3,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_FLOAT */ -Lret_type2: - lfs f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_DOUBLE */ -Lret_type3: - lfd f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_LONGDOUBLE */ -Lret_type4: - lfd f1,0(r5) - lfd f2,8(r5) - b Lfinish - nop - -/* case FFI_TYPE_UINT8 */ -Lret_type5: - lbz r3,3(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT8 */ -Lret_type6: - lbz r3,3(r5) - extsb r3,r3 - b Lfinish - nop - -/* case FFI_TYPE_UINT16 */ -Lret_type7: - lhz r3,2(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT16 */ -Lret_type8: - lha r3,2(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT32 */ -Lret_type9: // same as Lret_type1 - lwz r3,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT32 */ -Lret_type10: // same as Lret_type1 - lwz r3,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT64 */ -Lret_type11: - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish - nop - -/* case FFI_TYPE_SINT64 */ -Lret_type12: // same as Lret_type11 - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish - nop - -/* case FFI_TYPE_STRUCT */ -Lret_type13: - b Lfinish - nop - nop - nop - -/* End 16-byte aligned cases */ -/* case FFI_TYPE_POINTER */ -// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types -// are added in future, the following code will need to be updated and -// padded to 16 bytes. -Lret_type14: - lg r3,0(r5) - // fall through - -/* case done */ -Lfinish: - addi r1,r1,SF_ROUND(176) // Restore stack pointer. - lg r0,SF_RETURN(r1) // Restore return address. - mtlr r0 // Restore link register. - blr - -/* END(ffi_closure_ASM) */ - -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: -.globl _ffi_closure_ASM.eh -_ffi_closure_ASM.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length - -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long LFB1-. ; FDE initial location - .set L$set$3,LFE1-LFB1 - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$3,LCFI1-LCFI0 - .long L$set$3 - .byte 0xe ; DW_CFA_def_cfa_offset - .byte 176,1 ; uleb128 176 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-LFB1 - .long L$set$4 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .align LOG2_GPR_BYTES - -LEFDE1: -.data - .align LOG2_GPR_BYTES -LDFCM0: -.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align LOG2_GPR_BYTES - -Lffi_closure_helper_DARWIN$stub: - .indirect_symbol _ffi_closure_helper_DARWIN - mflr r0 - bcl 20,31,LO$ffi_closure_helper_DARWIN - -LO$ffi_closure_helper_DARWIN: - mflr r11 - addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) - mtlr r0 - lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) - mtctr r12 - bctr - -.lazy_symbol_pointer -L_ffi_closure_helper_DARWIN$lazy_ptr: - .indirect_symbol _ffi_closure_helper_DARWIN - .g_long dyld_stub_binding_helper - - -#endif // __ppc__ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c b/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c deleted file mode 100644 index 8953d5fda..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +++ /dev/null @@ -1,1776 +0,0 @@ -#if defined(__ppc__) || defined(__ppc64__) - -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - Darwin ABI support (c) 2001 John Hornkvist - AIX ABI support (c) 2002 Free Software Foundation, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include -#include -#include - -#if 0 -#if defined(POWERPC_DARWIN) -#include // for sys_icache_invalidate() -#endif - -#else - -#pragma weak sys_icache_invalidate -extern void sys_icache_invalidate(void *start, size_t len); - -#endif - - -extern void ffi_closure_ASM(void); - -// The layout of a function descriptor. A C function pointer really -// points to one of these. -typedef struct aix_fd_struct { - void* code_pointer; - void* toc; -} aix_fd; - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments. - - The stack layout we want looks like this: - - | Return address from ffi_call_DARWIN | higher addresses - |--------------------------------------------| - | Previous backchain pointer 4/8 | stack pointer here - |--------------------------------------------|-\ <<< on entry to - | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN - |--------------------------------------------| | - | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 - |--------------------------------------------| | - | Space for GPR2 4/8 | | - |--------------------------------------------| | stack | - | Reserved (4/8)*2 | | grows | - |--------------------------------------------| | down V - | Space for callee's LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 | | during - |--------------------------------------------|-/ <<< ffi_call_DARWIN - - Note: ppc64 CR is saved in the low word of a long on the stack. -*/ - -/*@-exportheader@*/ -void -ffi_prep_args( - extended_cif* inEcif, - unsigned *const stack) -/*@=exportheader@*/ -{ - /* Copy the ecif to a local var so we can trample the arg. - BC note: test this with GP later for possible problems... */ - volatile extended_cif* ecif = inEcif; - - const unsigned bytes = ecif->cif->bytes; - const unsigned flags = ecif->cif->flags; - - /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode - and 8 in 64-bit mode. */ - unsigned long *const longStack = (unsigned long *const)stack; - - /* 'stacktop' points at the previous backchain pointer. */ -#if defined(__ppc64__) - // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, - // saved registers, and an extra FPR. - unsigned long *const stacktop = - (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); -#elif defined(__ppc__) - unsigned long *const stacktop = longStack + (bytes / sizeof(long)); -#else -#error undefined architecture -#endif - - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - - NUM_FPR_ARG_REGISTERS; - -#if defined(__ppc64__) - // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base - // down a couple pegs. - fpr_base -= 2; -#endif - - unsigned int fparg_count = 0; - - /* 'next_arg' grows up as we put parameters in it. */ - unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ - - int i; - double double_tmp; - void** p_argv = ecif->avalue; - unsigned long gprvalue; - ffi_type** ptr = ecif->cif->arg_types; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT(stack == SF_ROUND(stack)); - FFI_ASSERT(stacktop == SF_ROUND(stacktop)); - FFI_ASSERT(bytes == SF_ROUND(bytes)); - - /* Deal with return values that are actually pass-by-reference. - Rule: - Return values are referenced by r3, so r4 is the first parameter. */ - - if (flags & FLAG_RETVAL_REFERENCE) - *next_arg++ = (unsigned long)(char*)ecif->rvalue; - - /* Now for the arguments. */ - for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) - { - switch ((*ptr)->type) - { - /* If a floating-point parameter appears before all of the general- - purpose registers are filled, the corresponding GPRs that match - the size of the floating-point parameter are shadowed for the - benefit of vararg and pre-ANSI functions. */ - case FFI_TYPE_FLOAT: - double_tmp = *(float*)*p_argv; - - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - - *(double*)next_arg = double_tmp; - - next_arg++; - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - - break; - - case FFI_TYPE_DOUBLE: - double_tmp = *(double*)*p_argv; - - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - - *(double*)next_arg = double_tmp; - - next_arg += MODE_CHOICE(2,1); - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#if defined(__ppc64__) - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *(long double*)fpr_base = *(long double*)*p_argv; -#elif defined(__ppc__) - if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) - *(long double*)fpr_base = *(long double*)*p_argv; - else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) - *(double*)fpr_base = *(double*)*p_argv; -#else -#error undefined architecture -#endif - - *(long double*)next_arg = *(long double*)*p_argv; - fparg_count += 2; - fpr_base += 2; - next_arg += MODE_CHOICE(4,2); - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - - break; -#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#if defined(__ppc64__) - gprvalue = *(long long*)*p_argv; - goto putgpr; -#elif defined(__ppc__) - *(long long*)next_arg = *(long long*)*p_argv; - next_arg += 2; - break; -#else -#error undefined architecture -#endif - - case FFI_TYPE_POINTER: - gprvalue = *(unsigned long*)*p_argv; - goto putgpr; - - case FFI_TYPE_UINT8: - gprvalue = *(unsigned char*)*p_argv; - goto putgpr; - - case FFI_TYPE_SINT8: - gprvalue = *(signed char*)*p_argv; - goto putgpr; - - case FFI_TYPE_UINT16: - gprvalue = *(unsigned short*)*p_argv; - goto putgpr; - - case FFI_TYPE_SINT16: - gprvalue = *(signed short*)*p_argv; - goto putgpr; - - case FFI_TYPE_STRUCT: - { -#if defined(__ppc64__) - unsigned int gprSize = 0; - unsigned int fprSize = 0; - - ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, - (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); - next_arg += gprSize / sizeof(long); - fpr_base += fprSize / sizeof(double); - -#elif defined(__ppc__) - char* dest_cpy = (char*)next_arg; - - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. - Structures with 3 byte in size are padded upwards. */ - unsigned size_al = (*ptr)->size; - - /* If the first member of the struct is a double, then align - the struct to double-word. */ - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN((*ptr)->size, 8); - - if (ecif->cif->abi == FFI_DARWIN) - { - if (size_al < 3) - dest_cpy += 4 - size_al; - } - - memcpy((char*)dest_cpy, (char*)*p_argv, size_al); - next_arg += (size_al + 3) / 4; -#else -#error undefined architecture -#endif - break; - } - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - gprvalue = *(unsigned*)*p_argv; - -putgpr: - *next_arg++ = gprvalue; - break; - - default: - break; - } - } - - /* Check that we didn't overrun the stack... */ - //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); - //FFI_ASSERT((unsigned *)fpr_base - // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); - //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); -} - -#if defined(__ppc64__) - -bool -ffi64_struct_contains_fp( - const ffi_type* inType) -{ - bool containsFP = false; - unsigned int i; - - for (i = 0; inType->elements[i] != NULL && !containsFP; i++) - { - if (inType->elements[i]->type == FFI_TYPE_FLOAT || - inType->elements[i]->type == FFI_TYPE_DOUBLE || - inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) - containsFP = true; - else if (inType->elements[i]->type == FFI_TYPE_STRUCT) - containsFP = ffi64_struct_contains_fp(inType->elements[i]); - } - - return containsFP; -} - -#endif // defined(__ppc64__) - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep( - ffi_cif* cif) -{ - /* All this is for the DARWIN ABI. */ - int i; - ffi_type** ptr; - int intarg_count = 0; - int fparg_count = 0; - unsigned int flags = 0; - unsigned int size_al = 0; - - /* All the machine-independent calculation of cif->bytes will be wrong. - Redo the calculation for DARWIN. */ - - /* Space for the frame pointer, callee's LR, CR, etc, and for - the asm's temp regs. */ - unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); - - /* Return value handling. The rules are as follows: - - 32-bit (or less) integer values are returned in gpr3; - - Structures of size <= 4 bytes also returned in gpr3; - - 64-bit integer values and structures between 5 and 8 bytes are - returned in gpr3 and gpr4; - - Single/double FP values are returned in fpr1; - - Long double FP (if not equivalent to double) values are returned in - fpr1 and fpr2; - - Larger structures values are allocated space and a pointer is passed - as the first argument. */ - switch (cif->rtype->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - flags |= FLAG_RETURNS_FP; - break; -#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - -#if defined(__ppc64__) - case FFI_TYPE_POINTER: -#endif - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: - { -#if defined(__ppc64__) - - if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) - { - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - } - else - { - flags |= FLAG_RETURNS_STRUCT; - - if (ffi64_struct_contains_fp(cif->rtype)) - flags |= FLAG_STRUCT_CONTAINS_FP; - } - -#elif defined(__ppc__) - - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - -#else -#error undefined architecture -#endif - break; - } - - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the - first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest - goes on the stack. Structures are passed as a pointer to a copy of - the structure. Stuff on the stack needs to keep proper alignment. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - switch ((*ptr)->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - fparg_count++; - /* If this FP arg is going on the stack, it must be - 8-byte-aligned. */ - if (fparg_count > NUM_FPR_ARG_REGISTERS - && intarg_count % 2 != 0) - intarg_count++; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - fparg_count += 2; - /* If this FP arg is going on the stack, it must be - 8-byte-aligned. */ - - if ( -#if defined(__ppc64__) - fparg_count > NUM_FPR_ARG_REGISTERS + 1 -#elif defined(__ppc__) - fparg_count > NUM_FPR_ARG_REGISTERS -#else -#error undefined architecture -#endif - && intarg_count % 2 != 0) - intarg_count++; - - intarg_count += 2; - break; -#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* 'long long' arguments are passed as two words, but - either both words must fit in registers or both go - on the stack. If they go on the stack, they must - be 8-byte-aligned. */ - if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 - || (intarg_count >= NUM_GPR_ARG_REGISTERS - && intarg_count % 2 != 0)) - intarg_count++; - - intarg_count += MODE_CHOICE(2,1); - - break; - - case FFI_TYPE_STRUCT: - size_al = (*ptr)->size; - /* If the first member of the struct is a double, then align - the struct to double-word. */ - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN((*ptr)->size, 8); - -#if defined(__ppc64__) - // Look for FP struct members. - unsigned int j; - - for (j = 0; (*ptr)->elements[j] != NULL; j++) - { - if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || - (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) - { - fparg_count++; - - if (fparg_count > NUM_FPR_ARG_REGISTERS) - intarg_count++; - } - else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) - { - fparg_count += 2; - - if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) - intarg_count += 2; - } - else - intarg_count++; - } -#elif defined(__ppc__) - intarg_count += (size_al + 3) / 4; -#else -#error undefined architecture -#endif - - break; - - default: - /* Everything else is passed as a 4/8-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - break; - } - } - - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - { - flags |= FLAG_FP_ARGUMENTS; -#if defined(__ppc64__) - bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); -#elif defined(__ppc__) - bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); -#else -#error undefined architecture -#endif - } - - /* Stack space. */ -#if defined(__ppc64__) - if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + fparg_count) * sizeof(long); -#elif defined(__ppc__) - if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + 2 * fparg_count) * sizeof(long); -#else -#error undefined architecture -#endif - else - bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); - - /* The stack space allocated needs to be a multiple of 16/32 bytes. */ - bytes = SF_ROUND(bytes); - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -/*@-declundef@*/ -/*@-exportheader@*/ -extern void -ffi_call_AIX( -/*@out@*/ extended_cif*, - unsigned, - unsigned, -/*@out@*/ unsigned*, - void (*fn)(void), - void (*fn2)(extended_cif*, unsigned *const)); - -extern void -ffi_call_DARWIN( -/*@out@*/ extended_cif*, - unsigned long, - unsigned, -/*@out@*/ unsigned*, - void (*fn)(void), - void (*fn2)(extended_cif*, unsigned *const)); -/*@=declundef@*/ -/*@=exportheader@*/ - -void -ffi_call( -/*@dependent@*/ ffi_cif* cif, - void (*fn)(void), -/*@out@*/ void* rvalue, -/*@dependent@*/ void** avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - /*@-sysunrecog@*/ - ecif.rvalue = alloca(cif->rtype->size); - /*@=sysunrecog@*/ - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_AIX: - /*@-usedef@*/ - ffi_call_AIX(&ecif, -cif->bytes, - cif->flags, ecif.rvalue, fn, ffi_prep_args); - /*@=usedef@*/ - break; - - case FFI_DARWIN: - /*@-usedef@*/ - ffi_call_DARWIN(&ecif, -(long)cif->bytes, - cif->flags, ecif.rvalue, fn, ffi_prep_args); - /*@=usedef@*/ - break; - - default: - FFI_ASSERT(0); - break; - } -} - -/* here I'd like to add the stack frame layout we use in darwin_closure.S - and aix_clsoure.S - - SP previous -> +---------------------------------------+ <--- child frame - | back chain to caller 4 | - +---------------------------------------+ 4 - | saved CR 4 | - +---------------------------------------+ 8 - | saved LR 4 | - +---------------------------------------+ 12 - | reserved for compilers 4 | - +---------------------------------------+ 16 - | reserved for binders 4 | - +---------------------------------------+ 20 - | saved TOC pointer 4 | - +---------------------------------------+ 24 - | always reserved 8*4=32 (previous GPRs)| - | according to the linkage convention | - | from AIX | - +---------------------------------------+ 56 - | our FPR area 13*8=104 | - | f1 | - | . | - | f13 | - +---------------------------------------+ 160 - | result area 8 | - +---------------------------------------+ 168 - | alignement to the next multiple of 16 | -SP current --> +---------------------------------------+ 176 <- parent frame - | back chain to caller 4 | - +---------------------------------------+ 180 - | saved CR 4 | - +---------------------------------------+ 184 - | saved LR 4 | - +---------------------------------------+ 188 - | reserved for compilers 4 | - +---------------------------------------+ 192 - | reserved for binders 4 | - +---------------------------------------+ 196 - | saved TOC pointer 4 | - +---------------------------------------+ 200 - | always reserved 8*4=32 we store our | - | GPRs here | - | r3 | - | . | - | r10 | - +---------------------------------------+ 232 - | overflow part | - +---------------------------------------+ xxx - | ???? | - +---------------------------------------+ xxx -*/ - -#if !defined(POWERPC_DARWIN) - -#define MIN_LINE_SIZE 32 - -static void -flush_icache( - char* addr) -{ -#ifndef _AIX - __asm__ volatile ( - "dcbf 0,%0\n" - "sync\n" - "icbi 0,%0\n" - "sync\n" - "isync" - : : "r" (addr) : "memory"); -#endif -} - -static void -flush_range( - char* addr, - int size) -{ - int i; - - for (i = 0; i < size; i += MIN_LINE_SIZE) - flush_icache(addr + i); - - flush_icache(addr + size - 1); -} - -#endif // !defined(POWERPC_DARWIN) - -ffi_status -ffi_prep_closure( - ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void* user_data) -{ - switch (cif->abi) - { - case FFI_DARWIN: - { - FFI_ASSERT (cif->abi == FFI_DARWIN); - - unsigned int* tramp = (unsigned int*)&closure->tramp[0]; - -#if defined(__ppc64__) - tramp[0] = 0x7c0802a6; // mflr r0 - tramp[1] = 0x429f0005; // bcl 20,31,+0x8 - tramp[2] = 0x7d6802a6; // mflr r11 - tramp[3] = 0x7c0803a6; // mtlr r0 - tramp[4] = 0xe98b0018; // ld r12,24(r11) - tramp[5] = 0x7d8903a6; // mtctr r12 - tramp[6] = 0xe96b0020; // ld r11,32(r11) - tramp[7] = 0x4e800420; // bctr - *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; - *(unsigned long*)&tramp[10] = (unsigned long)closure; -#elif defined(__ppc__) - tramp[0] = 0x7c0802a6; // mflr r0 - tramp[1] = 0x429f0005; // bcl 20,31,+0x8 - tramp[2] = 0x7d6802a6; // mflr r11 - tramp[3] = 0x7c0803a6; // mtlr r0 - tramp[4] = 0x818b0018; // lwz r12,24(r11) - tramp[5] = 0x7d8903a6; // mtctr r12 - tramp[6] = 0x816b001c; // lwz r11,28(r11) - tramp[7] = 0x4e800420; // bctr - tramp[8] = (unsigned long)ffi_closure_ASM; - tramp[9] = (unsigned long)closure; -#else -#error undefined architecture -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - // Flush the icache. Only necessary on Darwin. -#if defined(POWERPC_DARWIN) - sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); -#else - flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); -#endif - - break; - } - - case FFI_AIX: - { - FFI_ASSERT (cif->abi == FFI_AIX); - - ffi_aix_trampoline_struct* tramp_aix = - (ffi_aix_trampoline_struct*)(closure->tramp); - aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; - - tramp_aix->code_pointer = fd->code_pointer; - tramp_aix->toc = fd->toc; - tramp_aix->static_chain = closure; - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - break; - } - - default: - return FFI_BAD_ABI; - } - - return FFI_OK; -} - -#if defined(__ppc__) - typedef double ldbits[2]; - - typedef union - { - ldbits lb; - long double ld; - } ldu; -#endif - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the - address of the closure. After storing the registers that could possibly - contain parameters to be passed into the stack frame and setting up space - for a return value, ffi_closure_ASM invokes the following helper function - to do most of the work. */ -int -ffi_closure_helper_DARWIN( - ffi_closure* closure, - void* rvalue, - unsigned long* pgr, - ffi_dblfl* pfr) -{ - /* rvalue is the pointer to space for return value in closure assembly - pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM - pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ - -#if defined(__ppc__) - ldu temp_ld; -#endif - - double temp; - unsigned int i; - unsigned int nf = 0; /* number of FPRs already used. */ - unsigned int ng = 0; /* number of GPRs already used. */ - ffi_cif* cif = closure->cif; - long avn = cif->nargs; - void** avalue = alloca(cif->nargs * sizeof(void*)); - ffi_type** arg_types = cif->arg_types; - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. */ -#if defined(__ppc64__) - if (cif->rtype->type == FFI_TYPE_STRUCT && - ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) -#elif defined(__ppc__) - if (cif->rtype->type == FFI_TYPE_STRUCT) -#else -#error undefined architecture -#endif - { - rvalue = (void*)*pgr; - pgr++; - ng++; - } - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < avn; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = (char*)pgr + MODE_CHOICE(3,7); - ng++; - pgr++; - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = (char*)pgr + MODE_CHOICE(2,6); - ng++; - pgr++; - break; - -#if defined(__ppc__) - case FFI_TYPE_POINTER: -#endif - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - avalue[i] = (char*)pgr + MODE_CHOICE(0,4); - ng++; - pgr++; - - break; - - case FFI_TYPE_STRUCT: - if (cif->abi == FFI_DARWIN) - { -#if defined(__ppc64__) - unsigned int gprSize = 0; - unsigned int fprSize = 0; - unsigned int savedFPRSize = fprSize; - - avalue[i] = alloca(arg_types[i]->size); - ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, - &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); - - ng += gprSize / sizeof(long); - pgr += gprSize / sizeof(long); - pfr += (fprSize - savedFPRSize) / sizeof(double); - -#elif defined(__ppc__) - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. */ - unsigned int size_al = size_al = arg_types[i]->size; - - /* If the first member of the struct is a double, then align - the struct to double-word. */ - if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN(arg_types[i]->size, 8); - - if (size_al < 3) - avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; - else - avalue[i] = (void*)pgr; - - ng += (size_al + 3) / sizeof(long); - pgr += (size_al + 3) / sizeof(long); -#else -#error undefined architecture -#endif - } - - break; - -#if defined(__ppc64__) - case FFI_TYPE_POINTER: -#endif - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* Long long ints are passed in 1 or 2 GPRs. */ - avalue[i] = pgr; - ng += MODE_CHOICE(2,1); - pgr += MODE_CHOICE(2,1); - - break; - - case FFI_TYPE_FLOAT: - /* A float value consumes a GPR. - There are 13 64-bit floating point registers. */ - if (nf < NUM_FPR_ARG_REGISTERS) - { - temp = pfr->d; - pfr->f = (float)temp; - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pgr; - - nf++; - ng++; - pgr++; - break; - - case FFI_TYPE_DOUBLE: - /* A double value consumes one or two GPRs. - There are 13 64bit floating point registers. */ - if (nf < NUM_FPR_ARG_REGISTERS) - { - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pgr; - - nf++; - ng += MODE_CHOICE(2,1); - pgr += MODE_CHOICE(2,1); - - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_LONGDOUBLE: -#if defined(__ppc64__) - if (nf < NUM_FPR_ARG_REGISTERS) - { - avalue[i] = pfr; - pfr += 2; - } -#elif defined(__ppc__) - /* A long double value consumes 2/4 GPRs and 2 FPRs. - There are 13 64bit floating point registers. */ - if (nf < NUM_FPR_ARG_REGISTERS - 1) - { - avalue[i] = pfr; - pfr += 2; - } - /* Here we have the situation where one part of the long double - is stored in fpr13 and the other part is already on the stack. - We use a union to pass the long double to avalue[i]. */ - else if (nf == NUM_FPR_ARG_REGISTERS - 1) - { - memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); - memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); - avalue[i] = &temp_ld.ld; - } -#else -#error undefined architecture -#endif - else - avalue[i] = pgr; - - nf += 2; - ng += MODE_CHOICE(4,2); - pgr += MODE_CHOICE(4,2); - - break; - -#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ - - default: - FFI_ASSERT(0); - break; - } - } - - (closure->fun)(cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype->type; -} - -#if defined(__ppc64__) - -/* ffi64_struct_to_ram_form - - Rebuild a struct's natural layout from buffers of concatenated registers. - Return the number of registers used. - inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... -*/ -void -ffi64_struct_to_ram_form( - const ffi_type* inType, - const char* inGPRs, - unsigned int* ioGPRMarker, - const char* inFPRs, - unsigned int* ioFPRMarker, - unsigned int* ioFPRsUsed, - char* outStruct, // caller-allocated - unsigned int* ioStructMarker) -{ - unsigned int srcGMarker = 0; - unsigned int srcFMarker = 0; - unsigned int savedFMarker = 0; - unsigned int fprsUsed = 0; - unsigned int savedFPRsUsed = 0; - unsigned int destMarker = 0; - - static unsigned int recurseCount = 0; - - if (ioGPRMarker) - srcGMarker = *ioGPRMarker; - - if (ioFPRMarker) - { - srcFMarker = *ioFPRMarker; - savedFMarker = srcFMarker; - } - - if (ioFPRsUsed) - { - fprsUsed = *ioFPRsUsed; - savedFPRsUsed = fprsUsed; - } - - if (ioStructMarker) - destMarker = *ioStructMarker; - - size_t i; - - switch (inType->size) - { - case 1: case 2: case 4: - srcGMarker += 8 - inType->size; - break; - - default: - break; - } - - for (i = 0; inType->elements[i] != NULL; i++) - { - switch (inType->elements[i]->type) - { - case FFI_TYPE_FLOAT: - srcFMarker = ALIGN(srcFMarker, 4); - srcGMarker = ALIGN(srcGMarker, 4); - destMarker = ALIGN(destMarker, 4); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - *(float*)&outStruct[destMarker] = - (float)*(double*)&inFPRs[srcFMarker]; - srcFMarker += 8; - fprsUsed++; - } - else - *(float*)&outStruct[destMarker] = - (float)*(double*)&inGPRs[srcGMarker]; - - srcGMarker += 4; - destMarker += 4; - - // Skip to next GPR if next element won't fit and we're - // not already at a register boundary. - if (inType->elements[i + 1] != NULL && (destMarker % 8)) - { - if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && - (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || - (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && - (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || - (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) - srcGMarker = ALIGN(srcGMarker, 8); - } - - break; - - case FFI_TYPE_DOUBLE: - srcFMarker = ALIGN(srcFMarker, 8); - destMarker = ALIGN(destMarker, 8); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - *(double*)&outStruct[destMarker] = - *(double*)&inFPRs[srcFMarker]; - srcFMarker += 8; - fprsUsed++; - } - else - *(double*)&outStruct[destMarker] = - *(double*)&inGPRs[srcGMarker]; - - destMarker += 8; - - // Skip next GPR - srcGMarker += 8; - srcGMarker = ALIGN(srcGMarker, 8); - - break; - - case FFI_TYPE_LONGDOUBLE: - destMarker = ALIGN(destMarker, 16); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - srcFMarker = ALIGN(srcFMarker, 8); - srcGMarker = ALIGN(srcGMarker, 8); - *(long double*)&outStruct[destMarker] = - *(long double*)&inFPRs[srcFMarker]; - srcFMarker += 16; - fprsUsed += 2; - } - else - { - srcFMarker = ALIGN(srcFMarker, 16); - srcGMarker = ALIGN(srcGMarker, 16); - *(long double*)&outStruct[destMarker] = - *(long double*)&inGPRs[srcGMarker]; - } - - destMarker += 16; - - // Skip next 2 GPRs - srcGMarker += 16; - srcGMarker = ALIGN(srcGMarker, 8); - - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - { - if (inType->alignment == 1) // chars only - { - if (inType->size == 1) - outStruct[destMarker++] = inGPRs[srcGMarker++]; - else if (inType->size == 2) - { - outStruct[destMarker++] = inGPRs[srcGMarker++]; - outStruct[destMarker++] = inGPRs[srcGMarker++]; - i++; - } - else - { - memcpy(&outStruct[destMarker], - &inGPRs[srcGMarker], inType->size); - srcGMarker += inType->size; - destMarker += inType->size; - i += inType->size - 1; - } - } - else // chars and other stuff - { - outStruct[destMarker++] = inGPRs[srcGMarker++]; - - // Skip to next GPR if next element won't fit and we're - // not already at a register boundary. - if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) - { - if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && - (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || - (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && - (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || - (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) - srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 - } - } - - break; - } - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - srcGMarker = ALIGN(srcGMarker, 2); - destMarker = ALIGN(destMarker, 2); - - *(short*)&outStruct[destMarker] = - *(short*)&inGPRs[srcGMarker]; - srcGMarker += 2; - destMarker += 2; - - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - srcGMarker = ALIGN(srcGMarker, 4); - destMarker = ALIGN(destMarker, 4); - - *(int*)&outStruct[destMarker] = - *(int*)&inGPRs[srcGMarker]; - srcGMarker += 4; - destMarker += 4; - - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - srcGMarker = ALIGN(srcGMarker, 8); - destMarker = ALIGN(destMarker, 8); - - *(long long*)&outStruct[destMarker] = - *(long long*)&inGPRs[srcGMarker]; - srcGMarker += 8; - destMarker += 8; - - break; - - case FFI_TYPE_STRUCT: - recurseCount++; - ffi64_struct_to_ram_form(inType->elements[i], inGPRs, - &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, - outStruct, &destMarker); - recurseCount--; - break; - - default: - FFI_ASSERT(0); // unknown element type - break; - } - } - - srcGMarker = ALIGN(srcGMarker, inType->alignment); - - // Take care of the special case for 16-byte structs, but not for - // nested structs. - if (recurseCount == 0 && srcGMarker == 16) - { - *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; - srcFMarker = savedFMarker; - fprsUsed = savedFPRsUsed; - } - - if (ioGPRMarker) - *ioGPRMarker = ALIGN(srcGMarker, 8); - - if (ioFPRMarker) - *ioFPRMarker = srcFMarker; - - if (ioFPRsUsed) - *ioFPRsUsed = fprsUsed; - - if (ioStructMarker) - *ioStructMarker = ALIGN(destMarker, 8); -} - -/* ffi64_struct_to_reg_form - - Copy a struct's elements into buffers that can be sliced into registers. - Return the sizes of the output buffers in bytes. Pass NULL buffer pointers - to calculate size only. - outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... -*/ -void -ffi64_struct_to_reg_form( - const ffi_type* inType, - const char* inStruct, - unsigned int* ioStructMarker, - unsigned int* ioFPRsUsed, - char* outGPRs, // caller-allocated - unsigned int* ioGPRSize, - char* outFPRs, // caller-allocated - unsigned int* ioFPRSize) -{ - size_t i; - unsigned int srcMarker = 0; - unsigned int destGMarker = 0; - unsigned int destFMarker = 0; - unsigned int savedFMarker = 0; - unsigned int fprsUsed = 0; - unsigned int savedFPRsUsed = 0; - - static unsigned int recurseCount = 0; - - if (ioStructMarker) - srcMarker = *ioStructMarker; - - if (ioFPRsUsed) - { - fprsUsed = *ioFPRsUsed; - savedFPRsUsed = fprsUsed; - } - - if (ioGPRSize) - destGMarker = *ioGPRSize; - - if (ioFPRSize) - { - destFMarker = *ioFPRSize; - savedFMarker = destFMarker; - } - - switch (inType->size) - { - case 1: case 2: case 4: - destGMarker += 8 - inType->size; - break; - - default: - break; - } - - for (i = 0; inType->elements[i] != NULL; i++) - { - switch (inType->elements[i]->type) - { - // Shadow floating-point types in GPRs for vararg and pre-ANSI - // functions. - case FFI_TYPE_FLOAT: - // Nudge markers to next 4/8-byte boundary - srcMarker = ALIGN(srcMarker, 4); - destGMarker = ALIGN(destGMarker, 4); - destFMarker = ALIGN(destFMarker, 8); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - if (outFPRs != NULL && inStruct != NULL) - *(double*)&outFPRs[destFMarker] = - (double)*(float*)&inStruct[srcMarker]; - - destFMarker += 8; - fprsUsed++; - } - - if (outGPRs != NULL && inStruct != NULL) - *(double*)&outGPRs[destGMarker] = - (double)*(float*)&inStruct[srcMarker]; - - srcMarker += 4; - destGMarker += 4; - - // Skip to next GPR if next element won't fit and we're - // not already at a register boundary. - if (inType->elements[i + 1] != NULL && (srcMarker % 8)) - { - if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && - (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || - (ALIGN(destGMarker, 8) - destGMarker) < 2) && - (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || - (ALIGN(destGMarker, 8) - destGMarker) < 4)) - destGMarker = ALIGN(destGMarker, 8); - } - - break; - - case FFI_TYPE_DOUBLE: - srcMarker = ALIGN(srcMarker, 8); - destFMarker = ALIGN(destFMarker, 8); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - if (outFPRs != NULL && inStruct != NULL) - *(double*)&outFPRs[destFMarker] = - *(double*)&inStruct[srcMarker]; - - destFMarker += 8; - fprsUsed++; - } - - if (outGPRs != NULL && inStruct != NULL) - *(double*)&outGPRs[destGMarker] = - *(double*)&inStruct[srcMarker]; - - srcMarker += 8; - - // Skip next GPR - destGMarker += 8; - destGMarker = ALIGN(destGMarker, 8); - - break; - - case FFI_TYPE_LONGDOUBLE: - srcMarker = ALIGN(srcMarker, 16); - - if (fprsUsed < NUM_FPR_ARG_REGISTERS) - { - destFMarker = ALIGN(destFMarker, 8); - destGMarker = ALIGN(destGMarker, 8); - - if (outFPRs != NULL && inStruct != NULL) - *(long double*)&outFPRs[destFMarker] = - *(long double*)&inStruct[srcMarker]; - - if (outGPRs != NULL && inStruct != NULL) - *(long double*)&outGPRs[destGMarker] = - *(long double*)&inStruct[srcMarker]; - - destFMarker += 16; - fprsUsed += 2; - } - else - { - destGMarker = ALIGN(destGMarker, 16); - - if (outGPRs != NULL && inStruct != NULL) - *(long double*)&outGPRs[destGMarker] = - *(long double*)&inStruct[srcMarker]; - } - - srcMarker += 16; - destGMarker += 16; // Skip next 2 GPRs - destGMarker = ALIGN(destGMarker, 8); // was 16 - - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - if (inType->alignment == 1) // bytes only - { - if (inType->size == 1) - { - if (outGPRs != NULL && inStruct != NULL) - outGPRs[destGMarker] = inStruct[srcMarker]; - - srcMarker++; - destGMarker++; - } - else if (inType->size == 2) - { - if (outGPRs != NULL && inStruct != NULL) - { - outGPRs[destGMarker] = inStruct[srcMarker]; - outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; - } - - srcMarker += 2; - destGMarker += 2; - - i++; - } - else - { - if (outGPRs != NULL && inStruct != NULL) - { - // Avoid memcpy for small chunks. - if (inType->size <= sizeof(long)) - *(long*)&outGPRs[destGMarker] = - *(long*)&inStruct[srcMarker]; - else - memcpy(&outGPRs[destGMarker], - &inStruct[srcMarker], inType->size); - } - - srcMarker += inType->size; - destGMarker += inType->size; - i += inType->size - 1; - } - } - else // bytes and other stuff - { - if (outGPRs != NULL && inStruct != NULL) - outGPRs[destGMarker] = inStruct[srcMarker]; - - srcMarker++; - destGMarker++; - - // Skip to next GPR if next element won't fit and we're - // not already at a register boundary. - if (inType->elements[i + 1] != NULL && (destGMarker % 8)) - { - if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && - (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || - (ALIGN(destGMarker, 8) - destGMarker) < 2) && - (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || - (ALIGN(destGMarker, 8) - destGMarker) < 4)) - destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 - } - } - - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - srcMarker = ALIGN(srcMarker, 2); - destGMarker = ALIGN(destGMarker, 2); - - if (outGPRs != NULL && inStruct != NULL) - *(short*)&outGPRs[destGMarker] = - *(short*)&inStruct[srcMarker]; - - srcMarker += 2; - destGMarker += 2; - - if (inType->elements[i + 1] == NULL) - destGMarker = ALIGN(destGMarker, inType->alignment); - - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - srcMarker = ALIGN(srcMarker, 4); - destGMarker = ALIGN(destGMarker, 4); - - if (outGPRs != NULL && inStruct != NULL) - *(int*)&outGPRs[destGMarker] = - *(int*)&inStruct[srcMarker]; - - srcMarker += 4; - destGMarker += 4; - - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - srcMarker = ALIGN(srcMarker, 8); - destGMarker = ALIGN(destGMarker, 8); - - if (outGPRs != NULL && inStruct != NULL) - *(long long*)&outGPRs[destGMarker] = - *(long long*)&inStruct[srcMarker]; - - srcMarker += 8; - destGMarker += 8; - - if (inType->elements[i + 1] == NULL) - destGMarker = ALIGN(destGMarker, inType->alignment); - - break; - - case FFI_TYPE_STRUCT: - recurseCount++; - ffi64_struct_to_reg_form(inType->elements[i], - inStruct, &srcMarker, &fprsUsed, outGPRs, - &destGMarker, outFPRs, &destFMarker); - recurseCount--; - break; - - default: - FFI_ASSERT(0); - break; - } - } - - destGMarker = ALIGN(destGMarker, inType->alignment); - - // Take care of the special case for 16-byte structs, but not for - // nested structs. - if (recurseCount == 0 && destGMarker == 16) - { - if (outGPRs != NULL && inStruct != NULL) - *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; - - destFMarker = savedFMarker; - fprsUsed = savedFPRsUsed; - } - - if (ioStructMarker) - *ioStructMarker = ALIGN(srcMarker, 8); - - if (ioFPRsUsed) - *ioFPRsUsed = fprsUsed; - - if (ioGPRSize) - *ioGPRSize = ALIGN(destGMarker, 8); - - if (ioFPRSize) - *ioFPRSize = ALIGN(destFMarker, 8); -} - -/* ffi64_stret_needs_ptr - - Determine whether a returned struct needs a pointer in r3 or can fit - in registers. -*/ - -bool -ffi64_stret_needs_ptr( - const ffi_type* inType, - unsigned short* ioGPRCount, - unsigned short* ioFPRCount) -{ - // Obvious case first- struct is larger than combined FPR size. - if (inType->size > 14 * 8) - return true; - - // Now the struct can physically fit in registers, determine if it - // also fits logically. - bool needsPtr = false; - unsigned short gprsUsed = 0; - unsigned short fprsUsed = 0; - size_t i; - - if (ioGPRCount) - gprsUsed = *ioGPRCount; - - if (ioFPRCount) - fprsUsed = *ioFPRCount; - - for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) - { - switch (inType->elements[i]->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - gprsUsed++; - fprsUsed++; - - if (fprsUsed > 13) - needsPtr = true; - - break; - - case FFI_TYPE_LONGDOUBLE: - gprsUsed += 2; - fprsUsed += 2; - - if (fprsUsed > 14) - needsPtr = true; - - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - { - gprsUsed++; - - if (gprsUsed > 8) - { - needsPtr = true; - break; - } - - if (inType->elements[i + 1] == NULL) // last byte in the struct - break; - - // Count possible contiguous bytes ahead, up to 8. - unsigned short j; - - for (j = 1; j < 8; j++) - { - if (inType->elements[i + j] == NULL || - !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) - break; - } - - i += j - 1; // allow for i++ before the test condition - - break; - } - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - gprsUsed++; - - if (gprsUsed > 8) - needsPtr = true; - - break; - - case FFI_TYPE_STRUCT: - needsPtr = ffi64_stret_needs_ptr( - inType->elements[i], &gprsUsed, &fprsUsed); - - break; - - default: - FFI_ASSERT(0); - break; - } - } - - if (ioGPRCount) - *ioGPRCount = gprsUsed; - - if (ioFPRCount) - *ioFPRCount = fprsUsed; - - return needsPtr; -} - -/* ffi64_data_size - - Calculate the size in bytes of an ffi type. -*/ - -unsigned int -ffi64_data_size( - const ffi_type* inType) -{ - unsigned int size = 0; - - switch (inType->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - size = 1; - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - size = 2; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_FLOAT: - size = 4; - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - size = 8; - break; - - case FFI_TYPE_LONGDOUBLE: - size = 16; - break; - - case FFI_TYPE_STRUCT: - ffi64_struct_to_reg_form( - inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); - break; - - case FFI_TYPE_VOID: - break; - - default: - FFI_ASSERT(0); - break; - } - - return size; -} - -#endif /* defined(__ppc64__) */ -#endif /* __ppc__ || __ppc64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S b/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S deleted file mode 100644 index 7162fa1dd..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +++ /dev/null @@ -1,418 +0,0 @@ -#if defined(__ppc64__) - -/* ----------------------------------------------------------------------- - ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, - Inc. based on ppc_closure.S - - PowerPC Assembly glue. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM - -#include -#include // for FFI_TRAMPOLINE_SIZE -#include -#include - - .file "ppc64-darwin_closure.S" -.text - .align LOG2_GPR_BYTES - .globl _ffi_closure_ASM - -.text - .align LOG2_GPR_BYTES - -_ffi_closure_ASM: -LFB1: - mflr r0 - stg r0,SF_RETURN(r1) // save return address - - // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. - stg r3,SF_ARG1(r1) - stg r4,SF_ARG2(r1) - stg r5,SF_ARG3(r1) - stg r6,SF_ARG4(r1) - stg r7,SF_ARG5(r1) - stg r8,SF_ARG6(r1) - stg r9,SF_ARG7(r1) - stg r10,SF_ARG8(r1) - -LCFI0: -/* 48 bytes (Linkage Area) - 64 bytes (outgoing parameter area, always reserved) - 112 bytes (14*8 for incoming FPR) - ? bytes (result) - 112 bytes (14*8 for outgoing FPR) - 16 bytes (2 saved registers) - 352 + ? total bytes -*/ - - std r31,-8(r1) // Save registers we use. - std r30,-16(r1) - mr r30,r1 // Save the old SP. - mr r31,r11 // Save the ffi_closure around ffi64_data_size. - - // Calculate the space we need. - stdu r1,-SF_MINSIZE(r1) - ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* - ld r3,16(r3) // ffi_cif->rtype* - bl Lffi64_data_size$stub - ld r1,0(r1) - - addi r3,r3,352 // Add our overhead. - neg r3,r3 - li r0,-32 // Align to 32 bytes. - and r3,r3,r0 - stdux r1,r1,r3 // Grow the stack. - - mr r11,r31 // Copy the ffi_closure back. - -LCFI1: - // We want to build up an area for the parameters passed - // in registers. (both floating point and integer) - -/* 320 bytes (callee stack frame aligned to 32) - 48 bytes (caller linkage area) - 368 (start of caller parameter area aligned to 8) -*/ - - // Save FPRs 1 - 14. (aligned to 8) - stfd f1,112(r1) - stfd f2,120(r1) - stfd f3,128(r1) - stfd f4,136(r1) - stfd f5,144(r1) - stfd f6,152(r1) - stfd f7,160(r1) - stfd f8,168(r1) - stfd f9,176(r1) - stfd f10,184(r1) - stfd f11,192(r1) - stfd f12,200(r1) - stfd f13,208(r1) - stfd f14,216(r1) - - // Set up registers for the routine that actually does the work. - mr r3,r11 // context pointer from the trampoline - addi r4,r1,224 // result storage - addi r5,r30,SF_ARG1 // saved GPRs - addi r6,r1,112 // saved FPRs - bl Lffi_closure_helper_DARWIN$stub - - // Look the proper starting point in table - // by using return type as an offset. - addi r5,r1,224 // Get pointer to results area. - bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. - mflr r4 // Move to r4. - slwi r3,r3,4 // Now multiply return type by 16. - add r3,r3,r4 // Add contents of table to table address. - mtctr r3 - bctr - -LFE1: - // Each of the ret_typeX code fragments has to be exactly 16 bytes long - // (4 instructions). For cache effectiveness we align to a 16 byte - // boundary first. - .align 4 - nop - nop - nop - -Lget_ret_type0_addr: - blrl - -// case FFI_TYPE_VOID -Lret_type0: - b Lfinish - nop - nop - nop - -// case FFI_TYPE_INT -Lret_type1: - lwz r3,4(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_FLOAT -Lret_type2: - lfs f1,0(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_DOUBLE -Lret_type3: - lfd f1,0(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_LONGDOUBLE -Lret_type4: - lfd f1,0(r5) - lfd f2,8(r5) - b Lfinish - nop - -// case FFI_TYPE_UINT8 -Lret_type5: - lbz r3,7(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_SINT8 -Lret_type6: - lbz r3,7(r5) - extsb r3,r3 - b Lfinish - nop - -// case FFI_TYPE_UINT16 -Lret_type7: - lhz r3,6(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_SINT16 -Lret_type8: - lha r3,6(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_UINT32 -Lret_type9: // same as Lret_type1 - lwz r3,4(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_SINT32 -Lret_type10: // same as Lret_type1 - lwz r3,4(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_UINT64 -Lret_type11: - ld r3,0(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_SINT64 -Lret_type12: // same as Lret_type11 - ld r3,0(r5) - b Lfinish - nop - nop - -// case FFI_TYPE_STRUCT -Lret_type13: - b Lret_struct - nop - nop - nop - -// ** End 16-byte aligned cases ** -// case FFI_TYPE_POINTER -// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types -// are added in future, the following code will need to be updated and -// padded to 16 bytes. -Lret_type14: - lg r3,0(r5) - b Lfinish - -// copy struct into registers -Lret_struct: - ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* - ld r3,16(r31) // ffi_cif->rtype* - ld r31,24(r31) // ffi_cif->flags - mr r4,r5 // copy struct* to 2nd arg - addi r7,r1,SF_ARG9 // GPR return area - addi r9,r30,-16-(14*8) // FPR return area - li r5,0 // struct offset ptr (NULL) - li r6,0 // FPR used count ptr (NULL) - li r8,0 // GPR return area size ptr (NULL) - li r10,0 // FPR return area size ptr (NULL) - bl Lffi64_struct_to_reg_form$stub - - // Load GPRs - ld r3,SF_ARG9(r1) - ld r4,SF_ARG10(r1) - ld r5,SF_ARG11(r1) - ld r6,SF_ARG12(r1) - nop - ld r7,SF_ARG13(r1) - ld r8,SF_ARG14(r1) - ld r9,SF_ARG15(r1) - ld r10,SF_ARG16(r1) - nop - - // Load FPRs - mtcrf 0x2,r31 - bf 26,Lfinish - lfd f1,-16-(14*8)(r30) - lfd f2,-16-(13*8)(r30) - lfd f3,-16-(12*8)(r30) - lfd f4,-16-(11*8)(r30) - nop - lfd f5,-16-(10*8)(r30) - lfd f6,-16-(9*8)(r30) - lfd f7,-16-(8*8)(r30) - lfd f8,-16-(7*8)(r30) - nop - lfd f9,-16-(6*8)(r30) - lfd f10,-16-(5*8)(r30) - lfd f11,-16-(4*8)(r30) - lfd f12,-16-(3*8)(r30) - nop - lfd f13,-16-(2*8)(r30) - lfd f14,-16-(1*8)(r30) - // Fall through - -// case done -Lfinish: - lg r1,0(r1) // Restore stack pointer. - ld r31,-8(r1) // Restore registers we used. - ld r30,-16(r1) - lg r0,SF_RETURN(r1) // Get return address. - mtlr r0 // Reset link register. - blr - -// END(ffi_closure_ASM) - -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: -.globl _ffi_closure_ASM.eh -_ffi_closure_ASM.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length - -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long LFB1-. ; FDE initial location - .set L$set$3,LFE1-LFB1 - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$3,LCFI1-LCFI0 - .long L$set$3 - .byte 0xe ; DW_CFA_def_cfa_offset - .byte 176,1 ; uleb128 176 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-LFB1 - .long L$set$4 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .align LOG2_GPR_BYTES - -LEFDE1: -.data - .align LOG2_GPR_BYTES -LDFCM0: -.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align LOG2_GPR_BYTES - -Lffi_closure_helper_DARWIN$stub: - .indirect_symbol _ffi_closure_helper_DARWIN - mflr r0 - bcl 20,31,LO$ffi_closure_helper_DARWIN - -LO$ffi_closure_helper_DARWIN: - mflr r11 - addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) - mtlr r0 - lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) - mtctr r12 - bctr - -.lazy_symbol_pointer -L_ffi_closure_helper_DARWIN$lazy_ptr: - .indirect_symbol _ffi_closure_helper_DARWIN - .g_long dyld_stub_binding_helper - -.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align LOG2_GPR_BYTES - -Lffi64_struct_to_reg_form$stub: - .indirect_symbol _ffi64_struct_to_reg_form - mflr r0 - bcl 20,31,LO$ffi64_struct_to_reg_form - -LO$ffi64_struct_to_reg_form: - mflr r11 - addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) - mtlr r0 - lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) - mtctr r12 - bctr - -.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align LOG2_GPR_BYTES - -Lffi64_data_size$stub: - .indirect_symbol _ffi64_data_size - mflr r0 - bcl 20,31,LO$ffi64_data_size - -LO$ffi64_data_size: - mflr r11 - addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) - mtlr r0 - lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) - mtctr r12 - bctr - -.lazy_symbol_pointer -L_ffi64_struct_to_reg_form$lazy_ptr: - .indirect_symbol _ffi64_struct_to_reg_form - .g_long dyld_stub_binding_helper - -L_ffi64_data_size$lazy_ptr: - .indirect_symbol _ffi64_data_size - .g_long dyld_stub_binding_helper - -#endif // __ppc64__ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/types.c b/third_party/python/Modules/_ctypes/libffi_osx/types.c deleted file mode 100644 index 44806aeeb..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/types.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ----------------------------------------------------------------------- - types.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Predefined ffi_types needed by libffi. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -/* Type definitions */ -#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ - ffi_type ffi_type_##n = { s, a, t, NULL } -#define FFI_AGGREGATE_TYPEDEF(n, e) \ - ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } - -FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); -FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); -FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); -FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); -FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); -FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); -FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); - -/* Size and alignment are fake here. They must not be 0. */ -FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); - -#if defined ALPHA || defined SPARC64 || defined X86_64 || \ - defined S390X || defined IA64 || defined POWERPC64 -FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); -#else -FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); -#endif - -#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) - -# ifdef X86_64 - FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); - FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); -# else - FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); - FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); -# endif - -#elif defined(POWERPC_DARWIN) -FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); -#elif defined SH -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); -#else -FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); -#endif - -#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) - -# if defined X86_WIN32 || defined X86_64 - FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -# else - FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -# endif - -# ifdef X86_DARWIN - FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -# else - FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); -# endif - -#elif defined ARM || defined SH || defined POWERPC_AIX -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); -#elif defined POWERPC_DARWIN -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); - -# if __GNUC__ >= 4 - FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -# else - FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); -# endif - -#elif defined SPARC -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); - -# ifdef SPARC64 - FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -# else - FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); -# endif - -#elif defined X86_64 || defined POWERPC64 -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -#else -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); -#endif \ No newline at end of file diff --git a/third_party/python/Modules/_ctypes/libffi_osx/x86/darwin64.S b/third_party/python/Modules/_ctypes/libffi_osx/x86/darwin64.S deleted file mode 100644 index 1286d33f8..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/x86/darwin64.S +++ /dev/null @@ -1,417 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. - derived from unix64.S - - x86-64 Foreign Function Interface for Darwin. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include - - .file "darwin64.S" -.text - -/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)()); - - Bit o trickiness here -- ARGS+BYTES is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 3 - .globl _ffi_call_unix64 - -_ffi_call_unix64: -LUW0: - movq (%rsp), %r10 /* Load return address. */ - movq %rdi, %r12 /* Save a copy of the register area. */ - leaq (%rdi, %rsi), %rax /* Find local stack base. */ - movq %rdx, (%rax) /* Save flags. */ - movq %rcx, 8(%rax) /* Save raddr. */ - movq %rbp, 16(%rax) /* Save old frame pointer. */ - movq %r10, 24(%rax) /* Relocate return address. */ - movq %rax, %rbp /* Finalize local stack frame. */ -LUW1: - /* movq %rdi, %r10 // Save a copy of the register area. */ - movq %r12, %r10 - movq %r8, %r11 /* Save a copy of the target fn. */ - movl %r9d, %eax /* Set number of SSE registers. */ - - /* Load up all argument registers. */ - movq (%r10), %rdi - movq 8(%r10), %rsi - movq 16(%r10), %rdx - movq 24(%r10), %rcx - movq 32(%r10), %r8 - movq 40(%r10), %r9 - testl %eax, %eax - jnz Lload_sse -Lret_from_load_sse: - - /* Deallocate the reg arg area. */ - leaq 176(%r10), %rsp - - /* Call the user function. */ - call *%r11 - - /* Deallocate stack arg area; local stack frame in redzone. */ - leaq 24(%rbp), %rsp - - movq 0(%rbp), %rcx /* Reload flags. */ - movq 8(%rbp), %rdi /* Reload raddr. */ - movq 16(%rbp), %rbp /* Reload old frame pointer. */ -LUW2: - - /* The first byte of the flags contains the FFI_TYPE. */ - movzbl %cl, %r10d - leaq Lstore_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -Lstore_table: - .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ - .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ - .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ - .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ - .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ - .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ - .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ - .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ - .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ - .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ - .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ - .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ - .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ - .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ - .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ - - .text - .align 3 -Lst_void: - ret - .align 3 -Lst_uint8: - movzbq %al, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_sint8: - movsbq %al, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_uint16: - movzwq %ax, %rax - movq %rax, (%rdi) - .align 3 -Lst_sint16: - movswq %ax, %rax - movq %rax, (%rdi) - ret - .align 3 -Lst_uint32: - movl %eax, %eax - movq %rax, (%rdi) - .align 3 -Lst_sint32: - cltq - movq %rax, (%rdi) - ret - .align 3 -Lst_int64: - movq %rax, (%rdi) - ret - .align 3 -Lst_float: - movss %xmm0, (%rdi) - ret - .align 3 -Lst_double: - movsd %xmm0, (%rdi) - ret -Lst_ldouble: - fstpt (%rdi) - ret - .align 3 -Lst_struct: - leaq -20(%rsp), %rsi /* Scratch area in redzone. */ - - /* We have to locate the values now, and since we don't want to - write too much data into the user's return value, we spill the - value to a 16 byte scratch area first. Bits 8, 9, and 10 - control where the values are located. Only one of the three - bits will be set; see ffi_prep_cif_machdep for the pattern. */ - movd %xmm0, %r10 - movd %xmm1, %r11 - testl $0x100, %ecx - cmovnz %rax, %rdx - cmovnz %r10, %rax - testl $0x200, %ecx - cmovnz %r10, %rdx - testl $0x400, %ecx - cmovnz %r10, %rax - cmovnz %r11, %rdx - movq %rax, (%rsi) - movq %rdx, 8(%rsi) - - /* Bits 12-31 contain the true size of the structure. Copy from - the scratch area to the true destination. */ - shrl $12, %ecx - rep movsb - ret - - /* Many times we can avoid loading any SSE registers at all. - It's not worth an indirect jump to load the exact set of - SSE registers needed; zero or all is a good compromise. */ - .align 3 -LUW3: -Lload_sse: - movdqa 48(%r10), %xmm0 - movdqa 64(%r10), %xmm1 - movdqa 80(%r10), %xmm2 - movdqa 96(%r10), %xmm3 - movdqa 112(%r10), %xmm4 - movdqa 128(%r10), %xmm5 - movdqa 144(%r10), %xmm6 - movdqa 160(%r10), %xmm7 - jmp Lret_from_load_sse - -LUW4: - .align 3 - .globl _ffi_closure_unix64 - -_ffi_closure_unix64: -LUW5: - /* The carry flag is set by the trampoline iff SSE registers - are used. Don't clobber it before the branch instruction. */ - leaq -200(%rsp), %rsp -LUW6: - movq %rdi, (%rsp) - movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - jc Lsave_sse -Lret_from_save_sse: - - movq %r10, %rdi - leaq 176(%rsp), %rsi - movq %rsp, %rdx - leaq 208(%rsp), %rcx - call _ffi_closure_unix64_inner - - /* Deallocate stack frame early; return value is now in redzone. */ - addq $200, %rsp -LUW7: - - /* The first byte of the return value contains the FFI_TYPE. */ - movzbl %al, %r10d - leaq Lload_table(%rip), %r11 - movslq (%r11, %r10, 4), %r10 - addq %r11, %r10 - jmp *%r10 - -Lload_table: - .long Lld_void-Lload_table /* FFI_TYPE_VOID */ - .long Lld_int32-Lload_table /* FFI_TYPE_INT */ - .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ - .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ - .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ - .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ - .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ - .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ - .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ - .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ - .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ - .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ - .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ - .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ - .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ - - .text - .align 3 -Lld_void: - ret - .align 3 -Lld_int8: - movzbl -24(%rsp), %eax - ret - .align 3 -Lld_int16: - movzwl -24(%rsp), %eax - ret - .align 3 -Lld_int32: - movl -24(%rsp), %eax - ret - .align 3 -Lld_int64: - movq -24(%rsp), %rax - ret - .align 3 -Lld_float: - movss -24(%rsp), %xmm0 - ret - .align 3 -Lld_double: - movsd -24(%rsp), %xmm0 - ret - .align 3 -Lld_ldouble: - fldt -24(%rsp) - ret - .align 3 -Lld_struct: - /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, - %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading - both rdx and xmm1 with the second word. For the remaining, - bit 8 set means xmm0 gets the second word, and bit 9 means - that rax gets the second word. */ - movq -24(%rsp), %rcx - movq -16(%rsp), %rdx - movq -16(%rsp), %xmm1 - testl $0x100, %eax - cmovnz %rdx, %rcx - movd %rcx, %xmm0 - testl $0x200, %eax - movq -24(%rsp), %rax - cmovnz %rdx, %rax - ret - - /* See the comment above Lload_sse; the same logic applies here. */ - .align 3 -LUW8: -Lsave_sse: - movdqa %xmm0, 48(%rsp) - movdqa %xmm1, 64(%rsp) - movdqa %xmm2, 80(%rsp) - movdqa %xmm3, 96(%rsp) - movdqa %xmm4, 112(%rsp) - movdqa %xmm5, 128(%rsp) - movdqa %xmm6, 144(%rsp) - movdqa %xmm7, 160(%rsp) - jmp Lret_from_save_sse - -LUW9: -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ - .long L$set$0 -LSCIE1: - .long 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ - .byte 0x10 /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel sdata4) */ - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x7 /* uleb128 0x7 */ - .byte 0x8 /* uleb128 0x8 */ - .byte 0x90 /* DW_CFA_offset, column 0x10 */ - .byte 0x1 - .align 3 -LECIE1: - .globl _ffi_call_unix64.eh -_ffi_call_unix64.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ - .long L$set$1 -LASFDE1: - .long LASFDE1-EH_frame1 /* FDE CIE offset */ - .quad LUW0-. /* FDE initial location */ - .set L$set$2,LUW4-LUW0 /* FDE address range */ - .quad L$set$2 - .byte 0x0 /* Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$3,LUW1-LUW0 - .long L$set$3 - - /* New stack frame based off rbp. This is an itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-8, so from the - perspective of the unwind info, it hasn't moved. */ - .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ - .byte 0x6 - .byte 0x20 - .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ - .byte 0x2 - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$4,LUW2-LUW1 - .long L$set$4 - .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x7 - .byte 0x8 - .byte 0xc0+6 /* DW_CFA_restore, %rbp */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$5,LUW3-LUW2 - .long L$set$5 - .byte 0xb /* DW_CFA_restore_state */ - - .align 3 -LEFDE1: - .globl _ffi_closure_unix64.eh -_ffi_closure_unix64.eh: -LSFDE3: - .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ - .long L$set$6 -LASFDE3: - .long LASFDE3-EH_frame1 /* FDE CIE offset */ - .quad LUW5-. /* FDE initial location */ - .set L$set$7,LUW9-LUW5 /* FDE address range */ - .quad L$set$7 - .byte 0x0 /* Augmentation size */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$8,LUW6-LUW5 - .long L$set$8 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 208,1 /* uleb128 208 */ - .byte 0xa /* DW_CFA_remember_state */ - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$9,LUW7-LUW6 - .long L$set$9 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 - - .byte 0x4 /* DW_CFA_advance_loc4 */ - .set L$set$10,LUW8-LUW7 - .long L$set$10 - .byte 0xb /* DW_CFA_restore_state */ - - .align 3 -LEFDE3: - .subsections_via_symbols - -#endif /* __x86_64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-darwin.S b/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-darwin.S deleted file mode 100644 index 925a84131..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-darwin.S +++ /dev/null @@ -1,422 +0,0 @@ -#ifdef __i386__ -/* ----------------------------------------------------------------------- - darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* - * This file is based on sysv.S and then hacked up by Ronald who hasn't done - * assembly programming in 8 years. - */ - -#ifndef __x86_64__ - -#define LIBFFI_ASM -#include -#include - -#ifdef PyObjC_STRICT_DEBUGGING - /* XXX: Debugging of stack alignment, to be removed */ -#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 -#else -#define ASSERT_STACK_ALIGNED -#endif - -.text - -.globl _ffi_prep_args - - .align 4 -.globl _ffi_call_SYSV - -_ffi_call_SYSV: -LFB1: - pushl %ebp -LCFI0: - movl %esp,%ebp -LCFI1: - subl $8,%esp - /* Make room for all of the new args. */ - movl 16(%ebp),%ecx - subl %ecx,%esp - - movl %esp,%eax - - /* Place all of the ffi_prep_args in position */ - subl $8,%esp - pushl 12(%ebp) - pushl %eax - call *8(%ebp) - - /* Return stack to previous state and call the function */ - addl $16,%esp - - call *28(%ebp) - - /* Remove the space we pushed for the args */ - movl 16(%ebp),%ecx - addl %ecx,%esp - - /* Load %ecx with the return type code */ - movl 20(%ebp),%ecx - - /* If the return value pointer is NULL, assume no return value. */ - cmpl $0,24(%ebp) - jne Lretint - - /* Even if there is no space for the return value, we are - obliged to handle floating-point values. */ - cmpl $FFI_TYPE_FLOAT,%ecx - jne Lnoretval - fstp %st(0) - - jmp Lepilogue - -Lretint: - cmpl $FFI_TYPE_INT,%ecx - jne Lretfloat - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - jmp Lepilogue - -Lretfloat: - cmpl $FFI_TYPE_FLOAT,%ecx - jne Lretdouble - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstps (%ecx) - jmp Lepilogue - -Lretdouble: - cmpl $FFI_TYPE_DOUBLE,%ecx - jne Lretlongdouble - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpl (%ecx) - jmp Lepilogue - -Lretlongdouble: - cmpl $FFI_TYPE_LONGDOUBLE,%ecx - jne Lretint64 - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - fstpt (%ecx) - jmp Lepilogue - -Lretint64: - cmpl $FFI_TYPE_SINT64,%ecx - jne Lretstruct1b - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movl %eax,0(%ecx) - movl %edx,4(%ecx) - jmp Lepilogue - -Lretstruct1b: - cmpl $FFI_TYPE_SINT8,%ecx - jne Lretstruct2b - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movb %al,0(%ecx) - jmp Lepilogue - -Lretstruct2b: - cmpl $FFI_TYPE_SINT16,%ecx - jne Lretstruct - /* Load %ecx with the pointer to storage for the return value */ - movl 24(%ebp),%ecx - movw %ax,0(%ecx) - jmp Lepilogue - -Lretstruct: - cmpl $FFI_TYPE_STRUCT,%ecx - jne Lnoretval - /* Nothing to do! */ - addl $4,%esp - popl %ebp - ret - -Lnoretval: -Lepilogue: - addl $8,%esp - movl %ebp,%esp - popl %ebp - ret -LFE1: -.ffi_call_SYSV_end: - - .align 4 -FFI_HIDDEN (ffi_closure_SYSV) -.globl _ffi_closure_SYSV - -_ffi_closure_SYSV: -LFB2: - pushl %ebp -LCFI2: - movl %esp, %ebp -LCFI3: - subl $56, %esp - leal -40(%ebp), %edx - movl %edx, -12(%ebp) /* resp */ - leal 8(%ebp), %edx - movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ - leal -12(%ebp), %edx - movl %edx, (%esp) /* &resp */ - movl %ebx, 8(%esp) -LCFI7: - call L_ffi_closure_SYSV_inner$stub - movl 8(%esp), %ebx - movl -12(%ebp), %ecx - cmpl $FFI_TYPE_INT, %eax - je Lcls_retint - cmpl $FFI_TYPE_FLOAT, %eax - je Lcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je Lcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je Lcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je Lcls_retllong - cmpl $FFI_TYPE_UINT8, %eax - je Lcls_retstruct1 - cmpl $FFI_TYPE_SINT8, %eax - je Lcls_retstruct1 - cmpl $FFI_TYPE_UINT16, %eax - je Lcls_retstruct2 - cmpl $FFI_TYPE_SINT16, %eax - je Lcls_retstruct2 - cmpl $FFI_TYPE_STRUCT, %eax - je Lcls_retstruct -Lcls_epilogue: - movl %ebp, %esp - popl %ebp - ret -Lcls_retint: - movl (%ecx), %eax - jmp Lcls_epilogue -Lcls_retfloat: - flds (%ecx) - jmp Lcls_epilogue -Lcls_retdouble: - fldl (%ecx) - jmp Lcls_epilogue -Lcls_retldouble: - fldt (%ecx) - jmp Lcls_epilogue -Lcls_retllong: - movl (%ecx), %eax - movl 4(%ecx), %edx - jmp Lcls_epilogue -Lcls_retstruct1: - movsbl (%ecx), %eax - jmp Lcls_epilogue -Lcls_retstruct2: - movswl (%ecx), %eax - jmp Lcls_epilogue -Lcls_retstruct: - lea -8(%ebp),%esp - movl %ebp, %esp - popl %ebp - ret $4 -LFE2: - -#if !FFI_NO_RAW_API - -#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) -#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) -#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) -#define CIF_FLAGS_OFFSET 20 - - .align 4 -FFI_HIDDEN (ffi_closure_raw_SYSV) -.globl _ffi_closure_raw_SYSV - -_ffi_closure_raw_SYSV: -LFB3: - pushl %ebp -LCFI4: - movl %esp, %ebp -LCFI5: - pushl %esi -LCFI6: - subl $36, %esp - movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ - movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ - movl %edx, 12(%esp) /* user_data */ - leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ - movl %edx, 8(%esp) /* raw_args */ - leal -24(%ebp), %edx - movl %edx, 4(%esp) /* &res */ - movl %esi, (%esp) /* cif */ - call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ - movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ - cmpl $FFI_TYPE_INT, %eax - je Lrcls_retint - cmpl $FFI_TYPE_FLOAT, %eax - je Lrcls_retfloat - cmpl $FFI_TYPE_DOUBLE, %eax - je Lrcls_retdouble - cmpl $FFI_TYPE_LONGDOUBLE, %eax - je Lrcls_retldouble - cmpl $FFI_TYPE_SINT64, %eax - je Lrcls_retllong -Lrcls_epilogue: - addl $36, %esp - popl %esi - popl %ebp - ret -Lrcls_retint: - movl -24(%ebp), %eax - jmp Lrcls_epilogue -Lrcls_retfloat: - flds -24(%ebp) - jmp Lrcls_epilogue -Lrcls_retdouble: - fldl -24(%ebp) - jmp Lrcls_epilogue -Lrcls_retldouble: - fldt -24(%ebp) - jmp Lrcls_epilogue -Lrcls_retllong: - movl -24(%ebp), %eax - movl -20(%ebp), %edx - jmp Lrcls_epilogue -LFE3: -#endif - -.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 -L_ffi_closure_SYSV_inner$stub: - .indirect_symbol _ffi_closure_SYSV_inner - hlt ; hlt ; hlt ; hlt ; hlt - - -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 -LSCIE1: - .long 0x0 - .byte 0x1 - .ascii "zR\0" - .byte 0x1 - .byte 0x7c - .byte 0x8 - .byte 0x1 - .byte 0x10 - .byte 0xc - .byte 0x5 - .byte 0x4 - .byte 0x88 - .byte 0x1 - .align 2 -LECIE1: -.globl _ffi_call_SYSV.eh -_ffi_call_SYSV.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 -LASFDE1: - .long LASFDE1-EH_frame1 - .long LFB1-. - .set L$set$2,LFE1-LFB1 - .long L$set$2 - .byte 0x0 - .byte 0x4 - .set L$set$3,LCFI0-LFB1 - .long L$set$3 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$4,LCFI1-LCFI0 - .long L$set$4 - .byte 0xd - .byte 0x4 - .align 2 -LEFDE1: -.globl _ffi_closure_SYSV.eh -_ffi_closure_SYSV.eh: -LSFDE2: - .set L$set$5,LEFDE2-LASFDE2 - .long L$set$5 -LASFDE2: - .long LASFDE2-EH_frame1 - .long LFB2-. - .set L$set$6,LFE2-LFB2 - .long L$set$6 - .byte 0x0 - .byte 0x4 - .set L$set$7,LCFI2-LFB2 - .long L$set$7 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$8,LCFI3-LCFI2 - .long L$set$8 - .byte 0xd - .byte 0x4 - .align 2 -LEFDE2: - -#if !FFI_NO_RAW_API - -.globl _ffi_closure_raw_SYSV.eh -_ffi_closure_raw_SYSV.eh: -LSFDE3: - .set L$set$10,LEFDE3-LASFDE3 - .long L$set$10 -LASFDE3: - .long LASFDE3-EH_frame1 - .long LFB3-. - .set L$set$11,LFE3-LFB3 - .long L$set$11 - .byte 0x0 - .byte 0x4 - .set L$set$12,LCFI4-LFB3 - .long L$set$12 - .byte 0xe - .byte 0x8 - .byte 0x84 - .byte 0x2 - .byte 0x4 - .set L$set$13,LCFI5-LCFI4 - .long L$set$13 - .byte 0xd - .byte 0x4 - .byte 0x4 - .set L$set$14,LCFI6-LCFI5 - .long L$set$14 - .byte 0x85 - .byte 0x3 - .align 2 -LEFDE3: - -#endif - -#endif /* ifndef __x86_64__ */ - -#endif /* defined __i386__ */ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c b/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c deleted file mode 100644 index f2610c16c..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +++ /dev/null @@ -1,737 +0,0 @@ -#ifdef __x86_64__ - -/* ----------------------------------------------------------------------- - x86-ffi64.c - Copyright (c) 2002 Bo Thorsen - - x86-64 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#define MAX_GPR_REGS 6 -#define MAX_SSE_REGS 8 - -typedef struct RegisterArgs { - /* Registers for argument passing. */ - UINT64 gpr[MAX_GPR_REGS]; - __int128_t sse[MAX_SSE_REGS]; -} RegisterArgs; - -extern void -ffi_call_unix64( - void* args, - unsigned long bytes, - unsigned flags, - void* raddr, - void (*fnaddr)(void), - unsigned ssecount); - -/* All reference to register classes here is identical to the code in - gcc/config/i386/i386.c. Do *not* change one without the other. */ - -/* Register class used for passing given 64bit part of the argument. - These represent classes as documented by the PS ABI, with the exception - of SSESF, SSEDF classes, that are basically SSE class, just gcc will - use SF or DFmode move instead of DImode to avoid reformating penalties. - - Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves - whenever possible (upper half does contain padding). */ -enum x86_64_reg_class -{ - X86_64_NO_CLASS, - X86_64_INTEGER_CLASS, - X86_64_INTEGERSI_CLASS, - X86_64_SSE_CLASS, - X86_64_SSESF_CLASS, - X86_64_SSEDF_CLASS, - X86_64_SSEUP_CLASS, - X86_64_X87_CLASS, - X86_64_X87UP_CLASS, - X86_64_COMPLEX_X87_CLASS, - X86_64_MEMORY_CLASS -}; - -#define MAX_CLASSES 4 -#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) - -/* x86-64 register passing implementation. See x86-64 ABI for details. Goal - of this code is to classify each 8bytes of incoming argument by the register - class and assign registers accordingly. */ - -/* Return the union class of CLASS1 and CLASS2. - See the x86-64 PS ABI for details. */ -static enum x86_64_reg_class -merge_classes( - enum x86_64_reg_class class1, - enum x86_64_reg_class class2) -{ - /* Rule #1: If both classes are equal, this is the resulting class. */ - if (class1 == class2) - return class1; - - /* Rule #2: If one of the classes is NO_CLASS, the resulting class is - the other class. */ - if (class1 == X86_64_NO_CLASS) - return class2; - - if (class2 == X86_64_NO_CLASS) - return class1; - - /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ - if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ - if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) - || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) - return X86_64_INTEGERSI_CLASS; - - if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS - || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) - return X86_64_INTEGER_CLASS; - - /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, - MEMORY is used. */ - if (class1 == X86_64_X87_CLASS - || class1 == X86_64_X87UP_CLASS - || class1 == X86_64_COMPLEX_X87_CLASS - || class2 == X86_64_X87_CLASS - || class2 == X86_64_X87UP_CLASS - || class2 == X86_64_COMPLEX_X87_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #6: Otherwise class SSE is used. */ - return X86_64_SSE_CLASS; -} - -/* Classify the argument of type TYPE and mode MODE. - CLASSES will be filled by the register class used to pass each word - of the operand. The number of words is returned. In case the parameter - should be passed in memory, 0 is returned. As a special case for zero - sized containers, classes[0] will be NO_CLASS and 1 is returned. - - See the x86-64 PS ABI for details. */ - -static int -classify_argument( - ffi_type* type, - enum x86_64_reg_class classes[], - size_t byte_offset) -{ - switch (type->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: -#if 0 - if (byte_offset + type->size <= 4) - classes[0] = X86_64_INTEGERSI_CLASS; - else - classes[0] = X86_64_INTEGER_CLASS; - - return 1; -#else - { - int size = byte_offset + type->size; - - if (size <= 4) - { - classes[0] = X86_64_INTEGERSI_CLASS; - return 1; - } - else if (size <= 8) - { - classes[0] = X86_64_INTEGER_CLASS; - return 1; - } - else if (size <= 12) - { - classes[0] = X86_64_INTEGER_CLASS; - classes[1] = X86_64_INTEGERSI_CLASS; - return 2; - } - else if (size <= 16) - { - classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; - return 2; - } - else - FFI_ASSERT (0); - } -#endif - - case FFI_TYPE_FLOAT: - if (byte_offset == 0) - classes[0] = X86_64_SSESF_CLASS; - else - classes[0] = X86_64_SSE_CLASS; - - return 1; - - case FFI_TYPE_DOUBLE: - classes[0] = X86_64_SSEDF_CLASS; - return 1; - - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_X87_CLASS; - classes[1] = X86_64_X87UP_CLASS; - return 2; - - case FFI_TYPE_STRUCT: - { - ffi_type** ptr; - int i; - enum x86_64_reg_class subclasses[MAX_CLASSES]; - const int UNITS_PER_WORD = 8; - int words = - (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; - - /* If the struct is larger than 16 bytes, pass it on the stack. */ - if (type->size > 16) - return 0; - - for (i = 0; i < words; i++) - classes[i] = X86_64_NO_CLASS; - - /* Merge the fields of structure. */ - for (ptr = type->elements; *ptr != NULL; ptr++) - { - int num, pos; - - byte_offset = ALIGN(byte_offset, (*ptr)->alignment); - - num = classify_argument(*ptr, subclasses, byte_offset % 8); - - if (num == 0) - return 0; - - pos = byte_offset / 8; - - for (i = 0; i < num; i++) - { - classes[i + pos] = - merge_classes(subclasses[i], classes[i + pos]); - } - - byte_offset += (*ptr)->size; - } - - if (words > 2) - { - /* When size > 16 bytes, if the first one isn't - X86_64_SSE_CLASS or any other ones aren't - X86_64_SSEUP_CLASS, everything should be passed in - memory. */ - if (classes[0] != X86_64_SSE_CLASS) - return 0; - - for (i = 1; i < words; i++) - if (classes[i] != X86_64_SSEUP_CLASS) - return 0; - } - - - /* Final merger cleanup. */ - for (i = 0; i < words; i++) - { - /* If one class is MEMORY, everything should be passed in - memory. */ - if (classes[i] == X86_64_MEMORY_CLASS) - return 0; - - /* The X86_64_SSEUP_CLASS should be always preceded by - X86_64_SSE_CLASS. */ - if (classes[i] == X86_64_SSEUP_CLASS - && classes[i - 1] != X86_64_SSE_CLASS - && classes[i - 1] != X86_64_SSEUP_CLASS) - { - FFI_ASSERT(i != 0); - classes[i] = X86_64_SSE_CLASS; - } - - /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ - if (classes[i] == X86_64_X87UP_CLASS - && classes[i - 1] != X86_64_X87_CLASS) - { - FFI_ASSERT(i != 0); - classes[i] = X86_64_SSE_CLASS; - } - } - - return words; - } - - default: - FFI_ASSERT(0); - } - - return 0; /* Never reached. */ -} - -/* Examine the argument and return set number of register required in each - class. Return zero if parameter should be passed in memory, otherwise - the number of registers. */ -static int -examine_argument( - ffi_type* type, - enum x86_64_reg_class classes[MAX_CLASSES], - _Bool in_return, - int* pngpr, - int* pnsse) -{ - int n = classify_argument(type, classes, 0); - int ngpr = 0; - int nsse = 0; - int i; - - if (n == 0) - return 0; - - for (i = 0; i < n; ++i) - { - switch (classes[i]) - { - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - ngpr++; - break; - - case X86_64_SSE_CLASS: - case X86_64_SSESF_CLASS: - case X86_64_SSEDF_CLASS: - nsse++; - break; - - case X86_64_NO_CLASS: - case X86_64_SSEUP_CLASS: - break; - - case X86_64_X87_CLASS: - case X86_64_X87UP_CLASS: - case X86_64_COMPLEX_X87_CLASS: - return in_return != 0; - - default: - abort(); - } - } - - *pngpr = ngpr; - *pnsse = nsse; - - return n; -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep( - ffi_cif* cif) -{ - int gprcount = 0; - int ssecount = 0; - int flags = cif->rtype->type; - int i, avn, n, ngpr, nsse; - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t bytes; - - if (flags != FFI_TYPE_VOID) - { - n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); - - if (n == 0) - { - /* The return value is passed in memory. A pointer to that - memory is the first argument. Allocate a register for it. */ - gprcount++; - - /* We don't have to do anything in asm for the return. */ - flags = FFI_TYPE_VOID; - } - else if (flags == FFI_TYPE_STRUCT) - { - /* Mark which registers the result appears in. */ - _Bool sse0 = SSE_CLASS_P(classes[0]); - _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); - - if (sse0 && !sse1) - flags |= 1 << 8; - else if (!sse0 && sse1) - flags |= 1 << 9; - else if (sse0 && sse1) - flags |= 1 << 10; - - /* Mark the true size of the structure. */ - flags |= cif->rtype->size << 12; - } - } - - /* Go over all arguments and determine the way they should be passed. - If it's in a register and there is space for it, let that be so. If - not, add it's size to the stack byte count. */ - for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) - { - if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = cif->arg_types[i]->alignment; - - if (align < 8) - align = 8; - - bytes = ALIGN(bytes, align); - bytes += cif->arg_types[i]->size; - } - else - { - gprcount += ngpr; - ssecount += nsse; - } - } - - if (ssecount) - flags |= 1 << 11; - - cif->flags = flags; - cif->bytes = bytes; - cif->bytes = ALIGN(bytes,8); - - return FFI_OK; -} - -void -ffi_call( - ffi_cif* cif, - void (*fn)(void), - void* rvalue, - void** avalue) -{ - enum x86_64_reg_class classes[MAX_CLASSES]; - char* stack; - char* argp; - ffi_type** arg_types; - int gprcount, ssecount, ngpr, nsse, i, avn; - _Bool ret_in_memory; - RegisterArgs* reg_args; - - /* Can't call 32-bit mode from 64-bit mode. */ - FFI_ASSERT(cif->abi == FFI_UNIX64); - - /* If the return value is a struct and we don't have a return value - address then we need to make one. Note the setting of flags to - VOID above in ffi_prep_cif_machdep. */ - ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT - && (cif->flags & 0xff) == FFI_TYPE_VOID); - - if (rvalue == NULL && ret_in_memory) - rvalue = alloca (cif->rtype->size); - - /* Allocate the space for the arguments, plus 4 words of temp space. */ - stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); - reg_args = (RegisterArgs*)stack; - argp = stack + sizeof(RegisterArgs); - - gprcount = ssecount = 0; - - /* If the return value is passed in memory, add the pointer as the - first integer argument. */ - if (ret_in_memory) - reg_args->gpr[gprcount++] = (long) rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - size_t size = arg_types[i]->size; - int n; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) ALIGN (argp, align); - memcpy (argp, avalue[i], size); - argp += size; - } - else - { /* The argument is passed entirely in registers. */ - char *a = (char *) avalue[i]; - int j; - - for (j = 0; j < n; j++, a += 8, size -= 8) - { - switch (classes[j]) - { - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - reg_args->gpr[gprcount] = 0; - switch (arg_types[i]->type) { - case FFI_TYPE_SINT8: - { - int8_t shortval = *(int8_t*)a; - int64_t actval = (int64_t)shortval; - reg_args->gpr[gprcount] = actval; - /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ - break; - } - - case FFI_TYPE_SINT16: - { - int16_t shortval = *(int16_t*)a; - int64_t actval = (int64_t)shortval; - memcpy (®_args->gpr[gprcount], &actval, 8); - break; - } - - case FFI_TYPE_SINT32: - { - int32_t shortval = *(int32_t*)a; - int64_t actval = (int64_t)shortval; - memcpy (®_args->gpr[gprcount], &actval, 8); - break; - } - - case FFI_TYPE_UINT8: - { - u_int8_t shortval = *(u_int8_t*)a; - u_int64_t actval = (u_int64_t)shortval; - /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ - reg_args->gpr[gprcount] = actval; - break; - } - - case FFI_TYPE_UINT16: - { - u_int16_t shortval = *(u_int16_t*)a; - u_int64_t actval = (u_int64_t)shortval; - memcpy (®_args->gpr[gprcount], &actval, 8); - break; - } - - case FFI_TYPE_UINT32: - { - u_int32_t shortval = *(u_int32_t*)a; - u_int64_t actval = (u_int64_t)shortval; - memcpy (®_args->gpr[gprcount], &actval, 8); - break; - } - - default: - //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); - reg_args->gpr[gprcount] = *(int64_t*)a; - } - gprcount++; - break; - - case X86_64_SSE_CLASS: - case X86_64_SSEDF_CLASS: - reg_args->sse[ssecount++] = *(UINT64 *) a; - break; - - case X86_64_SSESF_CLASS: - reg_args->sse[ssecount++] = *(UINT32 *) a; - break; - - default: - abort(); - } - } - } - } - - ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), - cif->flags, rvalue, fn, ssecount); -} - -extern void ffi_closure_unix64(void); - -ffi_status -ffi_prep_closure( - ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void* user_data) -{ - volatile unsigned short* tramp; - - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - tramp = (volatile unsigned short*)&closure->tramp[0]; - - tramp[0] = 0xbb49; /* mov , %r11 */ - *(void* volatile*)&tramp[1] = ffi_closure_unix64; - tramp[5] = 0xba49; /* mov , %r10 */ - *(void* volatile*)&tramp[6] = closure; - - /* Set the carry bit if the function uses any sse registers. - This is clc or stc, together with the first byte of the jmp. */ - tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; - tramp[11] = 0xe3ff; /* jmp *%r11 */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-prototypes" -int -ffi_closure_unix64_inner( - ffi_closure* closure, - void* rvalue, - RegisterArgs* reg_args, - char* argp) -#pragma clang diagnostic pop -{ - ffi_cif* cif = closure->cif; - void** avalue = alloca(cif->nargs * sizeof(void *)); - ffi_type** arg_types; - long i, avn; - int gprcount = 0; - int ssecount = 0; - int ngpr, nsse; - int ret; - - ret = cif->rtype->type; - - if (ret != FFI_TYPE_VOID) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); - - if (n == 0) - { - /* The return value goes in memory. Arrange for the closure - return value to go directly back to the original caller. */ - rvalue = (void *) reg_args->gpr[gprcount++]; - - /* We don't have to do anything in asm for the return. */ - ret = FFI_TYPE_VOID; - } - else if (ret == FFI_TYPE_STRUCT && n == 2) - { - /* Mark which register the second word of the structure goes in. */ - _Bool sse0 = SSE_CLASS_P (classes[0]); - _Bool sse1 = SSE_CLASS_P (classes[1]); - - if (!sse0 && sse1) - ret |= 1 << 8; - else if (sse0 && !sse1) - ret |= 1 << 9; - } - } - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - int n; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) ALIGN (argp, align); - avalue[i] = argp; - argp += arg_types[i]->size; - } - -#if !defined(X86_DARWIN) - /* If the argument is in a single register, or two consecutive - registers, then we can use that address directly. */ - else if (n == 1 || (n == 2 && - SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) - { - // The argument is in a single register. - if (SSE_CLASS_P (classes[0])) - { - avalue[i] = ®_args->sse[ssecount]; - ssecount += n; - } - else - { - avalue[i] = ®_args->gpr[gprcount]; - gprcount += n; - } - } -#endif - - /* Otherwise, allocate space to make them consecutive. */ - else - { - char *a = alloca (16); - int j; - - avalue[i] = a; - - for (j = 0; j < n; j++, a += 8) - { - if (SSE_CLASS_P (classes[j])) - memcpy (a, ®_args->sse[ssecount++], 8); - else - memcpy (a, ®_args->gpr[gprcount++], 8); - } - } - } - - /* Invoke the closure. */ - closure->fun (cif, rvalue, avalue, closure->user_data); - - /* Tell assembly how to perform return type promotions. */ - return ret; -} - -#endif /* __x86_64__ */ diff --git a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c b/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c deleted file mode 100644 index 706ea0f51..000000000 --- a/third_party/python/Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +++ /dev/null @@ -1,438 +0,0 @@ -#ifdef __i386__ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2002 Bo Thorsen - Copyright (c) 2002 Roger Sayle - - x86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif); - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if (ecif->cif->flags == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(int) - 1) & (unsigned) argp) - argp = (char *) ALIGN(argp, sizeof(int)); - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: -#ifdef X86 - case FFI_TYPE_STRUCT: - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: -#endif - - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_UINT64: - cif->flags = FFI_TYPE_SINT64; - break; - -#ifndef X86 - case FFI_TYPE_STRUCT: - if (cif->rtype->size == 1) - { - cif->flags = FFI_TYPE_SINT8; /* same as char size */ - } - else if (cif->rtype->size == 2) - { - cif->flags = FFI_TYPE_SINT16; /* same as short size */ - } - else if (cif->rtype->size == 4) - { - cif->flags = FFI_TYPE_INT; /* same as int type */ - } - else if (cif->rtype->size == 8) - { - cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ - } - else - { - cif->flags = FFI_TYPE_STRUCT; - } - break; -#endif - - default: - cif->flags = FFI_TYPE_INT; - break; - } - -#ifdef X86_DARWIN - cif->bytes = (cif->bytes + 15) & ~0xF; -#endif - - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)()); - -#ifdef X86_WIN32 -extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)()); - -#endif /* X86_WIN32 */ - -void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->flags == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, - fn); - break; -#ifdef X86_WIN32 - case FFI_STDCALL: - ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; -#endif /* X86_WIN32 */ - default: - FFI_ASSERT(0); - break; - } -} - - -/** private members **/ - -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif); -void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) -__attribute__ ((regparm(1))); -unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) -__attribute__ ((regparm(1))); -void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) -__attribute__ ((regparm(1))); - -/* This function is jumped to by the trampoline */ - -unsigned int FFI_HIDDEN -ffi_closure_SYSV_inner (closure, respp, args) -ffi_closure *closure; -void **respp; -void *args; -{ - // our various things... - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); - - (closure->fun) (cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, - ffi_cif *cif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( cif->flags == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) argp; - argp += 4; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(int) - 1) & (unsigned) argp) { - argp = (char *) ALIGN(argp, sizeof(int)); - } - - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ - -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ -({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ -unsigned int __fun = (unsigned int)(FUN); \ -unsigned int __ctx = (unsigned int)(CTX); \ -unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ -*(unsigned char*) &__tramp[0] = 0xb8; \ -*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ -*(unsigned char *) &__tramp[5] = 0xe9; \ -*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ -}) - - -/* the cif must already be prep'ed */ -ffi_status -ffi_prep_closure (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ - &ffi_closure_SYSV, \ - (void*)closure); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -/* ------- Native raw API support -------------------------------- */ - -#if !FFI_NO_RAW_API - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc) -{ - int i; - - FFI_ASSERT (cif->abi == FFI_SYSV); - - // we currently don't support certain kinds of arguments for raw - // closures. This should be implemented by a separate assembly language - // routine, since it would require argument processing, something we - // don't do now for performance. - - for (i = cif->nargs-1; i >= 0; i--) - { - FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); - FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); - } - - - FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, - codeloc); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - -static void -ffi_prep_args_raw(char *stack, extended_cif *ecif) -{ - memcpy (stack, ecif->avalue, ecif->cif->bytes); -} - -/* we borrow this routine from libffi (it must be changed, though, to - * actually call the function passed in the first argument. as of - * libffi-1.20, this is not the case.) - */ - -extern void -ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, - unsigned, unsigned *, void (*fn)()); - -#ifdef X86_WIN32 -extern void -ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, - unsigned, unsigned *, void (*fn)()); -#endif /* X86_WIN32 */ - -void -ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) -{ - extended_cif ecif; - void **avalue = (void **)fake_avalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; -#ifdef X86_WIN32 - case FFI_STDCALL: - ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; -#endif /* X86_WIN32 */ - default: - FFI_ASSERT(0); - break; - } -} - -#endif -#endif // __i386__ diff --git a/third_party/python/Modules/_ctypes/malloc_closure.c b/third_party/python/Modules/_ctypes/malloc_closure.c index 248c6a670..bb75e2024 100644 --- a/third_party/python/Modules/_ctypes/malloc_closure.c +++ b/third_party/python/Modules/_ctypes/malloc_closure.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include #include #ifdef MS_WIN32 diff --git a/third_party/python/Modules/_ctypes/stgdict.c b/third_party/python/Modules/_ctypes/stgdict.c index 8278b2fbe..6f64606a7 100644 --- a/third_party/python/Modules/_ctypes/stgdict.c +++ b/third_party/python/Modules/_ctypes/stgdict.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include "Python.h" #include #ifdef MS_WIN32 diff --git a/third_party/python/Modules/_curses_panel.c b/third_party/python/Modules/_curses_panel.c index 18ef335b8..7ccbf80f6 100644 --- a/third_party/python/Modules/_curses_panel.c +++ b/third_party/python/Modules/_curses_panel.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Interface to the ncurses panel library * diff --git a/third_party/python/Modules/_cursesmodule.c b/third_party/python/Modules/_cursesmodule.c index c048a7ddf..c0485b7a0 100644 --- a/third_party/python/Modules/_cursesmodule.c +++ b/third_party/python/Modules/_cursesmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * This is a curses module for Python. * @@ -140,7 +141,7 @@ class curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=88c860abdbb50e0c]*/ -#include "clinic/_cursesmodule.c.h" +#include "third_party/python/Modules/clinic/_cursesmodule.inc" /* Definition of exception curses.error */ diff --git a/third_party/python/Modules/_datetimemodule.c b/third_party/python/Modules/_datetimemodule.c index a43844bbf..e1949d0a7 100644 --- a/third_party/python/Modules/_datetimemodule.c +++ b/third_party/python/Modules/_datetimemodule.c @@ -1,24 +1,19 @@ +/* clang-format off */ /* C implementation for the date/time type documented at * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage */ -#include "Python.h" -#include "structmember.h" - -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #include "libc/time/struct/tm.h" -#ifdef MS_WINDOWS -# include /* struct timeval */ -#endif - /* Differentiate between building the core module and building extension * modules. */ #ifndef Py_BUILD_CORE #define Py_BUILD_CORE #endif -#include "datetime.h" +#include "third_party/python/Include/datetime.h" #undef Py_BUILD_CORE /*[clinic input] @@ -27,7 +22,7 @@ class datetime.datetime "PyDateTime_DateTime *" "&PyDateTime_DateTimeType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=78142cb64b9e98bc]*/ -#include "clinic/_datetimemodule.c.h" +#include "third_party/python/Modules/clinic/_datetimemodule.inc" /* We require that C int be at least 32 bits, and use int virtually * everywhere. In just a few cases we use a temp long, where a Python diff --git a/third_party/python/Modules/_dbmmodule.c b/third_party/python/Modules/_dbmmodule.c index 2fe1de77e..079cab26c 100644 --- a/third_party/python/Modules/_dbmmodule.c +++ b/third_party/python/Modules/_dbmmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* DBM module using dictionary interface */ @@ -40,7 +41,7 @@ typedef struct { DBM *di_dbm; } dbmobject; -#include "clinic/_dbmmodule.c.h" +#include "third_party/python/Modules/clinic/_dbmmodule.inc" static PyTypeObject Dbmtype; diff --git a/third_party/python/Modules/_decimal/_decimal.c b/third_party/python/Modules/_decimal/_decimal.c index 13418c905..ddb07868a 100644 --- a/third_party/python/Modules/_decimal/_decimal.c +++ b/third_party/python/Modules/_decimal/_decimal.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2012 Stefan Krah. All rights reserved. * @@ -25,15 +26,19 @@ * SUCH DAMAGE. */ +#include "docstrings.h" +#include "third_party/python/Include/longintrepr.h" +#include "third_party/python/Modules/_decimal/libmpdec/mpdecimal.h" +#include "third_party/python/Include/pythread.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/complexobject.h" -#include -#include "longintrepr.h" -#include "pythread.h" -#include "structmember.h" -#include "complexobject.h" -#include "mpdecimal.h" - -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/longintrepr.h" +#include "third_party/python/Include/pythread.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/complexobject.h" #include "docstrings.h" diff --git a/third_party/python/Modules/_decimal/docstrings.h b/third_party/python/Modules/_decimal/docstrings.h index f7fd6e795..a035db6a5 100644 --- a/third_party/python/Modules/_decimal/docstrings.h +++ b/third_party/python/Modules/_decimal/docstrings.h @@ -1,14 +1,8 @@ -/* - * Copyright (c) 2001-2012 Python Software Foundation. All Rights Reserved. - * Modified and extended by Stefan Krah. - */ - - #ifndef DOCSTRINGS_H #define DOCSTRINGS_H +/* clang-format off */ - -#include "pymacro.h" +#include "third_party/python/Include/pymacro.h" /******************************************************************************/ diff --git a/third_party/python/Modules/_decimal/libmpdec/basearith.c b/third_party/python/Modules/_decimal/libmpdec/basearith.c index dfe152392..f5a66a582 100644 --- a/third_party/python/Modules/_decimal/libmpdec/basearith.c +++ b/third_party/python/Modules/_decimal/libmpdec/basearith.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,10 +28,6 @@ #include "mpdecimal.h" -#include -#include -#include -#include #include "constants.h" #include "typearith.h" #include "basearith.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/basearith.h b/third_party/python/Modules/_decimal/libmpdec/basearith.h index 976358a11..1e718b54c 100644 --- a/third_party/python/Modules/_decimal/libmpdec/basearith.h +++ b/third_party/python/Modules/_decimal/libmpdec/basearith.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include #include "typearith.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/bits.h b/third_party/python/Modules/_decimal/libmpdec/bits.h index b5eaa2497..da48fbef9 100644 --- a/third_party/python/Modules/_decimal/libmpdec/bits.h +++ b/third_party/python/Modules/_decimal/libmpdec/bits.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Check if n is a power of 2. */ diff --git a/third_party/python/Modules/_decimal/libmpdec/constants.c b/third_party/python/Modules/_decimal/libmpdec/constants.c index 2c2d5ea48..d831d3bd4 100644 --- a/third_party/python/Modules/_decimal/libmpdec/constants.c +++ b/third_party/python/Modules/_decimal/libmpdec/constants.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,7 +28,6 @@ #include "mpdecimal.h" -#include #include "constants.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/constants.h b/third_party/python/Modules/_decimal/libmpdec/constants.h index c0febfc87..f558530ad 100644 --- a/third_party/python/Modules/_decimal/libmpdec/constants.h +++ b/third_party/python/Modules/_decimal/libmpdec/constants.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * diff --git a/third_party/python/Modules/_decimal/libmpdec/context.c b/third_party/python/Modules/_decimal/libmpdec/context.c index 24c7b890c..18042db1e 100644 --- a/third_party/python/Modules/_decimal/libmpdec/context.c +++ b/third_party/python/Modules/_decimal/libmpdec/context.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -26,10 +27,9 @@ */ +#include "libc/calls/calls.h" +#include "libc/sysv/consts/sig.h" #include "mpdecimal.h" -#include -#include -#include void diff --git a/third_party/python/Modules/_decimal/libmpdec/convolute.c b/third_party/python/Modules/_decimal/libmpdec/convolute.c index 4c62e8bd3..ac1430246 100644 --- a/third_party/python/Modules/_decimal/libmpdec/convolute.c +++ b/third_party/python/Modules/_decimal/libmpdec/convolute.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,7 +28,6 @@ #include "mpdecimal.h" -#include #include "bits.h" #include "constants.h" #include "fnt.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/convolute.h b/third_party/python/Modules/_decimal/libmpdec/convolute.h index f30a177a6..ed2f885a2 100644 --- a/third_party/python/Modules/_decimal/libmpdec/convolute.h +++ b/third_party/python/Modules/_decimal/libmpdec/convolute.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ diff --git a/third_party/python/Modules/_decimal/libmpdec/crt.c b/third_party/python/Modules/_decimal/libmpdec/crt.c index 4a1e80a23..dd1fe6f0a 100644 --- a/third_party/python/Modules/_decimal/libmpdec/crt.c +++ b/third_party/python/Modules/_decimal/libmpdec/crt.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,8 +28,6 @@ #include "mpdecimal.h" -#include -#include #include "numbertheory.h" #include "umodarith.h" #include "crt.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/crt.h b/third_party/python/Modules/_decimal/libmpdec/crt.h index f61e77293..f94e20bcd 100644 --- a/third_party/python/Modules/_decimal/libmpdec/crt.h +++ b/third_party/python/Modules/_decimal/libmpdec/crt.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ diff --git a/third_party/python/Modules/_decimal/libmpdec/difradix2.c b/third_party/python/Modules/_decimal/libmpdec/difradix2.c index 06e5ab5e2..71a4af1b9 100644 --- a/third_party/python/Modules/_decimal/libmpdec/difradix2.c +++ b/third_party/python/Modules/_decimal/libmpdec/difradix2.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,8 +28,6 @@ #include "mpdecimal.h" -#include -#include #include "bits.h" #include "numbertheory.h" #include "umodarith.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/difradix2.h b/third_party/python/Modules/_decimal/libmpdec/difradix2.h index 5e22bcf32..52150f130 100644 --- a/third_party/python/Modules/_decimal/libmpdec/difradix2.h +++ b/third_party/python/Modules/_decimal/libmpdec/difradix2.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include #include "numbertheory.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/fnt.c b/third_party/python/Modules/_decimal/libmpdec/fnt.c index 7e924c852..e9c2efb39 100644 --- a/third_party/python/Modules/_decimal/libmpdec/fnt.c +++ b/third_party/python/Modules/_decimal/libmpdec/fnt.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,12 +28,10 @@ #include "mpdecimal.h" -#include -#include -#include #include "bits.h" #include "difradix2.h" #include "numbertheory.h" +#include "libc/assert.h" #include "fnt.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/fnt.h b/third_party/python/Modules/_decimal/libmpdec/fnt.h index fa2154a79..1ce5c982d 100644 --- a/third_party/python/Modules/_decimal/libmpdec/fnt.h +++ b/third_party/python/Modules/_decimal/libmpdec/fnt.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ diff --git a/third_party/python/Modules/_decimal/libmpdec/fourstep.c b/third_party/python/Modules/_decimal/libmpdec/fourstep.c index 21d3e7485..09660515b 100644 --- a/third_party/python/Modules/_decimal/libmpdec/fourstep.c +++ b/third_party/python/Modules/_decimal/libmpdec/fourstep.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,7 +28,6 @@ #include "mpdecimal.h" -#include #include "numbertheory.h" #include "sixstep.h" #include "transpose.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/fourstep.h b/third_party/python/Modules/_decimal/libmpdec/fourstep.h index 80dcd4be3..dc069e741 100644 --- a/third_party/python/Modules/_decimal/libmpdec/fourstep.h +++ b/third_party/python/Modules/_decimal/libmpdec/fourstep.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ diff --git a/third_party/python/Modules/_decimal/libmpdec/io.c b/third_party/python/Modules/_decimal/libmpdec/io.c index 35bc1b1e3..26ec0e274 100644 --- a/third_party/python/Modules/_decimal/libmpdec/io.c +++ b/third_party/python/Modules/_decimal/libmpdec/io.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,17 +28,12 @@ #include "mpdecimal.h" -#include -#include -#include -#include -#include -#include -#include #include "libc/unicode/locale.h" #include "bits.h" #include "constants.h" #include "typearith.h" +#include "libc/errno.h" +#include "libc/fmt/fmt.h" #include "io.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/io.h b/third_party/python/Modules/_decimal/libmpdec/io.h index de5486a00..374b0296c 100644 --- a/third_party/python/Modules/_decimal/libmpdec/io.h +++ b/third_party/python/Modules/_decimal/libmpdec/io.h @@ -1,38 +1,7 @@ -/* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - #ifndef IO_H #define IO_H - - -#include #include "mpdecimal.h" - +/* clang-format off */ #if SIZE_MAX == MPD_SIZE_MAX #define mpd_strtossize _mpd_strtossize @@ -55,5 +24,4 @@ mpd_strtossize(const char *s, char **end, int base) } #endif - #endif diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/REFERENCES.txt b/third_party/python/Modules/_decimal/libmpdec/literature/REFERENCES.txt deleted file mode 100644 index 9ed578265..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/REFERENCES.txt +++ /dev/null @@ -1,51 +0,0 @@ - - -This document contains links to the literature used in the process of -creating the library. The list is probably not complete. - - -Mike Cowlishaw: General Decimal Arithmetic Specification -http://speleotrove.com/decimal/decarith.html - - -Jean-Michel Muller: On the definition of ulp (x) -lara.inist.fr/bitstream/2332/518/1/LIP-RR2005-09.pdf - - -T. E. Hull, A. Abrham: Properly rounded variable precision square root -http://portal.acm.org/citation.cfm?id=214413 - - -T. E. Hull, A. Abrham: Variable precision exponential function -http://portal.acm.org/citation.cfm?id=6498 - - -Roman E. Maeder: Storage allocation for the Karatsuba integer multiplication -algorithm. http://www.springerlink.com/content/w15058mj6v59t565/ - - -J. M. Pollard: The fast Fourier transform in a finite field -http://www.ams.org/journals/mcom/1971-25-114/S0025-5718-1971-0301966-0/home.html - - -David H. Bailey: FFTs in External or Hierarchical Memory -http://crd.lbl.gov/~dhbailey/dhbpapers/ - - -W. Morven Gentleman: Matrix Multiplication and Fast Fourier Transforms -http://www.alcatel-lucent.com/bstj/vol47-1968/articles/bstj47-6-1099.pdf - - -Mikko Tommila: Apfloat documentation -http://www.apfloat.org/apfloat/2.41/apfloat.pdf - - -Joerg Arndt: "Matters Computational" -http://www.jjj.de/fxt/ - - -Karl Hasselstrom: Fast Division of Large Integers -www.treskal.com/kalle/exjobb/original-report.pdf - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/bignum.txt b/third_party/python/Modules/_decimal/libmpdec/literature/bignum.txt deleted file mode 100644 index f34ff67c6..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/bignum.txt +++ /dev/null @@ -1,83 +0,0 @@ - - -Bignum support (Fast Number Theoretic Transform or FNT): -======================================================== - -Bignum arithmetic in libmpdec uses the scheme for fast convolution -of integer sequences from: - -J. M. Pollard: The fast Fourier transform in a finite field -http://www.ams.org/journals/mcom/1971-25-114/S0025-5718-1971-0301966-0/home.html - - -The transform in a finite field can be used for convolution in the same -way as the Fourier Transform. The main advantages of the Number Theoretic -Transform are that it is both exact and very memory efficient. - - -Convolution in pseudo-code: -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - fnt_convolute(a, b): - x = fnt(a) # forward transform of a - y = fnt(b) # forward transform of b - z = pairwise multiply x[i] and y[i] - result = inv_fnt(z) # backward transform of z. - - -Extending the maximum transform length (Chinese Remainder Theorem): -------------------------------------------------------------------- - -The maximum transform length is quite limited when using a single -prime field. However, it is possible to use multiple primes and -recover the result using the Chinese Remainder Theorem. - - -Multiplication in pseudo-code: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - _mpd_fntmul(u, v): - c1 = fnt_convolute(u, v, P1) # convolute modulo prime1 - c2 = fnt_convolute(u, v, P2) # convolute modulo prime2 - c3 = fnt_convolute(u, v, P3) # convolute modulo prime3 - result = crt3(c1, c2, c3) # Chinese Remainder Theorem - - -Optimized transform functions: ------------------------------- - -There are three different fnt() functions: - - std_fnt: "standard" decimation in frequency transform for array lengths - of 2**n. Performs well up to 1024 words. - - sixstep: Cache-friendly algorithm for array lengths of 2**n. Outperforms - std_fnt for large arrays. - - fourstep: Algorithm for array lengths of 3 * 2**n. Also cache friendly - in large parts. - - -List of bignum-only files: --------------------------- - -Functions from these files are only used in _mpd_fntmul(). - - umodarith.h -> fast low level routines for unsigned modular arithmetic - numbertheory.c -> routines for setting up the FNT - difradix2.c -> decimation in frequency transform, used as the - "base case" by the following three files: - - fnt.c -> standard transform for smaller arrays - sixstep.c -> transform large arrays of length 2**n - fourstep.c -> transform arrays of length 3 * 2**n - - convolute.c -> do the actual fast convolution, using one of - the three transform functions. - transpose.c -> transpositions needed for the sixstep algorithm. - crt.c -> Chinese Remainder Theorem: use information from three - transforms modulo three different primes to get the - final result. - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/fnt.py b/third_party/python/Modules/_decimal/libmpdec/literature/fnt.py deleted file mode 100644 index 6363536da..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/fnt.py +++ /dev/null @@ -1,208 +0,0 @@ -# -# Copyright (c) 2008-2016 Stefan Krah. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - - -###################################################################### -# This file lists and checks some of the constants and limits used # -# in libmpdec's Number Theoretic Transform. At the end of the file # -# there is an example function for the plain DFT transform. # -###################################################################### - - -# -# Number theoretic transforms are done in subfields of F(p). P[i] -# are the primes, D[i] = P[i] - 1 are highly composite and w[i] -# are the respective primitive roots of F(p). -# -# The strategy is to convolute two coefficients modulo all three -# primes, then use the Chinese Remainder Theorem on the three -# result arrays to recover the result in the usual base RADIX -# form. -# - -# ====================================================================== -# Primitive roots -# ====================================================================== - -# -# Verify primitive roots: -# -# For a prime field, r is a primitive root if and only if for all prime -# factors f of p-1, r**((p-1)/f) =/= 1 (mod p). -# -def prod(F, E): - """Check that the factorization of P-1 is correct. F is the list of - factors of P-1, E lists the number of occurrences of each factor.""" - x = 1 - for y, z in zip(F, E): - x *= y**z - return x - -def is_primitive_root(r, p, factors, exponents): - """Check if r is a primitive root of F(p).""" - if p != prod(factors, exponents) + 1: - return False - for f in factors: - q, control = divmod(p-1, f) - if control != 0: - return False - if pow(r, q, p) == 1: - return False - return True - - -# ================================================================= -# Constants and limits for the 64-bit version -# ================================================================= - -RADIX = 10**19 - -# Primes P1, P2 and P3: -P = [2**64-2**32+1, 2**64-2**34+1, 2**64-2**40+1] - -# P-1, highly composite. The transform length d is variable and -# must divide D = P-1. Since all D are divisible by 3 * 2**32, -# transform lengths can be 2**n or 3 * 2**n (where n <= 32). -D = [2**32 * 3 * (5 * 17 * 257 * 65537), - 2**34 * 3**2 * (7 * 11 * 31 * 151 * 331), - 2**40 * 3**2 * (5 * 7 * 13 * 17 * 241)] - -# Prime factors of P-1 and their exponents: -F = [(2,3,5,17,257,65537), (2,3,7,11,31,151,331), (2,3,5,7,13,17,241)] -E = [(32,1,1,1,1,1), (34,2,1,1,1,1,1), (40,2,1,1,1,1,1)] - -# Maximum transform length for 2**n. Above that only 3 * 2**31 -# or 3 * 2**32 are possible. -MPD_MAXTRANSFORM_2N = 2**32 - - -# Limits in the terminology of Pollard's paper: -m2 = (MPD_MAXTRANSFORM_2N * 3) // 2 # Maximum length of the smaller array. -M1 = M2 = RADIX-1 # Maximum value per single word. -L = m2 * M1 * M2 -P[0] * P[1] * P[2] > 2 * L - - -# Primitive roots of F(P1), F(P2) and F(P3): -w = [7, 10, 19] - -# The primitive roots are correct: -for i in range(3): - if not is_primitive_root(w[i], P[i], F[i], E[i]): - print("FAIL") - - -# ================================================================= -# Constants and limits for the 32-bit version -# ================================================================= - -RADIX = 10**9 - -# Primes P1, P2 and P3: -P = [2113929217, 2013265921, 1811939329] - -# P-1, highly composite. All D = P-1 are divisible by 3 * 2**25, -# allowing for transform lengths up to 3 * 2**25 words. -D = [2**25 * 3**2 * 7, - 2**27 * 3 * 5, - 2**26 * 3**3] - -# Prime factors of P-1 and their exponents: -F = [(2,3,7), (2,3,5), (2,3)] -E = [(25,2,1), (27,1,1), (26,3)] - -# Maximum transform length for 2**n. Above that only 3 * 2**24 or -# 3 * 2**25 are possible. -MPD_MAXTRANSFORM_2N = 2**25 - - -# Limits in the terminology of Pollard's paper: -m2 = (MPD_MAXTRANSFORM_2N * 3) // 2 # Maximum length of the smaller array. -M1 = M2 = RADIX-1 # Maximum value per single word. -L = m2 * M1 * M2 -P[0] * P[1] * P[2] > 2 * L - - -# Primitive roots of F(P1), F(P2) and F(P3): -w = [5, 31, 13] - -# The primitive roots are correct: -for i in range(3): - if not is_primitive_root(w[i], P[i], F[i], E[i]): - print("FAIL") - - -# ====================================================================== -# Example transform using a single prime -# ====================================================================== - -def ntt(lst, dir): - """Perform a transform on the elements of lst. len(lst) must - be 2**n or 3 * 2**n, where n <= 25. This is the slow DFT.""" - p = 2113929217 # prime - d = len(lst) # transform length - d_prime = pow(d, (p-2), p) # inverse of d - xi = (p-1)//d - w = 5 # primitive root of F(p) - r = pow(w, xi, p) # primitive root of the subfield - r_prime = pow(w, (p-1-xi), p) # inverse of r - if dir == 1: # forward transform - a = lst # input array - A = [0] * d # transformed values - for i in range(d): - s = 0 - for j in range(d): - s += a[j] * pow(r, i*j, p) - A[i] = s % p - return A - elif dir == -1: # backward transform - A = lst # input array - a = [0] * d # transformed values - for j in range(d): - s = 0 - for i in range(d): - s += A[i] * pow(r_prime, i*j, p) - a[j] = (d_prime * s) % p - return a - -def ntt_convolute(a, b): - """convolute arrays a and b.""" - assert(len(a) == len(b)) - x = ntt(a, 1) - y = ntt(b, 1) - for i in range(len(a)): - y[i] = y[i] * x[i] - r = ntt(y, -1) - return r - - -# Example: Two arrays representing 21 and 81 in little-endian: -a = [1, 2, 0, 0] -b = [1, 8, 0, 0] - -assert(ntt_convolute(a, b) == [1, 10, 16, 0]) -assert(21 * 81 == (1*10**0 + 10*10**1 + 16*10**2 + 0*10**3)) diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/matrix-transform.txt b/third_party/python/Modules/_decimal/libmpdec/literature/matrix-transform.txt deleted file mode 100644 index 701d85d6b..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/matrix-transform.txt +++ /dev/null @@ -1,256 +0,0 @@ - - -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) - - -The Matrix Fourier Transform: -============================= - -In libmpdec, the Matrix Fourier Transform [1] is called four-step transform -after a variant that appears in [2]. The algorithm requires that the input -array can be viewed as an R*C matrix. - -All operations are done modulo p. For readability, the proofs drop all -instances of (mod p). - - -Algorithm four-step (forward transform): ----------------------------------------- - - a := input array - d := len(a) = R * C - p := prime - w := primitive root of unity of the prime field - r := w**((p-1)/d) - A := output array - - 1) Apply a length R FNT to each column. - - 2) Multiply each matrix element (addressed by j*C+m) by r**(j*m). - - 3) Apply a length C FNT to each row. - - 4) Transpose the matrix. - - -Proof (forward transform): --------------------------- - - The algorithm can be derived starting from the regular definition of - the finite-field transform of length d: - - d-1 - ,---- - \ - A[k] = | a[l] * r**(k * l) - / - `---- - l = 0 - - - The sum can be rearranged into the sum of the sums of columns: - - C-1 R-1 - ,---- ,---- - \ \ - = | | a[i * C + j] * r**(k * (i * C + j)) - / / - `---- `---- - j = 0 i = 0 - - - Extracting a constant from the inner sum: - - C-1 R-1 - ,---- ,---- - \ \ - = | r**k*j * | a[i * C + j] * r**(k * i * C) - / / - `---- `---- - j = 0 i = 0 - - - Without any loss of generality, let k = n * R + m, - where n < C and m < R: - - C-1 R-1 - ,---- ,---- - \ \ - A[n*R+m] = | r**(R*n*j) * r**(m*j) * | a[i*C+j] * r**(R*C*n*i) * r**(C*m*i) - / / - `---- `---- - j = 0 i = 0 - - - Since r = w ** ((p-1) / (R*C)): - - a) r**(R*C*n*i) = w**((p-1)*n*i) = 1 - - b) r**(C*m*i) = w**((p-1) / R) ** (m*i) = r_R ** (m*i) - - c) r**(R*n*j) = w**((p-1) / C) ** (n*j) = r_C ** (n*j) - - r_R := root of the subfield of length R. - r_C := root of the subfield of length C. - - - C-1 R-1 - ,---- ,---- - \ \ - A[n*R+m] = | r_C**(n*j) * [ r**(m*j) * | a[i*C+j] * r_R**(m*i) ] - / ^ / - `---- | `---- 1) transform the columns - j = 0 | i = 0 - ^ | - | `-- 2) multiply - | - `-- 3) transform the rows - - - Note that the entire RHS is a function of n and m and that the results - for each pair (n, m) are stored in Fortran order. - - Let the term in square brackets be f(m, j). Step 1) and 2) precalculate - the term for all (m, j). After that, the original matrix is now a lookup - table with the mth element in the jth column at location m * C + j. - - Let the complete RHS be g(m, n). Step 3) does an in-place transform of - length n on all rows. After that, the original matrix is now a lookup - table with the mth element in the nth column at location m * C + n. - - But each (m, n) pair should be written to location n * R + m. Therefore, - step 4) transposes the result of step 3). - - - -Algorithm four-step (inverse transform): ----------------------------------------- - - A := input array - d := len(A) = R * C - p := prime - d' := d**(p-2) # inverse of d - w := primitive root of unity of the prime field - r := w**((p-1)/d) # root of the subfield - r' := w**((p-1) - (p-1)/d) # inverse of r - a := output array - - 0) View the matrix as a C*R matrix. - - 1) Transpose the matrix, producing an R*C matrix. - - 2) Apply a length C FNT to each row. - - 3) Multiply each matrix element (addressed by i*C+n) by r**(i*n). - - 4) Apply a length R FNT to each column. - - -Proof (inverse transform): --------------------------- - - The algorithm can be derived starting from the regular definition of - the finite-field inverse transform of length d: - - d-1 - ,---- - \ - a[k] = d' * | A[l] * r' ** (k * l) - / - `---- - l = 0 - - - The sum can be rearranged into the sum of the sums of columns. Note - that at this stage we still have a C*R matrix, so C denotes the number - of rows: - - R-1 C-1 - ,---- ,---- - \ \ - = d' * | | a[j * R + i] * r' ** (k * (j * R + i)) - / / - `---- `---- - i = 0 j = 0 - - - Extracting a constant from the inner sum: - - R-1 C-1 - ,---- ,---- - \ \ - = d' * | r' ** (k*i) * | a[j * R + i] * r' ** (k * j * R) - / / - `---- `---- - i = 0 j = 0 - - - Without any loss of generality, let k = m * C + n, - where m < R and n < C: - - R-1 C-1 - ,---- ,---- - \ \ - A[m*C+n] = d' * | r' ** (C*m*i) * r' ** (n*i) * | a[j*R+i] * r' ** (R*C*m*j) * r' ** (R*n*j) - / / - `---- `---- - i = 0 j = 0 - - - Since r' = w**((p-1) - (p-1)/d) and d = R*C: - - a) r' ** (R*C*m*j) = w**((p-1)*R*C*m*j - (p-1)*m*j) = 1 - - b) r' ** (C*m*i) = w**((p-1)*C - (p-1)/R) ** (m*i) = r_R' ** (m*i) - - c) r' ** (R*n*j) = r_C' ** (n*j) - - d) d' = d**(p-2) = (R*C) ** (p-2) = R**(p-2) * C**(p-2) = R' * C' - - r_R' := inverse of the root of the subfield of length R. - r_C' := inverse of the root of the subfield of length C. - R' := inverse of R - C' := inverse of C - - - R-1 C-1 - ,---- ,---- 2) transform the rows of a^T - \ \ - A[m*C+n] = R' * | r_R' ** (m*i) * [ r' ** (n*i) * C' * | a[j*R+i] * r_C' ** (n*j) ] - / ^ / ^ - `---- | `---- | - i = 0 | j = 0 | - ^ | `-- 1) Transpose input matrix - | `-- 3) multiply to address elements by - | i * C + j - `-- 3) transform the columns - - - - Note that the entire RHS is a function of m and n and that the results - for each pair (m, n) are stored in C order. - - Let the term in square brackets be f(n, i). Without step 1), the sum - would perform a length C transform on the columns of the input matrix. - This is a) inefficient and b) the results are needed in C order, so - step 1) exchanges rows and columns. - - Step 2) and 3) precalculate f(n, i) for all (n, i). After that, the - original matrix is now a lookup table with the ith element in the nth - column at location i * C + n. - - Let the complete RHS be g(m, n). Step 4) does an in-place transform of - length m on all columns. After that, the original matrix is now a lookup - table with the mth element in the nth column at location m * C + n, - which means that all A[k] = A[m * C + n] are in the correct order. - - --- - - [1] Joerg Arndt: "Matters Computational" - http://www.jjj.de/fxt/ - [2] David H. Bailey: FFTs in External or Hierarchical Memory - http://crd.lbl.gov/~dhbailey/dhbpapers/ - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-64.txt b/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-64.txt deleted file mode 100644 index 029b8de3d..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-64.txt +++ /dev/null @@ -1,127 +0,0 @@ - - -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) - - -========================================================================== - Calculate (a * b) % p using special primes -========================================================================== - -A description of the algorithm can be found in the apfloat manual by -Tommila [1]. - - -Definitions: ------------- - -In the whole document, "==" stands for "is congruent with". - -Result of a * b in terms of high/low words: - - (1) hi * 2**64 + lo = a * b - -Special primes: - - (2) p = 2**64 - z + 1, where z = 2**n - -Single step modular reduction: - - (3) R(hi, lo) = hi * z - hi + lo - - -Strategy: ---------- - - a) Set (hi, lo) to the result of a * b. - - b) Set (hi', lo') to the result of R(hi, lo). - - c) Repeat step b) until 0 <= hi' * 2**64 + lo' < 2*p. - - d) If the result is less than p, return lo'. Otherwise return lo' - p. - - -The reduction step b) preserves congruence: -------------------------------------------- - - hi * 2**64 + lo == hi * z - hi + lo (mod p) - - Proof: - ~~~~~~ - - hi * 2**64 + lo = (2**64 - z + 1) * hi + z * hi - hi + lo - - = p * hi + z * hi - hi + lo - - == z * hi - hi + lo (mod p) - - -Maximum numbers of step b): ---------------------------- - -# To avoid unnecessary formalism, define: - -def R(hi, lo, z): - return divmod(hi * z - hi + lo, 2**64) - -# For simplicity, assume hi=2**64-1, lo=2**64-1 after the -# initial multiplication a * b. This is of course impossible -# but certainly covers all cases. - -# Then, for p1: -hi=2**64-1; lo=2**64-1; z=2**32 -p1 = 2**64 - z + 1 - -hi, lo = R(hi, lo, z) # First reduction -hi, lo = R(hi, lo, z) # Second reduction -hi * 2**64 + lo < 2 * p1 # True - -# For p2: -hi=2**64-1; lo=2**64-1; z=2**34 -p2 = 2**64 - z + 1 - -hi, lo = R(hi, lo, z) # First reduction -hi, lo = R(hi, lo, z) # Second reduction -hi, lo = R(hi, lo, z) # Third reduction -hi * 2**64 + lo < 2 * p2 # True - -# For p3: -hi=2**64-1; lo=2**64-1; z=2**40 -p3 = 2**64 - z + 1 - -hi, lo = R(hi, lo, z) # First reduction -hi, lo = R(hi, lo, z) # Second reduction -hi, lo = R(hi, lo, z) # Third reduction -hi * 2**64 + lo < 2 * p3 # True - - -Step d) preserves congruence and yields a result < p: ------------------------------------------------------ - - Case hi = 0: - - Case lo < p: trivial. - - Case lo >= p: - - lo == lo - p (mod p) # result is congruent - - p <= lo < 2*p -> 0 <= lo - p < p # result is in the correct range - - Case hi = 1: - - p < 2**64 /\ 2**64 + lo < 2*p -> lo < p # lo is always less than p - - 2**64 + lo == 2**64 + (lo - p) (mod p) # result is congruent - - = lo - p # exactly the same value as the previous RHS - # in uint64_t arithmetic. - - p < 2**64 + lo < 2*p -> 0 < 2**64 + (lo - p) < p # correct range - - - -[1] http://www.apfloat.org/apfloat/2.40/apfloat.pdf - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt b/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt deleted file mode 100644 index 4d17a928e..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt +++ /dev/null @@ -1,269 +0,0 @@ - - -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) - - -======================================================================== - Calculate (a * b) % p using the 80-bit x87 FPU -======================================================================== - -A description of the algorithm can be found in the apfloat manual by -Tommila [1]. - -The proof follows an argument made by Granlund/Montgomery in [2]. - - -Definitions and assumptions: ----------------------------- - -The 80-bit extended precision format uses 64 bits for the significand: - - (1) F = 64 - -The modulus is prime and less than 2**31: - - (2) 2 <= p < 2**31 - -The factors are less than p: - - (3) 0 <= a < p - (4) 0 <= b < p - -The product a * b is less than 2**62 and is thus exact in 64 bits: - - (5) n = a * b - -The product can be represented in terms of quotient and remainder: - - (6) n = q * p + r - -Using (3), (4) and the fact that p is prime, the remainder is always -greater than zero: - - (7) 0 <= q < p /\ 1 <= r < p - - -Strategy: ---------- - -Precalculate the 80-bit long double inverse of p, with a maximum -relative error of 2**(1-F): - - (8) pinv = (long double)1.0 / p - -Calculate an estimate for q = floor(n/p). The multiplication has another -maximum relative error of 2**(1-F): - - (9) qest = n * pinv - -If we can show that q < qest < q+1, then trunc(qest) = q. It is then -easy to recover the remainder r. The complete algorithm is: - - a) Set the control word to 64-bit precision and truncation mode. - - b) n = a * b # Calculate exact product. - - c) qest = n * pinv # Calculate estimate for the quotient. - - d) q = (qest+2**63)-2**63 # Truncate qest to the exact quotient. - - f) r = n - q * p # Calculate remainder. - - -Proof for q < qest < q+1: -------------------------- - -Using the cumulative error, the error bounds for qest are: - - n n * (1 + 2**(1-F))**2 - (9) --------------------- <= qest <= --------------------- - p * (1 + 2**(1-F))**2 p - - - Lemma 1: - -------- - n q * p + r - (10) q < --------------------- = --------------------- - p * (1 + 2**(1-F))**2 p * (1 + 2**(1-F))**2 - - - Proof: - ~~~~~~ - - (I) q * p * (1 + 2**(1-F))**2 < q * p + r - - (II) q * p * 2**(2-F) + q * p * 2**(2-2*F) < r - - Using (1) and (7), it is sufficient to show that: - - (III) q * p * 2**(-62) + q * p * 2**(-126) < 1 <= r - - (III) can easily be verified by substituting the largest possible - values p = 2**31-1 and q = 2**31-2. - - The critical cases occur when r = 1, n = m * p + 1. These cases - can be exhaustively verified with a test program. - - - Lemma 2: - -------- - - n * (1 + 2**(1-F))**2 (q * p + r) * (1 + 2**(1-F))**2 - (11) --------------------- = ------------------------------- < q + 1 - p p - - Proof: - ~~~~~~ - - (I) (q * p + r) + (q * p + r) * 2**(2-F) + (q * p + r) * 2**(2-2*F) < q * p + p - - (II) (q * p + r) * 2**(2-F) + (q * p + r) * 2**(2-2*F) < p - r - - Using (1) and (7), it is sufficient to show that: - - (III) (q * p + r) * 2**(-62) + (q * p + r) * 2**(-126) < 1 <= p - r - - (III) can easily be verified by substituting the largest possible - values p = 2**31-1, q = 2**31-2 and r = 2**31-2. - - The critical cases occur when r = (p - 1), n = m * p - 1. These cases - can be exhaustively verified with a test program. - - -[1] http://www.apfloat.org/apfloat/2.40/apfloat.pdf -[2] http://gmplib.org/~tege/divcnst-pldi94.pdf - [Section 7: "Use of floating point"] - - - -(* Coq proof for (10) and (11) *) - -Require Import ZArith. -Require Import QArith. -Require Import Qpower. -Require Import Qabs. -Require Import Psatz. - -Open Scope Q_scope. - - -Ltac qreduce T := - rewrite <- (Qred_correct (T)); simpl (Qred (T)). - -Theorem Qlt_move_right : - forall x y z:Q, x + z < y <-> x < y - z. -Proof. - intros. - split. - intros. - psatzl Q. - intros. - psatzl Q. -Qed. - -Theorem Qlt_mult_by_z : - forall x y z:Q, 0 < z -> (x < y <-> x * z < y * z). -Proof. - intros. - split. - intros. - apply Qmult_lt_compat_r. trivial. trivial. - intros. - rewrite <- (Qdiv_mult_l x z). rewrite <- (Qdiv_mult_l y z). - apply Qmult_lt_compat_r. - apply Qlt_shift_inv_l. - trivial. psatzl Q. trivial. psatzl Q. psatzl Q. -Qed. - -Theorem Qle_mult_quad : - forall (a b c d:Q), - 0 <= a -> a <= c -> - 0 <= b -> b <= d -> - a * b <= c * d. - intros. - psatz Q. -Qed. - - -Theorem q_lt_qest: - forall (p q r:Q), - (0 < p) -> (p <= (2#1)^31 - 1) -> - (0 <= q) -> (q <= p - 1) -> - (1 <= r) -> (r <= p - 1) -> - q < (q * p + r) / (p * (1 + (2#1)^(-63))^2). -Proof. - intros. - rewrite Qlt_mult_by_z with (z := (p * (1 + (2#1)^(-63))^2)). - - unfold Qdiv. - rewrite <- Qmult_assoc. - rewrite (Qmult_comm (/ (p * (1 + (2 # 1) ^ (-63)) ^ 2)) (p * (1 + (2 # 1) ^ (-63)) ^ 2)). - rewrite Qmult_inv_r. - rewrite Qmult_1_r. - - assert (q * (p * (1 + (2 # 1) ^ (-63)) ^ 2) == q * p + (q * p) * ((2 # 1) ^ (-62) + (2 # 1) ^ (-126))). - qreduce ((1 + (2 # 1) ^ (-63)) ^ 2). - qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)). - ring_simplify. - reflexivity. - rewrite H5. - - rewrite Qplus_comm. - rewrite Qlt_move_right. - ring_simplify (q * p + r - q * p). - qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)). - - apply Qlt_le_trans with (y := 1). - rewrite Qlt_mult_by_z with (z := 85070591730234615865843651857942052864 # 18446744073709551617). - ring_simplify. - - apply Qle_lt_trans with (y := ((2 # 1) ^ 31 - (2#1)) * ((2 # 1) ^ 31 - 1)). - apply Qle_mult_quad. - assumption. psatzl Q. psatzl Q. psatzl Q. psatzl Q. psatzl Q. assumption. psatzl Q. psatzl Q. -Qed. - -Theorem qest_lt_qplus1: - forall (p q r:Q), - (0 < p) -> (p <= (2#1)^31 - 1) -> - (0 <= q) -> (q <= p - 1) -> - (1 <= r) -> (r <= p - 1) -> - ((q * p + r) * (1 + (2#1)^(-63))^2) / p < q + 1. -Proof. - intros. - rewrite Qlt_mult_by_z with (z := p). - - unfold Qdiv. - rewrite <- Qmult_assoc. - rewrite (Qmult_comm (/ p) p). - rewrite Qmult_inv_r. - rewrite Qmult_1_r. - - assert ((q * p + r) * (1 + (2 # 1) ^ (-63)) ^ 2 == q * p + r + (q * p + r) * ((2 # 1) ^ (-62) + (2 # 1) ^ (-126))). - qreduce ((1 + (2 # 1) ^ (-63)) ^ 2). - qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)). - ring_simplify. reflexivity. - rewrite H5. - - rewrite <- Qplus_assoc. rewrite <- Qplus_comm. rewrite Qlt_move_right. - ring_simplify ((q + 1) * p - q * p). - - rewrite <- Qplus_comm. rewrite Qlt_move_right. - - apply Qlt_le_trans with (y := 1). - qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)). - - rewrite Qlt_mult_by_z with (z := 85070591730234615865843651857942052864 # 18446744073709551617). - ring_simplify. - - ring_simplify in H0. - apply Qle_lt_trans with (y := (2147483646 # 1) * (2147483647 # 1) + (2147483646 # 1)). - - apply Qplus_le_compat. - apply Qle_mult_quad. - assumption. psatzl Q. auto with qarith. assumption. psatzl Q. - auto with qarith. auto with qarith. - psatzl Q. psatzl Q. assumption. -Qed. - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/six-step.txt b/third_party/python/Modules/_decimal/libmpdec/literature/six-step.txt deleted file mode 100644 index 8e45f4875..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/six-step.txt +++ /dev/null @@ -1,63 +0,0 @@ - - -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) - - -The Six Step Transform: -======================= - -In libmpdec, the six-step transform is the Matrix Fourier Transform (See -matrix-transform.txt) in disguise. It is called six-step transform after -a variant that appears in [1]. The algorithm requires that the input -array can be viewed as an R*C matrix. - - -Algorithm six-step (forward transform): ---------------------------------------- - - 1a) Transpose the matrix. - - 1b) Apply a length R FNT to each row. - - 1c) Transpose the matrix. - - 2) Multiply each matrix element (addressed by j*C+m) by r**(j*m). - - 3) Apply a length C FNT to each row. - - 4) Transpose the matrix. - -Note that steps 1a) - 1c) are exactly equivalent to step 1) of the Matrix -Fourier Transform. For large R, it is faster to transpose twice and do -a transform on the rows than to perform a column transpose directly. - - - -Algorithm six-step (inverse transform): ---------------------------------------- - - 0) View the matrix as a C*R matrix. - - 1) Transpose the matrix, producing an R*C matrix. - - 2) Apply a length C FNT to each row. - - 3) Multiply each matrix element (addressed by i*C+n) by r**(i*n). - - 4a) Transpose the matrix. - - 4b) Apply a length R FNT to each row. - - 4c) Transpose the matrix. - -Again, steps 4a) - 4c) are equivalent to step 4) of the Matrix Fourier -Transform. - - - --- - - [1] David H. Bailey: FFTs in External or Hierarchical Memory - http://crd.lbl.gov/~dhbailey/dhbpapers/ - - diff --git a/third_party/python/Modules/_decimal/libmpdec/literature/umodarith.lisp b/third_party/python/Modules/_decimal/libmpdec/literature/umodarith.lisp deleted file mode 100644 index 99d71c373..000000000 --- a/third_party/python/Modules/_decimal/libmpdec/literature/umodarith.lisp +++ /dev/null @@ -1,692 +0,0 @@ -; -; Copyright (c) 2008-2016 Stefan Krah. All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; -; 1. Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; -; 2. Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; -; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -; SUCH DAMAGE. -; - - -(in-package "ACL2") - -(include-book "arithmetic/top-with-meta" :dir :system) -(include-book "arithmetic-2/floor-mod/floor-mod" :dir :system) - - -;; ===================================================================== -;; Proofs for several functions in umodarith.h -;; ===================================================================== - - - -;; ===================================================================== -;; Helper theorems -;; ===================================================================== - -(defthm elim-mod-m= s m) (mod (- s m) base) s))) - s)) - -(defthmd addmod-correct - (implies (and (< 0 m) (< m base) - (< a m) (<= b m) - (natp m) (natp base) - (natp a) (natp b)) - (equal (addmod a b m base) - (mod (+ a b) m))) - :hints (("Goal" :cases ((<= base (+ a b)))) - ("Subgoal 2.1'" :use ((:instance elim-mod-m= a m) (- a m) a)) - (b (if (>= b m) (- b m) b)) - (d (mod (- a b) base)) - (d (if (< a b) (mod (+ d m) base) d))) - d)) - -; a < 2*m, b < 2*m -(defun ext-submod-2 (a b m base) - (let* ((a (mod a m)) - (b (mod b m)) - (d (mod (- a b) base)) - (d (if (< a b) (mod (+ d m) base) d))) - d)) - -(defthmd ext-submod-ext-submod-2-equal - (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) - (natp m) (natp base) - (natp a) (natp b)) - (equal (ext-submod a b m base) - (ext-submod-2 a b m base)))) - -(defthmd ext-submod-2-correct - (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) - (natp m) (natp base) - (natp a) (natp b)) - (equal (ext-submod-2 a b m base) - (mod (- a b) m)))) - - -;; ========================================================================= -;; dw-reduce is correct -;; ========================================================================= - -(defun dw-reduce (hi lo m base) - (let* ((r1 (mod hi m)) - (r2 (mod (+ (* r1 base) lo) m))) - r2)) - -(defthmd dw-reduce-correct - (implies (and (< 0 m) (< m base) - (< hi base) (< lo base) - (natp m) (natp base) - (natp hi) (natp lo)) - (equal (dw-reduce hi lo m base) - (mod (+ (* hi base) lo) m)))) - -(defthmd <=-multiply-both-sides-by-z - (implies (and (rationalp x) (rationalp y) - (< 0 z) (rationalp z)) - (equal (<= x y) - (<= (* z x) (* z y))))) - -(defthmd dw-reduce-aux1 - (implies (and (< 0 m) (< m base) - (natp m) (natp base) - (< lo base) (natp lo) - (< x m) (natp x)) - (< (+ lo (* base x)) (* base m))) - :hints (("Goal" :cases ((<= (+ x 1) m))) - ("Subgoal 1''" :cases ((<= (* base (+ x 1)) (* base m)))) - ("subgoal 1.2" :use ((:instance <=-multiply-both-sides-by-z - (x (+ 1 x)) - (y m) - (z base)))))) - -(defthm dw-reduce-aux2 - (implies (and (< x (* base m)) - (< 0 m) (< m base) - (natp m) (natp base) (natp x)) - (< (floor x m) base))) - -;; This is the necessary condition for using _mpd_div_words(). -(defthmd dw-reduce-second-quotient-fits-in-single-word - (implies (and (< 0 m) (< m base) - (< hi base) (< lo base) - (natp m) (natp base) - (natp hi) (natp lo) - (equal r1 (mod hi m))) - (< (floor (+ (* r1 base) lo) m) - base)) - :hints (("Goal" :cases ((< r1 m))) - ("Subgoal 1''" :cases ((< (+ lo (* base (mod hi m))) (* base m)))) - ("Subgoal 1.2" :use ((:instance dw-reduce-aux1 - (x (mod hi m))))))) - - -;; ========================================================================= -;; dw-submod is correct -;; ========================================================================= - -(defun dw-submod (a hi lo m base) - (let* ((r (dw-reduce hi lo m base)) - (d (mod (- a r) base)) - (d (if (< a r) (mod (+ d m) base) d))) - d)) - -(defthmd dw-submod-aux1 - (implies (and (natp a) (< 0 m) (natp m) - (natp x) (equal r (mod x m))) - (equal (mod (- a x) m) - (mod (- a r) m)))) - -(defthmd dw-submod-correct - (implies (and (< 0 m) (< m base) - (natp a) (< a m) - (< hi base) (< lo base) - (natp m) (natp base) - (natp hi) (natp lo)) - (equal (dw-submod a hi lo m base) - (mod (- a (+ (* base hi) lo)) m))) - :hints (("Goal" :in-theory (disable dw-reduce) - :use ((:instance dw-submod-aux1 - (x (+ lo (* base hi))) - (r (dw-reduce hi lo m base))) - (:instance dw-reduce-correct))))) - - -;; ========================================================================= -;; ANSI C arithmetic for uint64_t -;; ========================================================================= - -(defun add (a b) - (mod (+ a b) - (expt 2 64))) - -(defun sub (a b) - (mod (- a b) - (expt 2 64))) - -(defun << (w n) - (mod (* w (expt 2 n)) - (expt 2 64))) - -(defun >> (w n) - (floor w (expt 2 n))) - -;; join upper and lower half of a double word, yielding a 128 bit number -(defun join (hi lo) - (+ (* (expt 2 64) hi) lo)) - - -;; ============================================================================= -;; Fast modular reduction -;; ============================================================================= - -;; These are the three primes used in the Number Theoretic Transform. -;; A fast modular reduction scheme exists for all of them. -(defmacro p1 () - (+ (expt 2 64) (- (expt 2 32)) 1)) - -(defmacro p2 () - (+ (expt 2 64) (- (expt 2 34)) 1)) - -(defmacro p3 () - (+ (expt 2 64) (- (expt 2 40)) 1)) - - -;; reduce the double word number hi*2**64 + lo (mod p1) -(defun simple-mod-reduce-p1 (hi lo) - (+ (* (expt 2 32) hi) (- hi) lo)) - -;; reduce the double word number hi*2**64 + lo (mod p2) -(defun simple-mod-reduce-p2 (hi lo) - (+ (* (expt 2 34) hi) (- hi) lo)) - -;; reduce the double word number hi*2**64 + lo (mod p3) -(defun simple-mod-reduce-p3 (hi lo) - (+ (* (expt 2 40) hi) (- hi) lo)) - - -; ---------------------------------------------------------- -; The modular reductions given above are correct -; ---------------------------------------------------------- - -(defthmd congruence-p1-aux - (equal (* (expt 2 64) hi) - (+ (* (p1) hi) - (* (expt 2 32) hi) - (- hi)))) - -(defthmd congruence-p2-aux - (equal (* (expt 2 64) hi) - (+ (* (p2) hi) - (* (expt 2 34) hi) - (- hi)))) - -(defthmd congruence-p3-aux - (equal (* (expt 2 64) hi) - (+ (* (p3) hi) - (* (expt 2 40) hi) - (- hi)))) - -(defthmd mod-augment - (implies (and (rationalp x) - (rationalp y) - (rationalp m)) - (equal (mod (+ x y) m) - (mod (+ x (mod y m)) m)))) - -(defthmd simple-mod-reduce-p1-congruent - (implies (and (integerp hi) - (integerp lo)) - (equal (mod (simple-mod-reduce-p1 hi lo) (p1)) - (mod (join hi lo) (p1)))) - :hints (("Goal''" :use ((:instance congruence-p1-aux) - (:instance mod-augment - (m (p1)) - (x (+ (- hi) lo (* (expt 2 32) hi))) - (y (* (p1) hi))))))) - -(defthmd simple-mod-reduce-p2-congruent - (implies (and (integerp hi) - (integerp lo)) - (equal (mod (simple-mod-reduce-p2 hi lo) (p2)) - (mod (join hi lo) (p2)))) - :hints (("Goal''" :use ((:instance congruence-p2-aux) - (:instance mod-augment - (m (p2)) - (x (+ (- hi) lo (* (expt 2 34) hi))) - (y (* (p2) hi))))))) - -(defthmd simple-mod-reduce-p3-congruent - (implies (and (integerp hi) - (integerp lo)) - (equal (mod (simple-mod-reduce-p3 hi lo) (p3)) - (mod (join hi lo) (p3)))) - :hints (("Goal''" :use ((:instance congruence-p3-aux) - (:instance mod-augment - (m (p3)) - (x (+ (- hi) lo (* (expt 2 40) hi))) - (y (* (p3) hi))))))) - - -; --------------------------------------------------------------------- -; We need a number less than 2*p, so that we can use the trick from -; elim-mod-m> hi 32)) - (x (sub lo x)) - (hi (if (> x lo) (+ hi -1) hi)) - (y (<< y 32)) - (lo (add y x)) - (hi (if (< lo y) (+ hi 1) hi))) - (+ (* hi (expt 2 64)) lo))) - -(defun mod-reduce-p2 (hi lo) - (let* ((y hi) - (x y) - (hi (>> hi 30)) - (x (sub lo x)) - (hi (if (> x lo) (+ hi -1) hi)) - (y (<< y 34)) - (lo (add y x)) - (hi (if (< lo y) (+ hi 1) hi))) - (+ (* hi (expt 2 64)) lo))) - -(defun mod-reduce-p3 (hi lo) - (let* ((y hi) - (x y) - (hi (>> hi 24)) - (x (sub lo x)) - (hi (if (> x lo) (+ hi -1) hi)) - (y (<< y 40)) - (lo (add y x)) - (hi (if (< lo y) (+ hi 1) hi))) - (+ (* hi (expt 2 64)) lo))) - - -; ------------------------------------------------------------------------- -; The compiler friendly versions are equal to the simple versions -; ------------------------------------------------------------------------- - -(defthm mod-reduce-aux1 - (implies (and (<= 0 a) (natp a) (natp m) - (< (- m) b) (<= b 0) - (integerp b) - (< (mod (+ b a) m) - (mod a m))) - (equal (mod (+ b a) m) - (+ b (mod a m)))) - :hints (("Subgoal 2" :use ((:instance modaux-1b - (x (+ a b))))))) - -(defthm mod-reduce-aux2 - (implies (and (<= 0 a) (natp a) (natp m) - (< b m) (natp b) - (< (mod (+ b a) m) - (mod a m))) - (equal (+ m (mod (+ b a) m)) - (+ b (mod a m))))) - - -(defthm mod-reduce-aux3 - (implies (and (< 0 a) (natp a) (natp m) - (< (- m) b) (< b 0) - (integerp b) - (<= (mod a m) - (mod (+ b a) m))) - (equal (+ (- m) (mod (+ b a) m)) - (+ b (mod a m)))) - :hints (("Subgoal 1.2'" :use ((:instance modaux-1b - (x b)))) - ("Subgoal 1''" :use ((:instance modaux-2d - (x I)))))) - - -(defthm mod-reduce-aux4 - (implies (and (< 0 a) (natp a) (natp m) - (< b m) (natp b) - (<= (mod a m) - (mod (+ b a) m))) - (equal (mod (+ b a) m) - (+ b (mod a m))))) - - -(defthm mod-reduce-p1==simple-mod-reduce-p1 - (implies (and (< hi (expt 2 64)) - (< lo (expt 2 64)) - (natp hi) (natp lo)) - (equal (mod-reduce-p1 hi lo) - (simple-mod-reduce-p1 hi lo))) - :hints (("Goal" :in-theory (disable expt) - :cases ((< 0 hi))) - ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 32) hi))))) - ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 32) hi))))) - ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 32) hi))))) - ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 32) hi))))))) - - -(defthm mod-reduce-p2==simple-mod-reduce-p2 - (implies (and (< hi (expt 2 64)) - (< lo (expt 2 64)) - (natp hi) (natp lo)) - (equal (mod-reduce-p2 hi lo) - (simple-mod-reduce-p2 hi lo))) - :hints (("Goal" :cases ((< 0 hi))) - ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 34) hi))))) - ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 34) hi))))) - ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 34) hi))))) - ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 34) hi))))))) - - -(defthm mod-reduce-p3==simple-mod-reduce-p3 - (implies (and (< hi (expt 2 64)) - (< lo (expt 2 64)) - (natp hi) (natp lo)) - (equal (mod-reduce-p3 hi lo) - (simple-mod-reduce-p3 hi lo))) - :hints (("Goal" :cases ((< 0 hi))) - ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 40) hi))))) - ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 40) hi))))) - ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 40) hi))))) - ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4 - (m (expt 2 64)) - (b (+ (- HI) LO)) - (a (* (expt 2 40) hi))))))) - - - diff --git a/third_party/python/Modules/_decimal/libmpdec/memory.c b/third_party/python/Modules/_decimal/libmpdec/memory.c index a854e0991..51a083105 100644 --- a/third_party/python/Modules/_decimal/libmpdec/memory.c +++ b/third_party/python/Modules/_decimal/libmpdec/memory.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,8 +28,6 @@ #include "mpdecimal.h" -#include -#include #include "typearith.h" #include "mpalloc.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/mpalloc.h b/third_party/python/Modules/_decimal/libmpdec/mpalloc.h index efd711953..3c15e6ad0 100644 --- a/third_party/python/Modules/_decimal/libmpdec/mpalloc.h +++ b/third_party/python/Modules/_decimal/libmpdec/mpalloc.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * diff --git a/third_party/python/Modules/_decimal/libmpdec/mpdecimal.c b/third_party/python/Modules/_decimal/libmpdec/mpdecimal.c index 328ab9224..df6711b81 100644 --- a/third_party/python/Modules/_decimal/libmpdec/mpdecimal.c +++ b/third_party/python/Modules/_decimal/libmpdec/mpdecimal.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,17 +28,13 @@ #include "mpdecimal.h" -#include -#include -#include -#include -#include #include "basearith.h" #include "bits.h" #include "convolute.h" #include "crt.h" #include "mpalloc.h" #include "typearith.h" +#include "libc/math.h" #include "umodarith.h" #ifdef PPRO diff --git a/third_party/python/Modules/_decimal/libmpdec/mpdecimal.h b/third_party/python/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc1..0c3aca70b 100644 --- a/third_party/python/Modules/_decimal/libmpdec/mpdecimal.h +++ b/third_party/python/Modules/_decimal/libmpdec/mpdecimal.h @@ -1,34 +1,11 @@ -/* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - #ifndef MPDECIMAL_H #define MPDECIMAL_H - +#include "libc/fmt/conv.h" +#include "libc/inttypes.h" +#include "libc/limits.h" +#include "libc/stdio/stdio.h" +#include "third_party/python/pyconfig.h" +/* clang-format off */ #ifdef __cplusplus extern "C" { @@ -38,66 +15,31 @@ extern "C" { #endif #endif - -#ifndef _MSC_VER - #include "pyconfig.h" +#ifndef __GNUC_STDC_INLINE__ +#define __GNUC_STDC_INLINE__ 1 #endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER - #include "vccompat.h" - #ifndef UNUSED - #define UNUSED - #endif - #define MPD_PRAGMA(x) - #define MPD_HIDE_SYMBOLS_START - #define MPD_HIDE_SYMBOLS_END - #define EXTINLINE extern inline +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) +#define UNUSED __attribute__((__unused__)) #else - #ifndef __GNUC_STDC_INLINE__ - #define __GNUC_STDC_INLINE__ 1 - #endif - #if defined(__GNUC__) && !defined(__INTEL_COMPILER) - #define UNUSED __attribute__((unused)) - #else - #define UNUSED - #endif - #if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ - defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) - #define MPD_PRAGMA(x) _Pragma(x) - #define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" - #define MPD_HIDE_SYMBOLS_END "GCC visibility pop" - #else - #define MPD_PRAGMA(x) - #define MPD_HIDE_SYMBOLS_START - #define MPD_HIDE_SYMBOLS_END - #endif - #define EXTINLINE +#define UNUSED #endif +#if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ + defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) +#define MPD_PRAGMA(x) _Pragma(x) +#define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" +#define MPD_HIDE_SYMBOLS_END "GCC visibility pop" +#else +#define MPD_PRAGMA(x) +#define MPD_HIDE_SYMBOLS_START +#define MPD_HIDE_SYMBOLS_END +#endif +#define EXTINLINE /* This header file is internal for the purpose of building _decimal.so. * All symbols should have local scope in the DSO. */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) - -#if !defined(LEGACY_COMPILER) - #if !defined(UINT64_MAX) - /* The following #error is just a warning. If the compiler indeed does - * not have uint64_t, it is perfectly safe to comment out the #error. */ - #error "Warning: Compiler without uint64_t. Comment out this line." - #define LEGACY_COMPILER - #endif -#endif - - /******************************************************************************/ /* Version */ /******************************************************************************/ diff --git a/third_party/python/Modules/_decimal/libmpdec/numbertheory.c b/third_party/python/Modules/_decimal/libmpdec/numbertheory.c index 4e035477e..5053c55c0 100644 --- a/third_party/python/Modules/_decimal/libmpdec/numbertheory.c +++ b/third_party/python/Modules/_decimal/libmpdec/numbertheory.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,8 +28,6 @@ #include "mpdecimal.h" -#include -#include #include "bits.h" #include "umodarith.h" #include "numbertheory.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/numbertheory.h b/third_party/python/Modules/_decimal/libmpdec/numbertheory.h index e94c15791..3e6ee9824 100644 --- a/third_party/python/Modules/_decimal/libmpdec/numbertheory.h +++ b/third_party/python/Modules/_decimal/libmpdec/numbertheory.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * diff --git a/third_party/python/Modules/_decimal/libmpdec/sixstep.c b/third_party/python/Modules/_decimal/libmpdec/sixstep.c index 92d513ebe..416801df6 100644 --- a/third_party/python/Modules/_decimal/libmpdec/sixstep.c +++ b/third_party/python/Modules/_decimal/libmpdec/sixstep.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,9 +28,6 @@ #include "mpdecimal.h" -#include -#include -#include #include "bits.h" #include "difradix2.h" #include "numbertheory.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/sixstep.h b/third_party/python/Modules/_decimal/libmpdec/sixstep.h index 4a8b015e3..31ee9b12b 100644 --- a/third_party/python/Modules/_decimal/libmpdec/sixstep.h +++ b/third_party/python/Modules/_decimal/libmpdec/sixstep.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -31,7 +32,6 @@ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ diff --git a/third_party/python/Modules/_decimal/libmpdec/transpose.c b/third_party/python/Modules/_decimal/libmpdec/transpose.c index 55d6d8992..4e88f4b8b 100644 --- a/third_party/python/Modules/_decimal/libmpdec/transpose.c +++ b/third_party/python/Modules/_decimal/libmpdec/transpose.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -27,11 +28,6 @@ #include "mpdecimal.h" -#include -#include -#include -#include -#include #include "bits.h" #include "constants.h" #include "typearith.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/transpose.h b/third_party/python/Modules/_decimal/libmpdec/transpose.h index e1cd1fa17..3817b958c 100644 --- a/third_party/python/Modules/_decimal/libmpdec/transpose.h +++ b/third_party/python/Modules/_decimal/libmpdec/transpose.h @@ -1,38 +1,7 @@ -/* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - #ifndef TRANSPOSE_H #define TRANSPOSE_H - - #include "mpdecimal.h" -#include - +/* clang-format off */ /* Internal header file: all symbols have local scope in the DSO */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) diff --git a/third_party/python/Modules/_decimal/libmpdec/typearith.h b/third_party/python/Modules/_decimal/libmpdec/typearith.h index 405237dac..b1cea626f 100644 --- a/third_party/python/Modules/_decimal/libmpdec/typearith.h +++ b/third_party/python/Modules/_decimal/libmpdec/typearith.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * @@ -30,6 +31,7 @@ #define TYPEARITH_H +#include "libc/assert.h" #include "mpdecimal.h" diff --git a/third_party/python/Modules/_decimal/libmpdec/umodarith.h b/third_party/python/Modules/_decimal/libmpdec/umodarith.h index 68d15188c..5df665cc2 100644 --- a/third_party/python/Modules/_decimal/libmpdec/umodarith.h +++ b/third_party/python/Modules/_decimal/libmpdec/umodarith.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * diff --git a/third_party/python/Modules/_decimal/libmpdec/vccompat.h b/third_party/python/Modules/_decimal/libmpdec/vccompat.h index dd131d8da..2653b5a68 100644 --- a/third_party/python/Modules/_decimal/libmpdec/vccompat.h +++ b/third_party/python/Modules/_decimal/libmpdec/vccompat.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. * diff --git a/third_party/python/Modules/_decimal/libmpdec/vcstdint.h b/third_party/python/Modules/_decimal/libmpdec/vcstdint.h index 17dcad454..a7e8d9295 100644 --- a/third_party/python/Modules/_decimal/libmpdec/vcstdint.h +++ b/third_party/python/Modules/_decimal/libmpdec/vcstdint.h @@ -1,3 +1,4 @@ +/* clang-format off */ // ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // diff --git a/third_party/python/Modules/_elementtree.c b/third_party/python/Modules/_elementtree.c index 30e382dd6..f38eafa64 100644 --- a/third_party/python/Modules/_elementtree.c +++ b/third_party/python/Modules/_elementtree.c @@ -1,3 +1,4 @@ +/* clang-format off */ /*-------------------------------------------------------------------- * Licensed to PSF under a Contributor Agreement. * See http://www.python.org/psf/license for licensing details. @@ -13,8 +14,8 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* -------------------------------------------------------------------- */ /* configuration */ @@ -2743,8 +2744,8 @@ _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag, /* ==================================================================== */ /* the expat interface */ -#include "expat.h" -#include "pyexpat.h" +#include "third_party/python/Modules/expat/expat.h" +#include "third_party/python/Include/pyexpat.h" /* The PyExpat_CAPI structure is an immutable dispatch table, so it can be * cached globally without being in per-module state. @@ -3759,7 +3760,7 @@ xmlparser_getattro(XMLParserObject* self, PyObject* nameobj) return PyObject_GenericGetAttr((PyObject*) self, nameobj); } -#include "clinic/_elementtree.c.h" +#include "third_party/python/Modules/clinic/_elementtree.inc" static PyMethodDef element_methods[] = { diff --git a/third_party/python/Modules/_functoolsmodule.c b/third_party/python/Modules/_functoolsmodule.c index 5622e2a6c..64a7d678a 100644 --- a/third_party/python/Modules/_functoolsmodule.c +++ b/third_party/python/Modules/_functoolsmodule.c @@ -1,6 +1,7 @@ +/* clang-format off */ -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* _functools module written and maintained by Hye-Shik Chang diff --git a/third_party/python/Modules/_gdbmmodule.c b/third_party/python/Modules/_gdbmmodule.c index a6ce35246..f1611794c 100644 --- a/third_party/python/Modules/_gdbmmodule.c +++ b/third_party/python/Modules/_gdbmmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* DBM module using dictionary interface */ /* Author: Anthony Baxter, after dbmmodule.c */ @@ -42,7 +43,7 @@ typedef struct { static PyTypeObject Dbmtype; -#include "clinic/_gdbmmodule.c.h" +#include "third_party/python/Modules/clinic/_gdbmmodule.inc" #define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype) #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \ diff --git a/third_party/python/Modules/_hashopenssl.c b/third_party/python/Modules/_hashopenssl.c index 84edd72c8..b31a9d243 100644 --- a/third_party/python/Modules/_hashopenssl.c +++ b/third_party/python/Modules/_hashopenssl.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Module that wraps all OpenSSL hash algorithms */ /* @@ -25,7 +26,7 @@ #include #include "openssl/err.h" -#include "clinic/_hashopenssl.c.h" +#include "third_party/python/Modules/clinic/_hashopenssl.inc" /*[clinic input] module _hashlib [clinic start generated code]*/ diff --git a/third_party/python/Modules/_heapqmodule.c b/third_party/python/Modules/_heapqmodule.c index 0fb35ffe5..a3695c525 100644 --- a/third_party/python/Modules/_heapqmodule.c +++ b/third_party/python/Modules/_heapqmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Drop in replacement for heapq.py C implementation derived directly from heapq.py in Py2.3 @@ -6,7 +7,7 @@ annotated by François Pinard, and converted to C by Raymond Hettinger. */ -#include "Python.h" +#include "third_party/python/Include/Python.h" static int siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) diff --git a/third_party/python/Modules/_io/_iomodule.c b/third_party/python/Modules/_io/_iomodule.c index f4d3cbd49..78b0a4bef 100644 --- a/third_party/python/Modules/_io/_iomodule.c +++ b/third_party/python/Modules/_io/_iomodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* An implementation of the new I/O lib as defined by PEP 3116 - "New I/O" @@ -8,21 +9,9 @@ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "_iomodule.h" - -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ - -#ifdef HAVE_SYS_STAT_H -#include -#endif /* HAVE_SYS_STAT_H */ - -#ifdef MS_WINDOWS -#include -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/_io/_iomodule.h" /* Various interned strings */ @@ -638,7 +627,7 @@ iomodule_free(PyObject *mod) { * Module definition */ -#include "clinic/_iomodule.c.h" +#include "third_party/python/Modules/_io/clinic/_iomodule.inc" static PyMethodDef module_methods[] = { _IO_OPEN_METHODDEF diff --git a/third_party/python/Modules/_io/_iomodule.h b/third_party/python/Modules/_io/_iomodule.h index daaebd2ab..a81de0a6d 100644 --- a/third_party/python/Modules/_io/_iomodule.h +++ b/third_party/python/Modules/_io/_iomodule.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Declarations shared between the different parts of the io module */ diff --git a/third_party/python/Modules/_io/bufferedio.c b/third_party/python/Modules/_io/bufferedio.c index 3e4630988..d918630a8 100644 --- a/third_party/python/Modules/_io/bufferedio.c +++ b/third_party/python/Modules/_io/bufferedio.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* An implementation of Buffered I/O as defined by PEP 3116 - "New I/O" @@ -8,10 +9,10 @@ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "pythread.h" -#include "_iomodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/pythread.h" +#include "third_party/python/Modules/_io/_iomodule.h" /*[clinic input] module _io @@ -2342,7 +2343,7 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw, return 0; } -#include "clinic/bufferedio.c.h" +#include "third_party/python/Modules/_io/clinic/bufferedio.inc" static PyMethodDef bufferediobase_methods[] = { diff --git a/third_party/python/Modules/_io/bytesio.c b/third_party/python/Modules/_io/bytesio.c index d5884fa53..c48fd06ca 100644 --- a/third_party/python/Modules/_io/bytesio.c +++ b/third_party/python/Modules/_io/bytesio.c @@ -1,6 +1,7 @@ -#include "Python.h" -#include "structmember.h" /* for offsetof() */ -#include "_iomodule.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/_io/_iomodule.h" /*[clinic input] module _io @@ -1009,7 +1010,7 @@ bytesio_clear(bytesio *self) } -#include "clinic/bytesio.c.h" +#include "third_party/python/Modules/_io/clinic/bytesio.inc" static PyGetSetDef bytesio_getsetlist[] = { {"closed", (getter)bytesio_get_closed, NULL, diff --git a/third_party/python/Modules/_io/clinic/_iomodule.c.h b/third_party/python/Modules/_io/clinic/_iomodule.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/_iomodule.c.h rename to third_party/python/Modules/_io/clinic/_iomodule.inc diff --git a/third_party/python/Modules/_io/clinic/bufferedio.c.h b/third_party/python/Modules/_io/clinic/bufferedio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/bufferedio.c.h rename to third_party/python/Modules/_io/clinic/bufferedio.inc diff --git a/third_party/python/Modules/_io/clinic/bytesio.c.h b/third_party/python/Modules/_io/clinic/bytesio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/bytesio.c.h rename to third_party/python/Modules/_io/clinic/bytesio.inc diff --git a/third_party/python/Modules/_io/clinic/fileio.c.h b/third_party/python/Modules/_io/clinic/fileio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/fileio.c.h rename to third_party/python/Modules/_io/clinic/fileio.inc diff --git a/third_party/python/Modules/_io/clinic/iobase.c.h b/third_party/python/Modules/_io/clinic/iobase.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/iobase.c.h rename to third_party/python/Modules/_io/clinic/iobase.inc diff --git a/third_party/python/Modules/_io/clinic/stringio.c.h b/third_party/python/Modules/_io/clinic/stringio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/stringio.c.h rename to third_party/python/Modules/_io/clinic/stringio.inc diff --git a/third_party/python/Modules/_io/clinic/textio.c.h b/third_party/python/Modules/_io/clinic/textio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/textio.c.h rename to third_party/python/Modules/_io/clinic/textio.inc diff --git a/third_party/python/Modules/_io/clinic/winconsoleio.c.h b/third_party/python/Modules/_io/clinic/winconsoleio.inc similarity index 100% rename from third_party/python/Modules/_io/clinic/winconsoleio.c.h rename to third_party/python/Modules/_io/clinic/winconsoleio.inc diff --git a/third_party/python/Modules/_io/fileio.c b/third_party/python/Modules/_io/fileio.c index e01455288..fa069681a 100644 --- a/third_party/python/Modules/_io/fileio.c +++ b/third_party/python/Modules/_io/fileio.c @@ -1,22 +1,10 @@ +/* clang-format off */ /* Author: Daniel Stutzbach */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#include /* For offsetof */ -#include "_iomodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/_io/_iomodule.h" /* * Known likely problems: @@ -1131,7 +1119,7 @@ fileio_getstate(fileio *self) return NULL; } -#include "clinic/fileio.c.h" +#include "third_party/python/Modules/_io/clinic/fileio.inc" static PyMethodDef fileio_methods[] = { _IO_FILEIO_READ_METHODDEF diff --git a/third_party/python/Modules/_io/iobase.c b/third_party/python/Modules/_io/iobase.c index f5c82c140..08dfb2890 100644 --- a/third_party/python/Modules/_io/iobase.c +++ b/third_party/python/Modules/_io/iobase.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* An implementation of the I/O abstract base classes hierarchy as defined by PEP 3116 - "New I/O" @@ -9,9 +10,9 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "_iomodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/_io/_iomodule.h" /*[clinic input] module _io @@ -758,7 +759,7 @@ _io__IOBase_writelines(PyObject *self, PyObject *lines) Py_RETURN_NONE; } -#include "clinic/iobase.c.h" +#include "third_party/python/Modules/_io/clinic/iobase.inc" static PyMethodDef iobase_methods[] = { {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc}, diff --git a/third_party/python/Modules/_io/stringio.c b/third_party/python/Modules/_io/stringio.c index bf4f892b4..3e8d65ee3 100644 --- a/third_party/python/Modules/_io/stringio.c +++ b/third_party/python/Modules/_io/stringio.c @@ -1,8 +1,9 @@ +/* clang-format off */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "accu.h" -#include "_iomodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/accu.h" +#include "third_party/python/Modules/_io/_iomodule.h" /* Implementation note: the buffer is always at least one character longer than the enclosed string, for proper functioning of _PyIO_find_line_ending. @@ -1010,7 +1011,7 @@ stringio_newlines(stringio *self, void *context) return PyObject_GetAttr(self->decoder, _PyIO_str_newlines); } -#include "clinic/stringio.c.h" +#include "third_party/python/Modules/_io/clinic/stringio.inc" static struct PyMethodDef stringio_methods[] = { _IO_STRINGIO_CLOSE_METHODDEF diff --git a/third_party/python/Modules/_io/textio.c b/third_party/python/Modules/_io/textio.c index ebc3c04d6..44579c672 100644 --- a/third_party/python/Modules/_io/textio.c +++ b/third_party/python/Modules/_io/textio.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* An implementation of Text I/O as defined by PEP 3116 - "New I/O" @@ -7,9 +8,9 @@ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "_iomodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/_io/_iomodule.h" /*[clinic input] module _io @@ -2829,7 +2830,7 @@ textiowrapper_chunk_size_set(textio *self, PyObject *arg, void *context) return 0; } -#include "clinic/textio.c.h" +#include "third_party/python/Modules/_io/clinic/textio.inc" static PyMethodDef incrementalnewlinedecoder_methods[] = { _IO_INCREMENTALNEWLINEDECODER_DECODE_METHODDEF diff --git a/third_party/python/Modules/_io/winconsoleio.c b/third_party/python/Modules/_io/winconsoleio.c index 2f36806ef..9c044d79b 100644 --- a/third_party/python/Modules/_io/winconsoleio.c +++ b/third_party/python/Modules/_io/winconsoleio.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* An implementation of Windows console I/O @@ -8,23 +9,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" - -#ifdef MS_WINDOWS - -#include "structmember.h" -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#include /* For offsetof */ - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include "_iomodule.h" +#include "third_party/python/Modules/_io/_iomodule.h" /* BUFSIZ determines how many characters can be typed at the console before it starts blocking. */ diff --git a/third_party/python/Modules/_json.c b/third_party/python/Modules/_json.c index dad6b01f8..328d5140c 100644 --- a/third_party/python/Modules/_json.c +++ b/third_party/python/Modules/_json.c @@ -1,6 +1,7 @@ -#include "Python.h" -#include "structmember.h" -#include "accu.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/accu.h" #ifdef __GNUC__ #define UNUSED __attribute__((__unused__)) diff --git a/third_party/python/Modules/_localemodule.c b/third_party/python/Modules/_localemodule.c index 27704c530..6a3812768 100644 --- a/third_party/python/Modules/_localemodule.c +++ b/third_party/python/Modules/_localemodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /*********************************************************** Copyright (C) 1997, 2002, 2003, 2007, 2008 Martin von Loewis @@ -10,33 +11,8 @@ This software comes with no warranty. Use at your own risk. ******************************************************************/ #define PY_SSIZE_T_CLEAN -#include "Python.h" - -#include +#include "third_party/python/Include/Python.h" #include "libc/unicode/locale.h" -#include -#include - -#ifdef HAVE_ERRNO_H -#include -#endif - -#ifdef HAVE_LANGINFO_H -#include -#endif - -#ifdef HAVE_LIBINTL_H -#include -#endif - -#ifdef HAVE_WCHAR_H -#include -#endif - -#if defined(MS_WINDOWS) -#define WIN32_LEAN_AND_MEAN -#include -#endif PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); diff --git a/third_party/python/Modules/_lsprof.c b/third_party/python/Modules/_lsprof.c index e3e74b526..09fa16ec5 100644 --- a/third_party/python/Modules/_lsprof.c +++ b/third_party/python/Modules/_lsprof.c @@ -1,13 +1,15 @@ -#include "Python.h" -#include "frameobject.h" -#include "rotatingtree.h" +#include "libc/time/struct/tm.h" +#include "libc/time/time.h" +/* clang-format off */ + +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Modules/rotatingtree.h" /*** Selection of a high-precision timer ***/ #ifdef MS_WINDOWS -#include - static long long hpTimer(void) { @@ -28,14 +30,6 @@ hpTimerUnit(void) #else /* !MS_WINDOWS */ -#ifndef HAVE_GETTIMEOFDAY -#error "This module requires gettimeofday() on non-Windows platforms!" -#endif - -#include -#include "libc/time/time.h" -#include "libc/time/struct/tm.h" - static long long hpTimer(void) { diff --git a/third_party/python/Modules/_lzmamodule.c b/third_party/python/Modules/_lzmamodule.c index 3d3645af9..8d56c6421 100644 --- a/third_party/python/Modules/_lzmamodule.c +++ b/third_party/python/Modules/_lzmamodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* _lzma - Low-level Python interface to liblzma. Initial implementation by Per Øyvind Karlsen. @@ -478,7 +479,7 @@ class _lzma.LZMADecompressor "Decompressor *" "&Decompressor_type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=2c14bbe05ff0c147]*/ -#include "clinic/_lzmamodule.c.h" +#include "third_party/python/Modules/clinic/_lzmamodule.inc" /*[python input] diff --git a/third_party/python/Modules/_math.c b/third_party/python/Modules/_math.c index a00220829..c318c61fe 100644 --- a/third_party/python/Modules/_math.c +++ b/third_party/python/Modules/_math.c @@ -1,9 +1,9 @@ +/* clang-format off */ /* Definitions of some C99 math library functions, for those platforms that don't implement these functions already. */ -#include "Python.h" -#include -#include "_math.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/_math.h" /* The following copyright notice applies to the original implementations of acosh, asinh and atanh. */ diff --git a/third_party/python/Modules/_math.h b/third_party/python/Modules/_math.h index cf079ad77..58f3b6520 100644 --- a/third_party/python/Modules/_math.h +++ b/third_party/python/Modules/_math.h @@ -1,3 +1,8 @@ +#ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__MATH_H_ +#define COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__MATH_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + double _Py_acosh(double x); double _Py_asinh(double x); double _Py_atanh(double x); @@ -39,3 +44,7 @@ double _Py_log1p(double x); /* Use the substitute from _math.c on all platforms: it includes workarounds for buggy handling of zeros. */ #define m_log1p _Py_log1p + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__MATH_H_ */ diff --git a/third_party/python/Modules/_multiprocessing/multiprocessing.c b/third_party/python/Modules/_multiprocessing/multiprocessing.c index d92a8bf21..90b8e8c3f 100644 --- a/third_party/python/Modules/_multiprocessing/multiprocessing.c +++ b/third_party/python/Modules/_multiprocessing/multiprocessing.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Extension module used by multiprocessing package * diff --git a/third_party/python/Modules/_multiprocessing/multiprocessing.h b/third_party/python/Modules/_multiprocessing/multiprocessing.h index 512bc17f2..407005985 100644 --- a/third_party/python/Modules/_multiprocessing/multiprocessing.h +++ b/third_party/python/Modules/_multiprocessing/multiprocessing.h @@ -1,5 +1,6 @@ #ifndef MULTIPROCESSING_H #define MULTIPROCESSING_H +/* clang-format off */ #define PY_SSIZE_T_CLEAN diff --git a/third_party/python/Modules/_opcode.c b/third_party/python/Modules/_opcode.c index f9c1c0108..cf153f13e 100644 --- a/third_party/python/Modules/_opcode.c +++ b/third_party/python/Modules/_opcode.c @@ -1,12 +1,13 @@ -#include "Python.h" -#include "opcode.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/opcode.h" /*[clinic input] module _opcode [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=117442e66eb376e6]*/ -#include "clinic/_opcode.c.h" +#include "third_party/python/Modules/clinic/_opcode.inc" /*[clinic input] diff --git a/third_party/python/Modules/_operator.c b/third_party/python/Modules/_operator.c index 25654440d..3207175a2 100644 --- a/third_party/python/Modules/_operator.c +++ b/third_party/python/Modules/_operator.c @@ -1,5 +1,6 @@ +/* clang-format off */ -#include "Python.h" +#include "third_party/python/Include/Python.h" PyDoc_STRVAR(operator_doc, "Operator interface.\n\ diff --git a/third_party/python/Modules/_pickle.c b/third_party/python/Modules/_pickle.c index bcf98e2f5..0daa343fc 100644 --- a/third_party/python/Modules/_pickle.c +++ b/third_party/python/Modules/_pickle.c @@ -1,5 +1,6 @@ -#include "Python.h" -#include "structmember.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" PyDoc_STRVAR(pickle_module_doc, "Optimized C implementation for the Python pickle module."); @@ -689,7 +690,7 @@ static int save_reduce(PicklerObject *, PyObject *, PyObject *); static PyTypeObject Pickler_Type; static PyTypeObject Unpickler_Type; -#include "clinic/_pickle.c.h" +#include "third_party/python/Modules/clinic/_pickle.inc" /************************************************************************* A custom hashtable mapping void* to Python ints. This is used by the pickler diff --git a/third_party/python/Modules/_posixsubprocess.c b/third_party/python/Modules/_posixsubprocess.c index c0bb5f53c..2763f61c9 100644 --- a/third_party/python/Modules/_posixsubprocess.c +++ b/third_party/python/Modules/_posixsubprocess.c @@ -1,51 +1,9 @@ +/* clang-format off */ /* Authors: Gregory P. Smith & Jeffrey Yasskin */ -#include "Python.h" -#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE) -# define _GNU_SOURCE -#endif -#include -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#if defined(HAVE_SYS_STAT_H) && defined(__FreeBSD__) -#include -#endif -#ifdef HAVE_SYS_SYSCALL_H -#include "libc/calls/calls.h" -#endif -#if defined(HAVE_SYS_RESOURCE_H) -#include -#endif -#ifdef HAVE_DIRENT_H -#include -#endif +#include "libc/dce.h" +#include "third_party/python/Include/Python.h" -#ifdef _Py_MEMORY_SANITIZER -# include -#endif - -#if defined(__ANDROID__) && __ANDROID_API__ < 21 && !defined(SYS_getdents64) -# include -# define SYS_getdents64 __NR_getdents64 -#endif - -#if defined(sun) -/* readdir64 is used to work around Solaris 9 bug 6395699. */ -# define readdir readdir64 -# define dirent dirent64 -# if !defined(HAVE_DIRFD) -/* Some versions of Solaris lack dirfd(). */ -# define dirfd(dirp) ((dirp)->dd_fd) -# define HAVE_DIRFD -# endif -#endif - -#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) -# define FD_DIR "/dev/fd" -#else -# define FD_DIR "/proc/self/fd" -#endif +# define FD_DIR (IsBsd() ? "/dev/fd" : "/proc/self/fd") #define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0) diff --git a/third_party/python/Modules/_randommodule.c b/third_party/python/Modules/_randommodule.c index 769084fa8..71f0605b9 100644 --- a/third_party/python/Modules/_randommodule.c +++ b/third_party/python/Modules/_randommodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Random objects */ /* ------------------------------------------------------------------ @@ -66,11 +67,7 @@ /* ---------------------------------------------------------------*/ -#include "Python.h" -#include /* for seeding to current time */ -#ifdef HAVE_PROCESS_H -# include /* needed for getpid() */ -#endif +#include "third_party/python/Include/Python.h" /* Period parameters -- These are all magic. Don't change. */ #define N 624 diff --git a/third_party/python/Modules/_scproxy.c b/third_party/python/Modules/_scproxy.c deleted file mode 100644 index e37515ee6..000000000 --- a/third_party/python/Modules/_scproxy.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Helper method for urllib to fetch the proxy configuration settings - * using the SystemConfiguration framework. - */ -#include -#include - -static int32_t -cfnum_to_int32(CFNumberRef num) -{ - int32_t result; - - CFNumberGetValue(num, kCFNumberSInt32Type, &result); - return result; -} - -static PyObject* -cfstring_to_pystring(CFStringRef ref) -{ - const char* s; - - s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8); - if (s) { - return PyUnicode_DecodeUTF8( - s, strlen(s), NULL); - - } else { - CFIndex len = CFStringGetLength(ref); - Boolean ok; - PyObject* result; - char* buf; - - buf = PyMem_Malloc(len*4); - if (buf == NULL) { - PyErr_NoMemory(); - return NULL; - } - - ok = CFStringGetCString(ref, - buf, len * 4, - kCFStringEncodingUTF8); - if (!ok) { - PyMem_Free(buf); - return NULL; - } else { - result = PyUnicode_DecodeUTF8( - buf, strlen(buf), NULL); - PyMem_Free(buf); - } - return result; - } -} - - -static PyObject* -get_proxy_settings(PyObject* mod __attribute__((__unused__))) -{ - CFDictionaryRef proxyDict = NULL; - CFNumberRef aNum = NULL; - CFArrayRef anArray = NULL; - PyObject* result = NULL; - PyObject* v; - int r; - - Py_BEGIN_ALLOW_THREADS - proxyDict = SCDynamicStoreCopyProxies(NULL); - Py_END_ALLOW_THREADS - - if (!proxyDict) { - Py_INCREF(Py_None); - return Py_None; - } - - result = PyDict_New(); - if (result == NULL) goto error; - - aNum = CFDictionaryGetValue(proxyDict, - kSCPropNetProxiesExcludeSimpleHostnames); - if (aNum == NULL) { - v = PyBool_FromLong(0); - } else { - v = PyBool_FromLong(cfnum_to_int32(aNum)); - } - - if (v == NULL) goto error; - - r = PyDict_SetItemString(result, "exclude_simple", v); - Py_DECREF(v); v = NULL; - if (r == -1) goto error; - - anArray = CFDictionaryGetValue(proxyDict, - kSCPropNetProxiesExceptionsList); - if (anArray != NULL) { - CFIndex len = CFArrayGetCount(anArray); - CFIndex i; - v = PyTuple_New(len); - if (v == NULL) goto error; - - r = PyDict_SetItemString(result, "exceptions", v); - Py_DECREF(v); - if (r == -1) goto error; - - for (i = 0; i < len; i++) { - CFStringRef aString = NULL; - - aString = CFArrayGetValueAtIndex(anArray, i); - if (aString == NULL) { - PyTuple_SetItem(v, i, Py_None); - Py_INCREF(Py_None); - } else { - PyObject* t = cfstring_to_pystring(aString); - if (!t) { - PyTuple_SetItem(v, i, Py_None); - Py_INCREF(Py_None); - } else { - PyTuple_SetItem(v, i, t); - } - } - } - } - - CFRelease(proxyDict); - return result; - -error: - if (proxyDict) CFRelease(proxyDict); - Py_XDECREF(result); - return NULL; -} - -static int -set_proxy(PyObject* proxies, const char* proto, CFDictionaryRef proxyDict, - CFStringRef enabledKey, - CFStringRef hostKey, CFStringRef portKey) -{ - CFNumberRef aNum; - - aNum = CFDictionaryGetValue(proxyDict, enabledKey); - if (aNum && cfnum_to_int32(aNum)) { - CFStringRef hostString; - - hostString = CFDictionaryGetValue(proxyDict, hostKey); - aNum = CFDictionaryGetValue(proxyDict, portKey); - - if (hostString) { - int r; - PyObject* h = cfstring_to_pystring(hostString); - PyObject* v; - if (h) { - if (aNum) { - int32_t port = cfnum_to_int32(aNum); - v = PyUnicode_FromFormat("http://%U:%ld", - h, (long)port); - } else { - v = PyUnicode_FromFormat("http://%U", h); - } - Py_DECREF(h); - if (!v) return -1; - r = PyDict_SetItemString(proxies, proto, - v); - Py_DECREF(v); - return r; - } - } - - } - return 0; -} - - - -static PyObject* -get_proxies(PyObject* mod __attribute__((__unused__))) -{ - PyObject* result = NULL; - int r; - CFDictionaryRef proxyDict = NULL; - - Py_BEGIN_ALLOW_THREADS - proxyDict = SCDynamicStoreCopyProxies(NULL); - Py_END_ALLOW_THREADS - - if (proxyDict == NULL) { - return PyDict_New(); - } - - result = PyDict_New(); - if (result == NULL) goto error; - - r = set_proxy(result, "http", proxyDict, - kSCPropNetProxiesHTTPEnable, - kSCPropNetProxiesHTTPProxy, - kSCPropNetProxiesHTTPPort); - if (r == -1) goto error; - r = set_proxy(result, "https", proxyDict, - kSCPropNetProxiesHTTPSEnable, - kSCPropNetProxiesHTTPSProxy, - kSCPropNetProxiesHTTPSPort); - if (r == -1) goto error; - r = set_proxy(result, "ftp", proxyDict, - kSCPropNetProxiesFTPEnable, - kSCPropNetProxiesFTPProxy, - kSCPropNetProxiesFTPPort); - if (r == -1) goto error; - r = set_proxy(result, "gopher", proxyDict, - kSCPropNetProxiesGopherEnable, - kSCPropNetProxiesGopherProxy, - kSCPropNetProxiesGopherPort); - if (r == -1) goto error; - - CFRelease(proxyDict); - return result; -error: - if (proxyDict) CFRelease(proxyDict); - Py_XDECREF(result); - return NULL; -} - -static PyMethodDef mod_methods[] = { - { - "_get_proxy_settings", - (PyCFunction)get_proxy_settings, - METH_NOARGS, - NULL, - }, - { - "_get_proxies", - (PyCFunction)get_proxies, - METH_NOARGS, - NULL, - }, - { 0, 0, 0, 0 } -}; - - - -static struct PyModuleDef mod_module = { - PyModuleDef_HEAD_INIT, - "_scproxy", - NULL, - -1, - mod_methods, - NULL, - NULL, - NULL, - NULL -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -PyMODINIT_FUNC -PyInit__scproxy(void) -{ - return PyModule_Create(&mod_module); -} - -#ifdef __cplusplus -} -#endif - diff --git a/third_party/python/Modules/_sha3/clinic/sha3module.c.h b/third_party/python/Modules/_sha3/clinic/sha3module.c.h index 35f11abca..935f2e284 100644 --- a/third_party/python/Modules/_sha3/clinic/sha3module.c.h +++ b/third_party/python/Modules/_sha3/clinic/sha3module.c.h @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/_sha3/kcp/KeccakHash.c b/third_party/python/Modules/_sha3/kcp/KeccakHash.c index e09fb43ca..40419ab98 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakHash.c +++ b/third_party/python/Modules/_sha3/kcp/KeccakHash.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby @@ -13,7 +14,6 @@ and related or neighboring rights to the source code in this file. http://creativecommons.org/publicdomain/zero/1.0/ */ -#include #include "KeccakHash.h" /* ---------------------------------------------------------------- */ diff --git a/third_party/python/Modules/_sha3/kcp/KeccakHash.h b/third_party/python/Modules/_sha3/kcp/KeccakHash.h index bbd3dc64a..c03504abf 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakHash.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakHash.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby @@ -19,7 +20,6 @@ http://creativecommons.org/publicdomain/zero/1.0/ #ifndef KeccakP1600_excluded #include "KeccakSponge.h" -#include typedef unsigned char BitSequence; typedef size_t DataLength; diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h index 6cf765e6c..59b740324 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h index 889a31a79..d2e69983f 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby @@ -27,8 +28,6 @@ http://creativecommons.org/publicdomain/zero/1.0/ #define KeccakP1600_stateAlignment 8 #define KeccakF1600_FastLoop_supported -#include - #define KeccakP1600_StaticInitialize() void KeccakP1600_Initialize(void *state); #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN) diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP.h b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP.h index 0b23f09a6..c63a1e022 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-SnP.h @@ -1,3 +1,4 @@ +/* clang-format off */ #if KeccakOpt == 64 #include "KeccakP-1600-SnP-opt64.h" #elif KeccakOpt == 32 diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c index a2f9ffea9..674c571be 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64-config.h b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64-config.h index 9501c64b1..ca76c5afb 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64-config.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64-config.h @@ -1,3 +1,4 @@ +/* clang-format off */ #define KeccakP1600_implementation_config "lane complementing, all rounds unrolled" #define KeccakP1600_fullUnrolling #define KeccakP1600_useLaneComplementing diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64.c b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64.c index c90010dd9..e499ba00f 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64.c +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-opt64.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby @@ -13,8 +14,6 @@ and related or neighboring rights to the source code in this file. http://creativecommons.org/publicdomain/zero/1.0/ */ -#include -#include /* #include "brg_endian.h" */ #include "KeccakP-1600-opt64-config.h" diff --git a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-unrolling.macros b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-unrolling.macros index 405ce2972..c20683015 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakP-1600-unrolling.macros +++ b/third_party/python/Modules/_sha3/kcp/KeccakP-1600-unrolling.macros @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/KeccakSponge.c b/third_party/python/Modules/_sha3/kcp/KeccakSponge.c index afdb73172..74dbd4284 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakSponge.c +++ b/third_party/python/Modules/_sha3/kcp/KeccakSponge.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/KeccakSponge.h b/third_party/python/Modules/_sha3/kcp/KeccakSponge.h index 0f4badcac..34ad62ead 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakSponge.h +++ b/third_party/python/Modules/_sha3/kcp/KeccakSponge.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby @@ -127,7 +128,6 @@ int Prefix_SpongeAbsorbLastFewBits(Prefix_SpongeInstance *spongeInstance, unsign int Prefix_SpongeSqueeze(Prefix_SpongeInstance *spongeInstance, unsigned char *data, size_t dataByteLen); #endif -#include #include "align.h" #define KCP_DeclareSpongeStructure(prefix, size, alignment) \ diff --git a/third_party/python/Modules/_sha3/kcp/KeccakSponge.inc b/third_party/python/Modules/_sha3/kcp/KeccakSponge.inc index e10739dea..54767bd33 100644 --- a/third_party/python/Modules/_sha3/kcp/KeccakSponge.inc +++ b/third_party/python/Modules/_sha3/kcp/KeccakSponge.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/PlSnP-Fallback.inc b/third_party/python/Modules/_sha3/kcp/PlSnP-Fallback.inc index 3a9119ab4..befabda25 100644 --- a/third_party/python/Modules/_sha3/kcp/PlSnP-Fallback.inc +++ b/third_party/python/Modules/_sha3/kcp/PlSnP-Fallback.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/SnP-Relaned.h b/third_party/python/Modules/_sha3/kcp/SnP-Relaned.h index 086e635ff..4b5226b8d 100644 --- a/third_party/python/Modules/_sha3/kcp/SnP-Relaned.h +++ b/third_party/python/Modules/_sha3/kcp/SnP-Relaned.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/kcp/align.h b/third_party/python/Modules/_sha3/kcp/align.h index 6650fe8c3..d57bec8a6 100644 --- a/third_party/python/Modules/_sha3/kcp/align.h +++ b/third_party/python/Modules/_sha3/kcp/align.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby diff --git a/third_party/python/Modules/_sha3/sha3module.c b/third_party/python/Modules/_sha3/sha3module.c index 2c2b2dbc5..583ba397e 100644 --- a/third_party/python/Modules/_sha3/sha3module.c +++ b/third_party/python/Modules/_sha3/sha3module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* SHA3 module * * This module provides an interface to the SHA3 algorithm @@ -15,9 +16,9 @@ * */ -#include "Python.h" -#include "pystrhex.h" -#include "../hashlib.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pystrhex.h" /* ************************************************************************** * SHA-3 (Keccak) and SHAKE @@ -34,29 +35,29 @@ * *************************************************************************/ #ifdef __sparc - /* opt64 uses un-aligned memory access that causes a BUS error with msg - * 'invalid address alignment' on SPARC. */ - #define KeccakOpt 32 +/* opt64 uses un-aligned memory access that causes a BUS error with msg + * 'invalid address alignment' on SPARC. */ +#define KeccakOpt 32 #elif PY_BIG_ENDIAN - /* opt64 is not yet supported on big endian platforms */ - #define KeccakOpt 32 +/* opt64 is not yet supported on big endian platforms */ +#define KeccakOpt 32 #elif SIZEOF_VOID_P == 8 && defined(PY_UINT64_T) - /* opt64 works only on little-endian 64bit platforms with unsigned int64 */ - #define KeccakOpt 64 +/* opt64 works only on little-endian 64bit platforms with unsigned int64 */ +#define KeccakOpt 64 #else - /* opt32 is used for the remaining 32 and 64bit platforms */ - #define KeccakOpt 32 +/* opt32 is used for the remaining 32 and 64bit platforms */ +#define KeccakOpt 32 #endif #if KeccakOpt == 64 && defined(PY_UINT64_T) - /* 64bit platforms with unsigned int64 */ - typedef PY_UINT64_T UINT64; - typedef unsigned char UINT8; +/* 64bit platforms with unsigned int64 */ +typedef PY_UINT64_T UINT64; +typedef unsigned char UINT8; #endif /* replacement for brg_endian.h */ #define IS_LITTLE_ENDIAN 1234 -#define IS_BIG_ENDIAN 4321 +#define IS_BIG_ENDIAN 4321 #if PY_LITTLE_ENDIAN #define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN #endif @@ -65,36 +66,41 @@ #endif /* mangle names */ -#define KeccakF1600_FastLoop_Absorb _PySHA3_KeccakF1600_FastLoop_Absorb -#define Keccak_HashFinal _PySHA3_Keccak_HashFinal -#define Keccak_HashInitialize _PySHA3_Keccak_HashInitialize -#define Keccak_HashSqueeze _PySHA3_Keccak_HashSqueeze -#define Keccak_HashUpdate _PySHA3_Keccak_HashUpdate -#define KeccakP1600_AddBytes _PySHA3_KeccakP1600_AddBytes -#define KeccakP1600_AddBytesInLane _PySHA3_KeccakP1600_AddBytesInLane -#define KeccakP1600_AddLanes _PySHA3_KeccakP1600_AddLanes +#define KeccakF1600_FastLoop_Absorb _PySHA3_KeccakF1600_FastLoop_Absorb +#define Keccak_HashFinal _PySHA3_Keccak_HashFinal +#define Keccak_HashInitialize _PySHA3_Keccak_HashInitialize +#define Keccak_HashSqueeze _PySHA3_Keccak_HashSqueeze +#define Keccak_HashUpdate _PySHA3_Keccak_HashUpdate +#define KeccakP1600_AddBytes _PySHA3_KeccakP1600_AddBytes +#define KeccakP1600_AddBytesInLane _PySHA3_KeccakP1600_AddBytesInLane +#define KeccakP1600_AddLanes _PySHA3_KeccakP1600_AddLanes #define KeccakP1600_ExtractAndAddBytes _PySHA3_KeccakP1600_ExtractAndAddBytes -#define KeccakP1600_ExtractAndAddBytesInLane _PySHA3_KeccakP1600_ExtractAndAddBytesInLane +#define KeccakP1600_ExtractAndAddBytesInLane \ + _PySHA3_KeccakP1600_ExtractAndAddBytesInLane #define KeccakP1600_ExtractAndAddLanes _PySHA3_KeccakP1600_ExtractAndAddLanes -#define KeccakP1600_ExtractBytes _PySHA3_KeccakP1600_ExtractBytes +#define KeccakP1600_ExtractBytes _PySHA3_KeccakP1600_ExtractBytes #define KeccakP1600_ExtractBytesInLane _PySHA3_KeccakP1600_ExtractBytesInLane -#define KeccakP1600_ExtractLanes _PySHA3_KeccakP1600_ExtractLanes -#define KeccakP1600_Initialize _PySHA3_KeccakP1600_Initialize -#define KeccakP1600_OverwriteBytes _PySHA3_KeccakP1600_OverwriteBytes -#define KeccakP1600_OverwriteBytesInLane _PySHA3_KeccakP1600_OverwriteBytesInLane -#define KeccakP1600_OverwriteLanes _PySHA3_KeccakP1600_OverwriteLanes +#define KeccakP1600_ExtractLanes _PySHA3_KeccakP1600_ExtractLanes +#define KeccakP1600_Initialize _PySHA3_KeccakP1600_Initialize +#define KeccakP1600_OverwriteBytes _PySHA3_KeccakP1600_OverwriteBytes +#define KeccakP1600_OverwriteBytesInLane \ + _PySHA3_KeccakP1600_OverwriteBytesInLane +#define KeccakP1600_OverwriteLanes _PySHA3_KeccakP1600_OverwriteLanes #define KeccakP1600_OverwriteWithZeroes _PySHA3_KeccakP1600_OverwriteWithZeroes -#define KeccakP1600_Permute_12rounds _PySHA3_KeccakP1600_Permute_12rounds -#define KeccakP1600_Permute_24rounds _PySHA3_KeccakP1600_Permute_24rounds -#define KeccakWidth1600_Sponge _PySHA3_KeccakWidth1600_Sponge -#define KeccakWidth1600_SpongeAbsorb _PySHA3_KeccakWidth1600_SpongeAbsorb -#define KeccakWidth1600_SpongeAbsorbLastFewBits _PySHA3_KeccakWidth1600_SpongeAbsorbLastFewBits -#define KeccakWidth1600_SpongeInitialize _PySHA3_KeccakWidth1600_SpongeInitialize +#define KeccakP1600_Permute_12rounds _PySHA3_KeccakP1600_Permute_12rounds +#define KeccakP1600_Permute_24rounds _PySHA3_KeccakP1600_Permute_24rounds +#define KeccakWidth1600_Sponge _PySHA3_KeccakWidth1600_Sponge +#define KeccakWidth1600_SpongeAbsorb _PySHA3_KeccakWidth1600_SpongeAbsorb +#define KeccakWidth1600_SpongeAbsorbLastFewBits \ + _PySHA3_KeccakWidth1600_SpongeAbsorbLastFewBits +#define KeccakWidth1600_SpongeInitialize \ + _PySHA3_KeccakWidth1600_SpongeInitialize #define KeccakWidth1600_SpongeSqueeze _PySHA3_KeccakWidth1600_SpongeSqueeze #if KeccakOpt == 32 -#define KeccakP1600_AddByte _PySHA3_KeccakP1600_AddByte +#define KeccakP1600_AddByte _PySHA3_KeccakP1600_AddByte #define KeccakP1600_Permute_Nrounds _PySHA3_KeccakP1600_Permute_Nrounds -#define KeccakP1600_SetBytesInLaneToZero _PySHA3_KeccakP1600_SetBytesInLaneToZero +#define KeccakP1600_SetBytesInLaneToZero \ + _PySHA3_KeccakP1600_SetBytesInLaneToZero #endif /* we are only interested in KeccakP1600 */ @@ -103,26 +109,25 @@ #define KeccakP800_excluded 1 /* inline all Keccak dependencies */ -#include "kcp/KeccakHash.h" -#include "kcp/KeccakSponge.h" #include "kcp/KeccakHash.c" +#include "kcp/KeccakHash.h" #include "kcp/KeccakSponge.c" +#include "kcp/KeccakSponge.h" #if KeccakOpt == 64 - #include "kcp/KeccakP-1600-opt64.c" +#include "kcp/KeccakP-1600-opt64.c" #elif KeccakOpt == 32 - #include "kcp/KeccakP-1600-inplace32BI.c" +#include "kcp/KeccakP-1600-inplace32BI.c" #endif -#define SHA3_MAX_DIGESTSIZE 64 /* 64 Bytes (512 Bits) for 224 to 512 */ -#define SHA3_LANESIZE (20 * 8) /* ExtractLane needs max uint64_t[20] extra. */ -#define SHA3_state Keccak_HashInstance -#define SHA3_init Keccak_HashInitialize -#define SHA3_process Keccak_HashUpdate -#define SHA3_done Keccak_HashFinal -#define SHA3_squeeze Keccak_HashSqueeze +#define SHA3_MAX_DIGESTSIZE 64 /* 64 Bytes (512 Bits) for 224 to 512 */ +#define SHA3_LANESIZE (20 * 8) /* ExtractLane needs max uint64_t[20] extra. */ +#define SHA3_state Keccak_HashInstance +#define SHA3_init Keccak_HashInitialize +#define SHA3_process Keccak_HashUpdate +#define SHA3_done Keccak_HashFinal +#define SHA3_squeeze Keccak_HashSqueeze #define SHA3_copystate(dest, src) memcpy(&(dest), &(src), sizeof(SHA3_state)) - /*[clinic input] module _sha3 class _sha3.sha3_224 "SHA3object *" "&SHA3_224typ" @@ -137,10 +142,9 @@ class _sha3.shake_256 "SHA3object *" "&SHAKE256type" /* The structure for storing SHA3 info */ typedef struct { - PyObject_HEAD - SHA3_state hash_state; + PyObject_HEAD SHA3_state hash_state; #ifdef WITH_THREAD - PyThread_type_lock lock; + PyThread_type_lock lock; #endif } SHA3object; @@ -157,202 +161,185 @@ static PyTypeObject Keccak_512type; static PyTypeObject SHAKE128type; static PyTypeObject SHAKE256type; -#include "clinic/sha3module.c.h" +#include "third_party/python/Modules/_sha3/clinic/sha3module.c.h" -static SHA3object * -newSHA3object(PyTypeObject *type) -{ - SHA3object *newobj; - newobj = (SHA3object *)PyObject_New(SHA3object, type); - if (newobj == NULL) { - return NULL; - } -#ifdef WITH_THREAD - newobj->lock = NULL; -#endif - return newobj; -} - - -static PyObject * -py_sha3_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) -{ - SHA3object *self = NULL; - Py_buffer buf = {NULL, NULL}; - HashReturn res; - PyObject *data = NULL; - - if (!_PyArg_NoKeywords(type->tp_name, kwargs)) { - return NULL; - } - if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &data)) { - return NULL; - } - - self = newSHA3object(type); - if (self == NULL) { - goto error; - } - - if (type == &SHA3_224type) { - res = Keccak_HashInitialize_SHA3_224(&self->hash_state); - } else if (type == &SHA3_256type) { - res = Keccak_HashInitialize_SHA3_256(&self->hash_state); - } else if (type == &SHA3_384type) { - res = Keccak_HashInitialize_SHA3_384(&self->hash_state); - } else if (type == &SHA3_512type) { - res = Keccak_HashInitialize_SHA3_512(&self->hash_state); -#ifdef PY_WITH_KECCAK - } else if (type == &Keccak_224type) { - res = Keccak_HashInitialize(&self->hash_state, 1152, 448, 224, 0x01); - } else if (type == &Keccak_256type) { - res = Keccak_HashInitialize(&self->hash_state, 1088, 512, 256, 0x01); - } else if (type == &Keccak_384type) { - res = Keccak_HashInitialize(&self->hash_state, 832, 768, 384, 0x01); - } else if (type == &Keccak_512type) { - res = Keccak_HashInitialize(&self->hash_state, 576, 1024, 512, 0x01); -#endif - } else if (type == &SHAKE128type) { - res = Keccak_HashInitialize_SHAKE128(&self->hash_state); - } else if (type == &SHAKE256type) { - res = Keccak_HashInitialize_SHAKE256(&self->hash_state); - } else { - PyErr_BadInternalCall(); - goto error; - } - - if (data) { - GET_BUFFER_VIEW_OR_ERROR(data, &buf, goto error); -#ifdef WITH_THREAD - if (buf.len >= HASHLIB_GIL_MINSIZE) { - /* invariant: New objects can't be accessed by other code yet, - * thus it's safe to release the GIL without locking the object. - */ - Py_BEGIN_ALLOW_THREADS - res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); - Py_END_ALLOW_THREADS - } - else { - res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); - } -#else - res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); -#endif - if (res != SUCCESS) { - PyErr_SetString(PyExc_RuntimeError, - "internal error in SHA3 Update()"); - goto error; - } - PyBuffer_Release(&buf); - } - - return (PyObject *)self; - - error: - if (self) { - Py_DECREF(self); - } - if (data && buf.obj) { - PyBuffer_Release(&buf); - } +static SHA3object *newSHA3object(PyTypeObject *type) { + SHA3object *newobj; + newobj = (SHA3object *)PyObject_New(SHA3object, type); + if (newobj == NULL) { return NULL; + } +#ifdef WITH_THREAD + newobj->lock = NULL; +#endif + return newobj; } +static PyObject *py_sha3_new(PyTypeObject *type, PyObject *args, + PyObject *kwargs) { + SHA3object *self = NULL; + Py_buffer buf = {NULL, NULL}; + HashReturn res; + PyObject *data = NULL; + + if (!_PyArg_NoKeywords(type->tp_name, kwargs)) { + return NULL; + } + if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &data)) { + return NULL; + } + + self = newSHA3object(type); + if (self == NULL) { + goto error; + } + + if (type == &SHA3_224type) { + res = Keccak_HashInitialize_SHA3_224(&self->hash_state); + } else if (type == &SHA3_256type) { + res = Keccak_HashInitialize_SHA3_256(&self->hash_state); + } else if (type == &SHA3_384type) { + res = Keccak_HashInitialize_SHA3_384(&self->hash_state); + } else if (type == &SHA3_512type) { + res = Keccak_HashInitialize_SHA3_512(&self->hash_state); +#ifdef PY_WITH_KECCAK + } else if (type == &Keccak_224type) { + res = Keccak_HashInitialize(&self->hash_state, 1152, 448, 224, 0x01); + } else if (type == &Keccak_256type) { + res = Keccak_HashInitialize(&self->hash_state, 1088, 512, 256, 0x01); + } else if (type == &Keccak_384type) { + res = Keccak_HashInitialize(&self->hash_state, 832, 768, 384, 0x01); + } else if (type == &Keccak_512type) { + res = Keccak_HashInitialize(&self->hash_state, 576, 1024, 512, 0x01); +#endif + } else if (type == &SHAKE128type) { + res = Keccak_HashInitialize_SHAKE128(&self->hash_state); + } else if (type == &SHAKE256type) { + res = Keccak_HashInitialize_SHAKE256(&self->hash_state); + } else { + PyErr_BadInternalCall(); + goto error; + } + + if (data) { + GET_BUFFER_VIEW_OR_ERROR(data, &buf, goto error); +#ifdef WITH_THREAD + if (buf.len >= HASHLIB_GIL_MINSIZE) { + /* invariant: New objects can't be accessed by other code yet, + * thus it's safe to release the GIL without locking the object. + */ + Py_BEGIN_ALLOW_THREADS res = + SHA3_process(&self->hash_state, buf.buf, buf.len * 8); + Py_END_ALLOW_THREADS + } else { + res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); + } +#else + res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); +#endif + if (res != SUCCESS) { + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Update()"); + goto error; + } + PyBuffer_Release(&buf); + } + + return (PyObject *)self; + +error: + if (self) { + Py_DECREF(self); + } + if (data && buf.obj) { + PyBuffer_Release(&buf); + } + return NULL; +} /* Internal methods for a hash object */ -static void -SHA3_dealloc(SHA3object *self) -{ +static void SHA3_dealloc(SHA3object *self) { #ifdef WITH_THREAD - if (self->lock) { - PyThread_free_lock(self->lock); - } + if (self->lock) { + PyThread_free_lock(self->lock); + } #endif - PyObject_Del(self); + PyObject_Del(self); } - /* External methods for a hash object */ - /*[clinic input] _sha3.sha3_224.copy Return a copy of the hash object. [clinic start generated code]*/ -static PyObject * -_sha3_sha3_224_copy_impl(SHA3object *self) +static PyObject *_sha3_sha3_224_copy_impl(SHA3object *self) /*[clinic end generated code: output=6c537411ecdcda4c input=93a44aaebea51ba8]*/ { - SHA3object *newobj; + SHA3object *newobj; - if ((newobj = newSHA3object(Py_TYPE(self))) == NULL) { - return NULL; - } - ENTER_HASHLIB(self); - SHA3_copystate(newobj->hash_state, self->hash_state); - LEAVE_HASHLIB(self); - return (PyObject *)newobj; + if ((newobj = newSHA3object(Py_TYPE(self))) == NULL) { + return NULL; + } + ENTER_HASHLIB(self); + SHA3_copystate(newobj->hash_state, self->hash_state); + LEAVE_HASHLIB(self); + return (PyObject *)newobj; } - /*[clinic input] _sha3.sha3_224.digest Return the digest value as a bytes object. [clinic start generated code]*/ -static PyObject * -_sha3_sha3_224_digest_impl(SHA3object *self) +static PyObject *_sha3_sha3_224_digest_impl(SHA3object *self) /*[clinic end generated code: output=fd531842e20b2d5b input=5b2a659536bbd248]*/ { - unsigned char digest[SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE]; - SHA3_state temp; - HashReturn res; + unsigned char digest[SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE]; + SHA3_state temp; + HashReturn res; - ENTER_HASHLIB(self); - SHA3_copystate(temp, self->hash_state); - LEAVE_HASHLIB(self); - res = SHA3_done(&temp, digest); - if (res != SUCCESS) { - PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()"); - return NULL; - } - return PyBytes_FromStringAndSize((const char *)digest, - self->hash_state.fixedOutputLength / 8); + ENTER_HASHLIB(self); + SHA3_copystate(temp, self->hash_state); + LEAVE_HASHLIB(self); + res = SHA3_done(&temp, digest); + if (res != SUCCESS) { + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()"); + return NULL; + } + return PyBytes_FromStringAndSize((const char *)digest, + self->hash_state.fixedOutputLength / 8); } - /*[clinic input] _sha3.sha3_224.hexdigest Return the digest value as a string of hexadecimal digits. [clinic start generated code]*/ -static PyObject * -_sha3_sha3_224_hexdigest_impl(SHA3object *self) +static PyObject *_sha3_sha3_224_hexdigest_impl(SHA3object *self) /*[clinic end generated code: output=75ad03257906918d input=2d91bb6e0d114ee3]*/ { - unsigned char digest[SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE]; - SHA3_state temp; - HashReturn res; + unsigned char digest[SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE]; + SHA3_state temp; + HashReturn res; - /* Get the raw (binary) digest value */ - ENTER_HASHLIB(self); - SHA3_copystate(temp, self->hash_state); - LEAVE_HASHLIB(self); - res = SHA3_done(&temp, digest); - if (res != SUCCESS) { - PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()"); - return NULL; - } - return _Py_strhex((const char *)digest, - self->hash_state.fixedOutputLength / 8); + /* Get the raw (binary) digest value */ + ENTER_HASHLIB(self); + SHA3_copystate(temp, self->hash_state); + LEAVE_HASHLIB(self); + res = SHA3_done(&temp, digest); + if (res != SUCCESS) { + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()"); + return NULL; + } + return _Py_strhex((const char *)digest, + self->hash_state.fixedOutputLength / 8); } - /*[clinic input] _sha3.sha3_224.update @@ -362,133 +349,108 @@ _sha3.sha3_224.update Update this hash object's state with the provided bytes-like object. [clinic start generated code]*/ -static PyObject * -_sha3_sha3_224_update(SHA3object *self, PyObject *data) +static PyObject *_sha3_sha3_224_update(SHA3object *self, PyObject *data) /*[clinic end generated code: output=d3223352286ed357 input=a887f54dcc4ae227]*/ { - Py_buffer buf; - HashReturn res; + Py_buffer buf; + HashReturn res; - GET_BUFFER_VIEW_OR_ERROUT(data, &buf); + GET_BUFFER_VIEW_OR_ERROUT(data, &buf); - /* add new data, the function takes the length in bits not bytes */ + /* add new data, the function takes the length in bits not bytes */ #ifdef WITH_THREAD - if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE) { - self->lock = PyThread_allocate_lock(); - } - /* Once a lock exists all code paths must be synchronized. We have to - * release the GIL even for small buffers as acquiring the lock may take - * an unlimited amount of time when another thread updates this object - * with lots of data. */ - if (self->lock) { - Py_BEGIN_ALLOW_THREADS - PyThread_acquire_lock(self->lock, 1); - res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); - PyThread_release_lock(self->lock); - Py_END_ALLOW_THREADS - } - else { - res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); - } -#else + if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE) { + self->lock = PyThread_allocate_lock(); + } + /* Once a lock exists all code paths must be synchronized. We have to + * release the GIL even for small buffers as acquiring the lock may take + * an unlimited amount of time when another thread updates this object + * with lots of data. */ + if (self->lock) { + Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(self->lock, 1); res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); + PyThread_release_lock(self->lock); + Py_END_ALLOW_THREADS + } else { + res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); + } +#else + res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8); #endif - if (res != SUCCESS) { - PyBuffer_Release(&buf); - PyErr_SetString(PyExc_RuntimeError, - "internal error in SHA3 Update()"); - return NULL; - } - + if (res != SUCCESS) { PyBuffer_Release(&buf); - Py_INCREF(Py_None); - return Py_None; -} + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Update()"); + return NULL; + } + PyBuffer_Release(&buf); + Py_INCREF(Py_None); + return Py_None; +} static PyMethodDef SHA3_methods[] = { - _SHA3_SHA3_224_COPY_METHODDEF - _SHA3_SHA3_224_DIGEST_METHODDEF - _SHA3_SHA3_224_HEXDIGEST_METHODDEF - _SHA3_SHA3_224_UPDATE_METHODDEF - {NULL, NULL} /* sentinel */ + _SHA3_SHA3_224_COPY_METHODDEF _SHA3_SHA3_224_DIGEST_METHODDEF + _SHA3_SHA3_224_HEXDIGEST_METHODDEF _SHA3_SHA3_224_UPDATE_METHODDEF{ + NULL, NULL} /* sentinel */ }; - -static PyObject * -SHA3_get_block_size(SHA3object *self, void *closure) -{ - int rate = self->hash_state.sponge.rate; - return PyLong_FromLong(rate / 8); +static PyObject *SHA3_get_block_size(SHA3object *self, void *closure) { + int rate = self->hash_state.sponge.rate; + return PyLong_FromLong(rate / 8); } - -static PyObject * -SHA3_get_name(SHA3object *self, void *closure) -{ - PyTypeObject *type = Py_TYPE(self); - if (type == &SHA3_224type) { - return PyUnicode_FromString("sha3_224"); - } else if (type == &SHA3_256type) { - return PyUnicode_FromString("sha3_256"); - } else if (type == &SHA3_384type) { - return PyUnicode_FromString("sha3_384"); - } else if (type == &SHA3_512type) { - return PyUnicode_FromString("sha3_512"); +static PyObject *SHA3_get_name(SHA3object *self, void *closure) { + PyTypeObject *type = Py_TYPE(self); + if (type == &SHA3_224type) { + return PyUnicode_FromString("sha3_224"); + } else if (type == &SHA3_256type) { + return PyUnicode_FromString("sha3_256"); + } else if (type == &SHA3_384type) { + return PyUnicode_FromString("sha3_384"); + } else if (type == &SHA3_512type) { + return PyUnicode_FromString("sha3_512"); #ifdef PY_WITH_KECCAK - } else if (type == &Keccak_224type) { - return PyUnicode_FromString("keccak_224"); - } else if (type == &Keccak_256type) { - return PyUnicode_FromString("keccak_256"); - } else if (type == &Keccak_384type) { - return PyUnicode_FromString("keccak_384"); - } else if (type == &Keccak_512type) { - return PyUnicode_FromString("keccak_512"); + } else if (type == &Keccak_224type) { + return PyUnicode_FromString("keccak_224"); + } else if (type == &Keccak_256type) { + return PyUnicode_FromString("keccak_256"); + } else if (type == &Keccak_384type) { + return PyUnicode_FromString("keccak_384"); + } else if (type == &Keccak_512type) { + return PyUnicode_FromString("keccak_512"); #endif - } else if (type == &SHAKE128type) { - return PyUnicode_FromString("shake_128"); - } else if (type == &SHAKE256type) { - return PyUnicode_FromString("shake_256"); - } else { - PyErr_BadInternalCall(); - return NULL; - } + } else if (type == &SHAKE128type) { + return PyUnicode_FromString("shake_128"); + } else if (type == &SHAKE256type) { + return PyUnicode_FromString("shake_256"); + } else { + PyErr_BadInternalCall(); + return NULL; + } } - -static PyObject * -SHA3_get_digest_size(SHA3object *self, void *closure) -{ - return PyLong_FromLong(self->hash_state.fixedOutputLength / 8); +static PyObject *SHA3_get_digest_size(SHA3object *self, void *closure) { + return PyLong_FromLong(self->hash_state.fixedOutputLength / 8); } - -static PyObject * -SHA3_get_capacity_bits(SHA3object *self, void *closure) -{ - int capacity = 1600 - self->hash_state.sponge.rate; - return PyLong_FromLong(capacity); +static PyObject *SHA3_get_capacity_bits(SHA3object *self, void *closure) { + int capacity = 1600 - self->hash_state.sponge.rate; + return PyLong_FromLong(capacity); } - -static PyObject * -SHA3_get_rate_bits(SHA3object *self, void *closure) -{ - unsigned int rate = self->hash_state.sponge.rate; - return PyLong_FromLong(rate); +static PyObject *SHA3_get_rate_bits(SHA3object *self, void *closure) { + unsigned int rate = self->hash_state.sponge.rate; + return PyLong_FromLong(rate); } -static PyObject * -SHA3_get_suffix(SHA3object *self, void *closure) -{ - unsigned char suffix[2]; - suffix[0] = self->hash_state.delimitedSuffix; - suffix[1] = 0; - return PyBytes_FromStringAndSize((const char *)suffix, 1); +static PyObject *SHA3_get_suffix(SHA3object *self, void *closure) { + unsigned char suffix[2]; + suffix[0] = self->hash_state.delimitedSuffix; + suffix[1] = 0; + return PyBytes_FromStringAndSize((const char *)suffix, 1); } - static PyGetSetDef SHA3_getseters[] = { {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL}, {"name", (getter)SHA3_get_name, NULL, NULL, NULL}, @@ -496,70 +458,64 @@ static PyGetSetDef SHA3_getseters[] = { {"_capacity_bits", (getter)SHA3_get_capacity_bits, NULL, NULL, NULL}, {"_rate_bits", (getter)SHA3_get_rate_bits, NULL, NULL, NULL}, {"_suffix", (getter)SHA3_get_suffix, NULL, NULL, NULL}, - {NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; +#define SHA3_TYPE(type_obj, type_name, type_doc, type_methods) \ + static PyTypeObject type_obj = { \ + PyVarObject_HEAD_INIT(NULL, 0) type_name, /* tp_name */ \ + sizeof(SHA3object), /* tp_basicsize */ \ + 0, \ + /* tp_itemsize */ /* methods */ \ + (destructor)SHA3_dealloc, /* tp_dealloc */ \ + 0, /* tp_print */ \ + 0, /* tp_getattr */ \ + 0, /* tp_setattr */ \ + 0, /* tp_reserved */ \ + 0, /* tp_repr */ \ + 0, /* tp_as_number */ \ + 0, /* tp_as_sequence */ \ + 0, /* tp_as_mapping */ \ + 0, /* tp_hash */ \ + 0, /* tp_call */ \ + 0, /* tp_str */ \ + 0, /* tp_getattro */ \ + 0, /* tp_setattro */ \ + 0, /* tp_as_buffer */ \ + Py_TPFLAGS_DEFAULT, /* tp_flags */ \ + type_doc, /* tp_doc */ \ + 0, /* tp_traverse */ \ + 0, /* tp_clear */ \ + 0, /* tp_richcompare */ \ + 0, /* tp_weaklistoffset */ \ + 0, /* tp_iter */ \ + 0, /* tp_iternext */ \ + type_methods, /* tp_methods */ \ + NULL, /* tp_members */ \ + SHA3_getseters, /* tp_getset */ \ + 0, /* tp_base */ \ + 0, /* tp_dict */ \ + 0, /* tp_descr_get */ \ + 0, /* tp_descr_set */ \ + 0, /* tp_dictoffset */ \ + 0, /* tp_init */ \ + 0, /* tp_alloc */ \ + py_sha3_new, /* tp_new */ \ + } -#define SHA3_TYPE(type_obj, type_name, type_doc, type_methods) \ - static PyTypeObject type_obj = { \ - PyVarObject_HEAD_INIT(NULL, 0) \ - type_name, /* tp_name */ \ - sizeof(SHA3object), /* tp_basicsize */ \ - 0, /* tp_itemsize */ \ - /* methods */ \ - (destructor)SHA3_dealloc, /* tp_dealloc */ \ - 0, /* tp_print */ \ - 0, /* tp_getattr */ \ - 0, /* tp_setattr */ \ - 0, /* tp_reserved */ \ - 0, /* tp_repr */ \ - 0, /* tp_as_number */ \ - 0, /* tp_as_sequence */ \ - 0, /* tp_as_mapping */ \ - 0, /* tp_hash */ \ - 0, /* tp_call */ \ - 0, /* tp_str */ \ - 0, /* tp_getattro */ \ - 0, /* tp_setattro */ \ - 0, /* tp_as_buffer */ \ - Py_TPFLAGS_DEFAULT, /* tp_flags */ \ - type_doc, /* tp_doc */ \ - 0, /* tp_traverse */ \ - 0, /* tp_clear */ \ - 0, /* tp_richcompare */ \ - 0, /* tp_weaklistoffset */ \ - 0, /* tp_iter */ \ - 0, /* tp_iternext */ \ - type_methods, /* tp_methods */ \ - NULL, /* tp_members */ \ - SHA3_getseters, /* tp_getset */ \ - 0, /* tp_base */ \ - 0, /* tp_dict */ \ - 0, /* tp_descr_get */ \ - 0, /* tp_descr_set */ \ - 0, /* tp_dictoffset */ \ - 0, /* tp_init */ \ - 0, /* tp_alloc */ \ - py_sha3_new, /* tp_new */ \ - } - -PyDoc_STRVAR(sha3_224__doc__, -"sha3_224([data]) -> SHA3 object\n\ +PyDoc_STRVAR(sha3_224__doc__, "sha3_224([data]) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 28 bytes."); -PyDoc_STRVAR(sha3_256__doc__, -"sha3_256([data]) -> SHA3 object\n\ +PyDoc_STRVAR(sha3_256__doc__, "sha3_256([data]) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 32 bytes."); -PyDoc_STRVAR(sha3_384__doc__, -"sha3_384([data]) -> SHA3 object\n\ +PyDoc_STRVAR(sha3_384__doc__, "sha3_384([data]) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 48 bytes."); -PyDoc_STRVAR(sha3_512__doc__, -"sha3_512([data]) -> SHA3 object\n\ +PyDoc_STRVAR(sha3_512__doc__, "sha3_512([data]) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 64 bytes."); @@ -569,23 +525,19 @@ SHA3_TYPE(SHA3_384type, "_sha3.sha3_384", sha3_384__doc__, SHA3_methods); SHA3_TYPE(SHA3_512type, "_sha3.sha3_512", sha3_512__doc__, SHA3_methods); #ifdef PY_WITH_KECCAK -PyDoc_STRVAR(keccak_224__doc__, -"keccak_224([data]) -> Keccak object\n\ +PyDoc_STRVAR(keccak_224__doc__, "keccak_224([data]) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 28 bytes."); -PyDoc_STRVAR(keccak_256__doc__, -"keccak_256([data]) -> Keccak object\n\ +PyDoc_STRVAR(keccak_256__doc__, "keccak_256([data]) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 32 bytes."); -PyDoc_STRVAR(keccak_384__doc__, -"keccak_384([data]) -> Keccak object\n\ +PyDoc_STRVAR(keccak_384__doc__, "keccak_384([data]) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 48 bytes."); -PyDoc_STRVAR(keccak_512__doc__, -"keccak_512([data]) -> Keccak object\n\ +PyDoc_STRVAR(keccak_512__doc__, "keccak_512([data]) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 64 bytes."); @@ -595,60 +547,56 @@ SHA3_TYPE(Keccak_384type, "_sha3.keccak_384", keccak_384__doc__, SHA3_methods); SHA3_TYPE(Keccak_512type, "_sha3.keccak_512", keccak_512__doc__, SHA3_methods); #endif +static PyObject *_SHAKE_digest(SHA3object *self, PyObject *digestlen_obj, + int hex) { + unsigned long digestlen; + unsigned char *digest = NULL; + SHA3_state temp; + int res; + PyObject *result = NULL; -static PyObject * -_SHAKE_digest(SHA3object *self, PyObject *digestlen_obj, int hex) -{ - unsigned long digestlen; - unsigned char *digest = NULL; - SHA3_state temp; - int res; - PyObject *result = NULL; + digestlen = PyLong_AsUnsignedLong(digestlen_obj); + if (digestlen == (unsigned long)-1 && PyErr_Occurred()) { + return NULL; + } + if (digestlen >= (1 << 29)) { + PyErr_SetString(PyExc_ValueError, "length is too large"); + return NULL; + } + /* ExtractLane needs at least SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE and + * SHA3_LANESIZE extra space. + */ + digest = (unsigned char *)PyMem_Malloc(digestlen + SHA3_LANESIZE); + if (digest == NULL) { + return PyErr_NoMemory(); + } - digestlen = PyLong_AsUnsignedLong(digestlen_obj); - if (digestlen == (unsigned long) -1 && PyErr_Occurred()) { - return NULL; - } - if (digestlen >= (1 << 29)) { - PyErr_SetString(PyExc_ValueError, "length is too large"); - return NULL; - } - /* ExtractLane needs at least SHA3_MAX_DIGESTSIZE + SHA3_LANESIZE and - * SHA3_LANESIZE extra space. - */ - digest = (unsigned char*)PyMem_Malloc(digestlen + SHA3_LANESIZE); - if (digest == NULL) { - return PyErr_NoMemory(); - } - - /* Get the raw (binary) digest value */ - ENTER_HASHLIB(self); - SHA3_copystate(temp, self->hash_state); - LEAVE_HASHLIB(self); - res = SHA3_done(&temp, NULL); - if (res != SUCCESS) { - PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 done()"); - goto error; - } - res = SHA3_squeeze(&temp, digest, digestlen * 8); - if (res != SUCCESS) { - PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Squeeze()"); - return NULL; - } - if (hex) { - result = _Py_strhex((const char *)digest, digestlen); - } else { - result = PyBytes_FromStringAndSize((const char *)digest, - digestlen); - } - error: - if (digest != NULL) { - PyMem_Free(digest); - } - return result; + /* Get the raw (binary) digest value */ + ENTER_HASHLIB(self); + SHA3_copystate(temp, self->hash_state); + LEAVE_HASHLIB(self); + res = SHA3_done(&temp, NULL); + if (res != SUCCESS) { + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 done()"); + goto error; + } + res = SHA3_squeeze(&temp, digest, digestlen * 8); + if (res != SUCCESS) { + PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Squeeze()"); + return NULL; + } + if (hex) { + result = _Py_strhex((const char *)digest, digestlen); + } else { + result = PyBytes_FromStringAndSize((const char *)digest, digestlen); + } +error: + if (digest != NULL) { + PyMem_Free(digest); + } + return result; } - /*[clinic input] _sha3.shake_128.digest @@ -658,14 +606,12 @@ _sha3.shake_128.digest Return the digest value as a bytes object. [clinic start generated code]*/ -static PyObject * -_sha3_shake_128_digest(SHA3object *self, PyObject *length) +static PyObject *_sha3_shake_128_digest(SHA3object *self, PyObject *length) /*[clinic end generated code: output=eaa80b6299142396 input=c579eb109f6227d2]*/ { - return _SHAKE_digest(self, length, 0); + return _SHAKE_digest(self, length, 0); } - /*[clinic input] _sha3.shake_128.hexdigest @@ -675,96 +621,77 @@ _sha3.shake_128.hexdigest Return the digest value as a string of hexadecimal digits. [clinic start generated code]*/ -static PyObject * -_sha3_shake_128_hexdigest(SHA3object *self, PyObject *length) +static PyObject *_sha3_shake_128_hexdigest(SHA3object *self, PyObject *length) /*[clinic end generated code: output=4752f90e53c8bf2a input=a82694ea83865f5a]*/ { - return _SHAKE_digest(self, length, 1); + return _SHAKE_digest(self, length, 1); } - static PyMethodDef SHAKE_methods[] = { - _SHA3_SHA3_224_COPY_METHODDEF - _SHA3_SHAKE_128_DIGEST_METHODDEF - _SHA3_SHAKE_128_HEXDIGEST_METHODDEF - _SHA3_SHA3_224_UPDATE_METHODDEF - {NULL, NULL} /* sentinel */ + _SHA3_SHA3_224_COPY_METHODDEF _SHA3_SHAKE_128_DIGEST_METHODDEF + _SHA3_SHAKE_128_HEXDIGEST_METHODDEF _SHA3_SHA3_224_UPDATE_METHODDEF{ + NULL, NULL} /* sentinel */ }; -PyDoc_STRVAR(shake_128__doc__, -"shake_128([data]) -> SHAKE object\n\ +PyDoc_STRVAR(shake_128__doc__, "shake_128([data]) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); -PyDoc_STRVAR(shake_256__doc__, -"shake_256([data]) -> SHAKE object\n\ +PyDoc_STRVAR(shake_256__doc__, "shake_256([data]) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); SHA3_TYPE(SHAKE128type, "_sha3.shake_128", shake_128__doc__, SHAKE_methods); SHA3_TYPE(SHAKE256type, "_sha3.shake_256", shake_256__doc__, SHAKE_methods); - /* Initialize this module. */ static struct PyModuleDef _SHA3module = { - PyModuleDef_HEAD_INIT, - "_sha3", - NULL, - -1, - NULL, - NULL, - NULL, - NULL, - NULL -}; + PyModuleDef_HEAD_INIT, "_sha3", NULL, -1, NULL, NULL, NULL, NULL, NULL}; +PyMODINIT_FUNC PyInit__sha3(void) { + PyObject *m = NULL; -PyMODINIT_FUNC -PyInit__sha3(void) -{ - PyObject *m = NULL; + if ((m = PyModule_Create(&_SHA3module)) == NULL) { + return NULL; + } - if ((m = PyModule_Create(&_SHA3module)) == NULL) { - return NULL; - } +#define init_sha3type(name, type) \ + do { \ + Py_TYPE(type) = &PyType_Type; \ + if (PyType_Ready(type) < 0) { \ + goto error; \ + } \ + Py_INCREF((PyObject *)type); \ + if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \ + goto error; \ + } \ + } while (0) -#define init_sha3type(name, type) \ - do { \ - Py_TYPE(type) = &PyType_Type; \ - if (PyType_Ready(type) < 0) { \ - goto error; \ - } \ - Py_INCREF((PyObject *)type); \ - if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \ - goto error; \ - } \ - } while(0) - - init_sha3type("sha3_224", &SHA3_224type); - init_sha3type("sha3_256", &SHA3_256type); - init_sha3type("sha3_384", &SHA3_384type); - init_sha3type("sha3_512", &SHA3_512type); + init_sha3type("sha3_224", &SHA3_224type); + init_sha3type("sha3_256", &SHA3_256type); + init_sha3type("sha3_384", &SHA3_384type); + init_sha3type("sha3_512", &SHA3_512type); #ifdef PY_WITH_KECCAK - init_sha3type("keccak_224", &Keccak_224type); - init_sha3type("keccak_256", &Keccak_256type); - init_sha3type("keccak_384", &Keccak_384type); - init_sha3type("keccak_512", &Keccak_512type); + init_sha3type("keccak_224", &Keccak_224type); + init_sha3type("keccak_256", &Keccak_256type); + init_sha3type("keccak_384", &Keccak_384type); + init_sha3type("keccak_512", &Keccak_512type); #endif - init_sha3type("shake_128", &SHAKE128type); - init_sha3type("shake_256", &SHAKE256type); + init_sha3type("shake_128", &SHAKE128type); + init_sha3type("shake_256", &SHAKE256type); #undef init_sha3type - if (PyModule_AddIntConstant(m, "keccakopt", KeccakOpt) < 0) { - goto error; - } - if (PyModule_AddStringConstant(m, "implementation", - KeccakP1600_implementation) < 0) { - goto error; - } + if (PyModule_AddIntConstant(m, "keccakopt", KeccakOpt) < 0) { + goto error; + } + if (PyModule_AddStringConstant(m, "implementation", + KeccakP1600_implementation) < 0) { + goto error; + } - return m; - error: - Py_DECREF(m); - return NULL; + return m; +error: + Py_DECREF(m); + return NULL; } diff --git a/third_party/python/Modules/_sqlite/cache.c b/third_party/python/Modules/_sqlite/cache.c index 62c58931f..f59c95961 100644 --- a/third_party/python/Modules/_sqlite/cache.c +++ b/third_party/python/Modules/_sqlite/cache.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* cache .c - a LRU cache * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/cache.h b/third_party/python/Modules/_sqlite/cache.h index a13390396..f4ba0b66f 100644 --- a/third_party/python/Modules/_sqlite/cache.h +++ b/third_party/python/Modules/_sqlite/cache.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* cache.h - definitions for the LRU cache * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/connection.c b/third_party/python/Modules/_sqlite/connection.c index 326d268a7..c48059c9c 100644 --- a/third_party/python/Modules/_sqlite/connection.c +++ b/third_party/python/Modules/_sqlite/connection.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* connection.c - the connection type * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/connection.h b/third_party/python/Modules/_sqlite/connection.h index 2860a0c6f..93f2c10a4 100644 --- a/third_party/python/Modules/_sqlite/connection.h +++ b/third_party/python/Modules/_sqlite/connection.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* connection.h - definitions for the connection type * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/cursor.c b/third_party/python/Modules/_sqlite/cursor.c index 098d5a357..61db29d48 100644 --- a/third_party/python/Modules/_sqlite/cursor.c +++ b/third_party/python/Modules/_sqlite/cursor.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* cursor.c - the cursor type * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/cursor.h b/third_party/python/Modules/_sqlite/cursor.h index 28bbd5f91..a860b0310 100644 --- a/third_party/python/Modules/_sqlite/cursor.h +++ b/third_party/python/Modules/_sqlite/cursor.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* cursor.h - definitions for the cursor type * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/microprotocols.c b/third_party/python/Modules/_sqlite/microprotocols.c index 2261b8013..a05801e7b 100644 --- a/third_party/python/Modules/_sqlite/microprotocols.c +++ b/third_party/python/Modules/_sqlite/microprotocols.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* microprotocols.c - minimalist and non-validating protocols implementation * * Copyright (C) 2003-2004 Federico Di Gregorio diff --git a/third_party/python/Modules/_sqlite/microprotocols.h b/third_party/python/Modules/_sqlite/microprotocols.h index 6941716c4..594ce459b 100644 --- a/third_party/python/Modules/_sqlite/microprotocols.h +++ b/third_party/python/Modules/_sqlite/microprotocols.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* microprotocols.c - definitions for minimalist and non-validating protocols * * Copyright (C) 2003-2004 Federico Di Gregorio diff --git a/third_party/python/Modules/_sqlite/module.c b/third_party/python/Modules/_sqlite/module.c index 7af228467..a8ea73b48 100644 --- a/third_party/python/Modules/_sqlite/module.c +++ b/third_party/python/Modules/_sqlite/module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* module.c - the module itself * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/module.h b/third_party/python/Modules/_sqlite/module.h index 6f90934b3..266b7a2f4 100644 --- a/third_party/python/Modules/_sqlite/module.h +++ b/third_party/python/Modules/_sqlite/module.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* module.h - definitions for the module * * Copyright (C) 2004-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/prepare_protocol.c b/third_party/python/Modules/_sqlite/prepare_protocol.c index f2c85f9af..16ab854e0 100644 --- a/third_party/python/Modules/_sqlite/prepare_protocol.c +++ b/third_party/python/Modules/_sqlite/prepare_protocol.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* prepare_protocol.c - the protocol for preparing values for SQLite * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/prepare_protocol.h b/third_party/python/Modules/_sqlite/prepare_protocol.h index 924e16223..9ea67900a 100644 --- a/third_party/python/Modules/_sqlite/prepare_protocol.h +++ b/third_party/python/Modules/_sqlite/prepare_protocol.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* prepare_protocol.h - the protocol for preparing values for SQLite * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/row.c b/third_party/python/Modules/_sqlite/row.c index 8c53f89f1..11dca19f6 100644 --- a/third_party/python/Modules/_sqlite/row.c +++ b/third_party/python/Modules/_sqlite/row.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* row.c - an enhanced tuple for database rows * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/row.h b/third_party/python/Modules/_sqlite/row.h index d01410903..3159abfdb 100644 --- a/third_party/python/Modules/_sqlite/row.h +++ b/third_party/python/Modules/_sqlite/row.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* row.h - an enhanced tuple for database rows * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/statement.c b/third_party/python/Modules/_sqlite/statement.c index de265963b..7a5bb1b71 100644 --- a/third_party/python/Modules/_sqlite/statement.c +++ b/third_party/python/Modules/_sqlite/statement.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* statement.c - the statement type * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/statement.h b/third_party/python/Modules/_sqlite/statement.h index 8db10f664..101e1e1f0 100644 --- a/third_party/python/Modules/_sqlite/statement.h +++ b/third_party/python/Modules/_sqlite/statement.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* statement.h - definitions for the statement type * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/util.c b/third_party/python/Modules/_sqlite/util.c index 351b1b47a..fd0f8149c 100644 --- a/third_party/python/Modules/_sqlite/util.c +++ b/third_party/python/Modules/_sqlite/util.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* util.c - various utility functions * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sqlite/util.h b/third_party/python/Modules/_sqlite/util.h index 88ea90689..7245e600d 100644 --- a/third_party/python/Modules/_sqlite/util.h +++ b/third_party/python/Modules/_sqlite/util.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* util.h - various utility functions * * Copyright (C) 2005-2010 Gerhard Häring diff --git a/third_party/python/Modules/_sre.c b/third_party/python/Modules/_sre.c index a4b7e7215..336ad1966 100644 --- a/third_party/python/Modules/_sre.c +++ b/third_party/python/Modules/_sre.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Secret Labs' Regular Expression Engine * @@ -40,15 +41,12 @@ static const char copyright[] = #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" /* offsetof */ - -#include "sre.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/sre.h" #define SRE_CODE_BITS (8 * sizeof(SRE_CODE)) -#include - /* name of this module, minus the leading underscore */ #if !defined(SRE_MODULE) #define SRE_MODULE "sre" @@ -2721,7 +2719,7 @@ pattern_richcompare(PyObject *lefto, PyObject *righto, int op) return PyBool_FromLong(cmp); } -#include "clinic/_sre.c.h" +#include "third_party/python/Modules/clinic/_sre.inc" static PyMethodDef pattern_methods[] = { _SRE_SRE_PATTERN_MATCH_METHODDEF diff --git a/third_party/python/Modules/_ssl.c b/third_party/python/Modules/_ssl.c index 7365630a5..6bf79a9ec 100644 --- a/third_party/python/Modules/_ssl.c +++ b/third_party/python/Modules/_ssl.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* SSL socket module SSL support based on patches by Brian E Gallew and Laszlo Kovacs. @@ -16,10 +17,10 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" +#include "third_party/python/Include/Python.h" #ifdef WITH_THREAD -#include "pythread.h" +#include "third_party/python/Include/pythread.h" #define PySSL_BEGIN_ALLOW_THREADS_S(save) \ @@ -45,7 +46,7 @@ #endif /* Include symbols from _socket module */ -#include "socketmodule.h" +#include "third_party/python/Modules/socketmodule.h" static PySocketModule_APIObject PySocketModule; @@ -103,7 +104,7 @@ struct py_ssl_library_code { }; /* Include generated data (error codes) */ -#include "_ssl_data.h" +#include "third_party/python/Modules/_ssl_data.inc" #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) # define OPENSSL_VERSION_1_1 1 @@ -387,7 +388,7 @@ class _ssl.SSLSession "PySSLSession *" "&PySSLSession_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=bdc67fafeeaa8109]*/ -#include "clinic/_ssl.c.h" +#include "third_party/python/Modules/clinic/_ssl.inc" static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout); diff --git a/third_party/python/Modules/_ssl_data.h b/third_party/python/Modules/_ssl_data.inc similarity index 99% rename from third_party/python/Modules/_ssl_data.h rename to third_party/python/Modules/_ssl_data.inc index 85165b90b..d72dfee06 100644 --- a/third_party/python/Modules/_ssl_data.h +++ b/third_party/python/Modules/_ssl_data.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* File generated by Tools/ssl/make_ssl_data.py */ /* Generated on 2015-01-17T20:33:43.377453 */ diff --git a/third_party/python/Modules/_stat.c b/third_party/python/Modules/_stat.c index f6cb30350..d79f3051d 100644 --- a/third_party/python/Modules/_stat.c +++ b/third_party/python/Modules/_stat.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* stat.h interface * * The module defines all S_IF*, S_I*, UF_*, SF_* and ST_* constants to @@ -12,23 +13,9 @@ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ - -#ifdef HAVE_SYS_STAT_H -#include -#endif /* HAVE_SYS_STAT_H */ - -#ifdef MS_WINDOWS -#include -typedef unsigned short mode_t; +#include "libc/sysv/consts/s.h" +#include "libc/calls/calls.h" +#include "third_party/python/Include/Python.h" /* FILE_ATTRIBUTE_INTEGRITY_STREAM and FILE_ATTRIBUTE_NO_SCRUB_DATA are not present in VC2010, so define them manually */ @@ -40,13 +27,6 @@ typedef unsigned short mode_t; # define FILE_ATTRIBUTE_NO_SCRUB_DATA 0x20000 #endif -#endif /* MS_WINDOWS */ - -/* From Python's stat.py */ -#ifndef S_IMODE -# define S_IMODE 07777 -#endif - /* S_IFXXX constants (file types) * * Only the names are defined by POSIX but not their value. All common file @@ -55,18 +35,6 @@ typedef unsigned short mode_t; * pyport.h guarantees S_IFMT, S_IFDIR, S_IFCHR, S_IFREG and S_IFLNK */ -#ifndef S_IFBLK -# define S_IFBLK 0060000 -#endif - -#ifndef S_IFIFO -# define S_IFIFO 0010000 -#endif - -#ifndef S_IFSOCK -# define S_IFSOCK 0140000 -#endif - #ifndef S_IFDOOR # define S_IFDOOR 0 #endif @@ -84,22 +52,6 @@ typedef unsigned short mode_t; * pyport.h defines S_ISDIR(), S_ISREG() and S_ISCHR() */ -#ifndef S_ISBLK -# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) -#endif - -#ifndef S_ISFIFO -# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) -#endif - -#ifndef S_ISLNK -# define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) -#endif - -#ifndef S_ISSOCK -# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) -#endif - #ifndef S_ISDOOR # define S_ISDOOR(mode) 0 #endif @@ -324,7 +276,7 @@ stat_S_IMODE(PyObject *self, PyObject *omode) mode_t mode = _PyLong_AsMode_t(omode); if ((mode == (mode_t)-1) && PyErr_Occurred()) return NULL; - return PyLong_FromUnsignedLong(mode & S_IMODE); + return PyLong_FromUnsignedLong(mode & 07777); } @@ -593,7 +545,3 @@ PyInit__stat(void) return m; } - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/_struct.c b/third_party/python/Modules/_struct.c index cd3fa2d15..b57cd0a67 100644 --- a/third_party/python/Modules/_struct.c +++ b/third_party/python/Modules/_struct.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* struct module -- pack values into and (out of) bytes objects */ /* New version supporting byte order, alignment and size options, @@ -5,9 +6,8 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" static PyTypeObject PyStructType; diff --git a/third_party/python/Modules/_testbuffer.c b/third_party/python/Modules/_testbuffer.c index a16b96db0..cff050f62 100644 --- a/third_party/python/Modules/_testbuffer.c +++ b/third_party/python/Modules/_testbuffer.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* C Extension module to test all aspects of PEP-3118. Written by Stefan Krah. */ diff --git a/third_party/python/Modules/_testcapimodule.c b/third_party/python/Modules/_testcapimodule.c index d3b0eb86f..51ce87514 100644 --- a/third_party/python/Modules/_testcapimodule.c +++ b/third_party/python/Modules/_testcapimodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * C Extension module to test Python interpreter C APIs. * @@ -8,24 +9,15 @@ #define PY_SSIZE_T_CLEAN #undef Py_BUILD_CORE -#include "Python.h" -#include -#include "structmember.h" -#include "datetime.h" -#include "marshal.h" -#include - -#ifdef MS_WINDOWS -# include /* struct timeval */ -#endif - -#ifdef HAVE_SYS_WAIT_H -#include /* For W_STOPCODE */ -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/datetime.h" +#include "third_party/python/Include/marshal.h" #ifdef WITH_THREAD -#include "pythread.h" -#endif /* WITH_THREAD */ +#include "third_party/python/Include/pythread.h" +#endif + static PyObject *TestError; /* set to exception object in init */ /* Raise TestError with test_name + ": " + msg, and return NULL. */ diff --git a/third_party/python/Modules/_testimportmultiple.c b/third_party/python/Modules/_testimportmultiple.c index 1caeb66eb..1dc11bd08 100644 --- a/third_party/python/Modules/_testimportmultiple.c +++ b/third_party/python/Modules/_testimportmultiple.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * C extensions module to test importing multiple modules from one compiled * file (issue16421). This file defines 3 modules (_testimportmodule, diff --git a/third_party/python/Modules/_testmultiphase.c b/third_party/python/Modules/_testmultiphase.c index 6b18859a4..a9e0db1b5 100644 --- a/third_party/python/Modules/_testmultiphase.c +++ b/third_party/python/Modules/_testmultiphase.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Testing module for multi-phase initialization of extension modules (PEP 489) */ diff --git a/third_party/python/Modules/_threadmodule.c b/third_party/python/Modules/_threadmodule.c index a13b2e074..e16860b23 100644 --- a/third_party/python/Modules/_threadmodule.c +++ b/third_party/python/Modules/_threadmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Thread module */ /* Interface to Sjoerd's portable C thread library */ diff --git a/third_party/python/Modules/_tkinter.c b/third_party/python/Modules/_tkinter.c index 473e60155..3b5b313a6 100644 --- a/third_party/python/Modules/_tkinter.c +++ b/third_party/python/Modules/_tkinter.c @@ -1,3 +1,4 @@ +/* clang-format off */ /*********************************************************** Copyright (C) 1994 Steen Lumholt. @@ -3276,7 +3277,7 @@ _tkinter_getbusywaitinterval_impl(PyObject *module) return Tkinter_busywaitinterval; } -#include "clinic/_tkinter.c.h" +#include "third_party/python/Modules/clinic/_tkinter.inc" static PyMethodDef Tktt_methods[] = { diff --git a/third_party/python/Modules/_tracemalloc.c b/third_party/python/Modules/_tracemalloc.c index a61bdb62f..faddec677 100644 --- a/third_party/python/Modules/_tracemalloc.c +++ b/third_party/python/Modules/_tracemalloc.c @@ -1,8 +1,9 @@ -#include "Python.h" -#include "hashtable.h" -#include "frameobject.h" -#include "pythread.h" -#include "osdefs.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/hashtable.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Include/pythread.h" +#include "third_party/python/Include/osdefs.h" /* Trace memory blocks allocated by PyMem_RawMalloc() */ #define TRACE_RAW_MALLOC diff --git a/third_party/python/Modules/_weakref.c b/third_party/python/Modules/_weakref.c index f9c68d6a6..f49c78dec 100644 --- a/third_party/python/Modules/_weakref.c +++ b/third_party/python/Modules/_weakref.c @@ -1,5 +1,5 @@ -#include "Python.h" - +/* clang-format off */ +#include "third_party/python/Include/Python.h" #define GET_WEAKREFS_LISTPTR(o) \ ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) @@ -9,7 +9,7 @@ module _weakref [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ffec73b85846596d]*/ -#include "clinic/_weakref.c.h" +#include "third_party/python/Modules/clinic/_weakref.inc" /*[clinic input] diff --git a/third_party/python/Modules/_winapi.c b/third_party/python/Modules/_winapi.c index 0647f6bed..558dfbc3c 100644 --- a/third_party/python/Modules/_winapi.c +++ b/third_party/python/Modules/_winapi.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Support routines from the Windows API * @@ -190,7 +191,7 @@ class DWORD_return_converter(CReturnConverter): [python start generated code]*/ /*[python end generated code: output=da39a3ee5e6b4b0d input=94819e72d2c6d558]*/ -#include "clinic/_winapi.c.h" +#include "third_party/python/Modules/clinic/_winapi.inc" /*[clinic input] _winapi.Overlapped.GetOverlappedResult diff --git a/third_party/python/Modules/arraymodule.c b/third_party/python/Modules/arraymodule.c index bc3f62def..75fe68e69 100644 --- a/third_party/python/Modules/arraymodule.c +++ b/third_party/python/Modules/arraymodule.c @@ -1,19 +1,12 @@ +/* clang-format off */ /* Array object implementation */ /* An array is a uniform list -- all items have the same type. The item type is restricted to simple C types like int or float */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" - -#ifdef STDC_HEADERS -#include -#else /* !STDC_HEADERS */ -#ifdef HAVE_SYS_TYPES_H -#include /* For size_t */ -#endif /* HAVE_SYS_TYPES_H */ -#endif /* !STDC_HEADERS */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /*[clinic input] module array @@ -102,7 +95,7 @@ enum machine_format_code { * Must come after arrayobject, arrayiterobject, * and enum machine_code_type definitions. */ -#include "clinic/arraymodule.c.h" +#include "third_party/python/Modules/clinic/arraymodule.inc" #define array_Check(op) PyObject_TypeCheck(op, &Arraytype) #define array_CheckExact(op) (Py_TYPE(op) == &Arraytype) diff --git a/third_party/python/Modules/atexitmodule.c b/third_party/python/Modules/atexitmodule.c index 35ebf08ec..c807e5fd1 100644 --- a/third_party/python/Modules/atexitmodule.c +++ b/third_party/python/Modules/atexitmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * atexit - allow programmer to define multiple exit functions to be executed * upon normal program termination. @@ -6,7 +7,7 @@ + Copyright 2007 Python Software Foundation. */ -#include "Python.h" +#include "third_party/python/Include/Python.h" /* Forward declaration (for atexit_cleanup) */ static PyObject *atexit_clear(PyObject*, PyObject*); diff --git a/third_party/python/Modules/audioop.c b/third_party/python/Modules/audioop.c index 4aad2e517..08df33c72 100644 --- a/third_party/python/Modules/audioop.c +++ b/third_party/python/Modules/audioop.c @@ -1,9 +1,10 @@ +/* clang-format off */ /* audioopmodule - Module to detect peak values in arrays */ #define PY_SSIZE_T_CLEAN -#include "Python.h" +#include "third_party/python/Include/Python.h" #if defined(__CHAR_UNSIGNED__) #if defined(signed) @@ -1859,7 +1860,7 @@ audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width, return rv; } -#include "clinic/audioop.c.h" +#include "third_party/python/Modules/clinic/audioop.inc" static PyMethodDef audioop_methods[] = { AUDIOOP_MAX_METHODDEF diff --git a/third_party/python/Modules/binascii.c b/third_party/python/Modules/binascii.c index ee66a48eb..ac6933d38 100644 --- a/third_party/python/Modules/binascii.c +++ b/third_party/python/Modules/binascii.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* ** Routines to represent binary data in ASCII and vice-versa ** @@ -55,11 +56,9 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "pystrhex.h" -#ifdef USE_ZLIB_CRC32 -#include "zlib.h" -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pystrhex.h" +#include "third_party/zlib/zlib.h" static PyObject *Error; static PyObject *Incomplete; @@ -241,7 +240,7 @@ ascii_buffer_converter(PyObject *arg, Py_buffer *buf) return Py_CLEANUP_SUPPORTED; } -#include "clinic/binascii.c.h" +#include "third_party/python/Modules/clinic/binascii.inc" /*[clinic input] binascii.a2b_uu @@ -921,126 +920,6 @@ binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) return crc; } -#ifndef USE_ZLIB_CRC32 -/* Crc - 32 BIT ANSI X3.66 CRC checksum files - Also known as: ISO 3307 -**********************************************************************| -* *| -* Demonstration program to compute the 32-bit CRC used as the frame *| -* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *| -* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *| -* protocol). The 32-bit FCS was added via the Federal Register, *| -* 1 June 1982, p.23798. I presume but don't know for certain that *| -* this polynomial is or will be included in CCITT V.41, which *| -* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *| -* PUB 78 says that the 32-bit FCS reduces otherwise undetected *| -* errors by a factor of 10^-5 over 16-bit FCS. *| -* *| -**********************************************************************| - - Copyright (C) 1986 Gary S. Brown. You may use this program, or - code or tables extracted from it, as desired without restriction. - - First, the polynomial itself and its table of feedback terms. The - polynomial is - X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 - Note that we take it "backwards" and put the highest-order term in - the lowest-order bit. The X^32 term is "implied"; the LSB is the - X^31 term, etc. The X^0 term (usually shown as "+1") results in - the MSB being 1. - - Note that the usual hardware shift register implementation, which - is what we're using (we're merely optimizing it by doing eight-bit - chunks at a time) shifts bits into the lowest-order term. In our - implementation, that means shifting towards the right. Why do we - do it this way? Because the calculated CRC must be transmitted in - order from highest-order term to lowest-order term. UARTs transmit - characters in order from LSB to MSB. By storing the CRC this way, - we hand it to the UART in the order low-byte to high-byte; the UART - sends each low-bit to hight-bit; and the result is transmission bit - by bit from highest- to lowest-order term without requiring any bit - shuffling on our part. Reception works similarly. - - The feedback terms table consists of 256, 32-bit entries. Notes: - - 1. The table can be generated at runtime if desired; code to do so - is shown later. It might not be obvious, but the feedback - terms simply represent the results of eight shift/xor opera- - tions for all combinations of data and CRC register values. - - 2. The CRC accumulation logic is the same for all CRC polynomials, - be they sixteen or thirty-two bits wide. You simply choose the - appropriate table. Alternatively, because the table can be - generated at runtime, you can start by generating the table for - the polynomial in question and use exactly the same "updcrc", - if your application needn't simultaneously handle two CRC - polynomials. (Note, however, that XMODEM is strange.) - - 3. For 16-bit CRCs, the table entries need be only 16 bits wide; - of course, 32-bit entries work OK if the high 16 bits are zero. - - 4. The values must be right-shifted by eight bits by the "updcrc" - logic; the shift must be unsigned (bring in zeroes). On some - hardware you could probably optimize the shift in assembler by - using byte-swap instructions. -********************************************************************/ - -static const unsigned int crc_32_tab[256] = { -0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, -0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, -0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, -0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, -0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, -0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, -0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, -0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, -0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, -0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, -0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, -0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, -0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, -0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, -0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, -0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, -0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, -0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, -0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, -0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, -0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, -0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, -0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, -0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, -0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, -0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, -0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, -0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, -0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, -0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, -0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, -0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, -0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, -0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, -0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, -0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, -0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, -0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, -0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, -0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, -0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, -0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, -0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, -0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, -0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, -0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, -0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, -0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, -0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, -0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, -0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, -0x2d02ef8dU -}; -#endif /* USE_ZLIB_CRC32 */ - /*[clinic input] binascii.crc32 -> unsigned_int @@ -1055,7 +934,6 @@ static unsigned int binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc) /*[clinic end generated code: output=52cf59056a78593b input=bbe340bc99d25aa8]*/ -#ifdef USE_ZLIB_CRC32 /* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */ { const Byte *buf; @@ -1067,25 +945,6 @@ binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc) signed_val = crc32(crc, buf, len); return (unsigned int)signed_val & 0xffffffffU; } -#else /* USE_ZLIB_CRC32 */ -{ /* By Jim Ahlstrom; All rights transferred to CNRI */ - const unsigned char *bin_data; - Py_ssize_t len; - unsigned int result; - - bin_data = data->buf; - len = data->len; - - crc = ~ crc; - while (len-- > 0) { - crc = crc_32_tab[(crc ^ *bin_data++) & 0xff] ^ (crc >> 8); - /* Note: (crc >> 8) MUST zero fill on left */ - } - - result = (crc ^ 0xFFFFFFFF); - return result & 0xffffffff; -} -#endif /* USE_ZLIB_CRC32 */ /*[clinic input] binascii.b2a_hex diff --git a/third_party/python/Modules/cjkcodecs/_codecs_cn.c b/third_party/python/Modules/cjkcodecs/_codecs_cn.c index 1fcc220b8..cd4ce7150 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_cn.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_cn.c @@ -1,11 +1,13 @@ +/* clang-format off */ + /* * _codecs_cn.c: Codecs collection for Mainland Chinese encodings * * Written by Hye-Shik Chang */ -#include "cjkcodecs.h" -#include "mappings_cn.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/mappings_cn.inc" /** * hz is predefined as 100 on AIX. So we undefine it to avoid diff --git a/third_party/python/Modules/cjkcodecs/_codecs_hk.c b/third_party/python/Modules/cjkcodecs/_codecs_hk.c index 4f21569a0..84b851fb8 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_hk.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_hk.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * _codecs_hk.c: Codecs collection for encodings from Hong Kong * @@ -6,8 +7,8 @@ #define USING_IMPORTED_MAPS -#include "cjkcodecs.h" -#include "mappings_hk.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/mappings_hk.inc" /* * BIG5HKSCS codec diff --git a/third_party/python/Modules/cjkcodecs/_codecs_iso2022.c b/third_party/python/Modules/cjkcodecs/_codecs_iso2022.c index 7394cf67e..82ab9379c 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_iso2022.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_iso2022.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * _codecs_iso2022.c: Codecs collection for ISO-2022 encodings. * @@ -10,10 +11,10 @@ #define EMULATE_JISX0213_2000_ENCODE_INVALID MAP_UNMAPPABLE #define EMULATE_JISX0213_2000_DECODE_INVALID MAP_UNMAPPABLE -#include "cjkcodecs.h" -#include "alg_jisx0201.h" -#include "emu_jisx0213_2000.h" -#include "mappings_jisx0213_pair.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/alg_jisx0201.inc" +#include "third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.inc" +#include "third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.inc" /* STATE diff --git a/third_party/python/Modules/cjkcodecs/_codecs_jp.c b/third_party/python/Modules/cjkcodecs/_codecs_jp.c index 3a332953b..a8c6a4b50 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_jp.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_jp.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * _codecs_jp.c: Codecs collection for Japanese encodings * @@ -7,11 +8,11 @@ #define USING_BINARY_PAIR_SEARCH #define EMPBASE 0x20000 -#include "cjkcodecs.h" -#include "mappings_jp.h" -#include "mappings_jisx0213_pair.h" -#include "alg_jisx0201.h" -#include "emu_jisx0213_2000.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/mappings_jp.inc" +#include "third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.inc" +#include "third_party/python/Modules/cjkcodecs/alg_jisx0201.inc" +#include "third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.inc" /* * CP932 codec diff --git a/third_party/python/Modules/cjkcodecs/_codecs_kr.c b/third_party/python/Modules/cjkcodecs/_codecs_kr.c index 6d6acb5c4..22ca4bc51 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_kr.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_kr.c @@ -1,11 +1,12 @@ +/* clang-format off */ /* * _codecs_kr.c: Codecs collection for Korean encodings * * Written by Hye-Shik Chang */ -#include "cjkcodecs.h" -#include "mappings_kr.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/mappings_kr.inc" /* * EUC-KR codec diff --git a/third_party/python/Modules/cjkcodecs/_codecs_tw.c b/third_party/python/Modules/cjkcodecs/_codecs_tw.c index 722b26b12..2189f0be2 100644 --- a/third_party/python/Modules/cjkcodecs/_codecs_tw.c +++ b/third_party/python/Modules/cjkcodecs/_codecs_tw.c @@ -1,11 +1,12 @@ +/* clang-format off */ /* * _codecs_tw.c: Codecs collection for Taiwan's encodings * * Written by Hye-Shik Chang */ -#include "cjkcodecs.h" -#include "mappings_tw.h" +#include "third_party/python/Modules/cjkcodecs/cjkcodecs.h" +#include "third_party/python/Modules/cjkcodecs/mappings_tw.inc" /* * BIG5 codec diff --git a/third_party/python/Modules/cjkcodecs/alg_jisx0201.h b/third_party/python/Modules/cjkcodecs/alg_jisx0201.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/alg_jisx0201.h rename to third_party/python/Modules/cjkcodecs/alg_jisx0201.inc index 3034b5ab9..74cd12cba 100644 --- a/third_party/python/Modules/cjkcodecs/alg_jisx0201.h +++ b/third_party/python/Modules/cjkcodecs/alg_jisx0201.inc @@ -1,3 +1,5 @@ +/* clang-format off */ + #define JISX0201_R_ENCODE(c, assi) \ if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e) { \ (assi) = (c); \ diff --git a/third_party/python/Modules/cjkcodecs/cjkcodecs.h b/third_party/python/Modules/cjkcodecs/cjkcodecs.h index 2ae28ecbe..9a1e5078b 100644 --- a/third_party/python/Modules/cjkcodecs/cjkcodecs.h +++ b/third_party/python/Modules/cjkcodecs/cjkcodecs.h @@ -1,15 +1,16 @@ +#ifndef _CJKCODECS_H_ +#define _CJKCODECS_H_ +/* clang-format off */ + /* * cjkcodecs.h: common header for cjkcodecs * * Written by Hye-Shik Chang */ -#ifndef _CJKCODECS_H_ -#define _CJKCODECS_H_ - #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "multibytecodec.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/cjkcodecs/multibytecodec.h" /* a unicode "undefined" code point */ diff --git a/third_party/python/Modules/cjkcodecs/clinic/multibytecodec.c.h b/third_party/python/Modules/cjkcodecs/clinic/multibytecodec.inc similarity index 100% rename from third_party/python/Modules/cjkcodecs/clinic/multibytecodec.c.h rename to third_party/python/Modules/cjkcodecs/clinic/multibytecodec.inc diff --git a/third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.h b/third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.h rename to third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.inc index a5d5a7063..d57fc9a8f 100644 --- a/third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.h +++ b/third_party/python/Modules/cjkcodecs/emu_jisx0213_2000.inc @@ -1,3 +1,5 @@ +/* clang-format off */ + /* These routines may be quite inefficient, but it's used only to emulate old * standards. */ diff --git a/third_party/python/Modules/cjkcodecs/mappings_cn.h b/third_party/python/Modules/cjkcodecs/mappings_cn.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_cn.h rename to third_party/python/Modules/cjkcodecs/mappings_cn.inc index 1f8c299d2..a950839f9 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_cn.h +++ b/third_party/python/Modules/cjkcodecs/mappings_cn.inc @@ -1,3 +1,5 @@ +/* clang-format off */ + static const ucs2_t __gb2312_decmap[7482] = { 12288,12289,12290,12539,713,711,168,12291,12293,8213,65374,8214,8230,8216, 8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303, diff --git a/third_party/python/Modules/cjkcodecs/mappings_hk.h b/third_party/python/Modules/cjkcodecs/mappings_hk.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_hk.h rename to third_party/python/Modules/cjkcodecs/mappings_hk.inc index 1b1d70e7c..8faa2ebe4 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_hk.h +++ b/third_party/python/Modules/cjkcodecs/mappings_hk.inc @@ -1,3 +1,5 @@ +/* clang-format off */ + static const ucs2_t __big5hkscs_decmap[6219] = { 17392,19506,17923,17830,17784,29287,19831,17843,31921,19682,31941,15253,18230, 18244,19527,19520,17087,13847,29522,28299,28882,19543,41809,18255,17882,19589, diff --git a/third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.h b/third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.h rename to third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.inc index 729e4bcbe..8c2075f47 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.h +++ b/third_party/python/Modules/cjkcodecs/mappings_jisx0213_pair.inc @@ -1,3 +1,4 @@ +/* clang-format off */ #define JISX0213_ENCPAIRS 46 #ifdef EXTERN_JISX0213_PAIR static const struct widedbcs_index *jisx0213_pair_decmap; diff --git a/third_party/python/Modules/cjkcodecs/mappings_jp.h b/third_party/python/Modules/cjkcodecs/mappings_jp.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_jp.h rename to third_party/python/Modules/cjkcodecs/mappings_jp.inc index c6dae3daa..2f32d5a4a 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_jp.h +++ b/third_party/python/Modules/cjkcodecs/mappings_jp.inc @@ -1,3 +1,4 @@ +/* clang-format off */ static const ucs2_t __jisx0208_decmap[6956] = { 12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180, 65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294, diff --git a/third_party/python/Modules/cjkcodecs/mappings_kr.h b/third_party/python/Modules/cjkcodecs/mappings_kr.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_kr.h rename to third_party/python/Modules/cjkcodecs/mappings_kr.inc index 7e6fdd270..dae0e511d 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_kr.h +++ b/third_party/python/Modules/cjkcodecs/mappings_kr.inc @@ -1,3 +1,4 @@ +/* clang-format off */ static const ucs2_t __ksx1001_decmap[8264] = { 12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217, 8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304, diff --git a/third_party/python/Modules/cjkcodecs/mappings_tw.h b/third_party/python/Modules/cjkcodecs/mappings_tw.inc similarity index 99% rename from third_party/python/Modules/cjkcodecs/mappings_tw.h rename to third_party/python/Modules/cjkcodecs/mappings_tw.inc index ec3f9f746..3ad4b2d7d 100644 --- a/third_party/python/Modules/cjkcodecs/mappings_tw.h +++ b/third_party/python/Modules/cjkcodecs/mappings_tw.inc @@ -1,3 +1,4 @@ +/* clang-format off */ static const ucs2_t __big5_decmap[16702] = { 12288,65292,12289,12290,65294,8226,65307,65306,65311,65281,65072,8230,8229, 65104,65380,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075, diff --git a/third_party/python/Modules/cjkcodecs/multibytecodec.c b/third_party/python/Modules/cjkcodecs/multibytecodec.c index e85ec56e0..a4802a4a2 100644 --- a/third_party/python/Modules/cjkcodecs/multibytecodec.c +++ b/third_party/python/Modules/cjkcodecs/multibytecodec.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * multibytecodec.c: Common Multibyte Codec Implementation * @@ -5,10 +6,10 @@ */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "multibytecodec.h" -#include "clinic/multibytecodec.c.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/cjkcodecs/multibytecodec.h" +#include "third_party/python/Modules/cjkcodecs/clinic/multibytecodec.inc" /*[clinic input] module _multibytecodec diff --git a/third_party/python/Modules/cjkcodecs/multibytecodec.h b/third_party/python/Modules/cjkcodecs/multibytecodec.h index 5b8c22276..1a270ce56 100644 --- a/third_party/python/Modules/cjkcodecs/multibytecodec.h +++ b/third_party/python/Modules/cjkcodecs/multibytecodec.h @@ -1,14 +1,15 @@ -/* - * multibytecodec.h: Common Multibyte Codec Implementation - * - * Written by Hye-Shik Chang - */ - #ifndef _PYTHON_MULTIBYTECODEC_H_ #define _PYTHON_MULTIBYTECODEC_H_ #ifdef __cplusplus extern "C" { #endif +/* clang-format off */ + +/* + * multibytecodec.h: Common Multibyte Codec Implementation + * + * Written by Hye-Shik Chang + */ #ifdef uint16_t typedef uint16_t ucs2_t, DBCHAR; diff --git a/third_party/python/Modules/clinic/_asynciomodule.c.h b/third_party/python/Modules/clinic/_asynciomodule.inc similarity index 99% rename from third_party/python/Modules/clinic/_asynciomodule.c.h rename to third_party/python/Modules/clinic/_asynciomodule.inc index 62bf8e7a9..889450525 100644 --- a/third_party/python/Modules/clinic/_asynciomodule.c.h +++ b/third_party/python/Modules/clinic/_asynciomodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_bz2module.c.h b/third_party/python/Modules/clinic/_bz2module.inc similarity index 99% rename from third_party/python/Modules/clinic/_bz2module.c.h rename to third_party/python/Modules/clinic/_bz2module.inc index 1ca810c9e..bc48c3f0e 100644 --- a/third_party/python/Modules/clinic/_bz2module.c.h +++ b/third_party/python/Modules/clinic/_bz2module.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_codecsmodule.c.h b/third_party/python/Modules/clinic/_codecsmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/_codecsmodule.c.h rename to third_party/python/Modules/clinic/_codecsmodule.inc index 056287d06..f90a4543c 100644 --- a/third_party/python/Modules/clinic/_codecsmodule.c.h +++ b/third_party/python/Modules/clinic/_codecsmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_cryptmodule.c.h b/third_party/python/Modules/clinic/_cryptmodule.inc similarity index 97% rename from third_party/python/Modules/clinic/_cryptmodule.c.h rename to third_party/python/Modules/clinic/_cryptmodule.inc index 412c6fe8a..0947a62ab 100644 --- a/third_party/python/Modules/clinic/_cryptmodule.c.h +++ b/third_party/python/Modules/clinic/_cryptmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_cursesmodule.c.h b/third_party/python/Modules/clinic/_cursesmodule.inc similarity index 98% rename from third_party/python/Modules/clinic/_cursesmodule.c.h rename to third_party/python/Modules/clinic/_cursesmodule.inc index 62ff1c8ae..1bbf0098e 100644 --- a/third_party/python/Modules/clinic/_cursesmodule.c.h +++ b/third_party/python/Modules/clinic/_cursesmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_datetimemodule.c.h b/third_party/python/Modules/clinic/_datetimemodule.inc similarity index 97% rename from third_party/python/Modules/clinic/_datetimemodule.c.h rename to third_party/python/Modules/clinic/_datetimemodule.inc index dcb992b1a..135bc4f0a 100644 --- a/third_party/python/Modules/clinic/_datetimemodule.c.h +++ b/third_party/python/Modules/clinic/_datetimemodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_dbmmodule.c.h b/third_party/python/Modules/clinic/_dbmmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/_dbmmodule.c.h rename to third_party/python/Modules/clinic/_dbmmodule.inc index 9a35311d1..e870110b4 100644 --- a/third_party/python/Modules/clinic/_dbmmodule.c.h +++ b/third_party/python/Modules/clinic/_dbmmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_elementtree.c.h b/third_party/python/Modules/clinic/_elementtree.inc similarity index 99% rename from third_party/python/Modules/clinic/_elementtree.c.h rename to third_party/python/Modules/clinic/_elementtree.inc index 1b309cd88..cf53c6d6f 100644 --- a/third_party/python/Modules/clinic/_elementtree.c.h +++ b/third_party/python/Modules/clinic/_elementtree.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_gdbmmodule.c.h b/third_party/python/Modules/clinic/_gdbmmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/_gdbmmodule.c.h rename to third_party/python/Modules/clinic/_gdbmmodule.inc index 1030d7059..639a4174e 100644 --- a/third_party/python/Modules/clinic/_gdbmmodule.c.h +++ b/third_party/python/Modules/clinic/_gdbmmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_hashopenssl.c.h b/third_party/python/Modules/clinic/_hashopenssl.inc similarity index 98% rename from third_party/python/Modules/clinic/_hashopenssl.c.h rename to third_party/python/Modules/clinic/_hashopenssl.inc index 044535260..86b50a9db 100644 --- a/third_party/python/Modules/clinic/_hashopenssl.c.h +++ b/third_party/python/Modules/clinic/_hashopenssl.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_lzmamodule.c.h b/third_party/python/Modules/clinic/_lzmamodule.inc similarity index 99% rename from third_party/python/Modules/clinic/_lzmamodule.c.h rename to third_party/python/Modules/clinic/_lzmamodule.inc index 9e6075954..8c9d18b75 100644 --- a/third_party/python/Modules/clinic/_lzmamodule.c.h +++ b/third_party/python/Modules/clinic/_lzmamodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_opcode.c.h b/third_party/python/Modules/clinic/_opcode.inc similarity index 97% rename from third_party/python/Modules/clinic/_opcode.c.h rename to third_party/python/Modules/clinic/_opcode.inc index 513cbfdad..2646dfef0 100644 --- a/third_party/python/Modules/clinic/_opcode.c.h +++ b/third_party/python/Modules/clinic/_opcode.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_pickle.c.h b/third_party/python/Modules/clinic/_pickle.inc similarity index 99% rename from third_party/python/Modules/clinic/_pickle.c.h rename to third_party/python/Modules/clinic/_pickle.inc index 9ad4c37f4..1f86e257b 100644 --- a/third_party/python/Modules/clinic/_pickle.c.h +++ b/third_party/python/Modules/clinic/_pickle.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_sre.c.h b/third_party/python/Modules/clinic/_sre.inc similarity index 99% rename from third_party/python/Modules/clinic/_sre.c.h rename to third_party/python/Modules/clinic/_sre.inc index 0612005d1..6664475e7 100644 --- a/third_party/python/Modules/clinic/_sre.c.h +++ b/third_party/python/Modules/clinic/_sre.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_ssl.c.h b/third_party/python/Modules/clinic/_ssl.inc similarity index 99% rename from third_party/python/Modules/clinic/_ssl.c.h rename to third_party/python/Modules/clinic/_ssl.inc index c9206a684..185fbe1c4 100644 --- a/third_party/python/Modules/clinic/_ssl.c.h +++ b/third_party/python/Modules/clinic/_ssl.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_tkinter.c.h b/third_party/python/Modules/clinic/_tkinter.inc similarity index 99% rename from third_party/python/Modules/clinic/_tkinter.c.h rename to third_party/python/Modules/clinic/_tkinter.inc index c407f17da..2638dcca8 100644 --- a/third_party/python/Modules/clinic/_tkinter.c.h +++ b/third_party/python/Modules/clinic/_tkinter.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_weakref.c.h b/third_party/python/Modules/clinic/_weakref.inc similarity index 98% rename from third_party/python/Modules/clinic/_weakref.c.h rename to third_party/python/Modules/clinic/_weakref.inc index ab84c304d..bad7e1033 100644 --- a/third_party/python/Modules/clinic/_weakref.c.h +++ b/third_party/python/Modules/clinic/_weakref.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/_winapi.c.h b/third_party/python/Modules/clinic/_winapi.inc similarity index 99% rename from third_party/python/Modules/clinic/_winapi.c.h rename to third_party/python/Modules/clinic/_winapi.inc index feb98bc79..7c50a9685 100644 --- a/third_party/python/Modules/clinic/_winapi.c.h +++ b/third_party/python/Modules/clinic/_winapi.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/arraymodule.c.h b/third_party/python/Modules/clinic/arraymodule.inc similarity index 99% rename from third_party/python/Modules/clinic/arraymodule.c.h rename to third_party/python/Modules/clinic/arraymodule.inc index 3b9fcdab0..9df40c526 100644 --- a/third_party/python/Modules/clinic/arraymodule.c.h +++ b/third_party/python/Modules/clinic/arraymodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/audioop.c.h b/third_party/python/Modules/clinic/audioop.inc similarity index 99% rename from third_party/python/Modules/clinic/audioop.c.h rename to third_party/python/Modules/clinic/audioop.inc index be4b71884..d9a51f19c 100644 --- a/third_party/python/Modules/clinic/audioop.c.h +++ b/third_party/python/Modules/clinic/audioop.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/binascii.c.h b/third_party/python/Modules/clinic/binascii.inc similarity index 99% rename from third_party/python/Modules/clinic/binascii.c.h rename to third_party/python/Modules/clinic/binascii.inc index 743bf46ea..d04ae7dfd 100644 --- a/third_party/python/Modules/clinic/binascii.c.h +++ b/third_party/python/Modules/clinic/binascii.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/cmathmodule.c.h b/third_party/python/Modules/clinic/cmathmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/cmathmodule.c.h rename to third_party/python/Modules/clinic/cmathmodule.inc index 05431fa7a..272b89ce4 100644 --- a/third_party/python/Modules/clinic/cmathmodule.c.h +++ b/third_party/python/Modules/clinic/cmathmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/fcntlmodule.c.h b/third_party/python/Modules/clinic/fcntlmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/fcntlmodule.c.h rename to third_party/python/Modules/clinic/fcntlmodule.inc index 84a004bb5..15d5f8312 100644 --- a/third_party/python/Modules/clinic/fcntlmodule.c.h +++ b/third_party/python/Modules/clinic/fcntlmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/grpmodule.c.h b/third_party/python/Modules/clinic/grpmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/grpmodule.c.h rename to third_party/python/Modules/clinic/grpmodule.inc index 0282b4e47..63744fce2 100644 --- a/third_party/python/Modules/clinic/grpmodule.c.h +++ b/third_party/python/Modules/clinic/grpmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/md5module.c.h b/third_party/python/Modules/clinic/md5module.inc similarity index 99% rename from third_party/python/Modules/clinic/md5module.c.h rename to third_party/python/Modules/clinic/md5module.inc index 8a1086098..058fd6f89 100644 --- a/third_party/python/Modules/clinic/md5module.c.h +++ b/third_party/python/Modules/clinic/md5module.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/posixmodule.c.h b/third_party/python/Modules/clinic/posixmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/posixmodule.c.h rename to third_party/python/Modules/clinic/posixmodule.inc index e615e00b3..7200f9fad 100644 --- a/third_party/python/Modules/clinic/posixmodule.c.h +++ b/third_party/python/Modules/clinic/posixmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/pwdmodule.c.h b/third_party/python/Modules/clinic/pwdmodule.inc similarity index 98% rename from third_party/python/Modules/clinic/pwdmodule.c.h rename to third_party/python/Modules/clinic/pwdmodule.inc index f9e0644f2..5141179b4 100644 --- a/third_party/python/Modules/clinic/pwdmodule.c.h +++ b/third_party/python/Modules/clinic/pwdmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/pyexpat.c.h b/third_party/python/Modules/clinic/pyexpat.inc similarity index 99% rename from third_party/python/Modules/clinic/pyexpat.c.h rename to third_party/python/Modules/clinic/pyexpat.inc index 75a096cdf..b85606a6a 100644 --- a/third_party/python/Modules/clinic/pyexpat.c.h +++ b/third_party/python/Modules/clinic/pyexpat.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/sha1module.c.h b/third_party/python/Modules/clinic/sha1module.inc similarity index 99% rename from third_party/python/Modules/clinic/sha1module.c.h rename to third_party/python/Modules/clinic/sha1module.inc index 71b4a3482..6868f5318 100644 --- a/third_party/python/Modules/clinic/sha1module.c.h +++ b/third_party/python/Modules/clinic/sha1module.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/sha256module.c.h b/third_party/python/Modules/clinic/sha256module.inc similarity index 99% rename from third_party/python/Modules/clinic/sha256module.c.h rename to third_party/python/Modules/clinic/sha256module.inc index bf609bec2..8f1e7d847 100644 --- a/third_party/python/Modules/clinic/sha256module.c.h +++ b/third_party/python/Modules/clinic/sha256module.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/sha512module.c.h b/third_party/python/Modules/clinic/sha512module.inc similarity index 99% rename from third_party/python/Modules/clinic/sha512module.c.h rename to third_party/python/Modules/clinic/sha512module.inc index 264c9f432..e0158c2e9 100644 --- a/third_party/python/Modules/clinic/sha512module.c.h +++ b/third_party/python/Modules/clinic/sha512module.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/signalmodule.c.h b/third_party/python/Modules/clinic/signalmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/signalmodule.c.h rename to third_party/python/Modules/clinic/signalmodule.inc index f8d5bd942..507567dd9 100644 --- a/third_party/python/Modules/clinic/signalmodule.c.h +++ b/third_party/python/Modules/clinic/signalmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/spwdmodule.c.h b/third_party/python/Modules/clinic/spwdmodule.inc similarity index 98% rename from third_party/python/Modules/clinic/spwdmodule.c.h rename to third_party/python/Modules/clinic/spwdmodule.inc index b2479ff24..20d4735a3 100644 --- a/third_party/python/Modules/clinic/spwdmodule.c.h +++ b/third_party/python/Modules/clinic/spwdmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/unicodedata.c.h b/third_party/python/Modules/clinic/unicodedata.inc similarity index 99% rename from third_party/python/Modules/clinic/unicodedata.c.h rename to third_party/python/Modules/clinic/unicodedata.inc index d481ccbe6..3ba4f988f 100644 --- a/third_party/python/Modules/clinic/unicodedata.c.h +++ b/third_party/python/Modules/clinic/unicodedata.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/clinic/zlibmodule.c.h b/third_party/python/Modules/clinic/zlibmodule.inc similarity index 99% rename from third_party/python/Modules/clinic/zlibmodule.c.h rename to third_party/python/Modules/clinic/zlibmodule.inc index 7339596d2..242bb34c0 100644 --- a/third_party/python/Modules/clinic/zlibmodule.c.h +++ b/third_party/python/Modules/clinic/zlibmodule.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /*[clinic input] preserve [clinic start generated code]*/ diff --git a/third_party/python/Modules/cmathmodule.c b/third_party/python/Modules/cmathmodule.c index 8319767b8..6c2191054 100644 --- a/third_party/python/Modules/cmathmodule.c +++ b/third_party/python/Modules/cmathmodule.c @@ -1,14 +1,14 @@ +/* clang-format off */ /* Complex math module */ /* much code borrowed from mathmodule.c */ -#include "Python.h" -#include "_math.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/_math.h" /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ -#include -#include "clinic/cmathmodule.c.h" +#include "third_party/python/Modules/clinic/cmathmodule.inc" /*[clinic input] module cmath [clinic start generated code]*/ @@ -46,14 +46,6 @@ else { #error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16" #endif -#ifndef M_LN2 -#define M_LN2 (0.6931471805599453094) /* natural log of 2 */ -#endif - -#ifndef M_LN10 -#define M_LN10 (2.302585092994045684) /* natural log of 10 */ -#endif - /* CM_LARGE_DOUBLE is used to avoid spurious overflow in the sqrt, log, inverse trig and inverse hyperbolic trig functions. Its log is used in the diff --git a/third_party/python/Modules/config.c b/third_party/python/Modules/config.c index 0ba8e04bb..9f431d003 100644 --- a/third_party/python/Modules/config.c +++ b/third_party/python/Modules/config.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Generated automatically from ./Modules/config.c.in by makesetup. */ /* -*- C -*- *********************************************** Copyright (c) 2000, BeOpen.com. @@ -16,12 +17,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. /* This file contains the table of built-in modules. See create_builtin() in import.c. */ -#include "Python.h" - -#ifdef __cplusplus -extern "C" { -#endif - +#include "third_party/python/Include/Python.h" extern PyObject* PyInit__decimal(void); extern PyObject* PyInit_posix(void); @@ -189,8 +185,3 @@ struct _inittab _PyImport_Inittab[] = { /* Sentinel */ {0, 0} }; - - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/config.c.in b/third_party/python/Modules/config.c.in index 7b77199c2..d93fe5a63 100644 --- a/third_party/python/Modules/config.c.in +++ b/third_party/python/Modules/config.c.in @@ -1,3 +1,4 @@ +/* clang-format off */ /* -*- C -*- *********************************************** Copyright (c) 2000, BeOpen.com. Copyright (c) 1995-2000, Corporation for National Research Initiatives. diff --git a/third_party/python/Modules/errnomodule.c b/third_party/python/Modules/errnomodule.c index 06ed53a64..248b93f72 100644 --- a/third_party/python/Modules/errnomodule.c +++ b/third_party/python/Modules/errnomodule.c @@ -1,40 +1,5 @@ - -/* Errno module */ - -#include "Python.h" - -/* Windows socket errors (WSA*) */ -#ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -/* The following constants were added to errno.h in VS2010 but have - preferred WSA equivalents. */ -#undef EADDRINUSE -#undef EADDRNOTAVAIL -#undef EAFNOSUPPORT -#undef EALREADY -#undef ECONNABORTED -#undef ECONNREFUSED -#undef ECONNRESET -#undef EDESTADDRREQ -#undef EHOSTUNREACH -#undef EINPROGRESS -#undef EISCONN -#undef ELOOP -#undef EMSGSIZE -#undef ENETDOWN -#undef ENETRESET -#undef ENETUNREACH -#undef ENOBUFS -#undef ENOPROTOOPT -#undef ENOTCONN -#undef ENOTSOCK -#undef EOPNOTSUPP -#undef EPROTONOSUPPORT -#undef EPROTOTYPE -#undef ETIMEDOUT -#undef EWOULDBLOCK -#endif +/* clang-format off */ +#include "third_party/python/Include/Python.h" /* * Pull in the system error definitions diff --git a/third_party/python/Modules/expat/ascii.h b/third_party/python/Modules/expat/ascii.h index c3587e573..814a4a02a 100644 --- a/third_party/python/Modules/expat/ascii.h +++ b/third_party/python/Modules/expat/ascii.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ @@ -95,26 +96,26 @@ #define ASCII_8 0x38 #define ASCII_9 0x39 -#define ASCII_TAB 0x09 -#define ASCII_SPACE 0x20 -#define ASCII_EXCL 0x21 -#define ASCII_QUOT 0x22 -#define ASCII_AMP 0x26 -#define ASCII_APOS 0x27 -#define ASCII_MINUS 0x2D -#define ASCII_PERIOD 0x2E -#define ASCII_COLON 0x3A -#define ASCII_SEMI 0x3B -#define ASCII_LT 0x3C -#define ASCII_EQUALS 0x3D -#define ASCII_GT 0x3E -#define ASCII_LSQB 0x5B -#define ASCII_RSQB 0x5D +#define ASCII_TAB 0x09 +#define ASCII_SPACE 0x20 +#define ASCII_EXCL 0x21 +#define ASCII_QUOT 0x22 +#define ASCII_AMP 0x26 +#define ASCII_APOS 0x27 +#define ASCII_MINUS 0x2D +#define ASCII_PERIOD 0x2E +#define ASCII_COLON 0x3A +#define ASCII_SEMI 0x3B +#define ASCII_LT 0x3C +#define ASCII_EQUALS 0x3D +#define ASCII_GT 0x3E +#define ASCII_LSQB 0x5B +#define ASCII_RSQB 0x5D #define ASCII_UNDERSCORE 0x5F -#define ASCII_LPAREN 0x28 -#define ASCII_RPAREN 0x29 -#define ASCII_FF 0x0C -#define ASCII_SLASH 0x2F -#define ASCII_HASH 0x23 -#define ASCII_PIPE 0x7C -#define ASCII_COMMA 0x2C +#define ASCII_LPAREN 0x28 +#define ASCII_RPAREN 0x29 +#define ASCII_FF 0x0C +#define ASCII_SLASH 0x2F +#define ASCII_HASH 0x23 +#define ASCII_PIPE 0x7C +#define ASCII_COMMA 0x2C diff --git a/third_party/python/Modules/expat/asciitab.h b/third_party/python/Modules/expat/asciitab.h index 63b1d1b44..a82ae5169 100644 --- a/third_party/python/Modules/expat/asciitab.h +++ b/third_party/python/Modules/expat/asciitab.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/expat.h b/third_party/python/Modules/expat/expat.h index 6c8eb1fda..09fe13faa 100644 --- a/third_party/python/Modules/expat/expat.h +++ b/third_party/python/Modules/expat/expat.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ @@ -33,7 +34,6 @@ #ifndef Expat_INCLUDED #define Expat_INCLUDED 1 -#include #include "expat_external.h" #ifdef __cplusplus diff --git a/third_party/python/Modules/expat/expat_config.h b/third_party/python/Modules/expat/expat_config.h index b8c1639b9..db09f0e97 100644 --- a/third_party/python/Modules/expat/expat_config.h +++ b/third_party/python/Modules/expat/expat_config.h @@ -1,19 +1,15 @@ -/* - * Expat configuration for python. This file is not part of the expat - * distribution. - */ #ifndef EXPAT_CONFIG_H #define EXPAT_CONFIG_H +#include "third_party/python/pyconfig.h" -#include #ifdef WORDS_BIGENDIAN #define BYTEORDER 4321 #else #define BYTEORDER 1234 #endif -#define XML_NS 1 -#define XML_DTD 1 +#define XML_NS 1 +#define XML_DTD 1 #define XML_CONTEXT_BYTES 1024 #endif /* EXPAT_CONFIG_H */ diff --git a/third_party/python/Modules/expat/expat_external.h b/third_party/python/Modules/expat/expat_external.h index f2b75dda8..2997880ad 100644 --- a/third_party/python/Modules/expat/expat_external.h +++ b/third_party/python/Modules/expat/expat_external.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/iasciitab.h b/third_party/python/Modules/expat/iasciitab.h index ea97cfcf6..e1e272e0b 100644 --- a/third_party/python/Modules/expat/iasciitab.h +++ b/third_party/python/Modules/expat/iasciitab.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/internal.h b/third_party/python/Modules/expat/internal.h index 60913dab7..86622e32a 100644 --- a/third_party/python/Modules/expat/internal.h +++ b/third_party/python/Modules/expat/internal.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* internal.h Internal definitions used by Expat. This is not needed to compile diff --git a/third_party/python/Modules/expat/latin1tab.h b/third_party/python/Modules/expat/latin1tab.h index 6f9160413..976456539 100644 --- a/third_party/python/Modules/expat/latin1tab.h +++ b/third_party/python/Modules/expat/latin1tab.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/nametab.h b/third_party/python/Modules/expat/nametab.h index 3681df348..63ecd2e7f 100644 --- a/third_party/python/Modules/expat/nametab.h +++ b/third_party/python/Modules/expat/nametab.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/pyexpatns.h b/third_party/python/Modules/expat/pyexpatns.h index 999c5c730..5219f7bba 100644 --- a/third_party/python/Modules/expat/pyexpatns.h +++ b/third_party/python/Modules/expat/pyexpatns.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* Copyright (c) 2005-2006 ActiveState Software Inc. * * Namespace all expat exported symbols to avoid dynamic loading symbol diff --git a/third_party/python/Modules/expat/siphash.h b/third_party/python/Modules/expat/siphash.h index bfee65a33..04c64e0d2 100644 --- a/third_party/python/Modules/expat/siphash.h +++ b/third_party/python/Modules/expat/siphash.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* ========================================================================== * siphash.h - SipHash-2-4 in a single header file * -------------------------------------------------------------------------- @@ -95,17 +96,6 @@ #ifndef SIPHASH_H #define SIPHASH_H -#include /* size_t */ - -#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600) -/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */ -typedef unsigned __int8 uint8_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -#else -# include /* uint64_t uint32_t uint8_t */ -#endif - /* * Workaround to not require a C++11 compiler for using ULL suffix * if this code is included and compiled as C++; related GCC warning is: @@ -370,8 +360,7 @@ sip24_valid(void) { for (i = 0; i < sizeof in; ++i) { in[i] = (unsigned char)i; - if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i])) - return 0; + if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i])) return 0; } return 1; @@ -379,10 +368,9 @@ sip24_valid(void) { #ifdef SIPHASH_MAIN -# include +#include -int -main(void) { +int main(void) { const int ok = sip24_valid(); if (ok) @@ -390,7 +378,7 @@ main(void) { else puts("FAIL"); - return ! ok; + return !ok; } /* main() */ #endif /* SIPHASH_MAIN */ diff --git a/third_party/python/Modules/expat/utf8tab.h b/third_party/python/Modules/expat/utf8tab.h index a22986acb..7d8391bf1 100644 --- a/third_party/python/Modules/expat/utf8tab.h +++ b/third_party/python/Modules/expat/utf8tab.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/winconfig.h b/third_party/python/Modules/expat/winconfig.h index 562a4a82d..0cfdd9ba7 100644 --- a/third_party/python/Modules/expat/winconfig.h +++ b/third_party/python/Modules/expat/winconfig.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/xmlparse.c b/third_party/python/Modules/expat/xmlparse.c index e740f0e19..2ec05eb69 100644 --- a/third_party/python/Modules/expat/xmlparse.c +++ b/third_party/python/Modules/expat/xmlparse.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* f2d0ab6d1d4422a08cf1cf3bbdfba96b49dea42fb5ff4615e03a2a25c306e769 (2.2.8+) __ __ _ ___\ \/ /_ __ __ _| |_ @@ -30,133 +31,85 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if ! defined(_GNU_SOURCE) -# define _GNU_SOURCE 1 /* syscall prototype */ +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE 1 /* syscall prototype */ #endif #ifdef _WIN32 /* force stdlib to define rand_s() */ -# define _CRT_RAND_S -#endif - -#include -#include /* memset(), memcpy() */ -#include -#include /* UINT_MAX */ -#include /* fprintf */ -#include /* getenv, rand_s */ - -#ifdef _WIN32 -# define getpid GetCurrentProcessId -#else -# include /* gettimeofday() */ -# include /* getpid() */ -# include /* getpid() */ -# include /* O_RDONLY */ -# include +#define _CRT_RAND_S #endif #define XML_BUILDING_EXPAT 1 -#ifdef _WIN32 -# include "winconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -# include -#endif /* ndef _WIN32 */ +#ifdef HAVE_EXPAT_CONFIG_H +#include "libc/sysv/consts/grnd.h" +#include "libc/rand/rand.h" +#include "libc/errno.h" +#include "libc/calls/struct/timeval.h" +#include "libc/time/time.h" +#include "libc/runtime/runtime.h" +#include "libc/str/str.h" +#include "libc/stdio/stdio.h" +#include "libc/stdio/stdio.h" +#include "libc/calls/calls.h" +#include "libc/assert.h" +#include "libc/limits.h" +#include "expat_config.h" +#endif #include "ascii.h" #include "expat.h" #include "siphash.h" -#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) -# if defined(HAVE_GETRANDOM) -# include /* getrandom */ -# else -# include /* syscall */ -# include /* SYS_getrandom */ -# endif -# if ! defined(GRND_NONBLOCK) -# define GRND_NONBLOCK 0x0001 -# endif /* defined(GRND_NONBLOCK) */ -#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ - -#if defined(HAVE_LIBBSD) \ - && (defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_ARC4RANDOM)) -# include -#endif - -#if defined(_WIN32) && ! defined(LOAD_LIBRARY_SEARCH_SYSTEM32) -# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 -#endif - -#if ! defined(HAVE_GETRANDOM) && ! defined(HAVE_SYSCALL_GETRANDOM) \ - && ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) \ - && ! defined(XML_DEV_URANDOM) && ! defined(_WIN32) \ - && ! defined(XML_POOR_ENTROPY) -# error You do not have support for any sources of high quality entropy \ - enabled. For end user security, that is probably not what you want. \ - \ - Your options include: \ - * Linux + glibc >=2.25 (getrandom): HAVE_GETRANDOM, \ - * Linux + glibc <2.25 (syscall SYS_getrandom): HAVE_SYSCALL_GETRANDOM, \ - * BSD / macOS >=10.7 (arc4random_buf): HAVE_ARC4RANDOM_BUF, \ - * BSD / macOS <10.7 (arc4random): HAVE_ARC4RANDOM, \ - * libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \ - * libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \ - * Linux / BSD / macOS (/dev/urandom): XML_DEV_URANDOM \ - * Windows (rand_s): _WIN32. \ - \ - If insist on not using any of these, bypass this error by defining \ - XML_POOR_ENTROPY; you have been warned. \ - \ - If you have reasons to patch this detection code away or need changes \ - to the build system, please open a bug. Thank you! +#if defined(_WIN32) && !defined(LOAD_LIBRARY_SEARCH_SYSTEM32) +#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 #endif #ifdef XML_UNICODE -# define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -# define XmlConvert XmlUtf16Convert -# define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -# define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -# define XmlEncode XmlUtf16Encode +#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +#define XmlConvert XmlUtf16Convert +#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +#define XmlEncode XmlUtf16Encode /* Using pointer subtraction to convert to integer type. */ -# define MUST_CONVERT(enc, s) \ - (! (enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) +#define MUST_CONVERT(enc, s) \ + (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) typedef unsigned short ICHAR; #else -# define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -# define XmlConvert XmlUtf8Convert -# define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -# define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -# define XmlEncode XmlUtf8Encode -# define MUST_CONVERT(enc, s) (! (enc)->isUtf8) +#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +#define XmlConvert XmlUtf8Convert +#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +#define XmlEncode XmlUtf8Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) typedef char ICHAR; #endif #ifndef XML_NS -# define XmlInitEncodingNS XmlInitEncoding -# define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -# undef XmlGetInternalEncodingNS -# define XmlGetInternalEncodingNS XmlGetInternalEncoding -# define XmlParseXmlDeclNS XmlParseXmlDecl +#define XmlInitEncodingNS XmlInitEncoding +#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +#undef XmlGetInternalEncodingNS +#define XmlGetInternalEncodingNS XmlGetInternalEncoding +#define XmlParseXmlDeclNS XmlParseXmlDecl #endif #ifdef XML_UNICODE -# ifdef XML_UNICODE_WCHAR_T -# define XML_T(x) (const wchar_t) x -# define XML_L(x) L##x -# else -# define XML_T(x) (const unsigned short)x -# define XML_L(x) x -# endif +#ifdef XML_UNICODE_WCHAR_T +#define XML_T(x) (const wchar_t) x +#define XML_L(x) L##x +#else +#define XML_T(x) (const unsigned short)x +#define XML_L(x) x +#endif #else -# define XML_T(x) x -# define XML_L(x) x +#define XML_T(x) x +#define XML_L(x) x #endif @@ -167,8 +120,8 @@ typedef char ICHAR; #define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0) #include "internal.h" -#include "xmltok.h" #include "xmlrole.h" +#include "xmltok.h" typedef const XML_Char *KEY; @@ -196,9 +149,9 @@ static void copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key); We limit the maximum step size to table->size / 4 (mask >> 2) and make it odd, since odd numbers are always relative prime to a power of 2. */ -#define SECOND_HASH(hash, mask, power) \ +#define SECOND_HASH(hash, mask, power) \ ((((hash) & ~(mask)) >> ((power)-1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ +#define PROBE_STEP(hash, mask, power) \ ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) typedef struct { @@ -206,12 +159,12 @@ typedef struct { NAMED **end; } HASH_TABLE_ITER; -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ #define INIT_DATA_BUF_SIZE 1024 -#define INIT_ATTS_SIZE 16 -#define INIT_ATTS_VERSION 0xFFFFFFFF -#define INIT_BLOCK_SIZE 1024 -#define INIT_BUFFER_SIZE 1024 +#define INIT_ATTS_SIZE 16 +#define INIT_ATTS_VERSION 0xFFFFFFFF +#define INIT_BLOCK_SIZE 1024 +#define INIT_BUFFER_SIZE 1024 #define EXPAND_SPARE 24 @@ -501,16 +454,16 @@ static XML_Parser parserCreate(const XML_Char *encodingName, static void parserInit(XML_Parser parser, const XML_Char *encodingName); -#define poolStart(pool) ((pool)->start) -#define poolEnd(pool) ((pool)->ptr) -#define poolLength(pool) ((pool)->ptr - (pool)->start) -#define poolChop(pool) ((void)--(pool->ptr)) +#define poolStart(pool) ((pool)->start) +#define poolEnd(pool) ((pool)->ptr) +#define poolLength(pool) ((pool)->ptr - (pool)->start) +#define poolChop(pool) ((void)--(pool->ptr)) #define poolLastChar(pool) (((pool)->ptr)[-1]) -#define poolDiscard(pool) ((pool)->ptr = (pool)->start) -#define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && ! poolGrow(pool)) \ - ? 0 \ +#define poolDiscard(pool) ((pool)->ptr = (pool)->start) +#define poolFinish(pool) ((pool)->start = (pool)->ptr) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ + ? 0 \ : ((*((pool)->ptr)++ = c), 1)) struct XML_ParserStruct { @@ -616,41 +569,39 @@ struct XML_ParserStruct { unsigned long m_hash_secret_salt; }; -#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s))) +#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s))) #define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p), (s))) -#define FREE(parser, p) (parser->m_mem.free_fcn((p))) +#define FREE(parser, p) (parser->m_mem.free_fcn((p))) -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) { +XML_Parser XMLCALL XML_ParserCreate(const XML_Char *encodingName) { return XML_ParserCreate_MM(encodingName, NULL, NULL); } -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) { +XML_Parser XMLCALL XML_ParserCreateNS(const XML_Char *encodingName, + XML_Char nsSep) { XML_Char tmp[2]; *tmp = nsSep; return XML_ParserCreate_MM(encodingName, NULL, tmp); } -static const XML_Char implicitContext[] - = {ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, - ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, - ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, - ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, - ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, - ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, - '\0'}; +static const XML_Char implicitContext[] = { + ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, + ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, + ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, + ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, + ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, + ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, + ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, + ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, + '\0'}; /* To avoid warnings about unused functions: */ -#if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) +#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_ARC4RANDOM) -# if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) +#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) /* Obtain entropy on Linux 3.17+ */ -static int -writeRandomBytes_getrandom_nonblock(void *target, size_t count) { +static int writeRandomBytes_getrandom_nonblock(void *target, size_t count) { int success = 0; /* full count bytes written? */ size_t bytesWrittenTotal = 0; const unsigned int getrandomFlags = GRND_NONBLOCK; @@ -660,29 +611,27 @@ writeRandomBytes_getrandom_nonblock(void *target, size_t count) { const size_t bytesToWrite = count - bytesWrittenTotal; const int bytesWrittenMore = -# if defined(HAVE_GETRANDOM) +#if defined(HAVE_GETRANDOM) getrandom(currentTarget, bytesToWrite, getrandomFlags); -# else +#else syscall(SYS_getrandom, currentTarget, bytesToWrite, getrandomFlags); -# endif +#endif if (bytesWrittenMore > 0) { bytesWrittenTotal += bytesWrittenMore; - if (bytesWrittenTotal >= count) - success = 1; + if (bytesWrittenTotal >= count) success = 1; } - } while (! success && (errno == EINTR)); + } while (!success && (errno == EINTR)); return success; } -# endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ +#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ -# if ! defined(_WIN32) && defined(XML_DEV_URANDOM) +#if !defined(_WIN32) && defined(XML_DEV_URANDOM) /* Extract entropy from /dev/urandom */ -static int -writeRandomBytes_dev_urandom(void *target, size_t count) { +static int writeRandomBytes_dev_urandom(void *target, size_t count) { int success = 0; /* full count bytes written? */ size_t bytesWrittenTotal = 0; @@ -699,23 +648,21 @@ writeRandomBytes_dev_urandom(void *target, size_t count) { if (bytesWrittenMore > 0) { bytesWrittenTotal += bytesWrittenMore; - if (bytesWrittenTotal >= count) - success = 1; + if (bytesWrittenTotal >= count) success = 1; } - } while (! success && (errno == EINTR)); + } while (!success && (errno == EINTR)); close(fd); return success; } -# endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ +#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ #endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ -#if defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) +#if defined(HAVE_ARC4RANDOM) && !defined(HAVE_ARC4RANDOM_BUF) -static void -writeRandomBytes_arc4random(void *target, size_t count) { +static void writeRandomBytes_arc4random(void *target, size_t count) { size_t bytesWrittenTotal = 0; while (bytesWrittenTotal < count) { @@ -738,16 +685,14 @@ writeRandomBytes_arc4random(void *target, size_t count) { * generates cryptographically secure random numbers. Internally it * uses RtlGenRandom API which is present in Windows XP and later. */ -static int -writeRandomBytes_rand_s(void *target, size_t count) { +static int writeRandomBytes_rand_s(void *target, size_t count) { size_t bytesWrittenTotal = 0; while (bytesWrittenTotal < count) { unsigned int random32 = 0; size_t i = 0; - if (rand_s(&random32)) - return 0; /* failure */ + if (rand_s(&random32)) return 0; /* failure */ for (; (i < sizeof(random32)) && (bytesWrittenTotal < count); i++, bytesWrittenTotal++) { @@ -760,45 +705,42 @@ writeRandomBytes_rand_s(void *target, size_t count) { #endif /* _WIN32 */ -#if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) +#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_ARC4RANDOM) -static unsigned long -gather_time_entropy(void) { -# ifdef _WIN32 +static unsigned long gather_time_entropy(void) { +#ifdef _WIN32 FILETIME ft; GetSystemTimeAsFileTime(&ft); /* never fails */ return ft.dwHighDateTime ^ ft.dwLowDateTime; -# else +#else struct timeval tv; int gettimeofday_res; gettimeofday_res = gettimeofday(&tv, NULL); -# if defined(NDEBUG) +#if defined(NDEBUG) (void)gettimeofday_res; -# else +#else assert(gettimeofday_res == 0); -# endif /* defined(NDEBUG) */ +#endif /* defined(NDEBUG) */ /* Microseconds time is <20 bits entropy */ return tv.tv_usec; -# endif +#endif } #endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ -static unsigned long -ENTROPY_DEBUG(const char *label, unsigned long entropy) { +static unsigned long ENTROPY_DEBUG(const char *label, unsigned long entropy) { const char *const EXPAT_ENTROPY_DEBUG = getenv("EXPAT_ENTROPY_DEBUG"); - if (EXPAT_ENTROPY_DEBUG && ! strcmp(EXPAT_ENTROPY_DEBUG, "1")) { + if (EXPAT_ENTROPY_DEBUG && !strcmp(EXPAT_ENTROPY_DEBUG, "1")) { fprintf(stderr, "Entropy: %s --> 0x%0*lx (%lu bytes)\n", label, (int)sizeof(entropy) * 2, entropy, (unsigned long)sizeof(entropy)); } return entropy; } -static unsigned long -generate_hash_secret_salt(XML_Parser parser) { +static unsigned long generate_hash_secret_salt(XML_Parser parser) { unsigned long entropy; (void)parser; @@ -811,20 +753,20 @@ generate_hash_secret_salt(XML_Parser parser) { return ENTROPY_DEBUG("arc4random", entropy); #else /* Try high quality providers first .. */ -# ifdef _WIN32 +#ifdef _WIN32 if (writeRandomBytes_rand_s((void *)&entropy, sizeof(entropy))) { return ENTROPY_DEBUG("rand_s", entropy); } -# elif defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) +#elif defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) if (writeRandomBytes_getrandom_nonblock((void *)&entropy, sizeof(entropy))) { return ENTROPY_DEBUG("getrandom", entropy); } -# endif -# if ! defined(_WIN32) && defined(XML_DEV_URANDOM) +#endif +#if !defined(_WIN32) && defined(XML_DEV_URANDOM) if (writeRandomBytes_dev_urandom((void *)&entropy, sizeof(entropy))) { return ENTROPY_DEBUG("/dev/urandom", entropy); } -# endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ +#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ /* .. and self-made low quality for backup: */ /* Process ID is 0 bits entropy if attacker has local access */ @@ -840,8 +782,7 @@ generate_hash_secret_salt(XML_Parser parser) { #endif } -static unsigned long -get_hash_secret_salt(XML_Parser parser) { +static unsigned long get_hash_secret_salt(XML_Parser parser) { if (parser->m_parentParser != NULL) return get_hash_secret_salt(parser->m_parentParser); return parser->m_hash_secret_salt; @@ -861,17 +802,15 @@ startParsing(XML_Parser parser) { return XML_TRUE; } -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) { +XML_Parser XMLCALL XML_ParserCreate_MM( + const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) { return parserCreate(encodingName, memsuite, nameSep, NULL); } -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, const XML_Char *nameSep, - DTD *dtd) { +static XML_Parser parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, DTD *dtd) { XML_Parser parser; if (memsuite) { @@ -894,30 +833,29 @@ parserCreate(const XML_Char *encodingName, } } - if (! parser) - return parser; + if (!parser) return parser; parser->m_buffer = NULL; parser->m_bufferLim = NULL; parser->m_attsSize = INIT_ATTS_SIZE; - parser->m_atts - = (ATTRIBUTE *)MALLOC(parser, parser->m_attsSize * sizeof(ATTRIBUTE)); + parser->m_atts = + (ATTRIBUTE *)MALLOC(parser, parser->m_attsSize * sizeof(ATTRIBUTE)); if (parser->m_atts == NULL) { FREE(parser, parser); return NULL; } #ifdef XML_ATTR_INFO - parser->m_attInfo = (XML_AttrInfo *)MALLOC( - parser, parser->m_attsSize * sizeof(XML_AttrInfo)); + parser->m_attInfo = + (XML_AttrInfo *)MALLOC(parser, parser->m_attsSize * sizeof(XML_AttrInfo)); if (parser->m_attInfo == NULL) { FREE(parser, parser->m_atts); FREE(parser, parser); return NULL; } #endif - parser->m_dataBuf - = (XML_Char *)MALLOC(parser, INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + parser->m_dataBuf = + (XML_Char *)MALLOC(parser, INIT_DATA_BUF_SIZE * sizeof(XML_Char)); if (parser->m_dataBuf == NULL) { FREE(parser, parser->m_atts); #ifdef XML_ATTR_INFO @@ -967,7 +905,7 @@ parserCreate(const XML_Char *encodingName, poolInit(&parser->m_temp2Pool, &(parser->m_mem)); parserInit(parser, encodingName); - if (encodingName && ! parser->m_protocolEncodingName) { + if (encodingName && !parser->m_protocolEncodingName) { XML_ParserFree(parser); return NULL; } @@ -983,8 +921,7 @@ parserCreate(const XML_Char *encodingName, return parser; } -static void -parserInit(XML_Parser parser, const XML_Char *encodingName) { +static void parserInit(XML_Parser parser, const XML_Char *encodingName) { parser->m_processor = prologInitProcessor; XmlPrologStateInit(&parser->m_prologState); if (encodingName != NULL) { @@ -1056,8 +993,8 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) { } /* moves list of bindings to m_freeBindingList */ -static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) { +static void FASTCALL moveToFreeBindingList(XML_Parser parser, + BINDING *bindings) { while (bindings) { BINDING *b = bindings; bindings = bindings->nextTagBinding; @@ -1066,16 +1003,14 @@ moveToFreeBindingList(XML_Parser parser, BINDING *bindings) { } } -XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) { +XML_Bool XMLCALL XML_ParserReset(XML_Parser parser, + const XML_Char *encodingName) { TAG *tStk; OPEN_INTERNAL_ENTITY *openEntityList; - if (parser == NULL) - return XML_FALSE; + if (parser == NULL) return XML_FALSE; - if (parser->m_parentParser) - return XML_FALSE; + if (parser->m_parentParser) return XML_FALSE; /* move m_tagStack to m_freeTagList */ tStk = parser->m_tagStack; while (tStk) { @@ -1107,29 +1042,26 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) { return XML_TRUE; } -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { - if (parser == NULL) - return XML_STATUS_ERROR; +enum XML_Status XMLCALL XML_SetEncoding(XML_Parser parser, + const XML_Char *encodingName) { + if (parser == NULL) return XML_STATUS_ERROR; /* Block after XML_Parse()/XML_ParseBuffer() has been called. XXX There's no way for the caller to determine which of the XXX possible error cases caused the XML_STATUS_ERROR return. */ - if (parser->m_parsingStatus.parsing == XML_PARSING - || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING || + parser->m_parsingStatus.parsing == XML_SUSPENDED) return XML_STATUS_ERROR; /* Get rid of any previous encoding name */ FREE(parser, (void *)parser->m_protocolEncodingName); - if (encodingName == NULL) - /* No new encoding name */ + if (encodingName == NULL) /* No new encoding name */ parser->m_protocolEncodingName = NULL; else { /* Copy the new encoding name into allocated memory */ parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem)); - if (! parser->m_protocolEncodingName) - return XML_STATUS_ERROR; + if (!parser->m_protocolEncodingName) return XML_STATUS_ERROR; } return XML_STATUS_OK; } @@ -1179,8 +1111,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, unsigned long oldhash_secret_salt; /* Validate the oldParser parameter before we pull everything out of it */ - if (oldParser == NULL) - return NULL; + if (oldParser == NULL) return NULL; /* Stash the original parser contents on the stack */ oldDtd = parser->m_dtd; @@ -1223,8 +1154,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, oldhash_secret_salt = parser->m_hash_secret_salt; #ifdef XML_DTD - if (! context) - newDtd = oldDtd; + if (!context) newDtd = oldDtd; #endif /* XML_DTD */ /* Note that the magical uses of the pre-processor to make field @@ -1240,8 +1170,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); } - if (! parser) - return NULL; + if (!parser) return NULL; parser->m_startElementHandler = oldStartElementHandler; parser->m_endElementHandler = oldEndElementHandler; @@ -1280,8 +1209,8 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, parser->m_prologState.inEntityValue = oldInEntityValue; if (context) { #endif /* XML_DTD */ - if (! dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem) - || ! setContext(parser, context)) { + if (!dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem) || + !setContext(parser, context)) { XML_ParserFree(parser); return NULL; } @@ -1303,31 +1232,26 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, return parser; } -static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) { +static void FASTCALL destroyBindings(BINDING *bindings, XML_Parser parser) { for (;;) { BINDING *b = bindings; - if (! b) - break; + if (!b) break; bindings = b->nextTagBinding; FREE(parser, b->uri); FREE(parser, b); } } -void XMLCALL -XML_ParserFree(XML_Parser parser) { +void XMLCALL XML_ParserFree(XML_Parser parser) { TAG *tagList; OPEN_INTERNAL_ENTITY *entityList; - if (parser == NULL) - return; + if (parser == NULL) return; /* free m_tagStack and m_freeTagList */ tagList = parser->m_tagStack; for (;;) { TAG *p; if (tagList == NULL) { - if (parser->m_freeTagList == NULL) - break; + if (parser->m_freeTagList == NULL) break; tagList = parser->m_freeTagList; parser->m_freeTagList = NULL; } @@ -1342,8 +1266,7 @@ XML_ParserFree(XML_Parser parser) { for (;;) { OPEN_INTERNAL_ENTITY *openEntity; if (entityList == NULL) { - if (parser->m_freeInternalEntities == NULL) - break; + if (parser->m_freeInternalEntities == NULL) break; entityList = parser->m_freeInternalEntities; parser->m_freeInternalEntities = NULL; } @@ -1361,11 +1284,11 @@ XML_ParserFree(XML_Parser parser) { /* external parameter entity parsers share the DTD structure parser->m_dtd with the root parser, so we must not destroy it */ - if (! parser->m_isParamEntity && parser->m_dtd) + if (!parser->m_isParamEntity && parser->m_dtd) #else if (parser->m_dtd) #endif /* XML_DTD */ - dtdDestroy(parser->m_dtd, (XML_Bool)! parser->m_parentParser, + dtdDestroy(parser->m_dtd, (XML_Bool)!parser->m_parentParser, &parser->m_mem); FREE(parser, (void *)parser->m_atts); #ifdef XML_ATTR_INFO @@ -1381,20 +1304,16 @@ XML_ParserFree(XML_Parser parser) { FREE(parser, parser); } -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) { - if (parser != NULL) - parser->m_handlerArg = parser; +void XMLCALL XML_UseParserAsHandlerArg(XML_Parser parser) { + if (parser != NULL) parser->m_handlerArg = parser; } -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) { - if (parser == NULL) - return XML_ERROR_INVALID_ARGUMENT; +enum XML_Error XMLCALL XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) { + if (parser == NULL) return XML_ERROR_INVALID_ARGUMENT; #ifdef XML_DTD /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING - || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING || + parser->m_parsingStatus.parsing == XML_SUSPENDED) return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; parser->m_useForeignDTD = useDTD; return XML_ERROR_NONE; @@ -1403,283 +1322,224 @@ XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) { #endif } -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) { - if (parser == NULL) - return; +void XMLCALL XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) { + if (parser == NULL) return; /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING - || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING || + parser->m_parsingStatus.parsing == XML_SUSPENDED) return; parser->m_ns_triplets = do_nst ? XML_TRUE : XML_FALSE; } -void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) { - if (parser == NULL) - return; +void XMLCALL XML_SetUserData(XML_Parser parser, void *p) { + if (parser == NULL) return; if (parser->m_handlerArg == parser->m_userData) parser->m_handlerArg = parser->m_userData = p; else parser->m_userData = p; } -enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) { - if (parser == NULL) - return XML_STATUS_ERROR; +enum XML_Status XMLCALL XML_SetBase(XML_Parser parser, const XML_Char *p) { + if (parser == NULL) return XML_STATUS_ERROR; if (p) { p = poolCopyString(&parser->m_dtd->pool, p); - if (! p) - return XML_STATUS_ERROR; + if (!p) return XML_STATUS_ERROR; parser->m_curBase = p; } else parser->m_curBase = NULL; return XML_STATUS_OK; } -const XML_Char *XMLCALL -XML_GetBase(XML_Parser parser) { - if (parser == NULL) - return NULL; +const XML_Char *XMLCALL XML_GetBase(XML_Parser parser) { + if (parser == NULL) return NULL; return parser->m_curBase; } -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) { - if (parser == NULL) - return -1; +int XMLCALL XML_GetSpecifiedAttributeCount(XML_Parser parser) { + if (parser == NULL) return -1; return parser->m_nSpecifiedAtts; } -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) { - if (parser == NULL) - return -1; +int XMLCALL XML_GetIdAttributeIndex(XML_Parser parser) { + if (parser == NULL) return -1; return parser->m_idAttIndex; } #ifdef XML_ATTR_INFO -const XML_AttrInfo *XMLCALL -XML_GetAttributeInfo(XML_Parser parser) { - if (parser == NULL) - return NULL; +const XML_AttrInfo *XMLCALL XML_GetAttributeInfo(XML_Parser parser) { + if (parser == NULL) return NULL; return parser->m_attInfo; } #endif -void XMLCALL -XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, - XML_EndElementHandler end) { - if (parser == NULL) - return; +void XMLCALL XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) { + if (parser == NULL) return; parser->m_startElementHandler = start; parser->m_endElementHandler = end; } -void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler start) { - if (parser != NULL) - parser->m_startElementHandler = start; +void XMLCALL XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler start) { + if (parser != NULL) parser->m_startElementHandler = start; } -void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler end) { - if (parser != NULL) - parser->m_endElementHandler = end; +void XMLCALL XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler end) { + if (parser != NULL) parser->m_endElementHandler = end; } -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) { - if (parser != NULL) - parser->m_characterDataHandler = handler; +void XMLCALL XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler) { + if (parser != NULL) parser->m_characterDataHandler = handler; } -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) { - if (parser != NULL) - parser->m_processingInstructionHandler = handler; +void XMLCALL XML_SetProcessingInstructionHandler( + XML_Parser parser, XML_ProcessingInstructionHandler handler) { + if (parser != NULL) parser->m_processingInstructionHandler = handler; } -void XMLCALL -XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler) { - if (parser != NULL) - parser->m_commentHandler = handler; +void XMLCALL XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler) { + if (parser != NULL) parser->m_commentHandler = handler; } -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) { - if (parser == NULL) - return; +void XMLCALL XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end) { + if (parser == NULL) return; parser->m_startCdataSectionHandler = start; parser->m_endCdataSectionHandler = end; } -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start) { - if (parser != NULL) - parser->m_startCdataSectionHandler = start; +void XMLCALL XML_SetStartCdataSectionHandler( + XML_Parser parser, XML_StartCdataSectionHandler start) { + if (parser != NULL) parser->m_startCdataSectionHandler = start; } -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end) { - if (parser != NULL) - parser->m_endCdataSectionHandler = end; +void XMLCALL XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end) { + if (parser != NULL) parser->m_endCdataSectionHandler = end; } -void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler) { - if (parser == NULL) - return; +void XMLCALL XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler) { + if (parser == NULL) return; parser->m_defaultHandler = handler; parser->m_defaultExpandInternalEntities = XML_FALSE; } -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler) { - if (parser == NULL) - return; +void XMLCALL XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler) { + if (parser == NULL) return; parser->m_defaultHandler = handler; parser->m_defaultExpandInternalEntities = XML_TRUE; } -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) { - if (parser == NULL) - return; +void XMLCALL XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) { + if (parser == NULL) return; parser->m_startDoctypeDeclHandler = start; parser->m_endDoctypeDeclHandler = end; } -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start) { - if (parser != NULL) - parser->m_startDoctypeDeclHandler = start; +void XMLCALL XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start) { + if (parser != NULL) parser->m_startDoctypeDeclHandler = start; } -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end) { - if (parser != NULL) - parser->m_endDoctypeDeclHandler = end; +void XMLCALL XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end) { + if (parser != NULL) parser->m_endDoctypeDeclHandler = end; } -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) { - if (parser != NULL) - parser->m_unparsedEntityDeclHandler = handler; +void XMLCALL XML_SetUnparsedEntityDeclHandler( + XML_Parser parser, XML_UnparsedEntityDeclHandler handler) { + if (parser != NULL) parser->m_unparsedEntityDeclHandler = handler; } -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler) { - if (parser != NULL) - parser->m_notationDeclHandler = handler; +void XMLCALL XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler) { + if (parser != NULL) parser->m_notationDeclHandler = handler; } -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) { - if (parser == NULL) - return; +void XMLCALL XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end) { + if (parser == NULL) return; parser->m_startNamespaceDeclHandler = start; parser->m_endNamespaceDeclHandler = end; } -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start) { - if (parser != NULL) - parser->m_startNamespaceDeclHandler = start; +void XMLCALL XML_SetStartNamespaceDeclHandler( + XML_Parser parser, XML_StartNamespaceDeclHandler start) { + if (parser != NULL) parser->m_startNamespaceDeclHandler = start; } -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end) { - if (parser != NULL) - parser->m_endNamespaceDeclHandler = end; +void XMLCALL XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end) { + if (parser != NULL) parser->m_endNamespaceDeclHandler = end; } -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) { - if (parser != NULL) - parser->m_notStandaloneHandler = handler; +void XMLCALL XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler) { + if (parser != NULL) parser->m_notStandaloneHandler = handler; } -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) { - if (parser != NULL) - parser->m_externalEntityRefHandler = handler; +void XMLCALL XML_SetExternalEntityRefHandler( + XML_Parser parser, XML_ExternalEntityRefHandler handler) { + if (parser != NULL) parser->m_externalEntityRefHandler = handler; } -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) { - if (parser == NULL) - return; +void XMLCALL XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) { + if (parser == NULL) return; if (arg) parser->m_externalEntityRefHandlerArg = (XML_Parser)arg; else parser->m_externalEntityRefHandlerArg = parser; } -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) { - if (parser != NULL) - parser->m_skippedEntityHandler = handler; +void XMLCALL XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler) { + if (parser != NULL) parser->m_skippedEntityHandler = handler; } -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, void *data) { - if (parser == NULL) - return; +void XMLCALL XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *data) { + if (parser == NULL) return; parser->m_unknownEncodingHandler = handler; parser->m_unknownEncodingHandlerData = data; } -void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl) { - if (parser != NULL) - parser->m_elementDeclHandler = eldecl; +void XMLCALL XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl) { + if (parser != NULL) parser->m_elementDeclHandler = eldecl; } -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl) { - if (parser != NULL) - parser->m_attlistDeclHandler = attdecl; +void XMLCALL XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl) { + if (parser != NULL) parser->m_attlistDeclHandler = attdecl; } -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler) { - if (parser != NULL) - parser->m_entityDeclHandler = handler; +void XMLCALL XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler) { + if (parser != NULL) parser->m_entityDeclHandler = handler; } -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler handler) { - if (parser != NULL) - parser->m_xmlDeclHandler = handler; +void XMLCALL XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler handler) { + if (parser != NULL) parser->m_xmlDeclHandler = handler; } -int XMLCALL -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) { - if (parser == NULL) - return 0; +int XMLCALL XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing peParsing) { + if (parser == NULL) return 0; /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING - || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING || + parser->m_parsingStatus.parsing == XML_SUSPENDED) return 0; #ifdef XML_DTD parser->m_paramEntityParsing = peParsing; @@ -1689,48 +1549,44 @@ XML_SetParamEntityParsing(XML_Parser parser, #endif } -int XMLCALL -XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt) { - if (parser == NULL) - return 0; +int XMLCALL XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt) { + if (parser == NULL) return 0; if (parser->m_parentParser) return XML_SetHashSalt(parser->m_parentParser, hash_salt); /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING - || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING || + parser->m_parsingStatus.parsing == XML_SUSPENDED) return 0; parser->m_hash_secret_salt = hash_salt; return 1; } -enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { +enum XML_Status XMLCALL XML_Parse(XML_Parser parser, const char *s, int len, + int isFinal) { if ((parser == NULL) || (len < 0) || ((s == NULL) && (len != 0))) { - if (parser != NULL) - parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT; + if (parser != NULL) parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT; return XML_STATUS_ERROR; } switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - parser->m_errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - parser->m_errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parser->m_parentParser == NULL && ! startParsing(parser)) { - parser->m_errorCode = XML_ERROR_NO_MEMORY; + case XML_SUSPENDED: + parser->m_errorCode = XML_ERROR_SUSPENDED; return XML_STATUS_ERROR; - } - /* fall through */ - default: - parser->m_parsingStatus.parsing = XML_PARSING; + case XML_FINISHED: + parser->m_errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + case XML_INITIALIZED: + if (parser->m_parentParser == NULL && !startParsing(parser)) { + parser->m_errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + /* fall through */ + default: + parser->m_parsingStatus.parsing = XML_PARSING; } if (len == 0) { parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal; - if (! isFinal) - return XML_STATUS_OK; + if (!isFinal) return XML_STATUS_OK; parser->m_positionPtr = parser->m_bufferPtr; parser->m_parseEndPtr = parser->m_bufferEnd; @@ -1738,36 +1594,36 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { data are the final chunk of input, then we have to check them again to detect errors based on that fact. */ - parser->m_errorCode - = parser->m_processor(parser, parser->m_bufferPtr, - parser->m_parseEndPtr, &parser->m_bufferPtr); + parser->m_errorCode = + parser->m_processor(parser, parser->m_bufferPtr, parser->m_parseEndPtr, + &parser->m_bufferPtr); if (parser->m_errorCode == XML_ERROR_NONE) { switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - /* It is hard to be certain, but it seems that this case - * cannot occur. This code is cleaning up a previous parse - * with no new data (since len == 0). Changing the parsing - * state requires getting to execute a handler function, and - * there doesn't seem to be an opportunity for that while in - * this circumstance. - * - * Given the uncertainty, we retain the code but exclude it - * from coverage tests. - * - * LCOV_EXCL_START - */ - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, - parser->m_bufferPtr, &parser->m_position); - parser->m_positionPtr = parser->m_bufferPtr; - return XML_STATUS_SUSPENDED; - /* LCOV_EXCL_STOP */ - case XML_INITIALIZED: - case XML_PARSING: - parser->m_parsingStatus.parsing = XML_FINISHED; - /* fall through */ - default: - return XML_STATUS_OK; + case XML_SUSPENDED: + /* It is hard to be certain, but it seems that this case + * cannot occur. This code is cleaning up a previous parse + * with no new data (since len == 0). Changing the parsing + * state requires getting to execute a handler function, and + * there doesn't seem to be an opportunity for that while in + * this circumstance. + * + * Given the uncertainty, we retain the code but exclude it + * from coverage tests. + * + * LCOV_EXCL_START + */ + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_bufferPtr, &parser->m_position); + parser->m_positionPtr = parser->m_bufferPtr; + return XML_STATUS_SUSPENDED; + /* LCOV_EXCL_STOP */ + case XML_INITIALIZED: + case XML_PARSING: + parser->m_parsingStatus.parsing = XML_FINISHED; + /* fall through */ + default: + return XML_STATUS_OK; } } parser->m_eventEndPtr = parser->m_eventPtr; @@ -1790,8 +1646,8 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { parser->m_positionPtr = s; parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal; - parser->m_errorCode - = parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end); + parser->m_errorCode = + parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end); if (parser->m_errorCode != XML_ERROR_NONE) { parser->m_eventEndPtr = parser->m_eventPtr; @@ -1799,18 +1655,18 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { return XML_STATUS_ERROR; } else { switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - parser->m_parsingStatus.parsing = XML_FINISHED; - return XML_STATUS_OK; - } - /* fall through */ - default: - result = XML_STATUS_OK; + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (isFinal) { + parser->m_parsingStatus.parsing = XML_FINISHED; + return XML_STATUS_OK; + } + /* fall through */ + default: + result = XML_STATUS_OK; } } @@ -1818,8 +1674,8 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { &parser->m_position); nLeftOver = s + len - end; if (nLeftOver) { - if (parser->m_buffer == NULL - || nLeftOver > parser->m_bufferLim - parser->m_buffer) { + if (parser->m_buffer == NULL || + nLeftOver > parser->m_bufferLim - parser->m_buffer) { /* avoid _signed_ integer overflow */ char *temp = NULL; const int bytesToAllocate = (int)((unsigned)len * 2U); @@ -1857,28 +1713,27 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { } } -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { +enum XML_Status XMLCALL XML_ParseBuffer(XML_Parser parser, int len, + int isFinal) { const char *start; enum XML_Status result = XML_STATUS_OK; - if (parser == NULL) - return XML_STATUS_ERROR; + if (parser == NULL) return XML_STATUS_ERROR; switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - parser->m_errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - parser->m_errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parser->m_parentParser == NULL && ! startParsing(parser)) { - parser->m_errorCode = XML_ERROR_NO_MEMORY; + case XML_SUSPENDED: + parser->m_errorCode = XML_ERROR_SUSPENDED; return XML_STATUS_ERROR; - } - /* fall through */ - default: - parser->m_parsingStatus.parsing = XML_PARSING; + case XML_FINISHED: + parser->m_errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + case XML_INITIALIZED: + if (parser->m_parentParser == NULL && !startParsing(parser)) { + parser->m_errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + /* fall through */ + default: + parser->m_parsingStatus.parsing = XML_PARSING; } start = parser->m_bufferPtr; @@ -1897,16 +1752,16 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { return XML_STATUS_ERROR; } else { switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - parser->m_parsingStatus.parsing = XML_FINISHED; - return result; - } - default:; /* should not happen */ + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (isFinal) { + parser->m_parsingStatus.parsing = XML_FINISHED; + return result; + } + default:; /* should not happen */ } } @@ -1916,22 +1771,20 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { return result; } -void *XMLCALL -XML_GetBuffer(XML_Parser parser, int len) { - if (parser == NULL) - return NULL; +void *XMLCALL XML_GetBuffer(XML_Parser parser, int len) { + if (parser == NULL) return NULL; if (len < 0) { parser->m_errorCode = XML_ERROR_NO_MEMORY; return NULL; } switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - parser->m_errorCode = XML_ERROR_SUSPENDED; - return NULL; - case XML_FINISHED: - parser->m_errorCode = XML_ERROR_FINISHED; - return NULL; - default:; + case XML_SUSPENDED: + parser->m_errorCode = XML_ERROR_SUSPENDED; + return NULL; + case XML_FINISHED: + parser->m_errorCode = XML_ERROR_FINISHED; + return NULL; + default:; } if (len > EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd)) { @@ -1939,26 +1792,25 @@ XML_GetBuffer(XML_Parser parser, int len) { int keep; #endif /* defined XML_CONTEXT_BYTES */ /* Do not invoke signed arithmetic overflow: */ - int neededSize = (int)((unsigned)len - + (unsigned)EXPAT_SAFE_PTR_DIFF( - parser->m_bufferEnd, parser->m_bufferPtr)); + int neededSize = + (int)((unsigned)len + (unsigned)EXPAT_SAFE_PTR_DIFF( + parser->m_bufferEnd, parser->m_bufferPtr)); if (neededSize < 0) { parser->m_errorCode = XML_ERROR_NO_MEMORY; return NULL; } #ifdef XML_CONTEXT_BYTES keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; + if (keep > XML_CONTEXT_BYTES) keep = XML_CONTEXT_BYTES; neededSize += keep; #endif /* defined XML_CONTEXT_BYTES */ - if (neededSize - <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) { + if (neededSize <= + EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) { #ifdef XML_CONTEXT_BYTES if (keep < EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer)) { - int offset - = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer) - - keep; + int offset = + (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer) - + keep; /* The buffer pointers cannot be NULL here; we have at least some bytes * in the buffer */ memmove(parser->m_buffer, &parser->m_buffer[offset], @@ -1970,18 +1822,17 @@ XML_GetBuffer(XML_Parser parser, int len) { if (parser->m_buffer && parser->m_bufferPtr) { memmove(parser->m_buffer, parser->m_bufferPtr, EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)); - parser->m_bufferEnd - = parser->m_buffer - + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); + parser->m_bufferEnd = + parser->m_buffer + + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); parser->m_bufferPtr = parser->m_buffer; } #endif /* not defined XML_CONTEXT_BYTES */ } else { char *newBuf; - int bufferSize - = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr); - if (bufferSize == 0) - bufferSize = INIT_BUFFER_SIZE; + int bufferSize = + (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr); + if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { /* Do not invoke signed arithmetic overflow: */ bufferSize = (int)(2U * (unsigned)bufferSize); @@ -1999,14 +1850,14 @@ XML_GetBuffer(XML_Parser parser, int len) { #ifdef XML_CONTEXT_BYTES if (parser->m_bufferPtr) { memcpy(newBuf, &parser->m_bufferPtr[-keep], - EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) - + keep); + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + + keep); FREE(parser, parser->m_buffer); parser->m_buffer = newBuf; - parser->m_bufferEnd - = parser->m_buffer - + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) - + keep; + parser->m_bufferEnd = + parser->m_buffer + + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + + keep; parser->m_bufferPtr = parser->m_buffer + keep; } else { /* This must be a brand new buffer with no data in it yet */ @@ -2018,9 +1869,8 @@ XML_GetBuffer(XML_Parser parser, int len) { memcpy(newBuf, parser->m_bufferPtr, EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)); FREE(parser, parser->m_buffer); - parser->m_bufferEnd - = newBuf - + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); + parser->m_bufferEnd = newBuf + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, + parser->m_bufferPtr); } else { /* This must be a brand new buffer with no data in it yet */ parser->m_bufferEnd = newBuf; @@ -2034,42 +1884,38 @@ XML_GetBuffer(XML_Parser parser, int len) { return parser->m_bufferEnd; } -enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) { - if (parser == NULL) - return XML_STATUS_ERROR; +enum XML_Status XMLCALL XML_StopParser(XML_Parser parser, XML_Bool resumable) { + if (parser == NULL) return XML_STATUS_ERROR; switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - if (resumable) { - parser->m_errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - } - parser->m_parsingStatus.parsing = XML_FINISHED; - break; - case XML_FINISHED: - parser->m_errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - if (resumable) { -#ifdef XML_DTD - if (parser->m_isParamEntity) { - parser->m_errorCode = XML_ERROR_SUSPEND_PE; + case XML_SUSPENDED: + if (resumable) { + parser->m_errorCode = XML_ERROR_SUSPENDED; return XML_STATUS_ERROR; } -#endif - parser->m_parsingStatus.parsing = XML_SUSPENDED; - } else parser->m_parsingStatus.parsing = XML_FINISHED; + break; + case XML_FINISHED: + parser->m_errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + if (resumable) { +#ifdef XML_DTD + if (parser->m_isParamEntity) { + parser->m_errorCode = XML_ERROR_SUSPEND_PE; + return XML_STATUS_ERROR; + } +#endif + parser->m_parsingStatus.parsing = XML_SUSPENDED; + } else + parser->m_parsingStatus.parsing = XML_FINISHED; } return XML_STATUS_OK; } -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) { +enum XML_Status XMLCALL XML_ResumeParser(XML_Parser parser) { enum XML_Status result = XML_STATUS_OK; - if (parser == NULL) - return XML_STATUS_ERROR; + if (parser == NULL) return XML_STATUS_ERROR; if (parser->m_parsingStatus.parsing != XML_SUSPENDED) { parser->m_errorCode = XML_ERROR_NOT_SUSPENDED; return XML_STATUS_ERROR; @@ -2085,16 +1931,16 @@ XML_ResumeParser(XML_Parser parser) { return XML_STATUS_ERROR; } else { switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (parser->m_parsingStatus.finalBuffer) { - parser->m_parsingStatus.parsing = XML_FINISHED; - return result; - } - default:; + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (parser->m_parsingStatus.finalBuffer) { + parser->m_parsingStatus.parsing = XML_FINISHED; + return result; + } + default:; } } @@ -2104,50 +1950,40 @@ XML_ResumeParser(XML_Parser parser) { return result; } -void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) { - if (parser == NULL) - return; +void XMLCALL XML_GetParsingStatus(XML_Parser parser, + XML_ParsingStatus *status) { + if (parser == NULL) return; assert(status != NULL); *status = parser->m_parsingStatus; } -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) { - if (parser == NULL) - return XML_ERROR_INVALID_ARGUMENT; +enum XML_Error XMLCALL XML_GetErrorCode(XML_Parser parser) { + if (parser == NULL) return XML_ERROR_INVALID_ARGUMENT; return parser->m_errorCode; } -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) { - if (parser == NULL) - return -1; +XML_Index XMLCALL XML_GetCurrentByteIndex(XML_Parser parser) { + if (parser == NULL) return -1; if (parser->m_eventPtr) - return (XML_Index)(parser->m_parseEndByteIndex - - (parser->m_parseEndPtr - parser->m_eventPtr)); + return (XML_Index)(parser->m_parseEndByteIndex - + (parser->m_parseEndPtr - parser->m_eventPtr)); return -1; } -int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) { - if (parser == NULL) - return 0; +int XMLCALL XML_GetCurrentByteCount(XML_Parser parser) { + if (parser == NULL) return 0; if (parser->m_eventEndPtr && parser->m_eventPtr) return (int)(parser->m_eventEndPtr - parser->m_eventPtr); return 0; } -const char *XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) { +const char *XMLCALL XML_GetInputContext(XML_Parser parser, int *offset, + int *size) { #ifdef XML_CONTEXT_BYTES - if (parser == NULL) - return NULL; + if (parser == NULL) return NULL; if (parser->m_eventPtr && parser->m_buffer) { - if (offset != NULL) - *offset = (int)(parser->m_eventPtr - parser->m_buffer); - if (size != NULL) - *size = (int)(parser->m_bufferEnd - parser->m_buffer); + if (offset != NULL) *offset = (int)(parser->m_eventPtr - parser->m_buffer); + if (size != NULL) *size = (int)(parser->m_bufferEnd - parser->m_buffer); return parser->m_buffer; } #else @@ -2158,10 +1994,8 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size) { return (char *)0; } -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) { - if (parser == NULL) - return 0; +XML_Size XMLCALL XML_GetCurrentLineNumber(XML_Parser parser) { + if (parser == NULL) return 0; if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) { XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position); @@ -2170,10 +2004,8 @@ XML_GetCurrentLineNumber(XML_Parser parser) { return parser->m_position.lineNumber + 1; } -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) { - if (parser == NULL) - return 0; +XML_Size XMLCALL XML_GetCurrentColumnNumber(XML_Parser parser) { + if (parser == NULL) return 0; if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) { XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position); @@ -2182,36 +2014,26 @@ XML_GetCurrentColumnNumber(XML_Parser parser) { return parser->m_position.columnNumber; } -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) { - if (parser != NULL) - FREE(parser, model); +void XMLCALL XML_FreeContentModel(XML_Parser parser, XML_Content *model) { + if (parser != NULL) FREE(parser, model); } -void *XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) { - if (parser == NULL) - return NULL; +void *XMLCALL XML_MemMalloc(XML_Parser parser, size_t size) { + if (parser == NULL) return NULL; return MALLOC(parser, size); } -void *XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) { - if (parser == NULL) - return NULL; +void *XMLCALL XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) { + if (parser == NULL) return NULL; return REALLOC(parser, ptr, size); } -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) { - if (parser != NULL) - FREE(parser, ptr); +void XMLCALL XML_MemFree(XML_Parser parser, void *ptr) { + if (parser != NULL) FREE(parser, ptr); } -void XMLCALL -XML_DefaultCurrent(XML_Parser parser) { - if (parser == NULL) - return; +void XMLCALL XML_DefaultCurrent(XML_Parser parser) { + if (parser == NULL) return; if (parser->m_defaultHandler) { if (parser->m_openInternalEntities) reportDefault(parser, parser->m_internalEncoding, @@ -2223,105 +2045,104 @@ XML_DefaultCurrent(XML_Parser parser) { } } -const XML_LChar *XMLCALL -XML_ErrorString(enum XML_Error code) { +const XML_LChar *XMLCALL XML_ErrorString(enum XML_Error code) { switch (code) { - case XML_ERROR_NONE: - return NULL; - case XML_ERROR_NO_MEMORY: - return XML_L("out of memory"); - case XML_ERROR_SYNTAX: - return XML_L("syntax error"); - case XML_ERROR_NO_ELEMENTS: - return XML_L("no element found"); - case XML_ERROR_INVALID_TOKEN: - return XML_L("not well-formed (invalid token)"); - case XML_ERROR_UNCLOSED_TOKEN: - return XML_L("unclosed token"); - case XML_ERROR_PARTIAL_CHAR: - return XML_L("partial character"); - case XML_ERROR_TAG_MISMATCH: - return XML_L("mismatched tag"); - case XML_ERROR_DUPLICATE_ATTRIBUTE: - return XML_L("duplicate attribute"); - case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: - return XML_L("junk after document element"); - case XML_ERROR_PARAM_ENTITY_REF: - return XML_L("illegal parameter entity reference"); - case XML_ERROR_UNDEFINED_ENTITY: - return XML_L("undefined entity"); - case XML_ERROR_RECURSIVE_ENTITY_REF: - return XML_L("recursive entity reference"); - case XML_ERROR_ASYNC_ENTITY: - return XML_L("asynchronous entity"); - case XML_ERROR_BAD_CHAR_REF: - return XML_L("reference to invalid character number"); - case XML_ERROR_BINARY_ENTITY_REF: - return XML_L("reference to binary entity"); - case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: - return XML_L("reference to external entity in attribute"); - case XML_ERROR_MISPLACED_XML_PI: - return XML_L("XML or text declaration not at start of entity"); - case XML_ERROR_UNKNOWN_ENCODING: - return XML_L("unknown encoding"); - case XML_ERROR_INCORRECT_ENCODING: - return XML_L("encoding specified in XML declaration is incorrect"); - case XML_ERROR_UNCLOSED_CDATA_SECTION: - return XML_L("unclosed CDATA section"); - case XML_ERROR_EXTERNAL_ENTITY_HANDLING: - return XML_L("error in processing external entity reference"); - case XML_ERROR_NOT_STANDALONE: - return XML_L("document is not standalone"); - case XML_ERROR_UNEXPECTED_STATE: - return XML_L("unexpected parser state - please send a bug report"); - case XML_ERROR_ENTITY_DECLARED_IN_PE: - return XML_L("entity declared in parameter entity"); - case XML_ERROR_FEATURE_REQUIRES_XML_DTD: - return XML_L("requested feature requires XML_DTD support in Expat"); - case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: - return XML_L("cannot change setting once parsing has begun"); - /* Added in 1.95.7. */ - case XML_ERROR_UNBOUND_PREFIX: - return XML_L("unbound prefix"); - /* Added in 1.95.8. */ - case XML_ERROR_UNDECLARING_PREFIX: - return XML_L("must not undeclare prefix"); - case XML_ERROR_INCOMPLETE_PE: - return XML_L("incomplete markup in parameter entity"); - case XML_ERROR_XML_DECL: - return XML_L("XML declaration not well-formed"); - case XML_ERROR_TEXT_DECL: - return XML_L("text declaration not well-formed"); - case XML_ERROR_PUBLICID: - return XML_L("illegal character(s) in public id"); - case XML_ERROR_SUSPENDED: - return XML_L("parser suspended"); - case XML_ERROR_NOT_SUSPENDED: - return XML_L("parser not suspended"); - case XML_ERROR_ABORTED: - return XML_L("parsing aborted"); - case XML_ERROR_FINISHED: - return XML_L("parsing finished"); - case XML_ERROR_SUSPEND_PE: - return XML_L("cannot suspend in external parameter entity"); - /* Added in 2.0.0. */ - case XML_ERROR_RESERVED_PREFIX_XML: - return XML_L( - "reserved prefix (xml) must not be undeclared or bound to another namespace name"); - case XML_ERROR_RESERVED_PREFIX_XMLNS: - return XML_L("reserved prefix (xmlns) must not be declared or undeclared"); - case XML_ERROR_RESERVED_NAMESPACE_URI: - return XML_L( - "prefix must not be bound to one of the reserved namespace names"); - /* Added in 2.2.5. */ - case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */ - return XML_L("invalid argument"); + case XML_ERROR_NONE: + return NULL; + case XML_ERROR_NO_MEMORY: + return XML_L("out of memory"); + case XML_ERROR_SYNTAX: + return XML_L("syntax error"); + case XML_ERROR_NO_ELEMENTS: + return XML_L("no element found"); + case XML_ERROR_INVALID_TOKEN: + return XML_L("not well-formed (invalid token)"); + case XML_ERROR_UNCLOSED_TOKEN: + return XML_L("unclosed token"); + case XML_ERROR_PARTIAL_CHAR: + return XML_L("partial character"); + case XML_ERROR_TAG_MISMATCH: + return XML_L("mismatched tag"); + case XML_ERROR_DUPLICATE_ATTRIBUTE: + return XML_L("duplicate attribute"); + case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: + return XML_L("junk after document element"); + case XML_ERROR_PARAM_ENTITY_REF: + return XML_L("illegal parameter entity reference"); + case XML_ERROR_UNDEFINED_ENTITY: + return XML_L("undefined entity"); + case XML_ERROR_RECURSIVE_ENTITY_REF: + return XML_L("recursive entity reference"); + case XML_ERROR_ASYNC_ENTITY: + return XML_L("asynchronous entity"); + case XML_ERROR_BAD_CHAR_REF: + return XML_L("reference to invalid character number"); + case XML_ERROR_BINARY_ENTITY_REF: + return XML_L("reference to binary entity"); + case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: + return XML_L("reference to external entity in attribute"); + case XML_ERROR_MISPLACED_XML_PI: + return XML_L("XML or text declaration not at start of entity"); + case XML_ERROR_UNKNOWN_ENCODING: + return XML_L("unknown encoding"); + case XML_ERROR_INCORRECT_ENCODING: + return XML_L("encoding specified in XML declaration is incorrect"); + case XML_ERROR_UNCLOSED_CDATA_SECTION: + return XML_L("unclosed CDATA section"); + case XML_ERROR_EXTERNAL_ENTITY_HANDLING: + return XML_L("error in processing external entity reference"); + case XML_ERROR_NOT_STANDALONE: + return XML_L("document is not standalone"); + case XML_ERROR_UNEXPECTED_STATE: + return XML_L("unexpected parser state - please send a bug report"); + case XML_ERROR_ENTITY_DECLARED_IN_PE: + return XML_L("entity declared in parameter entity"); + case XML_ERROR_FEATURE_REQUIRES_XML_DTD: + return XML_L("requested feature requires XML_DTD support in Expat"); + case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: + return XML_L("cannot change setting once parsing has begun"); + /* Added in 1.95.7. */ + case XML_ERROR_UNBOUND_PREFIX: + return XML_L("unbound prefix"); + /* Added in 1.95.8. */ + case XML_ERROR_UNDECLARING_PREFIX: + return XML_L("must not undeclare prefix"); + case XML_ERROR_INCOMPLETE_PE: + return XML_L("incomplete markup in parameter entity"); + case XML_ERROR_XML_DECL: + return XML_L("XML declaration not well-formed"); + case XML_ERROR_TEXT_DECL: + return XML_L("text declaration not well-formed"); + case XML_ERROR_PUBLICID: + return XML_L("illegal character(s) in public id"); + case XML_ERROR_SUSPENDED: + return XML_L("parser suspended"); + case XML_ERROR_NOT_SUSPENDED: + return XML_L("parser not suspended"); + case XML_ERROR_ABORTED: + return XML_L("parsing aborted"); + case XML_ERROR_FINISHED: + return XML_L("parsing finished"); + case XML_ERROR_SUSPEND_PE: + return XML_L("cannot suspend in external parameter entity"); + /* Added in 2.0.0. */ + case XML_ERROR_RESERVED_PREFIX_XML: + return XML_L("reserved prefix (xml) must not be undeclared or bound to " + "another namespace name"); + case XML_ERROR_RESERVED_PREFIX_XMLNS: + return XML_L( + "reserved prefix (xmlns) must not be declared or undeclared"); + case XML_ERROR_RESERVED_NAMESPACE_URI: + return XML_L( + "prefix must not be bound to one of the reserved namespace names"); + /* Added in 2.2.5. */ + case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */ + return XML_L("invalid argument"); } return NULL; } -const XML_LChar *XMLCALL -XML_ExpatVersion(void) { +const XML_LChar *XMLCALL XML_ExpatVersion(void) { /* V1 is used to string-ize the version number. However, it would string-ize the actual version macro *names* unless we get them substituted before being passed to V1. CPP is defined to expand @@ -2339,8 +2160,7 @@ XML_ExpatVersion(void) { #undef V2 } -XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) { +XML_Expat_Version XMLCALL XML_ExpatVersionInfo(void) { XML_Expat_Version version; version.major = XML_MAJOR_VERSION; @@ -2350,39 +2170,38 @@ XML_ExpatVersionInfo(void) { return version; } -const XML_Feature *XMLCALL -XML_GetFeatureList(void) { - static const XML_Feature features[] - = {{XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, +const XML_Feature *XMLCALL XML_GetFeatureList(void) { + static const XML_Feature features[] = { + {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), + sizeof(XML_Char)}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), + sizeof(XML_LChar)}, #ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, #endif #ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, #endif #ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, #endif #ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, #endif #ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, #endif #ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, + {XML_FEATURE_NS, XML_L("XML_NS"), 0}, #endif #ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, + {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, #endif #ifdef XML_ATTR_INFO - {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, + {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, #endif - {XML_FEATURE_END, NULL, 0}}; + {XML_FEATURE_END, NULL, 0}}; return features; } @@ -2392,8 +2211,7 @@ XML_GetFeatureList(void) { processed, and not yet closed, we need to store tag->rawName in a more permanent location, since the parse buffer is about to be discarded. */ -static XML_Bool -storeRawNames(XML_Parser parser) { +static XML_Bool storeRawNames(XML_Parser parser) { TAG *tag = parser->m_tagStack; while (tag) { int bufSize; @@ -2404,16 +2222,14 @@ storeRawNames(XML_Parser parser) { below it in the stack is already been accounted for in a previous call to this function. */ - if (tag->rawName == rawNameBuf) - break; + if (tag->rawName == rawNameBuf) break; /* For re-use purposes we need to ensure that the size of tag->buf is a multiple of sizeof(XML_Char). */ bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); if (bufSize > tag->bufEnd - tag->buf) { char *temp = (char *)REALLOC(parser, tag->buf, bufSize); - if (temp == NULL) - return XML_FALSE; + if (temp == NULL) return XML_FALSE; /* if tag->name.str points to tag->buf (only when namespace processing is off) then we have to update it */ @@ -2423,8 +2239,8 @@ storeRawNames(XML_Parser parser) { then update it as well, since it will always point into tag->buf */ if (tag->name.localPart) - tag->name.localPart - = (XML_Char *)temp + (tag->name.localPart - (XML_Char *)tag->buf); + tag->name.localPart = + (XML_Char *)temp + (tag->name.localPart - (XML_Char *)tag->buf); tag->buf = temp; tag->bufEnd = temp + bufSize; rawNameBuf = temp + nameLen; @@ -2436,25 +2252,25 @@ storeRawNames(XML_Parser parser) { return XML_TRUE; } -static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, const char *start, const char *end, - const char **endPtr) { - enum XML_Error result - = doContent(parser, 0, parser->m_encoding, start, end, endPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer); +static enum XML_Error PTRCALL contentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) { + enum XML_Error result = + doContent(parser, 0, parser->m_encoding, start, end, endPtr, + (XML_Bool)!parser->m_parsingStatus.finalBuffer); if (result == XML_ERROR_NONE) { - if (! storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; + if (!storeRawNames(parser)) return XML_ERROR_NO_MEMORY; } return result; } -static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, const char *start, - const char *end, const char **endPtr) { +static enum XML_Error PTRCALL externalEntityInitProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) { enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; + if (result != XML_ERROR_NONE) return result; parser->m_processor = externalEntityInitProcessor2; return externalEntityInitProcessor2(parser, start, end, endPtr); } @@ -2465,32 +2281,33 @@ externalEntityInitProcessor2(XML_Parser parser, const char *start, const char *next = start; /* XmlContentTok doesn't always set the last arg */ int tok = XmlContentTok(parser->m_encoding, start, end, &next); switch (tok) { - case XML_TOK_BOM: - /* If we are at the end of the buffer, this would cause the next stage, - i.e. externalEntityInitProcessor3, to pass control directly to - doContent (by detecting XML_TOK_NONE) without processing any xml text - declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. - */ - if (next == end && ! parser->m_parsingStatus.finalBuffer) { - *endPtr = next; - return XML_ERROR_NONE; - } - start = next; - break; - case XML_TOK_PARTIAL: - if (! parser->m_parsingStatus.finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - parser->m_eventPtr = start; - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (! parser->m_parsingStatus.finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - parser->m_eventPtr = start; - return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_BOM: + /* If we are at the end of the buffer, this would cause the next stage, + i.e. externalEntityInitProcessor3, to pass control directly to + doContent (by detecting XML_TOK_NONE) without processing any xml text + declaration - causing the error XML_ERROR_MISPLACED_XML_PI in + doContent. + */ + if (next == end && !parser->m_parsingStatus.finalBuffer) { + *endPtr = next; + return XML_ERROR_NONE; + } + start = next; + break; + case XML_TOK_PARTIAL: + if (!parser->m_parsingStatus.finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + parser->m_eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!parser->m_parsingStatus.finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + parser->m_eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; } parser->m_processor = externalEntityInitProcessor3; return externalEntityInitProcessor3(parser, start, end, endPtr); @@ -2506,33 +2323,32 @@ externalEntityInitProcessor3(XML_Parser parser, const char *start, parser->m_eventEndPtr = next; switch (tok) { - case XML_TOK_XML_DECL: { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } - } break; - case XML_TOK_PARTIAL: - if (! parser->m_parsingStatus.finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (! parser->m_parsingStatus.finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_XML_DECL: { + enum XML_Error result; + result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) return result; + switch (parser->m_parsingStatus.parsing) { + case XML_SUSPENDED: + *endPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + start = next; + } + } break; + case XML_TOK_PARTIAL: + if (!parser->m_parsingStatus.finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!parser->m_parsingStatus.finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; } parser->m_processor = externalEntityContentProcessor; parser->m_tagLevel = 1; @@ -2542,20 +2358,19 @@ externalEntityInitProcessor3(XML_Parser parser, const char *start, static enum XML_Error PTRCALL externalEntityContentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { - enum XML_Error result - = doContent(parser, 1, parser->m_encoding, start, end, endPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer); + enum XML_Error result = + doContent(parser, 1, parser->m_encoding, start, end, endPtr, + (XML_Bool)!parser->m_parsingStatus.finalBuffer); if (result == XML_ERROR_NONE) { - if (! storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; + if (!storeRawNames(parser)) return XML_ERROR_NO_MEMORY; } return result; } -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *s, const char *end, const char **nextPtr, - XML_Bool haveMore) { +static enum XML_Error doContent(XML_Parser parser, int startTagLevel, + const ENCODING *enc, const char *s, + const char *end, const char **nextPtr, + XML_Bool haveMore) { /* save one level of indirection */ DTD *const dtd = parser->m_dtd; @@ -2575,426 +2390,410 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, int tok = XmlContentTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { - case XML_TOK_TRAILING_CR: - if (haveMore) { - *nextPtr = s; + case XML_TOK_TRAILING_CR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + *eventEndPP = end; + if (parser->m_characterDataHandler) { + XML_Char c = 0xA; + parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) return XML_ERROR_NO_ELEMENTS; + if (parser->m_tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; + *nextPtr = end; return XML_ERROR_NONE; - } - *eventEndPP = end; - if (parser->m_characterDataHandler) { - XML_Char c = 0xA; - parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (startTagLevel > 0) { + if (parser->m_tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = s; + return XML_ERROR_NONE; + } return XML_ERROR_NO_ELEMENTS; - if (parser->m_tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (startTagLevel > 0) { - if (parser->m_tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_NO_ELEMENTS; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char)XmlPredefinedEntityName( - enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (ch) { - if (parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (! dtd->hasParamEntityRefs || dtd->standalone) { - if (! entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (! entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } else if (! entity) { - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (! parser->m_defaultExpandInternalEntities) { - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, entity->name, - 0); + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_ENTITY_REF: { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char)XmlPredefinedEntityName( + enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); + if (ch) { + if (parser->m_characterDataHandler) + parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1); else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); break; } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } else if (parser->m_externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (! context) - return XML_ERROR_NO_MEMORY; - if (! parser->m_externalEntityRefHandler( - parser->m_externalEntityRefHandlerArg, context, entity->base, - entity->systemId, entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&parser->m_tempPool); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - case XML_TOK_START_TAG_NO_ATTS: - /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (parser->m_freeTagList) { - tag = parser->m_freeTagList; - parser->m_freeTagList = parser->m_freeTagList->parent; - } else { - tag = (TAG *)MALLOC(parser, sizeof(TAG)); - if (! tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(parser, INIT_TAG_BUF_SIZE); - if (! tag->buf) { - FREE(parser, tag); - return XML_ERROR_NO_MEMORY; + name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (!dtd->hasParamEntityRefs || dtd->standalone) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } else if (!entity) { + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = parser->m_tagStack; - parser->m_tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++parser->m_tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - const enum XML_Convert_Result convert_res - = XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, - (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if ((fromPtr >= rawNameEnd) - || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) { - tag->name.strLen = convLen; + if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + if (!parser->m_defaultExpandInternalEntities) { + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, entity->name, + 0); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); break; } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(parser, tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } - } - } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (parser->m_startElementHandler) - parser->m_startElementHandler(parser->m_handlerArg, tag->name.str, - (const XML_Char **)parser->m_atts); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&parser->m_tempPool); - break; - } - case XML_TOK_EMPTY_ELEMENT_NO_ATTS: - /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&parser->m_tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (! name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&parser->m_tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result != XML_ERROR_NONE) { - freeBindings(parser, bindings); - return result; - } - poolFinish(&parser->m_tempPool); - if (parser->m_startElementHandler) { - parser->m_startElementHandler(parser->m_handlerArg, name.str, - (const XML_Char **)parser->m_atts); - noElmHandlers = XML_FALSE; - } - if (parser->m_endElementHandler) { - if (parser->m_startElementHandler) - *eventPP = *eventEndPP; - parser->m_endElementHandler(parser->m_handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&parser->m_tempPool); - freeBindings(parser, bindings); - } - if ((parser->m_tagLevel == 0) - && (parser->m_parsingStatus.parsing != XML_FINISHED)) { - if (parser->m_parsingStatus.parsing == XML_SUSPENDED) - parser->m_processor = epilogProcessor; - else - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_END_TAG: - if (parser->m_tagLevel == startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - else { - int len; - const char *rawName; - TAG *tag = parser->m_tagStack; - parser->m_tagStack = tag->parent; - tag->parent = parser->m_freeTagList; - parser->m_freeTagList = tag; - rawName = s + enc->minBytesPerChar * 2; - len = XmlNameLength(enc, rawName); - if (len != tag->rawNameLength - || memcmp(tag->rawName, rawName, len) != 0) { - *eventPP = rawName; - return XML_ERROR_TAG_MISMATCH; - } - --parser->m_tagLevel; - if (parser->m_endElementHandler) { - const XML_Char *localPart; - const XML_Char *prefix; - XML_Char *uri; - localPart = tag->name.localPart; - if (parser->m_ns && localPart) { - /* localPart and prefix may have been overwritten in - tag->name.str, since this points to the binding->uri - buffer which gets re-used; so we have to add them again - */ - uri = (XML_Char *)tag->name.str + tag->name.uriLen; - /* don't need to check for space - already done in storeAtts() */ - while (*localPart) - *uri++ = *localPart++; - prefix = (XML_Char *)tag->name.prefix; - if (parser->m_ns_triplets && prefix) { - *uri++ = parser->m_namespaceSeparator; - while (*prefix) - *uri++ = *prefix++; - } - *uri = XML_T('\0'); - } - parser->m_endElementHandler(parser->m_handlerArg, tag->name.str); + result = processInternalEntity(parser, entity, XML_FALSE); + if (result != XML_ERROR_NONE) return result; + } else if (parser->m_externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (!context) return XML_ERROR_NO_MEMORY; + if (!parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, context, entity->base, + entity->systemId, entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&parser->m_tempPool); } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); - while (tag->bindings) { - BINDING *b = tag->bindings; - if (parser->m_endNamespaceDeclHandler) - parser->m_endNamespaceDeclHandler(parser->m_handlerArg, - b->prefix->name); - tag->bindings = tag->bindings->nextTagBinding; - b->nextTagBinding = parser->m_freeBindingList; - parser->m_freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; + break; + } + case XML_TOK_START_TAG_NO_ATTS: + /* fall through */ + case XML_TOK_START_TAG_WITH_ATTS: { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (parser->m_freeTagList) { + tag = parser->m_freeTagList; + parser->m_freeTagList = parser->m_freeTagList->parent; + } else { + tag = (TAG *)MALLOC(parser, sizeof(TAG)); + if (!tag) return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(parser, INIT_TAG_BUF_SIZE); + if (!tag->buf) { + FREE(parser, tag); + return XML_ERROR_NO_MEMORY; + } + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; } - if ((parser->m_tagLevel == 0) - && (parser->m_parsingStatus.parsing != XML_FINISHED)) { + tag->bindings = NULL; + tag->parent = parser->m_tagStack; + parser->m_tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++parser->m_tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + const enum XML_Convert_Result convert_res = + XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, + (ICHAR *)tag->bufEnd - 1); + convLen = (int)(toPtr - (XML_Char *)tag->buf); + if ((fromPtr >= rawNameEnd) || + (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) { + tag->name.strLen = convLen; + break; + } + bufSize = (int)(tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(parser, tag->buf, bufSize); + if (temp == NULL) return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; + } + } + } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) return result; + if (parser->m_startElementHandler) + parser->m_startElementHandler(parser->m_handlerArg, tag->name.str, + (const XML_Char **)parser->m_atts); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&parser->m_tempPool); + break; + } + case XML_TOK_EMPTY_ELEMENT_NO_ATTS: + /* fall through */ + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&parser->m_tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (!name.str) return XML_ERROR_NO_MEMORY; + poolFinish(&parser->m_tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result != XML_ERROR_NONE) { + freeBindings(parser, bindings); + return result; + } + poolFinish(&parser->m_tempPool); + if (parser->m_startElementHandler) { + parser->m_startElementHandler(parser->m_handlerArg, name.str, + (const XML_Char **)parser->m_atts); + noElmHandlers = XML_FALSE; + } + if (parser->m_endElementHandler) { + if (parser->m_startElementHandler) *eventPP = *eventEndPP; + parser->m_endElementHandler(parser->m_handlerArg, name.str); + noElmHandlers = XML_FALSE; + } + if (noElmHandlers && parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&parser->m_tempPool); + freeBindings(parser, bindings); + } + if ((parser->m_tagLevel == 0) && + (parser->m_parsingStatus.parsing != XML_FINISHED)) { if (parser->m_parsingStatus.parsing == XML_SUSPENDED) parser->m_processor = epilogProcessor; else return epilogProcessor(parser, next, end, nextPtr); } - } - break; - case XML_TOK_CHAR_REF: { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (parser->m_characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - parser->m_characterDataHandler(parser->m_handlerArg, buf, - XmlEncode(n, (ICHAR *)buf)); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - } break; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - case XML_TOK_DATA_NEWLINE: - if (parser->m_characterDataHandler) { - XML_Char c = 0xA; - parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_CDATA_SECT_OPEN: { - enum XML_Error result; - if (parser->m_startCdataSectionHandler) - parser->m_startCdataSectionHandler(parser->m_handlerArg); - /* BEGIN disabled code */ - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (0 && parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, - 0); - /* END disabled code */ - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (! next) { - parser->m_processor = cdataSectionProcessor; - return result; - } - } break; - case XML_TOK_TRAILING_RSQB: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (parser->m_characterDataHandler) { - if (MUST_CONVERT(enc, s)) { - ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - parser->m_characterDataHandler( - parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - } else - parser->m_characterDataHandler( - parser->m_handlerArg, (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) { - *eventPP = end; - return XML_ERROR_NO_ELEMENTS; - } - if (parser->m_tagLevel != startTagLevel) { - *eventPP = end; - return XML_ERROR_ASYNC_ENTITY; - } - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: { - XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - const enum XML_Convert_Result convert_res = XmlConvert( - enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - *eventEndPP = s; - charDataHandler(parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - if ((convert_res == XML_CONVERT_COMPLETED) - || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) - break; - *eventPP = s; + break; + case XML_TOK_END_TAG: + if (parser->m_tagLevel == startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + else { + int len; + const char *rawName; + TAG *tag = parser->m_tagStack; + parser->m_tagStack = tag->parent; + tag->parent = parser->m_freeTagList; + parser->m_freeTagList = tag; + rawName = s + enc->minBytesPerChar * 2; + len = XmlNameLength(enc, rawName); + if (len != tag->rawNameLength || + memcmp(tag->rawName, rawName, len) != 0) { + *eventPP = rawName; + return XML_ERROR_TAG_MISMATCH; } - } else - charDataHandler(parser->m_handlerArg, (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - } break; - case XML_TOK_PI: - if (! reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (! reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - default: - /* All of the tokens produced by XmlContentTok() have their own - * explicit cases, so this default is not strictly necessary. - * However it is a useful safety net, so we retain the code and - * simply exclude it from the coverage tests. - * - * LCOV_EXCL_START - */ - if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - /* LCOV_EXCL_STOP */ + --parser->m_tagLevel; + if (parser->m_endElementHandler) { + const XML_Char *localPart; + const XML_Char *prefix; + XML_Char *uri; + localPart = tag->name.localPart; + if (parser->m_ns && localPart) { + /* localPart and prefix may have been overwritten in + tag->name.str, since this points to the binding->uri + buffer which gets re-used; so we have to add them again + */ + uri = (XML_Char *)tag->name.str + tag->name.uriLen; + /* don't need to check for space - already done in storeAtts() */ + while (*localPart) *uri++ = *localPart++; + prefix = (XML_Char *)tag->name.prefix; + if (parser->m_ns_triplets && prefix) { + *uri++ = parser->m_namespaceSeparator; + while (*prefix) *uri++ = *prefix++; + } + *uri = XML_T('\0'); + } + parser->m_endElementHandler(parser->m_handlerArg, tag->name.str); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + while (tag->bindings) { + BINDING *b = tag->bindings; + if (parser->m_endNamespaceDeclHandler) + parser->m_endNamespaceDeclHandler(parser->m_handlerArg, + b->prefix->name); + tag->bindings = tag->bindings->nextTagBinding; + b->nextTagBinding = parser->m_freeBindingList; + parser->m_freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + if ((parser->m_tagLevel == 0) && + (parser->m_parsingStatus.parsing != XML_FINISHED)) { + if (parser->m_parsingStatus.parsing == XML_SUSPENDED) + parser->m_processor = epilogProcessor; + else + return epilogProcessor(parser, next, end, nextPtr); + } + } + break; + case XML_TOK_CHAR_REF: { + int n = XmlCharRefNumber(enc, s); + if (n < 0) return XML_ERROR_BAD_CHAR_REF; + if (parser->m_characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + parser->m_characterDataHandler(parser->m_handlerArg, buf, + XmlEncode(n, (ICHAR *)buf)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + case XML_TOK_DATA_NEWLINE: + if (parser->m_characterDataHandler) { + XML_Char c = 0xA; + parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_CDATA_SECT_OPEN: { + enum XML_Error result; + if (parser->m_startCdataSectionHandler) + parser->m_startCdataSectionHandler(parser->m_handlerArg); + /* BEGIN disabled code */ + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (0 && parser->m_characterDataHandler) + parser->m_characterDataHandler(parser->m_handlerArg, + parser->m_dataBuf, 0); + /* END disabled code */ + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + parser->m_processor = cdataSectionProcessor; + return result; + } + } break; + case XML_TOK_TRAILING_RSQB: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (parser->m_characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + parser->m_characterDataHandler( + parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + } else + parser->m_characterDataHandler( + parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)end - (XML_Char *)s)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) { + *eventPP = end; + return XML_ERROR_NO_ELEMENTS; + } + if (parser->m_tagLevel != startTagLevel) { + *eventPP = end; + return XML_ERROR_ASYNC_ENTITY; + } + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_DATA_CHARS: { + XML_CharacterDataHandler charDataHandler = + parser->m_characterDataHandler; + if (charDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; + const enum XML_Convert_Result convert_res = XmlConvert( + enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + *eventEndPP = s; + charDataHandler(parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + if ((convert_res == XML_CONVERT_COMPLETED) || + (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + break; + *eventPP = s; + } + } else + charDataHandler(parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)next - (XML_Char *)s)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; + break; + default: + /* All of the tokens produced by XmlContentTok() have their own + * explicit cases, so this default is not strictly necessary. + * However it is a useful safety net, so we retain the code and + * simply exclude it from the coverage tests. + * + * LCOV_EXCL_START + */ + if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); + break; + /* LCOV_EXCL_STOP */ } *eventPP = s = next; switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default:; + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default:; } } /* not reached */ @@ -3004,8 +2803,7 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, * moving it to the parser's m_freeBindingList where it can be freed or * reused as appropriate. */ -static void -freeBindings(XML_Parser parser, BINDING *bindings) { +static void freeBindings(XML_Parser parser, BINDING *bindings) { while (bindings) { BINDING *b = bindings; @@ -3032,9 +2830,9 @@ freeBindings(XML_Parser parser, BINDING *bindings) { - process namespace declarations (check and report them) - generate namespace aware element name (URI, prefix) */ -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr) { +static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, + const char *attStr, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ ELEMENT_TYPE *elementType; int nDefaultAtts; @@ -3049,17 +2847,15 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, const XML_Char *localPart; /* lookup the element type name */ - elementType - = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str, 0); - if (! elementType) { + elementType = + (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str, 0); + if (!elementType) { const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (! name) - return XML_ERROR_NO_MEMORY; + if (!name) return XML_ERROR_NO_MEMORY; elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (! elementType) - return XML_ERROR_NO_MEMORY; - if (parser->m_ns && ! setElementTypePrefix(parser, elementType)) + if (!elementType) return XML_ERROR_NO_MEMORY; + if (parser->m_ns && !setElementTypePrefix(parser, elementType)) return XML_ERROR_NO_MEMORY; } nDefaultAtts = elementType->nDefaultAtts; @@ -3089,8 +2885,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, } parser->m_attInfo = temp2; #endif - if (n > oldAttsSize) - XmlGetAttributes(enc, attStr, n, parser->m_atts); + if (n > oldAttsSize) XmlGetAttributes(enc, attStr, n, parser->m_atts); } appAtts = (const XML_Char **)parser->m_atts; @@ -3100,20 +2895,19 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, XML_AttrInfo *currAttInfo = &parser->m_attInfo[i]; #endif /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId - = getAttributeId(parser, enc, currAtt->name, - currAtt->name + XmlNameLength(enc, currAtt->name)); - if (! attId) - return XML_ERROR_NO_MEMORY; + ATTRIBUTE_ID *attId = + getAttributeId(parser, enc, currAtt->name, + currAtt->name + XmlNameLength(enc, currAtt->name)); + if (!attId) return XML_ERROR_NO_MEMORY; #ifdef XML_ATTR_INFO - currAttInfo->nameStart - = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->name); - currAttInfo->nameEnd - = currAttInfo->nameStart + XmlNameLength(enc, currAtt->name); - currAttInfo->valueStart = parser->m_parseEndByteIndex - - (parser->m_parseEndPtr - currAtt->valuePtr); - currAttInfo->valueEnd = parser->m_parseEndByteIndex - - (parser->m_parseEndPtr - currAtt->valueEnd); + currAttInfo->nameStart = + parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->name); + currAttInfo->nameEnd = + currAttInfo->nameStart + XmlNameLength(enc, currAtt->name); + currAttInfo->valueStart = parser->m_parseEndByteIndex - + (parser->m_parseEndPtr - currAtt->valuePtr); + currAttInfo->valueEnd = parser->m_parseEndByteIndex - + (parser->m_parseEndPtr - currAtt->valueEnd); #endif /* Detect duplicate attributes by their QNames. This does not work when namespace processing is turned on and different prefixes for the same @@ -3126,7 +2920,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, } (attId->name)[-1] = 1; appAtts[attIndex++] = attId->name; - if (! parser->m_atts[i].normalized) { + if (!parser->m_atts[i].normalized) { enum XML_Error result; XML_Bool isCdata = XML_TRUE; @@ -3142,20 +2936,18 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, } /* normalize the attribute value */ - result = storeAttributeValue( - parser, enc, isCdata, parser->m_atts[i].valuePtr, - parser->m_atts[i].valueEnd, &parser->m_tempPool); - if (result) - return result; + result = + storeAttributeValue(parser, enc, isCdata, parser->m_atts[i].valuePtr, + parser->m_atts[i].valueEnd, &parser->m_tempPool); + if (result) return result; appAtts[attIndex] = poolStart(&parser->m_tempPool); poolFinish(&parser->m_tempPool); } else { /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&parser->m_tempPool, enc, - parser->m_atts[i].valuePtr, - parser->m_atts[i].valueEnd); - if (appAtts[attIndex] == 0) - return XML_ERROR_NO_MEMORY; + appAtts[attIndex] = + poolStoreString(&parser->m_tempPool, enc, parser->m_atts[i].valuePtr, + parser->m_atts[i].valueEnd); + if (appAtts[attIndex] == 0) return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_tempPool); } /* handle prefixed attribute names */ @@ -3164,8 +2956,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, /* deal with namespace declarations here */ enum XML_Error result = addBinding(parser, attId->prefix, attId, appAtts[attIndex], bindingsPtr); - if (result) - return result; + if (result) return result; --attIndex; } else { /* deal with other prefixed names later */ @@ -3191,13 +2982,12 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, /* do attribute defaulting */ for (i = 0; i < nDefaultAtts; i++) { const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (! (da->id->name)[-1] && da->value) { + if (!(da->id->name)[-1] && da->value) { if (da->id->prefix) { if (da->id->xmlns) { enum XML_Error result = addBinding(parser, da->id->prefix, da->id, da->value, bindingsPtr); - if (result) - return result; + if (result) return result; } else { (da->id->name)[-1] = 2; nPrefixes++; @@ -3222,18 +3012,17 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, int nsAttsSize = (int)1 << parser->m_nsAttsPower; unsigned char oldNsAttsPower = parser->m_nsAttsPower; /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) - >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */ + if ((nPrefixes << 1) >> + parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */ NS_ATT *temp; /* hash table size must also be a power of 2 and >= 8 */ while (nPrefixes >> parser->m_nsAttsPower++) ; - if (parser->m_nsAttsPower < 3) - parser->m_nsAttsPower = 3; + if (parser->m_nsAttsPower < 3) parser->m_nsAttsPower = 3; nsAttsSize = (int)1 << parser->m_nsAttsPower; temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (! temp) { + if (!temp) { /* Restore actual size of memory in m_nsAtts */ parser->m_nsAttsPower = oldNsAttsPower; return XML_ERROR_NO_MEMORY; @@ -3242,10 +3031,9 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, version = 0; /* force re-initialization of m_nsAtts hash table */ } /* using a version flag saves us from initializing m_nsAtts every time */ - if (! version) { /* initialize version flags when version wraps around */ + if (!version) { /* initialize version flags when version wraps around */ version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0;) - parser->m_nsAtts[--j].version = version; + for (j = nsAttsSize; j != 0;) parser->m_nsAtts[--j].version = version; } parser->m_nsAttsVersion = --version; @@ -3264,7 +3052,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, ((XML_Char *)s)[-1] = 0; /* clear flag */ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); - if (! id || ! id->prefix) { + if (!id || !id->prefix) { /* This code is walking through the appAtts array, dealing * with (in this case) a prefixed attribute name. To be in * the array, the attribute must have already been bound, so @@ -3282,12 +3070,11 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */ } b = id->prefix->binding; - if (! b) - return XML_ERROR_UNBOUND_PREFIX; + if (!b) return XML_ERROR_UNBOUND_PREFIX; for (j = 0; j < b->uriLen; j++) { const XML_Char c = b->uri[j]; - if (! poolAppendChar(&parser->m_tempPool, c)) + if (!poolAppendChar(&parser->m_tempPool, c)) return XML_ERROR_NO_MEMORY; } @@ -3299,7 +3086,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, sip24_update(&sip_state, s, keylen(s) * sizeof(XML_Char)); do { /* copies null terminator */ - if (! poolAppendChar(&parser->m_tempPool, *s)) + if (!poolAppendChar(&parser->m_tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); @@ -3319,11 +3106,9 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, /* s1 is null terminated, but not s2 */ for (; *s1 == *s2 && *s1 != 0; s1++, s2++) ; - if (*s1 == 0) - return XML_ERROR_DUPLICATE_ATTRIBUTE; + if (*s1 == 0) return XML_ERROR_DUPLICATE_ATTRIBUTE; } - if (! step) - step = PROBE_STEP(uriHash, mask, parser->m_nsAttsPower); + if (!step) step = PROBE_STEP(uriHash, mask, parser->m_nsAttsPower); j < step ? (j += nsAttsSize - step) : (j -= step); } } @@ -3332,7 +3117,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, parser->m_tempPool.ptr[-1] = parser->m_namespaceSeparator; s = b->prefix->name; do { - if (! poolAppendChar(&parser->m_tempPool, *s)) + if (!poolAppendChar(&parser->m_tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); } @@ -3347,7 +3132,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, parser->m_nsAtts[j].hash = uriHash; parser->m_nsAtts[j].uriName = s; - if (! --nPrefixes) { + if (!--nPrefixes) { i += 2; break; } @@ -3356,19 +3141,16 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, } } /* clear flags for the remaining attributes */ - for (; i < attIndex; i += 2) - ((XML_Char *)(appAtts[i]))[-1] = 0; + for (; i < attIndex; i += 2) ((XML_Char *)(appAtts[i]))[-1] = 0; for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) binding->attId->name[-1] = 0; - if (! parser->m_ns) - return XML_ERROR_NONE; + if (!parser->m_ns) return XML_ERROR_NONE; /* expand the element type name */ if (elementType->prefix) { binding = elementType->prefix->binding; - if (! binding) - return XML_ERROR_UNBOUND_PREFIX; + if (!binding) return XML_ERROR_UNBOUND_PREFIX; localPart = tagNamePtr->str; while (*localPart++ != XML_T(ASCII_COLON)) ; @@ -3392,13 +3174,11 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, if (n > binding->uriAlloc) { TAG *p; uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char)); - if (! uri) - return XML_ERROR_NO_MEMORY; + if (!uri) return XML_ERROR_NO_MEMORY; binding->uriAlloc = n + EXPAND_SPARE; memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); for (p = parser->m_tagStack; p; p = p->parent) - if (p->name.str == binding->uri) - p->name.str = uri; + if (p->name.str == binding->uri) p->name.str = uri; FREE(parser, binding->uri); binding->uri = uri; } @@ -3418,27 +3198,27 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, /* addBinding() overwrites the value of prefix->binding without checking. Therefore one must keep track of the old value outside of addBinding(). */ -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) { - static const XML_Char xmlNamespace[] - = {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, - ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, - ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, - ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, - ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, - ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0'}; +static enum XML_Error addBinding(XML_Parser parser, PREFIX *prefix, + const ATTRIBUTE_ID *attId, const XML_Char *uri, + BINDING **bindingsPtr) { + static const XML_Char xmlNamespace[] = { + ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, + ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, + ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, + ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, + ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, + ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, + ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, + ASCII_e, '\0'}; static const int xmlLen = (int)sizeof(xmlNamespace) / sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] - = {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, - ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, - ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, - ASCII_2, ASCII_0, ASCII_0, ASCII_0, ASCII_SLASH, ASCII_x, - ASCII_m, ASCII_l, ASCII_n, ASCII_s, ASCII_SLASH, '\0'}; - static const int xmlnsLen - = (int)sizeof(xmlnsNamespace) / sizeof(XML_Char) - 1; + static const XML_Char xmlnsNamespace[] = { + ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, + ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, + ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, + ASCII_2, ASCII_0, ASCII_0, ASCII_0, ASCII_SLASH, ASCII_x, + ASCII_m, ASCII_l, ASCII_n, ASCII_s, ASCII_SLASH, '\0'}; + static const int xmlnsLen = + (int)sizeof(xmlnsNamespace) / sizeof(XML_Char) - 1; XML_Bool mustBeXML = XML_FALSE; XML_Bool isXML = XML_TRUE; @@ -3448,27 +3228,24 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, int len; /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ - if (*uri == XML_T('\0') && prefix->name) - return XML_ERROR_UNDECLARING_PREFIX; + if (*uri == XML_T('\0') && prefix->name) return XML_ERROR_UNDECLARING_PREFIX; - if (prefix->name && prefix->name[0] == XML_T(ASCII_x) - && prefix->name[1] == XML_T(ASCII_m) - && prefix->name[2] == XML_T(ASCII_l)) { + if (prefix->name && prefix->name[0] == XML_T(ASCII_x) && + prefix->name[1] == XML_T(ASCII_m) && prefix->name[2] == XML_T(ASCII_l)) { /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) && prefix->name[4] == XML_T(ASCII_s) - && prefix->name[5] == XML_T('\0')) + if (prefix->name[3] == XML_T(ASCII_n) && + prefix->name[4] == XML_T(ASCII_s) && prefix->name[5] == XML_T('\0')) return XML_ERROR_RESERVED_PREFIX_XMLNS; - if (prefix->name[3] == XML_T('\0')) - mustBeXML = XML_TRUE; + if (prefix->name[3] == XML_T('\0')) mustBeXML = XML_TRUE; } for (len = 0; uri[len]; len++) { if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) isXML = XML_FALSE; - if (! mustBeXML && isXMLNS - && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) + if (!mustBeXML && isXMLNS && + (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) isXMLNS = XML_FALSE; } isXML = isXML && len == xmlLen; @@ -3478,29 +3255,25 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML : XML_ERROR_RESERVED_NAMESPACE_URI; - if (isXMLNS) - return XML_ERROR_RESERVED_NAMESPACE_URI; + if (isXMLNS) return XML_ERROR_RESERVED_NAMESPACE_URI; - if (parser->m_namespaceSeparator) - len++; + if (parser->m_namespaceSeparator) len++; if (parser->m_freeBindingList) { b = parser->m_freeBindingList; if (len > b->uriAlloc) { XML_Char *temp = (XML_Char *)REALLOC( parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; + if (temp == NULL) return XML_ERROR_NO_MEMORY; b->uri = temp; b->uriAlloc = len + EXPAND_SPARE; } parser->m_freeBindingList = b->nextTagBinding; } else { b = (BINDING *)MALLOC(parser, sizeof(BINDING)); - if (! b) - return XML_ERROR_NO_MEMORY; - b->uri - = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (! b->uri) { + if (!b) return XML_ERROR_NO_MEMORY; + b->uri = + (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (!b->uri) { FREE(parser, b); return XML_ERROR_NO_MEMORY; } @@ -3530,14 +3303,14 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, /* The idea here is to avoid using stack for each CDATA section when the whole file is parsed with one call. */ -static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, - const char **endPtr) { - enum XML_Error result - = doCdataSection(parser, parser->m_encoding, &start, end, endPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer); - if (result != XML_ERROR_NONE) - return result; +static enum XML_Error PTRCALL cdataSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) { + enum XML_Error result = + doCdataSection(parser, parser->m_encoding, &start, end, endPtr, + (XML_Bool)!parser->m_parsingStatus.finalBuffer); + if (result != XML_ERROR_NONE) return result; if (start) { if (parser->m_parentParser) { /* we are parsing an external entity */ parser->m_processor = externalEntityContentProcessor; @@ -3553,9 +3326,9 @@ cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, /* startPtr gets set to non-null if the section is closed, and to null if the section is not yet closed. */ -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore) { +static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *enc, + const char **startPtr, const char *end, + const char **nextPtr, XML_Bool haveMore) { const char *s = *startPtr; const char **eventPP; const char **eventEndPP; @@ -3575,89 +3348,90 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, int tok = XmlCdataSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { - case XML_TOK_CDATA_SECT_CLOSE: - if (parser->m_endCdataSectionHandler) - parser->m_endCdataSectionHandler(parser->m_handlerArg); - /* BEGIN disabled code */ - /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (0 && parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, - 0); - /* END disabled code */ - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (parser->m_parsingStatus.parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_DATA_NEWLINE: - if (parser->m_characterDataHandler) { - XML_Char c = 0xA; - parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_DATA_CHARS: { - XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - const enum XML_Convert_Result convert_res = XmlConvert( - enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - *eventEndPP = next; - charDataHandler(parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - if ((convert_res == XML_CONVERT_COMPLETED) - || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) - break; - *eventPP = s; - } - } else - charDataHandler(parser->m_handlerArg, (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - } break; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_CDATA_SECTION; - default: - /* Every token returned by XmlCdataSectionTok() has its own - * explicit case, so this default case will never be executed. - * We retain it as a safety net and exclude it from the coverage - * statistics. - * - * LCOV_EXCL_START - */ - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - /* LCOV_EXCL_STOP */ + case XML_TOK_CDATA_SECT_CLOSE: + if (parser->m_endCdataSectionHandler) + parser->m_endCdataSectionHandler(parser->m_handlerArg); + /* BEGIN disabled code */ + /* see comment under XML_TOK_CDATA_SECT_OPEN */ + else if (0 && parser->m_characterDataHandler) + parser->m_characterDataHandler(parser->m_handlerArg, + parser->m_dataBuf, 0); + /* END disabled code */ + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parser->m_parsingStatus.parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_DATA_NEWLINE: + if (parser->m_characterDataHandler) { + XML_Char c = 0xA; + parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_DATA_CHARS: { + XML_CharacterDataHandler charDataHandler = + parser->m_characterDataHandler; + if (charDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; + const enum XML_Convert_Result convert_res = XmlConvert( + enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + *eventEndPP = next; + charDataHandler(parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + if ((convert_res == XML_CONVERT_COMPLETED) || + (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + break; + *eventPP = s; + } + } else + charDataHandler(parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)next - (XML_Char *)s)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_CDATA_SECTION; + default: + /* Every token returned by XmlCdataSectionTok() has its own + * explicit case, so this default case will never be executed. + * We retain it as a safety net and exclude it from the coverage + * statistics. + * + * LCOV_EXCL_START + */ + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + /* LCOV_EXCL_STOP */ } *eventPP = s = next; switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default:; + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default:; } } /* not reached */ @@ -3668,14 +3442,14 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, /* The idea here is to avoid using stack for each IGNORE section when the whole file is parsed with one call. */ -static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, const char *start, const char *end, - const char **endPtr) { - enum XML_Error result - = doIgnoreSection(parser, parser->m_encoding, &start, end, endPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer); - if (result != XML_ERROR_NONE) - return result; +static enum XML_Error PTRCALL ignoreSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) { + enum XML_Error result = + doIgnoreSection(parser, parser->m_encoding, &start, end, endPtr, + (XML_Bool)!parser->m_parsingStatus.finalBuffer); + if (result != XML_ERROR_NONE) return result; if (start) { parser->m_processor = prologProcessor; return prologProcessor(parser, start, end, endPtr); @@ -3686,9 +3460,9 @@ ignoreSectionProcessor(XML_Parser parser, const char *start, const char *end, /* startPtr gets set to non-null is the section is closed, and to null if the section is not yet closed. */ -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore) { +static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *enc, + const char **startPtr, const char *end, + const char **nextPtr, XML_Bool haveMore) { const char *next; int tok; const char *s = *startPtr; @@ -3719,61 +3493,59 @@ doIgnoreSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, tok = XmlIgnoreSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { - case XML_TOK_IGNORE_SECT: - if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (parser->m_parsingStatus.parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ - default: - /* All of the tokens that XmlIgnoreSectionTok() returns have - * explicit cases to handle them, so this default case is never - * executed. We keep it as a safety net anyway, and remove it - * from our test coverage statistics. - * - * LCOV_EXCL_START - */ - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - /* LCOV_EXCL_STOP */ + case XML_TOK_IGNORE_SECT: + if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parser->m_parsingStatus.parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ + default: + /* All of the tokens that XmlIgnoreSectionTok() returns have + * explicit cases to handle them, so this default case is never + * executed. We keep it as a safety net anyway, and remove it + * from our test coverage statistics. + * + * LCOV_EXCL_START + */ + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + /* LCOV_EXCL_STOP */ } /* not reached */ } #endif /* XML_DTD */ -static enum XML_Error -initializeEncoding(XML_Parser parser) { +static enum XML_Error initializeEncoding(XML_Parser parser) { const char *s; #ifdef XML_UNICODE char encodingBuf[128]; /* See comments abount `protoclEncodingName` in parserInit() */ - if (! parser->m_protocolEncodingName) + if (!parser->m_protocolEncodingName) s = NULL; else { int i; for (i = 0; parser->m_protocolEncodingName[i]; i++) { - if (i == sizeof(encodingBuf) - 1 - || (parser->m_protocolEncodingName[i] & ~0x7f) != 0) { + if (i == sizeof(encodingBuf) - 1 || + (parser->m_protocolEncodingName[i] & ~0x7f) != 0) { encodingBuf[0] = '\0'; break; } @@ -3791,9 +3563,8 @@ initializeEncoding(XML_Parser parser) { return handleUnknownEncoding(parser, parser->m_protocolEncodingName); } -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, - const char *next) { +static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next) { const char *encodingName = NULL; const XML_Char *storedEncName = NULL; const ENCODING *newEncoding = NULL; @@ -3801,7 +3572,7 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, const char *versionend; const XML_Char *storedversion = NULL; int standalone = -1; - if (! (parser->m_ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)( + if (!(parser->m_ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)( isGeneralTextEntity, parser->m_encoding, s, next, &parser->m_eventPtr, &version, &versionend, &encodingName, &newEncoding, &standalone)) { if (isGeneralTextEntity) @@ -3809,11 +3580,11 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, else return XML_ERROR_XML_DECL; } - if (! isGeneralTextEntity && standalone == 1) { + if (!isGeneralTextEntity && standalone == 1) { parser->m_dtd->standalone = XML_TRUE; #ifdef XML_DTD - if (parser->m_paramEntityParsing - == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + if (parser->m_paramEntityParsing == + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif /* XML_DTD */ } @@ -3822,16 +3593,14 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, storedEncName = poolStoreString( &parser->m_temp2Pool, parser->m_encoding, encodingName, encodingName + XmlNameLength(parser->m_encoding, encodingName)); - if (! storedEncName) - return XML_ERROR_NO_MEMORY; + if (!storedEncName) return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_temp2Pool); } if (version) { - storedversion - = poolStoreString(&parser->m_temp2Pool, parser->m_encoding, version, - versionend - parser->m_encoding->minBytesPerChar); - if (! storedversion) - return XML_ERROR_NO_MEMORY; + storedversion = + poolStoreString(&parser->m_temp2Pool, parser->m_encoding, version, + versionend - parser->m_encoding->minBytesPerChar); + if (!storedversion) return XML_ERROR_NO_MEMORY; } parser->m_xmlDeclHandler(parser->m_handlerArg, storedversion, storedEncName, standalone); @@ -3844,21 +3613,20 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, * of bytes in the smallest representation of a character? If * this is UTF-16, is it the same endianness? */ - if (newEncoding->minBytesPerChar != parser->m_encoding->minBytesPerChar - || (newEncoding->minBytesPerChar == 2 - && newEncoding != parser->m_encoding)) { + if (newEncoding->minBytesPerChar != parser->m_encoding->minBytesPerChar || + (newEncoding->minBytesPerChar == 2 && + newEncoding != parser->m_encoding)) { parser->m_eventPtr = encodingName; return XML_ERROR_INCORRECT_ENCODING; } parser->m_encoding = newEncoding; } else if (encodingName) { enum XML_Error result; - if (! storedEncName) { + if (!storedEncName) { storedEncName = poolStoreString( &parser->m_temp2Pool, parser->m_encoding, encodingName, encodingName + XmlNameLength(parser->m_encoding, encodingName)); - if (! storedEncName) - return XML_ERROR_NO_MEMORY; + if (!storedEncName) return XML_ERROR_NO_MEMORY; } result = handleUnknownEncoding(parser, storedEncName); poolClear(&parser->m_temp2Pool); @@ -3868,19 +3636,17 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, } } - if (storedEncName || storedversion) - poolClear(&parser->m_temp2Pool); + if (storedEncName || storedversion) poolClear(&parser->m_temp2Pool); return XML_ERROR_NONE; } -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { +static enum XML_Error handleUnknownEncoding(XML_Parser parser, + const XML_Char *encodingName) { if (parser->m_unknownEncodingHandler) { XML_Encoding info; int i; - for (i = 0; i < 256; i++) - info.map[i] = -1; + for (i = 0; i < 256; i++) info.map[i] = -1; info.convert = NULL; info.data = NULL; info.release = NULL; @@ -3888,9 +3654,8 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { encodingName, &info)) { ENCODING *enc; parser->m_unknownEncodingMem = MALLOC(parser, XmlSizeOfUnknownEncoding()); - if (! parser->m_unknownEncodingMem) { - if (info.release) - info.release(info.data); + if (!parser->m_unknownEncodingMem) { + if (info.release) info.release(info.data); return XML_ERROR_NO_MEMORY; } enc = (parser->m_ns ? XmlInitUnknownEncodingNS : XmlInitUnknownEncoding)( @@ -3902,30 +3667,27 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { return XML_ERROR_NONE; } } - if (info.release != NULL) - info.release(info.data); + if (info.release != NULL) info.release(info.data); } return XML_ERROR_UNKNOWN_ENCODING; } -static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL prologInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; + if (result != XML_ERROR_NONE) return result; parser->m_processor = prologProcessor; return prologProcessor(parser, s, end, nextPtr); } #ifdef XML_DTD -static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL externalParEntInitProcessor( + XML_Parser parser, const char *s, const char *end, const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; + if (result != XML_ERROR_NONE) return result; /* we know now that XML_Parse(Buffer) has been called, so we consider the external parameter entity read */ @@ -3940,9 +3702,10 @@ externalParEntInitProcessor(XML_Parser parser, const char *s, const char *end, } } -static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL entityValueInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) { int tok; const char *start = s; const char *next = start; @@ -3952,28 +3715,27 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, tok = XmlPrologTok(parser->m_encoding, start, end, &next); parser->m_eventEndPtr = next; if (tok <= 0) { - if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; } /* found end of entity value - can store it now */ return storeEntityValue(parser, parser->m_encoding, s, end); } else if (tok == XML_TOK_XML_DECL) { enum XML_Error result; result = processXmlDecl(parser, 0, start, next); - if (result != XML_ERROR_NONE) - return result; + if (result != XML_ERROR_NONE) return result; /* At this point, m_parsingStatus.parsing cannot be XML_SUSPENDED. For * that to happen, a parameter entity parsing handler must have attempted * to suspend the parser, which fails and raises an error. The parser can @@ -3993,8 +3755,8 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, then, when this routine is entered the next time, XmlPrologTok will return XML_TOK_INVALID, since the BOM is still in the buffer */ - else if (tok == XML_TOK_BOM && next == end - && ! parser->m_parsingStatus.finalBuffer) { + else if (tok == XML_TOK_BOM && next == end && + !parser->m_parsingStatus.finalBuffer) { *nextPtr = next; return XML_ERROR_NONE; } @@ -4011,28 +3773,29 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, } } -static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL externalParEntProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) { const char *next = s; int tok; tok = XmlPrologTok(parser->m_encoding, s, end, &next); if (tok <= 0) { - if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; } } /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. @@ -4046,12 +3809,13 @@ externalParEntProcessor(XML_Parser parser, const char *s, const char *end, parser->m_processor = prologProcessor; return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); + (XML_Bool)!parser->m_parsingStatus.finalBuffer, XML_TRUE); } -static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL entityValueProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) { const char *start = s; const char *next = s; const ENCODING *enc = parser->m_encoding; @@ -4060,20 +3824,20 @@ entityValueProcessor(XML_Parser parser, const char *s, const char *end, for (;;) { tok = XmlPrologTok(enc, start, end, &next); if (tok <= 0) { - if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; } /* found end of entity value - can store it now */ return storeEntityValue(parser, enc, s, end); @@ -4084,42 +3848,43 @@ entityValueProcessor(XML_Parser parser, const char *s, const char *end, #endif /* XML_DTD */ -static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL prologProcessor(XML_Parser parser, const char *s, + const char *end, + const char **nextPtr) { const char *next = s; int tok = XmlPrologTok(parser->m_encoding, s, end, &next); return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); + (XML_Bool)!parser->m_parsingStatus.finalBuffer, XML_TRUE); } -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, - int tok, const char *next, const char **nextPtr, XML_Bool haveMore, - XML_Bool allowClosingDoctype) { +static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end, int tok, + const char *next, const char **nextPtr, + XML_Bool haveMore, + XML_Bool allowClosingDoctype) { #ifdef XML_DTD static const XML_Char externalSubsetName[] = {ASCII_HASH, '\0'}; #endif /* XML_DTD */ - static const XML_Char atypeCDATA[] - = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; + static const XML_Char atypeCDATA[] = {ASCII_C, ASCII_D, ASCII_A, + ASCII_T, ASCII_A, '\0'}; static const XML_Char atypeID[] = {ASCII_I, ASCII_D, '\0'}; - static const XML_Char atypeIDREF[] - = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'}; - static const XML_Char atypeIDREFS[] - = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'}; - static const XML_Char atypeENTITY[] - = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'}; - static const XML_Char atypeENTITIES[] - = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, - ASCII_I, ASCII_E, ASCII_S, '\0'}; - static const XML_Char atypeNMTOKEN[] - = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'}; - static const XML_Char atypeNMTOKENS[] - = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, - ASCII_E, ASCII_N, ASCII_S, '\0'}; - static const XML_Char notationPrefix[] - = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, - ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0'}; + static const XML_Char atypeIDREF[] = {ASCII_I, ASCII_D, ASCII_R, + ASCII_E, ASCII_F, '\0'}; + static const XML_Char atypeIDREFS[] = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, + ASCII_F, ASCII_S, '\0'}; + static const XML_Char atypeENTITY[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, + ASCII_T, ASCII_Y, '\0'}; + static const XML_Char atypeENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, + ASCII_I, ASCII_T, ASCII_I, + ASCII_E, ASCII_S, '\0'}; + static const XML_Char atypeNMTOKEN[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, + ASCII_K, ASCII_E, ASCII_N, '\0'}; + static const XML_Char atypeNMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, + ASCII_O, ASCII_K, ASCII_E, + ASCII_N, ASCII_S, '\0'}; + static const XML_Char notationPrefix[] = { + ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, + ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0'}; static const XML_Char enumValueSep[] = {ASCII_PIPE, '\0'}; static const XML_Char enumValueStart[] = {ASCII_LPAREN, '\0'}; @@ -4149,941 +3914,900 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, return XML_ERROR_NONE; } switch (tok) { - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case -XML_TOK_PROLOG_S: - tok = -tok; - break; - case XML_TOK_NONE: + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case -XML_TOK_PROLOG_S: + tok = -tok; + break; + case XML_TOK_NONE: #ifdef XML_DTD - /* for internal PE NOT referenced between declarations */ - if (enc != parser->m_encoding - && ! parser->m_openInternalEntities->betweenDecl) { - *nextPtr = s; - return XML_ERROR_NONE; - } - /* WFC: PE Between Declarations - must check that PE contains - complete markup, not only for external PEs, but also for - internal PEs if the reference occurs between declarations. - */ - if (parser->m_isParamEntity || enc != parser->m_encoding) { - if (XmlTokenRole(&parser->m_prologState, XML_TOK_NONE, end, end, enc) - == XML_ROLE_ERROR) - return XML_ERROR_INCOMPLETE_PE; - *nextPtr = s; - return XML_ERROR_NONE; - } + /* for internal PE NOT referenced between declarations */ + if (enc != parser->m_encoding && + !parser->m_openInternalEntities->betweenDecl) { + *nextPtr = s; + return XML_ERROR_NONE; + } + /* WFC: PE Between Declarations - must check that PE contains + complete markup, not only for external PEs, but also for + internal PEs if the reference occurs between declarations. + */ + if (parser->m_isParamEntity || enc != parser->m_encoding) { + if (XmlTokenRole(&parser->m_prologState, XML_TOK_NONE, end, end, + enc) == XML_ROLE_ERROR) + return XML_ERROR_INCOMPLETE_PE; + *nextPtr = s; + return XML_ERROR_NONE; + } #endif /* XML_DTD */ - return XML_ERROR_NO_ELEMENTS; - default: - tok = -tok; - next = end; - break; + return XML_ERROR_NO_ELEMENTS; + default: + tok = -tok; + next = end; + break; } } role = XmlTokenRole(&parser->m_prologState, tok, s, next, enc); switch (role) { - case XML_ROLE_XML_DECL: { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = parser->m_encoding; - handleDefault = XML_FALSE; - } break; - case XML_ROLE_DOCTYPE_NAME: - if (parser->m_startDoctypeDeclHandler) { - parser->m_doctypeName - = poolStoreString(&parser->m_tempPool, enc, s, next); - if (! parser->m_doctypeName) - return XML_ERROR_NO_MEMORY; - poolFinish(&parser->m_tempPool); - parser->m_doctypePubid = NULL; + case XML_ROLE_XML_DECL: { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) return result; + enc = parser->m_encoding; handleDefault = XML_FALSE; - } - parser->m_doctypeSysid = NULL; /* always initialize to NULL */ - break; - case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: - if (parser->m_startDoctypeDeclHandler) { - parser->m_startDoctypeDeclHandler( - parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid, - parser->m_doctypePubid, 1); - parser->m_doctypeName = NULL; - poolClear(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - break; -#ifdef XML_DTD - case XML_ROLE_TEXT_DECL: { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = parser->m_encoding; - handleDefault = XML_FALSE; - } break; -#endif /* XML_DTD */ - case XML_ROLE_DOCTYPE_PUBLIC_ID: -#ifdef XML_DTD - parser->m_useForeignDTD = XML_FALSE; - parser->m_declEntity = (ENTITY *)lookup( - parser, &dtd->paramEntities, externalSubsetName, sizeof(ENTITY)); - if (! parser->m_declEntity) - return XML_ERROR_NO_MEMORY; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_startDoctypeDeclHandler) { - XML_Char *pubId; - if (! XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - pubId = poolStoreString(&parser->m_tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! pubId) - return XML_ERROR_NO_MEMORY; - normalizePublicId(pubId); - poolFinish(&parser->m_tempPool); - parser->m_doctypePubid = pubId; - handleDefault = XML_FALSE; - goto alreadyChecked; - } - /* fall through */ - case XML_ROLE_ENTITY_PUBLIC_ID: - if (! XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - alreadyChecked: - if (dtd->keepProcessing && parser->m_declEntity) { - XML_Char *tem - = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - parser->m_declEntity->publicId = tem; - poolFinish(&dtd->pool); - /* Don't suppress the default handler if we fell through from - * the XML_ROLE_DOCTYPE_PUBLIC_ID case. - */ - if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_PUBLIC_ID) + } break; + case XML_ROLE_DOCTYPE_NAME: + if (parser->m_startDoctypeDeclHandler) { + parser->m_doctypeName = + poolStoreString(&parser->m_tempPool, enc, s, next); + if (!parser->m_doctypeName) return XML_ERROR_NO_MEMORY; + poolFinish(&parser->m_tempPool); + parser->m_doctypePubid = NULL; handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_CLOSE: - if (allowClosingDoctype != XML_TRUE) { - /* Must not close doctype from within expanded parameter entities */ - return XML_ERROR_INVALID_TOKEN; - } - - if (parser->m_doctypeName) { - parser->m_startDoctypeDeclHandler( - parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid, - parser->m_doctypePubid, 0); - poolClear(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - /* parser->m_doctypeSysid will be non-NULL in the case of a previous - XML_ROLE_DOCTYPE_SYSTEM_ID, even if parser->m_startDoctypeDeclHandler - was not set, indicating an external subset - */ -#ifdef XML_DTD - if (parser->m_doctypeSysid || parser->m_useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_paramEntityParsing - && parser->m_externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, sizeof(ENTITY)); - if (! entity) { - /* The external subset name "#" will have already been - * inserted into the hash table at the start of the - * external entity parsing, so no allocation will happen - * and lookup() cannot fail. - */ - return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */ - } - if (parser->m_useForeignDTD) - entity->base = parser->m_curBase; - dtd->paramEntityRead = XML_FALSE; - if (! parser->m_externalEntityRefHandler( - parser->m_externalEntityRefHandlerArg, 0, entity->base, - entity->systemId, entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (! dtd->standalone && parser->m_notStandaloneHandler - && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else if (! parser->m_doctypeSysid) - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ } + parser->m_doctypeSysid = NULL; /* always initialize to NULL */ + break; + case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: + if (parser->m_startDoctypeDeclHandler) { + parser->m_startDoctypeDeclHandler( + parser->m_handlerArg, parser->m_doctypeName, + parser->m_doctypeSysid, parser->m_doctypePubid, 1); + parser->m_doctypeName = NULL; + poolClear(&parser->m_tempPool); + handleDefault = XML_FALSE; + } + break; +#ifdef XML_DTD + case XML_ROLE_TEXT_DECL: { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) return result; + enc = parser->m_encoding; + handleDefault = XML_FALSE; + } break; +#endif /* XML_DTD */ + case XML_ROLE_DOCTYPE_PUBLIC_ID: +#ifdef XML_DTD parser->m_useForeignDTD = XML_FALSE; - } -#endif /* XML_DTD */ - if (parser->m_endDoctypeDeclHandler) { - parser->m_endDoctypeDeclHandler(parser->m_handlerArg); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_INSTANCE_START: -#ifdef XML_DTD - /* if there is no DOCTYPE declaration then now is the - last chance to read the foreign DTD - */ - if (parser->m_useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_paramEntityParsing - && parser->m_externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, sizeof(ENTITY)); - if (! entity) - return XML_ERROR_NO_MEMORY; - entity->base = parser->m_curBase; - dtd->paramEntityRead = XML_FALSE; - if (! parser->m_externalEntityRefHandler( - parser->m_externalEntityRefHandlerArg, 0, entity->base, - entity->systemId, entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (! dtd->standalone && parser->m_notStandaloneHandler - && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - } -#endif /* XML_DTD */ - parser->m_processor = contentProcessor; - return contentProcessor(parser, s, end, nextPtr); - case XML_ROLE_ATTLIST_ELEMENT_NAME: - parser->m_declElementType = getElementType(parser, enc, s, next); - if (! parser->m_declElementType) - return XML_ERROR_NO_MEMORY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_NAME: - parser->m_declAttributeId = getAttributeId(parser, enc, s, next); - if (! parser->m_declAttributeId) - return XML_ERROR_NO_MEMORY; - parser->m_declAttributeIsCdata = XML_FALSE; - parser->m_declAttributeType = NULL; - parser->m_declAttributeIsId = XML_FALSE; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_CDATA: - parser->m_declAttributeIsCdata = XML_TRUE; - parser->m_declAttributeType = atypeCDATA; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ID: - parser->m_declAttributeIsId = XML_TRUE; - parser->m_declAttributeType = atypeID; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREF: - parser->m_declAttributeType = atypeIDREF; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: - parser->m_declAttributeType = atypeIDREFS; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: - parser->m_declAttributeType = atypeENTITY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: - parser->m_declAttributeType = atypeENTITIES; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: - parser->m_declAttributeType = atypeNMTOKEN; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: - parser->m_declAttributeType = atypeNMTOKENS; - checkAttListDeclHandler: - if (dtd->keepProcessing && parser->m_attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTRIBUTE_ENUM_VALUE: - case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: - if (dtd->keepProcessing && parser->m_attlistDeclHandler) { - const XML_Char *prefix; - if (parser->m_declAttributeType) { - prefix = enumValueSep; - } else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE ? notationPrefix - : enumValueStart); - } - if (! poolAppendString(&parser->m_tempPool, prefix)) - return XML_ERROR_NO_MEMORY; - if (! poolAppend(&parser->m_tempPool, enc, s, next)) - return XML_ERROR_NO_MEMORY; - parser->m_declAttributeType = parser->m_tempPool.start; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: - case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - if (! defineAttribute(parser->m_declElementType, - parser->m_declAttributeId, - parser->m_declAttributeIsCdata, - parser->m_declAttributeIsId, 0, parser)) - return XML_ERROR_NO_MEMORY; - if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { - if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) - || (*parser->m_declAttributeType == XML_T(ASCII_N) - && parser->m_declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) - || ! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - parser->m_declAttributeType = parser->m_tempPool.start; - poolFinish(&parser->m_tempPool); - } - *eventEndPP = s; - parser->m_attlistDeclHandler( - parser->m_handlerArg, parser->m_declElementType->name, - parser->m_declAttributeId->name, parser->m_declAttributeType, 0, - role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); - poolClear(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: - case XML_ROLE_FIXED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - const XML_Char *attVal; - enum XML_Error result = storeAttributeValue( - parser, enc, parser->m_declAttributeIsCdata, - s + enc->minBytesPerChar, next - enc->minBytesPerChar, &dtd->pool); - if (result) - return result; - attVal = poolStart(&dtd->pool); - poolFinish(&dtd->pool); - /* ID attributes aren't allowed to have a default */ - if (! defineAttribute( - parser->m_declElementType, parser->m_declAttributeId, - parser->m_declAttributeIsCdata, XML_FALSE, attVal, parser)) - return XML_ERROR_NO_MEMORY; - if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { - if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) - || (*parser->m_declAttributeType == XML_T(ASCII_N) - && parser->m_declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) - || ! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - parser->m_declAttributeType = parser->m_tempPool.start; - poolFinish(&parser->m_tempPool); - } - *eventEndPP = s; - parser->m_attlistDeclHandler( - parser->m_handlerArg, parser->m_declElementType->name, - parser->m_declAttributeId->name, parser->m_declAttributeType, - attVal, role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); - poolClear(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_ENTITY_VALUE: - if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue( - parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (parser->m_declEntity) { - parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool); - parser->m_declEntity->textLen - = (int)(poolLength(&dtd->entityValuePool)); - poolFinish(&dtd->entityValuePool); - if (parser->m_entityDeclHandler) { - *eventEndPP = s; - parser->m_entityDeclHandler( - parser->m_handlerArg, parser->m_declEntity->name, - parser->m_declEntity->is_param, parser->m_declEntity->textPtr, - parser->m_declEntity->textLen, parser->m_curBase, 0, 0, 0); - handleDefault = XML_FALSE; - } - } else - poolDiscard(&dtd->entityValuePool); - if (result != XML_ERROR_NONE) - return result; - } - break; - case XML_ROLE_DOCTYPE_SYSTEM_ID: -#ifdef XML_DTD - parser->m_useForeignDTD = XML_FALSE; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_startDoctypeDeclHandler) { - parser->m_doctypeSysid = poolStoreString(&parser->m_tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (parser->m_doctypeSysid == NULL) - return XML_ERROR_NO_MEMORY; - poolFinish(&parser->m_tempPool); - handleDefault = XML_FALSE; - } -#ifdef XML_DTD - else - /* use externalSubsetName to make parser->m_doctypeSysid non-NULL - for the case where no parser->m_startDoctypeDeclHandler is set */ - parser->m_doctypeSysid = externalSubsetName; -#endif /* XML_DTD */ - if (! dtd->standalone -#ifdef XML_DTD - && ! parser->m_paramEntityParsing -#endif /* XML_DTD */ - && parser->m_notStandaloneHandler - && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) - return XML_ERROR_NOT_STANDALONE; -#ifndef XML_DTD - break; -#else /* XML_DTD */ - if (! parser->m_declEntity) { parser->m_declEntity = (ENTITY *)lookup( parser, &dtd->paramEntities, externalSubsetName, sizeof(ENTITY)); - if (! parser->m_declEntity) - return XML_ERROR_NO_MEMORY; - parser->m_declEntity->publicId = NULL; - } + if (!parser->m_declEntity) return XML_ERROR_NO_MEMORY; #endif /* XML_DTD */ - /* fall through */ - case XML_ROLE_ENTITY_SYSTEM_ID: - if (dtd->keepProcessing && parser->m_declEntity) { - parser->m_declEntity->systemId - = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + dtd->hasParamEntityRefs = XML_TRUE; + if (parser->m_startDoctypeDeclHandler) { + XML_Char *pubId; + if (!XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; + pubId = poolStoreString(&parser->m_tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!pubId) return XML_ERROR_NO_MEMORY; + normalizePublicId(pubId); + poolFinish(&parser->m_tempPool); + parser->m_doctypePubid = pubId; + handleDefault = XML_FALSE; + goto alreadyChecked; + } + /* fall through */ + case XML_ROLE_ENTITY_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; + alreadyChecked: + if (dtd->keepProcessing && parser->m_declEntity) { + XML_Char *tem = + poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (! parser->m_declEntity->systemId) - return XML_ERROR_NO_MEMORY; - parser->m_declEntity->base = parser->m_curBase; - poolFinish(&dtd->pool); - /* Don't suppress the default handler if we fell through from - * the XML_ROLE_DOCTYPE_SYSTEM_ID case. - */ - if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_SYSTEM_ID) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && parser->m_declEntity - && parser->m_entityDeclHandler) { - *eventEndPP = s; - parser->m_entityDeclHandler( - parser->m_handlerArg, parser->m_declEntity->name, - parser->m_declEntity->is_param, 0, 0, parser->m_declEntity->base, - parser->m_declEntity->systemId, parser->m_declEntity->publicId, 0); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_NOTATION_NAME: - if (dtd->keepProcessing && parser->m_declEntity) { - parser->m_declEntity->notation - = poolStoreString(&dtd->pool, enc, s, next); - if (! parser->m_declEntity->notation) - return XML_ERROR_NO_MEMORY; - poolFinish(&dtd->pool); - if (parser->m_unparsedEntityDeclHandler) { - *eventEndPP = s; - parser->m_unparsedEntityDeclHandler( - parser->m_handlerArg, parser->m_declEntity->name, - parser->m_declEntity->base, parser->m_declEntity->systemId, - parser->m_declEntity->publicId, parser->m_declEntity->notation); - handleDefault = XML_FALSE; - } else if (parser->m_entityDeclHandler) { - *eventEndPP = s; - parser->m_entityDeclHandler( - parser->m_handlerArg, parser->m_declEntity->name, 0, 0, 0, - parser->m_declEntity->base, parser->m_declEntity->systemId, - parser->m_declEntity->publicId, parser->m_declEntity->notation); - handleDefault = XML_FALSE; + if (!tem) return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + parser->m_declEntity->publicId = tem; + poolFinish(&dtd->pool); + /* Don't suppress the default handler if we fell through from + * the XML_ROLE_DOCTYPE_PUBLIC_ID case. + */ + if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_PUBLIC_ID) + handleDefault = XML_FALSE; } - } - break; - case XML_ROLE_GENERAL_ENTITY_NAME: { - if (XmlPredefinedEntityName(enc, s, next)) { - parser->m_declEntity = NULL; break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (! name) - return XML_ERROR_NO_MEMORY; - parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, - name, sizeof(ENTITY)); - if (! parser->m_declEntity) - return XML_ERROR_NO_MEMORY; - if (parser->m_declEntity->name != name) { - poolDiscard(&dtd->pool); - parser->m_declEntity = NULL; - } else { - poolFinish(&dtd->pool); - parser->m_declEntity->publicId = NULL; - parser->m_declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - parser->m_declEntity->is_internal - = ! (parser->m_parentParser || parser->m_openInternalEntities); - if (parser->m_entityDeclHandler) - handleDefault = XML_FALSE; + case XML_ROLE_DOCTYPE_CLOSE: + if (allowClosingDoctype != XML_TRUE) { + /* Must not close doctype from within expanded parameter entities */ + return XML_ERROR_INVALID_TOKEN; } - } else { - poolDiscard(&dtd->pool); - parser->m_declEntity = NULL; - } - } break; - case XML_ROLE_PARAM_ENTITY_NAME: + + if (parser->m_doctypeName) { + parser->m_startDoctypeDeclHandler( + parser->m_handlerArg, parser->m_doctypeName, + parser->m_doctypeSysid, parser->m_doctypePubid, 0); + poolClear(&parser->m_tempPool); + handleDefault = XML_FALSE; + } + /* parser->m_doctypeSysid will be non-NULL in the case of a previous + XML_ROLE_DOCTYPE_SYSTEM_ID, even if parser->m_startDoctypeDeclHandler + was not set, indicating an external subset + */ #ifdef XML_DTD - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (! name) - return XML_ERROR_NO_MEMORY; - parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, - name, sizeof(ENTITY)); - if (! parser->m_declEntity) - return XML_ERROR_NO_MEMORY; - if (parser->m_declEntity->name != name) { - poolDiscard(&dtd->pool); - parser->m_declEntity = NULL; - } else { - poolFinish(&dtd->pool); - parser->m_declEntity->publicId = NULL; - parser->m_declEntity->is_param = XML_TRUE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - parser->m_declEntity->is_internal - = ! (parser->m_parentParser || parser->m_openInternalEntities); - if (parser->m_entityDeclHandler) - handleDefault = XML_FALSE; + if (parser->m_doctypeSysid || parser->m_useForeignDTD) { + XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; + dtd->hasParamEntityRefs = XML_TRUE; + if (parser->m_paramEntityParsing && + parser->m_externalEntityRefHandler) { + ENTITY *entity = + (ENTITY *)lookup(parser, &dtd->paramEntities, + externalSubsetName, sizeof(ENTITY)); + if (!entity) { + /* The external subset name "#" will have already been + * inserted into the hash table at the start of the + * external entity parsing, so no allocation will happen + * and lookup() cannot fail. + */ + return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */ + } + if (parser->m_useForeignDTD) entity->base = parser->m_curBase; + dtd->paramEntityRead = XML_FALSE; + if (!parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead) { + if (!dtd->standalone && parser->m_notStandaloneHandler && + !parser->m_notStandaloneHandler(parser->m_handlerArg)) + return XML_ERROR_NOT_STANDALONE; + } + /* if we didn't read the foreign DTD then this means that there + is no external subset and we must reset dtd->hasParamEntityRefs + */ + else if (!parser->m_doctypeSysid) + dtd->hasParamEntityRefs = hadParamEntityRefs; + /* end of DTD - no need to update dtd->keepProcessing */ + } + parser->m_useForeignDTD = XML_FALSE; } - } else { - poolDiscard(&dtd->pool); - parser->m_declEntity = NULL; - } -#else /* not XML_DTD */ - parser->m_declEntity = NULL; #endif /* XML_DTD */ - break; - case XML_ROLE_NOTATION_NAME: - parser->m_declNotationPublicId = NULL; - parser->m_declNotationName = NULL; - if (parser->m_notationDeclHandler) { - parser->m_declNotationName - = poolStoreString(&parser->m_tempPool, enc, s, next); - if (! parser->m_declNotationName) - return XML_ERROR_NO_MEMORY; - poolFinish(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_PUBLIC_ID: - if (! XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - if (parser - ->m_declNotationName) { /* means m_notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&parser->m_tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - parser->m_declNotationPublicId = tem; - poolFinish(&parser->m_tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_SYSTEM_ID: - if (parser->m_declNotationName && parser->m_notationDeclHandler) { - const XML_Char *systemId = poolStoreString(&parser->m_tempPool, enc, + if (parser->m_endDoctypeDeclHandler) { + parser->m_endDoctypeDeclHandler(parser->m_handlerArg); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_INSTANCE_START: +#ifdef XML_DTD + /* if there is no DOCTYPE declaration then now is the + last chance to read the foreign DTD + */ + if (parser->m_useForeignDTD) { + XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; + dtd->hasParamEntityRefs = XML_TRUE; + if (parser->m_paramEntityParsing && + parser->m_externalEntityRefHandler) { + ENTITY *entity = + (ENTITY *)lookup(parser, &dtd->paramEntities, + externalSubsetName, sizeof(ENTITY)); + if (!entity) return XML_ERROR_NO_MEMORY; + entity->base = parser->m_curBase; + dtd->paramEntityRead = XML_FALSE; + if (!parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead) { + if (!dtd->standalone && parser->m_notStandaloneHandler && + !parser->m_notStandaloneHandler(parser->m_handlerArg)) + return XML_ERROR_NOT_STANDALONE; + } + /* if we didn't read the foreign DTD then this means that there + is no external subset and we must reset dtd->hasParamEntityRefs + */ + else + dtd->hasParamEntityRefs = hadParamEntityRefs; + /* end of DTD - no need to update dtd->keepProcessing */ + } + } +#endif /* XML_DTD */ + parser->m_processor = contentProcessor; + return contentProcessor(parser, s, end, nextPtr); + case XML_ROLE_ATTLIST_ELEMENT_NAME: + parser->m_declElementType = getElementType(parser, enc, s, next); + if (!parser->m_declElementType) return XML_ERROR_NO_MEMORY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_NAME: + parser->m_declAttributeId = getAttributeId(parser, enc, s, next); + if (!parser->m_declAttributeId) return XML_ERROR_NO_MEMORY; + parser->m_declAttributeIsCdata = XML_FALSE; + parser->m_declAttributeType = NULL; + parser->m_declAttributeIsId = XML_FALSE; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_CDATA: + parser->m_declAttributeIsCdata = XML_TRUE; + parser->m_declAttributeType = atypeCDATA; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ID: + parser->m_declAttributeIsId = XML_TRUE; + parser->m_declAttributeType = atypeID; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREF: + parser->m_declAttributeType = atypeIDREF; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: + parser->m_declAttributeType = atypeIDREFS; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: + parser->m_declAttributeType = atypeENTITY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: + parser->m_declAttributeType = atypeENTITIES; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: + parser->m_declAttributeType = atypeNMTOKEN; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: + parser->m_declAttributeType = atypeNMTOKENS; + checkAttListDeclHandler: + if (dtd->keepProcessing && parser->m_attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTRIBUTE_ENUM_VALUE: + case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: + if (dtd->keepProcessing && parser->m_attlistDeclHandler) { + const XML_Char *prefix; + if (parser->m_declAttributeType) { + prefix = enumValueSep; + } else { + prefix = + (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE ? notationPrefix + : enumValueStart); + } + if (!poolAppendString(&parser->m_tempPool, prefix)) + return XML_ERROR_NO_MEMORY; + if (!poolAppend(&parser->m_tempPool, enc, s, next)) + return XML_ERROR_NO_MEMORY; + parser->m_declAttributeType = parser->m_tempPool.start; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: + case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + if (!defineAttribute(parser->m_declElementType, + parser->m_declAttributeId, + parser->m_declAttributeIsCdata, + parser->m_declAttributeIsId, 0, parser)) + return XML_ERROR_NO_MEMORY; + if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { + if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) || + (*parser->m_declAttributeType == XML_T(ASCII_N) && + parser->m_declAttributeType[1] == XML_T(ASCII_O))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) || + !poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + parser->m_declAttributeType = parser->m_tempPool.start; + poolFinish(&parser->m_tempPool); + } + *eventEndPP = s; + parser->m_attlistDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, + parser->m_declAttributeId->name, parser->m_declAttributeType, 0, + role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + poolClear(&parser->m_tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: + case XML_ROLE_FIXED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + const XML_Char *attVal; + enum XML_Error result = + storeAttributeValue(parser, enc, parser->m_declAttributeIsCdata, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar, &dtd->pool); + if (result) return result; + attVal = poolStart(&dtd->pool); + poolFinish(&dtd->pool); + /* ID attributes aren't allowed to have a default */ + if (!defineAttribute( + parser->m_declElementType, parser->m_declAttributeId, + parser->m_declAttributeIsCdata, XML_FALSE, attVal, parser)) + return XML_ERROR_NO_MEMORY; + if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { + if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) || + (*parser->m_declAttributeType == XML_T(ASCII_N) && + parser->m_declAttributeType[1] == XML_T(ASCII_O))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) || + !poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + parser->m_declAttributeType = parser->m_tempPool.start; + poolFinish(&parser->m_tempPool); + } + *eventEndPP = s; + parser->m_attlistDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, + parser->m_declAttributeId->name, parser->m_declAttributeType, + attVal, role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + poolClear(&parser->m_tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_ENTITY_VALUE: + if (dtd->keepProcessing) { + enum XML_Error result = + storeEntityValue(parser, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (parser->m_declEntity) { + parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool); + parser->m_declEntity->textLen = + (int)(poolLength(&dtd->entityValuePool)); + poolFinish(&dtd->entityValuePool); + if (parser->m_entityDeclHandler) { + *eventEndPP = s; + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->is_param, parser->m_declEntity->textPtr, + parser->m_declEntity->textLen, parser->m_curBase, 0, 0, 0); + handleDefault = XML_FALSE; + } + } else + poolDiscard(&dtd->entityValuePool); + if (result != XML_ERROR_NONE) return result; + } + break; + case XML_ROLE_DOCTYPE_SYSTEM_ID: +#ifdef XML_DTD + parser->m_useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (parser->m_startDoctypeDeclHandler) { + parser->m_doctypeSysid = poolStoreString(&parser->m_tempPool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (! systemId) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - parser->m_notationDeclHandler( - parser->m_handlerArg, parser->m_declNotationName, parser->m_curBase, - systemId, parser->m_declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&parser->m_tempPool); - break; - case XML_ROLE_NOTATION_NO_SYSTEM_ID: - if (parser->m_declNotationPublicId && parser->m_notationDeclHandler) { - *eventEndPP = s; - parser->m_notationDeclHandler( - parser->m_handlerArg, parser->m_declNotationName, parser->m_curBase, - 0, parser->m_declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&parser->m_tempPool); - break; - case XML_ROLE_ERROR: - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: - /* PE references in internal subset are - not allowed within declarations. */ - return XML_ERROR_PARAM_ENTITY_REF; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - default: - return XML_ERROR_SYNTAX; - } -#ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: { - enum XML_Error result; - if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (! next) { - parser->m_processor = ignoreSectionProcessor; - return result; - } - } break; -#endif /* XML_DTD */ - case XML_ROLE_GROUP_OPEN: - if (parser->m_prologState.level >= parser->m_groupSize) { - if (parser->m_groupSize) { - { - char *const new_connector = (char *)REALLOC( - parser, parser->m_groupConnector, parser->m_groupSize *= 2); - if (new_connector == NULL) { - parser->m_groupSize /= 2; - return XML_ERROR_NO_MEMORY; - } - parser->m_groupConnector = new_connector; - } - - if (dtd->scaffIndex) { - int *const new_scaff_index = (int *)REALLOC( - parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int)); - if (new_scaff_index == NULL) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = new_scaff_index; - } - } else { - parser->m_groupConnector - = (char *)MALLOC(parser, parser->m_groupSize = 32); - if (! parser->m_groupConnector) { - parser->m_groupSize = 0; - return XML_ERROR_NO_MEMORY; - } + if (parser->m_doctypeSysid == NULL) return XML_ERROR_NO_MEMORY; + poolFinish(&parser->m_tempPool); + handleDefault = XML_FALSE; } - } - parser->m_groupConnector[parser->m_prologState.level] = 0; - if (dtd->in_eldecl) { - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - assert(dtd->scaffIndex != NULL); - dtd->scaffIndex[dtd->scaffLevel] = myindex; - dtd->scaffLevel++; - dtd->scaffold[myindex].type = XML_CTYPE_SEQ; - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_GROUP_SEQUENCE: - if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_PIPE) - return XML_ERROR_SYNTAX; - parser->m_groupConnector[parser->m_prologState.level] = ASCII_COMMA; - if (dtd->in_eldecl && parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_GROUP_CHOICE: - if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_COMMA) - return XML_ERROR_SYNTAX; - if (dtd->in_eldecl - && ! parser->m_groupConnector[parser->m_prologState.level] - && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED)) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_CHOICE; - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - } - parser->m_groupConnector[parser->m_prologState.level] = ASCII_PIPE; - break; - case XML_ROLE_PARAM_ENTITY_REF: #ifdef XML_DTD - case XML_ROLE_INNER_PARAM_ENTITY_REF: - dtd->hasParamEntityRefs = XML_TRUE; - if (! parser->m_paramEntityParsing) - dtd->keepProcessing = dtd->standalone; - else { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&dtd->pool); - /* first, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity handler - */ - if (parser->m_prologState.documentEntity - && (dtd->standalone ? ! parser->m_openInternalEntities - : ! dtd->hasParamEntityRefs)) { - if (! entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (! entity->is_internal) { - /* It's hard to exhaustively search the code to be sure, - * but there doesn't seem to be a way of executing the - * following line. There are two cases: - * - * If 'standalone' is false, the DTD must have no - * parameter entities or we wouldn't have passed the outer - * 'if' statement. That measn the only entity in the hash - * table is the external subset name "#" which cannot be - * given as a parameter entity name in XML syntax, so the - * lookup must have returned NULL and we don't even reach - * the test for an internal entity. - * - * If 'standalone' is true, it does not seem to be - * possible to create entities taking this code path that - * are not internal entities, so fail the test above. - * - * Because this analysis is very uncertain, the code is - * being left in place and merely removed from the - * coverage test statistics. - */ - return XML_ERROR_ENTITY_DECLARED_IN_PE; /* LCOV_EXCL_LINE */ - } - } else if (! entity) { - dtd->keepProcessing = dtd->standalone; - /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) - && parser->m_skippedEntityHandler) { - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 1); + else + /* use externalSubsetName to make parser->m_doctypeSysid non-NULL + for the case where no parser->m_startDoctypeDeclHandler is set */ + parser->m_doctypeSysid = externalSubsetName; +#endif /* XML_DTD */ + if (!dtd->standalone +#ifdef XML_DTD + && !parser->m_paramEntityParsing +#endif /* XML_DTD */ + && parser->m_notStandaloneHandler && + !parser->m_notStandaloneHandler(parser->m_handlerArg)) + return XML_ERROR_NOT_STANDALONE; +#ifndef XML_DTD + break; +#else /* XML_DTD */ + if (!parser->m_declEntity) { + parser->m_declEntity = (ENTITY *)lookup( + parser, &dtd->paramEntities, externalSubsetName, sizeof(ENTITY)); + if (!parser->m_declEntity) return XML_ERROR_NO_MEMORY; + parser->m_declEntity->publicId = NULL; + } +#endif /* XML_DTD */ + /* fall through */ + case XML_ROLE_ENTITY_SYSTEM_ID: + if (dtd->keepProcessing && parser->m_declEntity) { + parser->m_declEntity->systemId = + poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!parser->m_declEntity->systemId) return XML_ERROR_NO_MEMORY; + parser->m_declEntity->base = parser->m_curBase; + poolFinish(&dtd->pool); + /* Don't suppress the default handler if we fell through from + * the XML_ROLE_DOCTYPE_SYSTEM_ID case. + */ + if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_SYSTEM_ID) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_COMPLETE: + if (dtd->keepProcessing && parser->m_declEntity && + parser->m_entityDeclHandler) { + *eventEndPP = s; + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->is_param, 0, 0, parser->m_declEntity->base, + parser->m_declEntity->systemId, parser->m_declEntity->publicId, + 0); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_NOTATION_NAME: + if (dtd->keepProcessing && parser->m_declEntity) { + parser->m_declEntity->notation = + poolStoreString(&dtd->pool, enc, s, next); + if (!parser->m_declEntity->notation) return XML_ERROR_NO_MEMORY; + poolFinish(&dtd->pool); + if (parser->m_unparsedEntityDeclHandler) { + *eventEndPP = s; + parser->m_unparsedEntityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->base, parser->m_declEntity->systemId, + parser->m_declEntity->publicId, parser->m_declEntity->notation); + handleDefault = XML_FALSE; + } else if (parser->m_entityDeclHandler) { + *eventEndPP = s; + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, 0, 0, 0, + parser->m_declEntity->base, parser->m_declEntity->systemId, + parser->m_declEntity->publicId, parser->m_declEntity->notation); handleDefault = XML_FALSE; } + } + break; + case XML_ROLE_GENERAL_ENTITY_NAME: { + if (XmlPredefinedEntityName(enc, s, next)) { + parser->m_declEntity = NULL; break; } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - XML_Bool betweenDecl - = (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); - result = processInternalEntity(parser, entity, betweenDecl); - if (result != XML_ERROR_NONE) - return result; - handleDefault = XML_FALSE; - break; - } - if (parser->m_externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (! parser->m_externalEntityRefHandler( - parser->m_externalEntityRefHandlerArg, 0, entity->base, - entity->systemId, entity->publicId)) { - entity->open = XML_FALSE; - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) return XML_ERROR_NO_MEMORY; + parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, + name, sizeof(ENTITY)); + if (!parser->m_declEntity) return XML_ERROR_NO_MEMORY; + if (parser->m_declEntity->name != name) { + poolDiscard(&dtd->pool); + parser->m_declEntity = NULL; + } else { + poolFinish(&dtd->pool); + parser->m_declEntity->publicId = NULL; + parser->m_declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + parser->m_declEntity->is_internal = + !(parser->m_parentParser || parser->m_openInternalEntities); + if (parser->m_entityDeclHandler) handleDefault = XML_FALSE; } - entity->open = XML_FALSE; + } else { + poolDiscard(&dtd->pool); + parser->m_declEntity = NULL; + } + } break; + case XML_ROLE_PARAM_ENTITY_NAME: +#ifdef XML_DTD + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) return XML_ERROR_NO_MEMORY; + parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, + name, sizeof(ENTITY)); + if (!parser->m_declEntity) return XML_ERROR_NO_MEMORY; + if (parser->m_declEntity->name != name) { + poolDiscard(&dtd->pool); + parser->m_declEntity = NULL; + } else { + poolFinish(&dtd->pool); + parser->m_declEntity->publicId = NULL; + parser->m_declEntity->is_param = XML_TRUE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + parser->m_declEntity->is_internal = + !(parser->m_parentParser || parser->m_openInternalEntities); + if (parser->m_entityDeclHandler) handleDefault = XML_FALSE; + } + } else { + poolDiscard(&dtd->pool); + parser->m_declEntity = NULL; + } +#else /* not XML_DTD */ + parser->m_declEntity = NULL; +#endif /* XML_DTD */ + break; + case XML_ROLE_NOTATION_NAME: + parser->m_declNotationPublicId = NULL; + parser->m_declNotationName = NULL; + if (parser->m_notationDeclHandler) { + parser->m_declNotationName = + poolStoreString(&parser->m_tempPool, enc, s, next); + if (!parser->m_declNotationName) return XML_ERROR_NO_MEMORY; + poolFinish(&parser->m_tempPool); handleDefault = XML_FALSE; - if (! dtd->paramEntityRead) { + } + break; + case XML_ROLE_NOTATION_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; + if (parser->m_declNotationName) { /* means m_notationDeclHandler != NULL + */ + XML_Char *tem = poolStoreString(&parser->m_tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + parser->m_declNotationPublicId = tem; + poolFinish(&parser->m_tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_SYSTEM_ID: + if (parser->m_declNotationName && parser->m_notationDeclHandler) { + const XML_Char *systemId = poolStoreString( + &parser->m_tempPool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!systemId) return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + parser->m_notationDeclHandler( + parser->m_handlerArg, parser->m_declNotationName, + parser->m_curBase, systemId, parser->m_declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&parser->m_tempPool); + break; + case XML_ROLE_NOTATION_NO_SYSTEM_ID: + if (parser->m_declNotationPublicId && parser->m_notationDeclHandler) { + *eventEndPP = s; + parser->m_notationDeclHandler( + parser->m_handlerArg, parser->m_declNotationName, + parser->m_curBase, 0, parser->m_declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&parser->m_tempPool); + break; + case XML_ROLE_ERROR: + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: + /* PE references in internal subset are + not allowed within declarations. */ + return XML_ERROR_PARAM_ENTITY_REF; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + default: + return XML_ERROR_SYNTAX; + } +#ifdef XML_DTD + case XML_ROLE_IGNORE_SECT: { + enum XML_Error result; + if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + parser->m_processor = ignoreSectionProcessor; + return result; + } + } break; +#endif /* XML_DTD */ + case XML_ROLE_GROUP_OPEN: + if (parser->m_prologState.level >= parser->m_groupSize) { + if (parser->m_groupSize) { + { + char *const new_connector = (char *)REALLOC( + parser, parser->m_groupConnector, parser->m_groupSize *= 2); + if (new_connector == NULL) { + parser->m_groupSize /= 2; + return XML_ERROR_NO_MEMORY; + } + parser->m_groupConnector = new_connector; + } + + if (dtd->scaffIndex) { + int *const new_scaff_index = (int *)REALLOC( + parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int)); + if (new_scaff_index == NULL) return XML_ERROR_NO_MEMORY; + dtd->scaffIndex = new_scaff_index; + } + } else { + parser->m_groupConnector = + (char *)MALLOC(parser, parser->m_groupSize = 32); + if (!parser->m_groupConnector) { + parser->m_groupSize = 0; + return XML_ERROR_NO_MEMORY; + } + } + } + parser->m_groupConnector[parser->m_prologState.level] = 0; + if (dtd->in_eldecl) { + int myindex = nextScaffoldPart(parser); + if (myindex < 0) return XML_ERROR_NO_MEMORY; + assert(dtd->scaffIndex != NULL); + dtd->scaffIndex[dtd->scaffLevel] = myindex; + dtd->scaffLevel++; + dtd->scaffold[myindex].type = XML_CTYPE_SEQ; + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + } + break; + case XML_ROLE_GROUP_SEQUENCE: + if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_PIPE) + return XML_ERROR_SYNTAX; + parser->m_groupConnector[parser->m_prologState.level] = ASCII_COMMA; + if (dtd->in_eldecl && parser->m_elementDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_GROUP_CHOICE: + if (parser->m_groupConnector[parser->m_prologState.level] == + ASCII_COMMA) + return XML_ERROR_SYNTAX; + if (dtd->in_eldecl && + !parser->m_groupConnector[parser->m_prologState.level] && + (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type != + XML_CTYPE_MIXED)) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type = + XML_CTYPE_CHOICE; + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + } + parser->m_groupConnector[parser->m_prologState.level] = ASCII_PIPE; + break; + case XML_ROLE_PARAM_ENTITY_REF: +#ifdef XML_DTD + case XML_ROLE_INNER_PARAM_ENTITY_REF: + dtd->hasParamEntityRefs = XML_TRUE; + if (!parser->m_paramEntityParsing) + dtd->keepProcessing = dtd->standalone; + else { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); + poolDiscard(&dtd->pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity handler + */ + if (parser->m_prologState.documentEntity && + (dtd->standalone ? !parser->m_openInternalEntities + : !dtd->hasParamEntityRefs)) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) { + /* It's hard to exhaustively search the code to be sure, + * but there doesn't seem to be a way of executing the + * following line. There are two cases: + * + * If 'standalone' is false, the DTD must have no + * parameter entities or we wouldn't have passed the outer + * 'if' statement. That measn the only entity in the hash + * table is the external subset name "#" which cannot be + * given as a parameter entity name in XML syntax, so the + * lookup must have returned NULL and we don't even reach + * the test for an internal entity. + * + * If 'standalone' is true, it does not seem to be + * possible to create entities taking this code path that + * are not internal entities, so fail the test above. + * + * Because this analysis is very uncertain, the code is + * being left in place and merely removed from the + * coverage test statistics. + */ + return XML_ERROR_ENTITY_DECLARED_IN_PE; /* LCOV_EXCL_LINE */ + } + } else if (!entity) { + dtd->keepProcessing = dtd->standalone; + /* cannot report skipped entities in declarations */ + if ((role == XML_ROLE_PARAM_ENTITY_REF) && + parser->m_skippedEntityHandler) { + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 1); + handleDefault = XML_FALSE; + } + break; + } + if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + XML_Bool betweenDecl = + (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); + result = processInternalEntity(parser, entity, betweenDecl); + if (result != XML_ERROR_NONE) return result; + handleDefault = XML_FALSE; + break; + } + if (parser->m_externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) { + entity->open = XML_FALSE; + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + } + entity->open = XML_FALSE; + handleDefault = XML_FALSE; + if (!dtd->paramEntityRead) { + dtd->keepProcessing = dtd->standalone; + break; + } + } else { dtd->keepProcessing = dtd->standalone; break; } - } else { - dtd->keepProcessing = dtd->standalone; - break; } - } #endif /* XML_DTD */ - if (! dtd->standalone && parser->m_notStandaloneHandler - && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) - return XML_ERROR_NOT_STANDALONE; - break; + if (!dtd->standalone && parser->m_notStandaloneHandler && + !parser->m_notStandaloneHandler(parser->m_handlerArg)) + return XML_ERROR_NOT_STANDALONE; + break; - /* Element declaration stuff */ + /* Element declaration stuff */ - case XML_ROLE_ELEMENT_NAME: - if (parser->m_elementDeclHandler) { - parser->m_declElementType = getElementType(parser, enc, s, next); - if (! parser->m_declElementType) - return XML_ERROR_NO_MEMORY; - dtd->scaffLevel = 0; - dtd->scaffCount = 0; - dtd->in_eldecl = XML_TRUE; - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ANY: - case XML_ROLE_CONTENT_EMPTY: - if (dtd->in_eldecl) { + case XML_ROLE_ELEMENT_NAME: if (parser->m_elementDeclHandler) { - XML_Content *content - = (XML_Content *)MALLOC(parser, sizeof(XML_Content)); - if (! content) - return XML_ERROR_NO_MEMORY; - content->quant = XML_CQUANT_NONE; - content->name = NULL; - content->numchildren = 0; - content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? XML_CTYPE_ANY - : XML_CTYPE_EMPTY); - *eventEndPP = s; - parser->m_elementDeclHandler( - parser->m_handlerArg, parser->m_declElementType->name, content); + parser->m_declElementType = getElementType(parser, enc, s, next); + if (!parser->m_declElementType) return XML_ERROR_NO_MEMORY; + dtd->scaffLevel = 0; + dtd->scaffCount = 0; + dtd->in_eldecl = XML_TRUE; handleDefault = XML_FALSE; } - dtd->in_eldecl = XML_FALSE; - } - break; + break; - case XML_ROLE_CONTENT_PCDATA: - if (dtd->in_eldecl) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_MIXED; - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ELEMENT: - quant = XML_CQUANT_NONE; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_OPT: - quant = XML_CQUANT_OPT; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_REP: - quant = XML_CQUANT_REP; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_PLUS: - quant = XML_CQUANT_PLUS; - elementContent: - if (dtd->in_eldecl) { - ELEMENT_TYPE *el; - const XML_Char *name; - int nameLen; - const char *nxt - = (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar); - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffold[myindex].type = XML_CTYPE_NAME; - dtd->scaffold[myindex].quant = quant; - el = getElementType(parser, enc, s, nxt); - if (! el) - return XML_ERROR_NO_MEMORY; - name = el->name; - dtd->scaffold[myindex].name = name; - nameLen = 0; - for (; name[nameLen++];) - ; - dtd->contentStringLen += nameLen; - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_GROUP_CLOSE: - quant = XML_CQUANT_NONE; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_OPT: - quant = XML_CQUANT_OPT; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_REP: - quant = XML_CQUANT_REP; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_PLUS: - quant = XML_CQUANT_PLUS; - closeGroup: - if (dtd->in_eldecl) { - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - dtd->scaffLevel--; - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; - if (dtd->scaffLevel == 0) { - if (! handleDefault) { - XML_Content *model = build_model(parser); - if (! model) - return XML_ERROR_NO_MEMORY; + case XML_ROLE_CONTENT_ANY: + case XML_ROLE_CONTENT_EMPTY: + if (dtd->in_eldecl) { + if (parser->m_elementDeclHandler) { + XML_Content *content = + (XML_Content *)MALLOC(parser, sizeof(XML_Content)); + if (!content) return XML_ERROR_NO_MEMORY; + content->quant = XML_CQUANT_NONE; + content->name = NULL; + content->numchildren = 0; + content->children = NULL; + content->type = ((role == XML_ROLE_CONTENT_ANY) ? XML_CTYPE_ANY + : XML_CTYPE_EMPTY); *eventEndPP = s; parser->m_elementDeclHandler( - parser->m_handlerArg, parser->m_declElementType->name, model); + parser->m_handlerArg, parser->m_declElementType->name, content); + handleDefault = XML_FALSE; } dtd->in_eldecl = XML_FALSE; - dtd->contentStringLen = 0; } - } - break; - /* End element declaration stuff */ + break; - case XML_ROLE_PI: - if (! reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_COMMENT: - if (! reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_NONE: - switch (tok) { - case XML_TOK_BOM: + case XML_ROLE_CONTENT_PCDATA: + if (dtd->in_eldecl) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type = + XML_CTYPE_MIXED; + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ELEMENT: + quant = XML_CQUANT_NONE; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_OPT: + quant = XML_CQUANT_OPT; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_REP: + quant = XML_CQUANT_REP; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_PLUS: + quant = XML_CQUANT_PLUS; + elementContent: + if (dtd->in_eldecl) { + ELEMENT_TYPE *el; + const XML_Char *name; + int nameLen; + const char *nxt = + (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar); + int myindex = nextScaffoldPart(parser); + if (myindex < 0) return XML_ERROR_NO_MEMORY; + dtd->scaffold[myindex].type = XML_CTYPE_NAME; + dtd->scaffold[myindex].quant = quant; + el = getElementType(parser, enc, s, nxt); + if (!el) return XML_ERROR_NO_MEMORY; + name = el->name; + dtd->scaffold[myindex].name = name; + nameLen = 0; + for (; name[nameLen++];) + ; + dtd->contentStringLen += nameLen; + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_GROUP_CLOSE: + quant = XML_CQUANT_NONE; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_OPT: + quant = XML_CQUANT_OPT; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_REP: + quant = XML_CQUANT_REP; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_PLUS: + quant = XML_CQUANT_PLUS; + closeGroup: + if (dtd->in_eldecl) { + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + dtd->scaffLevel--; + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; + if (dtd->scaffLevel == 0) { + if (!handleDefault) { + XML_Content *model = build_model(parser); + if (!model) return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + parser->m_elementDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, model); + } + dtd->in_eldecl = XML_FALSE; + dtd->contentStringLen = 0; + } + } + break; + /* End element declaration stuff */ + + case XML_ROLE_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; handleDefault = XML_FALSE; break; - } - break; - case XML_ROLE_DOCTYPE_NONE: - if (parser->m_startDoctypeDeclHandler) + case XML_ROLE_COMMENT: + if (!reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; handleDefault = XML_FALSE; - break; - case XML_ROLE_ENTITY_NONE: - if (dtd->keepProcessing && parser->m_entityDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_NOTATION_NONE: - if (parser->m_notationDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTLIST_NONE: - if (dtd->keepProcessing && parser->m_attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ELEMENT_NONE: - if (parser->m_elementDeclHandler) - handleDefault = XML_FALSE; - break; + break; + case XML_ROLE_NONE: + switch (tok) { + case XML_TOK_BOM: + handleDefault = XML_FALSE; + break; + } + break; + case XML_ROLE_DOCTYPE_NONE: + if (parser->m_startDoctypeDeclHandler) handleDefault = XML_FALSE; + break; + case XML_ROLE_ENTITY_NONE: + if (dtd->keepProcessing && parser->m_entityDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_NOTATION_NONE: + if (parser->m_notationDeclHandler) handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTLIST_NONE: + if (dtd->keepProcessing && parser->m_attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ELEMENT_NONE: + if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; + break; } /* end of big switch */ if (handleDefault && parser->m_defaultHandler) reportDefault(parser, enc, s, next); switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - s = next; - tok = XmlPrologTok(enc, s, end, &next); + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + s = next; + tok = XmlPrologTok(enc, s, end, &next); } } /* not reached */ } -static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL epilogProcessor(XML_Parser parser, const char *s, + const char *end, + const char **nextPtr) { parser->m_processor = epilogProcessor; parser->m_eventPtr = s; for (;;) { @@ -5091,62 +4815,62 @@ epilogProcessor(XML_Parser parser, const char *s, const char *end, int tok = XmlPrologTok(parser->m_encoding, s, end, &next); parser->m_eventEndPtr = next; switch (tok) { - /* report partial linebreak - it might be the last token */ - case -XML_TOK_PROLOG_S: - if (parser->m_defaultHandler) { - reportDefault(parser, parser->m_encoding, s, next); - if (parser->m_parsingStatus.parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - } - *nextPtr = next; - return XML_ERROR_NONE; - case XML_TOK_NONE: - *nextPtr = s; - return XML_ERROR_NONE; - case XML_TOK_PROLOG_S: - if (parser->m_defaultHandler) - reportDefault(parser, parser->m_encoding, s, next); - break; - case XML_TOK_PI: - if (! reportProcessingInstruction(parser, parser->m_encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (! reportComment(parser, parser->m_encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_INVALID: - parser->m_eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (! parser->m_parsingStatus.finalBuffer) { + /* report partial linebreak - it might be the last token */ + case -XML_TOK_PROLOG_S: + if (parser->m_defaultHandler) { + reportDefault(parser, parser->m_encoding, s, next); + if (parser->m_parsingStatus.parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + } + *nextPtr = next; + return XML_ERROR_NONE; + case XML_TOK_NONE: *nextPtr = s; return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (! parser->m_parsingStatus.finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - default: - return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; + case XML_TOK_PROLOG_S: + if (parser->m_defaultHandler) + reportDefault(parser, parser->m_encoding, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, parser->m_encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, parser->m_encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_INVALID: + parser->m_eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (!parser->m_parsingStatus.finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!parser->m_parsingStatus.finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + default: + return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; } parser->m_eventPtr = s = next; switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default:; + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default:; } } } -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { +static enum XML_Error processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl) { const char *textStart, *textEnd; const char *next; enum XML_Error result; @@ -5156,10 +4880,9 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { openEntity = parser->m_freeInternalEntities; parser->m_freeInternalEntities = openEntity->next; } else { - openEntity - = (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY)); - if (! openEntity) - return XML_ERROR_NO_MEMORY; + openEntity = + (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY)); + if (!openEntity) return XML_ERROR_NO_MEMORY; } entity->open = XML_TRUE; entity->processed = 0; @@ -5177,8 +4900,8 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { #ifdef XML_DTD if (entity->is_param) { - int tok - = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); + int tok = + XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, next, &next, XML_FALSE, XML_FALSE); } else @@ -5201,16 +4924,16 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { return result; } -static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL internalEntityProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) { ENTITY *entity; const char *textStart, *textEnd; const char *next; enum XML_Error result; OPEN_INTERNAL_ENTITY *openEntity = parser->m_openInternalEntities; - if (! openEntity) - return XML_ERROR_UNEXPECTED_STATE; + if (!openEntity) return XML_ERROR_UNEXPECTED_STATE; entity = openEntity->entity; textStart = ((char *)entity->textPtr) + entity->processed; @@ -5220,20 +4943,20 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, #ifdef XML_DTD if (entity->is_param) { - int tok - = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); + int tok = + XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, next, &next, XML_FALSE, XML_TRUE); } else #endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, - parser->m_internalEncoding, textStart, textEnd, &next, - XML_FALSE); + result = + doContent(parser, openEntity->startTagLevel, parser->m_internalEncoding, + textStart, textEnd, &next, XML_FALSE); if (result != XML_ERROR_NONE) return result; - else if (textEnd != next - && parser->m_parsingStatus.parsing == XML_SUSPENDED) { + else if (textEnd != next && + parser->m_parsingStatus.parsing == XML_SUSPENDED) { entity->processed = (int)(next - (char *)entity->textPtr); return result; } else { @@ -5250,7 +4973,7 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, parser->m_processor = prologProcessor; tok = XmlPrologTok(parser->m_encoding, s, end, &next); return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); + (XML_Bool)!parser->m_parsingStatus.finalBuffer, XML_TRUE); } else #endif /* XML_DTD */ { @@ -5258,209 +4981,197 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, /* see externalEntityContentProcessor vs contentProcessor */ return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, s, end, nextPtr, - (XML_Bool)! parser->m_parsingStatus.finalBuffer); + (XML_Bool)!parser->m_parsingStatus.finalBuffer); } } -static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, const char *s, const char *end, - const char **nextPtr) { +static enum XML_Error PTRCALL errorProcessor(XML_Parser parser, const char *s, + const char *end, + const char **nextPtr) { UNUSED_P(s); UNUSED_P(end); UNUSED_P(nextPtr); return parser->m_errorCode; } -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, STRING_POOL *pool) { - enum XML_Error result - = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); - if (result) - return result; - if (! isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) +static enum XML_Error storeAttributeValue(XML_Parser parser, + const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) { + enum XML_Error result = + appendAttributeValue(parser, enc, isCdata, ptr, end, pool); + if (result) return result; + if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) poolChop(pool); - if (! poolAppendChar(pool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; + if (!poolAppendChar(pool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; return XML_ERROR_NONE; } -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, STRING_POOL *pool) { +static enum XML_Error appendAttributeValue(XML_Parser parser, + const ENCODING *enc, + XML_Bool isCdata, const char *ptr, + const char *end, STRING_POOL *pool) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ for (;;) { const char *next; int tok = XmlAttributeValueTok(enc, ptr, end, &next); switch (tok) { - case XML_TOK_NONE: - return XML_ERROR_NONE; - case XML_TOK_INVALID: - if (enc == parser->m_encoding) - parser->m_eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (! isCdata && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - /* The XmlEncode() functions can never return 0 here. That - * error return happens if the code point passed in is either - * negative or greater than or equal to 0x110000. The - * XmlCharRefNumber() functions will all return a number - * strictly less than 0x110000 or a negative value if an error - * occurred. The negative value is intercepted above, so - * XmlEncode() is never passed a value it might return an - * error for. - */ - for (i = 0; i < n; i++) { - if (! poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } - } break; - case XML_TOK_DATA_CHARS: - if (! poolAppend(pool, enc, ptr, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_TRAILING_CR: - next = ptr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_ATTRIBUTE_VALUE_S: - case XML_TOK_DATA_NEWLINE: - if (! isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - if (! poolAppendChar(pool, 0x20)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_ENTITY_REF: { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char)XmlPredefinedEntityName( - enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (ch) { - if (! poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&parser->m_temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&parser->m_temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = -#ifdef XML_DTD - parser->m_prologState.documentEntity && -#endif /* XML_DTD */ - (dtd->standalone ? ! parser->m_openInternalEntities - : ! dtd->hasParamEntityRefs); - else /* if (pool == &parser->m_tempPool): we are called from content */ - checkEntityDecl = ! dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (! entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (! entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } else if (! entity) { - /* Cannot report skipped entity here - see comments on - parser->m_skippedEntityHandler. - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &parser->m_tempPool) && parser->m_defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == parser->m_encoding) { - /* It does not appear that this line can be executed. - * - * The "if (entity->open)" check catches recursive entity - * definitions. In order to be called with an open - * entity, it must have gone through this code before and - * been through the recursive call to - * appendAttributeValue() some lines below. That call - * sets the local encoding ("enc") to the parser's - * internal encoding (internal_utf8 or internal_utf16), - * which can never be the same as the principle encoding. - * It doesn't appear there is another code path that gets - * here with entity->open being TRUE. - * - * Since it is not certain that this logic is watertight, - * we keep the line and merely exclude it from coverage - * tests. - */ - parser->m_eventPtr = ptr; /* LCOV_EXCL_LINE */ + case XML_TOK_NONE: + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == parser->m_encoding) parser->m_eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (enc == parser->m_encoding) parser->m_eventPtr = ptr; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_CHAR_REF: { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == parser->m_encoding) parser->m_eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; } - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (! entity->textPtr) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, parser->m_internalEncoding, - isCdata, (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; - } - } break; - default: - /* The only token returned by XmlAttributeValueTok() that does - * not have an explicit case here is XML_TOK_PARTIAL_CHAR. - * Getting that would require an entity name to contain an - * incomplete XML character (e.g. \xE2\x82); however previous - * tokenisers will have already recognised and rejected such - * names before XmlAttributeValueTok() gets a look-in. This - * default case should be retained as a safety net, but the code - * excluded from coverage tests. - * - * LCOV_EXCL_START - */ - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_UNEXPECTED_STATE; - /* LCOV_EXCL_STOP */ + if (!isCdata && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + /* The XmlEncode() functions can never return 0 here. That + * error return happens if the code point passed in is either + * negative or greater than or equal to 0x110000. The + * XmlCharRefNumber() functions will all return a number + * strictly less than 0x110000 or a negative value if an error + * occurred. The negative value is intercepted above, so + * XmlEncode() is never passed a value it might return an + * error for. + */ + for (i = 0; i < n; i++) { + if (!poolAppendChar(pool, buf[i])) return XML_ERROR_NO_MEMORY; + } + } break; + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, ptr, next)) return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_TRAILING_CR: + next = ptr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_ATTRIBUTE_VALUE_S: + case XML_TOK_DATA_NEWLINE: + if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + if (!poolAppendChar(pool, 0x20)) return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_ENTITY_REF: { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char)XmlPredefinedEntityName( + enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); + if (ch) { + if (!poolAppendChar(pool, ch)) return XML_ERROR_NO_MEMORY; + break; + } + name = poolStoreString(&parser->m_temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); + poolDiscard(&parser->m_temp2Pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal. + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = +#ifdef XML_DTD + parser->m_prologState.documentEntity && +#endif /* XML_DTD */ + (dtd->standalone ? !parser->m_openInternalEntities + : !dtd->hasParamEntityRefs); + else /* if (pool == &parser->m_tempPool): we are called from content */ + checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } else if (!entity) { + /* Cannot report skipped entity here - see comments on + parser->m_skippedEntityHandler. + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + */ + /* Cannot call the default handler because this would be + out of sync with the call to the startElementHandler. + if ((pool == &parser->m_tempPool) && parser->m_defaultHandler) + reportDefault(parser, enc, ptr, next); + */ + break; + } + if (entity->open) { + if (enc == parser->m_encoding) { + /* It does not appear that this line can be executed. + * + * The "if (entity->open)" check catches recursive entity + * definitions. In order to be called with an open + * entity, it must have gone through this code before and + * been through the recursive call to + * appendAttributeValue() some lines below. That call + * sets the local encoding ("enc") to the parser's + * internal encoding (internal_utf8 or internal_utf16), + * which can never be the same as the principle encoding. + * It doesn't appear there is another code path that gets + * here with entity->open being TRUE. + * + * Since it is not certain that this logic is watertight, + * we keep the line and merely exclude it from coverage + * tests. + */ + parser->m_eventPtr = ptr; /* LCOV_EXCL_LINE */ + } + return XML_ERROR_RECURSIVE_ENTITY_REF; + } + if (entity->notation) { + if (enc == parser->m_encoding) parser->m_eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (!entity->textPtr) { + if (enc == parser->m_encoding) parser->m_eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, parser->m_internalEncoding, + isCdata, (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) return result; + } + } break; + default: + /* The only token returned by XmlAttributeValueTok() that does + * not have an explicit case here is XML_TOK_PARTIAL_CHAR. + * Getting that would require an entity name to contain an + * incomplete XML character (e.g. \xE2\x82); however previous + * tokenisers will have already recognised and rejected such + * names before XmlAttributeValueTok() gets a look-in. This + * default case should be retained as a safety net, but the code + * excluded from coverage tests. + * + * LCOV_EXCL_START + */ + if (enc == parser->m_encoding) parser->m_eventPtr = ptr; + return XML_ERROR_UNEXPECTED_STATE; + /* LCOV_EXCL_STOP */ } ptr = next; } /* not reached */ } -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, - const char *entityTextPtr, const char *entityTextEnd) { +static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc, + const char *entityTextPtr, + const char *entityTextEnd) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ STRING_POOL *pool = &(dtd->entityValuePool); enum XML_Error result = XML_ERROR_NONE; @@ -5471,149 +5182,141 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc, /* never return Null for the value argument in EntityDeclHandler, since this would indicate an external entity; therefore we have to make sure that entityValuePool.start is not null */ - if (! pool->blocks) { - if (! poolGrow(pool)) - return XML_ERROR_NO_MEMORY; + if (!pool->blocks) { + if (!poolGrow(pool)) return XML_ERROR_NO_MEMORY; } for (;;) { const char *next; int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: + case XML_TOK_PARAM_ENTITY_REF: #ifdef XML_DTD - if (parser->m_isParamEntity || enc != parser->m_encoding) { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&parser->m_tempPool, enc, - entityTextPtr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (! name) { + if (parser->m_isParamEntity || enc != parser->m_encoding) { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&parser->m_tempPool, enc, + entityTextPtr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); + poolDiscard(&parser->m_tempPool); + if (!entity) { + /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ + /* cannot report skipped entity here - see comments on + parser->m_skippedEntityHandler + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + */ + dtd->keepProcessing = dtd->standalone; + goto endEntityValue; + } + if (entity->open) { + if (enc == parser->m_encoding) parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_RECURSIVE_ENTITY_REF; + goto endEntityValue; + } + if (entity->systemId) { + if (parser->m_externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) { + entity->open = XML_FALSE; + result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; + goto endEntityValue; + } + entity->open = XML_FALSE; + if (!dtd->paramEntityRead) dtd->keepProcessing = dtd->standalone; + } else + dtd->keepProcessing = dtd->standalone; + } else { + entity->open = XML_TRUE; + result = storeEntityValue( + parser, parser->m_internalEncoding, (char *)entity->textPtr, + (char *)(entity->textPtr + entity->textLen)); + entity->open = XML_FALSE; + if (result) goto endEntityValue; + } + break; + } +#endif /* XML_DTD */ + /* In the internal subset, PE references are not legal + within markup declarations, e.g entity values in this case. */ + parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_PARAM_ENTITY_REF; + goto endEntityValue; + case XML_TOK_NONE: + result = XML_ERROR_NONE; + goto endEntityValue; + case XML_TOK_ENTITY_REF: + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, entityTextPtr, next)) { result = XML_ERROR_NO_MEMORY; goto endEntityValue; } - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&parser->m_tempPool); - if (! entity) { - /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ - /* cannot report skipped entity here - see comments on - parser->m_skippedEntityHandler - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); - */ - dtd->keepProcessing = dtd->standalone; - goto endEntityValue; - } - if (entity->open) { - if (enc == parser->m_encoding) - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_RECURSIVE_ENTITY_REF; - goto endEntityValue; - } - if (entity->systemId) { - if (parser->m_externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (! parser->m_externalEntityRefHandler( - parser->m_externalEntityRefHandlerArg, 0, entity->base, - entity->systemId, entity->publicId)) { - entity->open = XML_FALSE; - result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; - goto endEntityValue; - } - entity->open = XML_FALSE; - if (! dtd->paramEntityRead) - dtd->keepProcessing = dtd->standalone; - } else - dtd->keepProcessing = dtd->standalone; - } else { - entity->open = XML_TRUE; - result = storeEntityValue( - parser, parser->m_internalEncoding, (char *)entity->textPtr, - (char *)(entity->textPtr + entity->textLen)); - entity->open = XML_FALSE; - if (result) - goto endEntityValue; - } break; - } -#endif /* XML_DTD */ - /* In the internal subset, PE references are not legal - within markup declarations, e.g entity values in this case. */ - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_PARAM_ENTITY_REF; - goto endEntityValue; - case XML_TOK_NONE: - result = XML_ERROR_NONE; - goto endEntityValue; - case XML_TOK_ENTITY_REF: - case XML_TOK_DATA_CHARS: - if (! poolAppend(pool, enc, entityTextPtr, next)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - break; - case XML_TOK_TRAILING_CR: - next = entityTextPtr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && ! poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = 0xA; - break; - case XML_TOK_CHAR_REF: { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == parser->m_encoding) - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - n = XmlEncode(n, (ICHAR *)buf); - /* The XmlEncode() functions can never return 0 here. That - * error return happens if the code point passed in is either - * negative or greater than or equal to 0x110000. The - * XmlCharRefNumber() functions will all return a number - * strictly less than 0x110000 or a negative value if an error - * occurred. The negative value is intercepted above, so - * XmlEncode() is never passed a value it might return an - * error for. - */ - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && ! poolGrow(pool)) { + case XML_TOK_TRAILING_CR: + next = entityTextPtr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_DATA_NEWLINE: + if (pool->end == pool->ptr && !poolGrow(pool)) { result = XML_ERROR_NO_MEMORY; goto endEntityValue; } - *(pool->ptr)++ = buf[i]; - } - } break; - case XML_TOK_PARTIAL: - if (enc == parser->m_encoding) - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - case XML_TOK_INVALID: - if (enc == parser->m_encoding) - parser->m_eventPtr = next; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - default: - /* This default case should be unnecessary -- all the tokens - * that XmlEntityValueTok() can return have their own explicit - * cases -- but should be retained for safety. We do however - * exclude it from the coverage statistics. - * - * LCOV_EXCL_START - */ - if (enc == parser->m_encoding) - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_UNEXPECTED_STATE; - goto endEntityValue; - /* LCOV_EXCL_STOP */ + *(pool->ptr)++ = 0xA; + break; + case XML_TOK_CHAR_REF: { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == parser->m_encoding) parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + /* The XmlEncode() functions can never return 0 here. That + * error return happens if the code point passed in is either + * negative or greater than or equal to 0x110000. The + * XmlCharRefNumber() functions will all return a number + * strictly less than 0x110000 or a negative value if an error + * occurred. The negative value is intercepted above, so + * XmlEncode() is never passed a value it might return an + * error for. + */ + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = buf[i]; + } + } break; + case XML_TOK_PARTIAL: + if (enc == parser->m_encoding) parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + case XML_TOK_INVALID: + if (enc == parser->m_encoding) parser->m_eventPtr = next; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + default: + /* This default case should be unnecessary -- all the tokens + * that XmlEntityValueTok() can return have their own explicit + * cases -- but should be retained for safety. We do however + * exclude it from the coverage statistics. + * + * LCOV_EXCL_START + */ + if (enc == parser->m_encoding) parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_UNEXPECTED_STATE; + goto endEntityValue; + /* LCOV_EXCL_STOP */ } entityTextPtr = next; } @@ -5624,77 +5327,65 @@ endEntityValue: return result; } -static void FASTCALL -normalizeLines(XML_Char *s) { +static void FASTCALL normalizeLines(XML_Char *s) { XML_Char *p; for (;; s++) { - if (*s == XML_T('\0')) - return; - if (*s == 0xD) - break; + if (*s == XML_T('\0')) return; + if (*s == 0xD) break; } p = s; do { if (*s == 0xD) { *p++ = 0xA; - if (*++s == 0xA) - s++; + if (*++s == 0xA) s++; } else *p++ = *s++; } while (*s); *p = XML_T('\0'); } -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) { +static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) { const XML_Char *target; XML_Char *data; const char *tem; - if (! parser->m_processingInstructionHandler) { - if (parser->m_defaultHandler) - reportDefault(parser, enc, start, end); + if (!parser->m_processingInstructionHandler) { + if (parser->m_defaultHandler) reportDefault(parser, enc, start, end); return 1; } start += enc->minBytesPerChar * 2; tem = start + XmlNameLength(enc, start); target = poolStoreString(&parser->m_tempPool, enc, start, tem); - if (! target) - return 0; + if (!target) return 0; poolFinish(&parser->m_tempPool); data = poolStoreString(&parser->m_tempPool, enc, XmlSkipS(enc, tem), end - enc->minBytesPerChar * 2); - if (! data) - return 0; + if (!data) return 0; normalizeLines(data); parser->m_processingInstructionHandler(parser->m_handlerArg, target, data); poolClear(&parser->m_tempPool); return 1; } -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end) { +static int reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) { XML_Char *data; - if (! parser->m_commentHandler) { - if (parser->m_defaultHandler) - reportDefault(parser, enc, start, end); + if (!parser->m_commentHandler) { + if (parser->m_defaultHandler) reportDefault(parser, enc, start, end); return 1; } data = poolStoreString(&parser->m_tempPool, enc, start + enc->minBytesPerChar * 4, end - enc->minBytesPerChar * 3); - if (! data) - return 0; + if (!data) return 0; normalizeLines(data); parser->m_commentHandler(parser->m_handlerArg, data); poolClear(&parser->m_tempPool); return 1; } -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end) { +static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end) { if (MUST_CONVERT(enc, s)) { enum XML_Convert_Result convert_res; const char **eventPP; @@ -5725,39 +5416,37 @@ reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, } do { ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - convert_res - = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + convert_res = + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); *eventEndPP = s; parser->m_defaultHandler(parser->m_handlerArg, parser->m_dataBuf, (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); *eventPP = s; - } while ((convert_res != XML_CONVERT_COMPLETED) - && (convert_res != XML_CONVERT_INPUT_INCOMPLETE)); + } while ((convert_res != XML_CONVERT_COMPLETED) && + (convert_res != XML_CONVERT_INPUT_INCOMPLETE)); } else parser->m_defaultHandler(parser->m_handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); } -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) { +static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, + XML_Bool isCdata, XML_Bool isId, + const XML_Char *value, XML_Parser parser) { DEFAULT_ATTRIBUTE *att; if (value || isId) { /* The handling of default attributes gets messed up if we have a default which duplicates a non-default. */ int i; for (i = 0; i < type->nDefaultAtts; i++) - if (attId == type->defaultAtts[i].id) - return 1; - if (isId && ! type->idAtt && ! attId->xmlns) - type->idAtt = attId; + if (attId == type->defaultAtts[i].id) return 1; + if (isId && !type->idAtt && !attId->xmlns) type->idAtt = attId; } if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC( parser, type->allocDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (! type->defaultAtts) { + if (!type->defaultAtts) { type->allocDefaultAtts = 0; return 0; } @@ -5766,8 +5455,7 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, int count = type->allocDefaultAtts * 2; temp = (DEFAULT_ATTRIBUTE *)REALLOC(parser, type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); - if (temp == NULL) - return 0; + if (temp == NULL) return 0; type->allocDefaultAtts = count; type->defaultAtts = temp; } @@ -5776,14 +5464,12 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, att->id = attId; att->value = value; att->isCdata = isCdata; - if (! isCdata) - attId->maybeTokenized = XML_TRUE; + if (!isCdata) attId->maybeTokenized = XML_TRUE; type->nDefaultAtts += 1; return 1; } -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { +static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *name; for (name = elementType->name; *name; name++) { @@ -5791,15 +5477,12 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { PREFIX *prefix; const XML_Char *s; for (s = elementType->name; s != name; s++) { - if (! poolAppendChar(&dtd->pool, *s)) - return 0; + if (!poolAppendChar(&dtd->pool, *s)) return 0; } - if (! poolAppendChar(&dtd->pool, XML_T('\0'))) - return 0; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), sizeof(PREFIX)); - if (! prefix) - return 0; + if (!prefix) return 0; if (prefix->name == poolStart(&dtd->pool)) poolFinish(&dtd->pool); else @@ -5811,38 +5494,34 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { return 1; } -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end) { +static ATTRIBUTE_ID *getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ ATTRIBUTE_ID *id; const XML_Char *name; - if (! poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) return NULL; name = poolStoreString(&dtd->pool, enc, start, end); - if (! name) - return NULL; + if (!name) return NULL; /* skip quotation mark - its storage will be re-used (like in name[-1]) */ ++name; id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (! id) - return NULL; + if (!id) return NULL; if (id->name != name) poolDiscard(&dtd->pool); else { poolFinish(&dtd->pool); - if (! parser->m_ns) + if (!parser->m_ns) ; - else if (name[0] == XML_T(ASCII_x) && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { + else if (name[0] == XML_T(ASCII_x) && name[1] == XML_T(ASCII_m) && + name[2] == XML_T(ASCII_l) && name[3] == XML_T(ASCII_n) && + name[4] == XML_T(ASCII_s) && + (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { if (name[5] == XML_T('\0')) id->prefix = &dtd->defaultPrefix; else - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, - sizeof(PREFIX)); + id->prefix = + (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); id->xmlns = XML_TRUE; } else { int i; @@ -5851,15 +5530,12 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, if (name[i] == XML_T(ASCII_COLON)) { int j; for (j = 0; j < i; j++) { - if (! poolAppendChar(&dtd->pool, name[j])) - return NULL; + if (!poolAppendChar(&dtd->pool, name[j])) return NULL; } - if (! poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) return NULL; id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), sizeof(PREFIX)); - if (! id->prefix) - return NULL; + if (!id->prefix) return NULL; if (id->prefix->name == poolStart(&dtd->pool)) poolFinish(&dtd->pool); else @@ -5874,8 +5550,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, #define CONTEXT_SEP XML_T(ASCII_FF) -static const XML_Char * -getContext(XML_Parser parser) { +static const XML_Char *getContext(XML_Parser parser) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ HASH_TABLE_ITER iter; XML_Bool needSep = XML_FALSE; @@ -5883,14 +5558,12 @@ getContext(XML_Parser parser) { if (dtd->defaultPrefix.binding) { int i; int len; - if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) - return NULL; + if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) return NULL; len = dtd->defaultPrefix.binding->uriLen; - if (parser->m_namespaceSeparator) - len--; + if (parser->m_namespaceSeparator) len--; for (i = 0; i < len; i++) { - if (! poolAppendChar(&parser->m_tempPool, - dtd->defaultPrefix.binding->uri[i])) { + if (!poolAppendChar(&parser->m_tempPool, + dtd->defaultPrefix.binding->uri[i])) { /* Because of memory caching, I don't believe this line can be * executed. * @@ -5922,9 +5595,8 @@ getContext(XML_Parser parser) { int len; const XML_Char *s; PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (! prefix) - break; - if (! prefix->binding) { + if (!prefix) break; + if (!prefix->binding) { /* This test appears to be (justifiable) paranoia. There does * not seem to be a way of injecting a prefix without a binding * that doesn't get errored long before this function is called. @@ -5933,18 +5605,15 @@ getContext(XML_Parser parser) { */ continue; /* LCOV_EXCL_LINE */ } - if (needSep && ! poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) + if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) return NULL; for (s = prefix->name; *s; s++) - if (! poolAppendChar(&parser->m_tempPool, *s)) - return NULL; - if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) - return NULL; + if (!poolAppendChar(&parser->m_tempPool, *s)) return NULL; + if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) return NULL; len = prefix->binding->uriLen; - if (parser->m_namespaceSeparator) - len--; + if (parser->m_namespaceSeparator) len--; for (i = 0; i < len; i++) - if (! poolAppendChar(&parser->m_tempPool, prefix->binding->uri[i])) + if (!poolAppendChar(&parser->m_tempPool, prefix->binding->uri[i])) return NULL; needSep = XML_TRUE; } @@ -5953,39 +5622,31 @@ getContext(XML_Parser parser) { for (;;) { const XML_Char *s; ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (! e) - break; - if (! e->open) - continue; - if (needSep && ! poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) + if (!e) break; + if (!e->open) continue; + if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) return NULL; for (s = e->name; *s; s++) - if (! poolAppendChar(&parser->m_tempPool, *s)) - return 0; + if (!poolAppendChar(&parser->m_tempPool, *s)) return 0; needSep = XML_TRUE; } - if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return NULL; + if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return NULL; return parser->m_tempPool.start; } -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) { +static XML_Bool setContext(XML_Parser parser, const XML_Char *context) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *s = context; while (*context != XML_T('\0')) { if (*s == CONTEXT_SEP || *s == XML_T('\0')) { ENTITY *e; - if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return XML_FALSE; + if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&parser->m_tempPool), 0); - if (e) - e->open = XML_TRUE; - if (*s != XML_T('\0')) - s++; + if (e) e->open = XML_TRUE; + if (*s != XML_T('\0')) s++; context = s; poolDiscard(&parser->m_tempPool); } else if (*s == XML_T(ASCII_EQUALS)) { @@ -5993,69 +5654,56 @@ setContext(XML_Parser parser, const XML_Char *context) { if (poolLength(&parser->m_tempPool) == 0) prefix = &dtd->defaultPrefix; else { - if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return XML_FALSE; - prefix - = (PREFIX *)lookup(parser, &dtd->prefixes, - poolStart(&parser->m_tempPool), sizeof(PREFIX)); - if (! prefix) - return XML_FALSE; + if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; + prefix = + (PREFIX *)lookup(parser, &dtd->prefixes, + poolStart(&parser->m_tempPool), sizeof(PREFIX)); + if (!prefix) return XML_FALSE; if (prefix->name == poolStart(&parser->m_tempPool)) { prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (! prefix->name) - return XML_FALSE; + if (!prefix->name) return XML_FALSE; } poolDiscard(&parser->m_tempPool); } for (context = s + 1; *context != CONTEXT_SEP && *context != XML_T('\0'); context++) - if (! poolAppendChar(&parser->m_tempPool, *context)) - return XML_FALSE; - if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) - return XML_FALSE; + if (!poolAppendChar(&parser->m_tempPool, *context)) return XML_FALSE; + if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; if (addBinding(parser, prefix, NULL, poolStart(&parser->m_tempPool), - &parser->m_inheritedBindings) - != XML_ERROR_NONE) + &parser->m_inheritedBindings) != XML_ERROR_NONE) return XML_FALSE; poolDiscard(&parser->m_tempPool); - if (*context != XML_T('\0')) - ++context; + if (*context != XML_T('\0')) ++context; s = context; } else { - if (! poolAppendChar(&parser->m_tempPool, *s)) - return XML_FALSE; + if (!poolAppendChar(&parser->m_tempPool, *s)) return XML_FALSE; s++; } } return XML_TRUE; } -static void FASTCALL -normalizePublicId(XML_Char *publicId) { +static void FASTCALL normalizePublicId(XML_Char *publicId) { XML_Char *p = publicId; XML_Char *s; for (s = publicId; *s; s++) { switch (*s) { - case 0x20: - case 0xD: - case 0xA: - if (p != publicId && p[-1] != 0x20) - *p++ = 0x20; - break; - default: - *p++ = *s; + case 0x20: + case 0xD: + case 0xA: + if (p != publicId && p[-1] != 0x20) *p++ = 0x20; + break; + default: + *p++ = *s; } } - if (p != publicId && p[-1] == 0x20) - --p; + if (p != publicId && p[-1] == 0x20) --p; *p = XML_T('\0'); } -static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) { +static DTD *dtdCreate(const XML_Memory_Handling_Suite *ms) { DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); - if (p == NULL) - return p; + if (p == NULL) return p; poolInit(&(p->pool), ms); poolInit(&(p->entityValuePool), ms); hashTableInit(&(p->generalEntities), ms); @@ -6083,16 +5731,13 @@ dtdCreate(const XML_Memory_Handling_Suite *ms) { return p; } -static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) { +static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (! e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); + if (!e) break; + if (e->allocDefaultAtts != 0) ms->free_fcn(e->defaultAtts); } hashTableClear(&(p->generalEntities)); #ifdef XML_DTD @@ -6124,16 +5769,14 @@ dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) { p->standalone = XML_FALSE; } -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) { +static void dtdDestroy(DTD *p, XML_Bool isDocEntity, + const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (! e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); + if (!e) break; + if (e->allocDefaultAtts != 0) ms->free_fcn(e->defaultAtts); } hashTableDestroy(&(p->generalEntities)); #ifdef XML_DTD @@ -6154,9 +5797,8 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) { /* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. The new DTD has already been initialized. */ -static int -dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, - const XML_Memory_Handling_Suite *ms) { +static int dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, + const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; /* Copy the prefix table. */ @@ -6165,13 +5807,10 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, for (;;) { const XML_Char *name; const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (! oldP) - break; + if (!oldP) break; name = poolCopyString(&(newDtd->pool), oldP->name); - if (! name) - return 0; - if (! lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) - return 0; + if (!name) return 0; + if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) return 0; } hashTableIterInit(&iter, &(oldDtd->attributeIds)); @@ -6183,19 +5822,15 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Char *name; const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - if (! oldA) - break; + if (!oldA) break; /* Remember to allocate the scratch byte before the name. */ - if (! poolAppendChar(&(newDtd->pool), XML_T('\0'))) - return 0; + if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) return 0; name = poolCopyString(&(newDtd->pool), oldA->name); - if (! name) - return 0; + if (!name) return 0; ++name; newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); - if (! newA) - return 0; + if (!newA) return 0; newA->maybeTokenized = oldA->maybeTokenized; if (oldA->prefix) { newA->xmlns = oldA->xmlns; @@ -6216,19 +5851,16 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, ELEMENT_TYPE *newE; const XML_Char *name; const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (! oldE) - break; + if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); - if (! name) - return 0; + if (!name) return 0; newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); - if (! newE) - return 0; + if (!newE) return 0; if (oldE->nDefaultAtts) { newE->defaultAtts = (DEFAULT_ATTRIBUTE *)ms->malloc_fcn( oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (! newE->defaultAtts) { + if (!newE->defaultAtts) { return 0; } } @@ -6244,23 +5876,22 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; if (oldE->defaultAtts[i].value) { - newE->defaultAtts[i].value - = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (! newE->defaultAtts[i].value) - return 0; + newE->defaultAtts[i].value = + poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); + if (!newE->defaultAtts[i].value) return 0; } else newE->defaultAtts[i].value = NULL; } } /* Copy the entity tables. */ - if (! copyEntityTable(oldParser, &(newDtd->generalEntities), &(newDtd->pool), - &(oldDtd->generalEntities))) + if (!copyEntityTable(oldParser, &(newDtd->generalEntities), &(newDtd->pool), + &(oldDtd->generalEntities))) return 0; #ifdef XML_DTD - if (! copyEntityTable(oldParser, &(newDtd->paramEntities), &(newDtd->pool), - &(oldDtd->paramEntities))) + if (!copyEntityTable(oldParser, &(newDtd->paramEntities), &(newDtd->pool), + &(oldDtd->paramEntities))) return 0; newDtd->paramEntityRead = oldDtd->paramEntityRead; #endif /* XML_DTD */ @@ -6280,9 +5911,8 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, return 1; } /* End dtdCopy */ -static int -copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, - STRING_POOL *newPool, const HASH_TABLE *oldTable) { +static int copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, + STRING_POOL *newPool, const HASH_TABLE *oldTable) { HASH_TABLE_ITER iter; const XML_Char *cachedOldBase = NULL; const XML_Char *cachedNewBase = NULL; @@ -6293,18 +5923,14 @@ copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, ENTITY *newE; const XML_Char *name; const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (! oldE) - break; + if (!oldE) break; name = poolCopyString(newPool, oldE->name); - if (! name) - return 0; + if (!name) return 0; newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); - if (! newE) - return 0; + if (!newE) return 0; if (oldE->systemId) { const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (! tem) - return 0; + if (!tem) return 0; newE->systemId = tem; if (oldE->base) { if (oldE->base == cachedOldBase) @@ -6312,29 +5938,25 @@ copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, else { cachedOldBase = oldE->base; tem = poolCopyString(newPool, cachedOldBase); - if (! tem) - return 0; + if (!tem) return 0; cachedNewBase = newE->base = tem; } } if (oldE->publicId) { tem = poolCopyString(newPool, oldE->publicId); - if (! tem) - return 0; + if (!tem) return 0; newE->publicId = tem; } } else { - const XML_Char *tem - = poolCopyStringN(newPool, oldE->textPtr, oldE->textLen); - if (! tem) - return 0; + const XML_Char *tem = + poolCopyStringN(newPool, oldE->textPtr, oldE->textLen); + if (!tem) return 0; newE->textPtr = tem; newE->textLen = oldE->textLen; } if (oldE->notation) { const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (! tem) - return 0; + if (!tem) return 0; newE->notation = tem; } newE->is_param = oldE->is_param; @@ -6345,30 +5967,25 @@ copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, #define INIT_POWER 6 -static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) { +static XML_Bool FASTCALL keyeq(KEY s1, KEY s2) { for (; *s1 == *s2; s1++, s2++) - if (*s1 == 0) - return XML_TRUE; + if (*s1 == 0) return XML_TRUE; return XML_FALSE; } -static size_t -keylen(KEY s) { +static size_t keylen(KEY s) { size_t len = 0; for (; *s; s++, len++) ; return len; } -static void -copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key) { +static void copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key) { key->k[0] = 0; key->k[1] = get_hash_secret_salt(parser); } -static unsigned long FASTCALL -hash(XML_Parser parser, KEY s) { +static unsigned long FASTCALL hash(XML_Parser parser, KEY s) { struct siphash state; struct sipkey key; (void)sip24_valid; @@ -6378,19 +5995,18 @@ hash(XML_Parser parser, KEY s) { return (unsigned long)sip24_final(&state); } -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { +static NAMED *lookup(XML_Parser parser, HASH_TABLE *table, KEY name, + size_t createSize) { size_t i; if (table->size == 0) { size_t tsize; - if (! createSize) - return NULL; + if (!createSize) return NULL; table->power = INIT_POWER; /* table->size is a power of 2 */ table->size = (size_t)1 << INIT_POWER; tsize = table->size * sizeof(NAMED *); table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (! table->v) { + if (!table->v) { table->size = 0; return NULL; } @@ -6402,14 +6018,11 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { unsigned char step = 0; i = h & mask; while (table->v[i]) { - if (keyeq(name, table->v[i]->name)) - return table->v[i]; - if (! step) - step = PROBE_STEP(h, mask, table->power); + if (keyeq(name, table->v[i]->name)) return table->v[i]; + if (!step) step = PROBE_STEP(h, mask, table->power); i < step ? (i += table->size - step) : (i -= step); } - if (! createSize) - return NULL; + if (!createSize) return NULL; /* check for overflow (table is half full) */ if (table->used >> (table->power - 1)) { @@ -6418,8 +6031,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { unsigned long newMask = (unsigned long)newSize - 1; size_t tsize = newSize * sizeof(NAMED *); NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (! newV) - return NULL; + if (!newV) return NULL; memset(newV, 0, tsize); for (i = 0; i < table->size; i++) if (table->v[i]) { @@ -6427,8 +6039,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { size_t j = newHash & newMask; step = 0; while (newV[j]) { - if (! step) - step = PROBE_STEP(newHash, newMask, newPower); + if (!step) step = PROBE_STEP(newHash, newMask, newPower); j < step ? (j += newSize - step) : (j -= step); } newV[j] = table->v[i]; @@ -6440,23 +6051,20 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { i = h & newMask; step = 0; while (table->v[i]) { - if (! step) - step = PROBE_STEP(h, newMask, newPower); + if (!step) step = PROBE_STEP(h, newMask, newPower); i < step ? (i += newSize - step) : (i -= step); } } } table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (! table->v[i]) - return NULL; + if (!table->v[i]) return NULL; memset(table->v[i], 0, createSize); table->v[i]->name = name; (table->used)++; return table->v[i]; } -static void FASTCALL -hashTableClear(HASH_TABLE *table) { +static void FASTCALL hashTableClear(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) { table->mem->free_fcn(table->v[i]); @@ -6465,16 +6073,14 @@ hashTableClear(HASH_TABLE *table) { table->used = 0; } -static void FASTCALL -hashTableDestroy(HASH_TABLE *table) { +static void FASTCALL hashTableDestroy(HASH_TABLE *table) { size_t i; - for (i = 0; i < table->size; i++) - table->mem->free_fcn(table->v[i]); + for (i = 0; i < table->size; i++) table->mem->free_fcn(table->v[i]); table->mem->free_fcn(table->v); } -static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) { +static void FASTCALL hashTableInit(HASH_TABLE *p, + const XML_Memory_Handling_Suite *ms) { p->power = 0; p->size = 0; p->used = 0; @@ -6482,24 +6088,22 @@ hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) { p->mem = ms; } -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) { +static void FASTCALL hashTableIterInit(HASH_TABLE_ITER *iter, + const HASH_TABLE *table) { iter->p = table->v; iter->end = iter->p + table->size; } -static NAMED *FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) { +static NAMED *FASTCALL hashTableIterNext(HASH_TABLE_ITER *iter) { while (iter->p != iter->end) { NAMED *tem = *(iter->p)++; - if (tem) - return tem; + if (tem) return tem; } return NULL; } -static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) { +static void FASTCALL poolInit(STRING_POOL *pool, + const XML_Memory_Handling_Suite *ms) { pool->blocks = NULL; pool->freeBlocks = NULL; pool->start = NULL; @@ -6508,9 +6112,8 @@ poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) { pool->mem = ms; } -static void FASTCALL -poolClear(STRING_POOL *pool) { - if (! pool->freeBlocks) +static void FASTCALL poolClear(STRING_POOL *pool) { + if (!pool->freeBlocks) pool->freeBlocks = pool->blocks; else { BLOCK *p = pool->blocks; @@ -6527,8 +6130,7 @@ poolClear(STRING_POOL *pool) { pool->end = NULL; } -static void FASTCALL -poolDestroy(STRING_POOL *pool) { +static void FASTCALL poolDestroy(STRING_POOL *pool) { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; @@ -6543,37 +6145,33 @@ poolDestroy(STRING_POOL *pool) { } } -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, - const char *end) { - if (! pool->ptr && ! poolGrow(pool)) - return NULL; +static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) { + if (!pool->ptr && !poolGrow(pool)) return NULL; for (;;) { - const enum XML_Convert_Result convert_res = XmlConvert( - enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if ((convert_res == XML_CONVERT_COMPLETED) - || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + const enum XML_Convert_Result convert_res = + XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if ((convert_res == XML_CONVERT_COMPLETED) || + (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) break; - if (! poolGrow(pool)) - return NULL; + if (!poolGrow(pool)) return NULL; } return pool->start; } -static const XML_Char *FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) { +static const XML_Char *FASTCALL poolCopyString(STRING_POOL *pool, + const XML_Char *s) { do { - if (! poolAppendChar(pool, *s)) - return NULL; + if (!poolAppendChar(pool, *s)) return NULL; } while (*s++); s = pool->start; poolFinish(pool); return s; } -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { - if (! pool->ptr && ! poolGrow(pool)) { +static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, + int n) { + if (!pool->ptr && !poolGrow(pool)) { /* The following line is unreachable given the current usage of * poolCopyStringN(). Currently it is called from exactly one * place to copy the text of a simple general entity. By that @@ -6588,37 +6186,31 @@ poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { return NULL; /* LCOV_EXCL_LINE */ } for (; n > 0; --n, s++) { - if (! poolAppendChar(pool, *s)) - return NULL; + if (!poolAppendChar(pool, *s)) return NULL; } s = pool->start; poolFinish(pool); return s; } -static const XML_Char *FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) { +static const XML_Char *FASTCALL poolAppendString(STRING_POOL *pool, + const XML_Char *s) { while (*s) { - if (! poolAppendChar(pool, *s)) - return NULL; + if (!poolAppendChar(pool, *s)) return NULL; s++; } return pool->start; } -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, - const char *end) { - if (! poolAppend(pool, enc, ptr, end)) - return NULL; - if (pool->ptr == pool->end && ! poolGrow(pool)) - return NULL; +static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) { + if (!poolAppend(pool, enc, ptr, end)) return NULL; + if (pool->ptr == pool->end && !poolGrow(pool)) return NULL; *(pool->ptr)++ = 0; return pool->start; } -static size_t -poolBytesToAllocateFor(int blockSize) { +static size_t poolBytesToAllocateFor(int blockSize) { /* Unprotected math would be: ** return offsetof(BLOCK, s) + blockSize * sizeof(XML_Char); ** @@ -6628,25 +6220,21 @@ poolBytesToAllocateFor(int blockSize) { */ const size_t stretch = sizeof(XML_Char); /* can be 4 bytes */ - if (blockSize <= 0) - return 0; + if (blockSize <= 0) return 0; - if (blockSize > (int)(INT_MAX / stretch)) - return 0; + if (blockSize > (int)(INT_MAX / stretch)) return 0; { const int stretchedBlockSize = blockSize * (int)stretch; - const int bytesToAllocate - = (int)(offsetof(BLOCK, s) + (unsigned)stretchedBlockSize); - if (bytesToAllocate < 0) - return 0; + const int bytesToAllocate = + (int)(offsetof(BLOCK, s) + (unsigned)stretchedBlockSize); + if (bytesToAllocate < 0) return 0; return (size_t)bytesToAllocate; } } -static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) { +static XML_Bool FASTCALL poolGrow(STRING_POOL *pool) { if (pool->freeBlocks) { if (pool->start == 0) { pool->blocks = pool->freeBlocks; @@ -6690,13 +6278,11 @@ poolGrow(STRING_POOL *pool) { } bytesToAllocate = poolBytesToAllocateFor(blockSize); - if (bytesToAllocate == 0) - return XML_FALSE; + if (bytesToAllocate == 0) return XML_FALSE; temp = (BLOCK *)pool->mem->realloc_fcn(pool->blocks, (unsigned)bytesToAllocate); - if (temp == NULL) - return XML_FALSE; + if (temp == NULL) return XML_FALSE; pool->blocks = temp; pool->blocks->size = blockSize; pool->ptr = pool->blocks->s + offsetInsideBlock; @@ -6731,12 +6317,10 @@ poolGrow(STRING_POOL *pool) { } bytesToAllocate = poolBytesToAllocateFor(blockSize); - if (bytesToAllocate == 0) - return XML_FALSE; + if (bytesToAllocate == 0) return XML_FALSE; tem = (BLOCK *)pool->mem->malloc_fcn(bytesToAllocate); - if (! tem) - return XML_FALSE; + if (!tem) return XML_FALSE; tem->size = blockSize; tem->next = pool->blocks; pool->blocks = tem; @@ -6749,16 +6333,14 @@ poolGrow(STRING_POOL *pool) { return XML_TRUE; } -static int FASTCALL -nextScaffoldPart(XML_Parser parser) { +static int FASTCALL nextScaffoldPart(XML_Parser parser) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ CONTENT_SCAFFOLD *me; int next; - if (! dtd->scaffIndex) { + if (!dtd->scaffIndex) { dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int)); - if (! dtd->scaffIndex) - return -1; + if (!dtd->scaffIndex) return -1; dtd->scaffIndex[0] = 0; } @@ -6767,14 +6349,12 @@ nextScaffoldPart(XML_Parser parser) { if (dtd->scaffold) { temp = (CONTENT_SCAFFOLD *)REALLOC( parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; + if (temp == NULL) return -1; dtd->scaffSize *= 2; } else { - temp = (CONTENT_SCAFFOLD *)MALLOC(parser, INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; + temp = (CONTENT_SCAFFOLD *)MALLOC( + parser, INIT_SCAFFOLD_ELEMENTS * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) return -1; dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; } dtd->scaffold = temp; @@ -6782,13 +6362,12 @@ nextScaffoldPart(XML_Parser parser) { next = dtd->scaffCount++; me = &dtd->scaffold[next]; if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent - = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]]; + CONTENT_SCAFFOLD *parent = + &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]]; if (parent->lastchild) { dtd->scaffold[parent->lastchild].nextsib = next; } - if (! parent->childcnt) - parent->firstchild = next; + if (!parent->childcnt) parent->firstchild = next; parent->lastchild = next; parent->childcnt++; } @@ -6796,9 +6375,8 @@ nextScaffoldPart(XML_Parser parser) { return next; } -static void -build_node(XML_Parser parser, int src_node, XML_Content *dest, - XML_Content **contpos, XML_Char **strpos) { +static void build_node(XML_Parser parser, int src_node, XML_Content *dest, + XML_Content **contpos, XML_Char **strpos) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ dest->type = dtd->scaffold[src_node].type; dest->quant = dtd->scaffold[src_node].quant; @@ -6808,8 +6386,7 @@ build_node(XML_Parser parser, int src_node, XML_Content *dest, src = dtd->scaffold[src_node].name; for (;;) { *(*strpos)++ = *src; - if (! *src) - break; + if (!*src) break; src++; } dest->numchildren = 0; @@ -6828,18 +6405,16 @@ build_node(XML_Parser parser, int src_node, XML_Content *dest, } } -static XML_Content * -build_model(XML_Parser parser) { +static XML_Content *build_model(XML_Parser parser) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ XML_Content *ret; XML_Content *cpos; XML_Char *str; - int allocsize = (dtd->scaffCount * sizeof(XML_Content) - + (dtd->contentStringLen * sizeof(XML_Char))); + int allocsize = (dtd->scaffCount * sizeof(XML_Content) + + (dtd->contentStringLen * sizeof(XML_Char))); ret = (XML_Content *)MALLOC(parser, allocsize); - if (! ret) - return NULL; + if (!ret) return NULL; str = (XML_Char *)(&ret[dtd->scaffCount]); cpos = &ret[1]; @@ -6848,31 +6423,27 @@ build_model(XML_Parser parser) { return ret; } -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr, - const char *end) { +static ELEMENT_TYPE *getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end) { DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); ELEMENT_TYPE *ret; - if (! name) - return NULL; + if (!name) return NULL; ret = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (! ret) - return NULL; + if (!ret) return NULL; if (ret->name != name) poolDiscard(&dtd->pool); else { poolFinish(&dtd->pool); - if (! setElementTypePrefix(parser, ret)) - return NULL; + if (!setElementTypePrefix(parser, ret)) return NULL; } return ret; } -static XML_Char * -copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) { +static XML_Char *copyString(const XML_Char *s, + const XML_Memory_Handling_Suite *memsuite) { int charsRequired = 0; XML_Char *result; @@ -6885,8 +6456,7 @@ copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) { /* Now allocate space for the copy */ result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char)); - if (result == NULL) - return NULL; + if (result == NULL) return NULL; /* Copy the original into place */ memcpy(result, s, charsRequired * sizeof(XML_Char)); return result; diff --git a/third_party/python/Modules/expat/xmlrole.c b/third_party/python/Modules/expat/xmlrole.c index 4d3e3e86e..ed9d7edf6 100644 --- a/third_party/python/Modules/expat/xmlrole.c +++ b/third_party/python/Modules/expat/xmlrole.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ @@ -30,16 +31,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include - -#ifdef _WIN32 -# include "winconfig.h" -#else -# ifdef HAVE_EXPAT_CONFIG_H -# include -# endif -#endif /* ndef _WIN32 */ - +#include "expat_config.h" #include "expat_external.h" #include "internal.h" #include "xmlrole.h" diff --git a/third_party/python/Modules/expat/xmlrole.h b/third_party/python/Modules/expat/xmlrole.h index 036aba64f..62536f903 100644 --- a/third_party/python/Modules/expat/xmlrole.h +++ b/third_party/python/Modules/expat/xmlrole.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/xmltok.c b/third_party/python/Modules/expat/xmltok.c index 11e9d1ccd..f354d11a5 100644 --- a/third_party/python/Modules/expat/xmltok.c +++ b/third_party/python/Modules/expat/xmltok.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ @@ -30,29 +31,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include /* memcpy */ - -#if defined(_MSC_VER) && (_MSC_VER <= 1700) -/* for vs2012/11.0/1700 and earlier Visual Studio compilers */ -# define bool int -# define false 0 -# define true 1 -#else -# include -#endif - -#ifdef _WIN32 -# include "winconfig.h" -#else -# ifdef HAVE_EXPAT_CONFIG_H -# include -# endif -#endif /* ndef _WIN32 */ - +#include "expat_config.h" #include "expat_external.h" #include "internal.h" #include "xmltok.h" +#include "libc/str/str.h" #include "nametab.h" #ifdef XML_DTD diff --git a/third_party/python/Modules/expat/xmltok.h b/third_party/python/Modules/expat/xmltok.h index 2adbf5307..933b5a637 100644 --- a/third_party/python/Modules/expat/xmltok.h +++ b/third_party/python/Modules/expat/xmltok.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/xmltok_impl.c b/third_party/python/Modules/expat/xmltok_impl.c index c209221cd..0e8af24bd 100644 --- a/third_party/python/Modules/expat/xmltok_impl.c +++ b/third_party/python/Modules/expat/xmltok_impl.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* This file is included! __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/expat/xmltok_impl.h b/third_party/python/Modules/expat/xmltok_impl.h index e925dbc7e..d3c11efd0 100644 --- a/third_party/python/Modules/expat/xmltok_impl.h +++ b/third_party/python/Modules/expat/xmltok_impl.h @@ -1,3 +1,4 @@ +/* clang-format off */ /* __ __ _ ___\ \/ /_ __ __ _| |_ @@ -69,5 +70,3 @@ enum { BT_COMMA, /* comma = "," */ BT_VERBAR /* vertical bar = "|" */ }; - -#include diff --git a/third_party/python/Modules/expat/xmltok_ns.c b/third_party/python/Modules/expat/xmltok_ns.c index 919c74e9f..546876179 100644 --- a/third_party/python/Modules/expat/xmltok_ns.c +++ b/third_party/python/Modules/expat/xmltok_ns.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* This file is included! __ __ _ ___\ \/ /_ __ __ _| |_ diff --git a/third_party/python/Modules/faulthandler.c b/third_party/python/Modules/faulthandler.c index 02016fb4d..385d95f19 100644 --- a/third_party/python/Modules/faulthandler.c +++ b/third_party/python/Modules/faulthandler.c @@ -1,23 +1,10 @@ -#include "Python.h" -#include "pythread.h" -#include -#include -#include -#include +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pythread.h" #include "libc/calls/sigbits.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/rlimit.h" -#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) -# include -#endif -#ifdef MS_WINDOWS -# include -#endif -#ifdef HAVE_SYS_RESOURCE_H -# include -#endif -#include /* Allocate at maximum 100 MB of the stack to raise the stack overflow */ #define STACK_OVERFLOW_MAX_SIZE (100*1024*1024) diff --git a/third_party/python/Modules/fcntlmodule.c b/third_party/python/Modules/fcntlmodule.c index d52e8c8e3..d16af2a84 100644 --- a/third_party/python/Modules/fcntlmodule.c +++ b/third_party/python/Modules/fcntlmodule.c @@ -1,22 +1,15 @@ +#include "libc/calls/calls.h" +#include "libc/calls/ioctl.h" +#include "libc/calls/struct/flock.h" +#include "libc/sysv/consts/f.h" +#include "libc/sysv/consts/fd.h" +/* clang-format off */ /* fcntl module */ #define PY_SSIZE_T_CLEAN -#include "Python.h" - -#ifdef HAVE_SYS_FILE_H -// #include -#endif - -#include "libc/calls/calls.h" -#include "libc/calls/ioctl.h" -#include "libc/calls/struct/flock.h" -#include "libc/sysv/consts/fd.h" -#include -#ifdef HAVE_STROPTS_H -#include -#endif +#include "third_party/python/Include/Python.h" /*[clinic input] module fcntl @@ -35,7 +28,7 @@ conv_descriptor(PyObject *object, int *target) } /* Must come after conv_descriptor definition. */ -#include "clinic/fcntlmodule.c.h" +#include "third_party/python/Modules/clinic/fcntlmodule.inc" /*[clinic input] fcntl.fcntl diff --git a/third_party/python/Modules/fpectlmodule.c b/third_party/python/Modules/fpectlmodule.c index 052b83480..1740b8965 100644 --- a/third_party/python/Modules/fpectlmodule.c +++ b/third_party/python/Modules/fpectlmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* --------------------------------------------------------------------- / Copyright (c) 1996. \ @@ -61,22 +62,13 @@ ** Version 1.0: September 20, 1996. Lee Busby, LLNL. */ -#ifdef __cplusplus -extern "C" { -#endif - -#include "Python.h" -#include - -#if defined(__FreeBSD__) -# include -#endif +#include "libc/runtime/runtime.h" +#include "third_party/python/Include/Python.h" #ifndef WANT_SIGFPE_HANDLER /* Define locally if they are not defined in Python. This gives only * the limited control to induce a core dump in case of an exception. */ -#include static jmp_buf PyFPE_jbuf; static int PyFPE_counter = 0; #endif @@ -271,7 +263,3 @@ PyMODINIT_FUNC PyInit_fpectl(void) PyDict_SetItemString(d, "error", fpe_error); return m; } - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/fpetestmodule.c b/third_party/python/Modules/fpetestmodule.c index 5b6c220d9..508b1c77a 100644 --- a/third_party/python/Modules/fpetestmodule.c +++ b/third_party/python/Modules/fpetestmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* --------------------------------------------------------------------- / Copyright (c) 1996. \ diff --git a/third_party/python/Modules/gcmodule.c b/third_party/python/Modules/gcmodule.c index 8430b944a..b04ad0a36 100644 --- a/third_party/python/Modules/gcmodule.c +++ b/third_party/python/Modules/gcmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Reference Cycle Garbage Collection @@ -28,10 +29,10 @@ #undef unreachable #endif -#include "Python.h" -#include "frameobject.h" /* for PyFrame_ClearFreeList */ -#include "pydtrace.h" -#include "pytime.h" /* for _PyTime_GetMonotonicClock() */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Include/pydtrace.h" +#include "third_party/python/Include/pytime.h" /* Get an object's GC head */ #define AS_GC(o) ((PyGC_Head *)(o)-1) diff --git a/third_party/python/Modules/getaddrinfo.c b/third_party/python/Modules/getaddrinfo.c deleted file mode 100644 index b6fb53cb3..000000000 --- a/third_party/python/Modules/getaddrinfo.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * "#ifdef FAITH" part is local hack for supporting IPv4-v6 translator. - * - * Issues to be discussed: - * - Thread safe-ness must be checked. - * - Return values. There are nonstandard return values defined and used - * in the source code. This is because RFC2133 is silent about which error - * code must be returned for which situation. - * - PF_UNSPEC case would be handled in getipnodebyname() with the AI_ALL flag. - */ - -#if 0 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "addrinfo.h" -#endif - -#if defined(__KAME__) && defined(ENABLE_IPV6) -# define FAITH -#endif - -#define SUCCESS 0 -#define GAI_ANY 0 -#define YES 1 -#define NO 0 - -#ifdef FAITH -static int translate = NO; -static struct in6_addr faith_prefix = IN6ADDR_GAI_ANY_INIT; -#endif - -static const char in_addrany[] = { 0, 0, 0, 0 }; -static const char in6_addrany[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const char in_loopback[] = { 127, 0, 0, 1 }; -static const char in6_loopback[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -}; - -struct sockinet { - u_char si_len; - u_char si_family; - u_short si_port; -}; - -static struct gai_afd { - int a_af; - int a_addrlen; - int a_socklen; - int a_off; - const char *a_addrany; - const char *a_loopback; -} gai_afdl [] = { -#ifdef ENABLE_IPV6 -#define N_INET6 0 - {PF_INET6, sizeof(struct in6_addr), - sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr), - in6_addrany, in6_loopback}, -#define N_INET 1 -#else -#define N_INET 0 -#endif - {PF_INET, sizeof(struct in_addr), - sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr), - in_addrany, in_loopback}, - {0, 0, 0, 0, NULL, NULL}, -}; - -#ifdef ENABLE_IPV6 -#define PTON_MAX 16 -#else -#define PTON_MAX 4 -#endif - -#ifndef IN_MULTICAST -#define IN_MULTICAST(i) (((i) & 0xf0000000U) == 0xe0000000U) -#endif - -#ifndef IN_EXPERIMENTAL -#define IN_EXPERIMENTAL(i) (((i) & 0xe0000000U) == 0xe0000000U) -#endif - -#ifndef IN_LOOPBACKNET -#define IN_LOOPBACKNET 127 -#endif - -static int get_name(const char *, struct gai_afd *, - struct addrinfo **, char *, struct addrinfo *, - int); -static int get_addr(const char *, int, struct addrinfo **, - struct addrinfo *, int); -static int str_isnumber(const char *); - -static const char * const ai_errlist[] = { - "success.", - "address family for hostname not supported.", /* EAI_ADDRFAMILY */ - "temporary failure in name resolution.", /* EAI_AGAIN */ - "invalid value for ai_flags.", /* EAI_BADFLAGS */ - "non-recoverable failure in name resolution.", /* EAI_FAIL */ - "ai_family not supported.", /* EAI_FAMILY */ - "memory allocation failure.", /* EAI_MEMORY */ - "no address associated with hostname.", /* EAI_NODATA */ - "hostname nor servname provided, or not known.",/* EAI_NONAME */ - "servname not supported for ai_socktype.", /* EAI_SERVICE */ - "ai_socktype not supported.", /* EAI_SOCKTYPE */ - "system error returned in errno.", /* EAI_SYSTEM */ - "invalid value for hints.", /* EAI_BADHINTS */ - "resolved protocol is unknown.", /* EAI_PROTOCOL */ - "unknown error.", /* EAI_MAX */ -}; - -#define GET_CANONNAME(ai, str) \ -if (pai->ai_flags & AI_CANONNAME) {\ - if (((ai)->ai_canonname = (char *)malloc(strlen(str) + 1)) != NULL) {\ - strcpy((ai)->ai_canonname, (str));\ - } else {\ - error = EAI_MEMORY;\ - goto free;\ - }\ -} - -#ifdef HAVE_SOCKADDR_SA_LEN -#define GET_AI(ai, gai_afd, addr, port) {\ - char *p;\ - if (((ai) = (struct addrinfo *)malloc(sizeof(struct addrinfo) +\ - ((gai_afd)->a_socklen)))\ - == NULL) goto free;\ - memcpy(ai, pai, sizeof(struct addrinfo));\ - (ai)->ai_addr = (struct sockaddr *)((ai) + 1);\ - memset((ai)->ai_addr, 0, (gai_afd)->a_socklen);\ - (ai)->ai_addr->sa_len = (ai)->ai_addrlen = (gai_afd)->a_socklen;\ - (ai)->ai_addr->sa_family = (ai)->ai_family = (gai_afd)->a_af;\ - ((struct sockinet *)(ai)->ai_addr)->si_port = port;\ - p = (char *)((ai)->ai_addr);\ - memcpy(p + (gai_afd)->a_off, (addr), (gai_afd)->a_addrlen);\ -} -#else -#define GET_AI(ai, gai_afd, addr, port) {\ - char *p;\ - if (((ai) = (struct addrinfo *)malloc(sizeof(struct addrinfo) +\ - ((gai_afd)->a_socklen)))\ - == NULL) goto free;\ - memcpy(ai, pai, sizeof(struct addrinfo));\ - (ai)->ai_addr = (struct sockaddr *)((ai) + 1);\ - memset((ai)->ai_addr, 0, (gai_afd)->a_socklen);\ - (ai)->ai_addrlen = (gai_afd)->a_socklen;\ - (ai)->ai_addr->sa_family = (ai)->ai_family = (gai_afd)->a_af;\ - ((struct sockinet *)(ai)->ai_addr)->si_port = port;\ - p = (char *)((ai)->ai_addr);\ - memcpy(p + (gai_afd)->a_off, (addr), (gai_afd)->a_addrlen);\ -} -#endif - -#define ERR(err) { error = (err); goto bad; } - -const char * -gai_strerror(int ecode) -{ - if (ecode < 0 || ecode > EAI_MAX) - ecode = EAI_MAX; - return ai_errlist[ecode]; -} - -void -freeaddrinfo(struct addrinfo *ai) -{ - struct addrinfo *next; - - do { - next = ai->ai_next; - if (ai->ai_canonname) - free(ai->ai_canonname); - /* no need to free(ai->ai_addr) */ - free(ai); - } while ((ai = next) != NULL); -} - -static int -str_isnumber(const char *p) -{ - unsigned char *q = (unsigned char *)p; - while (*q) { - if (! isdigit(*q)) - return NO; - q++; - } - return YES; -} - -int -getaddrinfo(const char*hostname, const char*servname, - const struct addrinfo *hints, struct addrinfo **res) -{ - struct addrinfo sentinel; - struct addrinfo *top = NULL; - struct addrinfo *cur; - int i, error = 0; - char pton[PTON_MAX]; - struct addrinfo ai; - struct addrinfo *pai; - u_short port; - -#ifdef FAITH - static int firsttime = 1; - - if (firsttime) { - /* translator hack */ - { - char *q = getenv("GAI"); - if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1) - translate = YES; - } - firsttime = 0; - } -#endif - - /* initialize file static vars */ - sentinel.ai_next = NULL; - cur = &sentinel; - pai = &ai; - pai->ai_flags = 0; - pai->ai_family = PF_UNSPEC; - pai->ai_socktype = GAI_ANY; - pai->ai_protocol = GAI_ANY; - pai->ai_addrlen = 0; - pai->ai_canonname = NULL; - pai->ai_addr = NULL; - pai->ai_next = NULL; - port = GAI_ANY; - - if (hostname == NULL && servname == NULL) - return EAI_NONAME; - if (hints) { - /* error check for hints */ - if (hints->ai_addrlen || hints->ai_canonname || - hints->ai_addr || hints->ai_next) - ERR(EAI_BADHINTS); /* xxx */ - if (hints->ai_flags & ~AI_MASK) - ERR(EAI_BADFLAGS); - switch (hints->ai_family) { - case PF_UNSPEC: - case PF_INET: -#ifdef ENABLE_IPV6 - case PF_INET6: -#endif - break; - default: - ERR(EAI_FAMILY); - } - memcpy(pai, hints, sizeof(*pai)); - switch (pai->ai_socktype) { - case GAI_ANY: - switch (pai->ai_protocol) { - case GAI_ANY: - break; - case IPPROTO_UDP: - pai->ai_socktype = SOCK_DGRAM; - break; - case IPPROTO_TCP: - pai->ai_socktype = SOCK_STREAM; - break; - default: - pai->ai_socktype = SOCK_RAW; - break; - } - break; - case SOCK_RAW: - break; - case SOCK_DGRAM: - if (pai->ai_protocol != IPPROTO_UDP && - pai->ai_protocol != GAI_ANY) - ERR(EAI_BADHINTS); /*xxx*/ - pai->ai_protocol = IPPROTO_UDP; - break; - case SOCK_STREAM: - if (pai->ai_protocol != IPPROTO_TCP && - pai->ai_protocol != GAI_ANY) - ERR(EAI_BADHINTS); /*xxx*/ - pai->ai_protocol = IPPROTO_TCP; - break; - default: - ERR(EAI_SOCKTYPE); - /* unreachable */ - } - } - - /* - * service port - */ - if (servname) { - if (str_isnumber(servname)) { - if (pai->ai_socktype == GAI_ANY) { - /* caller accept *GAI_ANY* socktype */ - pai->ai_socktype = SOCK_DGRAM; - pai->ai_protocol = IPPROTO_UDP; - } - port = htons((u_short)atoi(servname)); - } else { - struct servent *sp; - char *proto; - - proto = NULL; - switch (pai->ai_socktype) { - case GAI_ANY: - proto = NULL; - break; - case SOCK_DGRAM: - proto = "udp"; - break; - case SOCK_STREAM: - proto = "tcp"; - break; - default: - fprintf(stderr, "panic!\n"); - break; - } - if ((sp = getservbyname(servname, proto)) == NULL) - ERR(EAI_SERVICE); - port = sp->s_port; - if (pai->ai_socktype == GAI_ANY) { - if (strcmp(sp->s_proto, "udp") == 0) { - pai->ai_socktype = SOCK_DGRAM; - pai->ai_protocol = IPPROTO_UDP; - } else if (strcmp(sp->s_proto, "tcp") == 0) { - pai->ai_socktype = SOCK_STREAM; - pai->ai_protocol = IPPROTO_TCP; - } else - ERR(EAI_PROTOCOL); /*xxx*/ - } - } - } - - /* - * hostname == NULL. - * passive socket -> anyaddr (0.0.0.0 or ::) - * non-passive socket -> localhost (127.0.0.1 or ::1) - */ - if (hostname == NULL) { - struct gai_afd *gai_afd; - - for (gai_afd = &gai_afdl[0]; gai_afd->a_af; gai_afd++) { - if (!(pai->ai_family == PF_UNSPEC - || pai->ai_family == gai_afd->a_af)) { - continue; - } - - if (pai->ai_flags & AI_PASSIVE) { - GET_AI(cur->ai_next, gai_afd, gai_afd->a_addrany, port); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "anyaddr"); - */ - } else { - GET_AI(cur->ai_next, gai_afd, gai_afd->a_loopback, - port); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "localhost"); - */ - } - cur = cur->ai_next; - } - top = sentinel.ai_next; - if (top) - goto good; - else - ERR(EAI_FAMILY); - } - - /* hostname as numeric name */ - for (i = 0; gai_afdl[i].a_af; i++) { - if (inet_pton(gai_afdl[i].a_af, hostname, pton)) { - u_long v4a; -#ifdef ENABLE_IPV6 - u_char pfx; -#endif - - switch (gai_afdl[i].a_af) { - case AF_INET: - v4a = ((struct in_addr *)pton)->s_addr; - v4a = ntohl(v4a); - if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) - pai->ai_flags &= ~AI_CANONNAME; - v4a >>= IN_CLASSA_NSHIFT; - if (v4a == 0 || v4a == IN_LOOPBACKNET) - pai->ai_flags &= ~AI_CANONNAME; - break; -#ifdef ENABLE_IPV6 - case AF_INET6: - pfx = ((struct in6_addr *)pton)->s6_addr[0]; - if (pfx == 0 || pfx == 0xfe || pfx == 0xff) - pai->ai_flags &= ~AI_CANONNAME; - break; -#endif - } - - if (pai->ai_family == gai_afdl[i].a_af || - pai->ai_family == PF_UNSPEC) { - if (! (pai->ai_flags & AI_CANONNAME)) { - GET_AI(top, &gai_afdl[i], pton, port); - goto good; - } - /* - * if AI_CANONNAME and if reverse lookup - * fail, return ai anyway to pacify - * calling application. - * - * XXX getaddrinfo() is a name->address - * translation function, and it looks strange - * that we do addr->name translation here. - */ - get_name(pton, &gai_afdl[i], &top, pton, pai, port); - goto good; - } else - ERR(EAI_FAMILY); /*xxx*/ - } - } - - if (pai->ai_flags & AI_NUMERICHOST) - ERR(EAI_NONAME); - - /* hostname as alphabetical name */ - error = get_addr(hostname, pai->ai_family, &top, pai, port); - if (error == 0) { - if (top) { - good: - *res = top; - return SUCCESS; - } else - error = EAI_FAIL; - } - free: - if (top) - freeaddrinfo(top); - bad: - *res = NULL; - return error; -} - -static int -get_name(addr, gai_afd, res, numaddr, pai, port0) - const char *addr; - struct gai_afd *gai_afd; - struct addrinfo **res; - char *numaddr; - struct addrinfo *pai; - int port0; -{ - u_short port = port0 & 0xffff; - struct hostent *hp; - struct addrinfo *cur; - int error = 0; -#ifdef ENABLE_IPV6 - int h_error; -#endif - -#ifdef ENABLE_IPV6 - hp = getipnodebyaddr(addr, gai_afd->a_addrlen, gai_afd->a_af, &h_error); -#else - hp = gethostbyaddr(addr, gai_afd->a_addrlen, AF_INET); -#endif - if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { - GET_AI(cur, gai_afd, hp->h_addr_list[0], port); - GET_CANONNAME(cur, hp->h_name); - } else - GET_AI(cur, gai_afd, numaddr, port); - -#ifdef ENABLE_IPV6 - if (hp) - freehostent(hp); -#endif - *res = cur; - return SUCCESS; - free: - if (cur) - freeaddrinfo(cur); -#ifdef ENABLE_IPV6 - if (hp) - freehostent(hp); -#endif - /* bad: */ - *res = NULL; - return error; -} - -static int -get_addr(hostname, af, res, pai, port0) - const char *hostname; - int af; - struct addrinfo **res; - struct addrinfo *pai; - int port0; -{ - u_short port = port0 & 0xffff; - struct addrinfo sentinel; - struct hostent *hp; - struct addrinfo *top, *cur; - struct gai_afd *gai_afd; - int i, error = 0, h_error; - char *ap; - - top = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; -#ifdef ENABLE_IPV6 - if (af == AF_UNSPEC) { - hp = getipnodebyname(hostname, AF_INET6, - AI_ADDRCONFIG|AI_ALL|AI_V4MAPPED, &h_error); - } else - hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error); -#else - hp = gethostbyname(hostname); - h_error = h_errno; -#endif - if (hp == NULL) { - switch (h_error) { - case HOST_NOT_FOUND: - case NO_DATA: - error = EAI_NODATA; - break; - case TRY_AGAIN: - error = EAI_AGAIN; - break; - case NO_RECOVERY: - default: - error = EAI_FAIL; - break; - } - goto free; - } - - if ((hp->h_name == NULL) || (hp->h_name[0] == 0) || - (hp->h_addr_list[0] == NULL)) { - error = EAI_FAIL; - goto free; - } - - for (i = 0; (ap = hp->h_addr_list[i]) != NULL; i++) { - switch (af) { -#ifdef ENABLE_IPV6 - case AF_INET6: - gai_afd = &gai_afdl[N_INET6]; - break; -#endif -#ifndef ENABLE_IPV6 - default: /* AF_UNSPEC */ -#endif - case AF_INET: - gai_afd = &gai_afdl[N_INET]; - break; -#ifdef ENABLE_IPV6 - default: /* AF_UNSPEC */ - if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) { - ap += sizeof(struct in6_addr) - - sizeof(struct in_addr); - gai_afd = &gai_afdl[N_INET]; - } else - gai_afd = &gai_afdl[N_INET6]; - break; -#endif - } -#ifdef FAITH - if (translate && gai_afd->a_af == AF_INET) { - struct in6_addr *in6; - - GET_AI(cur->ai_next, &gai_afdl[N_INET6], ap, port); - in6 = &((struct sockaddr_in6 *)cur->ai_next->ai_addr)->sin6_addr; - memcpy(&in6->s6_addr32[0], &faith_prefix, - sizeof(struct in6_addr) - sizeof(struct in_addr)); - memcpy(&in6->s6_addr32[3], ap, sizeof(struct in_addr)); - } else -#endif /* FAITH */ - GET_AI(cur->ai_next, gai_afd, ap, port); - if (cur == &sentinel) { - top = cur->ai_next; - GET_CANONNAME(top, hp->h_name); - } - cur = cur->ai_next; - } -#ifdef ENABLE_IPV6 - freehostent(hp); -#endif - *res = top; - return SUCCESS; - free: - if (top) - freeaddrinfo(top); -#ifdef ENABLE_IPV6 - if (hp) - freehostent(hp); -#endif -/* bad: */ - *res = NULL; - return error; -} diff --git a/third_party/python/Modules/getbuildinfo.c b/third_party/python/Modules/getbuildinfo.c index 5f941a26e..99c6ecfa2 100644 --- a/third_party/python/Modules/getbuildinfo.c +++ b/third_party/python/Modules/getbuildinfo.c @@ -1,8 +1,5 @@ -#include "Python.h" - -#ifndef DONT_HAVE_STDIO_H -#include -#endif +/* clang-format off */ +#include "third_party/python/Include/Python.h" #ifndef DATE #ifdef __DATE__ diff --git a/third_party/python/Modules/getnameinfo.c b/third_party/python/Modules/getnameinfo.c deleted file mode 100644 index f014c11ae..000000000 --- a/third_party/python/Modules/getnameinfo.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Issues to be discussed: - * - Thread safe-ness must be checked - * - Return values. There seems to be no standard for return value (RFC2133) - * but INRIA implementation returns EAI_xxx defined for getaddrinfo(). - */ - -#if 0 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "addrinfo.h" -#endif - -#define SUCCESS 0 -#define YES 1 -#define NO 0 - -static struct gni_afd { - int a_af; - int a_addrlen; - int a_socklen; - int a_off; -} gni_afdl [] = { -#ifdef ENABLE_IPV6 - {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr)}, -#endif - {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr)}, - {0, 0, 0}, -}; - -struct gni_sockinet { - u_char si_len; - u_char si_family; - u_short si_port; -}; - -#define ENI_NOSOCKET 0 -#define ENI_NOSERVNAME 1 -#define ENI_NOHOSTNAME 2 -#define ENI_MEMORY 3 -#define ENI_SYSTEM 4 -#define ENI_FAMILY 5 -#define ENI_SALEN 6 - -/* forward declaration to make gcc happy */ -int getnameinfo(const struct sockaddr *, size_t, char *, size_t, - char *, size_t, int); - -int -getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) - const struct sockaddr *sa; - size_t salen; - char *host; - size_t hostlen; - char *serv; - size_t servlen; - int flags; -{ - struct gni_afd *gni_afd; - struct servent *sp; - struct hostent *hp; - u_short port; - int family, len, i; - char *addr, *p; - u_long v4a; -#ifdef ENABLE_IPV6 - u_char pfx; -#endif - int h_error; - char numserv[512]; - char numaddr[512]; - - if (sa == NULL) - return ENI_NOSOCKET; - -#ifdef HAVE_SOCKADDR_SA_LEN - len = sa->sa_len; - if (len != salen) return ENI_SALEN; -#else - len = salen; -#endif - - family = sa->sa_family; - for (i = 0; gni_afdl[i].a_af; i++) - if (gni_afdl[i].a_af == family) { - gni_afd = &gni_afdl[i]; - goto found; - } - return ENI_FAMILY; - - found: - if (len != gni_afd->a_socklen) return ENI_SALEN; - - port = ((struct gni_sockinet *)sa)->si_port; /* network byte order */ - addr = (char *)sa + gni_afd->a_off; - - if (serv == NULL || servlen == 0) { - /* what we should do? */ - } else if (flags & NI_NUMERICSERV) { - sprintf(numserv, "%d", ntohs(port)); - if (strlen(numserv) > servlen) - return ENI_MEMORY; - strcpy(serv, numserv); - } else { - sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp"); - if (sp) { - if (strlen(sp->s_name) > servlen) - return ENI_MEMORY; - strcpy(serv, sp->s_name); - } else - return ENI_NOSERVNAME; - } - - switch (sa->sa_family) { - case AF_INET: - v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr; - if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) - flags |= NI_NUMERICHOST; - v4a >>= IN_CLASSA_NSHIFT; - if (v4a == 0 || v4a == IN_LOOPBACKNET) - flags |= NI_NUMERICHOST; - break; -#ifdef ENABLE_IPV6 - case AF_INET6: - pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0]; - if (pfx == 0 || pfx == 0xfe || pfx == 0xff) - flags |= NI_NUMERICHOST; - break; -#endif - } - if (host == NULL || hostlen == 0) { - /* what should we do? */ - } else if (flags & NI_NUMERICHOST) { - if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) - == NULL) - return ENI_SYSTEM; - if (strlen(numaddr) > hostlen) - return ENI_MEMORY; - strcpy(host, numaddr); - } else { -#ifdef ENABLE_IPV6 - hp = getipnodebyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af, &h_error); -#else - hp = gethostbyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af); - h_error = h_errno; -#endif - - if (hp) { - if (flags & NI_NOFQDN) { - p = strchr(hp->h_name, '.'); - if (p) *p = '\0'; - } - if (strlen(hp->h_name) > hostlen) { -#ifdef ENABLE_IPV6 - freehostent(hp); -#endif - return ENI_MEMORY; - } - strcpy(host, hp->h_name); -#ifdef ENABLE_IPV6 - freehostent(hp); -#endif - } else { - if (flags & NI_NAMEREQD) - return ENI_NOHOSTNAME; - if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) - == NULL) - return ENI_NOHOSTNAME; - if (strlen(numaddr) > hostlen) - return ENI_MEMORY; - strcpy(host, numaddr); - } - } - return SUCCESS; -} diff --git a/third_party/python/Modules/getpath.c b/third_party/python/Modules/getpath.c index 53d0296fc..6ffbb5b65 100644 --- a/third_party/python/Modules/getpath.c +++ b/third_party/python/Modules/getpath.c @@ -1,18 +1,12 @@ +/* clang-format off */ /* Return the initial module search path. */ -#include "Python.h" -#include "osdefs.h" - -#include -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/osdefs.h" #pragma GCC diagnostic ignored "-Wunused-function" // search_for_exec_prefix #pragma GCC diagnostic ignored "-Wunused-but-set-variable" // separator -#ifdef __APPLE__ -#include -#endif - /* Search in some common locations for the associated Python libraries. * * Two directories must be found, the platform independent directory @@ -99,11 +93,6 @@ * NOTE: Windows MSVC builds use PC/getpathp.c instead! */ -#ifdef __cplusplus - extern "C" { -#endif - - #if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) #define PREFIX L"Lib" #define EXEC_PREFIX L"build" @@ -688,8 +677,3 @@ Py_GetProgramFullPath(void) calculate_path(); return progpath; } - - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/grpmodule.c b/third_party/python/Modules/grpmodule.c index 8a724b6b4..75457e9bd 100644 --- a/third_party/python/Modules/grpmodule.c +++ b/third_party/python/Modules/grpmodule.c @@ -1,12 +1,11 @@ +/* clang-format off */ /* UNIX group file access module */ -#include "Python.h" -#include "posixmodule.h" - -#include - -#include "clinic/grpmodule.c.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/posixmodule.h" +#include "third_party/musl/passwd.h" +#include "third_party/python/Modules/clinic/grpmodule.inc" /*[clinic input] module grp [clinic start generated code]*/ diff --git a/third_party/python/Modules/hashtable.c b/third_party/python/Modules/hashtable.c index 0547a6def..f7efb4ad2 100644 --- a/third_party/python/Modules/hashtable.c +++ b/third_party/python/Modules/hashtable.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* The implementation of the hash table (_Py_hashtable_t) is based on the cfuhash project: http://sourceforge.net/projects/libcfu/ @@ -44,8 +45,8 @@ ---------------------------------- */ -#include "Python.h" -#include "hashtable.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/hashtable.h" #define HASHTABLE_MIN_SIZE 16 #define HASHTABLE_HIGH 0.50 diff --git a/third_party/python/Modules/itertoolsmodule.c b/third_party/python/Modules/itertoolsmodule.c index 3ff597b0a..b7716b430 100644 --- a/third_party/python/Modules/itertoolsmodule.c +++ b/third_party/python/Modules/itertoolsmodule.c @@ -1,7 +1,8 @@ +/* clang-format off */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* Itertools module written and maintained by Raymond D. Hettinger diff --git a/third_party/python/Modules/main.c b/third_party/python/Modules/main.c index f40c1186b..d52caa5ac 100644 --- a/third_party/python/Modules/main.c +++ b/third_party/python/Modules/main.c @@ -1,40 +1,22 @@ +/* clang-format off */ /* Python interpreter main program */ -#include "Python.h" -#include "osdefs.h" - +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/osdefs.h" #include "libc/unicode/locale.h" -#if defined(MS_WINDOWS) || defined(__CYGWIN__) -#include -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#endif - -#ifdef _MSC_VER -#include -#endif - #if defined(MS_WINDOWS) #define PYTHONHOMEHELP "\\python{major}{minor}" #else #define PYTHONHOMEHELP "/lib/pythonX.X" #endif -#include "pygetopt.h" +#include "third_party/python/Include/pygetopt.h" #define COPYRIGHT \ "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ "for more information." -#ifdef __cplusplus -extern "C" { -#endif - /* For Py_GetArgcArgv(); set by main() */ static wchar_t **orig_argv; static int orig_argc; @@ -862,7 +844,3 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) *argc = orig_argc; *argv = orig_argv; } - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/mathmodule.c b/third_party/python/Modules/mathmodule.c index 95ea4f7fe..64599862f 100644 --- a/third_party/python/Modules/mathmodule.c +++ b/third_party/python/Modules/mathmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Math module -- standard C math library functions, pi and e */ /* Here are some comments from Tim Peters, extracted from the @@ -52,8 +53,8 @@ raised for division by zero and mod by zero. returned. */ -#include "Python.h" -#include "_math.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/_math.h" /* sin(pi*x), giving accurate results for all finite x (especially x diff --git a/third_party/python/Modules/md5module.c b/third_party/python/Modules/md5module.c index 5d46c68ee..2e8298665 100644 --- a/third_party/python/Modules/md5module.c +++ b/third_party/python/Modules/md5module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* MD5 module */ /* This module provides an interface to the MD5 algorithm */ @@ -16,9 +17,9 @@ /* MD5 objects */ -#include "Python.h" -#include "hashlib.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] module _md5 @@ -54,7 +55,7 @@ typedef struct { struct md5_state hash_state; } MD5object; -#include "clinic/md5module.c.h" +#include "third_party/python/Modules/clinic/md5module.inc" /* ------------------------------------------------------------------------ * diff --git a/third_party/python/Modules/mmapmodule.c b/third_party/python/Modules/mmapmodule.c index e6a4c8ce7..04b98b9fd 100644 --- a/third_party/python/Modules/mmapmodule.c +++ b/third_party/python/Modules/mmapmodule.c @@ -1,3 +1,9 @@ +#include "libc/mem/mem.h" +#include "libc/runtime/sysconf.h" +#include "libc/sysv/consts/map.h" +#include "libc/sysv/consts/msync.h" +#include "libc/sysv/consts/prot.h" +/* clang-format off */ /* / Author: Sam Rushing / Hacked for Unix by AMK @@ -19,70 +25,24 @@ */ #define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" -#include "libc/mem/mem.h" -#include "libc/sysv/consts/prot.h" -#include "libc/sysv/consts/msync.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" -#ifndef MS_WINDOWS #define UNIX -# ifdef HAVE_FCNTL_H -# include -# endif /* HAVE_FCNTL_H */ -#endif - -#ifdef MS_WINDOWS -#include -static int -my_getpagesize(void) -{ - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwPageSize; -} - -static int -my_getallocationgranularity (void) -{ - - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwAllocationGranularity; -} - -#endif #ifdef UNIX -#include -#include -#include "libc/runtime/sysconf.h" - #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) static int my_getpagesize(void) { return sysconf(_SC_PAGESIZE); } - #define my_getallocationgranularity my_getpagesize #else #define my_getpagesize getpagesize #endif - #endif /* UNIX */ -#include - -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ - -/* Prefer MAP_ANONYMOUS since MAP_ANON is deprecated according to man page. */ -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -# define MAP_ANONYMOUS MAP_ANON -#endif - typedef enum { ACCESS_DEFAULT, diff --git a/third_party/python/Modules/nismodule.c b/third_party/python/Modules/nismodule.c index 11df679b7..286e3ef6e 100644 --- a/third_party/python/Modules/nismodule.c +++ b/third_party/python/Modules/nismodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /*********************************************************** Written by: Fred Gansevles @@ -10,13 +11,7 @@ /* NIS module implementation */ -#include "Python.h" - -#include -#include -#include -#include -#include +#include "third_party/python/Include/Python.h" #ifdef __sgi /* This is missing from rpcsvc/ypclnt.h */ diff --git a/third_party/python/Modules/ossaudiodev.c b/third_party/python/Modules/ossaudiodev.c index da1d16314..10573e6b2 100644 --- a/third_party/python/Modules/ossaudiodev.c +++ b/third_party/python/Modules/ossaudiodev.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * ossaudiodev -- Python interface to the OSS (Open Sound System) API. * This is the standard audio API for Linux and some diff --git a/third_party/python/Modules/overlapped.c b/third_party/python/Modules/overlapped.c index 17581e0a8..c5dea560b 100644 --- a/third_party/python/Modules/overlapped.c +++ b/third_party/python/Modules/overlapped.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * Support for overlapped IO * @@ -7,8 +8,8 @@ /* XXX check overflow and DWORD <-> Py_ssize_t conversions Check itemsize */ -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #define WINDOWS_LEAN_AND_MEAN #include diff --git a/third_party/python/Modules/parsermodule.c b/third_party/python/Modules/parsermodule.c index 710efc2d5..b62430c09 100644 --- a/third_party/python/Modules/parsermodule.c +++ b/third_party/python/Modules/parsermodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* parsermodule.c * * Copyright 1995-1996 by Fred L. Drake, Jr. and Virginia Polytechnic @@ -30,25 +31,20 @@ * Lib/symbol.h and Include/token.h. */ -#include "Python.h" /* general Python API */ -#include "Python-ast.h" /* mod_ty */ -#include "graminit.h" /* symbols defined in the grammar */ -#include "node.h" /* internal parser structure */ -#include "errcode.h" /* error codes for PyNode_*() */ -#include "token.h" /* token definitions */ -#include "grammar.h" -#include "parsetok.h" - /* ISTERMINAL() / ISNONTERMINAL() */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/Python-ast.h" +#include "third_party/python/Include/graminit.h" +#include "third_party/python/Include/node.h" +#include "third_party/python/Include/errcode.h" +#include "third_party/python/Include/token.h" +#include "third_party/python/Include/grammar.h" +#include "third_party/python/Include/parsetok.h" #undef Yield -#include "ast.h" +#include "third_party/python/Include/ast.h" extern grammar _PyParser_Grammar; /* From graminit.c */ -#ifdef lint -#include -#else #define NOTE(x) -#endif /* String constants used to initialize module attributes. * diff --git a/third_party/python/Modules/posixmodule.c b/third_party/python/Modules/posixmodule.c index 89cb75ff9..f0274d9f7 100644 --- a/third_party/python/Modules/posixmodule.c +++ b/third_party/python/Modules/posixmodule.c @@ -1,3 +1,13 @@ +#include "libc/alg/alg.h" +#include "libc/calls/termios.h" +#include "libc/sock/sock.h" +#include "libc/runtime/sysconf.h" +#include "libc/sysv/consts/at.h" +#include "third_party/musl/passwd.h" +#include "libc/sysv/consts/at.h" +#include "libc/sysv/consts/dt.h" +#include "libc/runtime/dlfcn.h" +/* clang-format off */ /* POSIX module implementation */ @@ -24,28 +34,9 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "libc/sock/sock.h" -#include "libc/runtime/sysconf.h" -#include "libc/runtime/dlfcn.h" -#ifndef MS_WINDOWS -#include "posixmodule.h" -#else -#include "winreparse.h" -#endif - -/* On android API level 21, 'AT_EACCESS' is not declared although - * HAVE_FACCESSAT is defined. */ -#ifdef __ANDROID__ -#undef HAVE_FACCESSAT -#endif - -#include /* needed for ctermid() */ - -#ifdef __cplusplus -extern "C" { -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/posixmodule.h" PyDoc_STRVAR(posix__doc__, "This module provides access to operating system functionality that is\n\ @@ -53,60 +44,6 @@ standardized by the C Standard and the POSIX standard (a thinly\n\ disguised Unix interface). Refer to the library manual and\n\ corresponding Unix manual entries for more information on calls."); - -#ifdef HAVE_SYS_UIO_H -#include -#endif - -#ifdef HAVE_SYS_SYSMACROS_H -/* GNU C Library: major(), minor(), makedev() */ -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ - -#ifdef HAVE_SYS_STAT_H -#include -#endif /* HAVE_SYS_STAT_H */ - -#ifdef HAVE_SYS_WAIT_H -#include /* For WNOHANG */ -#endif - -#ifdef HAVE_SIGNAL_H -#include -#endif - -#ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ - -#ifdef HAVE_GRP_H -#include -#endif - -#ifdef HAVE_SYSEXITS_H -#include "libc/sysv/consts/ex.h" -#endif /* HAVE_SYSEXITS_H */ - -#ifdef HAVE_SYS_LOADAVG_H -#include -#endif - -#ifdef HAVE_LANGINFO_H -#include -#endif - -#ifdef HAVE_SYS_SENDFILE_H -#include -#endif - -#ifdef HAVE_SCHED_H -#include -#endif - #if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY) #undef HAVE_SCHED_SETAFFINITY #endif @@ -115,93 +52,6 @@ corresponding Unix manual entries for more information on calls."); #define USE_XATTRS #endif -#ifdef USE_XATTRS -#include -#endif - -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#endif - -#ifdef HAVE_DLFCN_H -#include -#endif - -#ifdef __hpux -#include -#endif - -#if defined(__DragonFly__) || \ - defined(__OpenBSD__) || \ - defined(__FreeBSD__) || \ - defined(__NetBSD__) || \ - defined(__APPLE__) -#include -#endif - -#ifdef HAVE_LINUX_RANDOM_H -# include -#endif -#ifdef HAVE_GETRANDOM_SYSCALL -# include -#endif - -#if defined(MS_WINDOWS) -# define TERMSIZE_USE_CONIO -#elif defined(HAVE_SYS_IOCTL_H) -#include "libc/calls/calls.h" -#include "libc/sysv/consts/fd.h" -# if defined(HAVE_TERMIOS_H) -# include -# endif -# if defined(TIOCGWINSZ) -# define TERMSIZE_USE_IOCTL -# endif -#endif /* MS_WINDOWS */ - -/* Various compilers have only certain posix functions */ -/* XXX Gosh I wish these were all moved into pyconfig.h */ -#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */ -#define HAVE_OPENDIR 1 -#define HAVE_SYSTEM 1 -#include -#else -#ifdef _MSC_VER /* Microsoft compiler */ -#define HAVE_GETPPID 1 -#define HAVE_GETLOGIN 1 -#define HAVE_SPAWNV 1 -#define HAVE_EXECV 1 -#define HAVE_WSPAWNV 1 -#define HAVE_WEXECV 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_CWAIT 1 -#define HAVE_FSYNC 1 -#define fsync _commit -#else -/* Unix functions that the configure script doesn't check for */ -#define HAVE_EXECV 1 -#define HAVE_FORK 1 -#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ -#define HAVE_FORK1 1 -#endif -#define HAVE_GETEGID 1 -#define HAVE_GETEUID 1 -#define HAVE_GETGID 1 -#define HAVE_GETPPID 1 -#define HAVE_GETUID 1 -#define HAVE_KILL 1 -#define HAVE_OPENDIR 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_WAIT 1 -#define HAVE_TTYNAME 1 -#endif /* _MSC_VER */ -#endif /* ! __WATCOMC__ || __QNX__ */ - - /*[clinic input] # one of the few times we lie about this name! module os @@ -257,75 +107,16 @@ extern int lstat(const char *, struct stat *); #endif /* !_MSC_VER */ -#ifdef HAVE_UTIME_H -#include -#endif /* HAVE_UTIME_H */ - -#ifdef HAVE_SYS_UTIME_H -#include -#define HAVE_UTIME_H /* pretend we do for the rest of this file */ -#endif /* HAVE_SYS_UTIME_H */ - -#ifdef HAVE_SYS_TIMES_H -// #include -#endif /* HAVE_SYS_TIMES_H */ - -#ifdef HAVE_SYS_PARAM_H -#include -#endif /* HAVE_SYS_PARAM_H */ - -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif /* HAVE_SYS_UTSNAME_H */ - #ifdef HAVE_DIRENT_H -#include #define NAMLEN(dirent) strlen((dirent)->d_name) #else #if defined(__WATCOMC__) && !defined(__QNX__) -#include #define NAMLEN(dirent) strlen((dirent)->d_name) #else #define dirent direct #define NAMLEN(dirent) (dirent)->d_namlen #endif -#ifdef HAVE_SYS_NDIR_H -#include #endif -#ifdef HAVE_SYS_DIR_H -#include -#endif -#ifdef HAVE_NDIR_H -#include -#endif -#endif - -#ifdef _MSC_VER -#ifdef HAVE_DIRECT_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_PROCESS_H -#include -#endif -#ifndef IO_REPARSE_TAG_SYMLINK -#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) -#endif -#ifndef IO_REPARSE_TAG_MOUNT_POINT -#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) -#endif -#include "osdefs.h" -#include -#include -#include /* for ShellExecute() */ -#include /* for UNLEN */ -#ifdef SE_CREATE_SYMBOLIC_LINK_NAME /* Available starting with Vista */ -#define HAVE_SYMLINK -static int win32_can_symlink = 0; -#endif -#endif /* _MSC_VER */ #ifndef MAXPATHLEN #if defined(PATH_MAX) && PATH_MAX > 1024 @@ -380,17 +171,6 @@ static int win32_can_symlink = 0; # define STRUCT_STAT struct stat #endif -#if defined(MAJOR_IN_MKDEV) -#include -#else -#if defined(MAJOR_IN_SYSMACROS) -#include -#endif -#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H) -#include -#endif -#endif - #define DWORD_MAX 4294967295U #ifdef MS_WINDOWS @@ -1218,7 +998,6 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) ** environ directly, we must obtain it with _NSGetEnviron(). See also ** man environ(7). */ -#include static char **environ; #elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) ) extern char **environ; @@ -3884,13 +3663,6 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) Py_RETURN_NONE; } - -/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */ -#if defined(HAVE_SYS_RESOURCE_H) -#include -#endif - - #ifdef HAVE_NICE /*[clinic input] os.nice @@ -5792,24 +5564,6 @@ error: #define DEV_PTY_FILE "/dev/ptmx" #endif -#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) -#ifdef HAVE_PTY_H -#include "libc/calls/termios.h" -#else -#ifdef HAVE_LIBUTIL_H -#include -#else -#ifdef HAVE_UTIL_H -#include -#endif /* HAVE_UTIL_H */ -#endif /* HAVE_LIBUTIL_H */ -#endif /* HAVE_PTY_H */ -#ifdef HAVE_STROPTS_H -#include -#endif -#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) */ - - #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) /*[clinic input] os.openpty @@ -6309,7 +6063,6 @@ os_setpgrp_impl(PyObject *module) #ifdef HAVE_GETPPID #ifdef MS_WINDOWS -#include static PyObject* win32_getppid() @@ -6524,9 +6277,6 @@ os_killpg_impl(PyObject *module, pid_t pgid, int signal) #ifdef HAVE_PLOCK -#ifdef HAVE_SYS_LOCK_H -#include -#endif /*[clinic input] os.plock @@ -9238,7 +8988,6 @@ os_WSTOPSIG_impl(PyObject *module, int status) needed definitions in sys/statvfs.h */ #define _SVID3 #endif -#include static PyObject* _pystatvfs_fromstructstatvfs(struct statvfs st) { @@ -9317,7 +9066,6 @@ os_fstatvfs_impl(PyObject *module, int fd) #if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) -#include /*[clinic input] os.statvfs @@ -12247,7 +11995,7 @@ error: } #endif /* HAVE_GETRANDOM_SYSCALL */ -#include "clinic/posixmodule.c.h" +#include "third_party/python/Modules/clinic/posixmodule.inc" /*[clinic input] dump buffer @@ -13233,7 +12981,3 @@ INITFUNC(void) return m; } - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Modules/posixmodule.h b/third_party/python/Modules/posixmodule.h index b6d2b8182..2c5545a59 100644 --- a/third_party/python/Modules/posixmodule.h +++ b/third_party/python/Modules/posixmodule.h @@ -1,14 +1,6 @@ -/* Declarations shared between the different POSIX-related modules */ - #ifndef Py_POSIXMODULE_H #define Py_POSIXMODULE_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif +COSMOPOLITAN_C_START_ #ifndef Py_LIMITED_API #ifndef MS_WINDOWS @@ -27,7 +19,5 @@ PyAPI_FUNC(int) _Py_Gid_Converter(PyObject *, void *); #undef HAVE_LINKAT #undef HAVE_READLINKAT -#ifdef __cplusplus -} -#endif +COSMOPOLITAN_C_END_ #endif /* !Py_POSIXMODULE_H */ diff --git a/third_party/python/Modules/pwdmodule.c b/third_party/python/Modules/pwdmodule.c index 810427a22..0bed920b1 100644 --- a/third_party/python/Modules/pwdmodule.c +++ b/third_party/python/Modules/pwdmodule.c @@ -1,12 +1,12 @@ +#include "third_party/musl/passwd.h" +/* clang-format off */ /* UNIX password file access module */ -#include "Python.h" -#include "posixmodule.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/posixmodule.h" -#include - -#include "clinic/pwdmodule.c.h" +#include "third_party/python/Modules/clinic/pwdmodule.inc" /*[clinic input] module pwd [clinic start generated code]*/ diff --git a/third_party/python/Modules/pyexpat.c b/third_party/python/Modules/pyexpat.c index 2e69f6119..ffc59c8b2 100644 --- a/third_party/python/Modules/pyexpat.c +++ b/third_party/python/Modules/pyexpat.c @@ -1,10 +1,8 @@ -#include "Python.h" -#include - -#include "frameobject.h" -#include "expat.h" - -#include "pyexpat.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Modules/expat/expat.h" +#include "third_party/python/Include/pyexpat.h" /* Do not emit Clinic output to a file as that wreaks havoc with conditionally included methods. */ @@ -68,7 +66,7 @@ typedef struct { PyObject **handlers; } xmlparseobject; -#include "clinic/pyexpat.c.h" +#include "third_party/python/Modules/clinic/pyexpat.inc" #define CHARACTER_DATA_BUFFER_SIZE 8192 diff --git a/third_party/python/Modules/readline.c b/third_party/python/Modules/readline.c index 748337f51..a3cee8bb1 100644 --- a/third_party/python/Modules/readline.c +++ b/third_party/python/Modules/readline.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* This module makes GNU readline available to Python. It has ideas * contributed by Lee Busby, LLNL, and William Magro, Cornell Theory * Center. The completer interface was inspired by Lele Gaifax. More @@ -5,12 +6,7 @@ */ /* Standard definitions */ -#include "Python.h" -#include -#include -#include -#include -#include +#include "third_party/python/Include/Python.h" #if defined(HAVE_SETLOCALE) /* GNU readline() mistakenly sets the LC_CTYPE locale. diff --git a/third_party/python/Modules/resource.c b/third_party/python/Modules/resource.c index b7d792fc3..3898db045 100644 --- a/third_party/python/Modules/resource.c +++ b/third_party/python/Modules/resource.c @@ -1,14 +1,7 @@ +/* clang-format off */ -#include "Python.h" +#include "third_party/python/Include/Python.h" #include "libc/sysv/consts/rlim.h" -#include -#include -#include -#include -/* for sysconf */ -#if defined(HAVE_UNISTD_H) -#include -#endif /* On some systems, these aren't in any header file. On others they are, with inconsistent prototypes. diff --git a/third_party/python/Modules/rotatingtree.c b/third_party/python/Modules/rotatingtree.c index 07e08bc31..679d019f2 100644 --- a/third_party/python/Modules/rotatingtree.c +++ b/third_party/python/Modules/rotatingtree.c @@ -1,3 +1,4 @@ +/* clang-format off */ #include "rotatingtree.h" #define KEY_LOWER_THAN(key1, key2) ((char*)(key1) < (char*)(key2)) diff --git a/third_party/python/Modules/rotatingtree.h b/third_party/python/Modules/rotatingtree.h index 3aa0986b4..05d55f4b6 100644 --- a/third_party/python/Modules/rotatingtree.h +++ b/third_party/python/Modules/rotatingtree.h @@ -1,3 +1,9 @@ +#ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_ROTATINGTREE_H_ +#define COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_ROTATINGTREE_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ + /* "Rotating trees" (Armin Rigo) * * Google "splay trees" for the general idea. @@ -8,8 +14,6 @@ * and over again, and this set of keys evolves slowly over time. */ -#include - #define EMPTY_ROTATING_TREE ((rotating_node_t *)NULL) typedef struct rotating_node_s rotating_node_t; @@ -25,3 +29,7 @@ void RotatingTree_Add(rotating_node_t **root, rotating_node_t *node); rotating_node_t* RotatingTree_Get(rotating_node_t **root, void *key); int RotatingTree_Enum(rotating_node_t *root, rotating_tree_enum_fn enumfn, void *arg); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_ROTATINGTREE_H_ */ diff --git a/third_party/python/Modules/selectmodule.c b/third_party/python/Modules/selectmodule.c index cf7ce7785..5ef3bba49 100644 --- a/third_party/python/Modules/selectmodule.c +++ b/third_party/python/Modules/selectmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* select - Module containing unix select(2) call. Under Unix, the file descriptors are small integers. Under Win32, select only exists for sockets, and sockets may @@ -8,56 +9,13 @@ #define _GNU_SOURCE #endif -#include "Python.h" -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "libc/sock/sock.h" +#include "libc/sysv/consts/poll.h" #include "libc/sock/select.h" -#ifdef HAVE_SYS_DEVPOLL_H -#include -#include -#include -#include -#include -#endif - -#ifdef __APPLE__ - /* Perform runtime testing for a broken poll on OSX to make it easier - * to use the same binary on multiple releases of the OS. - */ -#undef HAVE_BROKEN_POLL -#endif - -/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined. - 64 is too small (too many people have bumped into that limit). - Here we boost it. - Users who want even more than the boosted limit should #define - FD_SETSIZE higher before this; e.g., via compiler /D switch. -*/ -#if defined(MS_WINDOWS) && !defined(FD_SETSIZE) -#define FD_SETSIZE 512 -#endif - -#if defined(HAVE_POLL_H) -#include -#elif defined(HAVE_SYS_POLL_H) -#include -#endif - -#ifdef __sgi -/* This is missing from unistd.h */ -extern void bzero(void *, int); -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef MS_WINDOWS -# define WIN32_LEAN_AND_MEAN -# include -#else -# define SOCKET int -#endif +#define SOCKET int /* list of Python objects and their file descriptor */ typedef struct { diff --git a/third_party/python/Modules/sha1module.c b/third_party/python/Modules/sha1module.c index f58d7e4c7..e0c563bf6 100644 --- a/third_party/python/Modules/sha1module.c +++ b/third_party/python/Modules/sha1module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* SHA1 module */ /* This module provides an interface to the SHA1 algorithm */ @@ -16,9 +17,9 @@ /* SHA1 objects */ -#include "Python.h" -#include "hashlib.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] module _sha1 @@ -54,7 +55,7 @@ typedef struct { struct sha1_state hash_state; } SHA1object; -#include "clinic/sha1module.c.h" +#include "third_party/python/Modules/clinic/sha1module.inc" /* ------------------------------------------------------------------------ * diff --git a/third_party/python/Modules/sha256module.c b/third_party/python/Modules/sha256module.c index ecd98e683..5fac84209 100644 --- a/third_party/python/Modules/sha256module.c +++ b/third_party/python/Modules/sha256module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* SHA256 module */ /* This module provides an interface to NIST's SHA-256 and SHA-224 Algorithms */ @@ -16,10 +17,10 @@ /* SHA objects */ -#include "Python.h" -#include "structmember.h" -#include "hashlib.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] module _sha256 @@ -53,7 +54,7 @@ typedef struct { int digestsize; } SHAobject; -#include "clinic/sha256module.c.h" +#include "third_party/python/Modules/clinic/sha256module.inc" /* When run on a little-endian CPU we need to perform byte reversal on an array of longwords. */ diff --git a/third_party/python/Modules/sha512module.c b/third_party/python/Modules/sha512module.c index 891493c2c..870671ba3 100644 --- a/third_party/python/Modules/sha512module.c +++ b/third_party/python/Modules/sha512module.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* SHA512 module */ /* This module provides an interface to NIST's SHA-512 and SHA-384 Algorithms */ @@ -16,10 +17,10 @@ /* SHA objects */ -#include "Python.h" -#include "structmember.h" -#include "hashlib.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/hashlib.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] module _sha512 @@ -54,7 +55,7 @@ typedef struct { int digestsize; } SHAobject; -#include "clinic/sha512module.c.h" +#include "third_party/python/Modules/clinic/sha512module.inc" /* When run on a little-endian CPU we need to perform byte reversal on an array of longwords. */ diff --git a/third_party/python/Modules/signalmodule.c b/third_party/python/Modules/signalmodule.c index a93dc64cc..f1bb2092e 100644 --- a/third_party/python/Modules/signalmodule.c +++ b/third_party/python/Modules/signalmodule.c @@ -1,58 +1,23 @@ +/* clang-format off */ /* Signal module -- many thanks to Lance Ellinghaus */ /* XXX Signals should be recorded per thread, now we have thread state. */ -#include "Python.h" -#ifndef MS_WINDOWS -#include "posixmodule.h" -#endif -#ifdef MS_WINDOWS -#include "socketmodule.h" /* needed for SOCKET_T */ -#endif - -#ifdef MS_WINDOWS -#include -#ifdef HAVE_PROCESS_H -#include -#endif -#endif - -#ifdef HAVE_SIGNAL_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_SYS_TIME_H -#include -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/posixmodule.h" +#include "libc/dce.h" +#include "libc/calls/calls.h" #if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) # define PYPTHREAD_SIGMASK #endif -#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H) -# include -#endif - -#ifndef SIG_ERR -#define SIG_ERR ((PyOS_sighandler_t)(-1)) -#endif - #ifndef NSIG -# if defined(_NSIG) -# define NSIG _NSIG /* For BSD/SysV */ -# elif defined(_SIGMAX) -# define NSIG (_SIGMAX + 1) /* For QNX */ -# elif defined(SIGMAX) -# define NSIG (SIGMAX + 1) /* For djgpp */ -# else -# define NSIG 64 /* Use a reasonable default value */ -# endif +#define NSIG (IsNetbsd() ? 64 : 32) #endif -#include "clinic/signalmodule.c.h" +#include "third_party/python/Modules/clinic/signalmodule.inc" /*[clinic input] module signal @@ -86,8 +51,7 @@ module signal */ #ifdef WITH_THREAD -#include /* For pid_t */ -#include "pythread.h" +#include "third_party/python/Include/pythread.h" static long main_thread; static pid_t main_pid; #endif diff --git a/third_party/python/Modules/socketmodule.c b/third_party/python/Modules/socketmodule.c index beb5da6ee..c6fa8a3cb 100644 --- a/third_party/python/Modules/socketmodule.c +++ b/third_party/python/Modules/socketmodule.c @@ -1,3 +1,30 @@ +#include "libc/calls/calls.h" +#include "libc/calls/weirdtypes.h" +#include "libc/dce.h" +#include "libc/dns/dns.h" +#include "libc/dns/ent.h" +#include "libc/runtime/runtime.h" +#include "libc/sock/sock.h" +#include "libc/sysv/consts/af.h" +#include "libc/sysv/consts/f.h" +#include "libc/sysv/consts/fileno.h" +#include "libc/sysv/consts/inaddr.h" +#include "libc/sysv/consts/ip.h" +#include "libc/sysv/consts/ipport.h" +#include "libc/sysv/consts/ipproto.h" +#include "libc/sysv/consts/msg.h" +#include "libc/sysv/consts/o.h" +#include "libc/sysv/consts/pf.h" +#include "libc/sysv/consts/poll.h" +#include "libc/sysv/consts/shut.h" +#include "libc/sysv/consts/so.h" +#include "libc/sysv/consts/sock.h" +#include "libc/sysv/consts/sol.h" +#include "libc/sysv/consts/tcp.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Modules/socketmodule.h" +/* clang-format off */ /* Socket module */ /* @@ -7,8 +34,7 @@ This module provides an interface to Berkeley socket IPC. Limitations: - Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a - portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported - under Linux. + portable manner, though AF_PACKET, and AF_TIPC are supported under Linux. - No read/write operations (use sendall/recv or makefile instead). - Additional restrictions apply on some non-Unix platforms (compensated for by socket.py). @@ -83,23 +109,6 @@ Local naming conventions: */ -#ifdef __APPLE__ -#include -/* for getaddrinfo thread safety test on old versions of OS X */ -#ifndef MAC_OS_X_VERSION_10_5 -#define MAC_OS_X_VERSION_10_5 1050 -#endif - /* - * inet_aton is not available on OSX 10.3, yet we want to use a binary - * that was build on 10.4 or later to work on that release, weak linking - * comes to the rescue. - */ -# pragma weak inet_aton -#endif - -#include "Python.h" -#include "structmember.h" - /* Socket object documentation */ PyDoc_STRVAR(sock_doc, "socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\ @@ -153,24 +162,10 @@ if_indextoname(index) -- return the corresponding interface name\n\ On the other hand, not all Linux versions agree, so there the settings computed by the configure script are needed! */ -#ifndef __linux__ -# undef HAVE_GETHOSTBYNAME_R_3_ARG -# undef HAVE_GETHOSTBYNAME_R_5_ARG -# undef HAVE_GETHOSTBYNAME_R_6_ARG -#endif - -#if defined(__OpenBSD__) -# include -#endif - #if !defined(WITH_THREAD) # undef HAVE_GETHOSTBYNAME_R #endif -#if defined(__ANDROID__) && __ANDROID_API__ < 23 -# undef HAVE_GETHOSTBYNAME_R -#endif - #ifdef HAVE_GETHOSTBYNAME_R # if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT) # define HAVE_GETHOSTBYNAME_R_3_ARG @@ -190,10 +185,6 @@ if_indextoname(index) -- return the corresponding interface name\n\ # define USE_GETHOSTBYNAME_LOCK #endif -/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */ -#ifdef HAVE_SYS_PARAM_H -#include -#endif /* On systems on which getaddrinfo() is believed to not be thread-safe, (this includes the getaddrinfo emulation) protect access with a lock. @@ -228,196 +219,15 @@ http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82& #define RELEASE_GETADDRINFO_LOCK #endif -#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) -# include "pythread.h" -#endif - -#if defined(PYCC_VACPP) -# include -# include -# include -# include -# include -#endif - -#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__) -# include -#endif - - -#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI -/* make sure that the reentrant (gethostbyaddr_r etc) - functions are declared correctly if compiling with - MIPSPro 7.x in ANSI C mode (default) */ - -/* XXX Using _SGIAPI is the wrong thing, - but I don't know what the right thing is. */ -#undef _SGIAPI /* to avoid warning */ -#define _SGIAPI 1 - -#undef _XOPEN_SOURCE -#include -#include -#include -#ifdef _SS_ALIGNSIZE -#define HAVE_GETADDRINFO 1 -#define HAVE_GETNAMEINFO 1 -#endif - -#define HAVE_INET_PTON -#include "libc/sock/sock.h" -#include "libc/dns/dns.h" -#endif - -/* Irix 6.5 fails to define this variable at all. This is needed - for both GCC and SGI's compiler. I'd say that the SGI headers - are just busted. Same thing for Solaris. */ -#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN) -#define INET_ADDRSTRLEN 16 -#endif - -/* Generic includes */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -#ifdef HAVE_NET_IF_H -#include -#endif - /* Generic socket object definitions and includes */ #define PySocket_BUILDING_SOCKET -#include "socketmodule.h" /* Addressing includes */ -#ifndef MS_WINDOWS - -/* Non-MS WINDOWS includes */ -#include "libc/sock/sock.h" -#include "libc/sysv/consts/af.h" -#include "libc/sysv/consts/sock.h" -#include "libc/sysv/consts/inaddr.h" -#include "libc/sysv/consts/sol.h" -#include "libc/sysv/consts/so.h" -#include "libc/dns/dns.h" -#include "libc/dns/ent.h" -# include - -#ifdef AF_NETLINK -#undef AF_NETLINK -#endif - #ifdef AF_CAN #undef AF_CAN #endif -/* Headers needed for inet_ntoa() and inet_addr() */ -# include - -# include - -#else - -/* MS_WINDOWS includes */ -# ifdef HAVE_FCNTL_H -# include -# endif - -/* Provides the IsWindows7SP1OrGreater() function */ -#include - -/* remove some flags on older version Windows during run-time. - https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */ -typedef struct { - DWORD build_number; /* available starting with this Win10 BuildNumber */ - const char flag_name[20]; -} FlagRuntimeInfo; - -/* IMPORTANT: make sure the list ordered by descending build_number */ -static FlagRuntimeInfo win_runtime_flags[] = { - /* available starting with Windows 10 1703 */ - {15063, "TCP_KEEPCNT"}, - /* available starting with Windows 10 1607 */ - {14393, "TCP_FASTOPEN"} -}; - -static void -remove_unusable_flags(PyObject *m) -{ - PyObject *dict; - OSVERSIONINFOEX info; - DWORDLONG dwlConditionMask; - - dict = PyModule_GetDict(m); - if (dict == NULL) { - return; - } - - /* set to Windows 10, except BuildNumber. */ - memset(&info, 0, sizeof(info)); - info.dwOSVersionInfoSize = sizeof(info); - info.dwMajorVersion = 10; - info.dwMinorVersion = 0; - - /* set Condition Mask */ - dwlConditionMask = 0; - VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); - - for (int i=0; i - -#ifndef O_NONBLOCK -# define O_NONBLOCK O_NDELAY -#endif - -/* include Python's addrinfo.h unless it causes trouble */ -#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE) - /* Do not include addinfo.h on some newer IRIX versions. - * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21, - * for example, but not by 6.5.10. - */ -#elif defined(_MSC_VER) && _MSC_VER>1201 - /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and - * EAI_* constants are defined in (the already included) ws2tcpip.h. - */ -#else -# include "addrinfo.h" -#endif - #ifndef HAVE_INET_PTON #if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN) int inet_pton(int af, const char *src, void *dst); @@ -552,12 +362,6 @@ static PyObject *socket_timeout; there has to be a circular reference. */ static PyTypeObject sock_type; -#if defined(HAVE_POLL_H) -#include -#elif defined(HAVE_SYS_POLL_H) -#include -#endif - /* Largest value to try to store in a socklen_t (used when handling ancillary data). POSIX requires socklen_t to hold at least (2**31)-1 and recommends against storing larger values, but @@ -1313,14 +1117,6 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) } #endif /* AF_UNIX */ -#if defined(AF_NETLINK) - case AF_NETLINK: - { - struct sockaddr_nl *a = (struct sockaddr_nl *) addr; - return Py_BuildValue("II", a->nl_pid, a->nl_groups); - } -#endif /* AF_NETLINK */ - #ifdef ENABLE_IPV6 case AF_INET6: { @@ -1647,37 +1443,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } #endif /* AF_UNIX */ -#if defined(AF_NETLINK) - else if(s->sock_family == AF_NETLINK) - { - struct sockaddr_nl* addr; - int pid, groups; - addr = (struct sockaddr_nl *)addr_ret; - if (!PyTuple_Check(args)) { - PyErr_Format( - PyExc_TypeError, - "getsockaddrarg: " - "AF_NETLINK address must be tuple, not %.500s", - Py_TYPE(args)->tp_name); - return 0; - } - if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups)) - return 0; - addr->nl_family = AF_NETLINK; - addr->nl_pid = pid; - addr->nl_groups = groups; - *len_ret = sizeof(*addr); - return 1; - } -#endif /* AF_NETLINK */ - - else if( -#ifdef AF_RDS - s->sock_family == AF_RDS || - /* RDS sockets use sockaddr_in: fall-through */ -#endif /* AF_RDS */ - - s->sock_family == AF_INET) + else if( s->sock_family == AF_INET) { struct sockaddr_in* addr; struct maybe_idna host = {NULL, NULL}; @@ -2138,20 +1904,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) } #endif /* AF_UNIX */ -#if defined(AF_NETLINK) - else if(s->sock_family == AF_NETLINK) - { - *len_ret = sizeof (struct sockaddr_nl); - return 1; - } -#endif /* AF_NETLINK */ - else if( -#ifdef AF_RDS - s->sock_family == AF_RDS || - /* RDS sockets use sockaddr_in: fall-through */ -#endif /* AF_RDS */ - s->sock_family == AF_INET) { *len_ret = sizeof (struct sockaddr_in); @@ -6672,140 +6425,41 @@ PyInit__socket(void) return NULL; /* Address families (we only support AF_INET and AF_UNIX) */ -#ifdef AF_UNSPEC PyModule_AddIntMacro(m, AF_UNSPEC); -#endif PyModule_AddIntMacro(m, AF_INET); -#if defined(AF_UNIX) PyModule_AddIntMacro(m, AF_UNIX); -#endif /* AF_UNIX */ -#ifdef AF_AX25 - /* Amateur Radio AX.25 */ - PyModule_AddIntMacro(m, AF_AX25); -#endif -#ifdef AF_IPX - PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */ -#endif -#ifdef AF_APPLETALK - /* Appletalk DDP */ - PyModule_AddIntMacro(m, AF_APPLETALK); -#endif -#ifdef AF_NETROM - /* Amateur radio NetROM */ - PyModule_AddIntMacro(m, AF_NETROM); -#endif -#ifdef AF_BRIDGE - /* Multiprotocol bridge */ - PyModule_AddIntMacro(m, AF_BRIDGE); -#endif -#ifdef AF_ATMPVC - /* ATM PVCs */ - PyModule_AddIntMacro(m, AF_ATMPVC); -#endif + PyModule_AddIntMacro(m, AF_NETROM); /* Amateur radio NetROM */ + PyModule_AddIntMacro(m, AF_IPX); /* Lolvell IPX */ + PyModule_AddIntMacro(m, AF_APPLETALK); /* Appletalk DDP */ + if (AF_AX25) PyModule_AddIntMacro(m, AF_AX25); /* Amateur Radio AX.25 */ + if (AF_BRIDGE) PyModule_AddIntMacro(m, AF_BRIDGE); /* Multiprotocol bridge */ + if (AF_ATMPVC) PyModule_AddIntMacro(m, AF_ATMPVC); /* ATM PVCs */ + if (AF_X25) PyModule_AddIntMacro(m, AF_X25); /* Reserved for X.25 project */ + if (AF_INET6) PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */ + if (AF_ROSE) PyModule_AddIntMacro(m, AF_ROSE); /* Amateur Radio X.25 PLP */ + if (AF_NETBEUI) PyModule_AddIntMacro(m, AF_NETBEUI); /* Reserved for 802.2LLC project */ + if (AF_SECURITY) PyModule_AddIntMacro(m, AF_SECURITY); /* Security callback pseudo AF */ + if (AF_KEY) PyModule_AddIntMacro(m, AF_KEY); /* PF_KEY key management API */ #ifdef AF_AAL5 - /* Reserved for Werner's ATM */ - PyModule_AddIntMacro(m, AF_AAL5); + PyModule_AddIntMacro(m, AF_AAL5); /* Reserved for Werner's ATM */ #endif #ifdef HAVE_SOCKADDR_ALG - PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */ -#endif -#ifdef AF_X25 - /* Reserved for X.25 project */ - PyModule_AddIntMacro(m, AF_X25); -#endif -#ifdef AF_INET6 - PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */ -#endif -#ifdef AF_ROSE - /* Amateur Radio X.25 PLP */ - PyModule_AddIntMacro(m, AF_ROSE); + if (AF_ALG) PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */ #endif #ifdef AF_DECnet /* Reserved for DECnet project */ PyModule_AddIntMacro(m, AF_DECnet); #endif -#ifdef AF_NETBEUI - /* Reserved for 802.2LLC project */ - PyModule_AddIntMacro(m, AF_NETBEUI); -#endif -#ifdef AF_SECURITY - /* Security callback pseudo AF */ - PyModule_AddIntMacro(m, AF_SECURITY); -#endif -#ifdef AF_KEY - /* PF_KEY key management API */ - PyModule_AddIntMacro(m, AF_KEY); -#endif -#ifdef AF_NETLINK - /* */ - PyModule_AddIntMacro(m, AF_NETLINK); - PyModule_AddIntMacro(m, NETLINK_ROUTE); -#ifdef NETLINK_SKIP - PyModule_AddIntMacro(m, NETLINK_SKIP); -#endif -#ifdef NETLINK_W1 - PyModule_AddIntMacro(m, NETLINK_W1); -#endif - PyModule_AddIntMacro(m, NETLINK_USERSOCK); - PyModule_AddIntMacro(m, NETLINK_FIREWALL); -#ifdef NETLINK_TCPDIAG - PyModule_AddIntMacro(m, NETLINK_TCPDIAG); -#endif -#ifdef NETLINK_NFLOG - PyModule_AddIntMacro(m, NETLINK_NFLOG); -#endif -#ifdef NETLINK_XFRM - PyModule_AddIntMacro(m, NETLINK_XFRM); -#endif -#ifdef NETLINK_ARPD - PyModule_AddIntMacro(m, NETLINK_ARPD); -#endif -#ifdef NETLINK_ROUTE6 - PyModule_AddIntMacro(m, NETLINK_ROUTE6); -#endif - PyModule_AddIntMacro(m, NETLINK_IP6_FW); -#ifdef NETLINK_DNRTMSG - PyModule_AddIntMacro(m, NETLINK_DNRTMSG); -#endif -#ifdef NETLINK_TAPBASE - PyModule_AddIntMacro(m, NETLINK_TAPBASE); -#endif -#ifdef NETLINK_CRYPTO - PyModule_AddIntMacro(m, NETLINK_CRYPTO); -#endif -#endif /* AF_NETLINK */ -#ifdef AF_ROUTE - /* Alias to emulate 4.4BSD */ - PyModule_AddIntMacro(m, AF_ROUTE); -#endif -#ifdef AF_LINK - PyModule_AddIntMacro(m, AF_LINK); -#endif -#ifdef AF_ASH - /* Ash */ - PyModule_AddIntMacro(m, AF_ASH); -#endif -#ifdef AF_ECONET - /* Acorn Econet */ - PyModule_AddIntMacro(m, AF_ECONET); -#endif -#ifdef AF_ATMSVC - /* ATM SVCs */ - PyModule_AddIntMacro(m, AF_ATMSVC); -#endif -#ifdef AF_SNA - /* Linux SNA Project (nutters!) */ - PyModule_AddIntMacro(m, AF_SNA); -#endif -#ifdef AF_IRDA - /* IRDA sockets */ - PyModule_AddIntMacro(m, AF_IRDA); -#endif -#ifdef AF_PPPOX - /* PPPoX sockets */ - PyModule_AddIntMacro(m, AF_PPPOX); -#endif -#ifdef AF_WANPIPE + + if (AF_ROUTE) PyModule_AddIntMacro(m, AF_ROUTE); /* Alias to emulate 4.4BSD */ + if (AF_LINK) PyModule_AddIntMacro(m, AF_LINK); + if (AF_ASH) PyModule_AddIntMacro(m, AF_ASH); /* Ash */ + if (AF_ECONET) PyModule_AddIntMacro(m, AF_ECONET); /* Acorn Econet */ + if (AF_ATMSVC) PyModule_AddIntMacro(m, AF_ATMSVC); /* ATM SVCs */ + if (AF_SNA) PyModule_AddIntMacro(m, AF_SNA); /* Linux SNA Project (nutters!) */ + if (AF_IRDA) PyModule_AddIntMacro(m, AF_IRDA); /* IRDA sockets */ + if (AF_PPPOX) PyModule_AddIntMacro(m, AF_PPPOX); /* PPPoX sockets */ +#ifdef F_WANPIPE /* Wanpipe API Sockets */ PyModule_AddIntMacro(m, AF_WANPIPE); #endif @@ -6834,22 +6488,12 @@ PyInit__socket(void) PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); #endif -#ifdef AF_CAN - /* Controller Area Network */ - PyModule_AddIntMacro(m, AF_CAN); -#endif -#ifdef PF_CAN - /* Controller Area Network */ - PyModule_AddIntMacro(m, PF_CAN); -#endif - -/* Reliable Datagram Sockets */ -#ifdef AF_RDS - PyModule_AddIntMacro(m, AF_RDS); -#endif -#ifdef PF_RDS - PyModule_AddIntMacro(m, PF_RDS); -#endif + if (AF_CAN) PyModule_AddIntMacro(m, AF_CAN); /* Controller Area Network */ + if (PF_CAN) PyModule_AddIntMacro(m, PF_CAN); + if (AF_RDS) PyModule_AddIntMacro(m, AF_RDS); /* Reliable Datagram Sockets */ + if (PF_RDS) PyModule_AddIntMacro(m, PF_RDS); + if (AF_PACKET) PyModule_AddIntMacro(m, AF_PACKET); + if (PF_PACKET) PyModule_AddIntMacro(m, PF_PACKET); /* Kernel event messages */ #ifdef PF_SYSTEM @@ -6859,12 +6503,6 @@ PyInit__socket(void) PyModule_AddIntMacro(m, AF_SYSTEM); #endif -#ifdef AF_PACKET - PyModule_AddIntMacro(m, AF_PACKET); -#endif -#ifdef PF_PACKET - PyModule_AddIntMacro(m, PF_PACKET); -#endif #ifdef PACKET_HOST PyModule_AddIntMacro(m, PACKET_HOST); #endif @@ -6889,28 +6527,23 @@ PyInit__socket(void) #ifdef HAVE_LINUX_TIPC_H PyModule_AddIntMacro(m, AF_TIPC); - /* for addresses */ PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ); PyModule_AddIntMacro(m, TIPC_ADDR_NAME); PyModule_AddIntMacro(m, TIPC_ADDR_ID); - PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE); PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE); PyModule_AddIntMacro(m, TIPC_NODE_SCOPE); - /* for setsockopt() */ PyModule_AddIntMacro(m, SOL_TIPC); PyModule_AddIntMacro(m, TIPC_IMPORTANCE); PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE); PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE); PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT); - PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE); PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE); PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE); PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE); - /* for subscriptions */ PyModule_AddIntMacro(m, TIPC_SUB_PORTS); PyModule_AddIntMacro(m, TIPC_SUB_SERVICE); @@ -6934,7 +6567,6 @@ PyInit__socket(void) PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN); PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE); PyModule_AddIntMacro(m, ALG_SET_PUBKEY); - /* Operations */ PyModule_AddIntMacro(m, ALG_OP_DECRYPT); PyModule_AddIntMacro(m, ALG_OP_ENCRYPT); @@ -6945,230 +6577,106 @@ PyInit__socket(void) /* Socket types */ PyModule_AddIntMacro(m, SOCK_STREAM); PyModule_AddIntMacro(m, SOCK_DGRAM); -/* We have incomplete socket support. */ -#ifdef SOCK_RAW - /* SOCK_RAW is marked as optional in the POSIX specification */ PyModule_AddIntMacro(m, SOCK_RAW); -#endif PyModule_AddIntMacro(m, SOCK_SEQPACKET); -#if defined(SOCK_RDM) PyModule_AddIntMacro(m, SOCK_RDM); -#endif -#ifdef SOCK_CLOEXEC PyModule_AddIntMacro(m, SOCK_CLOEXEC); -#endif -#ifdef SOCK_NONBLOCK PyModule_AddIntMacro(m, SOCK_NONBLOCK); -#endif -#ifdef SO_DEBUG PyModule_AddIntMacro(m, SO_DEBUG); -#endif -#ifdef SO_ACCEPTCONN PyModule_AddIntMacro(m, SO_ACCEPTCONN); -#endif -#ifdef SO_REUSEADDR - PyModule_AddIntMacro(m, SO_REUSEADDR); -#endif -#ifdef SO_EXCLUSIVEADDRUSE - PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE); -#endif - -#ifdef SO_KEEPALIVE + if (SO_REUSEADDR) PyModule_AddIntMacro(m, SO_REUSEADDR); + if (SO_EXCLUSIVEADDRUSE) PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE); PyModule_AddIntMacro(m, SO_KEEPALIVE); -#endif -#ifdef SO_DONTROUTE PyModule_AddIntMacro(m, SO_DONTROUTE); -#endif -#ifdef SO_BROADCAST PyModule_AddIntMacro(m, SO_BROADCAST); -#endif -#ifdef SO_USELOOPBACK - PyModule_AddIntMacro(m, SO_USELOOPBACK); -#endif -#ifdef SO_LINGER + if (SO_USELOOPBACK) PyModule_AddIntMacro(m, SO_USELOOPBACK); PyModule_AddIntMacro(m, SO_LINGER); -#endif -#ifdef SO_OOBINLINE PyModule_AddIntMacro(m, SO_OOBINLINE); -#endif -#ifndef __GNU__ -#ifdef SO_REUSEPORT PyModule_AddIntMacro(m, SO_REUSEPORT); -#endif -#endif -#ifdef SO_SNDBUF PyModule_AddIntMacro(m, SO_SNDBUF); -#endif -#ifdef SO_RCVBUF PyModule_AddIntMacro(m, SO_RCVBUF); -#endif -#ifdef SO_SNDLOWAT PyModule_AddIntMacro(m, SO_SNDLOWAT); -#endif -#ifdef SO_RCVLOWAT PyModule_AddIntMacro(m, SO_RCVLOWAT); -#endif -#ifdef SO_SNDTIMEO PyModule_AddIntMacro(m, SO_SNDTIMEO); -#endif -#ifdef SO_RCVTIMEO PyModule_AddIntMacro(m, SO_RCVTIMEO); -#endif -#ifdef SO_ERROR PyModule_AddIntMacro(m, SO_ERROR); -#endif -#ifdef SO_TYPE PyModule_AddIntMacro(m, SO_TYPE); -#endif -#ifdef SO_SETFIB - PyModule_AddIntMacro(m, SO_SETFIB); -#endif -#ifdef SO_PASSCRED - PyModule_AddIntMacro(m, SO_PASSCRED); -#endif -#ifdef SO_PEERCRED - PyModule_AddIntMacro(m, SO_PEERCRED); -#endif -#ifdef LOCAL_PEERCRED - PyModule_AddIntMacro(m, LOCAL_PEERCRED); -#endif -#ifdef SO_PASSSEC - PyModule_AddIntMacro(m, SO_PASSSEC); -#endif -#ifdef SO_PEERSEC - PyModule_AddIntMacro(m, SO_PEERSEC); -#endif -#ifdef SO_BINDTODEVICE - PyModule_AddIntMacro(m, SO_BINDTODEVICE); -#endif -#ifdef SO_PRIORITY - PyModule_AddIntMacro(m, SO_PRIORITY); -#endif -#ifdef SO_MARK - PyModule_AddIntMacro(m, SO_MARK); -#endif -#ifdef SO_DOMAIN - PyModule_AddIntMacro(m, SO_DOMAIN); -#endif -#ifdef SO_PROTOCOL - PyModule_AddIntMacro(m, SO_PROTOCOL); -#endif + if (SO_SETFIB) PyModule_AddIntMacro(m, SO_SETFIB); + if (SO_PASSCRED) PyModule_AddIntMacro(m, SO_PASSCRED); + if (SO_PEERCRED) PyModule_AddIntMacro(m, SO_PEERCRED); + if (LOCAL_PEERCRED) PyModule_AddIntMacro(m, LOCAL_PEERCRED); + if (SO_PASSSEC) PyModule_AddIntMacro(m, SO_PASSSEC); + if (SO_PEERSEC) PyModule_AddIntMacro(m, SO_PEERSEC); + if (SO_BINDTODEVICE) PyModule_AddIntMacro(m, SO_BINDTODEVICE); + if (SO_PRIORITY) PyModule_AddIntMacro(m, SO_PRIORITY); + if (SO_MARK) PyModule_AddIntMacro(m, SO_MARK); + if (SO_DOMAIN) PyModule_AddIntMacro(m, SO_DOMAIN); + if (SO_PROTOCOL) PyModule_AddIntMacro(m, SO_PROTOCOL); /* Maximum number of connections for "listen" */ -#ifdef SOMAXCONN - PyModule_AddIntMacro(m, SOMAXCONN); -#else - PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */ -#endif + PyModule_AddIntConstant(m, "SOMAXCONN", 0x80); /* Ancillary message types */ -#ifdef SCM_RIGHTS +#ifdef SCM_RIGHTS PyModule_AddIntMacro(m, SCM_RIGHTS); #endif -#ifdef SCM_CREDENTIALS +#ifdef SCM_CREDENTIALS PyModule_AddIntMacro(m, SCM_CREDENTIALS); #endif -#ifdef SCM_CREDS +#ifdef SCM_CREDS PyModule_AddIntMacro(m, SCM_CREDS); #endif /* Flags for send, recv */ -#ifdef MSG_OOB PyModule_AddIntMacro(m, MSG_OOB); -#endif -#ifdef MSG_PEEK PyModule_AddIntMacro(m, MSG_PEEK); -#endif -#ifdef MSG_DONTROUTE PyModule_AddIntMacro(m, MSG_DONTROUTE); -#endif -#ifdef MSG_DONTWAIT - PyModule_AddIntMacro(m, MSG_DONTWAIT); -#endif -#ifdef MSG_EOR - PyModule_AddIntMacro(m, MSG_EOR); -#endif -#ifdef MSG_TRUNC PyModule_AddIntMacro(m, MSG_TRUNC); -#endif -#ifdef MSG_CTRUNC PyModule_AddIntMacro(m, MSG_CTRUNC); -#endif -#ifdef MSG_WAITALL PyModule_AddIntMacro(m, MSG_WAITALL); + if (MSG_DONTWAIT) PyModule_AddIntMacro(m, MSG_DONTWAIT); + if (MSG_EOR) PyModule_AddIntMacro(m, MSG_EOR); + if (MSG_NOSIGNAL) PyModule_AddIntMacro(m, MSG_NOSIGNAL); + if (MSG_BCAST) PyModule_AddIntMacro(m, MSG_BCAST); + if (MSG_MCAST) PyModule_AddIntMacro(m, MSG_MCAST); + if (MSG_CMSG_CLOEXEC) PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC); + if (MSG_ERRQUEUE) PyModule_AddIntMacro(m, MSG_ERRQUEUE); + if (MSG_CONFIRM) PyModule_AddIntMacro(m, MSG_CONFIRM); + if (MSG_MORE) PyModule_AddIntMacro(m, MSG_MORE); + if (MSG_NOTIFICATION) PyModule_AddIntMacro(m, MSG_NOTIFICATION); + if (MSG_EOF) PyModule_AddIntMacro(m, MSG_EOF); + if (MSG_FASTOPEN) PyModule_AddIntMacro(m, MSG_FASTOPEN); +#ifdef MSG_BTAG + if (MSG_BTAG) PyModule_AddIntMacro(m, MSG_BTAG); #endif -#ifdef MSG_BTAG - PyModule_AddIntMacro(m, MSG_BTAG); -#endif -#ifdef MSG_ETAG - PyModule_AddIntMacro(m, MSG_ETAG); -#endif -#ifdef MSG_NOSIGNAL - PyModule_AddIntMacro(m, MSG_NOSIGNAL); -#endif -#ifdef MSG_NOTIFICATION - PyModule_AddIntMacro(m, MSG_NOTIFICATION); -#endif -#ifdef MSG_CMSG_CLOEXEC - PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC); -#endif -#ifdef MSG_ERRQUEUE - PyModule_AddIntMacro(m, MSG_ERRQUEUE); -#endif -#ifdef MSG_CONFIRM - PyModule_AddIntMacro(m, MSG_CONFIRM); -#endif -#ifdef MSG_MORE - PyModule_AddIntMacro(m, MSG_MORE); -#endif -#ifdef MSG_EOF - PyModule_AddIntMacro(m, MSG_EOF); -#endif -#ifdef MSG_BCAST - PyModule_AddIntMacro(m, MSG_BCAST); -#endif -#ifdef MSG_MCAST - PyModule_AddIntMacro(m, MSG_MCAST); -#endif -#ifdef MSG_FASTOPEN - PyModule_AddIntMacro(m, MSG_FASTOPEN); +#ifdef MSG_ETAG + if (MSG_ETAG) PyModule_AddIntMacro(m, MSG_ETAG); #endif /* Protocol level and numbers, usable for [gs]etsockopt */ -#ifdef SOL_SOCKET PyModule_AddIntMacro(m, SOL_SOCKET); -#endif -#ifdef SOL_IP PyModule_AddIntMacro(m, SOL_IP); -#else - PyModule_AddIntConstant(m, "SOL_IP", 0); + PyModule_AddIntMacro(m, SOL_TCP); + PyModule_AddIntMacro(m, SOL_UDP); +#ifdef SOL_RDS + if (SOL_RDS) PyModule_AddIntMacro(m, SOL_RDS); #endif -#ifdef SOL_IPX +#ifdef SOL_IPX PyModule_AddIntMacro(m, SOL_IPX); #endif -#ifdef SOL_AX25 +#ifdef SOL_AX25 PyModule_AddIntMacro(m, SOL_AX25); #endif -#ifdef SOL_ATALK +#ifdef SOL_ATALK PyModule_AddIntMacro(m, SOL_ATALK); #endif -#ifdef SOL_NETROM +#ifdef SOL_NETROM PyModule_AddIntMacro(m, SOL_NETROM); #endif -#ifdef SOL_ROSE +#ifdef SOL_ROSE PyModule_AddIntMacro(m, SOL_ROSE); #endif -#ifdef SOL_TCP - PyModule_AddIntMacro(m, SOL_TCP); -#else - PyModule_AddIntConstant(m, "SOL_TCP", 6); -#endif -#ifdef SOL_UDP - PyModule_AddIntMacro(m, SOL_UDP); -#else - PyModule_AddIntConstant(m, "SOL_UDP", 17); -#endif #ifdef SOL_CAN_BASE PyModule_AddIntMacro(m, SOL_CAN_BASE); #endif @@ -7176,11 +6684,11 @@ PyInit__socket(void) PyModule_AddIntMacro(m, SOL_CAN_RAW); PyModule_AddIntMacro(m, CAN_RAW); #endif + #ifdef HAVE_LINUX_CAN_H PyModule_AddIntMacro(m, CAN_EFF_FLAG); PyModule_AddIntMacro(m, CAN_RTR_FLAG); PyModule_AddIntMacro(m, CAN_ERR_FLAG); - PyModule_AddIntMacro(m, CAN_SFF_MASK); PyModule_AddIntMacro(m, CAN_EFF_MASK); PyModule_AddIntMacro(m, CAN_ERR_MASK); @@ -7209,12 +6717,10 @@ PyInit__socket(void) PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT); PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED); #endif -#ifdef SOL_RDS - PyModule_AddIntMacro(m, SOL_RDS); -#endif #ifdef HAVE_SOCKADDR_ALG PyModule_AddIntMacro(m, SOL_ALG); #endif + #ifdef RDS_CANCEL_SENT_TO PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO); #endif @@ -7233,613 +6739,285 @@ PyInit__socket(void) #ifdef RDS_GET_MR_FOR_DEST PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST); #endif -#ifdef IPPROTO_IP - PyModule_AddIntMacro(m, IPPROTO_IP); -#else - PyModule_AddIntConstant(m, "IPPROTO_IP", 0); -#endif -#ifdef IPPROTO_HOPOPTS - PyModule_AddIntMacro(m, IPPROTO_HOPOPTS); -#endif -#ifdef IPPROTO_ICMP - PyModule_AddIntMacro(m, IPPROTO_ICMP); -#else - PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1); -#endif -#ifdef IPPROTO_IGMP - PyModule_AddIntMacro(m, IPPROTO_IGMP); -#endif -#ifdef IPPROTO_GGP - PyModule_AddIntMacro(m, IPPROTO_GGP); -#endif -#ifdef IPPROTO_IPV4 - PyModule_AddIntMacro(m, IPPROTO_IPV4); -#endif -#ifdef IPPROTO_IPV6 - PyModule_AddIntMacro(m, IPPROTO_IPV6); -#endif -#ifdef IPPROTO_IPIP - PyModule_AddIntMacro(m, IPPROTO_IPIP); -#endif -#ifdef IPPROTO_TCP - PyModule_AddIntMacro(m, IPPROTO_TCP); -#else - PyModule_AddIntConstant(m, "IPPROTO_TCP", 6); -#endif -#ifdef IPPROTO_EGP - PyModule_AddIntMacro(m, IPPROTO_EGP); -#endif -#ifdef IPPROTO_PUP - PyModule_AddIntMacro(m, IPPROTO_PUP); -#endif -#ifdef IPPROTO_UDP - PyModule_AddIntMacro(m, IPPROTO_UDP); -#else - PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); -#endif -#ifdef IPPROTO_IDP - PyModule_AddIntMacro(m, IPPROTO_IDP); -#endif -#ifdef IPPROTO_HELLO - PyModule_AddIntMacro(m, IPPROTO_HELLO); -#endif -#ifdef IPPROTO_ND - PyModule_AddIntMacro(m, IPPROTO_ND); -#endif -#ifdef IPPROTO_TP - PyModule_AddIntMacro(m, IPPROTO_TP); -#endif -#ifdef IPPROTO_IPV6 - PyModule_AddIntMacro(m, IPPROTO_IPV6); -#endif -#ifdef IPPROTO_ROUTING - PyModule_AddIntMacro(m, IPPROTO_ROUTING); -#endif -#ifdef IPPROTO_FRAGMENT - PyModule_AddIntMacro(m, IPPROTO_FRAGMENT); -#endif -#ifdef IPPROTO_RSVP - PyModule_AddIntMacro(m, IPPROTO_RSVP); -#endif -#ifdef IPPROTO_GRE - PyModule_AddIntMacro(m, IPPROTO_GRE); -#endif -#ifdef IPPROTO_ESP - PyModule_AddIntMacro(m, IPPROTO_ESP); -#endif -#ifdef IPPROTO_AH - PyModule_AddIntMacro(m, IPPROTO_AH); -#endif -#ifdef IPPROTO_MOBILE - PyModule_AddIntMacro(m, IPPROTO_MOBILE); -#endif -#ifdef IPPROTO_ICMPV6 - PyModule_AddIntMacro(m, IPPROTO_ICMPV6); -#endif -#ifdef IPPROTO_NONE - PyModule_AddIntMacro(m, IPPROTO_NONE); -#endif -#ifdef IPPROTO_DSTOPTS - PyModule_AddIntMacro(m, IPPROTO_DSTOPTS); -#endif -#ifdef IPPROTO_XTP - PyModule_AddIntMacro(m, IPPROTO_XTP); -#endif -#ifdef IPPROTO_EON - PyModule_AddIntMacro(m, IPPROTO_EON); -#endif -#ifdef IPPROTO_PIM - PyModule_AddIntMacro(m, IPPROTO_PIM); -#endif -#ifdef IPPROTO_IPCOMP - PyModule_AddIntMacro(m, IPPROTO_IPCOMP); -#endif -#ifdef IPPROTO_VRRP - PyModule_AddIntMacro(m, IPPROTO_VRRP); -#endif -#ifdef IPPROTO_SCTP - PyModule_AddIntMacro(m, IPPROTO_SCTP); -#endif -#ifdef IPPROTO_BIP - PyModule_AddIntMacro(m, IPPROTO_BIP); -#endif -/**/ -#ifdef IPPROTO_RAW - PyModule_AddIntMacro(m, IPPROTO_RAW); -#else - PyModule_AddIntConstant(m, "IPPROTO_RAW", 255); -#endif -#ifdef IPPROTO_MAX - PyModule_AddIntMacro(m, IPPROTO_MAX); -#endif -#ifdef SYSPROTO_CONTROL - PyModule_AddIntMacro(m, SYSPROTO_CONTROL); + PyModule_AddIntMacro(m, IPPROTO_IP); + PyModule_AddIntMacro(m, IPPROTO_HOPOPTS); + PyModule_AddIntMacro(m, IPPROTO_ICMP); + PyModule_AddIntMacro(m, IPPROTO_TCP); + PyModule_AddIntMacro(m, IPPROTO_UDP); + PyModule_AddIntMacro(m, IPPROTO_RAW); + PyModule_AddIntMacro(m, IPPROTO_IGMP); +#ifdef IPPROTO_GGP + if (IPPROTO_GGP) PyModule_AddIntMacro(m, IPPROTO_GGP); +#endif +#ifdef IPPROTO_IPV4 + if (IPPROTO_IPV4) PyModule_AddIntMacro(m, IPPROTO_IPV4); +#endif +#ifdef IPPROTO_IPV6 + if (IPPROTO_IPV6) PyModule_AddIntMacro(m, IPPROTO_IPV6); +#endif +#ifdef IPPROTO_IPIP + if (IPPROTO_IPIP) PyModule_AddIntMacro(m, IPPROTO_IPIP); +#endif +#ifdef IPPROTO_EGP + if (IPPROTO_EGP) PyModule_AddIntMacro(m, IPPROTO_EGP); +#endif +#ifdef IPPROTO_PUP + if (IPPROTO_PUP) PyModule_AddIntMacro(m, IPPROTO_PUP); +#endif +#ifdef IPPROTO_IDP + if (IPPROTO_IDP) PyModule_AddIntMacro(m, IPPROTO_IDP); +#endif +#ifdef IPPROTO_HELLO + if (IPPROTO_HELLO) PyModule_AddIntMacro(m, IPPROTO_HELLO); +#endif +#ifdef IPPROTO_ND + if (IPPROTO_ND) PyModule_AddIntMacro(m, IPPROTO_ND); +#endif +#ifdef IPPROTO_TP + if (IPPROTO_TP) PyModule_AddIntMacro(m, IPPROTO_TP); +#endif +#ifdef IPPROTO_IPV6 + if (IPPROTO_IPV6) PyModule_AddIntMacro(m, IPPROTO_IPV6); +#endif +#ifdef IPPROTO_ROUTING + if (IPPROTO_ROUTING) PyModule_AddIntMacro(m, IPPROTO_ROUTING); +#endif +#ifdef IPPROTO_FRAGMENT + if (IPPROTO_FRAGMENT) PyModule_AddIntMacro(m, IPPROTO_FRAGMENT); +#endif +#ifdef IPPROTO_RSVP + if (IPPROTO_RSVP) PyModule_AddIntMacro(m, IPPROTO_RSVP); +#endif +#ifdef IPPROTO_GRE + if (IPPROTO_GRE) PyModule_AddIntMacro(m, IPPROTO_GRE); +#endif +#ifdef IPPROTO_ESP + if (IPPROTO_ESP) PyModule_AddIntMacro(m, IPPROTO_ESP); +#endif +#ifdef IPPROTO_AH + if (IPPROTO_AH) PyModule_AddIntMacro(m, IPPROTO_AH); +#endif +#ifdef IPPROTO_MOBILE + if (IPPROTO_MOBILE) PyModule_AddIntMacro(m, IPPROTO_MOBILE); +#endif +#ifdef IPPROTO_ICMPV6 + if (IPPROTO_ICMPV6) PyModule_AddIntMacro(m, IPPROTO_ICMPV6); +#endif +#ifdef IPPROTO_NONE + if (IPPROTO_NONE) PyModule_AddIntMacro(m, IPPROTO_NONE); +#endif +#ifdef IPPROTO_DSTOPTS + if (IPPROTO_DSTOPTS) PyModule_AddIntMacro(m, IPPROTO_DSTOPTS); +#endif +#ifdef IPPROTO_XTP + if (IPPROTO_XTP) PyModule_AddIntMacro(m, IPPROTO_XTP); +#endif +#ifdef IPPROTO_EON + if (IPPROTO_EON) PyModule_AddIntMacro(m, IPPROTO_EON); +#endif +#ifdef IPPROTO_PIM + if (IPPROTO_PIM) PyModule_AddIntMacro(m, IPPROTO_PIM); +#endif +#ifdef IPPROTO_IPCOMP + if (IPPROTO_IPCOMP) PyModule_AddIntMacro(m, IPPROTO_IPCOMP); +#endif +#ifdef IPPROTO_VRRP + if (IPPROTO_VRRP) PyModule_AddIntMacro(m, IPPROTO_VRRP); +#endif +#ifdef IPPROTO_SCTP + if (IPPROTO_SCTP) PyModule_AddIntMacro(m, IPPROTO_SCTP); +#endif +#ifdef IPPROTO_BIP + if (IPPROTO_BIP) PyModule_AddIntMacro(m, IPPROTO_BIP); +#endif + PyModule_AddIntMacro(m, IPPROTO_MAX); + +#ifdef SYSPROTO_CONTROL + if (SYSPROTO_CONTROL) PyModule_AddIntMacro(m, SYSPROTO_CONTROL); #endif /* Some port configuration */ -#ifdef IPPORT_RESERVED PyModule_AddIntMacro(m, IPPORT_RESERVED); -#else - PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024); -#endif -#ifdef IPPORT_USERRESERVED PyModule_AddIntMacro(m, IPPORT_USERRESERVED); -#else - PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000); -#endif /* Some reserved IP v.4 addresses */ -#ifdef INADDR_ANY PyModule_AddIntMacro(m, INADDR_ANY); -#else - PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000); -#endif -#ifdef INADDR_BROADCAST PyModule_AddIntMacro(m, INADDR_BROADCAST); -#else - PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff); -#endif -#ifdef INADDR_LOOPBACK PyModule_AddIntMacro(m, INADDR_LOOPBACK); -#else - PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001); -#endif -#ifdef INADDR_UNSPEC_GROUP PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP); -#else - PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000); -#endif -#ifdef INADDR_ALLHOSTS_GROUP PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP); -#else - PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001); -#endif -#ifdef INADDR_MAX_LOCAL_GROUP PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP); -#else - PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff); -#endif -#ifdef INADDR_NONE PyModule_AddIntMacro(m, INADDR_NONE); -#else - PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff); -#endif /* IPv4 [gs]etsockopt options */ -#ifdef IP_OPTIONS PyModule_AddIntMacro(m, IP_OPTIONS); -#endif -#ifdef IP_HDRINCL PyModule_AddIntMacro(m, IP_HDRINCL); -#endif -#ifdef IP_TOS PyModule_AddIntMacro(m, IP_TOS); -#endif -#ifdef IP_TTL PyModule_AddIntMacro(m, IP_TTL); -#endif -#ifdef IP_RECVOPTS - PyModule_AddIntMacro(m, IP_RECVOPTS); -#endif -#ifdef IP_RECVRETOPTS - PyModule_AddIntMacro(m, IP_RECVRETOPTS); -#endif -#ifdef IP_RECVDSTADDR - PyModule_AddIntMacro(m, IP_RECVDSTADDR); -#endif -#ifdef IP_RETOPTS - PyModule_AddIntMacro(m, IP_RETOPTS); -#endif -#ifdef IP_MULTICAST_IF - PyModule_AddIntMacro(m, IP_MULTICAST_IF); -#endif -#ifdef IP_MULTICAST_TTL - PyModule_AddIntMacro(m, IP_MULTICAST_TTL); -#endif -#ifdef IP_MULTICAST_LOOP - PyModule_AddIntMacro(m, IP_MULTICAST_LOOP); -#endif -#ifdef IP_ADD_MEMBERSHIP PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP); -#endif -#ifdef IP_DROP_MEMBERSHIP PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP); -#endif -#ifdef IP_DEFAULT_MULTICAST_TTL + PyModule_AddIntMacro(m, IP_MULTICAST_IF); + PyModule_AddIntMacro(m, IP_MULTICAST_TTL); + PyModule_AddIntMacro(m, IP_MULTICAST_LOOP); PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL); -#endif -#ifdef IP_DEFAULT_MULTICAST_LOOP PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP); -#endif -#ifdef IP_MAX_MEMBERSHIPS PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS); -#endif -#ifdef IP_TRANSPARENT - PyModule_AddIntMacro(m, IP_TRANSPARENT); -#endif + if (IP_RECVOPTS) PyModule_AddIntMacro(m, IP_RECVOPTS); + if (IP_RECVRETOPTS) PyModule_AddIntMacro(m, IP_RECVRETOPTS); + if (IP_RECVDSTADDR) PyModule_AddIntMacro(m, IP_RECVDSTADDR); + if (IP_RETOPTS) PyModule_AddIntMacro(m, IP_RETOPTS); + if (IP_TRANSPARENT) PyModule_AddIntMacro(m, IP_TRANSPARENT); +#ifdef ENABLE_IPV6 /* IPv6 [gs]etsockopt options, defined in RFC2553 */ -#ifdef IPV6_JOIN_GROUP - PyModule_AddIntMacro(m, IPV6_JOIN_GROUP); +#ifdef IPV6_JOIN_GROUP + if (IPV6_JOIN_GROUP) PyModule_AddIntMacro(m, IPV6_JOIN_GROUP); #endif -#ifdef IPV6_LEAVE_GROUP - PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP); +#ifdef IPV6_LEAVE_GROUP + if (IPV6_LEAVE_GROUP) PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP); #endif -#ifdef IPV6_MULTICAST_HOPS - PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS); +#ifdef IPV6_MULTICAST_HOPS + if (IPV6_MULTICAST_HOPS) PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS); #endif -#ifdef IPV6_MULTICAST_IF - PyModule_AddIntMacro(m, IPV6_MULTICAST_IF); +#ifdef IPV6_MULTICAST_IF + if (IPV6_MULTICAST_IF) PyModule_AddIntMacro(m, IPV6_MULTICAST_IF); #endif -#ifdef IPV6_MULTICAST_LOOP - PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP); +#ifdef IPV6_MULTICAST_LOOP + if (IPV6_MULTICAST_LOOP) PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP); #endif -#ifdef IPV6_UNICAST_HOPS - PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS); +#ifdef IPV6_UNICAST_HOPS + if (IPV6_UNICAST_HOPS) PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS); #endif /* Additional IPV6 socket options, defined in RFC 3493 */ #ifdef IPV6_V6ONLY - PyModule_AddIntMacro(m, IPV6_V6ONLY); + if (IPV6_V6ONLY) PyModule_AddIntMacro(m, IPV6_V6ONLY); #endif /* Advanced IPV6 socket options, from RFC 3542 */ #ifdef IPV6_CHECKSUM - PyModule_AddIntMacro(m, IPV6_CHECKSUM); + if (IPV6_CHECKSUM) PyModule_AddIntMacro(m, IPV6_CHECKSUM); #endif #ifdef IPV6_DONTFRAG - PyModule_AddIntMacro(m, IPV6_DONTFRAG); + if (IPV6_DONTFRAG) PyModule_AddIntMacro(m, IPV6_DONTFRAG); #endif #ifdef IPV6_DSTOPTS - PyModule_AddIntMacro(m, IPV6_DSTOPTS); + if (IPV6_DSTOPTS) PyModule_AddIntMacro(m, IPV6_DSTOPTS); #endif #ifdef IPV6_HOPLIMIT - PyModule_AddIntMacro(m, IPV6_HOPLIMIT); + if (IPV6_HOPLIMIT) PyModule_AddIntMacro(m, IPV6_HOPLIMIT); #endif #ifdef IPV6_HOPOPTS - PyModule_AddIntMacro(m, IPV6_HOPOPTS); + if (IPV6_HOPOPTS) PyModule_AddIntMacro(m, IPV6_HOPOPTS); #endif #ifdef IPV6_NEXTHOP - PyModule_AddIntMacro(m, IPV6_NEXTHOP); + if (IPV6_NEXTHOP) PyModule_AddIntMacro(m, IPV6_NEXTHOP); #endif #ifdef IPV6_PATHMTU - PyModule_AddIntMacro(m, IPV6_PATHMTU); + if (IPV6_PATHMTU) PyModule_AddIntMacro(m, IPV6_PATHMTU); #endif #ifdef IPV6_PKTINFO - PyModule_AddIntMacro(m, IPV6_PKTINFO); + if (IPV6_PKTINFO) PyModule_AddIntMacro(m, IPV6_PKTINFO); #endif #ifdef IPV6_RECVDSTOPTS - PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS); + if (IPV6_RECVDSTOPTS) PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS); #endif #ifdef IPV6_RECVHOPLIMIT - PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT); + if (IPV6_RECVHOPLIMIT) PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT); #endif #ifdef IPV6_RECVHOPOPTS - PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS); + if (IPV6_RECVHOPOPTS) PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS); #endif #ifdef IPV6_RECVPKTINFO - PyModule_AddIntMacro(m, IPV6_RECVPKTINFO); + if (IPV6_RECVPKTINFO) PyModule_AddIntMacro(m, IPV6_RECVPKTINFO); #endif #ifdef IPV6_RECVRTHDR - PyModule_AddIntMacro(m, IPV6_RECVRTHDR); + if (IPV6_RECVRTHDR) PyModule_AddIntMacro(m, IPV6_RECVRTHDR); #endif #ifdef IPV6_RECVTCLASS - PyModule_AddIntMacro(m, IPV6_RECVTCLASS); + if (IPV6_RECVTCLASS) PyModule_AddIntMacro(m, IPV6_RECVTCLASS); #endif #ifdef IPV6_RTHDR - PyModule_AddIntMacro(m, IPV6_RTHDR); + if (IPV6_RTHDR) PyModule_AddIntMacro(m, IPV6_RTHDR); #endif #ifdef IPV6_RTHDRDSTOPTS - PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS); + if (IPV6_RTHDRDSTOPTS) PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS); #endif #ifdef IPV6_RTHDR_TYPE_0 - PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0); + if (IPV6_RTHDR_TYPE_0) PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0); #endif #ifdef IPV6_RECVPATHMTU - PyModule_AddIntMacro(m, IPV6_RECVPATHMTU); + if (IPV6_RECVPATHMTU) PyModule_AddIntMacro(m, IPV6_RECVPATHMTU); #endif #ifdef IPV6_TCLASS - PyModule_AddIntMacro(m, IPV6_TCLASS); + if (IPV6_TCLASS) PyModule_AddIntMacro(m, IPV6_TCLASS); #endif #ifdef IPV6_USE_MIN_MTU - PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU); + if (IPV6_USE_MIN_MTU) PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU); #endif +#endif /* lolv6 */ /* TCP options */ -#ifdef TCP_NODELAY - PyModule_AddIntMacro(m, TCP_NODELAY); -#endif -#ifdef TCP_MAXSEG - PyModule_AddIntMacro(m, TCP_MAXSEG); -#endif -#ifdef TCP_CORK - PyModule_AddIntMacro(m, TCP_CORK); -#endif -#ifdef TCP_KEEPIDLE - PyModule_AddIntMacro(m, TCP_KEEPIDLE); -#endif -#ifdef TCP_KEEPINTVL - PyModule_AddIntMacro(m, TCP_KEEPINTVL); -#endif -#ifdef TCP_KEEPCNT - PyModule_AddIntMacro(m, TCP_KEEPCNT); -#endif -#ifdef TCP_SYNCNT - PyModule_AddIntMacro(m, TCP_SYNCNT); -#endif -#ifdef TCP_LINGER2 - PyModule_AddIntMacro(m, TCP_LINGER2); -#endif -#ifdef TCP_DEFER_ACCEPT - PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT); -#endif -#ifdef TCP_WINDOW_CLAMP - PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP); -#endif -#ifdef TCP_INFO - PyModule_AddIntMacro(m, TCP_INFO); -#endif -#ifdef TCP_QUICKACK - PyModule_AddIntMacro(m, TCP_QUICKACK); -#endif -#ifdef TCP_FASTOPEN - PyModule_AddIntMacro(m, TCP_FASTOPEN); -#endif -#ifdef TCP_CONGESTION - PyModule_AddIntMacro(m, TCP_CONGESTION); -#endif -#ifdef TCP_USER_TIMEOUT - PyModule_AddIntMacro(m, TCP_USER_TIMEOUT); -#endif + if (TCP_NODELAY) PyModule_AddIntMacro(m, TCP_NODELAY); + if (TCP_MAXSEG) PyModule_AddIntMacro(m, TCP_MAXSEG); + if (TCP_CORK) PyModule_AddIntMacro(m, TCP_CORK); + if (TCP_KEEPIDLE) PyModule_AddIntMacro(m, TCP_KEEPIDLE); + if (TCP_KEEPINTVL) PyModule_AddIntMacro(m, TCP_KEEPINTVL); + if (TCP_SYNCNT) PyModule_AddIntMacro(m, TCP_SYNCNT); + if (TCP_LINGER2) PyModule_AddIntMacro(m, TCP_LINGER2); + if (TCP_DEFER_ACCEPT) PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT); + if (TCP_WINDOW_CLAMP) PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP); + if (TCP_INFO) PyModule_AddIntMacro(m, TCP_INFO); + if (TCP_QUICKACK) PyModule_AddIntMacro(m, TCP_QUICKACK); + if (TCP_CONGESTION) PyModule_AddIntMacro(m, TCP_CONGESTION); + if (TCP_USER_TIMEOUT) PyModule_AddIntMacro(m, TCP_USER_TIMEOUT); + if (TCP_KEEPCNT && (!IsWindows() || NtGetVersion() >= 10)) + PyModule_AddIntMacro(m, TCP_KEEPCNT); + if (TCP_FASTOPEN && (!IsWindows() || NtGetVersion() >= 10)) + PyModule_AddIntMacro(m, TCP_FASTOPEN); +#ifdef IPX_TYPE /* IPX options */ -#ifdef IPX_TYPE - PyModule_AddIntMacro(m, IPX_TYPE); + if (IPX_TYPE) PyModule_AddIntMacro(m, IPX_TYPE); #endif -/* Reliable Datagram Sockets */ -#ifdef RDS_CMSG_RDMA_ARGS - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS); -#endif -#ifdef RDS_CMSG_RDMA_DEST - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST); -#endif -#ifdef RDS_CMSG_RDMA_MAP - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP); -#endif -#ifdef RDS_CMSG_RDMA_STATUS - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS); -#endif -#ifdef RDS_CMSG_RDMA_UPDATE - PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE); -#endif -#ifdef RDS_RDMA_READWRITE - PyModule_AddIntMacro(m, RDS_RDMA_READWRITE); -#endif -#ifdef RDS_RDMA_FENCE - PyModule_AddIntMacro(m, RDS_RDMA_FENCE); -#endif -#ifdef RDS_RDMA_INVALIDATE - PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE); -#endif -#ifdef RDS_RDMA_USE_ONCE - PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE); -#endif -#ifdef RDS_RDMA_DONTWAIT - PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT); -#endif -#ifdef RDS_RDMA_NOTIFY_ME - PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME); -#endif -#ifdef RDS_RDMA_SILENT - PyModule_AddIntMacro(m, RDS_RDMA_SILENT); -#endif - - /* get{addr,name}info parameters */ -#ifdef EAI_ADDRFAMILY PyModule_AddIntMacro(m, EAI_ADDRFAMILY); -#endif -#ifdef EAI_AGAIN PyModule_AddIntMacro(m, EAI_AGAIN); -#endif -#ifdef EAI_BADFLAGS PyModule_AddIntMacro(m, EAI_BADFLAGS); -#endif -#ifdef EAI_FAIL PyModule_AddIntMacro(m, EAI_FAIL); -#endif -#ifdef EAI_FAMILY PyModule_AddIntMacro(m, EAI_FAMILY); -#endif -#ifdef EAI_MEMORY PyModule_AddIntMacro(m, EAI_MEMORY); -#endif -#ifdef EAI_NODATA PyModule_AddIntMacro(m, EAI_NODATA); -#endif -#ifdef EAI_NONAME PyModule_AddIntMacro(m, EAI_NONAME); -#endif -#ifdef EAI_OVERFLOW PyModule_AddIntMacro(m, EAI_OVERFLOW); -#endif -#ifdef EAI_SERVICE PyModule_AddIntMacro(m, EAI_SERVICE); -#endif -#ifdef EAI_SOCKTYPE PyModule_AddIntMacro(m, EAI_SOCKTYPE); -#endif -#ifdef EAI_SYSTEM PyModule_AddIntMacro(m, EAI_SYSTEM); -#endif -#ifdef EAI_BADHINTS - PyModule_AddIntMacro(m, EAI_BADHINTS); -#endif -#ifdef EAI_PROTOCOL - PyModule_AddIntMacro(m, EAI_PROTOCOL); -#endif -#ifdef EAI_MAX - PyModule_AddIntMacro(m, EAI_MAX); -#endif -#ifdef AI_PASSIVE + PyModule_AddIntMacro(m, AI_PASSIVE); -#endif -#ifdef AI_CANONNAME PyModule_AddIntMacro(m, AI_CANONNAME); -#endif -#ifdef AI_NUMERICHOST PyModule_AddIntMacro(m, AI_NUMERICHOST); -#endif -#ifdef AI_NUMERICSERV PyModule_AddIntMacro(m, AI_NUMERICSERV); -#endif -#ifdef AI_MASK - PyModule_AddIntMacro(m, AI_MASK); -#endif -#ifdef AI_ALL PyModule_AddIntMacro(m, AI_ALL); -#endif -#ifdef AI_V4MAPPED_CFG - PyModule_AddIntMacro(m, AI_V4MAPPED_CFG); -#endif -#ifdef AI_ADDRCONFIG PyModule_AddIntMacro(m, AI_ADDRCONFIG); -#endif -#ifdef AI_V4MAPPED PyModule_AddIntMacro(m, AI_V4MAPPED); -#endif -#ifdef AI_DEFAULT - PyModule_AddIntMacro(m, AI_DEFAULT); -#endif -#ifdef NI_MAXHOST PyModule_AddIntMacro(m, NI_MAXHOST); -#endif -#ifdef NI_MAXSERV PyModule_AddIntMacro(m, NI_MAXSERV); -#endif -#ifdef NI_NOFQDN PyModule_AddIntMacro(m, NI_NOFQDN); -#endif -#ifdef NI_NUMERICHOST PyModule_AddIntMacro(m, NI_NUMERICHOST); -#endif -#ifdef NI_NAMEREQD PyModule_AddIntMacro(m, NI_NAMEREQD); -#endif -#ifdef NI_NUMERICSERV PyModule_AddIntMacro(m, NI_NUMERICSERV); -#endif -#ifdef NI_DGRAM PyModule_AddIntMacro(m, NI_DGRAM); -#endif /* shutdown() parameters */ -#ifdef SHUT_RD PyModule_AddIntMacro(m, SHUT_RD); -#elif defined(SD_RECEIVE) - PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE); -#else - PyModule_AddIntConstant(m, "SHUT_RD", 0); -#endif -#ifdef SHUT_WR PyModule_AddIntMacro(m, SHUT_WR); -#elif defined(SD_SEND) - PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND); -#else - PyModule_AddIntConstant(m, "SHUT_WR", 1); -#endif -#ifdef SHUT_RDWR PyModule_AddIntMacro(m, SHUT_RDWR); -#elif defined(SD_BOTH) - PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH); -#else - PyModule_AddIntConstant(m, "SHUT_RDWR", 2); -#endif - -#ifdef SIO_RCVALL - { - DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS, -#if defined(SIO_LOOPBACK_FAST_PATH) - SIO_LOOPBACK_FAST_PATH -#endif - }; - const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS", -#if defined(SIO_LOOPBACK_FAST_PATH) - "SIO_LOOPBACK_FAST_PATH" -#endif - }; - int i; - for(i = 0; i -# else -# include -# endif -// # include -# if !defined(__CYGWIN__) -// # include -# endif - -#else /* MS_WINDOWS */ -# include -/* Windows 'supports' CMSG_LEN, but does not follow the POSIX standard - * interface at all, so there is no point including the code that - * attempts to use it. - */ -# ifdef PySocket_BUILDING_SOCKET -# undef CMSG_LEN -# endif -# include -/* VC6 is shipped with old platform headers, and does not have MSTcpIP.h - * Separate SDKs have all the functions we want, but older ones don't have - * any version information. - * I use SIO_GET_MULTICAST_FILTER to detect a decent SDK. - */ -# ifdef SIO_GET_MULTICAST_FILTER -# include /* for SIO_RCVALL */ -# define HAVE_ADDRINFO -# define HAVE_SOCKADDR_STORAGE -# define HAVE_GETADDRINFO -# define HAVE_GETNAMEINFO -# define ENABLE_IPV6 -# else -typedef int socklen_t; -# endif /* IPPROTO_IPV6 */ -#endif /* MS_WINDOWS */ - -#ifdef HAVE_SYS_UN_H -// # include -#else -# undef AF_UNIX -#endif - -#ifdef HAVE_LINUX_NETLINK_H -# ifdef HAVE_ASM_TYPES_H -# include -# endif -# include -#else -# undef AF_NETLINK -#endif - -#ifdef HAVE_BLUETOOTH_BLUETOOTH_H -#include -#include -#include -#include -#include -#endif - -#ifdef HAVE_BLUETOOTH_H -#include -#endif - -#ifdef HAVE_NET_IF_H -# include -#endif - -#ifdef HAVE_NETPACKET_PACKET_H -# include -# include -#endif - -#ifdef HAVE_LINUX_TIPC_H -# include -#endif - -#ifdef HAVE_LINUX_CAN_H -# include -#else -# undef AF_CAN -# undef PF_CAN -#endif - -#ifdef HAVE_LINUX_CAN_RAW_H -#include -#endif - -#ifdef HAVE_LINUX_CAN_BCM_H -#include -#endif - -#ifdef HAVE_SYS_SYS_DOMAIN_H -#include -#endif -#ifdef HAVE_SYS_KERN_CONTROL_H -#include -#endif - -#ifdef HAVE_SOCKADDR_ALG -#include -#ifndef AF_ALG -#define AF_ALG 38 -#endif -#ifndef SOL_ALG -#define SOL_ALG 279 -#endif - -/* Linux 3.19 */ -#ifndef ALG_SET_AEAD_ASSOCLEN -#define ALG_SET_AEAD_ASSOCLEN 4 -#endif -#ifndef ALG_SET_AEAD_AUTHSIZE -#define ALG_SET_AEAD_AUTHSIZE 5 -#endif -/* Linux 4.8 */ -#ifndef ALG_SET_PUBKEY -#define ALG_SET_PUBKEY 6 -#endif - -#ifndef ALG_OP_SIGN -#define ALG_OP_SIGN 2 -#endif -#ifndef ALG_OP_VERIFY -#define ALG_OP_VERIFY 3 -#endif - -#endif /* HAVE_SOCKADDR_ALG */ - - #ifndef Py__SOCKET_H #define Py__SOCKET_H +#include "libc/sock/sock.h" #ifdef __cplusplus extern "C" { #endif +/* clang-format off */ /* Python module and C API name */ #define PySocket_MODULE_NAME "_socket" #define PySocket_CAPI_NAME "CAPI" #define PySocket_CAPSULE_NAME PySocket_MODULE_NAME "." PySocket_CAPI_NAME -/* Abstract the socket file descriptor type */ -#ifdef MS_WINDOWS -typedef SOCKET SOCKET_T; -# ifdef MS_WIN64 -# define SIZEOF_SOCKET_T 8 -# else -# define SIZEOF_SOCKET_T 4 -# endif -#else typedef int SOCKET_T; -# define SIZEOF_SOCKET_T SIZEOF_INT -#endif +#define SIZEOF_SOCKET_T __SIZEOF_INT__ #if SIZEOF_SOCKET_T <= SIZEOF_LONG #define PyLong_FromSocket_t(fd) PyLong_FromLong((SOCKET_T)(fd)) @@ -163,17 +21,12 @@ typedef int SOCKET_T; #define PyLong_FromSocket_t(fd) PyLong_FromLongLong((SOCKET_T)(fd)) #define PyLong_AsSocket_t(fd) (SOCKET_T)PyLong_AsLongLong(fd) #endif - + /* Socket address */ typedef union sock_addr { struct sockaddr_in in; struct sockaddr sa; -#ifdef AF_UNIX struct sockaddr_un un; -#endif -#ifdef AF_NETLINK - struct sockaddr_nl nl; -#endif #ifdef ENABLE_IPV6 struct sockaddr_in6 in6; struct sockaddr_storage storage; @@ -276,6 +129,5 @@ typedef struct { #ifdef __cplusplus } - #endif #endif /* !Py__SOCKET_H */ diff --git a/third_party/python/Modules/spwdmodule.c b/third_party/python/Modules/spwdmodule.c index 1601ec0f2..bf1cb5df3 100644 --- a/third_party/python/Modules/spwdmodule.c +++ b/third_party/python/Modules/spwdmodule.c @@ -1,16 +1,11 @@ +/* clang-format off */ /* UNIX shadow password file access module */ /* A lot of code has been taken from pwdmodule.c */ /* For info also see http://www.unixpapa.com/incnote/passwd.html */ -#include "Python.h" - -#include -#ifdef HAVE_SHADOW_H -#include -#endif - -#include "clinic/spwdmodule.c.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Modules/clinic/spwdmodule.inc" /*[clinic input] module spwd diff --git a/third_party/python/Modules/symtablemodule.c b/third_party/python/Modules/symtablemodule.c index 34a6fc56f..1f25d0c2c 100644 --- a/third_party/python/Modules/symtablemodule.c +++ b/third_party/python/Modules/symtablemodule.c @@ -1,8 +1,9 @@ -#include "Python.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" -#include "code.h" -#include "Python-ast.h" -#include "symtable.h" +#include "third_party/python/Include/code.h" +#include "third_party/python/Include/Python-ast.h" +#include "third_party/python/Include/symtable.h" static PyObject * symtable_symtable(PyObject *self, PyObject *args) diff --git a/third_party/python/Modules/syslogmodule.c b/third_party/python/Modules/syslogmodule.c index d645cdc55..bdb995b88 100644 --- a/third_party/python/Modules/syslogmodule.c +++ b/third_party/python/Modules/syslogmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /*********************************************************** Copyright 1994 by Lance Ellinghouse, Cathedral City, California Republic, United States of America. @@ -49,8 +50,8 @@ Revision history: /* syslog module */ -#include "Python.h" -#include "osdefs.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/osdefs.h" #include "libc/sock/syslog.h" #include "libc/sysv/consts/log.h" diff --git a/third_party/python/Modules/termios.c b/third_party/python/Modules/termios.c index 945d8e08e..5250b5a0a 100644 --- a/third_party/python/Modules/termios.c +++ b/third_party/python/Modules/termios.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* termiosmodule.c -- POSIX terminal I/O module implementation. */ #include "Python.h" diff --git a/third_party/python/Modules/timemodule.c b/third_party/python/Modules/timemodule.c index 9aa85647a..62036312a 100644 --- a/third_party/python/Modules/timemodule.c +++ b/third_party/python/Modules/timemodule.c @@ -1,38 +1,13 @@ +/* clang-format off */ /* Time module */ -#include "Python.h" +#include "third_party/python/Include/Python.h" -#include #include "libc/sock/select.h" #include "libc/time/time.h" #include "libc/time/struct/tm.h" #include "libc/sysv/consts/rusage.h" -#ifdef HAVE_SYS_TIMES_H -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#if defined(HAVE_SYS_RESOURCE_H) -#include -#endif - -#ifdef QUICKWIN -#include -#endif - -#if defined(__WATCOMC__) && !defined(__QNX__) -#include -#else -#ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -#include "pythread.h" -#endif /* MS_WINDOWS */ -#endif /* !__WATCOMC__ || __QNX__ */ - typedef int clockid_t; #undef HAVE_CLOCK_SETTIME diff --git a/third_party/python/Modules/tkappinit.c b/third_party/python/Modules/tkappinit.c index 7616d9d31..48bdd2491 100644 --- a/third_party/python/Modules/tkappinit.c +++ b/third_party/python/Modules/tkappinit.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* appinit.c -- Tcl and Tk application initialization. The function Tcl_AppInit() below initializes various Tcl packages. diff --git a/third_party/python/Modules/unicodedata.c b/third_party/python/Modules/unicodedata.c index 7c9aca9d3..32a02e987 100644 --- a/third_party/python/Modules/unicodedata.c +++ b/third_party/python/Modules/unicodedata.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* ------------------------------------------------------------------------ unicodedata -- Provides access to the Unicode database. @@ -15,9 +16,9 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "ucnhash.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/ucnhash.h" +#include "third_party/python/Include/structmember.h" /*[clinic input] module unicodedata @@ -74,7 +75,7 @@ typedef struct previous_version { Py_UCS4 (*normalization)(Py_UCS4); } PreviousDBVersion; -#include "clinic/unicodedata.c.h" +#include "third_party/python/Modules/clinic/unicodedata.inc" #define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v)) diff --git a/third_party/python/Modules/winreparse.h b/third_party/python/Modules/winreparse.h index 28049c9af..7a2286737 100644 --- a/third_party/python/Modules/winreparse.h +++ b/third_party/python/Modules/winreparse.h @@ -1,5 +1,6 @@ #ifndef Py_WINREPARSE_H #define Py_WINREPARSE_H +/* clang-format off */ #ifdef MS_WINDOWS #include diff --git a/third_party/python/Modules/xxlimited.c b/third_party/python/Modules/xxlimited.c index 5586989d0..029273afa 100644 --- a/third_party/python/Modules/xxlimited.c +++ b/third_party/python/Modules/xxlimited.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Use this file as a template to start implementing a module that also declares object types. All occurrences of 'Xxo' should be changed diff --git a/third_party/python/Modules/xxmodule.c b/third_party/python/Modules/xxmodule.c index 076440703..9c56f2171 100644 --- a/third_party/python/Modules/xxmodule.c +++ b/third_party/python/Modules/xxmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Use this file as a template to start implementing a module that also declares object types. All occurrences of 'Xxo' should be changed diff --git a/third_party/python/Modules/xxsubtype.c b/third_party/python/Modules/xxsubtype.c index d2593b12d..c99133779 100644 --- a/third_party/python/Modules/xxsubtype.c +++ b/third_party/python/Modules/xxsubtype.c @@ -1,5 +1,6 @@ -#include "Python.h" -#include "structmember.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" PyDoc_STRVAR(xxsubtype__doc__, "xxsubtype is an example module showing how to subtype builtin types from C.\n" diff --git a/third_party/python/Modules/zipimport.c b/third_party/python/Modules/zipimport.c index baee28d3c..ac4c5f129 100644 --- a/third_party/python/Modules/zipimport.c +++ b/third_party/python/Modules/zipimport.c @@ -1,11 +1,10 @@ -#include "Python.h" -#include "structmember.h" -#include "osdefs.h" -#include "marshal.h" -#include +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/osdefs.h" +#include "third_party/python/Include/marshal.h" #include "libc/time/struct/tm.h" - #define IS_SOURCE 0x0 #define IS_BYTECODE 0x1 #define IS_PACKAGE 0x2 diff --git a/third_party/python/Modules/zlibmodule.c b/third_party/python/Modules/zlibmodule.c index 40c6c45be..a7cd7e0a8 100644 --- a/third_party/python/Modules/zlibmodule.c +++ b/third_party/python/Modules/zlibmodule.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* zlibmodule.c -- gzip-compatible data compression */ /* See http://zlib.net/ */ @@ -5,8 +6,8 @@ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #include "third_party/zlib/zlib.h" @@ -1143,7 +1144,7 @@ zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length) return RetVal; } -#include "clinic/zlibmodule.c.h" +#include "third_party/python/Modules/clinic/zlibmodule.inc" static PyMethodDef comp_methods[] = { diff --git a/third_party/python/Objects/abstract.c b/third_party/python/Objects/abstract.c index 252572024..a5fbe207c 100644 --- a/third_party/python/Objects/abstract.c +++ b/third_party/python/Objects/abstract.c @@ -1,11 +1,9 @@ +/* clang-format off */ /* Abstract Object Interface (many thanks to Jim Fulton) */ -#include "Python.h" -#include -#include "structmember.h" /* we need the offsetof() macro from there */ -#include "longintrepr.h" - - +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/longintrepr.h" /* Shorthands to return certain errors */ diff --git a/third_party/python/Objects/accu.c b/third_party/python/Objects/accu.c index 5bd2ee41f..d3667f2dd 100644 --- a/third_party/python/Objects/accu.c +++ b/third_party/python/Objects/accu.c @@ -1,7 +1,8 @@ +/* clang-format off */ /* Accumulator struct implementation */ -#include "Python.h" -#include "accu.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/accu.h" static PyObject * join_list_unicode(PyObject *lst) diff --git a/third_party/python/Objects/boolobject.c b/third_party/python/Objects/boolobject.c index 31510bb07..0863e51ca 100644 --- a/third_party/python/Objects/boolobject.c +++ b/third_party/python/Objects/boolobject.c @@ -1,7 +1,8 @@ +/* clang-format off */ /* Boolean type, a subtype of int */ -#include "Python.h" -#include "longintrepr.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/longintrepr.h" /* We define bool_repr to return "False" or "True" */ diff --git a/third_party/python/Objects/bytearrayobject.c b/third_party/python/Objects/bytearrayobject.c index 673dd0c65..5637a700b 100644 --- a/third_party/python/Objects/bytearrayobject.c +++ b/third_party/python/Objects/bytearrayobject.c @@ -1,11 +1,12 @@ +/* clang-format off */ /* PyByteArray (bytearray) implementation */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "structmember.h" -#include "bytes_methods.h" -#include "bytesobject.h" -#include "pystrhex.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/bytes_methods.h" +#include "third_party/python/Include/bytesobject.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] class bytearray "PyByteArrayObject *" "&PyByteArray_Type" @@ -90,7 +91,7 @@ _canresize(PyByteArrayObject *self) return 1; } -#include "clinic/bytearrayobject.c.h" +#include "third_party/python/Objects/clinic/bytearrayobject.inc" /* Direct API functions */ @@ -1106,14 +1107,14 @@ bytearray_dealloc(PyByteArrayObject *self) #define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact #define STRINGLIB_MUTABLE 1 -#include "stringlib/fastsearch.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/join.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/ctype.h" -#include "stringlib/transmogrify.h" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/join.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/ctype.inc" +#include "third_party/python/Objects/stringlib/transmogrify.inc" static PyObject * diff --git a/third_party/python/Objects/bytes_methods.c b/third_party/python/Objects/bytes_methods.c index 625e242d5..96784f713 100644 --- a/third_party/python/Objects/bytes_methods.c +++ b/third_party/python/Objects/bytes_methods.c @@ -1,6 +1,7 @@ +/* clang-format off */ #define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "bytes_methods.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/bytes_methods.h" PyDoc_STRVAR_shared(_Py_isspace__doc__, "B.isspace() -> bool\n\ @@ -394,9 +395,9 @@ _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to) #define STRINGLIB_CHAR char #define STRINGLIB_SIZEOF_CHAR 1 -#include "stringlib/fastsearch.h" -#include "stringlib/count.h" -#include "stringlib/find.h" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" /* Wraps stringlib_parse_args_finds() and additionally checks whether the diff --git a/third_party/python/Objects/bytesobject.c b/third_party/python/Objects/bytesobject.c index 8fcc0b39d..3dcc621f1 100644 --- a/third_party/python/Objects/bytesobject.c +++ b/third_party/python/Objects/bytesobject.c @@ -1,19 +1,18 @@ +/* clang-format off */ /* bytes object implementation */ #define PY_SSIZE_T_CLEAN -#include "Python.h" - -#include "bytes_methods.h" -#include "pystrhex.h" -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/bytes_methods.h" +#include "third_party/python/Include/pystrhex.h" /*[clinic input] class bytes "PyBytesObject *" "&PyBytes_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=7a238f965d64892b]*/ -#include "clinic/bytesobject.c.h" +#include "third_party/python/Objects/clinic/bytesobject.inc" #ifdef COUNT_ALLOCS Py_ssize_t null_strings, one_strings; @@ -1318,17 +1317,17 @@ PyBytes_AsStringAndSize(PyObject *obj, /* -------------------------------------------------------------------- */ /* Methods */ -#include "stringlib/stringdefs.h" +#include "third_party/python/Objects/stringlib/stringdefs.inc" -#include "stringlib/fastsearch.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/join.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/ctype.h" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/join.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/ctype.inc" -#include "stringlib/transmogrify.h" +#include "third_party/python/Objects/stringlib/transmogrify.inc" PyObject * PyBytes_Repr(PyObject *obj, int smartquotes) diff --git a/third_party/python/Objects/capsule.c b/third_party/python/Objects/capsule.c index 4e15b440b..f6c06b9d0 100644 --- a/third_party/python/Objects/capsule.c +++ b/third_party/python/Objects/capsule.c @@ -1,6 +1,7 @@ +/* clang-format off */ /* Wrap void * pointers to be passed between C modules */ -#include "Python.h" +#include "third_party/python/Include/Python.h" /* Internal structure of PyCapsule */ typedef struct { diff --git a/third_party/python/Objects/cellobject.c b/third_party/python/Objects/cellobject.c index 9f4eddb84..2e62f9373 100644 --- a/third_party/python/Objects/cellobject.c +++ b/third_party/python/Objects/cellobject.c @@ -1,6 +1,7 @@ +/* clang-format off */ /* Cell object implementation */ -#include "Python.h" +#include "third_party/python/Include/Python.h" PyObject * PyCell_New(PyObject *obj) diff --git a/third_party/python/Objects/classobject.c b/third_party/python/Objects/classobject.c index 7071016d0..34e9c8dd5 100644 --- a/third_party/python/Objects/classobject.c +++ b/third_party/python/Objects/classobject.c @@ -1,7 +1,8 @@ +/* clang-format off */ /* Class object implementation (dead now except for methods) */ -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #define TP_DESCR_GET(t) ((t)->tp_descr_get) diff --git a/third_party/python/Objects/clinic/bytearrayobject.c.h b/third_party/python/Objects/clinic/bytearrayobject.inc similarity index 100% rename from third_party/python/Objects/clinic/bytearrayobject.c.h rename to third_party/python/Objects/clinic/bytearrayobject.inc diff --git a/third_party/python/Objects/clinic/bytesobject.c.h b/third_party/python/Objects/clinic/bytesobject.inc similarity index 100% rename from third_party/python/Objects/clinic/bytesobject.c.h rename to third_party/python/Objects/clinic/bytesobject.inc diff --git a/third_party/python/Objects/clinic/dictobject.c.h b/third_party/python/Objects/clinic/dictobject.inc similarity index 100% rename from third_party/python/Objects/clinic/dictobject.c.h rename to third_party/python/Objects/clinic/dictobject.inc diff --git a/third_party/python/Objects/clinic/unicodeobject.c.h b/third_party/python/Objects/clinic/unicodeobject.inc similarity index 100% rename from third_party/python/Objects/clinic/unicodeobject.c.h rename to third_party/python/Objects/clinic/unicodeobject.inc diff --git a/third_party/python/Objects/codeobject.c b/third_party/python/Objects/codeobject.c index c37563c6a..d3f562b4f 100644 --- a/third_party/python/Objects/codeobject.c +++ b/third_party/python/Objects/codeobject.c @@ -1,8 +1,7 @@ -#include - -#include "Python.h" -#include "code.h" -#include "structmember.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/code.h" +#include "third_party/python/Include/structmember.h" #define NAME_CHARS \ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" diff --git a/third_party/python/Objects/complexobject.c b/third_party/python/Objects/complexobject.c index cfaba688c..f5b5a4a9b 100644 --- a/third_party/python/Objects/complexobject.c +++ b/third_party/python/Objects/complexobject.c @@ -1,13 +1,11 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* Complex object implementation */ - /* Borrows heavily from floatobject.c */ - /* Submitted by Jim Hugunin */ -#include "Python.h" -#include "structmember.h" - /* elementary operations on complex numbers */ static Py_complex c_1 = {1., 0.}; diff --git a/third_party/python/Objects/descrobject.c b/third_party/python/Objects/descrobject.c index e897b1092..f8afd0459 100644 --- a/third_party/python/Objects/descrobject.c +++ b/third_party/python/Objects/descrobject.c @@ -1,7 +1,8 @@ -/* Descriptors -- a new, flexible way to describe attributes */ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" -#include "Python.h" -#include "structmember.h" /* Why is this not included in Python.h? */ +/* Descriptors -- a new, flexible way to describe attributes */ static void descr_dealloc(PyDescrObject *descr) diff --git a/third_party/python/Objects/dict-common.h b/third_party/python/Objects/dict-common.h index d3ae07bfd..65789ef94 100644 --- a/third_party/python/Objects/dict-common.h +++ b/third_party/python/Objects/dict-common.h @@ -1,5 +1,6 @@ #ifndef Py_DICT_COMMON_H #define Py_DICT_COMMON_H +/* clang-format off */ typedef struct { /* Cached hash code of me_key. */ diff --git a/third_party/python/Objects/dictnotes.txt b/third_party/python/Objects/dictnotes.txt deleted file mode 100644 index f89720c9f..000000000 --- a/third_party/python/Objects/dictnotes.txt +++ /dev/null @@ -1,149 +0,0 @@ -NOTES ON DICTIONARIES -================================ - -Principal Use Cases for Dictionaries ------------------------------------- - -Passing keyword arguments - Typically, one read and one write for 1 to 3 elements. - Occurs frequently in normal python code. - -Class method lookup - Dictionaries vary in size with 8 to 16 elements being common. - Usually written once with many lookups. - When base classes are used, there are many failed lookups - followed by a lookup in a base class. - -Instance attribute lookup and Global variables - Dictionaries vary in size. 4 to 10 elements are common. - Both reads and writes are common. - -Builtins - Frequent reads. Almost never written. - About 150 interned strings (as of Py3.3). - A few keys are accessed much more frequently than others. - -Uniquification - Dictionaries of any size. Bulk of work is in creation. - Repeated writes to a smaller set of keys. - Single read of each key. - Some use cases have two consecutive accesses to the same key. - - * Removing duplicates from a sequence. - dict.fromkeys(seqn).keys() - - * Counting elements in a sequence. - for e in seqn: - d[e] = d.get(e,0) + 1 - - * Accumulating references in a dictionary of lists: - - for pagenumber, page in enumerate(pages): - for word in page: - d.setdefault(word, []).append(pagenumber) - - Note, the second example is a use case characterized by a get and set - to the same key. There are similar use cases with a __contains__ - followed by a get, set, or del to the same key. Part of the - justification for d.setdefault is combining the two lookups into one. - -Membership Testing - Dictionaries of any size. Created once and then rarely changes. - Single write to each key. - Many calls to __contains__() or has_key(). - Similar access patterns occur with replacement dictionaries - such as with the % formatting operator. - -Dynamic Mappings - Characterized by deletions interspersed with adds and replacements. - Performance benefits greatly from the re-use of dummy entries. - -Data Layout ------------ - -Dictionaries are composed of 3 components: -The dictobject struct itself -A dict-keys object (keys & hashes) -A values array - - -Tunable Dictionary Parameters ------------------------------ - -See comments for PyDict_MINSIZE_SPLIT, PyDict_MINSIZE_COMBINED, -USABLE_FRACTION and GROWTH_RATE in dictobject.c - -Tune-ups should be measured across a broad range of applications and -use cases. A change to any parameter will help in some situations and -hurt in others. The key is to find settings that help the most common -cases and do the least damage to the less common cases. Results will -vary dramatically depending on the exact number of keys, whether the -keys are all strings, whether reads or writes dominate, the exact -hash values of the keys (some sets of values have fewer collisions than -others). Any one test or benchmark is likely to prove misleading. - -While making a dictionary more sparse reduces collisions, it impairs -iteration and key listing. Those methods loop over every potential -entry. Doubling the size of dictionary results in twice as many -non-overlapping memory accesses for keys(), items(), values(), -__iter__(), iterkeys(), iteritems(), itervalues(), and update(). -Also, every dictionary iterates at least twice, once for the memset() -when it is created and once by dealloc(). - -Dictionary operations involving only a single key can be O(1) unless -resizing is possible. By checking for a resize only when the -dictionary can grow (and may *require* resizing), other operations -remain O(1), and the odds of resize thrashing or memory fragmentation -are reduced. In particular, an algorithm that empties a dictionary -by repeatedly invoking .pop will see no resizing, which might -not be necessary at all because the dictionary is eventually -discarded entirely. - -The key differences between this implementation and earlier versions are: - 1. The table can be split into two parts, the keys and the values. - - 2. There is an additional key-value combination: (key, NULL). - Unlike (, NULL) which represents a deleted value, (key, NULL) - represented a yet to be inserted value. This combination can only occur - when the table is split. - - 3. No small table embedded in the dict, - as this would make sharing of key-tables impossible. - - -These changes have the following consequences. - 1. General dictionaries are slightly larger. - - 2. All object dictionaries of a single class can share a single key-table, - saving about 60% memory for such cases. - -Results of Cache Locality Experiments --------------------------------------- - -Experiments on an earlier design of dictionary, in which all tables were -combined, showed the following: - - When an entry is retrieved from memory, several adjacent entries are also - retrieved into a cache line. Since accessing items in cache is *much* - cheaper than a cache miss, an enticing idea is to probe the adjacent - entries as a first step in collision resolution. Unfortunately, the - introduction of any regularity into collision searches results in more - collisions than the current random chaining approach. - - Exploiting cache locality at the expense of additional collisions fails - to payoff when the entries are already loaded in cache (the expense - is paid with no compensating benefit). This occurs in small dictionaries - where the whole dictionary fits into a pair of cache lines. It also - occurs frequently in large dictionaries which have a common access pattern - where some keys are accessed much more frequently than others. The - more popular entries *and* their collision chains tend to remain in cache. - - To exploit cache locality, change the collision resolution section - in lookdict() and lookdict_string(). Set i^=1 at the top of the - loop and move the i = (i << 2) + i + perturb + 1 to an unrolled - version of the loop. - -For split tables, the above will apply to the keys, but the value will -always be in a different cache line from the key. - - diff --git a/third_party/python/Objects/dictobject.c b/third_party/python/Objects/dictobject.c index b55e49c4c..d4e501d9d 100644 --- a/third_party/python/Objects/dictobject.c +++ b/third_party/python/Objects/dictobject.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Dictionary object implementation using a hash table */ /* The distribution includes a separate file, Objects/dictnotes.txt, @@ -109,9 +110,9 @@ converting the dict to the combined table. */ #define PyDict_MINSIZE 8 -#include "Python.h" -#include "dict-common.h" -#include "stringlib/eq.h" /* to get unicode_eq() */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Objects/dict-common.h" +#include "third_party/python/Objects/stringlib/eq.inc" /* to get unicode_eq() */ /*[clinic input] class dict "PyDictObject *" "&PyDict_Type" @@ -255,7 +256,7 @@ static int numfree = 0; static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; static int numfreekeys = 0; -#include "clinic/dictobject.c.h" +#include "third_party/python/Objects/clinic/dictobject.inc" int PyDict_ClearFreeList(void) diff --git a/third_party/python/Objects/enumobject.c b/third_party/python/Objects/enumobject.c index b92b8987f..7dd989cc3 100644 --- a/third_party/python/Objects/enumobject.c +++ b/third_party/python/Objects/enumobject.c @@ -1,6 +1,7 @@ +/* clang-format off */ /* enumerate object */ -#include "Python.h" +#include "third_party/python/Include/Python.h" typedef struct { PyObject_HEAD diff --git a/third_party/python/Objects/exceptions.c b/third_party/python/Objects/exceptions.c index 6f3b986d3..502688f35 100644 --- a/third_party/python/Objects/exceptions.c +++ b/third_party/python/Objects/exceptions.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* * New exceptions.c written in Iceland by Richard Jones and Georg Brandl. * @@ -5,9 +6,9 @@ */ #define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" -#include "osdefs.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/osdefs.h" /* Compatibility aliases */ diff --git a/third_party/python/Objects/fileobject.c b/third_party/python/Objects/fileobject.c index 58cc47577..78e2e6b99 100644 --- a/third_party/python/Objects/fileobject.c +++ b/third_party/python/Objects/fileobject.c @@ -1,7 +1,8 @@ +/* clang-format off */ /* File object implementation (what's left of it -- see io.py) */ #define PY_SSIZE_T_CLEAN -#include "Python.h" +#include "third_party/python/Include/Python.h" #include "libc/stdio/unlocked.h" #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER) @@ -21,10 +22,6 @@ #define NEWLINE_LF 2 /* \n newline seen */ #define NEWLINE_CRLF 4 /* \r\n newline seen */ -#ifdef __cplusplus -extern "C" { -#endif - /* External C interface */ PyObject * @@ -525,8 +522,3 @@ PyTypeObject PyStdPrinter_Type = { stdprinter_new, /* tp_new */ PyObject_Del, /* tp_free */ }; - - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Objects/floatobject.c b/third_party/python/Objects/floatobject.c index f5ce29567..6a6e5ff08 100644 --- a/third_party/python/Objects/floatobject.c +++ b/third_party/python/Objects/floatobject.c @@ -1,15 +1,12 @@ +/* clang-format off */ /* Float object implementation */ /* XXX There should be overflow checks here, but it's hard to check for any kind of float exception without losing portability. */ -#include "Python.h" +#include "third_party/python/Include/Python.h" #include "libc/runtime/fenv.h" -#include -#include - - /* Special free list free_list is a singly-linked list of available PyFloatObjects, linked via abuse of their ob_type members. diff --git a/third_party/python/Objects/frameobject.c b/third_party/python/Objects/frameobject.c index 535ec46ee..0ce969fd2 100644 --- a/third_party/python/Objects/frameobject.c +++ b/third_party/python/Objects/frameobject.c @@ -1,11 +1,11 @@ +/* clang-format off */ /* Frame object implementation */ -#include "Python.h" - -#include "code.h" -#include "frameobject.h" -#include "opcode.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/code.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Include/opcode.h" +#include "third_party/python/Include/structmember.h" #define OFF(x) offsetof(PyFrameObject, x) diff --git a/third_party/python/Objects/funcobject.c b/third_party/python/Objects/funcobject.c index e66fda369..ee6e5053d 100644 --- a/third_party/python/Objects/funcobject.c +++ b/third_party/python/Objects/funcobject.c @@ -1,9 +1,10 @@ +/* clang-format off */ /* Function object implementation */ -#include "Python.h" -#include "code.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/code.h" +#include "third_party/python/Include/structmember.h" PyObject * PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) diff --git a/third_party/python/Objects/genobject.c b/third_party/python/Objects/genobject.c index d1136301f..72ed18347 100644 --- a/third_party/python/Objects/genobject.c +++ b/third_party/python/Objects/genobject.c @@ -1,9 +1,10 @@ +/* clang-format off */ /* Generator object implementation */ -#include "Python.h" -#include "frameobject.h" -#include "structmember.h" -#include "opcode.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Include/opcode.h" static PyObject *gen_close(PyGenObject *, PyObject *); static PyObject *async_gen_asend_new(PyAsyncGenObject *, PyObject *); diff --git a/third_party/python/Objects/iterobject.c b/third_party/python/Objects/iterobject.c index 75b2fcbd4..18506ca85 100644 --- a/third_party/python/Objects/iterobject.c +++ b/third_party/python/Objects/iterobject.c @@ -1,6 +1,7 @@ +/* clang-format off */ /* Iterator objects */ -#include "Python.h" +#include "third_party/python/Include/Python.h" typedef struct { PyObject_HEAD diff --git a/third_party/python/Objects/listobject.c b/third_party/python/Objects/listobject.c index ea8310f15..b5e9eecfa 100644 --- a/third_party/python/Objects/listobject.c +++ b/third_party/python/Objects/listobject.c @@ -1,13 +1,8 @@ +/* clang-format off */ /* List object implementation */ -#include "Python.h" -#include "accu.h" - -#ifdef STDC_HEADERS -#include -#else -#include /* For size_t */ -#endif +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/accu.h" /* Ensure ob_item has room for at least newsize elements, and set * ob_size to newsize. If newsize > ob_size on entry, the content diff --git a/third_party/python/Objects/listsort.txt b/third_party/python/Objects/listsort.txt deleted file mode 100644 index 17d27973f..000000000 --- a/third_party/python/Objects/listsort.txt +++ /dev/null @@ -1,755 +0,0 @@ -Intro ------ -This describes an adaptive, stable, natural mergesort, modestly called -timsort (hey, I earned it ). It has supernatural performance on many -kinds of partially ordered arrays (less than lg(N!) comparisons needed, and -as few as N-1), yet as fast as Python's previous highly tuned samplesort -hybrid on random arrays. - -In a nutshell, the main routine marches over the array once, left to right, -alternately identifying the next run, then merging it into the previous -runs "intelligently". Everything else is complication for speed, and some -hard-won measure of memory efficiency. - - -Comparison with Python's Samplesort Hybrid ------------------------------------------- -+ timsort can require a temp array containing as many as N//2 pointers, - which means as many as 2*N extra bytes on 32-bit boxes. It can be - expected to require a temp array this large when sorting random data; on - data with significant structure, it may get away without using any extra - heap memory. This appears to be the strongest argument against it, but - compared to the size of an object, 2 temp bytes worst-case (also expected- - case for random data) doesn't scare me much. - - It turns out that Perl is moving to a stable mergesort, and the code for - that appears always to require a temp array with room for at least N - pointers. (Note that I wouldn't want to do that even if space weren't an - issue; I believe its efforts at memory frugality also save timsort - significant pointer-copying costs, and allow it to have a smaller working - set.) - -+ Across about four hours of generating random arrays, and sorting them - under both methods, samplesort required about 1.5% more comparisons - (the program is at the end of this file). - -+ In real life, this may be faster or slower on random arrays than - samplesort was, depending on platform quirks. Since it does fewer - comparisons on average, it can be expected to do better the more - expensive a comparison function is. OTOH, it does more data movement - (pointer copying) than samplesort, and that may negate its small - comparison advantage (depending on platform quirks) unless comparison - is very expensive. - -+ On arrays with many kinds of pre-existing order, this blows samplesort out - of the water. It's significantly faster than samplesort even on some - cases samplesort was special-casing the snot out of. I believe that lists - very often do have exploitable partial order in real life, and this is the - strongest argument in favor of timsort (indeed, samplesort's special cases - for extreme partial order are appreciated by real users, and timsort goes - much deeper than those, in particular naturally covering every case where - someone has suggested "and it would be cool if list.sort() had a special - case for this too ... and for that ..."). - -+ Here are exact comparison counts across all the tests in sortperf.py, - when run with arguments "15 20 1". - - Column Key: - *sort: random data - \sort: descending data - /sort: ascending data - 3sort: ascending, then 3 random exchanges - +sort: ascending, then 10 random at the end - %sort: ascending, then randomly replace 1% of elements w/ random values - ~sort: many duplicates - =sort: all equal - !sort: worst case scenario - - First the trivial cases, trivial for samplesort because it special-cased - them, and trivial for timsort because it naturally works on runs. Within - an "n" block, the first line gives the # of compares done by samplesort, - the second line by timsort, and the third line is the percentage by - which the samplesort count exceeds the timsort count: - - n \sort /sort =sort -------- ------ ------ ------ - 32768 32768 32767 32767 samplesort - 32767 32767 32767 timsort - 0.00% 0.00% 0.00% (samplesort - timsort) / timsort - - 65536 65536 65535 65535 - 65535 65535 65535 - 0.00% 0.00% 0.00% - - 131072 131072 131071 131071 - 131071 131071 131071 - 0.00% 0.00% 0.00% - - 262144 262144 262143 262143 - 262143 262143 262143 - 0.00% 0.00% 0.00% - - 524288 524288 524287 524287 - 524287 524287 524287 - 0.00% 0.00% 0.00% - -1048576 1048576 1048575 1048575 - 1048575 1048575 1048575 - 0.00% 0.00% 0.00% - - The algorithms are effectively identical in these cases, except that - timsort does one less compare in \sort. - - Now for the more interesting cases. Where lg(x) is the logarithm of x to - the base 2 (e.g., lg(8)=3), lg(n!) is the information-theoretic limit for - the best any comparison-based sorting algorithm can do on average (across - all permutations). When a method gets significantly below that, it's - either astronomically lucky, or is finding exploitable structure in the - data. - - - n lg(n!) *sort 3sort +sort %sort ~sort !sort -------- ------- ------ ------- ------- ------ ------- -------- - 32768 444255 453096 453614 32908 452871 130491 469141 old - 448885 33016 33007 50426 182083 65534 new - 0.94% 1273.92% -0.30% 798.09% -28.33% 615.87% %ch from new - - 65536 954037 972699 981940 65686 973104 260029 1004607 - 962991 65821 65808 101667 364341 131070 - 1.01% 1391.83% -0.19% 857.15% -28.63% 666.47% - - 131072 2039137 2101881 2091491 131232 2092894 554790 2161379 - 2057533 131410 131361 206193 728871 262142 - 2.16% 1491.58% -0.10% 915.02% -23.88% 724.51% - - 262144 4340409 4464460 4403233 262314 4445884 1107842 4584560 - 4377402 262437 262459 416347 1457945 524286 - 1.99% 1577.82% -0.06% 967.83% -24.01% 774.44% - - 524288 9205096 9453356 9408463 524468 9441930 2218577 9692015 - 9278734 524580 524633 837947 2916107 1048574 - 1.88% 1693.52% -0.03% 1026.79% -23.92% 824.30% - -1048576 19458756 19950272 19838588 1048766 19912134 4430649 20434212 - 19606028 1048958 1048941 1694896 5832445 2097150 - 1.76% 1791.27% -0.02% 1074.83% -24.03% 874.38% - - Discussion of cases: - - *sort: There's no structure in random data to exploit, so the theoretical - limit is lg(n!). Both methods get close to that, and timsort is hugging - it (indeed, in a *marginal* sense, it's a spectacular improvement -- - there's only about 1% left before hitting the wall, and timsort knows - darned well it's doing compares that won't pay on random data -- but so - does the samplesort hybrid). For contrast, Hoare's original random-pivot - quicksort does about 39% more compares than the limit, and the median-of-3 - variant about 19% more. - - 3sort, %sort, and !sort: No contest; there's structure in this data, but - not of the specific kinds samplesort special-cases. Note that structure - in !sort wasn't put there on purpose -- it was crafted as a worst case for - a previous quicksort implementation. That timsort nails it came as a - surprise to me (although it's obvious in retrospect). - - +sort: samplesort special-cases this data, and does a few less compares - than timsort. However, timsort runs this case significantly faster on all - boxes we have timings for, because timsort is in the business of merging - runs efficiently, while samplesort does much more data movement in this - (for it) special case. - - ~sort: samplesort's special cases for large masses of equal elements are - extremely effective on ~sort's specific data pattern, and timsort just - isn't going to get close to that, despite that it's clearly getting a - great deal of benefit out of the duplicates (the # of compares is much less - than lg(n!)). ~sort has a perfectly uniform distribution of just 4 - distinct values, and as the distribution gets more skewed, samplesort's - equal-element gimmicks become less effective, while timsort's adaptive - strategies find more to exploit; in a database supplied by Kevin Altis, a - sort on its highly skewed "on which stock exchange does this company's - stock trade?" field ran over twice as fast under timsort. - - However, despite that timsort does many more comparisons on ~sort, and - that on several platforms ~sort runs highly significantly slower under - timsort, on other platforms ~sort runs highly significantly faster under - timsort. No other kind of data has shown this wild x-platform behavior, - and we don't have an explanation for it. The only thing I can think of - that could transform what "should be" highly significant slowdowns into - highly significant speedups on some boxes are catastrophic cache effects - in samplesort. - - But timsort "should be" slower than samplesort on ~sort, so it's hard - to count that it isn't on some boxes as a strike against it . - -+ Here's the highwater mark for the number of heap-based temp slots (4 - bytes each on this box) needed by each test, again with arguments - "15 20 1": - - 2**i *sort \sort /sort 3sort +sort %sort ~sort =sort !sort - 32768 16384 0 0 6256 0 10821 12288 0 16383 - 65536 32766 0 0 21652 0 31276 24576 0 32767 - 131072 65534 0 0 17258 0 58112 49152 0 65535 - 262144 131072 0 0 35660 0 123561 98304 0 131071 - 524288 262142 0 0 31302 0 212057 196608 0 262143 -1048576 524286 0 0 312438 0 484942 393216 0 524287 - - Discussion: The tests that end up doing (close to) perfectly balanced - merges (*sort, !sort) need all N//2 temp slots (or almost all). ~sort - also ends up doing balanced merges, but systematically benefits a lot from - the preliminary pre-merge searches described under "Merge Memory" later. - %sort approaches having a balanced merge at the end because the random - selection of elements to replace is expected to produce an out-of-order - element near the midpoint. \sort, /sort, =sort are the trivial one-run - cases, needing no merging at all. +sort ends up having one very long run - and one very short, and so gets all the temp space it needs from the small - temparray member of the MergeState struct (note that the same would be - true if the new random elements were prefixed to the sorted list instead, - but not if they appeared "in the middle"). 3sort approaches N//3 temp - slots twice, but the run lengths that remain after 3 random exchanges - clearly has very high variance. - - -A detailed description of timsort follows. - -Runs ----- -count_run() returns the # of elements in the next run. A run is either -"ascending", which means non-decreasing: - - a0 <= a1 <= a2 <= ... - -or "descending", which means strictly decreasing: - - a0 > a1 > a2 > ... - -Note that a run is always at least 2 long, unless we start at the array's -last element. - -The definition of descending is strict, because the main routine reverses -a descending run in-place, transforming a descending run into an ascending -run. Reversal is done via the obvious fast "swap elements starting at each -end, and converge at the middle" method, and that can violate stability if -the slice contains any equal elements. Using a strict definition of -descending ensures that a descending run contains distinct elements. - -If an array is random, it's very unlikely we'll see long runs. If a natural -run contains less than minrun elements (see next section), the main loop -artificially boosts it to minrun elements, via a stable binary insertion sort -applied to the right number of array elements following the short natural -run. In a random array, *all* runs are likely to be minrun long as a -result. This has two primary good effects: - -1. Random data strongly tends then toward perfectly balanced (both runs have - the same length) merges, which is the most efficient way to proceed when - data is random. - -2. Because runs are never very short, the rest of the code doesn't make - heroic efforts to shave a few cycles off per-merge overheads. For - example, reasonable use of function calls is made, rather than trying to - inline everything. Since there are no more than N/minrun runs to begin - with, a few "extra" function calls per merge is barely measurable. - - -Computing minrun ----------------- -If N < 64, minrun is N. IOW, binary insertion sort is used for the whole -array then; it's hard to beat that given the overheads of trying something -fancier (see note BINSORT). - -When N is a power of 2, testing on random data showed that minrun values of -16, 32, 64 and 128 worked about equally well. At 256 the data-movement cost -in binary insertion sort clearly hurt, and at 8 the increase in the number -of function calls clearly hurt. Picking *some* power of 2 is important -here, so that the merges end up perfectly balanced (see next section). We -pick 32 as a good value in the sweet range; picking a value at the low end -allows the adaptive gimmicks more opportunity to exploit shorter natural -runs. - -Because sortperf.py only tries powers of 2, it took a long time to notice -that 32 isn't a good choice for the general case! Consider N=2112: - ->>> divmod(2112, 32) -(66, 0) ->>> - -If the data is randomly ordered, we're very likely to end up with 66 runs -each of length 32. The first 64 of these trigger a sequence of perfectly -balanced merges (see next section), leaving runs of lengths 2048 and 64 to -merge at the end. The adaptive gimmicks can do that with fewer than 2048+64 -compares, but it's still more compares than necessary, and-- mergesort's -bugaboo relative to samplesort --a lot more data movement (O(N) copies just -to get 64 elements into place). - -If we take minrun=33 in this case, then we're very likely to end up with 64 -runs each of length 33, and then all merges are perfectly balanced. Better! - -What we want to avoid is picking minrun such that in - - q, r = divmod(N, minrun) - -q is a power of 2 and r>0 (then the last merge only gets r elements into -place, and r < minrun is small compared to N), or q a little larger than a -power of 2 regardless of r (then we've got a case similar to "2112", again -leaving too little work for the last merge to do). - -Instead we pick a minrun in range(32, 65) such that N/minrun is exactly a -power of 2, or if that isn't possible, is close to, but strictly less than, -a power of 2. This is easier to do than it may sound: take the first 6 -bits of N, and add 1 if any of the remaining bits are set. In fact, that -rule covers every case in this section, including small N and exact powers -of 2; merge_compute_minrun() is a deceptively simple function. - - -The Merge Pattern ------------------ -In order to exploit regularities in the data, we're merging on natural -run lengths, and they can become wildly unbalanced. That's a Good Thing -for this sort! It means we have to find a way to manage an assortment of -potentially very different run lengths, though. - -Stability constrains permissible merging patterns. For example, if we have -3 consecutive runs of lengths - - A:10000 B:20000 C:10000 - -we dare not merge A with C first, because if A, B and C happen to contain -a common element, it would get out of order wrt its occurrence(s) in B. The -merging must be done as (A+B)+C or A+(B+C) instead. - -So merging is always done on two consecutive runs at a time, and in-place, -although this may require some temp memory (more on that later). - -When a run is identified, its base address and length are pushed on a stack -in the MergeState struct. merge_collapse() is then called to see whether it -should merge it with preceding run(s). We would like to delay merging as -long as possible in order to exploit patterns that may come up later, but we -like even more to do merging as soon as possible to exploit that the run just -found is still high in the memory hierarchy. We also can't delay merging -"too long" because it consumes memory to remember the runs that are still -unmerged, and the stack has a fixed size. - -What turned out to be a good compromise maintains two invariants on the -stack entries, where A, B and C are the lengths of the three righmost not-yet -merged slices: - -1. A > B+C -2. B > C - -Note that, by induction, #2 implies the lengths of pending runs form a -decreasing sequence. #1 implies that, reading the lengths right to left, -the pending-run lengths grow at least as fast as the Fibonacci numbers. -Therefore the stack can never grow larger than about log_base_phi(N) entries, -where phi = (1+sqrt(5))/2 ~= 1.618. Thus a small # of stack slots suffice -for very large arrays. - -If A <= B+C, the smaller of A and C is merged with B (ties favor C, for the -freshness-in-cache reason), and the new run replaces the A,B or B,C entries; -e.g., if the last 3 entries are - - A:30 B:20 C:10 - -then B is merged with C, leaving - - A:30 BC:30 - -on the stack. Or if they were - - A:500 B:400: C:1000 - -then A is merged with B, leaving - - AB:900 C:1000 - -on the stack. - -In both examples, the stack configuration after the merge still violates -invariant #2, and merge_collapse() goes on to continue merging runs until -both invariants are satisfied. As an extreme case, suppose we didn't do the -minrun gimmick, and natural runs were of lengths 128, 64, 32, 16, 8, 4, 2, -and 2. Nothing would get merged until the final 2 was seen, and that would -trigger 7 perfectly balanced merges. - -The thrust of these rules when they trigger merging is to balance the run -lengths as closely as possible, while keeping a low bound on the number of -runs we have to remember. This is maximally effective for random data, -where all runs are likely to be of (artificially forced) length minrun, and -then we get a sequence of perfectly balanced merges (with, perhaps, some -oddballs at the end). - -OTOH, one reason this sort is so good for partly ordered data has to do -with wildly unbalanced run lengths. - - -Merge Memory ------------- -Merging adjacent runs of lengths A and B in-place, and in linear time, is -difficult. Theoretical constructions are known that can do it, but they're -too difficult and slow for practical use. But if we have temp memory equal -to min(A, B), it's easy. - -If A is smaller (function merge_lo), copy A to a temp array, leave B alone, -and then we can do the obvious merge algorithm left to right, from the temp -area and B, starting the stores into where A used to live. There's always a -free area in the original area comprising a number of elements equal to the -number not yet merged from the temp array (trivially true at the start; -proceed by induction). The only tricky bit is that if a comparison raises an -exception, we have to remember to copy the remaining elements back in from -the temp area, lest the array end up with duplicate entries from B. But -that's exactly the same thing we need to do if we reach the end of B first, -so the exit code is pleasantly common to both the normal and error cases. - -If B is smaller (function merge_hi, which is merge_lo's "mirror image"), -much the same, except that we need to merge right to left, copying B into a -temp array and starting the stores at the right end of where B used to live. - -A refinement: When we're about to merge adjacent runs A and B, we first do -a form of binary search (more on that later) to see where B[0] should end up -in A. Elements in A preceding that point are already in their final -positions, effectively shrinking the size of A. Likewise we also search to -see where A[-1] should end up in B, and elements of B after that point can -also be ignored. This cuts the amount of temp memory needed by the same -amount. - -These preliminary searches may not pay off, and can be expected *not* to -repay their cost if the data is random. But they can win huge in all of -time, copying, and memory savings when they do pay, so this is one of the -"per-merge overheads" mentioned above that we're happy to endure because -there is at most one very short run. It's generally true in this algorithm -that we're willing to gamble a little to win a lot, even though the net -expectation is negative for random data. - - -Merge Algorithms ----------------- -merge_lo() and merge_hi() are where the bulk of the time is spent. merge_lo -deals with runs where A <= B, and merge_hi where A > B. They don't know -whether the data is clustered or uniform, but a lovely thing about merging -is that many kinds of clustering "reveal themselves" by how many times in a -row the winning merge element comes from the same run. We'll only discuss -merge_lo here; merge_hi is exactly analogous. - -Merging begins in the usual, obvious way, comparing the first element of A -to the first of B, and moving B[0] to the merge area if it's less than A[0], -else moving A[0] to the merge area. Call that the "one pair at a time" -mode. The only twist here is keeping track of how many times in a row "the -winner" comes from the same run. - -If that count reaches MIN_GALLOP, we switch to "galloping mode". Here -we *search* B for where A[0] belongs, and move over all the B's before -that point in one chunk to the merge area, then move A[0] to the merge -area. Then we search A for where B[0] belongs, and similarly move a -slice of A in one chunk. Then back to searching B for where A[0] belongs, -etc. We stay in galloping mode until both searches find slices to copy -less than MIN_GALLOP elements long, at which point we go back to one-pair- -at-a-time mode. - -A refinement: The MergeState struct contains the value of min_gallop that -controls when we enter galloping mode, initialized to MIN_GALLOP. -merge_lo() and merge_hi() adjust this higher when galloping isn't paying -off, and lower when it is. - - -Galloping ---------- -Still without loss of generality, assume A is the shorter run. In galloping -mode, we first look for A[0] in B. We do this via "galloping", comparing -A[0] in turn to B[0], B[1], B[3], B[7], ..., B[2**j - 1], ..., until finding -the k such that B[2**(k-1) - 1] < A[0] <= B[2**k - 1]. This takes at most -roughly lg(B) comparisons, and, unlike a straight binary search, favors -finding the right spot early in B (more on that later). - -After finding such a k, the region of uncertainty is reduced to 2**(k-1) - 1 -consecutive elements, and a straight binary search requires exactly k-1 -additional comparisons to nail it (see note REGION OF UNCERTAINTY). Then we -copy all the B's up to that point in one chunk, and then copy A[0]. Note -that no matter where A[0] belongs in B, the combination of galloping + binary -search finds it in no more than about 2*lg(B) comparisons. - -If we did a straight binary search, we could find it in no more than -ceiling(lg(B+1)) comparisons -- but straight binary search takes that many -comparisons no matter where A[0] belongs. Straight binary search thus loses -to galloping unless the run is quite long, and we simply can't guess -whether it is in advance. - -If data is random and runs have the same length, A[0] belongs at B[0] half -the time, at B[1] a quarter of the time, and so on: a consecutive winning -sub-run in B of length k occurs with probability 1/2**(k+1). So long -winning sub-runs are extremely unlikely in random data, and guessing that a -winning sub-run is going to be long is a dangerous game. - -OTOH, if data is lopsided or lumpy or contains many duplicates, long -stretches of winning sub-runs are very likely, and cutting the number of -comparisons needed to find one from O(B) to O(log B) is a huge win. - -Galloping compromises by getting out fast if there isn't a long winning -sub-run, yet finding such very efficiently when they exist. - -I first learned about the galloping strategy in a related context; see: - - "Adaptive Set Intersections, Unions, and Differences" (2000) - Erik D. Demaine, Alejandro López-Ortiz, J. Ian Munro - -and its followup(s). An earlier paper called the same strategy -"exponential search": - - "Optimistic Sorting and Information Theoretic Complexity" - Peter McIlroy - SODA (Fourth Annual ACM-SIAM Symposium on Discrete Algorithms), pp - 467-474, Austin, Texas, 25-27 January 1993. - -and it probably dates back to an earlier paper by Bentley and Yao. The -McIlroy paper in particular has good analysis of a mergesort that's -probably strongly related to this one in its galloping strategy. - - -Galloping with a Broken Leg ---------------------------- -So why don't we always gallop? Because it can lose, on two counts: - -1. While we're willing to endure small per-merge overheads, per-comparison - overheads are a different story. Calling Yet Another Function per - comparison is expensive, and gallop_left() and gallop_right() are - too long-winded for sane inlining. - -2. Galloping can-- alas --require more comparisons than linear one-at-time - search, depending on the data. - -#2 requires details. If A[0] belongs before B[0], galloping requires 1 -compare to determine that, same as linear search, except it costs more -to call the gallop function. If A[0] belongs right before B[1], galloping -requires 2 compares, again same as linear search. On the third compare, -galloping checks A[0] against B[3], and if it's <=, requires one more -compare to determine whether A[0] belongs at B[2] or B[3]. That's a total -of 4 compares, but if A[0] does belong at B[2], linear search would have -discovered that in only 3 compares, and that's a huge loss! Really. It's -an increase of 33% in the number of compares needed, and comparisons are -expensive in Python. - -index in B where # compares linear # gallop # binary gallop -A[0] belongs search needs compares compares total ----------------- ----------------- -------- -------- ------ - 0 1 1 0 1 - - 1 2 2 0 2 - - 2 3 3 1 4 - 3 4 3 1 4 - - 4 5 4 2 6 - 5 6 4 2 6 - 6 7 4 2 6 - 7 8 4 2 6 - - 8 9 5 3 8 - 9 10 5 3 8 - 10 11 5 3 8 - 11 12 5 3 8 - ... - -In general, if A[0] belongs at B[i], linear search requires i+1 comparisons -to determine that, and galloping a total of 2*floor(lg(i))+2 comparisons. -The advantage of galloping is unbounded as i grows, but it doesn't win at -all until i=6. Before then, it loses twice (at i=2 and i=4), and ties -at the other values. At and after i=6, galloping always wins. - -We can't guess in advance when it's going to win, though, so we do one pair -at a time until the evidence seems strong that galloping may pay. MIN_GALLOP -is 7, and that's pretty strong evidence. However, if the data is random, it -simply will trigger galloping mode purely by luck every now and again, and -it's quite likely to hit one of the losing cases next. On the other hand, -in cases like ~sort, galloping always pays, and MIN_GALLOP is larger than it -"should be" then. So the MergeState struct keeps a min_gallop variable -that merge_lo and merge_hi adjust: the longer we stay in galloping mode, -the smaller min_gallop gets, making it easier to transition back to -galloping mode (if we ever leave it in the current merge, and at the -start of the next merge). But whenever the gallop loop doesn't pay, -min_gallop is increased by one, making it harder to transition back -to galloping mode (and again both within a merge and across merges). For -random data, this all but eliminates the gallop penalty: min_gallop grows -large enough that we almost never get into galloping mode. And for cases -like ~sort, min_gallop can fall to as low as 1. This seems to work well, -but in all it's a minor improvement over using a fixed MIN_GALLOP value. - - -Galloping Complication ----------------------- -The description above was for merge_lo. merge_hi has to merge "from the -other end", and really needs to gallop starting at the last element in a run -instead of the first. Galloping from the first still works, but does more -comparisons than it should (this is significant -- I timed it both ways). For -this reason, the gallop_left() and gallop_right() (see note LEFT OR RIGHT) -functions have a "hint" argument, which is the index at which galloping -should begin. So galloping can actually start at any index, and proceed at -offsets of 1, 3, 7, 15, ... or -1, -3, -7, -15, ... from the starting index. - -In the code as I type it's always called with either 0 or n-1 (where n is -the # of elements in a run). It's tempting to try to do something fancier, -melding galloping with some form of interpolation search; for example, if -we're merging a run of length 1 with a run of length 10000, index 5000 is -probably a better guess at the final result than either 0 or 9999. But -it's unclear how to generalize that intuition usefully, and merging of -wildly unbalanced runs already enjoys excellent performance. - -~sort is a good example of when balanced runs could benefit from a better -hint value: to the extent possible, this would like to use a starting -offset equal to the previous value of acount/bcount. Doing so saves about -10% of the compares in ~sort. However, doing so is also a mixed bag, -hurting other cases. - - -Comparing Average # of Compares on Random Arrays ------------------------------------------------- -[NOTE: This was done when the new algorithm used about 0.1% more compares - on random data than does its current incarnation.] - -Here list.sort() is samplesort, and list.msort() this sort: - -""" -import random -from time import clock as now - -def fill(n): - from random import random - return [random() for i in range(n)] - -def mycmp(x, y): - global ncmp - ncmp += 1 - return cmp(x, y) - -def timeit(values, method): - global ncmp - X = values[:] - bound = getattr(X, method) - ncmp = 0 - t1 = now() - bound(mycmp) - t2 = now() - return t2-t1, ncmp - -format = "%5s %9.2f %11d" -f2 = "%5s %9.2f %11.2f" - -def drive(): - count = sst = sscmp = mst = mscmp = nelts = 0 - while True: - n = random.randrange(100000) - nelts += n - x = fill(n) - - t, c = timeit(x, 'sort') - sst += t - sscmp += c - - t, c = timeit(x, 'msort') - mst += t - mscmp += c - - count += 1 - if count % 10: - continue - - print "count", count, "nelts", nelts - print format % ("sort", sst, sscmp) - print format % ("msort", mst, mscmp) - print f2 % ("", (sst-mst)*1e2/mst, (sscmp-mscmp)*1e2/mscmp) - -drive() -""" - -I ran this on Windows and kept using the computer lightly while it was -running. time.clock() is wall-clock time on Windows, with better than -microsecond resolution. samplesort started with a 1.52% #-of-comparisons -disadvantage, fell quickly to 1.48%, and then fluctuated within that small -range. Here's the last chunk of output before I killed the job: - -count 2630 nelts 130906543 - sort 6110.80 1937887573 -msort 6002.78 1909389381 - 1.80 1.49 - -We've done nearly 2 billion comparisons apiece at Python speed there, and -that's enough . - -For random arrays of size 2 (yes, there are only 2 interesting ones), -samplesort has a 50%(!) comparison disadvantage. This is a consequence of -samplesort special-casing at most one ascending run at the start, then -falling back to the general case if it doesn't find an ascending run -immediately. The consequence is that it ends up using two compares to sort -[2, 1]. Gratifyingly, timsort doesn't do any special-casing, so had to be -taught how to deal with mixtures of ascending and descending runs -efficiently in all cases. - - -NOTES ------ - -BINSORT -A "binary insertion sort" is just like a textbook insertion sort, but instead -of locating the correct position of the next item via linear (one at a time) -search, an equivalent to Python's bisect.bisect_right is used to find the -correct position in logarithmic time. Most texts don't mention this -variation, and those that do usually say it's not worth the bother: insertion -sort remains quadratic (expected and worst cases) either way. Speeding the -search doesn't reduce the quadratic data movement costs. - -But in CPython's case, comparisons are extraordinarily expensive compared to -moving data, and the details matter. Moving objects is just copying -pointers. Comparisons can be arbitrarily expensive (can invoke arbitrary -user-supplied Python code), but even in simple cases (like 3 < 4) _all_ -decisions are made at runtime: what's the type of the left comparand? the -type of the right? do they need to be coerced to a common type? where's the -code to compare these types? And so on. Even the simplest Python comparison -triggers a large pile of C-level pointer dereferences, conditionals, and -function calls. - -So cutting the number of compares is almost always measurably helpful in -CPython, and the savings swamp the quadratic-time data movement costs for -reasonable minrun values. - - -LEFT OR RIGHT -gallop_left() and gallop_right() are akin to the Python bisect module's -bisect_left() and bisect_right(): they're the same unless the slice they're -searching contains a (at least one) value equal to the value being searched -for. In that case, gallop_left() returns the position immediately before the -leftmost equal value, and gallop_right() the position immediately after the -rightmost equal value. The distinction is needed to preserve stability. In -general, when merging adjacent runs A and B, gallop_left is used to search -thru B for where an element from A belongs, and gallop_right to search thru A -for where an element from B belongs. - - -REGION OF UNCERTAINTY -Two kinds of confusion seem to be common about the claim that after finding -a k such that - - B[2**(k-1) - 1] < A[0] <= B[2**k - 1] - -then a binary search requires exactly k-1 tries to find A[0]'s proper -location. For concreteness, say k=3, so B[3] < A[0] <= B[7]. - -The first confusion takes the form "OK, then the region of uncertainty is at -indices 3, 4, 5, 6 and 7: that's 5 elements, not the claimed 2**(k-1) - 1 = -3"; or the region is viewed as a Python slice and the objection is "but that's -the slice B[3:7], so has 7-3 = 4 elements". Resolution: we've already -compared A[0] against B[3] and against B[7], so A[0]'s correct location is -already known wrt _both_ endpoints. What remains is to find A[0]'s correct -location wrt B[4], B[5] and B[6], which spans 3 elements. Or in general, the -slice (leaving off both endpoints) (2**(k-1)-1)+1 through (2**k-1)-1 -inclusive = 2**(k-1) through (2**k-1)-1 inclusive, which has - (2**k-1)-1 - 2**(k-1) + 1 = - 2**k-1 - 2**(k-1) = - 2*2**k-1 - 2**(k-1) = - (2-1)*2**(k-1) - 1 = - 2**(k-1) - 1 -elements. - -The second confusion: "k-1 = 2 binary searches can find the correct location -among 2**(k-1) = 4 elements, but you're only applying it to 3 elements: we -could make this more efficient by arranging for the region of uncertainty to -span 2**(k-1) elements." Resolution: that confuses "elements" with -"locations". In a slice with N elements, there are N+1 _locations_. In the -example, with the region of uncertainty B[4], B[5], B[6], there are 4 -locations: before B[4], between B[4] and B[5], between B[5] and B[6], and -after B[6]. In general, across 2**(k-1)-1 elements, there are 2**(k-1) -locations. That's why k-1 binary searches are necessary and sufficient. diff --git a/third_party/python/Objects/lnotab_notes.txt b/third_party/python/Objects/lnotab_notes.txt deleted file mode 100644 index 3dab2b986..000000000 --- a/third_party/python/Objects/lnotab_notes.txt +++ /dev/null @@ -1,135 +0,0 @@ -All about co_lnotab, the line number table. - -Code objects store a field named co_lnotab. This is an array of unsigned bytes -disguised as a Python bytes object. It is used to map bytecode offsets to -source code line #s for tracebacks and to identify line number boundaries for -line tracing. - -The array is conceptually a compressed list of - (bytecode offset increment, line number increment) -pairs. The details are important and delicate, best illustrated by example: - - byte code offset source code line number - 0 1 - 6 2 - 50 7 - 350 207 - 361 208 - -Instead of storing these numbers literally, we compress the list by storing only -the difference from one row to the next. Conceptually, the stored list might -look like: - - 0, 1, 6, 1, 44, 5, 300, 200, 11, 1 - -The above doesn't really work, but it's a start. An unsigned byte (byte code -offset) can't hold negative values, or values larger than 255, a signed byte -(line number) can't hold values larger than 127 or less than -128, and the -above example contains two such values. (Note that before 3.6, line number -was also encoded by an unsigned byte.) So we make two tweaks: - - (a) there's a deep assumption that byte code offsets increase monotonically, - and - (b) if byte code offset jumps by more than 255 from one row to the next, or if - source code line number jumps by more than 127 or less than -128 from one row - to the next, more than one pair is written to the table. In case #b, - there's no way to know from looking at the table later how many were written. - That's the delicate part. A user of co_lnotab desiring to find the source - line number corresponding to a bytecode address A should do something like - this: - - lineno = addr = 0 - for addr_incr, line_incr in co_lnotab: - addr += addr_incr - if addr > A: - return lineno - if line_incr >= 0x80: - line_incr -= 0x100 - lineno += line_incr - -(In C, this is implemented by PyCode_Addr2Line().) In order for this to work, -when the addr field increments by more than 255, the line # increment in each -pair generated must be 0 until the remaining addr increment is < 256. So, in -the example above, assemble_lnotab in compile.c should not (as was actually done -until 2.2) expand 300, 200 to - 255, 255, 45, 45, -but to - 255, 0, 45, 127, 0, 73. - -The above is sufficient to reconstruct line numbers for tracebacks, but not for -line tracing. Tracing is handled by PyCode_CheckLineNumber() in codeobject.c -and maybe_call_line_trace() in ceval.c. - -*** Tracing *** - -To a first approximation, we want to call the tracing function when the line -number of the current instruction changes. Re-computing the current line for -every instruction is a little slow, though, so each time we compute the line -number we save the bytecode indices where it's valid: - - *instr_lb <= frame->f_lasti < *instr_ub - -is true so long as execution does not change lines. That is, *instr_lb holds -the first bytecode index of the current line, and *instr_ub holds the first -bytecode index of the next line. As long as the above expression is true, -maybe_call_line_trace() does not need to call PyCode_CheckLineNumber(). Note -that the same line may appear multiple times in the lnotab, either because the -bytecode jumped more than 255 indices between line number changes or because -the compiler inserted the same line twice. Even in that case, *instr_ub holds -the first index of the next line. - -However, we don't *always* want to call the line trace function when the above -test fails. - -Consider this code: - -1: def f(a): -2: while a: -3: print(1) -4: break -5: else: -6: print(2) - -which compiles to this: - - 2 0 SETUP_LOOP 26 (to 28) - >> 2 LOAD_FAST 0 (a) - 4 POP_JUMP_IF_FALSE 18 - - 3 6 LOAD_GLOBAL 0 (print) - 8 LOAD_CONST 1 (1) - 10 CALL_FUNCTION 1 - 12 POP_TOP - - 4 14 BREAK_LOOP - 16 JUMP_ABSOLUTE 2 - >> 18 POP_BLOCK - - 6 20 LOAD_GLOBAL 0 (print) - 22 LOAD_CONST 2 (2) - 24 CALL_FUNCTION 1 - 26 POP_TOP - >> 28 LOAD_CONST 0 (None) - 30 RETURN_VALUE - -If 'a' is false, execution will jump to the POP_BLOCK instruction at offset 18 -and the co_lnotab will claim that execution has moved to line 4, which is wrong. -In this case, we could instead associate the POP_BLOCK with line 5, but that -would break jumps around loops without else clauses. - -We fix this by only calling the line trace function for a forward jump if the -co_lnotab indicates we have jumped to the *start* of a line, i.e. if the current -instruction offset matches the offset given for the start of a line by the -co_lnotab. For backward jumps, however, we always call the line trace function, -which lets a debugger stop on every evaluation of a loop guard (which usually -won't be the first opcode in a line). - -Why do we set f_lineno when tracing, and only just before calling the trace -function? Well, consider the code above when 'a' is true. If stepping through -this with 'n' in pdb, you would stop at line 1 with a "call" type event, then -line events on lines 2, 3, and 4, then a "return" type event -- but because the -code for the return actually falls in the range of the "line 6" opcodes, you -would be shown line 6 during this event. This is a change from the behaviour in -2.2 and before, and I've found it confusing in practice. By setting and using -f_lineno when tracing, one can report a line number different from that -suggested by f_lasti on this one occasion where it's desirable. diff --git a/third_party/python/Objects/longobject.c b/third_party/python/Objects/longobject.c index 3864cec97..601c0c944 100644 --- a/third_party/python/Objects/longobject.c +++ b/third_party/python/Objects/longobject.c @@ -1,13 +1,11 @@ +/* clang-format off */ /* Long (arbitrary precision) integer object implementation */ /* XXX The functional organization of this file is terrible */ -#include "Python.h" -#include "longintrepr.h" - -#include -#include -#include +#include "third_party/python/Include/Python.h" +#include "libc/log/check.h" +#include "third_party/python/Include/longintrepr.h" #ifndef NSMALLPOSINTS #define NSMALLPOSINTS 257 @@ -1583,7 +1581,7 @@ long_to_decimal_string_internal(PyObject *aa, digit *pout, *pin, rem, tenpow; int negative; int d; - enum PyUnicode_Kind kind; + enum PyUnicode_Kind kind = -1; a = (PyLongObject *)aa; if (a == NULL || !PyLong_Check(a)) { @@ -1675,6 +1673,8 @@ long_to_decimal_string_internal(PyObject *aa, kind = PyUnicode_KIND(str); } + CHECK_NE(-1, kind); /* if this fails there's a serious bug upstream */ + #define WRITE_DIGITS(p) \ do { \ /* pout[0] through pout[size-2] contribute exactly \ @@ -1773,7 +1773,7 @@ long_format_binary(PyObject *aa, int base, int alternate, PyObject *v = NULL; Py_ssize_t sz; Py_ssize_t size_a; - enum PyUnicode_Kind kind; + enum PyUnicode_Kind kind = -1; int negative; int bits; @@ -1840,6 +1840,8 @@ long_format_binary(PyObject *aa, int base, int alternate, kind = PyUnicode_KIND(v); } + CHECK_NE(-1, kind); /* if this fails there's a serious bug upstream */ + #define WRITE_DIGITS(p) \ do { \ if (size_a == 0) { \ diff --git a/third_party/python/Objects/memoryobject.c b/third_party/python/Objects/memoryobject.c index 30e005547..1c9b4a9ba 100644 --- a/third_party/python/Objects/memoryobject.c +++ b/third_party/python/Objects/memoryobject.c @@ -1,8 +1,8 @@ +/* clang-format off */ /* Memoryview object implementation */ -#include "Python.h" -#include "pystrhex.h" -#include +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/pystrhex.h" /****************************************************************************/ diff --git a/third_party/python/Objects/methodobject.c b/third_party/python/Objects/methodobject.c index 6794bf21d..f6eda3145 100644 --- a/third_party/python/Objects/methodobject.c +++ b/third_party/python/Objects/methodobject.c @@ -1,8 +1,9 @@ +/* clang-format off */ /* Method object implementation */ -#include "Python.h" -#include "structmember.h" +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* Free list for method objects to safe malloc/free overhead * The m_self element is used to chain the objects. diff --git a/third_party/python/Objects/moduleobject.c b/third_party/python/Objects/moduleobject.c index 0fba90c43..c4bd9c33f 100644 --- a/third_party/python/Objects/moduleobject.c +++ b/third_party/python/Objects/moduleobject.c @@ -1,8 +1,6 @@ - -/* Module object implementation */ - -#include "Python.h" -#include "structmember.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" static Py_ssize_t max_module_number; diff --git a/third_party/python/Objects/namespaceobject.c b/third_party/python/Objects/namespaceobject.c index a810effeb..a6a69a420 100644 --- a/third_party/python/Objects/namespaceobject.c +++ b/third_party/python/Objects/namespaceobject.c @@ -1,8 +1,6 @@ -// namespace object implementation - -#include "Python.h" -#include "structmember.h" - +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" typedef struct { PyObject_HEAD diff --git a/third_party/python/Objects/object.c b/third_party/python/Objects/object.c index a4591355a..794d79f8d 100644 --- a/third_party/python/Objects/object.c +++ b/third_party/python/Objects/object.c @@ -1,12 +1,6 @@ - -/* Generic object operations; and implementation of None */ - -#include "Python.h" -#include "frameobject.h" - -#ifdef __cplusplus -extern "C" { -#endif +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" _Py_IDENTIFIER(Py_Repr); _Py_IDENTIFIER(__bytes__); @@ -2074,7 +2068,3 @@ _Py_Dealloc(PyObject *op) (*Py_TYPE(op)->tp_dealloc)(op); } #endif - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/Objects/obmalloc.c b/third_party/python/Objects/obmalloc.c index 2c6d8f021..6dabf64c0 100644 --- a/third_party/python/Objects/obmalloc.c +++ b/third_party/python/Objects/obmalloc.c @@ -1,6 +1,8 @@ -#include "Python.h" - -#include +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "libc/sysv/consts/map.h" +#include "libc/sysv/consts/map.h" +#include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/prot.h" /* Defined in tracemalloc.c */ @@ -61,14 +63,7 @@ static void _PyMem_DebugCheckAddress(char api_id, const void *p); #ifdef WITH_PYMALLOC -#ifdef MS_WINDOWS -# include -#elif defined(HAVE_MMAP) -# include -# ifdef MAP_ANONYMOUS -# define ARENAS_USE_MMAP -# endif -#endif +#define ARENAS_USE_MMAP /* Forward declaration */ static void* _PyObject_Malloc(void *ctx, size_t size); diff --git a/third_party/python/Objects/odictobject.c b/third_party/python/Objects/odictobject.c index fdeda43bb..4cc308156 100644 --- a/third_party/python/Objects/odictobject.c +++ b/third_party/python/Objects/odictobject.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Ordered Dictionary object implementation. This implementation is necessarily explicitly equivalent to the pure Python @@ -464,11 +465,9 @@ later: */ -#include "Python.h" -#include "structmember.h" -#include "dict-common.h" -#include - +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" +#include "third_party/python/Objects/dict-common.h" typedef struct _odictnode _ODictNode; diff --git a/third_party/python/Objects/rangeobject.c b/third_party/python/Objects/rangeobject.c index 4f392a4c9..0e5d29a1f 100644 --- a/third_party/python/Objects/rangeobject.c +++ b/third_party/python/Objects/rangeobject.c @@ -1,7 +1,6 @@ -/* Range object implementation */ - -#include "Python.h" -#include "structmember.h" +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* Support objects whose length is > PY_SSIZE_T_MAX. diff --git a/third_party/python/Objects/setobject.c b/third_party/python/Objects/setobject.c index 27836c0fb..c8b89e1f1 100644 --- a/third_party/python/Objects/setobject.c +++ b/third_party/python/Objects/setobject.c @@ -1,3 +1,6 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" /* set object implementation @@ -24,9 +27,6 @@ NULL if the rich comparison returns an error. */ -#include "Python.h" -#include "structmember.h" - /* Object used as dummy key to fill deleted entries */ static PyObject _dummy_struct; diff --git a/third_party/python/Objects/sliceobject.c b/third_party/python/Objects/sliceobject.c index 4e4b32d32..15e494e9b 100644 --- a/third_party/python/Objects/sliceobject.c +++ b/third_party/python/Objects/sliceobject.c @@ -1,3 +1,7 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" + /* Written by Jim Hugunin and Chris Chase. @@ -13,9 +17,6 @@ the Py_NoneStruct in that there is no way to create other objects of this type and there is exactly one in existence. */ -#include "Python.h" -#include "structmember.h" - static PyObject * ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { diff --git a/third_party/python/Objects/stringlib/asciilib.h b/third_party/python/Objects/stringlib/asciilib.inc similarity index 96% rename from third_party/python/Objects/stringlib/asciilib.h rename to third_party/python/Objects/stringlib/asciilib.inc index d0fc18d22..63cdc74f6 100644 --- a/third_party/python/Objects/stringlib/asciilib.h +++ b/third_party/python/Objects/stringlib/asciilib.inc @@ -1,3 +1,5 @@ +/* clang-format off */ +/* clang-format off */ /* this is sort of a hack. there's at least one place (formatting floats) where some stringlib code takes a different path if it's compiled as unicode. */ diff --git a/third_party/python/Objects/stringlib/codecs.h b/third_party/python/Objects/stringlib/codecs.inc similarity index 99% rename from third_party/python/Objects/stringlib/codecs.h rename to third_party/python/Objects/stringlib/codecs.inc index f019d9a96..0e48428cd 100644 --- a/third_party/python/Objects/stringlib/codecs.h +++ b/third_party/python/Objects/stringlib/codecs.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* stringlib: codec implementations */ #if !STRINGLIB_IS_UNICODE diff --git a/third_party/python/Objects/stringlib/count.h b/third_party/python/Objects/stringlib/count.inc similarity index 87% rename from third_party/python/Objects/stringlib/count.h rename to third_party/python/Objects/stringlib/count.inc index f48500bf5..b099cedaf 100644 --- a/third_party/python/Objects/stringlib/count.h +++ b/third_party/python/Objects/stringlib/count.inc @@ -1,7 +1,8 @@ +/* clang-format off */ /* stringlib: count implementation */ #ifndef STRINGLIB_FASTSEARCH_H -#error must include "stringlib/fastsearch.h" before including this module +#error must include fastsearch.inc before including this module #endif Py_LOCAL_INLINE(Py_ssize_t) diff --git a/third_party/python/Objects/stringlib/ctype.h b/third_party/python/Objects/stringlib/ctype.inc similarity index 97% rename from third_party/python/Objects/stringlib/ctype.h rename to third_party/python/Objects/stringlib/ctype.inc index f0546256e..ce64596de 100644 --- a/third_party/python/Objects/stringlib/ctype.h +++ b/third_party/python/Objects/stringlib/ctype.inc @@ -1,8 +1,9 @@ +/* clang-format off */ #if STRINGLIB_IS_UNICODE # error "ctype.h only compatible with byte-wise strings" #endif -#include "bytes_methods.h" +#include "third_party/python/Include/bytes_methods.h" static PyObject* stringlib_isspace(PyObject *self) diff --git a/third_party/python/Objects/stringlib/eq.h b/third_party/python/Objects/stringlib/eq.inc similarity index 97% rename from third_party/python/Objects/stringlib/eq.h rename to third_party/python/Objects/stringlib/eq.inc index f8fd384a3..e78806ffc 100644 --- a/third_party/python/Objects/stringlib/eq.h +++ b/third_party/python/Objects/stringlib/eq.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* Fast unicode equal function optimized for dictobject.c and setobject.c */ /* Return 1 if two unicode objects are equal, 0 if not. diff --git a/third_party/python/Objects/stringlib/fastsearch.h b/third_party/python/Objects/stringlib/fastsearch.inc similarity index 99% rename from third_party/python/Objects/stringlib/fastsearch.h rename to third_party/python/Objects/stringlib/fastsearch.inc index 98165ad11..7087acd8b 100644 --- a/third_party/python/Objects/stringlib/fastsearch.h +++ b/third_party/python/Objects/stringlib/fastsearch.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* stringlib: fastsearch implementation */ #define STRINGLIB_FASTSEARCH_H diff --git a/third_party/python/Objects/stringlib/find.h b/third_party/python/Objects/stringlib/find.inc similarity index 97% rename from third_party/python/Objects/stringlib/find.h rename to third_party/python/Objects/stringlib/find.inc index 509b92973..68ba2ce7a 100644 --- a/third_party/python/Objects/stringlib/find.h +++ b/third_party/python/Objects/stringlib/find.inc @@ -1,7 +1,8 @@ +/* clang-format off */ /* stringlib: find/index implementation */ #ifndef STRINGLIB_FASTSEARCH_H -#error must include "stringlib/fastsearch.h" before including this module +#error must include fastsearch.inc before including this module #endif Py_LOCAL_INLINE(Py_ssize_t) diff --git a/third_party/python/Objects/stringlib/find_max_char.h b/third_party/python/Objects/stringlib/find_max_char.inc similarity index 99% rename from third_party/python/Objects/stringlib/find_max_char.h rename to third_party/python/Objects/stringlib/find_max_char.inc index 8ccbc3094..944485985 100644 --- a/third_party/python/Objects/stringlib/find_max_char.h +++ b/third_party/python/Objects/stringlib/find_max_char.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* Finding the optimal width of unicode characters in a buffer */ #if !STRINGLIB_IS_UNICODE diff --git a/third_party/python/Objects/stringlib/join.h b/third_party/python/Objects/stringlib/join.inc similarity index 99% rename from third_party/python/Objects/stringlib/join.h rename to third_party/python/Objects/stringlib/join.inc index 6f314e152..4b0edc300 100644 --- a/third_party/python/Objects/stringlib/join.h +++ b/third_party/python/Objects/stringlib/join.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* stringlib: bytes joining implementation */ #if STRINGLIB_IS_UNICODE diff --git a/third_party/python/Objects/stringlib/localeutil.h b/third_party/python/Objects/stringlib/localeutil.inc similarity index 99% rename from third_party/python/Objects/stringlib/localeutil.h rename to third_party/python/Objects/stringlib/localeutil.inc index 31fed349c..a5162d061 100644 --- a/third_party/python/Objects/stringlib/localeutil.h +++ b/third_party/python/Objects/stringlib/localeutil.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* _PyUnicode_InsertThousandsGrouping() helper functions */ typedef struct { diff --git a/third_party/python/Objects/stringlib/partition.h b/third_party/python/Objects/stringlib/partition.inc similarity index 97% rename from third_party/python/Objects/stringlib/partition.h rename to third_party/python/Objects/stringlib/partition.inc index ed32a6f2b..39795146e 100644 --- a/third_party/python/Objects/stringlib/partition.h +++ b/third_party/python/Objects/stringlib/partition.inc @@ -1,7 +1,8 @@ +/* clang-format off */ /* stringlib: partition implementation */ #ifndef STRINGLIB_FASTSEARCH_H -#error must include "stringlib/fastsearch.h" before including this module +#error must include fastsearch.inc before including this module #endif Py_LOCAL_INLINE(PyObject*) diff --git a/third_party/python/Objects/stringlib/replace.h b/third_party/python/Objects/stringlib/replace.inc similarity index 95% rename from third_party/python/Objects/stringlib/replace.h rename to third_party/python/Objects/stringlib/replace.inc index ef318ed6d..6afcee6f5 100644 --- a/third_party/python/Objects/stringlib/replace.h +++ b/third_party/python/Objects/stringlib/replace.inc @@ -1,7 +1,8 @@ +/* clang-format off */ /* stringlib: replace implementation */ #ifndef STRINGLIB_FASTSEARCH_H -#error must include "stringlib/fastsearch.h" before including this module +#error must include fastsearch.inc before including this module #endif Py_LOCAL_INLINE(void) diff --git a/third_party/python/Objects/stringlib/split.h b/third_party/python/Objects/stringlib/split.inc similarity index 99% rename from third_party/python/Objects/stringlib/split.h rename to third_party/python/Objects/stringlib/split.inc index 31f77a772..a6ac6ad72 100644 --- a/third_party/python/Objects/stringlib/split.h +++ b/third_party/python/Objects/stringlib/split.inc @@ -1,7 +1,8 @@ +/* clang-format off */ /* stringlib: split implementation */ #ifndef STRINGLIB_FASTSEARCH_H -#error must include "stringlib/fastsearch.h" before including this module +#error must include fastsearch.inc before including this module #endif /* Overallocate the initial list to reduce the number of reallocs for small diff --git a/third_party/python/Objects/stringlib/stringdefs.h b/third_party/python/Objects/stringlib/stringdefs.inc similarity index 98% rename from third_party/python/Objects/stringlib/stringdefs.h rename to third_party/python/Objects/stringlib/stringdefs.inc index ce27f3e40..2cc9e4878 100644 --- a/third_party/python/Objects/stringlib/stringdefs.h +++ b/third_party/python/Objects/stringlib/stringdefs.inc @@ -1,3 +1,4 @@ +/* clang-format off */ #ifndef STRINGLIB_STRINGDEFS_H #define STRINGLIB_STRINGDEFS_H diff --git a/third_party/python/Objects/stringlib/transmogrify.h b/third_party/python/Objects/stringlib/transmogrify.inc similarity index 99% rename from third_party/python/Objects/stringlib/transmogrify.h rename to third_party/python/Objects/stringlib/transmogrify.inc index a314572a7..abbb843c1 100644 --- a/third_party/python/Objects/stringlib/transmogrify.h +++ b/third_party/python/Objects/stringlib/transmogrify.inc @@ -1,3 +1,4 @@ +/* clang-format off */ #if STRINGLIB_IS_UNICODE # error "transmogrify.h only compatible with byte-wise strings" #endif diff --git a/third_party/python/Objects/stringlib/ucs1lib.h b/third_party/python/Objects/stringlib/ucs1lib.inc similarity index 98% rename from third_party/python/Objects/stringlib/ucs1lib.h rename to third_party/python/Objects/stringlib/ucs1lib.inc index ce1eb57f0..3aa300edf 100644 --- a/third_party/python/Objects/stringlib/ucs1lib.h +++ b/third_party/python/Objects/stringlib/ucs1lib.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* this is sort of a hack. there's at least one place (formatting floats) where some stringlib code takes a different path if it's compiled as unicode. */ diff --git a/third_party/python/Objects/stringlib/ucs2lib.h b/third_party/python/Objects/stringlib/ucs2lib.inc similarity index 98% rename from third_party/python/Objects/stringlib/ucs2lib.h rename to third_party/python/Objects/stringlib/ucs2lib.inc index f900cb65f..d2e8c6e3b 100644 --- a/third_party/python/Objects/stringlib/ucs2lib.h +++ b/third_party/python/Objects/stringlib/ucs2lib.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* this is sort of a hack. there's at least one place (formatting floats) where some stringlib code takes a different path if it's compiled as unicode. */ diff --git a/third_party/python/Objects/stringlib/ucs4lib.h b/third_party/python/Objects/stringlib/ucs4lib.inc similarity index 98% rename from third_party/python/Objects/stringlib/ucs4lib.h rename to third_party/python/Objects/stringlib/ucs4lib.inc index 86a480f1e..cb1a80770 100644 --- a/third_party/python/Objects/stringlib/ucs4lib.h +++ b/third_party/python/Objects/stringlib/ucs4lib.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* this is sort of a hack. there's at least one place (formatting floats) where some stringlib code takes a different path if it's compiled as unicode. */ diff --git a/third_party/python/Objects/stringlib/undef.h b/third_party/python/Objects/stringlib/undef.inc similarity index 91% rename from third_party/python/Objects/stringlib/undef.h rename to third_party/python/Objects/stringlib/undef.inc index f9d3f1d33..1d39cfadf 100644 --- a/third_party/python/Objects/stringlib/undef.h +++ b/third_party/python/Objects/stringlib/undef.inc @@ -1,3 +1,4 @@ +/* clang-format off */ #undef FASTSEARCH #undef STRINGLIB #undef STRINGLIB_SIZEOF_CHAR diff --git a/third_party/python/Objects/stringlib/unicode_format.h b/third_party/python/Objects/stringlib/unicode_format.inc similarity index 99% rename from third_party/python/Objects/stringlib/unicode_format.h rename to third_party/python/Objects/stringlib/unicode_format.inc index 7314af02a..092162d70 100644 --- a/third_party/python/Objects/stringlib/unicode_format.h +++ b/third_party/python/Objects/stringlib/unicode_format.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* unicode_format.h -- implementation of str.format(). */ diff --git a/third_party/python/Objects/stringlib/unicodedefs.h b/third_party/python/Objects/stringlib/unicodedefs.inc similarity index 98% rename from third_party/python/Objects/stringlib/unicodedefs.h rename to third_party/python/Objects/stringlib/unicodedefs.inc index 3db5629e1..ebde38fff 100644 --- a/third_party/python/Objects/stringlib/unicodedefs.h +++ b/third_party/python/Objects/stringlib/unicodedefs.inc @@ -1,3 +1,4 @@ +/* clang-format off */ #ifndef STRINGLIB_UNICODEDEFS_H #define STRINGLIB_UNICODEDEFS_H diff --git a/third_party/python/Objects/structseq.c b/third_party/python/Objects/structseq.c index 5489aef6d..46af9fc57 100644 --- a/third_party/python/Objects/structseq.c +++ b/third_party/python/Objects/structseq.c @@ -1,9 +1,10 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" + /* Implementation helper: a struct that looks like a tuple. See timemodule and posixmodule for example uses. */ -#include "Python.h" -#include "structmember.h" - static const char visible_length_key[] = "n_sequence_fields"; static const char real_length_key[] = "n_fields"; static const char unnamed_fields_key[] = "n_unnamed_fields"; diff --git a/third_party/python/Objects/tupleobject.c b/third_party/python/Objects/tupleobject.c index b9628fd94..da1740c14 100644 --- a/third_party/python/Objects/tupleobject.c +++ b/third_party/python/Objects/tupleobject.c @@ -1,9 +1,9 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/accu.h" /* Tuple object implementation */ -#include "Python.h" -#include "accu.h" - /* Speed optimization to avoid frequent malloc/free of small tuples */ #ifndef PyTuple_MAXSAVESIZE #define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */ diff --git a/third_party/python/Objects/typeobject.c b/third_party/python/Objects/typeobject.c index a811eaa20..ee6ba23b2 100644 --- a/third_party/python/Objects/typeobject.c +++ b/third_party/python/Objects/typeobject.c @@ -1,12 +1,10 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/frameobject.h" +#include "third_party/python/Include/structmember.h" + /* Type object implementation */ -#include "Python.h" -#include "frameobject.h" -#include "structmember.h" - -#include - - /* Support type attribute cache */ /* The cache can keep references to the names alive for longer than diff --git a/third_party/python/Objects/typeslots.inc b/third_party/python/Objects/typeslots.inc index dc750cc0c..d4f8b0baa 100644 --- a/third_party/python/Objects/typeslots.inc +++ b/third_party/python/Objects/typeslots.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* Generated by typeslots.py */ 0, 0, diff --git a/third_party/python/Objects/unicodectype.c b/third_party/python/Objects/unicodectype.c index d8c95c8b4..a1d31e346 100644 --- a/third_party/python/Objects/unicodectype.c +++ b/third_party/python/Objects/unicodectype.c @@ -1,3 +1,6 @@ +/* clang-format off */ +#include "third_party/python/Include/Python.h" + /* Unicode character type helpers. @@ -8,8 +11,6 @@ */ -#include "Python.h" - #define ALPHA_MASK 0x01 #define DECIMAL_MASK 0x02 #define DIGIT_MASK 0x04 @@ -40,7 +41,7 @@ typedef struct { const unsigned short flags; } _PyUnicode_TypeRecord; -#include "unicodetype_db.h" +#include "third_party/python/Objects/unicodetype_db.inc" static const _PyUnicode_TypeRecord * gettyperecord(Py_UCS4 code) diff --git a/third_party/python/Objects/unicodeobject.c b/third_party/python/Objects/unicodeobject.c index ed70c6b94..3e423076b 100644 --- a/third_party/python/Objects/unicodeobject.c +++ b/third_party/python/Objects/unicodeobject.c @@ -1,3 +1,10 @@ +/* clang-format off */ +#define PY_SSIZE_T_CLEAN +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/ucnhash.h" +#include "third_party/python/Include/bytes_methods.h" +#include "third_party/python/Objects/stringlib/eq.inc" + /* Unicode implementation based on original code by Fredrik Lundh, @@ -38,16 +45,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "ucnhash.h" -#include "bytes_methods.h" -#include "stringlib/eq.h" - -#ifdef MS_WINDOWS -#include -#endif - /*[clinic input] class str "PyUnicodeObject *" "&PyUnicode_Type" [clinic start generated code]*/ @@ -332,7 +329,7 @@ static const unsigned char ascii_linebreak[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -#include "clinic/unicodeobject.c.h" +#include "third_party/python/Objects/clinic/unicodeobject.inc" typedef enum { _Py_ERROR_UNKNOWN=0, @@ -805,50 +802,50 @@ ensure_unicode(PyObject *obj) /* Compilation of templated routines */ -#include "stringlib/asciilib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/find_max_char.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/asciilib.inc" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/find_max_char.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs1lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/replace.h" -#include "stringlib/find_max_char.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs1lib.inc" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/replace.inc" +#include "third_party/python/Objects/stringlib/find_max_char.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs2lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/replace.h" -#include "stringlib/find_max_char.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs2lib.inc" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/replace.inc" +#include "third_party/python/Objects/stringlib/find_max_char.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs4lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/replace.h" -#include "stringlib/find_max_char.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs4lib.inc" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/partition.inc" +#include "third_party/python/Objects/stringlib/split.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/replace.inc" +#include "third_party/python/Objects/stringlib/find_max_char.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/unicodedefs.h" -#include "stringlib/fastsearch.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/unicodedefs.inc" +#include "third_party/python/Objects/stringlib/fastsearch.inc" +#include "third_party/python/Objects/stringlib/count.inc" +#include "third_party/python/Objects/stringlib/find.inc" +#include "third_party/python/Objects/stringlib/undef.inc" /* --- Unicode Object ----------------------------------------------------- */ @@ -4971,21 +4968,21 @@ PyUnicode_DecodeUTF8(const char *s, return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL); } -#include "stringlib/asciilib.h" -#include "stringlib/codecs.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/asciilib.inc" +#include "third_party/python/Objects/stringlib/codecs.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs1lib.h" -#include "stringlib/codecs.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs1lib.inc" +#include "third_party/python/Objects/stringlib/codecs.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs2lib.h" -#include "stringlib/codecs.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs2lib.inc" +#include "third_party/python/Objects/stringlib/codecs.inc" +#include "third_party/python/Objects/stringlib/undef.inc" -#include "stringlib/ucs4lib.h" -#include "stringlib/codecs.h" -#include "stringlib/undef.h" +#include "third_party/python/Objects/stringlib/ucs4lib.inc" +#include "third_party/python/Objects/stringlib/codecs.inc" +#include "third_party/python/Objects/stringlib/undef.inc" /* Mask to quickly check whether a C 'long' contains a non-ASCII, UTF8-encoded char. */ @@ -9436,7 +9433,7 @@ any_find_slice(PyObject* s1, PyObject* s2, } /* _PyUnicode_InsertThousandsGrouping() helper functions */ -#include "stringlib/localeutil.h" +#include "third_party/python/Objects/stringlib/localeutil.inc" /** * InsertThousandsGrouping: @@ -13891,7 +13888,7 @@ _PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer) Py_CLEAR(writer->buffer); } -#include "stringlib/unicode_format.h" +#include "third_party/python/Objects/stringlib/unicode_format.inc" PyDoc_STRVAR(format__doc__, "S.format(*args, **kwargs) -> str\n\ diff --git a/third_party/python/Objects/unicodetype_db.h b/third_party/python/Objects/unicodetype_db.inc similarity index 99% rename from third_party/python/Objects/unicodetype_db.h rename to third_party/python/Objects/unicodetype_db.inc index 39af9208a..4f400df45 100644 --- a/third_party/python/Objects/unicodetype_db.h +++ b/third_party/python/Objects/unicodetype_db.inc @@ -1,3 +1,4 @@ +/* clang-format off */ /* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ /* a list of unique character type descriptors */ diff --git a/third_party/python/Objects/weakrefobject.c b/third_party/python/Objects/weakrefobject.c index 9ca386da2..b945bb0e3 100644 --- a/third_party/python/Objects/weakrefobject.c +++ b/third_party/python/Objects/weakrefobject.c @@ -1,6 +1,6 @@ -#include "Python.h" -#include "structmember.h" - +/* clang-format off */ +#include "third_party/python/Include/Python.h" +#include "third_party/python/Include/structmember.h" #define GET_WEAKREFS_LISTPTR(o) \ ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) diff --git a/third_party/python/PC/WinMain.c b/third_party/python/PC/WinMain.c deleted file mode 100644 index e439bed9e..000000000 --- a/third_party/python/PC/WinMain.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Minimal main program -- everything is loaded from the library. */ - -#include "Python.h" - -#define WIN32_LEAN_AND_MEAN -#include - -int WINAPI wWinMain( - HINSTANCE hInstance, /* handle to current instance */ - HINSTANCE hPrevInstance, /* handle to previous instance */ - LPWSTR lpCmdLine, /* pointer to command line */ - int nCmdShow /* show state of window */ -) -{ - return Py_Main(__argc, __wargv); -} diff --git a/third_party/python/PC/_findvs.cpp b/third_party/python/PC/_findvs.cpp deleted file mode 100644 index ecc68e82e..000000000 --- a/third_party/python/PC/_findvs.cpp +++ /dev/null @@ -1,259 +0,0 @@ -// -// Helper library for location Visual Studio installations -// using the COM-based query API. -// -// Copyright (c) Microsoft Corporation -// Licensed to PSF under a contributor agreement -// - -// Version history -// 2017-05: Initial contribution (Steve Dower) - -#include -#include -#include "external\include\Setup.Configuration.h" - -#include - -static PyObject *error_from_hr(HRESULT hr) -{ - if (FAILED(hr)) - PyErr_Format(PyExc_OSError, "Error %08x", hr); - assert(PyErr_Occurred()); - return nullptr; -} - -static PyObject *get_install_name(ISetupInstance2 *inst) -{ - HRESULT hr; - BSTR name; - PyObject *str = nullptr; - if (FAILED(hr = inst->GetDisplayName(LOCALE_USER_DEFAULT, &name))) - goto error; - str = PyUnicode_FromWideChar(name, SysStringLen(name)); - SysFreeString(name); - return str; -error: - - return error_from_hr(hr); -} - -static PyObject *get_install_version(ISetupInstance *inst) -{ - HRESULT hr; - BSTR ver; - PyObject *str = nullptr; - if (FAILED(hr = inst->GetInstallationVersion(&ver))) - goto error; - str = PyUnicode_FromWideChar(ver, SysStringLen(ver)); - SysFreeString(ver); - return str; -error: - - return error_from_hr(hr); -} - -static PyObject *get_install_path(ISetupInstance *inst) -{ - HRESULT hr; - BSTR path; - PyObject *str = nullptr; - if (FAILED(hr = inst->GetInstallationPath(&path))) - goto error; - str = PyUnicode_FromWideChar(path, SysStringLen(path)); - SysFreeString(path); - return str; -error: - - return error_from_hr(hr); -} - -static PyObject *get_installed_packages(ISetupInstance2 *inst) -{ - HRESULT hr; - PyObject *res = nullptr; - LPSAFEARRAY sa_packages = nullptr; - LONG ub = 0; - IUnknown **packages = nullptr; - PyObject *str = nullptr; - - if (FAILED(hr = inst->GetPackages(&sa_packages)) || - FAILED(hr = SafeArrayAccessData(sa_packages, (void**)&packages)) || - FAILED(SafeArrayGetUBound(sa_packages, 1, &ub)) || - !(res = PyList_New(0))) - goto error; - - for (LONG i = 0; i < ub; ++i) { - ISetupPackageReference *package = nullptr; - BSTR id = nullptr; - PyObject *str = nullptr; - - if (FAILED(hr = packages[i]->QueryInterface(&package)) || - FAILED(hr = package->GetId(&id))) - goto iter_error; - - str = PyUnicode_FromWideChar(id, SysStringLen(id)); - SysFreeString(id); - - if (!str || PyList_Append(res, str) < 0) - goto iter_error; - - Py_CLEAR(str); - package->Release(); - continue; - - iter_error: - if (package) package->Release(); - Py_XDECREF(str); - - goto error; - } - - SafeArrayUnaccessData(sa_packages); - SafeArrayDestroy(sa_packages); - - return res; -error: - if (sa_packages && packages) SafeArrayUnaccessData(sa_packages); - if (sa_packages) SafeArrayDestroy(sa_packages); - Py_XDECREF(res); - - return error_from_hr(hr); -} - -static PyObject *find_all_instances() -{ - ISetupConfiguration *sc = nullptr; - ISetupConfiguration2 *sc2 = nullptr; - IEnumSetupInstances *enm = nullptr; - ISetupInstance *inst = nullptr; - ISetupInstance2 *inst2 = nullptr; - PyObject *res = nullptr; - ULONG fetched; - HRESULT hr; - - if (!(res = PyList_New(0))) - goto error; - - if (FAILED(hr = CoCreateInstance( - __uuidof(SetupConfiguration), - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISetupConfiguration), - (LPVOID*)&sc - )) && hr != REGDB_E_CLASSNOTREG) - goto error; - - // If the class is not registered, there are no VS instances installed - if (hr == REGDB_E_CLASSNOTREG) - return res; - - if (FAILED(hr = sc->QueryInterface(&sc2)) || - FAILED(hr = sc2->EnumAllInstances(&enm))) - goto error; - - while (SUCCEEDED(enm->Next(1, &inst, &fetched)) && fetched) { - PyObject *name = nullptr; - PyObject *version = nullptr; - PyObject *path = nullptr; - PyObject *packages = nullptr; - PyObject *tuple = nullptr; - - if (FAILED(hr = inst->QueryInterface(&inst2)) || - !(name = get_install_name(inst2)) || - !(version = get_install_version(inst)) || - !(path = get_install_path(inst)) || - !(packages = get_installed_packages(inst2)) || - !(tuple = PyTuple_Pack(4, name, version, path, packages)) || - PyList_Append(res, tuple) < 0) - goto iter_error; - - Py_DECREF(tuple); - Py_DECREF(packages); - Py_DECREF(path); - Py_DECREF(version); - Py_DECREF(name); - continue; - iter_error: - if (inst2) inst2->Release(); - Py_XDECREF(tuple); - Py_XDECREF(packages); - Py_XDECREF(path); - Py_XDECREF(version); - Py_XDECREF(name); - goto error; - } - - enm->Release(); - sc2->Release(); - sc->Release(); - return res; - -error: - if (enm) enm->Release(); - if (sc2) sc2->Release(); - if (sc) sc->Release(); - Py_XDECREF(res); - - return error_from_hr(hr); -} - -PyDoc_STRVAR(findvs_findall_doc, "findall()\ -\ -Finds all installed versions of Visual Studio.\ -\ -This function will initialize COM temporarily. To avoid impact on other parts\ -of your application, use a new thread to make this call."); - -static PyObject *findvs_findall(PyObject *self, PyObject *args, PyObject *kwargs) -{ - HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); - if (hr == RPC_E_CHANGED_MODE) - hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - if (FAILED(hr)) - return error_from_hr(hr); - PyObject *res = find_all_instances(); - CoUninitialize(); - return res; -} - -// List of functions to add to findvs in exec_findvs(). -static PyMethodDef findvs_functions[] = { - { "findall", (PyCFunction)findvs_findall, METH_VARARGS | METH_KEYWORDS, findvs_findall_doc }, - { NULL, NULL, 0, NULL } -}; - -// Initialize findvs. May be called multiple times, so avoid -// using static state. -static int exec_findvs(PyObject *module) -{ - PyModule_AddFunctions(module, findvs_functions); - - return 0; // success -} - -PyDoc_STRVAR(findvs_doc, "The _distutils_findvs helper module"); - -static PyModuleDef_Slot findvs_slots[] = { - { Py_mod_exec, exec_findvs }, - { 0, NULL } -}; - -static PyModuleDef findvs_def = { - PyModuleDef_HEAD_INIT, - "_distutils_findvs", - findvs_doc, - 0, // m_size - NULL, // m_methods - findvs_slots, - NULL, // m_traverse - NULL, // m_clear - NULL, // m_free -}; - -extern "C" { - PyMODINIT_FUNC PyInit__distutils_findvs(void) - { - return PyModuleDef_Init(&findvs_def); - } -} diff --git a/third_party/python/PC/_msi.c b/third_party/python/PC/_msi.c deleted file mode 100644 index 0487743b5..000000000 --- a/third_party/python/PC/_msi.c +++ /dev/null @@ -1,1120 +0,0 @@ -/* Helper library for MSI creation with Python. - * Copyright (C) 2005 Martin v. Löwis - * Licensed to PSF under a contributor agreement. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static PyObject *MSIError; - -static PyObject* -uuidcreate(PyObject* obj, PyObject*args) -{ - UUID result; - wchar_t *cresult; - PyObject *oresult; - - /* May return ok, local only, and no address. - For local only, the documentation says we still get a uuid. - For RPC_S_UUID_NO_ADDRESS, it's not clear whether we can - use the result. */ - if (UuidCreate(&result) == RPC_S_UUID_NO_ADDRESS) { - PyErr_SetString(PyExc_NotImplementedError, "processing 'no address' result"); - return NULL; - } - - if (UuidToStringW(&result, &cresult) == RPC_S_OUT_OF_MEMORY) { - PyErr_SetString(PyExc_MemoryError, "out of memory in uuidgen"); - return NULL; - } - - oresult = PyUnicode_FromWideChar(cresult, wcslen(cresult)); - RpcStringFreeW(&cresult); - return oresult; - -} - -/* FCI callback functions */ - -static FNFCIALLOC(cb_alloc) -{ - return malloc(cb); -} - -static FNFCIFREE(cb_free) -{ - free(memory); -} - -static FNFCIOPEN(cb_open) -{ - int result = _open(pszFile, oflag | O_NOINHERIT, pmode); - if (result == -1) - *err = errno; - return result; -} - -static FNFCIREAD(cb_read) -{ - UINT result = (UINT)_read((int)hf, memory, cb); - if (result != cb) - *err = errno; - return result; -} - -static FNFCIWRITE(cb_write) -{ - UINT result = (UINT)_write((int)hf, memory, cb); - if (result != cb) - *err = errno; - return result; -} - -static FNFCICLOSE(cb_close) -{ - int result = _close((int)hf); - if (result != 0) - *err = errno; - return result; -} - -static FNFCISEEK(cb_seek) -{ - long result = (long)_lseek((int)hf, dist, seektype); - if (result == -1) - *err = errno; - return result; -} - -static FNFCIDELETE(cb_delete) -{ - int result = remove(pszFile); - if (result != 0) - *err = errno; - return result; -} - -static FNFCIFILEPLACED(cb_fileplaced) -{ - return 0; -} - -static FNFCIGETTEMPFILE(cb_gettempfile) -{ - char *name = _tempnam("", "tmp"); - if ((name != NULL) && ((int)strlen(name) < cbTempName)) { - strcpy(pszTempName, name); - free(name); - return TRUE; - } - - if (name) free(name); - return FALSE; -} - -static FNFCISTATUS(cb_status) -{ - if (pv) { - _Py_IDENTIFIER(status); - - PyObject *result = _PyObject_CallMethodId(pv, &PyId_status, "iii", typeStatus, cb1, cb2); - if (result == NULL) - return -1; - Py_DECREF(result); - } - return 0; -} - -static FNFCIGETNEXTCABINET(cb_getnextcabinet) -{ - if (pv) { - _Py_IDENTIFIER(getnextcabinet); - - PyObject *result = _PyObject_CallMethodId(pv, &PyId_getnextcabinet, "i", pccab->iCab); - if (result == NULL) - return -1; - if (!PyBytes_Check(result)) { - PyErr_Format(PyExc_TypeError, - "Incorrect return type %s from getnextcabinet", - result->ob_type->tp_name); - Py_DECREF(result); - return FALSE; - } - strncpy(pccab->szCab, PyBytes_AsString(result), sizeof(pccab->szCab)); - return TRUE; - } - return FALSE; -} - -static FNFCIGETOPENINFO(cb_getopeninfo) -{ - BY_HANDLE_FILE_INFORMATION bhfi; - FILETIME filetime; - HANDLE handle; - - /* Need Win32 handle to get time stamps */ - handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (handle == INVALID_HANDLE_VALUE) - return -1; - - if (GetFileInformationByHandle(handle, &bhfi) == FALSE) - { - CloseHandle(handle); - return -1; - } - - FileTimeToLocalFileTime(&bhfi.ftLastWriteTime, &filetime); - FileTimeToDosDateTime(&filetime, pdate, ptime); - - *pattribs = (int)(bhfi.dwFileAttributes & - (_A_RDONLY | _A_SYSTEM | _A_HIDDEN | _A_ARCH)); - - CloseHandle(handle); - - return _open(pszName, _O_RDONLY | _O_BINARY | O_NOINHERIT); -} - -static PyObject* fcicreate(PyObject* obj, PyObject* args) -{ - char *cabname, *p; - PyObject *files; - CCAB ccab; - HFCI hfci; - ERF erf; - Py_ssize_t i; - - - if (!PyArg_ParseTuple(args, "sO:FCICreate", &cabname, &files)) - return NULL; - - if (!PyList_Check(files)) { - PyErr_SetString(PyExc_TypeError, "FCICreate expects a list"); - return NULL; - } - - ccab.cb = INT_MAX; /* no need to split CAB into multiple media */ - ccab.cbFolderThresh = 1000000; /* flush directory after this many bytes */ - ccab.cbReserveCFData = 0; - ccab.cbReserveCFFolder = 0; - ccab.cbReserveCFHeader = 0; - - ccab.iCab = 1; - ccab.iDisk = 1; - - ccab.setID = 0; - ccab.szDisk[0] = '\0'; - - for (i = 0, p = cabname; *p; p = CharNext(p)) - if (*p == '\\' || *p == '/') - i = p - cabname + 1; - - if (i >= sizeof(ccab.szCabPath) || - strlen(cabname+i) >= sizeof(ccab.szCab)) { - PyErr_SetString(PyExc_ValueError, "path name too long"); - return 0; - } - - if (i > 0) { - memcpy(ccab.szCabPath, cabname, i); - ccab.szCabPath[i] = '\0'; - strcpy(ccab.szCab, cabname+i); - } else { - strcpy(ccab.szCabPath, ".\\"); - strcpy(ccab.szCab, cabname); - } - - hfci = FCICreate(&erf, cb_fileplaced, cb_alloc, cb_free, - cb_open, cb_read, cb_write, cb_close, cb_seek, cb_delete, - cb_gettempfile, &ccab, NULL); - - if (hfci == NULL) { - PyErr_Format(PyExc_ValueError, "FCI error %d", erf.erfOper); - return NULL; - } - - for (i=0; i < PyList_GET_SIZE(files); i++) { - PyObject *item = PyList_GET_ITEM(files, i); - char *filename, *cabname; - - if (!PyArg_ParseTuple(item, "ss", &filename, &cabname)) { - PyErr_SetString(PyExc_TypeError, "FCICreate expects a list of tuples containing two strings"); - FCIDestroy(hfci); - return NULL; - } - - if (!FCIAddFile(hfci, filename, cabname, FALSE, - cb_getnextcabinet, cb_status, cb_getopeninfo, - tcompTYPE_MSZIP)) - goto err; - } - - if (!FCIFlushCabinet(hfci, FALSE, cb_getnextcabinet, cb_status)) - goto err; - - if (!FCIDestroy(hfci)) - goto err; - - Py_INCREF(Py_None); - return Py_None; -err: - if(erf.fError) - PyErr_Format(PyExc_ValueError, "FCI error %d", erf.erfOper); /* XXX better error type */ - else - PyErr_SetString(PyExc_ValueError, "FCI general error"); - - FCIDestroy(hfci); - return NULL; -} - -typedef struct msiobj{ - PyObject_HEAD - MSIHANDLE h; -}msiobj; - -static void -msiobj_dealloc(msiobj* msidb) -{ - MsiCloseHandle(msidb->h); - msidb->h = 0; - PyObject_Del(msidb); -} - -static PyObject* -msiobj_close(msiobj* msidb, PyObject *args) -{ - MsiCloseHandle(msidb->h); - msidb->h = 0; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -msierror(int status) -{ - int code; - char buf[2000]; - char *res = buf; - DWORD size = sizeof(buf); - MSIHANDLE err = MsiGetLastErrorRecord(); - - if (err == 0) { - switch(status) { - case ERROR_ACCESS_DENIED: - PyErr_SetString(MSIError, "access denied"); - return NULL; - case ERROR_FUNCTION_FAILED: - PyErr_SetString(MSIError, "function failed"); - return NULL; - case ERROR_INVALID_DATA: - PyErr_SetString(MSIError, "invalid data"); - return NULL; - case ERROR_INVALID_HANDLE: - PyErr_SetString(MSIError, "invalid handle"); - return NULL; - case ERROR_INVALID_STATE: - PyErr_SetString(MSIError, "invalid state"); - return NULL; - case ERROR_INVALID_PARAMETER: - PyErr_SetString(MSIError, "invalid parameter"); - return NULL; - case ERROR_OPEN_FAILED: - PyErr_SetString(MSIError, "open failed"); - return NULL; - case ERROR_CREATE_FAILED: - PyErr_SetString(MSIError, "create failed"); - return NULL; - default: - PyErr_Format(MSIError, "unknown error %x", status); - return NULL; - } - } - - code = MsiRecordGetInteger(err, 1); /* XXX code */ - if (MsiFormatRecord(0, err, res, &size) == ERROR_MORE_DATA) { - res = malloc(size+1); - if (res == NULL) { - MsiCloseHandle(err); - return PyErr_NoMemory(); - } - MsiFormatRecord(0, err, res, &size); - res[size]='\0'; - } - MsiCloseHandle(err); - PyErr_SetString(MSIError, res); - if (res != buf) - free(res); - return NULL; -} - -/*************************** Record objects **********************/ - -static PyObject* -record_getfieldcount(msiobj* record, PyObject* args) -{ - return PyLong_FromLong(MsiRecordGetFieldCount(record->h)); -} - -static PyObject* -record_getinteger(msiobj* record, PyObject* args) -{ - unsigned int field; - int status; - - if (!PyArg_ParseTuple(args, "I:GetInteger", &field)) - return NULL; - status = MsiRecordGetInteger(record->h, field); - if (status == MSI_NULL_INTEGER){ - PyErr_SetString(MSIError, "could not convert record field to integer"); - return NULL; - } - return PyLong_FromLong((long) status); -} - -static PyObject* -record_getstring(msiobj* record, PyObject* args) -{ - unsigned int field; - unsigned int status; - WCHAR buf[2000]; - WCHAR *res = buf; - DWORD size = sizeof(buf); - PyObject* string; - - if (!PyArg_ParseTuple(args, "I:GetString", &field)) - return NULL; - status = MsiRecordGetStringW(record->h, field, res, &size); - if (status == ERROR_MORE_DATA) { - res = (WCHAR*) malloc((size + 1)*sizeof(WCHAR)); - if (res == NULL) - return PyErr_NoMemory(); - status = MsiRecordGetStringW(record->h, field, res, &size); - } - if (status != ERROR_SUCCESS) - return msierror((int) status); - string = PyUnicode_FromWideChar(res, size); - if (buf != res) - free(res); - return string; -} - -static PyObject* -record_cleardata(msiobj* record, PyObject *args) -{ - int status = MsiRecordClearData(record->h); - if (status != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -record_setstring(msiobj* record, PyObject *args) -{ - int status; - int field; - wchar_t *data; - - if (!PyArg_ParseTuple(args, "iu:SetString", &field, &data)) - return NULL; - - if ((status = MsiRecordSetStringW(record->h, field, data)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -record_setstream(msiobj* record, PyObject *args) -{ - int status; - int field; - wchar_t *data; - - if (!PyArg_ParseTuple(args, "iu:SetStream", &field, &data)) - return NULL; - - if ((status = MsiRecordSetStreamW(record->h, field, data)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -record_setinteger(msiobj* record, PyObject *args) -{ - int status; - int field; - int data; - - if (!PyArg_ParseTuple(args, "ii:SetInteger", &field, &data)) - return NULL; - - if ((status = MsiRecordSetInteger(record->h, field, data)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - - - -static PyMethodDef record_methods[] = { - { "GetFieldCount", (PyCFunction)record_getfieldcount, METH_NOARGS, - PyDoc_STR("GetFieldCount() -> int\nWraps MsiRecordGetFieldCount")}, - { "GetInteger", (PyCFunction)record_getinteger, METH_VARARGS, - PyDoc_STR("GetInteger(field) -> int\nWraps MsiRecordGetInteger")}, - { "GetString", (PyCFunction)record_getstring, METH_VARARGS, - PyDoc_STR("GetString(field) -> string\nWraps MsiRecordGetString")}, - { "SetString", (PyCFunction)record_setstring, METH_VARARGS, - PyDoc_STR("SetString(field,str) -> None\nWraps MsiRecordSetString")}, - { "SetStream", (PyCFunction)record_setstream, METH_VARARGS, - PyDoc_STR("SetStream(field,filename) -> None\nWraps MsiRecordSetInteger")}, - { "SetInteger", (PyCFunction)record_setinteger, METH_VARARGS, - PyDoc_STR("SetInteger(field,int) -> None\nWraps MsiRecordSetInteger")}, - { "ClearData", (PyCFunction)record_cleardata, METH_NOARGS, - PyDoc_STR("ClearData() -> int\nWraps MsiRecordGClearData")}, - { NULL, NULL } -}; - -static PyTypeObject record_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_msi.Record", /*tp_name*/ - sizeof(msiobj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - PyObject_GenericSetAttr,/*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - record_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; - -static PyObject* -record_new(MSIHANDLE h) -{ - msiobj *result = PyObject_NEW(struct msiobj, &record_Type); - - if (!result) { - MsiCloseHandle(h); - return NULL; - } - - result->h = h; - return (PyObject*)result; -} - -/*************************** SummaryInformation objects **************/ - -static PyObject* -summary_getproperty(msiobj* si, PyObject *args) -{ - int status; - int field; - PyObject *result; - UINT type; - INT ival; - FILETIME fval; - char sbuf[1000]; - char *sval = sbuf; - DWORD ssize = sizeof(sval); - - if (!PyArg_ParseTuple(args, "i:GetProperty", &field)) - return NULL; - - status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, - &fval, sval, &ssize); - if (status == ERROR_MORE_DATA) { - sval = malloc(ssize); - if (sval == NULL) { - return PyErr_NoMemory(); - } - status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, - &fval, sval, &ssize); - } - - switch(type) { - case VT_I2: case VT_I4: - return PyLong_FromLong(ival); - case VT_FILETIME: - PyErr_SetString(PyExc_NotImplementedError, "FILETIME result"); - return NULL; - case VT_LPSTR: - result = PyBytes_FromStringAndSize(sval, ssize); - if (sval != sbuf) - free(sval); - return result; - case VT_EMPTY: - Py_RETURN_NONE; - } - PyErr_Format(PyExc_NotImplementedError, "result of type %d", type); - return NULL; -} - -static PyObject* -summary_getpropertycount(msiobj* si, PyObject *args) -{ - int status; - UINT result; - - status = MsiSummaryInfoGetPropertyCount(si->h, &result); - if (status != ERROR_SUCCESS) - return msierror(status); - - return PyLong_FromLong(result); -} - -static PyObject* -summary_setproperty(msiobj* si, PyObject *args) -{ - int status; - int field; - PyObject* data; - - if (!PyArg_ParseTuple(args, "iO:SetProperty", &field, &data)) - return NULL; - - if (PyUnicode_Check(data)) { - const WCHAR *value = _PyUnicode_AsUnicode(data); - if (value == NULL) { - return NULL; - } - status = MsiSummaryInfoSetPropertyW(si->h, field, VT_LPSTR, - 0, NULL, value); - } else if (PyLong_CheckExact(data)) { - long value = PyLong_AsLong(data); - if (value == -1 && PyErr_Occurred()) { - return NULL; - } - status = MsiSummaryInfoSetProperty(si->h, field, VT_I4, - value, NULL, NULL); - } else { - PyErr_SetString(PyExc_TypeError, "unsupported type"); - return NULL; - } - - if (status != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - - -static PyObject* -summary_persist(msiobj* si, PyObject *args) -{ - int status; - - status = MsiSummaryInfoPersist(si->h); - if (status != ERROR_SUCCESS) - return msierror(status); - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef summary_methods[] = { - { "GetProperty", (PyCFunction)summary_getproperty, METH_VARARGS, - PyDoc_STR("GetProperty(propid) -> value\nWraps MsiSummaryInfoGetProperty")}, - { "GetPropertyCount", (PyCFunction)summary_getpropertycount, METH_NOARGS, - PyDoc_STR("GetProperty() -> int\nWraps MsiSummaryInfoGetPropertyCount")}, - { "SetProperty", (PyCFunction)summary_setproperty, METH_VARARGS, - PyDoc_STR("SetProperty(value) -> None\nWraps MsiSummaryInfoProperty")}, - { "Persist", (PyCFunction)summary_persist, METH_NOARGS, - PyDoc_STR("Persist() -> None\nWraps MsiSummaryInfoPersist")}, - { NULL, NULL } -}; - -static PyTypeObject summary_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_msi.SummaryInformation", /*tp_name*/ - sizeof(msiobj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - PyObject_GenericSetAttr,/*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - summary_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; - -/*************************** View objects **************/ - -static PyObject* -view_execute(msiobj *view, PyObject*args) -{ - int status; - MSIHANDLE params = 0; - PyObject *oparams = Py_None; - - if (!PyArg_ParseTuple(args, "O:Execute", &oparams)) - return NULL; - - if (oparams != Py_None) { - if (oparams->ob_type != &record_Type) { - PyErr_SetString(PyExc_TypeError, "Execute argument must be a record"); - return NULL; - } - params = ((msiobj*)oparams)->h; - } - - status = MsiViewExecute(view->h, params); - if (status != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -view_fetch(msiobj *view, PyObject*args) -{ - int status; - MSIHANDLE result; - - status = MsiViewFetch(view->h, &result); - if (status == ERROR_NO_MORE_ITEMS) { - Py_RETURN_NONE; - } else if (status != ERROR_SUCCESS) { - return msierror(status); - } - - return record_new(result); -} - -static PyObject* -view_getcolumninfo(msiobj *view, PyObject *args) -{ - int status; - int kind; - MSIHANDLE result; - - if (!PyArg_ParseTuple(args, "i:GetColumnInfo", &kind)) - return NULL; - - if ((status = MsiViewGetColumnInfo(view->h, kind, &result)) != ERROR_SUCCESS) - return msierror(status); - - return record_new(result); -} - -static PyObject* -view_modify(msiobj *view, PyObject *args) -{ - int kind; - PyObject *data; - int status; - - if (!PyArg_ParseTuple(args, "iO:Modify", &kind, &data)) - return NULL; - - if (data->ob_type != &record_Type) { - PyErr_SetString(PyExc_TypeError, "Modify expects a record object"); - return NULL; - } - - if ((status = MsiViewModify(view->h, kind, ((msiobj*)data)->h)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -view_close(msiobj *view, PyObject*args) -{ - int status; - - if ((status = MsiViewClose(view->h)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef view_methods[] = { - { "Execute", (PyCFunction)view_execute, METH_VARARGS, - PyDoc_STR("Execute(params=None) -> None\nWraps MsiViewExecute")}, - { "GetColumnInfo", (PyCFunction)view_getcolumninfo, METH_VARARGS, - PyDoc_STR("GetColumnInfo() -> result\nWraps MsiGetColumnInfo")}, - { "Fetch", (PyCFunction)view_fetch, METH_NOARGS, - PyDoc_STR("Fetch() -> result\nWraps MsiViewFetch")}, - { "Modify", (PyCFunction)view_modify, METH_VARARGS, - PyDoc_STR("Modify(mode,record) -> None\nWraps MsiViewModify")}, - { "Close", (PyCFunction)view_close, METH_NOARGS, - PyDoc_STR("Close() -> result\nWraps MsiViewClose")}, - { NULL, NULL } -}; - -static PyTypeObject msiview_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_msi.View", /*tp_name*/ - sizeof(msiobj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - PyObject_GenericSetAttr,/*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - view_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; - -/*************************** Database objects **************/ - -static PyObject* -msidb_openview(msiobj *msidb, PyObject *args) -{ - int status; - char *sql; - MSIHANDLE hView; - msiobj *result; - - if (!PyArg_ParseTuple(args, "s:OpenView", &sql)) - return NULL; - - if ((status = MsiDatabaseOpenView(msidb->h, sql, &hView)) != ERROR_SUCCESS) - return msierror(status); - - result = PyObject_NEW(struct msiobj, &msiview_Type); - if (!result) { - MsiCloseHandle(hView); - return NULL; - } - - result->h = hView; - return (PyObject*)result; -} - -static PyObject* -msidb_commit(msiobj *msidb, PyObject *args) -{ - int status; - - if ((status = MsiDatabaseCommit(msidb->h)) != ERROR_SUCCESS) - return msierror(status); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -msidb_getsummaryinformation(msiobj *db, PyObject *args) -{ - int status; - int count; - MSIHANDLE result; - msiobj *oresult; - - if (!PyArg_ParseTuple(args, "i:GetSummaryInformation", &count)) - return NULL; - - status = MsiGetSummaryInformation(db->h, NULL, count, &result); - if (status != ERROR_SUCCESS) - return msierror(status); - - oresult = PyObject_NEW(struct msiobj, &summary_Type); - if (!result) { - MsiCloseHandle(result); - return NULL; - } - - oresult->h = result; - return (PyObject*)oresult; -} - -static PyMethodDef db_methods[] = { - { "OpenView", (PyCFunction)msidb_openview, METH_VARARGS, - PyDoc_STR("OpenView(sql) -> viewobj\nWraps MsiDatabaseOpenView")}, - { "Commit", (PyCFunction)msidb_commit, METH_NOARGS, - PyDoc_STR("Commit() -> None\nWraps MsiDatabaseCommit")}, - { "GetSummaryInformation", (PyCFunction)msidb_getsummaryinformation, METH_VARARGS, - PyDoc_STR("GetSummaryInformation(updateCount) -> viewobj\nWraps MsiGetSummaryInformation")}, - { NULL, NULL } -}; - -static PyTypeObject msidb_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_msi.Database", /*tp_name*/ - sizeof(msiobj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - PyObject_GenericSetAttr,/*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - db_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; - -#define Py_NOT_PERSIST(x, flag) \ - (x != (int)(flag) && \ - x != ((int)(flag) | MSIDBOPEN_PATCHFILE)) - -#define Py_INVALID_PERSIST(x) \ - (Py_NOT_PERSIST(x, MSIDBOPEN_READONLY) && \ - Py_NOT_PERSIST(x, MSIDBOPEN_TRANSACT) && \ - Py_NOT_PERSIST(x, MSIDBOPEN_DIRECT) && \ - Py_NOT_PERSIST(x, MSIDBOPEN_CREATE) && \ - Py_NOT_PERSIST(x, MSIDBOPEN_CREATEDIRECT)) - -static PyObject* msiopendb(PyObject *obj, PyObject *args) -{ - int status; - char *path; - int persist; - MSIHANDLE h; - msiobj *result; - if (!PyArg_ParseTuple(args, "si:MSIOpenDatabase", &path, &persist)) - return NULL; - /* We need to validate that persist is a valid MSIDBOPEN_* value. Otherwise, - MsiOpenDatabase may treat the value as a pointer, leading to unexpected - behavior. */ - if (Py_INVALID_PERSIST(persist)) - return msierror(ERROR_INVALID_PARAMETER); - status = MsiOpenDatabase(path, (LPCSTR)persist, &h); - if (status != ERROR_SUCCESS) - return msierror(status); - - result = PyObject_NEW(struct msiobj, &msidb_Type); - if (!result) { - MsiCloseHandle(h); - return NULL; - } - result->h = h; - return (PyObject*)result; -} - -static PyObject* -createrecord(PyObject *o, PyObject *args) -{ - int count; - MSIHANDLE h; - - if (!PyArg_ParseTuple(args, "i:CreateRecord", &count)) - return NULL; - - h = MsiCreateRecord(count); - if (h == 0) - return msierror(0); - - return record_new(h); -} - - -static PyMethodDef msi_methods[] = { - {"UuidCreate", (PyCFunction)uuidcreate, METH_NOARGS, - PyDoc_STR("UuidCreate() -> string")}, - {"FCICreate", (PyCFunction)fcicreate, METH_VARARGS, - PyDoc_STR("fcicreate(cabname,files) -> None")}, - {"OpenDatabase", (PyCFunction)msiopendb, METH_VARARGS, - PyDoc_STR("OpenDatabase(name, flags) -> dbobj\nWraps MsiOpenDatabase")}, - {"CreateRecord", (PyCFunction)createrecord, METH_VARARGS, - PyDoc_STR("OpenDatabase(name, flags) -> dbobj\nWraps MsiCreateRecord")}, - {NULL, NULL} /* sentinel */ -}; - -static char msi_doc[] = "Documentation"; - - -static struct PyModuleDef _msimodule = { - PyModuleDef_HEAD_INIT, - "_msi", - msi_doc, - -1, - msi_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__msi(void) -{ - PyObject *m; - - m = PyModule_Create(&_msimodule); - if (m == NULL) - return NULL; - - PyModule_AddIntConstant(m, "MSIDBOPEN_CREATEDIRECT", (long)MSIDBOPEN_CREATEDIRECT); - PyModule_AddIntConstant(m, "MSIDBOPEN_CREATE", (long)MSIDBOPEN_CREATE); - PyModule_AddIntConstant(m, "MSIDBOPEN_DIRECT", (long)MSIDBOPEN_DIRECT); - PyModule_AddIntConstant(m, "MSIDBOPEN_READONLY", (long)MSIDBOPEN_READONLY); - PyModule_AddIntConstant(m, "MSIDBOPEN_TRANSACT", (long)MSIDBOPEN_TRANSACT); - PyModule_AddIntConstant(m, "MSIDBOPEN_PATCHFILE", (long)MSIDBOPEN_PATCHFILE); - - PyModule_AddIntMacro(m, MSICOLINFO_NAMES); - PyModule_AddIntMacro(m, MSICOLINFO_TYPES); - - PyModule_AddIntMacro(m, MSIMODIFY_SEEK); - PyModule_AddIntMacro(m, MSIMODIFY_REFRESH); - PyModule_AddIntMacro(m, MSIMODIFY_INSERT); - PyModule_AddIntMacro(m, MSIMODIFY_UPDATE); - PyModule_AddIntMacro(m, MSIMODIFY_ASSIGN); - PyModule_AddIntMacro(m, MSIMODIFY_REPLACE); - PyModule_AddIntMacro(m, MSIMODIFY_MERGE); - PyModule_AddIntMacro(m, MSIMODIFY_DELETE); - PyModule_AddIntMacro(m, MSIMODIFY_INSERT_TEMPORARY); - PyModule_AddIntMacro(m, MSIMODIFY_VALIDATE); - PyModule_AddIntMacro(m, MSIMODIFY_VALIDATE_NEW); - PyModule_AddIntMacro(m, MSIMODIFY_VALIDATE_FIELD); - PyModule_AddIntMacro(m, MSIMODIFY_VALIDATE_DELETE); - - PyModule_AddIntMacro(m, PID_CODEPAGE); - PyModule_AddIntMacro(m, PID_TITLE); - PyModule_AddIntMacro(m, PID_SUBJECT); - PyModule_AddIntMacro(m, PID_AUTHOR); - PyModule_AddIntMacro(m, PID_KEYWORDS); - PyModule_AddIntMacro(m, PID_COMMENTS); - PyModule_AddIntMacro(m, PID_TEMPLATE); - PyModule_AddIntMacro(m, PID_LASTAUTHOR); - PyModule_AddIntMacro(m, PID_REVNUMBER); - PyModule_AddIntMacro(m, PID_LASTPRINTED); - PyModule_AddIntMacro(m, PID_CREATE_DTM); - PyModule_AddIntMacro(m, PID_LASTSAVE_DTM); - PyModule_AddIntMacro(m, PID_PAGECOUNT); - PyModule_AddIntMacro(m, PID_WORDCOUNT); - PyModule_AddIntMacro(m, PID_CHARCOUNT); - PyModule_AddIntMacro(m, PID_APPNAME); - PyModule_AddIntMacro(m, PID_SECURITY); - - MSIError = PyErr_NewException ("_msi.MSIError", NULL, NULL); - if (!MSIError) - return NULL; - PyModule_AddObject(m, "MSIError", MSIError); - return m; -} diff --git a/third_party/python/PC/_testconsole.c b/third_party/python/PC/_testconsole.c deleted file mode 100644 index 23d1286ed..000000000 --- a/third_party/python/PC/_testconsole.c +++ /dev/null @@ -1,131 +0,0 @@ - -/* Testing module for multi-phase initialization of extension modules (PEP 489) - */ - -#include "Python.h" - -#ifdef MS_WINDOWS - -#include "..\modules\_io\_iomodule.h" - -#define WIN32_LEAN_AND_MEAN -#include -#include - - /* The full definition is in iomodule. We reproduce - enough here to get the handle, which is all we want. */ -typedef struct { - PyObject_HEAD - HANDLE handle; -} winconsoleio; - - -static int execfunc(PyObject *m) -{ - return 0; -} - -PyModuleDef_Slot testconsole_slots[] = { - {Py_mod_exec, execfunc}, - {0, NULL}, -}; - -/*[clinic input] -module _testconsole - -_testconsole.write_input - file: object - s: PyBytesObject - -Writes UTF-16-LE encoded bytes to the console as if typed by a user. -[clinic start generated code]*/ - -static PyObject * -_testconsole_write_input_impl(PyObject *module, PyObject *file, - PyBytesObject *s) -/*[clinic end generated code: output=48f9563db34aedb3 input=4c774f2d05770bc6]*/ -{ - INPUT_RECORD *rec = NULL; - - if (!PyWindowsConsoleIO_Check(file)) { - PyErr_SetString(PyExc_TypeError, "expected raw console object"); - return NULL; - } - - const wchar_t *p = (const wchar_t *)PyBytes_AS_STRING(s); - DWORD size = (DWORD)PyBytes_GET_SIZE(s) / sizeof(wchar_t); - - rec = (INPUT_RECORD*)PyMem_Malloc(sizeof(INPUT_RECORD) * size); - if (!rec) - goto error; - memset(rec, 0, sizeof(INPUT_RECORD) * size); - - INPUT_RECORD *prec = rec; - for (DWORD i = 0; i < size; ++i, ++p, ++prec) { - prec->EventType = KEY_EVENT; - prec->Event.KeyEvent.bKeyDown = TRUE; - prec->Event.KeyEvent.wRepeatCount = 10; - prec->Event.KeyEvent.uChar.UnicodeChar = *p; - } - - HANDLE hInput = ((winconsoleio*)file)->handle; - DWORD total = 0; - while (total < size) { - DWORD wrote; - if (!WriteConsoleInputW(hInput, &rec[total], (size - total), &wrote)) { - PyErr_SetFromWindowsErr(0); - goto error; - } - total += wrote; - } - - PyMem_Free((void*)rec); - - Py_RETURN_NONE; -error: - if (rec) - PyMem_Free((void*)rec); - return NULL; -} - -/*[clinic input] -_testconsole.read_output - file: object - -Reads a str from the console as written to stdout. -[clinic start generated code]*/ - -static PyObject * -_testconsole_read_output_impl(PyObject *module, PyObject *file) -/*[clinic end generated code: output=876310d81a73e6d2 input=b3521f64b1b558e3]*/ -{ - Py_RETURN_NONE; -} - -#include "clinic\_testconsole.c.h" - -PyMethodDef testconsole_methods[] = { - _TESTCONSOLE_WRITE_INPUT_METHODDEF - _TESTCONSOLE_READ_OUTPUT_METHODDEF - {NULL, NULL} -}; - -static PyModuleDef testconsole_def = { - PyModuleDef_HEAD_INIT, /* m_base */ - "_testconsole", /* m_name */ - PyDoc_STR("Test module for the Windows console"), /* m_doc */ - 0, /* m_size */ - testconsole_methods, /* m_methods */ - testconsole_slots, /* m_slots */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ -}; - -PyMODINIT_FUNC -PyInit__testconsole(PyObject *spec) -{ - return PyModuleDef_Init(&testconsole_def); -} - -#endif /* MS_WINDOWS */ diff --git a/third_party/python/PC/bdist_wininst/PythonPowered.bmp b/third_party/python/PC/bdist_wininst/PythonPowered.bmp deleted file mode 100644 index dd70709da61c3014d300147201498a653d15c483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2582 zcmdT_u}<7T5S>UVNUB9TTa?#;f|SN3-PuJTNGa}`fGGoQy5tK`{(wHsxuv5+*X0u^ zucb5HN%+t?@6C8^?;Vj)ib(NkXJ=<`_U-JxXJ?<{x1!H?*mr1O(cYuIlGm^zKi_B< zn7Xdz{{CL(^SRvJ-O26ktz2GSN|t4EaBv_=lF0u4zU=Jmh;vT1wzfp(wM@U*GUeYr z@^@+F|CaYq*Q^vBoSx+{jO)0q5A!R`Gp%0rEQeuS$3Bk;m{%ap>Y4R8*YSDv&5U{V zO;OBh3@|i5j2E2l=Pf5^M5rcdmcyP-Xw&SB@m2YtJ|hSPd5hs5^QKNDx}Lg$qZQfv zh4`w}_?}wfxZ7tnI!4-ZoTO=zkHJmaG|hYQTxZ>JkhgFVw!Rof#neTB1E3pReEU(j z80#&D>g#MARL0e-(c$O=eus#p*@^Chv*tfy+~4N{#Yn`}f!zG47x>pWSkA(a zQQ{_Ens9aE9ZgOQ&jB^BFajR@<7&K7-{9ih?V?K77Z-)rcMdDj72=!)_LY<8@bnBD z)FVAxASHUjcFt+CjyGfhdS_9AJHvhIT^7Ru5G_tSSgUVIDi}v{as*AevjlZ~9DK<> zubn5!Sj<+QlW=C&4W2?VMGKrcoxGryjlftvo zUM)Rkt8u8~W>0@DUbCuU8Cx6MaWlv>1yb@*0B{tmK_Y65I-9!-@=Sqs1+nLLPpUeq zKs9nWZn+ucnF7HfZRdnP-YO9pq3yJ(Z9Pt{qwxvb$G{| diff --git a/third_party/python/PC/bdist_wininst/README.txt b/third_party/python/PC/bdist_wininst/README.txt deleted file mode 100644 index 7c29be7c2..000000000 --- a/third_party/python/PC/bdist_wininst/README.txt +++ /dev/null @@ -1,5 +0,0 @@ - -XXX Write description -XXX Dont't forget to mention upx - -XXX Add pointer to this file into PC/README.txt diff --git a/third_party/python/PC/bdist_wininst/archive.h b/third_party/python/PC/bdist_wininst/archive.h deleted file mode 100644 index 50ff15cdd..000000000 --- a/third_party/python/PC/bdist_wininst/archive.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - IMPORTANT NOTE: IF THIS FILE IS CHANGED, PCBUILD\BDIST_WININST.VCXPROJ MUST - BE REBUILT AS WELL. - - IF CHANGES TO THIS FILE ARE CHECKED IN, THE RECOMPILED BINARIES MUST BE - CHECKED IN AS WELL! -*/ - -#pragma pack(1) - -/* zip-archive headers - * See: http://www.pkware.com/appnote.html - */ - -struct eof_cdir { - long tag; /* must be 0x06054b50 */ - short disknum; - short firstdisk; - short nTotalCDirThis; - short nTotalCDir; - long nBytesCDir; - long ofsCDir; - short commentlen; -}; - -struct cdir { - long tag; /* must be 0x02014b50 */ - short version_made; - short version_extract; - short gp_bitflag; - short comp_method; - short last_mod_file_time; - short last_mod_file_date; - long crc32; - long comp_size; - long uncomp_size; - short fname_length; - short extra_length; - short comment_length; - short disknum_start; - short int_file_attr; - long ext_file_attr; - long ofs_local_header; -}; - -struct fhdr { - long tag; /* must be 0x04034b50 */ - short version_needed; - short flags; - short method; - short last_mod_file_time; - short last_mod_file_date; - long crc32; - long comp_size; - long uncomp_size; - short fname_length; - short extra_length; -}; - - -struct meta_data_hdr { - int tag; - int uncomp_size; - int bitmap_size; -}; - -#pragma pack() - -/* installation scheme */ - -typedef struct tagSCHEME { - char *name; - char *prefix; -} SCHEME; - -typedef int (*NOTIFYPROC)(int code, LPSTR text, ...); - -extern BOOL -extract_file(char *dst, char *src, int method, int comp_size, - int uncomp_size, NOTIFYPROC notify); - -extern BOOL -unzip_archive(SCHEME *scheme, char *dirname, char *data, - DWORD size, NOTIFYPROC notify); - -extern char * -map_new_file(DWORD flags, char *filename, char - *pathname_part, int size, - WORD wFatDate, WORD wFatTime, - NOTIFYPROC callback); - -extern BOOL -ensure_directory (char *pathname, char *new_part, - NOTIFYPROC callback); - -/* codes for NOITIFYPROC */ -#define DIR_CREATED 1 -#define CAN_OVERWRITE 2 -#define FILE_CREATED 3 -#define ZLIB_ERROR 4 -#define SYSTEM_ERROR 5 -#define NUM_FILES 6 -#define FILE_OVERWRITTEN 7 - diff --git a/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj b/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj deleted file mode 100644 index 9bbfda28c..000000000 --- a/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj +++ /dev/null @@ -1,108 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - PGInstrument - Win32 - - - PGInstrument - x64 - - - PGUpdate - Win32 - - - PGUpdate - x64 - - - Release - Win32 - - - Release - x64 - - - - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C} - wininst - false - - - - - Application - false - NotSet - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(PySourcePath)lib\distutils\command\ - false - wininst-$(VisualStudioVersion) - wininst-14.0 - wininst-12.0 - wininst-11.0 - wininst-10.0 - $(TargetName)-amd64 - .exe - - - - $(OutDir)wininst.tlb - - - MinSpace - $(PySourcePath)Modules\zlib;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDebug - MultiThreaded - - - $(PySourcePath)PC\bdist_wininst;%(AdditionalIncludeDirectories) - - - comctl32.lib;imagehlp.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj.filters b/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj.filters deleted file mode 100644 index b4b6a4d51..000000000 --- a/third_party/python/PC/bdist_wininst/bdist_wininst.vcxproj.filters +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {293b1092-03ad-4b7c-acb9-c4ab62e52f55} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {0edc0406-282f-4dbc-b60e-a867c34a2a31} - - - {ea0c0f0e-3b73-474e-a999-e9689d032ccc} - h;hpp;hxx;hm;inl - - - {0c77c1cf-3f87-4f87-bd86-b425211c2181} - ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - Source Files - - - Source Files - - - Source Files\zlib - - - Source Files\zlib - - - Source Files\zlib - - - Source Files\zlib - - - Source Files\zlib - - - Source Files\zlib - - - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/third_party/python/PC/bdist_wininst/build.bat b/third_party/python/PC/bdist_wininst/build.bat deleted file mode 100644 index d5cf75206..000000000 --- a/third_party/python/PC/bdist_wininst/build.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -setlocal - -set D=%~dp0 -set PCBUILD=%~dp0..\..\PCBuild\ - - -echo Building Lib\distutils\command\wininst-xx.0.exe - -call "%PCBUILD%find_msbuild.bat" %MSBUILD% -if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) - -%MSBUILD% "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=Win32 -if errorlevel 1 goto :eof - - -echo Building Lib\distutils\command\wininst-xx.0-amd64.exe - -%MSBUILD% "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=x64 diff --git a/third_party/python/PC/bdist_wininst/extract.c b/third_party/python/PC/bdist_wininst/extract.c deleted file mode 100644 index 0249d9ff5..000000000 --- a/third_party/python/PC/bdist_wininst/extract.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - IMPORTANT NOTE: IF THIS FILE IS CHANGED, PCBUILD\BDIST_WININST.VCXPROJ MUST - BE REBUILT AS WELL. - - IF CHANGES TO THIS FILE ARE CHECKED IN, THE RECOMPILED BINARIES MUST BE - CHECKED IN AS WELL! -*/ - -#include - -#include "zlib.h" - -#include -#include - -#include "archive.h" - -/* Convert unix-path to dos-path */ -static void normpath(char *path) -{ - while (path && *path) { - if (*path == '/') - *path = '\\'; - ++path; - } -} - -BOOL ensure_directory(char *pathname, char *new_part, NOTIFYPROC notify) -{ - while (new_part && *new_part && (new_part = strchr(new_part, '\\'))) { - DWORD attr; - *new_part = '\0'; - attr = GetFileAttributes(pathname); - if (attr == -1) { - /* nothing found */ - if (!CreateDirectory(pathname, NULL) && notify) - notify(SYSTEM_ERROR, - "CreateDirectory (%s)", pathname); - else - notify(DIR_CREATED, pathname); - } - if (attr & FILE_ATTRIBUTE_DIRECTORY) { - ; - } else { - SetLastError(183); - if (notify) - notify(SYSTEM_ERROR, - "CreateDirectory (%s)", pathname); - } - *new_part = '\\'; - ++new_part; - } - return TRUE; -} - -/* XXX Should better explicitly specify - * uncomp_size and file_times instead of pfhdr! - */ -char *map_new_file(DWORD flags, char *filename, - char *pathname_part, int size, - WORD wFatDate, WORD wFatTime, - NOTIFYPROC notify) -{ - HANDLE hFile, hFileMapping; - char *dst; - FILETIME ft; - - try_again: - if (!flags) - flags = CREATE_NEW; - hFile = CreateFile(filename, - GENERIC_WRITE | GENERIC_READ, - 0, NULL, - flags, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - DWORD x = GetLastError(); - switch (x) { - case ERROR_FILE_EXISTS: - if (notify && notify(CAN_OVERWRITE, filename)) - hFile = CreateFile(filename, - GENERIC_WRITE|GENERIC_READ, - 0, NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - else { - if (notify) - notify(FILE_OVERWRITTEN, filename); - return NULL; - } - break; - case ERROR_PATH_NOT_FOUND: - if (ensure_directory(filename, pathname_part, notify)) - goto try_again; - else - return FALSE; - break; - default: - SetLastError(x); - break; - } - } - if (hFile == INVALID_HANDLE_VALUE) { - if (notify) - notify (SYSTEM_ERROR, "CreateFile (%s)", filename); - return NULL; - } - - if (notify) - notify(FILE_CREATED, filename); - - DosDateTimeToFileTime(wFatDate, wFatTime, &ft); - SetFileTime(hFile, &ft, &ft, &ft); - - - if (size == 0) { - /* We cannot map a zero-length file (Also it makes - no sense */ - CloseHandle(hFile); - return NULL; - } - - hFileMapping = CreateFileMapping(hFile, - NULL, PAGE_READWRITE, 0, size, NULL); - - CloseHandle(hFile); - - if (hFileMapping == NULL) { - if (notify) - notify(SYSTEM_ERROR, - "CreateFileMapping (%s)", filename); - return NULL; - } - - dst = MapViewOfFile(hFileMapping, - FILE_MAP_WRITE, 0, 0, 0); - - CloseHandle(hFileMapping); - - if (!dst) { - if (notify) - notify(SYSTEM_ERROR, "MapViewOfFile (%s)", filename); - return NULL; - } - return dst; -} - - -BOOL -extract_file(char *dst, char *src, int method, int comp_size, - int uncomp_size, NOTIFYPROC notify) -{ - z_stream zstream; - int result; - - if (method == Z_DEFLATED) { - int x; - memset(&zstream, 0, sizeof(zstream)); - zstream.next_in = src; - zstream.avail_in = comp_size+1; - zstream.next_out = dst; - zstream.avail_out = uncomp_size; - -/* Apparently an undocumented feature of zlib: Set windowsize - to negative values to suppress the gzip header and be compatible with - zip! */ - result = TRUE; - if (Z_OK != (x = inflateInit2(&zstream, -15))) { - if (notify) - notify(ZLIB_ERROR, - "inflateInit2 returns %d", x); - result = FALSE; - goto cleanup; - } - if (Z_STREAM_END != (x = inflate(&zstream, Z_FINISH))) { - if (notify) - notify(ZLIB_ERROR, - "inflate returns %d", x); - result = FALSE; - } - cleanup: - if (Z_OK != (x = inflateEnd(&zstream))) { - if (notify) - notify (ZLIB_ERROR, - "inflateEnd returns %d", x); - result = FALSE; - } - } else if (method == 0) { - memcpy(dst, src, uncomp_size); - result = TRUE; - } else - result = FALSE; - UnmapViewOfFile(dst); - return result; -} - -/* Open a zip-compatible archive and extract all files - * into the specified directory (which is assumed to exist) - */ -BOOL -unzip_archive(SCHEME *scheme, char *dirname, char *data, DWORD size, - NOTIFYPROC notify) -{ - int n; - char pathname[MAX_PATH]; - char *new_part; - - /* read the end of central directory record */ - struct eof_cdir *pe = (struct eof_cdir *)&data[size - sizeof - (struct eof_cdir)]; - - int arc_start = size - sizeof (struct eof_cdir) - pe->nBytesCDir - - pe->ofsCDir; - - /* set position to start of central directory */ - int pos = arc_start + pe->ofsCDir; - - /* make sure this is a zip file */ - if (pe->tag != 0x06054b50) - return FALSE; - - /* Loop through the central directory, reading all entries */ - for (n = 0; n < pe->nTotalCDir; ++n) { - int i; - char *fname; - char *pcomp; - char *dst; - struct cdir *pcdir; - struct fhdr *pfhdr; - - pcdir = (struct cdir *)&data[pos]; - pfhdr = (struct fhdr *)&data[pcdir->ofs_local_header + - arc_start]; - - if (pcdir->tag != 0x02014b50) - return FALSE; - if (pfhdr->tag != 0x04034b50) - return FALSE; - pos += sizeof(struct cdir); - fname = (char *)&data[pos]; /* This is not null terminated! */ - pos += pcdir->fname_length + pcdir->extra_length + - pcdir->comment_length; - - pcomp = &data[pcdir->ofs_local_header - + sizeof(struct fhdr) - + arc_start - + pfhdr->fname_length - + pfhdr->extra_length]; - - /* dirname is the Python home directory (prefix) */ - strcpy(pathname, dirname); - if (pathname[strlen(pathname)-1] != '\\') - strcat(pathname, "\\"); - new_part = &pathname[lstrlen(pathname)]; - /* we must now match the first part of the pathname - * in the archive to a component in the installation - * scheme (PURELIB, PLATLIB, HEADERS, SCRIPTS, or DATA) - * and replace this part by the one in the scheme to use - */ - for (i = 0; scheme[i].name; ++i) { - if (0 == strnicmp(scheme[i].name, fname, - strlen(scheme[i].name))) { - char *rest; - int len; - - /* length of the replaced part */ - int namelen = strlen(scheme[i].name); - - strcat(pathname, scheme[i].prefix); - - rest = fname + namelen; - len = pfhdr->fname_length - namelen; - - if ((pathname[strlen(pathname)-1] != '\\') - && (pathname[strlen(pathname)-1] != '/')) - strcat(pathname, "\\"); - /* Now that pathname ends with a separator, - * we must make sure rest does not start with - * an additional one. - */ - if ((rest[0] == '\\') || (rest[0] == '/')) { - ++rest; - --len; - } - - strncat(pathname, rest, len); - goto Done; - } - } - /* no prefix to replace found, go unchanged */ - strncat(pathname, fname, pfhdr->fname_length); - Done: - normpath(pathname); - if (pathname[strlen(pathname)-1] != '\\') { - /* - * The local file header (pfhdr) does not always - * contain the compressed and uncompressed sizes of - * the data depending on bit 3 of the flags field. So - * it seems better to use the data from the central - * directory (pcdir). - */ - dst = map_new_file(0, pathname, new_part, - pcdir->uncomp_size, - pcdir->last_mod_file_date, - pcdir->last_mod_file_time, notify); - if (dst) { - if (!extract_file(dst, pcomp, pfhdr->method, - pcdir->comp_size, - pcdir->uncomp_size, - notify)) - return FALSE; - } /* else ??? */ - } - if (notify) - notify(NUM_FILES, new_part, (int)pe->nTotalCDir, - (int)n+1); - } - return TRUE; -} diff --git a/third_party/python/PC/bdist_wininst/install.c b/third_party/python/PC/bdist_wininst/install.c deleted file mode 100644 index 17cc30d25..000000000 --- a/third_party/python/PC/bdist_wininst/install.c +++ /dev/null @@ -1,2700 +0,0 @@ -/* - IMPORTANT NOTE: IF THIS FILE IS CHANGED, PCBUILD\BDIST_WININST.VCXPROJ MUST - BE REBUILT AS WELL. - - IF CHANGES TO THIS FILE ARE CHECKED IN, THE RECOMPILED BINARIES MUST BE - CHECKED IN AS WELL! -*/ - -/* - * Written by Thomas Heller, May 2000 - * - * $Id$ - */ - -/* - * Windows Installer program for distutils. - * - * (a kind of self-extracting zip-file) - * - * At runtime, the exefile has appended: - * - compressed setup-data in ini-format, containing the following sections: - * [metadata] - * author=Greg Ward - * author_email=gward@python.net - * description=Python Distribution Utilities - * licence=Python - * name=Distutils - * url=http://www.python.org/sigs/distutils-sig/ - * version=0.9pre - * - * [Setup] - * info= text to be displayed in the edit-box - * title= to be displayed by this program - * target_version = if present, python version required - * pyc_compile = if 0, do not compile py to pyc - * pyo_compile = if 0, do not compile py to pyo - * - * - a struct meta_data_hdr, describing the above - * - a zip-file, containing the modules to be installed. - * for the format see http://www.pkware.com/appnote.html - * - * What does this program do? - * - the setup-data is uncompressed and written to a temporary file. - * - setup-data is queried with GetPrivateProfile... calls - * - [metadata] - info is displayed in the dialog box - * - The registry is searched for installations of python - * - The user can select the python version to use. - * - The python-installation directory (sys.prefix) is displayed - * - When the start-button is pressed, files from the zip-archive - * are extracted to the file system. All .py filenames are stored - * in a list. - */ -/* - * Includes now an uninstaller. - */ - -/* - * To Do: - * - * display some explanation when no python version is found - * instead showing the user an empty listbox to select something from. - * - * Finish the code so that we can use other python installations - * additionally to those found in the registry, - * and then #define USE_OTHER_PYTHON_VERSIONS - * - * - install a help-button, which will display something meaningful - * to the poor user. - * text to the user - * - should there be a possibility to display a README file - * before starting the installation (if one is present in the archive) - * - more comments about what the code does(?) - * - * - evolve this into a full blown installer (???) - */ - -#include -#include -#include -#include -#include -#include -#include "resource.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "archive.h" - -/* Only for debugging! - static int dprintf(char *fmt, ...) - { - char Buffer[4096]; - va_list marker; - int result; - - va_start(marker, fmt); - result = wvsprintf(Buffer, fmt, marker); - OutputDebugString(Buffer); - return result; - } -*/ - -/* Bah: global variables */ -FILE *logfile; - -char modulename[MAX_PATH]; -wchar_t wmodulename[MAX_PATH]; - -HWND hwndMain; -HWND hDialog; - -char *ini_file; /* Full pathname of ini-file */ -/* From ini-file */ -char info[4096]; /* [Setup] info= */ -char title[80]; /* [Setup] title=, contains package name - including version: "Distutils-1.0.1" */ -char target_version[10]; /* [Setup] target_version=, required python - version or empty string */ -char build_info[80]; /* [Setup] build_info=, distutils version - and build date */ - -char meta_name[80]; /* package name without version like - 'Distutils' */ -char install_script[MAX_PATH]; -char *pre_install_script; /* run before we install a single file */ - -char user_access_control[10]; // one of 'auto', 'force', otherwise none. - -int py_major, py_minor; /* Python version selected for installation */ - -char *arc_data; /* memory mapped archive */ -DWORD arc_size; /* number of bytes in archive */ -int exe_size; /* number of bytes for exe-file portion */ -char python_dir[MAX_PATH]; -char pythondll[MAX_PATH]; -BOOL pyc_compile, pyo_compile; -/* Either HKLM or HKCU, depending on where Python itself is registered, and - the permissions of the current user. */ -HKEY hkey_root = (HKEY)-1; - -BOOL success; /* Installation successful? */ -char *failure_reason = NULL; - -HANDLE hBitmap; -char *bitmap_bytes; - -static const char *REGISTRY_SUFFIX_6432 = -#ifdef _WIN64 - ""; -#else - "-32"; -#endif - - -#define WM_NUMFILES WM_USER+1 -/* wParam: 0, lParam: total number of files */ -#define WM_NEXTFILE WM_USER+2 -/* wParam: number of this file */ -/* lParam: points to pathname */ - -static BOOL notify(int code, char *fmt, ...); - -/* Note: If scheme.prefix is nonempty, it must end with a '\'! */ -/* Note: purelib must be the FIRST entry! */ -SCHEME old_scheme[] = { - { "PURELIB", "" }, - { "PLATLIB", "" }, - { "HEADERS", "" }, /* 'Include/dist_name' part already in archive */ - { "SCRIPTS", "Scripts\\" }, - { "DATA", "" }, - { NULL, NULL }, -}; - -SCHEME new_scheme[] = { - { "PURELIB", "Lib\\site-packages\\" }, - { "PLATLIB", "Lib\\site-packages\\" }, - { "HEADERS", "" }, /* 'Include/dist_name' part already in archive */ - { "SCRIPTS", "Scripts\\" }, - { "DATA", "" }, - { NULL, NULL }, -}; - -static void unescape(char *dst, char *src, unsigned size) -{ - char *eon; - char ch; - - while (src && *src && (size > 2)) { - if (*src == '\\') { - switch (*++src) { - case 'n': - ++src; - *dst++ = '\r'; - *dst++ = '\n'; - size -= 2; - break; - case 'r': - ++src; - *dst++ = '\r'; - --size; - break; - case '0': case '1': case '2': case '3': - ch = (char)strtol(src, &eon, 8); - if (ch == '\n') { - *dst++ = '\r'; - --size; - } - *dst++ = ch; - --size; - src = eon; - } - } else { - *dst++ = *src++; - --size; - } - } - *dst = '\0'; -} - -static struct tagFile { - char *path; - struct tagFile *next; -} *file_list = NULL; - -static void set_failure_reason(char *reason) -{ - if (failure_reason) - free(failure_reason); - failure_reason = strdup(reason); - success = FALSE; -} -static char *get_failure_reason() -{ - if (!failure_reason) - return "Installation failed."; - return failure_reason; -} - -static void add_to_filelist(char *path) -{ - struct tagFile *p; - p = (struct tagFile *)malloc(sizeof(struct tagFile)); - p->path = strdup(path); - p->next = file_list; - file_list = p; -} - -static int do_compile_files(int (__cdecl * PyRun_SimpleString)(char *), - int optimize) -{ - struct tagFile *p; - int total, n; - char Buffer[MAX_PATH + 64]; - int errors = 0; - - total = 0; - p = file_list; - while (p) { - ++total; - p = p->next; - } - SendDlgItemMessage(hDialog, IDC_PROGRESS, PBM_SETRANGE, 0, - MAKELPARAM(0, total)); - SendDlgItemMessage(hDialog, IDC_PROGRESS, PBM_SETPOS, 0, 0); - - n = 0; - p = file_list; - while (p) { - ++n; - wsprintf(Buffer, - "import py_compile; py_compile.compile (r'%s')", - p->path); - if (PyRun_SimpleString(Buffer)) { - ++errors; - } - /* We send the notification even if the files could not - * be created so that the uninstaller will remove them - * in case they are created later. - */ - wsprintf(Buffer, "%s%c", p->path, optimize ? 'o' : 'c'); - notify(FILE_CREATED, Buffer); - - SendDlgItemMessage(hDialog, IDC_PROGRESS, PBM_SETPOS, n, 0); - SetDlgItemText(hDialog, IDC_INFO, p->path); - p = p->next; - } - return errors; -} - -#define DECLPROC(dll, result, name, args)\ - typedef result (*__PROC__##name) args;\ - result (*name)args = (__PROC__##name)GetProcAddress(dll, #name) - - -#define DECLVAR(dll, type, name)\ - type *name = (type*)GetProcAddress(dll, #name) - -typedef void PyObject; - -// Convert a "char *" string to "whcar_t *", or NULL on error. -// Result string must be free'd -wchar_t *widen_string(char *src) -{ - wchar_t *result; - DWORD dest_cch; - int src_len = strlen(src) + 1; // include NULL term in all ops - /* use MultiByteToWideChar() to see how much we need. */ - /* NOTE: this will include the null-term in the length */ - dest_cch = MultiByteToWideChar(CP_ACP, 0, src, src_len, NULL, 0); - // alloc the buffer - result = (wchar_t *)malloc(dest_cch * sizeof(wchar_t)); - if (result==NULL) - return NULL; - /* do the conversion */ - if (0==MultiByteToWideChar(CP_ACP, 0, src, src_len, result, dest_cch)) { - free(result); - return NULL; - } - return result; -} - -/* - * Returns number of files which failed to compile, - * -1 if python could not be loaded at all - */ -static int compile_filelist(HINSTANCE hPython, BOOL optimize_flag) -{ - DECLPROC(hPython, void, Py_Initialize, (void)); - DECLPROC(hPython, void, Py_SetProgramName, (wchar_t *)); - DECLPROC(hPython, void, Py_Finalize, (void)); - DECLPROC(hPython, int, PyRun_SimpleString, (char *)); - DECLPROC(hPython, PyObject *, PySys_GetObject, (char *)); - DECLVAR(hPython, int, Py_OptimizeFlag); - - int errors = 0; - struct tagFile *p = file_list; - - if (!p) - return 0; - - if (!Py_Initialize || !Py_SetProgramName || !Py_Finalize) - return -1; - - if (!PyRun_SimpleString || !PySys_GetObject || !Py_OptimizeFlag) - return -1; - - *Py_OptimizeFlag = optimize_flag ? 1 : 0; - Py_SetProgramName(wmodulename); - Py_Initialize(); - - errors += do_compile_files(PyRun_SimpleString, optimize_flag); - Py_Finalize(); - - return errors; -} - -typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); - -struct PyMethodDef { - char *ml_name; - PyCFunction ml_meth; - int ml_flags; - char *ml_doc; -}; -typedef struct PyMethodDef PyMethodDef; - -// XXX - all of these are potentially fragile! We load and unload -// the Python DLL multiple times - so storing functions pointers -// is dangerous (although things *look* OK at present) -// Better might be to roll prepare_script_environment() into -// LoadPythonDll(), and create a new UnloadPythonDLL() which also -// clears the global pointers. -void *(*g_Py_BuildValue)(char *, ...); -int (*g_PyArg_ParseTuple)(PyObject *, char *, ...); -PyObject * (*g_PyLong_FromVoidPtr)(void *); - -PyObject *g_PyExc_ValueError; -PyObject *g_PyExc_OSError; - -PyObject *(*g_PyErr_Format)(PyObject *, char *, ...); - -#define DEF_CSIDL(name) { name, #name } - -struct { - int nFolder; - char *name; -} csidl_names[] = { - /* Startup menu for all users. - NT only */ - DEF_CSIDL(CSIDL_COMMON_STARTMENU), - /* Startup menu. */ - DEF_CSIDL(CSIDL_STARTMENU), - -/* DEF_CSIDL(CSIDL_COMMON_APPDATA), */ -/* DEF_CSIDL(CSIDL_LOCAL_APPDATA), */ - /* Repository for application-specific data. - Needs Internet Explorer 4.0 */ - DEF_CSIDL(CSIDL_APPDATA), - - /* The desktop for all users. - NT only */ - DEF_CSIDL(CSIDL_COMMON_DESKTOPDIRECTORY), - /* The desktop. */ - DEF_CSIDL(CSIDL_DESKTOPDIRECTORY), - - /* Startup folder for all users. - NT only */ - DEF_CSIDL(CSIDL_COMMON_STARTUP), - /* Startup folder. */ - DEF_CSIDL(CSIDL_STARTUP), - - /* Programs item in the start menu for all users. - NT only */ - DEF_CSIDL(CSIDL_COMMON_PROGRAMS), - /* Program item in the user's start menu. */ - DEF_CSIDL(CSIDL_PROGRAMS), - -/* DEF_CSIDL(CSIDL_PROGRAM_FILES_COMMON), */ -/* DEF_CSIDL(CSIDL_PROGRAM_FILES), */ - - /* Virtual folder containing fonts. */ - DEF_CSIDL(CSIDL_FONTS), -}; - -#define DIM(a) (sizeof(a) / sizeof((a)[0])) - -static PyObject *FileCreated(PyObject *self, PyObject *args) -{ - char *path; - if (!g_PyArg_ParseTuple(args, "s", &path)) - return NULL; - notify(FILE_CREATED, path); - return g_Py_BuildValue(""); -} - -static PyObject *DirectoryCreated(PyObject *self, PyObject *args) -{ - char *path; - if (!g_PyArg_ParseTuple(args, "s", &path)) - return NULL; - notify(DIR_CREATED, path); - return g_Py_BuildValue(""); -} - -static PyObject *GetSpecialFolderPath(PyObject *self, PyObject *args) -{ - char *name; - char lpszPath[MAX_PATH]; - int i; - static HRESULT (WINAPI *My_SHGetSpecialFolderPath)(HWND hwnd, - LPTSTR lpszPath, - int nFolder, - BOOL fCreate); - - if (!My_SHGetSpecialFolderPath) { - HINSTANCE hLib = LoadLibrary("shell32.dll"); - if (!hLib) { - g_PyErr_Format(g_PyExc_OSError, - "function not available"); - return NULL; - } - My_SHGetSpecialFolderPath = (BOOL (WINAPI *)(HWND, LPTSTR, - int, BOOL)) - GetProcAddress(hLib, - "SHGetSpecialFolderPathA"); - } - - if (!g_PyArg_ParseTuple(args, "s", &name)) - return NULL; - - if (!My_SHGetSpecialFolderPath) { - g_PyErr_Format(g_PyExc_OSError, "function not available"); - return NULL; - } - - for (i = 0; i < DIM(csidl_names); ++i) { - if (0 == strcmpi(csidl_names[i].name, name)) { - int nFolder; - nFolder = csidl_names[i].nFolder; - if (My_SHGetSpecialFolderPath(NULL, lpszPath, - nFolder, 0)) - return g_Py_BuildValue("s", lpszPath); - else { - g_PyErr_Format(g_PyExc_OSError, - "no such folder (%s)", name); - return NULL; - } - - } - }; - g_PyErr_Format(g_PyExc_ValueError, "unknown CSIDL (%s)", name); - return NULL; -} - -static PyObject *CreateShortcut(PyObject *self, PyObject *args) -{ - char *path; /* path and filename */ - char *description; - char *filename; - - char *arguments = NULL; - char *iconpath = NULL; - int iconindex = 0; - char *workdir = NULL; - - WCHAR wszFilename[MAX_PATH]; - - IShellLink *ps1 = NULL; - IPersistFile *pPf = NULL; - - HRESULT hr; - - hr = CoInitialize(NULL); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "CoInitialize failed, error 0x%x", hr); - goto error; - } - - if (!g_PyArg_ParseTuple(args, "sss|sssi", - &path, &description, &filename, - &arguments, &workdir, &iconpath, &iconindex)) - return NULL; - - hr = CoCreateInstance(&CLSID_ShellLink, - NULL, - CLSCTX_INPROC_SERVER, - &IID_IShellLink, - &ps1); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "CoCreateInstance failed, error 0x%x", hr); - goto error; - } - - hr = ps1->lpVtbl->QueryInterface(ps1, &IID_IPersistFile, - (void **)&pPf); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "QueryInterface(IPersistFile) error 0x%x", hr); - goto error; - } - - - hr = ps1->lpVtbl->SetPath(ps1, path); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "SetPath() failed, error 0x%x", hr); - goto error; - } - - hr = ps1->lpVtbl->SetDescription(ps1, description); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "SetDescription() failed, error 0x%x", hr); - goto error; - } - - if (arguments) { - hr = ps1->lpVtbl->SetArguments(ps1, arguments); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "SetArguments() error 0x%x", hr); - goto error; - } - } - - if (iconpath) { - hr = ps1->lpVtbl->SetIconLocation(ps1, iconpath, iconindex); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "SetIconLocation() error 0x%x", hr); - goto error; - } - } - - if (workdir) { - hr = ps1->lpVtbl->SetWorkingDirectory(ps1, workdir); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "SetWorkingDirectory() error 0x%x", hr); - goto error; - } - } - - MultiByteToWideChar(CP_ACP, 0, - filename, -1, - wszFilename, MAX_PATH); - - hr = pPf->lpVtbl->Save(pPf, wszFilename, TRUE); - if (FAILED(hr)) { - g_PyErr_Format(g_PyExc_OSError, - "Failed to create shortcut '%s' - error 0x%x", filename, hr); - goto error; - } - - pPf->lpVtbl->Release(pPf); - ps1->lpVtbl->Release(ps1); - CoUninitialize(); - return g_Py_BuildValue(""); - - error: - if (pPf) - pPf->lpVtbl->Release(pPf); - - if (ps1) - ps1->lpVtbl->Release(ps1); - - CoUninitialize(); - - return NULL; -} - -static PyObject *PyMessageBox(PyObject *self, PyObject *args) -{ - int rc; - char *text, *caption; - int flags; - if (!g_PyArg_ParseTuple(args, "ssi", &text, &caption, &flags)) - return NULL; - rc = MessageBox(GetFocus(), text, caption, flags); - return g_Py_BuildValue("i", rc); -} - -static PyObject *GetRootHKey(PyObject *self) -{ - return g_PyLong_FromVoidPtr(hkey_root); -} - -#define METH_VARARGS 0x0001 -#define METH_NOARGS 0x0004 -typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); - -PyMethodDef meth[] = { - {"create_shortcut", CreateShortcut, METH_VARARGS, NULL}, - {"get_special_folder_path", GetSpecialFolderPath, METH_VARARGS, NULL}, - {"get_root_hkey", (PyCFunction)GetRootHKey, METH_NOARGS, NULL}, - {"file_created", FileCreated, METH_VARARGS, NULL}, - {"directory_created", DirectoryCreated, METH_VARARGS, NULL}, - {"message_box", PyMessageBox, METH_VARARGS, NULL}, -}; - -static HINSTANCE LoadPythonDll(char *fname) -{ - char fullpath[_MAX_PATH]; - LONG size = sizeof(fullpath); - char subkey_name[80]; - char buffer[260 + 12]; - HINSTANCE h; - - /* make sure PYTHONHOME is set, to that sys.path is initialized correctly */ - wsprintf(buffer, "PYTHONHOME=%s", python_dir); - _putenv(buffer); - h = LoadLibrary(fname); - if (h) - return h; - wsprintf(subkey_name, - "SOFTWARE\\Python\\PythonCore\\%d.%d%s\\InstallPath", - py_major, py_minor, REGISTRY_SUFFIX_6432); - if (ERROR_SUCCESS != RegQueryValue(HKEY_CURRENT_USER, subkey_name, - fullpath, &size) && - ERROR_SUCCESS != RegQueryValue(HKEY_LOCAL_MACHINE, subkey_name, - fullpath, &size)) - return NULL; - strcat(fullpath, "\\"); - strcat(fullpath, fname); - // We use LOAD_WITH_ALTERED_SEARCH_PATH to ensure any dependent DLLs - // next to the Python DLL (eg, the CRT DLL) are also loaded. - return LoadLibraryEx(fullpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); -} - -static int prepare_script_environment(HINSTANCE hPython) -{ - PyObject *mod; - DECLPROC(hPython, PyObject *, PyImport_ImportModule, (char *)); - DECLPROC(hPython, int, PyObject_SetAttrString, (PyObject *, char *, PyObject *)); - DECLPROC(hPython, PyObject *, PyObject_GetAttrString, (PyObject *, char *)); - DECLPROC(hPython, PyObject *, PyCFunction_New, (PyMethodDef *, PyObject *)); - DECLPROC(hPython, PyObject *, Py_BuildValue, (char *, ...)); - DECLPROC(hPython, int, PyArg_ParseTuple, (PyObject *, char *, ...)); - DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *)); - DECLPROC(hPython, PyObject *, PyLong_FromVoidPtr, (void *)); - if (!PyImport_ImportModule || !PyObject_GetAttrString || - !PyObject_SetAttrString || !PyCFunction_New) - return 1; - if (!Py_BuildValue || !PyArg_ParseTuple || !PyErr_Format) - return 1; - - mod = PyImport_ImportModule("builtins"); - if (mod) { - int i; - g_PyExc_ValueError = PyObject_GetAttrString(mod, "ValueError"); - g_PyExc_OSError = PyObject_GetAttrString(mod, "OSError"); - for (i = 0; i < DIM(meth); ++i) { - PyObject_SetAttrString(mod, meth[i].ml_name, - PyCFunction_New(&meth[i], NULL)); - } - } - g_Py_BuildValue = Py_BuildValue; - g_PyArg_ParseTuple = PyArg_ParseTuple; - g_PyErr_Format = PyErr_Format; - g_PyLong_FromVoidPtr = PyLong_FromVoidPtr; - - return 0; -} - -/* - * This function returns one of the following error codes: - * 1 if the Python-dll does not export the functions we need - * 2 if no install-script is specified in pathname - * 3 if the install-script file could not be opened - * the return value of PyRun_SimpleString() or Py_FinalizeEx() otherwise, - * which is 0 if everything is ok, -1 if an exception had occurred - * in the install-script. - */ - -static int -do_run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv) -{ - int fh, result, i; - static wchar_t *wargv[256]; - DECLPROC(hPython, void, Py_Initialize, (void)); - DECLPROC(hPython, int, PySys_SetArgv, (int, wchar_t **)); - DECLPROC(hPython, int, PyRun_SimpleString, (char *)); - DECLPROC(hPython, int, Py_FinalizeEx, (void)); - DECLPROC(hPython, PyObject *, Py_BuildValue, (char *, ...)); - DECLPROC(hPython, PyObject *, PyCFunction_New, - (PyMethodDef *, PyObject *)); - DECLPROC(hPython, int, PyArg_ParseTuple, (PyObject *, char *, ...)); - DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *)); - - if (!Py_Initialize || !PySys_SetArgv - || !PyRun_SimpleString || !Py_FinalizeEx) - return 1; - - if (!Py_BuildValue || !PyArg_ParseTuple || !PyErr_Format) - return 1; - - if (!PyCFunction_New || !PyArg_ParseTuple || !PyErr_Format) - return 1; - - if (pathname == NULL || pathname[0] == '\0') - return 2; - - fh = open(pathname, _O_RDONLY | O_NOINHERIT); - if (-1 == fh) { - fprintf(stderr, "Could not open postinstall-script %s\n", - pathname); - return 3; - } - - SetDlgItemText(hDialog, IDC_INFO, "Running Script..."); - - Py_Initialize(); - - prepare_script_environment(hPython); - // widen the argv array for py3k. - memset(wargv, 0, sizeof(wargv)); - for (i=0;i 0) { - script[n] = '\n'; - script[n+1] = 0; - result = PyRun_SimpleString(script); - } - } - } - if (Py_FinalizeEx() < 0) { - result = -1; - } - - close(fh); - return result; -} - -static int -run_installscript(char *pathname, int argc, char **argv, char **pOutput) -{ - HINSTANCE hPython; - int result = 1; - int out_buf_size; - HANDLE redirected, old_stderr, old_stdout; - char *tempname; - - *pOutput = NULL; - - tempname = tempnam(NULL, NULL); - // We use a static CRT while the Python version we load uses - // the CRT from one of various possible DLLs. As a result we - // need to redirect the standard handles using the API rather - // than the CRT. - redirected = CreateFile( - tempname, - GENERIC_WRITE | GENERIC_READ, - FILE_SHARE_READ, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, - NULL); - old_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - old_stderr = GetStdHandle(STD_ERROR_HANDLE); - SetStdHandle(STD_OUTPUT_HANDLE, redirected); - SetStdHandle(STD_ERROR_HANDLE, redirected); - - hPython = LoadPythonDll(pythondll); - if (hPython) { - result = do_run_installscript(hPython, pathname, argc, argv); - FreeLibrary(hPython); - } else { - fprintf(stderr, "*** Could not load Python ***"); - } - SetStdHandle(STD_OUTPUT_HANDLE, old_stdout); - SetStdHandle(STD_ERROR_HANDLE, old_stderr); - out_buf_size = min(GetFileSize(redirected, NULL), 4096); - *pOutput = malloc(out_buf_size+1); - if (*pOutput) { - DWORD nread = 0; - SetFilePointer(redirected, 0, 0, FILE_BEGIN); - ReadFile(redirected, *pOutput, out_buf_size, &nread, NULL); - (*pOutput)[nread] = '\0'; - } - CloseHandle(redirected); - DeleteFile(tempname); - return result; -} - -static int do_run_simple_script(HINSTANCE hPython, char *script) -{ - int rc; - DECLPROC(hPython, void, Py_Initialize, (void)); - DECLPROC(hPython, void, Py_SetProgramName, (wchar_t *)); - DECLPROC(hPython, int, Py_FinalizeEx, (void)); - DECLPROC(hPython, int, PyRun_SimpleString, (char *)); - DECLPROC(hPython, void, PyErr_Print, (void)); - - if (!Py_Initialize || !Py_SetProgramName || !Py_FinalizeEx || - !PyRun_SimpleString || !PyErr_Print) - return -1; - - Py_SetProgramName(wmodulename); - Py_Initialize(); - prepare_script_environment(hPython); - rc = PyRun_SimpleString(script); - if (rc) - PyErr_Print(); - if (Py_FinalizeEx() < 0) { - rc = -1; - } - return rc; -} - -static int run_simple_script(char *script) -{ - int rc; - HINSTANCE hPython; - char *tempname = tempnam(NULL, NULL); - // Redirect output using win32 API - see comments above... - HANDLE redirected = CreateFile( - tempname, - GENERIC_WRITE | GENERIC_READ, - FILE_SHARE_READ, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, - NULL); - HANDLE old_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - HANDLE old_stderr = GetStdHandle(STD_ERROR_HANDLE); - SetStdHandle(STD_OUTPUT_HANDLE, redirected); - SetStdHandle(STD_ERROR_HANDLE, redirected); - - hPython = LoadPythonDll(pythondll); - if (!hPython) { - char reason[128]; - wsprintf(reason, "Can't load Python for pre-install script (%d)", GetLastError()); - set_failure_reason(reason); - return -1; - } - rc = do_run_simple_script(hPython, script); - FreeLibrary(hPython); - SetStdHandle(STD_OUTPUT_HANDLE, old_stdout); - SetStdHandle(STD_ERROR_HANDLE, old_stderr); - /* We only care about the output when we fail. If the script works - OK, then we discard it - */ - if (rc) { - int err_buf_size; - char *err_buf; - const char *prefix = "Running the pre-installation script failed\r\n"; - int prefix_len = strlen(prefix); - err_buf_size = GetFileSize(redirected, NULL); - if (err_buf_size==INVALID_FILE_SIZE) // an error - let's try anyway... - err_buf_size = 4096; - err_buf = malloc(prefix_len + err_buf_size + 1); - if (err_buf) { - DWORD n = 0; - strcpy(err_buf, prefix); - SetFilePointer(redirected, 0, 0, FILE_BEGIN); - ReadFile(redirected, err_buf+prefix_len, err_buf_size, &n, NULL); - err_buf[prefix_len+n] = '\0'; - set_failure_reason(err_buf); - free(err_buf); - } else { - set_failure_reason("Out of memory!"); - } - } - CloseHandle(redirected); - DeleteFile(tempname); - return rc; -} - - -static BOOL SystemError(int error, char *msg) -{ - char Buffer[1024]; - int n; - - if (error) { - LPVOID lpMsgBuf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR)&lpMsgBuf, - 0, - NULL - ); - strncpy(Buffer, lpMsgBuf, sizeof(Buffer)); - LocalFree(lpMsgBuf); - } else - Buffer[0] = '\0'; - n = lstrlen(Buffer); - _snprintf(Buffer+n, sizeof(Buffer)-n, msg); - MessageBox(hwndMain, Buffer, "Runtime Error", MB_OK | MB_ICONSTOP); - return FALSE; -} - -static BOOL notify (int code, char *fmt, ...) -{ - char Buffer[1024]; - va_list marker; - BOOL result = TRUE; - int a, b; - char *cp; - - va_start(marker, fmt); - _vsnprintf(Buffer, sizeof(Buffer), fmt, marker); - - switch (code) { -/* Questions */ - case CAN_OVERWRITE: - break; - -/* Information notification */ - case DIR_CREATED: - if (logfile) - fprintf(logfile, "100 Made Dir: %s\n", fmt); - break; - - case FILE_CREATED: - if (logfile) - fprintf(logfile, "200 File Copy: %s\n", fmt); - goto add_to_filelist_label; - break; - - case FILE_OVERWRITTEN: - if (logfile) - fprintf(logfile, "200 File Overwrite: %s\n", fmt); - add_to_filelist_label: - if ((cp = strrchr(fmt, '.')) && (0 == strcmp (cp, ".py"))) - add_to_filelist(fmt); - break; - -/* Error Messages */ - case ZLIB_ERROR: - MessageBox(GetFocus(), Buffer, "Error", - MB_OK | MB_ICONWARNING); - break; - - case SYSTEM_ERROR: - SystemError(GetLastError(), Buffer); - break; - - case NUM_FILES: - a = va_arg(marker, int); - b = va_arg(marker, int); - SendMessage(hDialog, WM_NUMFILES, 0, MAKELPARAM(0, a)); - SendMessage(hDialog, WM_NEXTFILE, b,(LPARAM)fmt); - } - va_end(marker); - - return result; -} - -static char *MapExistingFile(char *pathname, DWORD *psize) -{ - HANDLE hFile, hFileMapping; - DWORD nSizeLow, nSizeHigh; - char *data; - - hFile = CreateFile(pathname, - GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) - return NULL; - nSizeLow = GetFileSize(hFile, &nSizeHigh); - hFileMapping = CreateFileMapping(hFile, - NULL, PAGE_READONLY, 0, 0, NULL); - CloseHandle(hFile); - - if (hFileMapping == NULL) - return NULL; - - data = MapViewOfFile(hFileMapping, - FILE_MAP_READ, 0, 0, 0); - - CloseHandle(hFileMapping); - *psize = nSizeLow; - return data; -} - - -static void create_bitmap(HWND hwnd) -{ - BITMAPFILEHEADER *bfh; - BITMAPINFO *bi; - HDC hdc; - - if (!bitmap_bytes) - return; - - if (hBitmap) - return; - - hdc = GetDC(hwnd); - - bfh = (BITMAPFILEHEADER *)bitmap_bytes; - bi = (BITMAPINFO *)(bitmap_bytes + sizeof(BITMAPFILEHEADER)); - - hBitmap = CreateDIBitmap(hdc, - &bi->bmiHeader, - CBM_INIT, - bitmap_bytes + bfh->bfOffBits, - bi, - DIB_RGB_COLORS); - ReleaseDC(hwnd, hdc); -} - -/* Extract everything we need to begin the installation. Currently this - is the INI filename with install data, and the raw pre-install script -*/ -static BOOL ExtractInstallData(char *data, DWORD size, int *pexe_size, - char **out_ini_file, char **out_preinstall_script) -{ - /* read the end of central directory record */ - struct eof_cdir *pe = (struct eof_cdir *)&data[size - sizeof - (struct eof_cdir)]; - - int arc_start = size - sizeof (struct eof_cdir) - pe->nBytesCDir - - pe->ofsCDir; - - int ofs = arc_start - sizeof (struct meta_data_hdr); - - /* read meta_data info */ - struct meta_data_hdr *pmd = (struct meta_data_hdr *)&data[ofs]; - char *src, *dst; - char *ini_file; - char tempdir[MAX_PATH]; - - /* ensure that if we fail, we don't have garbage out pointers */ - *out_ini_file = *out_preinstall_script = NULL; - - if (pe->tag != 0x06054b50) { - return FALSE; - } - - if (pmd->tag != 0x1234567B) { - return SystemError(0, - "Invalid cfgdata magic number (see bdist_wininst.py)"); - } - if (ofs < 0) { - return FALSE; - } - - if (pmd->bitmap_size) { - /* Store pointer to bitmap bytes */ - bitmap_bytes = (char *)pmd - pmd->uncomp_size - pmd->bitmap_size; - } - - *pexe_size = ofs - pmd->uncomp_size - pmd->bitmap_size; - - src = ((char *)pmd) - pmd->uncomp_size; - ini_file = malloc(MAX_PATH); /* will be returned, so do not free it */ - if (!ini_file) - return FALSE; - if (!GetTempPath(sizeof(tempdir), tempdir) - || !GetTempFileName(tempdir, "~du", 0, ini_file)) { - SystemError(GetLastError(), - "Could not create temporary file"); - return FALSE; - } - - dst = map_new_file(CREATE_ALWAYS, ini_file, NULL, pmd->uncomp_size, - 0, 0, NULL/*notify*/); - if (!dst) - return FALSE; - /* Up to the first \0 is the INI file data. */ - strncpy(dst, src, pmd->uncomp_size); - src += strlen(dst) + 1; - /* Up to next \0 is the pre-install script */ - *out_preinstall_script = strdup(src); - *out_ini_file = ini_file; - UnmapViewOfFile(dst); - return TRUE; -} - -static void PumpMessages(void) -{ - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } -} - -LRESULT CALLBACK -WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - HDC hdc; - HFONT hFont; - int h; - PAINTSTRUCT ps; - switch (msg) { - case WM_PAINT: - hdc = BeginPaint(hwnd, &ps); - h = GetSystemMetrics(SM_CYSCREEN) / 10; - hFont = CreateFont(h, 0, 0, 0, 700, TRUE, - 0, 0, 0, 0, 0, 0, 0, "Times Roman"); - hFont = SelectObject(hdc, hFont); - SetBkMode(hdc, TRANSPARENT); - TextOut(hdc, 15, 15, title, strlen(title)); - SetTextColor(hdc, RGB(255, 255, 255)); - TextOut(hdc, 10, 10, title, strlen(title)); - DeleteObject(SelectObject(hdc, hFont)); - EndPaint(hwnd, &ps); - return 0; - } - return DefWindowProc(hwnd, msg, wParam, lParam); -} - -static HWND CreateBackground(char *title) -{ - WNDCLASS wc; - HWND hwnd; - char buffer[4096]; - - wc.style = CS_VREDRAW | CS_HREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbWndExtra = 0; - wc.cbClsExtra = 0; - wc.hInstance = GetModuleHandle(NULL); - wc.hIcon = NULL; - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 128)); - wc.lpszMenuName = NULL; - wc.lpszClassName = "SetupWindowClass"; - - if (!RegisterClass(&wc)) - MessageBox(hwndMain, - "Could not register window class", - "Setup.exe", MB_OK); - - wsprintf(buffer, "Setup %s", title); - hwnd = CreateWindow("SetupWindowClass", - buffer, - 0, - 0, 0, - GetSystemMetrics(SM_CXFULLSCREEN), - GetSystemMetrics(SM_CYFULLSCREEN), - NULL, - NULL, - GetModuleHandle(NULL), - NULL); - ShowWindow(hwnd, SW_SHOWMAXIMIZED); - UpdateWindow(hwnd); - return hwnd; -} - -/* - * Center a window on the screen - */ -static void CenterWindow(HWND hwnd) -{ - RECT rc; - int w, h; - - GetWindowRect(hwnd, &rc); - w = GetSystemMetrics(SM_CXSCREEN); - h = GetSystemMetrics(SM_CYSCREEN); - MoveWindow(hwnd, - (w - (rc.right-rc.left))/2, - (h - (rc.bottom-rc.top))/2, - rc.right-rc.left, rc.bottom-rc.top, FALSE); -} - -#include - -INT_PTR CALLBACK -IntroDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPNMHDR lpnm; - char Buffer[4096]; - - switch (msg) { - case WM_INITDIALOG: - create_bitmap(hwnd); - if(hBitmap) - SendDlgItemMessage(hwnd, IDC_BITMAP, STM_SETIMAGE, - IMAGE_BITMAP, (LPARAM)hBitmap); - CenterWindow(GetParent(hwnd)); - wsprintf(Buffer, - "This Wizard will install %s on your computer. " - "Click Next to continue " - "or Cancel to exit the Setup Wizard.", - meta_name); - SetDlgItemText(hwnd, IDC_TITLE, Buffer); - SetDlgItemText(hwnd, IDC_INTRO_TEXT, info); - SetDlgItemText(hwnd, IDC_BUILD_INFO, build_info); - return FALSE; - - case WM_NOTIFY: - lpnm = (LPNMHDR) lParam; - - switch (lpnm->code) { - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hwnd), PSWIZB_NEXT); - break; - - case PSN_WIZNEXT: - break; - - case PSN_RESET: - break; - - default: - break; - } - } - return FALSE; -} - -#ifdef USE_OTHER_PYTHON_VERSIONS -/* These are really private variables used to communicate - * between StatusRoutine and CheckPythonExe - */ -char bound_image_dll[_MAX_PATH]; -int bound_image_major; -int bound_image_minor; - -static BOOL __stdcall StatusRoutine(IMAGEHLP_STATUS_REASON reason, - PSTR ImageName, - PSTR DllName, - ULONG Va, - ULONG Parameter) -{ - char fname[_MAX_PATH]; - int int_version; - - switch(reason) { - case BindOutOfMemory: - case BindRvaToVaFailed: - case BindNoRoomInImage: - case BindImportProcedureFailed: - break; - - case BindImportProcedure: - case BindForwarder: - case BindForwarderNOT: - case BindImageModified: - case BindExpandFileHeaders: - case BindImageComplete: - case BindSymbolsNotUpdated: - case BindMismatchedSymbols: - case BindImportModuleFailed: - break; - - case BindImportModule: - if (1 == sscanf(DllName, "python%d", &int_version)) { - SearchPath(NULL, DllName, NULL, sizeof(fname), - fname, NULL); - strcpy(bound_image_dll, fname); - bound_image_major = int_version / 10; - bound_image_minor = int_version % 10; - OutputDebugString("BOUND "); - OutputDebugString(fname); - OutputDebugString("\n"); - } - break; - } - return TRUE; -} - -/* - */ -static LPSTR get_sys_prefix(LPSTR exe, LPSTR dll) -{ - void (__cdecl * Py_Initialize)(void); - void (__cdecl * Py_SetProgramName)(char *); - void (__cdecl * Py_Finalize)(void); - void* (__cdecl * PySys_GetObject)(char *); - void (__cdecl * PySys_SetArgv)(int, char **); - char* (__cdecl * Py_GetPrefix)(void); - char* (__cdecl * Py_GetPath)(void); - HINSTANCE hPython; - LPSTR prefix = NULL; - int (__cdecl * PyRun_SimpleString)(char *); - - { - char Buffer[256]; - wsprintf(Buffer, "PYTHONHOME=%s", exe); - *strrchr(Buffer, '\\') = '\0'; -// MessageBox(GetFocus(), Buffer, "PYTHONHOME", MB_OK); - _putenv(Buffer); - _putenv("PYTHONPATH="); - } - - hPython = LoadLibrary(dll); - if (!hPython) - return NULL; - Py_Initialize = (void (*)(void))GetProcAddress - (hPython,"Py_Initialize"); - - PySys_SetArgv = (void (*)(int, char **))GetProcAddress - (hPython,"PySys_SetArgv"); - - PyRun_SimpleString = (int (*)(char *))GetProcAddress - (hPython,"PyRun_SimpleString"); - - Py_SetProgramName = (void (*)(char *))GetProcAddress - (hPython,"Py_SetProgramName"); - - PySys_GetObject = (void* (*)(char *))GetProcAddress - (hPython,"PySys_GetObject"); - - Py_GetPrefix = (char * (*)(void))GetProcAddress - (hPython,"Py_GetPrefix"); - - Py_GetPath = (char * (*)(void))GetProcAddress - (hPython,"Py_GetPath"); - - Py_Finalize = (void (*)(void))GetProcAddress(hPython, - "Py_Finalize"); - Py_SetProgramName(exe); - Py_Initialize(); - PySys_SetArgv(1, &exe); - - MessageBox(GetFocus(), Py_GetPrefix(), "PREFIX", MB_OK); - MessageBox(GetFocus(), Py_GetPath(), "PATH", MB_OK); - - Py_Finalize(); - FreeLibrary(hPython); - - return prefix; -} - -static BOOL -CheckPythonExe(LPSTR pathname, LPSTR version, int *pmajor, int *pminor) -{ - bound_image_dll[0] = '\0'; - if (!BindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, - pathname, - NULL, - NULL, - StatusRoutine)) - return SystemError(0, "Could not bind image"); - if (bound_image_dll[0] == '\0') - return SystemError(0, "Does not seem to be a python executable"); - *pmajor = bound_image_major; - *pminor = bound_image_minor; - if (version && *version) { - char core_version[12]; - wsprintf(core_version, "%d.%d", bound_image_major, bound_image_minor); - if (strcmp(version, core_version)) - return SystemError(0, "Wrong Python version"); - } - get_sys_prefix(pathname, bound_image_dll); - return TRUE; -} - -/* - * Browse for other python versions. Insert it into the listbox specified - * by hwnd. version, if not NULL or empty, is the version required. - */ -static BOOL GetOtherPythonVersion(HWND hwnd, LPSTR version) -{ - char vers_name[_MAX_PATH + 80]; - DWORD itemindex; - OPENFILENAME of; - char pathname[_MAX_PATH]; - DWORD result; - - strcpy(pathname, "python.exe"); - - memset(&of, 0, sizeof(of)); - of.lStructSize = sizeof(OPENFILENAME); - of.hwndOwner = GetParent(hwnd); - of.hInstance = NULL; - of.lpstrFilter = "python.exe\0python.exe\0"; - of.lpstrCustomFilter = NULL; - of.nMaxCustFilter = 0; - of.nFilterIndex = 1; - of.lpstrFile = pathname; - of.nMaxFile = sizeof(pathname); - of.lpstrFileTitle = NULL; - of.nMaxFileTitle = 0; - of.lpstrInitialDir = NULL; - of.lpstrTitle = "Python executable"; - of.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; - of.lpstrDefExt = "exe"; - - result = GetOpenFileName(&of); - if (result) { - int major, minor; - if (!CheckPythonExe(pathname, version, &major, &minor)) { - return FALSE; - } - *strrchr(pathname, '\\') = '\0'; - wsprintf(vers_name, "Python Version %d.%d in %s", - major, minor, pathname); - itemindex = SendMessage(hwnd, LB_INSERTSTRING, -1, - (LPARAM)(LPSTR)vers_name); - SendMessage(hwnd, LB_SETCURSEL, itemindex, 0); - SendMessage(hwnd, LB_SETITEMDATA, itemindex, - (LPARAM)(LPSTR)strdup(pathname)); - return TRUE; - } - return FALSE; -} -#endif /* USE_OTHER_PYTHON_VERSIONS */ - -typedef struct _InstalledVersionInfo { - char prefix[MAX_PATH+1]; // sys.prefix directory. - HKEY hkey; // Is this Python in HKCU or HKLM? -} InstalledVersionInfo; - - -/* - * Fill the listbox specified by hwnd with all python versions found - * in the registry. version, if not NULL or empty, is the version - * required. - */ -static BOOL GetPythonVersions(HWND hwnd, HKEY hkRoot, LPSTR version) -{ - DWORD index = 0; - char core_version[80]; - HKEY hKey; - BOOL result = TRUE; - DWORD bufsize; - - if (ERROR_SUCCESS != RegOpenKeyEx(hkRoot, - "Software\\Python\\PythonCore", - 0, KEY_READ, &hKey)) - return FALSE; - bufsize = sizeof(core_version); - while (ERROR_SUCCESS == RegEnumKeyEx(hKey, index, - core_version, &bufsize, NULL, - NULL, NULL, NULL)) { - char subkey_name[80], vers_name[80]; - int itemindex; - DWORD value_size; - HKEY hk; - - bufsize = sizeof(core_version); - ++index; - if (version && *version && strcmp(version, core_version)) - continue; - - wsprintf(vers_name, "Python Version %s (found in registry)", - core_version); - wsprintf(subkey_name, - "Software\\Python\\PythonCore\\%s\\InstallPath", - core_version); - if (ERROR_SUCCESS == RegOpenKeyEx(hkRoot, subkey_name, 0, KEY_READ, &hk)) { - InstalledVersionInfo *ivi = - (InstalledVersionInfo *)malloc(sizeof(InstalledVersionInfo)); - value_size = sizeof(ivi->prefix); - if (ivi && - ERROR_SUCCESS == RegQueryValueEx(hk, NULL, NULL, NULL, - ivi->prefix, &value_size)) { - itemindex = SendMessage(hwnd, LB_ADDSTRING, 0, - (LPARAM)(LPSTR)vers_name); - ivi->hkey = hkRoot; - SendMessage(hwnd, LB_SETITEMDATA, itemindex, - (LPARAM)(LPSTR)ivi); - } - RegCloseKey(hk); - } - } - RegCloseKey(hKey); - return result; -} - -/* Determine if the current user can write to HKEY_LOCAL_MACHINE */ -BOOL HasLocalMachinePrivs() -{ - HKEY hKey; - DWORD result; - static char KeyName[] = - "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; - - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - KeyName, - 0, - KEY_CREATE_SUB_KEY, - &hKey); - if (result==0) - RegCloseKey(hKey); - return result==0; -} - -// Check the root registry key to use - either HKLM or HKCU. -// If Python is installed in HKCU, then our extension also must be installed -// in HKCU - as Python won't be available for other users, we shouldn't either -// (and will fail if we are!) -// If Python is installed in HKLM, then we will also prefer to use HKLM, but -// this may not be possible - so we silently fall back to HKCU. -// -// We assume hkey_root is already set to where Python itself is installed. -void CheckRootKey(HWND hwnd) -{ - if (hkey_root==HKEY_CURRENT_USER) { - ; // as above, always install ourself in HKCU too. - } else if (hkey_root==HKEY_LOCAL_MACHINE) { - // Python in HKLM, but we may or may not have permissions there. - // Open the uninstall key with 'create' permissions - if this fails, - // we don't have permission. - if (!HasLocalMachinePrivs()) - hkey_root = HKEY_CURRENT_USER; - } else { - MessageBox(hwnd, "Don't know Python's installation type", - "Strange", MB_OK | MB_ICONSTOP); - /* Default to wherever they can, but preferring HKLM */ - hkey_root = HasLocalMachinePrivs() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; - } -} - -/* Return the installation scheme depending on Python version number */ -SCHEME *GetScheme(int major, int minor) -{ - if (major > 2) - return new_scheme; - else if((major == 2) && (minor >= 2)) - return new_scheme; - return old_scheme; -} - -INT_PTR CALLBACK -SelectPythonDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPNMHDR lpnm; - - switch (msg) { - case WM_INITDIALOG: - if (hBitmap) - SendDlgItemMessage(hwnd, IDC_BITMAP, STM_SETIMAGE, - IMAGE_BITMAP, (LPARAM)hBitmap); - GetPythonVersions(GetDlgItem(hwnd, IDC_VERSIONS_LIST), - HKEY_LOCAL_MACHINE, target_version); - GetPythonVersions(GetDlgItem(hwnd, IDC_VERSIONS_LIST), - HKEY_CURRENT_USER, target_version); - { /* select the last entry which is the highest python - version found */ - int count; - count = SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, - LB_GETCOUNT, 0, 0); - if (count && count != LB_ERR) - SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, LB_SETCURSEL, - count-1, 0); - - /* If a specific Python version is required, - * display a prominent notice showing this fact. - */ - if (target_version && target_version[0]) { - char buffer[4096]; - wsprintf(buffer, - "Python %s is required for this package. " - "Select installation to use:", - target_version); - SetDlgItemText(hwnd, IDC_TITLE, buffer); - } - - if (count == 0) { - char Buffer[4096]; - char *msg; - if (target_version && target_version[0]) { - wsprintf(Buffer, - "Python version %s required, which was not found" - " in the registry.", target_version); - msg = Buffer; - } else - msg = "No Python installation found in the registry."; - MessageBox(hwnd, msg, "Cannot install", - MB_OK | MB_ICONSTOP); - } - } - goto UpdateInstallDir; - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { -/* - case IDC_OTHERPYTHON: - if (GetOtherPythonVersion(GetDlgItem(hwnd, IDC_VERSIONS_LIST), - target_version)) - goto UpdateInstallDir; - break; -*/ - case IDC_VERSIONS_LIST: - switch (HIWORD(wParam)) { - int id; - case LBN_SELCHANGE: - UpdateInstallDir: - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK | PSWIZB_NEXT); - id = SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, - LB_GETCURSEL, 0, 0); - if (id == LB_ERR) { - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK); - SetDlgItemText(hwnd, IDC_PATH, ""); - SetDlgItemText(hwnd, IDC_INSTALL_PATH, ""); - strcpy(python_dir, ""); - strcpy(pythondll, ""); - } else { - char *pbuf; - int result; - InstalledVersionInfo *ivi; - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK | PSWIZB_NEXT); - /* Get the python directory */ - ivi = (InstalledVersionInfo *) - SendDlgItemMessage(hwnd, - IDC_VERSIONS_LIST, - LB_GETITEMDATA, - id, - 0); - hkey_root = ivi->hkey; - strcpy(python_dir, ivi->prefix); - SetDlgItemText(hwnd, IDC_PATH, python_dir); - /* retrieve the python version and pythondll to use */ - result = SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, - LB_GETTEXTLEN, (WPARAM)id, 0); - pbuf = (char *)malloc(result + 1); - if (pbuf) { - /* guess the name of the python-dll */ - SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, - LB_GETTEXT, (WPARAM)id, - (LPARAM)pbuf); - result = sscanf(pbuf, "Python Version %d.%d", - &py_major, &py_minor); - if (result == 2) { -#ifdef _DEBUG - wsprintf(pythondll, "python%d%d_d.dll", - py_major, py_minor); -#else - wsprintf(pythondll, "python%d%d.dll", - py_major, py_minor); -#endif - } - free(pbuf); - } else - strcpy(pythondll, ""); - /* retrieve the scheme for this version */ - { - char install_path[_MAX_PATH]; - SCHEME *scheme = GetScheme(py_major, py_minor); - strcpy(install_path, python_dir); - if (install_path[strlen(install_path)-1] != '\\') - strcat(install_path, "\\"); - strcat(install_path, scheme[0].prefix); - SetDlgItemText(hwnd, IDC_INSTALL_PATH, install_path); - } - } - } - break; - } - return 0; - - case WM_NOTIFY: - lpnm = (LPNMHDR) lParam; - - switch (lpnm->code) { - int id; - case PSN_SETACTIVE: - id = SendDlgItemMessage(hwnd, IDC_VERSIONS_LIST, - LB_GETCURSEL, 0, 0); - if (id == LB_ERR) - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK); - else - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK | PSWIZB_NEXT); - break; - - case PSN_WIZNEXT: - break; - - case PSN_WIZFINISH: - break; - - case PSN_RESET: - break; - - default: - break; - } - } - return 0; -} - -static BOOL OpenLogfile(char *dir) -{ - char buffer[_MAX_PATH+1]; - time_t ltime; - struct tm *now; - long result; - HKEY hKey, hSubkey; - char subkey_name[256]; - static char KeyName[] = - "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; - const char *root_name = (hkey_root==HKEY_LOCAL_MACHINE ? - "HKEY_LOCAL_MACHINE" : "HKEY_CURRENT_USER"); - DWORD disposition; - - /* Use Create, as the Uninstall subkey may not exist under HKCU. - Use CreateKeyEx, so we can specify a SAM specifying write access - */ - result = RegCreateKeyEx(hkey_root, - KeyName, - 0, /* reserved */ - NULL, /* class */ - 0, /* options */ - KEY_CREATE_SUB_KEY, /* sam */ - NULL, /* security */ - &hKey, /* result key */ - NULL); /* disposition */ - if (result != ERROR_SUCCESS) { - if (result == ERROR_ACCESS_DENIED) { - /* This should no longer be able to happen - we have already - checked if they have permissions in HKLM, and all users - should have write access to HKCU. - */ - MessageBox(GetFocus(), - "You do not seem to have sufficient access rights\n" - "on this machine to install this software", - NULL, - MB_OK | MB_ICONSTOP); - return FALSE; - } else { - MessageBox(GetFocus(), KeyName, "Could not open key", MB_OK); - } - } - - sprintf(buffer, "%s\\%s-wininst.log", dir, meta_name); - logfile = fopen(buffer, "a"); - if (!logfile) { - char error[1024]; - - sprintf(error, "Can't create \"%s\" (%s).\n\n" - "Try to execute the installer as administrator.", - buffer, strerror(errno)); - MessageBox(GetFocus(), error, NULL, MB_OK | MB_ICONSTOP); - return FALSE; - } - - time(<ime); - now = localtime(<ime); - strftime(buffer, sizeof(buffer), - "*** Installation started %Y/%m/%d %H:%M ***\n", - localtime(<ime)); - fprintf(logfile, buffer); - fprintf(logfile, "Source: %s\n", modulename); - - /* Root key must be first entry processed by uninstaller. */ - fprintf(logfile, "999 Root Key: %s\n", root_name); - - sprintf(subkey_name, "%s-py%d.%d", meta_name, py_major, py_minor); - - result = RegCreateKeyEx(hKey, subkey_name, - 0, NULL, 0, - KEY_WRITE, - NULL, - &hSubkey, - &disposition); - - if (result != ERROR_SUCCESS) - MessageBox(GetFocus(), subkey_name, "Could not create key", MB_OK); - - RegCloseKey(hKey); - - if (disposition == REG_CREATED_NEW_KEY) - fprintf(logfile, "020 Reg DB Key: [%s]%s\n", KeyName, subkey_name); - - sprintf(buffer, "Python %d.%d %s", py_major, py_minor, title); - - result = RegSetValueEx(hSubkey, "DisplayName", - 0, - REG_SZ, - buffer, - strlen(buffer)+1); - - if (result != ERROR_SUCCESS) - MessageBox(GetFocus(), buffer, "Could not set key value", MB_OK); - - fprintf(logfile, "040 Reg DB Value: [%s\\%s]%s=%s\n", - KeyName, subkey_name, "DisplayName", buffer); - - { - FILE *fp; - sprintf(buffer, "%s\\Remove%s.exe", dir, meta_name); - fp = fopen(buffer, "wb"); - fwrite(arc_data, exe_size, 1, fp); - fclose(fp); - - sprintf(buffer, "\"%s\\Remove%s.exe\" -u \"%s\\%s-wininst.log\"", - dir, meta_name, dir, meta_name); - - result = RegSetValueEx(hSubkey, "UninstallString", - 0, - REG_SZ, - buffer, - strlen(buffer)+1); - - if (result != ERROR_SUCCESS) - MessageBox(GetFocus(), buffer, "Could not set key value", MB_OK); - - fprintf(logfile, "040 Reg DB Value: [%s\\%s]%s=%s\n", - KeyName, subkey_name, "UninstallString", buffer); - } - return TRUE; -} - -static void CloseLogfile(void) -{ - char buffer[_MAX_PATH+1]; - time_t ltime; - struct tm *now; - - time(<ime); - now = localtime(<ime); - strftime(buffer, sizeof(buffer), - "*** Installation finished %Y/%m/%d %H:%M ***\n", - localtime(<ime)); - fprintf(logfile, buffer); - if (logfile) - fclose(logfile); -} - -INT_PTR CALLBACK -InstallFilesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPNMHDR lpnm; - char Buffer[4096]; - SCHEME *scheme; - - switch (msg) { - case WM_INITDIALOG: - if (hBitmap) - SendDlgItemMessage(hwnd, IDC_BITMAP, STM_SETIMAGE, - IMAGE_BITMAP, (LPARAM)hBitmap); - wsprintf(Buffer, - "Click Next to begin the installation of %s. " - "If you want to review or change any of your " - " installation settings, click Back. " - "Click Cancel to exit the wizard.", - meta_name); - SetDlgItemText(hwnd, IDC_TITLE, Buffer); - SetDlgItemText(hwnd, IDC_INFO, "Ready to install"); - break; - - case WM_NUMFILES: - SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, lParam); - PumpMessages(); - return TRUE; - - case WM_NEXTFILE: - SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, wParam, - 0); - SetDlgItemText(hwnd, IDC_INFO, (LPSTR)lParam); - PumpMessages(); - return TRUE; - - case WM_NOTIFY: - lpnm = (LPNMHDR) lParam; - - switch (lpnm->code) { - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hwnd), - PSWIZB_BACK | PSWIZB_NEXT); - break; - - case PSN_WIZFINISH: - break; - - case PSN_WIZNEXT: - /* Handle a Next button click here */ - hDialog = hwnd; - success = TRUE; - - /* Disable the buttons while we work. Sending CANCELTOCLOSE has - the effect of disabling the cancel button, which is a) as we - do everything synchronously we can't cancel, and b) the next - step is 'finished', when it is too late to cancel anyway. - The next step being 'Finished' means we also don't need to - restore the button state back */ - PropSheet_SetWizButtons(GetParent(hwnd), 0); - SendMessage(GetParent(hwnd), PSM_CANCELTOCLOSE, 0, 0); - /* Make sure the installation directory name ends in a */ - /* backslash */ - if (python_dir[strlen(python_dir)-1] != '\\') - strcat(python_dir, "\\"); - /* Strip the trailing backslash again */ - python_dir[strlen(python_dir)-1] = '\0'; - - CheckRootKey(hwnd); - - if (!OpenLogfile(python_dir)) - break; - -/* - * The scheme we have to use depends on the Python version... - if sys.version < "2.2": - WINDOWS_SCHEME = { - 'purelib': '$base', - 'platlib': '$base', - 'headers': '$base/Include/$dist_name', - 'scripts': '$base/Scripts', - 'data' : '$base', - } - else: - WINDOWS_SCHEME = { - 'purelib': '$base/Lib/site-packages', - 'platlib': '$base/Lib/site-packages', - 'headers': '$base/Include/$dist_name', - 'scripts': '$base/Scripts', - 'data' : '$base', - } -*/ - scheme = GetScheme(py_major, py_minor); - /* Run the pre-install script. */ - if (pre_install_script && *pre_install_script) { - SetDlgItemText (hwnd, IDC_TITLE, - "Running pre-installation script"); - run_simple_script(pre_install_script); - } - if (!success) { - break; - } - /* Extract all files from the archive */ - SetDlgItemText(hwnd, IDC_TITLE, "Installing files..."); - if (!unzip_archive (scheme, - python_dir, arc_data, - arc_size, notify)) - set_failure_reason("Failed to unzip installation files"); - /* Compile the py-files */ - if (success && pyc_compile) { - int errors; - HINSTANCE hPython; - SetDlgItemText(hwnd, IDC_TITLE, - "Compiling files to .pyc..."); - - SetDlgItemText(hDialog, IDC_INFO, "Loading python..."); - hPython = LoadPythonDll(pythondll); - if (hPython) { - errors = compile_filelist(hPython, FALSE); - FreeLibrary(hPython); - } - /* Compilation errors are intentionally ignored: - * Python2.0 contains a bug which will result - * in sys.path containing garbage under certain - * circumstances, and an error message will only - * confuse the user. - */ - } - if (success && pyo_compile) { - int errors; - HINSTANCE hPython; - SetDlgItemText(hwnd, IDC_TITLE, - "Compiling files to .pyo..."); - - SetDlgItemText(hDialog, IDC_INFO, "Loading python..."); - hPython = LoadPythonDll(pythondll); - if (hPython) { - errors = compile_filelist(hPython, TRUE); - FreeLibrary(hPython); - } - /* Errors ignored: see above */ - } - - - break; - - case PSN_RESET: - break; - - default: - break; - } - } - return 0; -} - - -INT_PTR CALLBACK -FinishedDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPNMHDR lpnm; - - switch (msg) { - case WM_INITDIALOG: - if (hBitmap) - SendDlgItemMessage(hwnd, IDC_BITMAP, STM_SETIMAGE, - IMAGE_BITMAP, (LPARAM)hBitmap); - if (!success) - SetDlgItemText(hwnd, IDC_INFO, get_failure_reason()); - - /* async delay: will show the dialog box completely before - the install_script is started */ - PostMessage(hwnd, WM_USER, 0, 0L); - return TRUE; - - case WM_USER: - - if (success && install_script && install_script[0]) { - char fname[MAX_PATH]; - char *buffer; - HCURSOR hCursor; - int result; - - char *argv[3] = {NULL, "-install", NULL}; - - SetDlgItemText(hwnd, IDC_TITLE, - "Please wait while running postinstall script..."); - strcpy(fname, python_dir); - strcat(fname, "\\Scripts\\"); - strcat(fname, install_script); - - if (logfile) - fprintf(logfile, "300 Run Script: [%s]%s\n", pythondll, fname); - - hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); - - argv[0] = fname; - - result = run_installscript(fname, 2, argv, &buffer); - if (0 != result) { - fprintf(stderr, "*** run_installscript: internal error 0x%X ***\n", result); - } - if (buffer) - SetDlgItemText(hwnd, IDC_INFO, buffer); - SetDlgItemText(hwnd, IDC_TITLE, - "Postinstall script finished.\n" - "Click the Finish button to exit the Setup wizard."); - - free(buffer); - SetCursor(hCursor); - CloseLogfile(); - } - - return TRUE; - - case WM_NOTIFY: - lpnm = (LPNMHDR) lParam; - - switch (lpnm->code) { - case PSN_SETACTIVE: /* Enable the Finish button */ - PropSheet_SetWizButtons(GetParent(hwnd), PSWIZB_FINISH); - break; - - case PSN_WIZNEXT: - break; - - case PSN_WIZFINISH: - break; - - case PSN_RESET: - break; - - default: - break; - } - } - return 0; -} - -void RunWizard(HWND hwnd) -{ - PROPSHEETPAGE psp = {0}; - HPROPSHEETPAGE ahpsp[4] = {0}; - PROPSHEETHEADER psh = {0}; - - /* Display module information */ - psp.dwSize = sizeof(psp); - psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; - psp.hInstance = GetModuleHandle (NULL); - psp.lParam = 0; - psp.pfnDlgProc = IntroDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_INTRO); - - ahpsp[0] = CreatePropertySheetPage(&psp); - - /* Select python version to use */ - psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; - psp.pszTemplate = MAKEINTRESOURCE(IDD_SELECTPYTHON); - psp.pfnDlgProc = SelectPythonDlgProc; - - ahpsp[1] = CreatePropertySheetPage(&psp); - - /* Install the files */ - psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; - psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLFILES); - psp.pfnDlgProc = InstallFilesDlgProc; - - ahpsp[2] = CreatePropertySheetPage(&psp); - - /* Show success or failure */ - psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; - psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHED); - psp.pfnDlgProc = FinishedDlgProc; - - ahpsp[3] = CreatePropertySheetPage(&psp); - - /* Create the property sheet */ - psh.dwSize = sizeof(psh); - psh.hInstance = GetModuleHandle(NULL); - psh.hwndParent = hwnd; - psh.phpage = ahpsp; - psh.dwFlags = PSH_WIZARD/*97*//*|PSH_WATERMARK|PSH_HEADER*/; - psh.pszbmWatermark = NULL; - psh.pszbmHeader = NULL; - psh.nStartPage = 0; - psh.nPages = 4; - - PropertySheet(&psh); -} - -// subtly different from HasLocalMachinePrivs(), in that after executing -// an 'elevated' process, we expect this to return TRUE - but there is no -// such implication for HasLocalMachinePrivs -BOOL MyIsUserAnAdmin() -{ - typedef BOOL (WINAPI *PFNIsUserAnAdmin)(); - static PFNIsUserAnAdmin pfnIsUserAnAdmin = NULL; - HMODULE shell32; - // This function isn't guaranteed to be available (and it can't hurt - // to leave the library loaded) - if (0 == (shell32=LoadLibrary("shell32.dll"))) - return FALSE; - if (0 == (pfnIsUserAnAdmin=(PFNIsUserAnAdmin)GetProcAddress(shell32, "IsUserAnAdmin"))) - return FALSE; - return (*pfnIsUserAnAdmin)(); -} - -// Some magic for Vista's UAC. If there is a target_version, and -// if that target version is installed in the registry under -// HKLM, and we are not current administrator, then -// re-execute ourselves requesting elevation. -// Split into 2 functions - "should we elevate" and "spawn elevated" - -// Returns TRUE if we should spawn an elevated child -BOOL NeedAutoUAC() -{ - HKEY hk; - char key_name[80]; - // no Python version info == we can't know yet. - if (target_version[0] == '\0') - return FALSE; - // see how python is current installed - wsprintf(key_name, - "Software\\Python\\PythonCore\\%s\\InstallPath", - target_version); - if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, - key_name, 0, KEY_READ, &hk)) - return FALSE; - RegCloseKey(hk); - // Python is installed in HKLM - we must elevate. - return TRUE; -} - -// Spawn ourself as an elevated application. On failure, a message is -// displayed to the user - but this app will always terminate, even -// on error. -void SpawnUAC() -{ - // interesting failure scenario that has been seen: initial executable - // runs from a network drive - but once elevated, that network share - // isn't seen, and ShellExecute fails with SE_ERR_ACCESSDENIED. - int ret = (int)ShellExecute(0, "runas", modulename, "", NULL, - SW_SHOWNORMAL); - if (ret <= 32) { - char msg[128]; - wsprintf(msg, "Failed to start elevated process (ShellExecute returned %d)", ret); - MessageBox(0, msg, "Setup", MB_OK | MB_ICONERROR); - } -} - -int DoInstall(void) -{ - char ini_buffer[4096]; - - /* Read installation information */ - GetPrivateProfileString("Setup", "title", "", ini_buffer, - sizeof(ini_buffer), ini_file); - unescape(title, ini_buffer, sizeof(title)); - - GetPrivateProfileString("Setup", "info", "", ini_buffer, - sizeof(ini_buffer), ini_file); - unescape(info, ini_buffer, sizeof(info)); - - GetPrivateProfileString("Setup", "build_info", "", build_info, - sizeof(build_info), ini_file); - - pyc_compile = GetPrivateProfileInt("Setup", "target_compile", 1, - ini_file); - pyo_compile = GetPrivateProfileInt("Setup", "target_optimize", 1, - ini_file); - - GetPrivateProfileString("Setup", "target_version", "", - target_version, sizeof(target_version), - ini_file); - - GetPrivateProfileString("metadata", "name", "", - meta_name, sizeof(meta_name), - ini_file); - - GetPrivateProfileString("Setup", "install_script", "", - install_script, sizeof(install_script), - ini_file); - - GetPrivateProfileString("Setup", "user_access_control", "", - user_access_control, sizeof(user_access_control), ini_file); - - strcat(target_version, REGISTRY_SUFFIX_6432); - - // See if we need to do the Vista UAC magic. - if (strcmp(user_access_control, "force")==0) { - if (!MyIsUserAnAdmin()) { - SpawnUAC(); - return 0; - } - // already admin - keep going - } else if (strcmp(user_access_control, "auto")==0) { - // Check if it looks like we need UAC control, based - // on how Python itself was installed. - if (!MyIsUserAnAdmin() && NeedAutoUAC()) { - SpawnUAC(); - return 0; - } - } else { - // display a warning about unknown values - only the developer - // of the extension will see it (until they fix it!) - if (user_access_control[0] && strcmp(user_access_control, "none") != 0) { - MessageBox(GetFocus(), "Bad user_access_control value", "oops", MB_OK); - // nothing to do. - } - } - - hwndMain = CreateBackground(title); - - RunWizard(hwndMain); - - /* Clean up */ - UnmapViewOfFile(arc_data); - if (ini_file) - DeleteFile(ini_file); - - if (hBitmap) - DeleteObject(hBitmap); - - return 0; -} - -/*********************** uninstall section ******************************/ - -static int compare(const void *p1, const void *p2) -{ - return strcmp(*(char **)p2, *(char **)p1); -} - -/* - * Commit suicide (remove the uninstaller itself). - * - * Create a batch file to first remove the uninstaller - * (will succeed after it has finished), then the batch file itself. - * - * This technique has been demonstrated by Jeff Richter, - * MSJ 1/1996 - */ -void remove_exe(void) -{ - char exename[_MAX_PATH]; - char batname[_MAX_PATH]; - FILE *fp; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - GetModuleFileName(NULL, exename, sizeof(exename)); - sprintf(batname, "%s.bat", exename); - fp = fopen(batname, "w"); - fprintf(fp, ":Repeat\n"); - fprintf(fp, "del \"%s\"\n", exename); - fprintf(fp, "if exist \"%s\" goto Repeat\n", exename); - fprintf(fp, "del \"%s\"\n", batname); - fclose(fp); - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = SW_HIDE; - if (CreateProcess(NULL, - batname, - NULL, - NULL, - FALSE, - CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, - NULL, - "\\", - &si, - &pi)) { - SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE); - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); - SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); - CloseHandle(pi.hProcess); - ResumeThread(pi.hThread); - CloseHandle(pi.hThread); - } -} - -void DeleteRegistryKey(char *string) -{ - char *keyname; - char *subkeyname; - char *delim; - HKEY hKey; - long result; - char *line; - - line = strdup(string); /* so we can change it */ - - keyname = strchr(line, '['); - if (!keyname) - return; - ++keyname; - - subkeyname = strchr(keyname, ']'); - if (!subkeyname) - return; - *subkeyname++='\0'; - delim = strchr(subkeyname, '\n'); - if (delim) - *delim = '\0'; - - result = RegOpenKeyEx(hkey_root, - keyname, - 0, - KEY_WRITE, - &hKey); - - if (result != ERROR_SUCCESS) - MessageBox(GetFocus(), string, "Could not open key", MB_OK); - else { - result = RegDeleteKey(hKey, subkeyname); - if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) - MessageBox(GetFocus(), string, "Could not delete key", MB_OK); - RegCloseKey(hKey); - } - free(line); -} - -void DeleteRegistryValue(char *string) -{ - char *keyname; - char *valuename; - char *value; - HKEY hKey; - long result; - char *line; - - line = strdup(string); /* so we can change it */ - -/* Format is 'Reg DB Value: [key]name=value' */ - keyname = strchr(line, '['); - if (!keyname) - return; - ++keyname; - valuename = strchr(keyname, ']'); - if (!valuename) - return; - *valuename++ = '\0'; - value = strchr(valuename, '='); - if (!value) - return; - - *value++ = '\0'; - - result = RegOpenKeyEx(hkey_root, - keyname, - 0, - KEY_WRITE, - &hKey); - if (result != ERROR_SUCCESS) - MessageBox(GetFocus(), string, "Could not open key", MB_OK); - else { - result = RegDeleteValue(hKey, valuename); - if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) - MessageBox(GetFocus(), string, "Could not delete value", MB_OK); - RegCloseKey(hKey); - } - free(line); -} - -BOOL MyDeleteFile(char *line) -{ - char *pathname = strchr(line, ':'); - if (!pathname) - return FALSE; - ++pathname; - while (isspace(*pathname)) - ++pathname; - return DeleteFile(pathname); -} - -BOOL MyRemoveDirectory(char *line) -{ - char *pathname = strchr(line, ':'); - if (!pathname) - return FALSE; - ++pathname; - while (isspace(*pathname)) - ++pathname; - return RemoveDirectory(pathname); -} - -BOOL Run_RemoveScript(char *line) -{ - char *dllname; - char *scriptname; - static char lastscript[MAX_PATH]; - -/* Format is 'Run Scripts: [pythondll]scriptname' */ -/* XXX Currently, pythondll carries no path!!! */ - dllname = strchr(line, '['); - if (!dllname) - return FALSE; - ++dllname; - scriptname = strchr(dllname, ']'); - if (!scriptname) - return FALSE; - *scriptname++ = '\0'; - /* this function may be called more than one time with the same - script, only run it one time */ - if (strcmp(lastscript, scriptname)) { - char *argv[3] = {NULL, "-remove", NULL}; - char *buffer = NULL; - - argv[0] = scriptname; - - if (0 != run_installscript(scriptname, 2, argv, &buffer)) - fprintf(stderr, "*** Could not run installation script ***"); - - if (buffer && buffer[0]) - MessageBox(GetFocus(), buffer, "uninstall-script", MB_OK); - free(buffer); - - strcpy(lastscript, scriptname); - } - return TRUE; -} - -int DoUninstall(int argc, char **argv) -{ - FILE *logfile; - char buffer[4096]; - int nLines = 0; - int i; - char *cp; - int nFiles = 0; - int nDirs = 0; - int nErrors = 0; - char **lines; - int lines_buffer_size = 10; - - if (argc != 3) { - MessageBox(NULL, - "Wrong number of args", - NULL, - MB_OK); - return 1; /* Error */ - } - if (strcmp(argv[1], "-u")) { - MessageBox(NULL, - "2. arg is not -u", - NULL, - MB_OK); - return 1; /* Error */ - } - - logfile = fopen(argv[2], "r"); - if (!logfile) { - MessageBox(NULL, - "could not open logfile", - NULL, - MB_OK); - return 1; /* Error */ - } - - lines = (char **)malloc(sizeof(char *) * lines_buffer_size); - if (!lines) - return SystemError(0, "Out of memory"); - - /* Read the whole logfile, realloacting the buffer */ - while (fgets(buffer, sizeof(buffer), logfile)) { - int len = strlen(buffer); - /* remove trailing white space */ - while (isspace(buffer[len-1])) - len -= 1; - buffer[len] = '\0'; - lines[nLines++] = strdup(buffer); - if (nLines >= lines_buffer_size) { - lines_buffer_size += 10; - lines = (char **)realloc(lines, - sizeof(char *) * lines_buffer_size); - if (!lines) - return SystemError(0, "Out of memory"); - } - } - fclose(logfile); - - /* Sort all the lines, so that highest 3-digit codes are first */ - qsort(&lines[0], nLines, sizeof(char *), - compare); - - if (IDYES != MessageBox(NULL, - "Are you sure you want to remove\n" - "this package from your computer?", - "Please confirm", - MB_YESNO | MB_ICONQUESTION)) - return 0; - - hkey_root = HKEY_LOCAL_MACHINE; - cp = ""; - for (i = 0; i < nLines; ++i) { - /* Ignore duplicate lines */ - if (strcmp(cp, lines[i])) { - int ign; - cp = lines[i]; - /* Parse the lines */ - if (2 == sscanf(cp, "%d Root Key: %s", &ign, &buffer)) { - if (strcmp(buffer, "HKEY_CURRENT_USER")==0) - hkey_root = HKEY_CURRENT_USER; - else { - // HKLM - check they have permissions. - if (!HasLocalMachinePrivs()) { - MessageBox(GetFocus(), - "You do not seem to have sufficient access rights\n" - "on this machine to uninstall this software", - NULL, - MB_OK | MB_ICONSTOP); - return 1; /* Error */ - } - } - } else if (2 == sscanf(cp, "%d Made Dir: %s", &ign, &buffer)) { - if (MyRemoveDirectory(cp)) - ++nDirs; - else { - int code = GetLastError(); - if (code != 2 && code != 3) { /* file or path not found */ - ++nErrors; - } - } - } else if (2 == sscanf(cp, "%d File Copy: %s", &ign, &buffer)) { - if (MyDeleteFile(cp)) - ++nFiles; - else { - int code = GetLastError(); - if (code != 2 && code != 3) { /* file or path not found */ - ++nErrors; - } - } - } else if (2 == sscanf(cp, "%d File Overwrite: %s", &ign, &buffer)) { - if (MyDeleteFile(cp)) - ++nFiles; - else { - int code = GetLastError(); - if (code != 2 && code != 3) { /* file or path not found */ - ++nErrors; - } - } - } else if (2 == sscanf(cp, "%d Reg DB Key: %s", &ign, &buffer)) { - DeleteRegistryKey(cp); - } else if (2 == sscanf(cp, "%d Reg DB Value: %s", &ign, &buffer)) { - DeleteRegistryValue(cp); - } else if (2 == sscanf(cp, "%d Run Script: %s", &ign, &buffer)) { - Run_RemoveScript(cp); - } - } - } - - if (DeleteFile(argv[2])) { - ++nFiles; - } else { - ++nErrors; - SystemError(GetLastError(), argv[2]); - } - if (nErrors) - wsprintf(buffer, - "%d files and %d directories removed\n" - "%d files or directories could not be removed", - nFiles, nDirs, nErrors); - else - wsprintf(buffer, "%d files and %d directories removed", - nFiles, nDirs); - MessageBox(NULL, buffer, "Uninstall Finished!", - MB_OK | MB_ICONINFORMATION); - remove_exe(); - return 0; -} - -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, - LPSTR lpszCmdLine, INT nCmdShow) -{ - extern int __argc; - extern char **__argv; - char *basename; - - GetModuleFileName(NULL, modulename, sizeof(modulename)); - GetModuleFileNameW(NULL, wmodulename, sizeof(wmodulename)/sizeof(wmodulename[0])); - - /* Map the executable file to memory */ - arc_data = MapExistingFile(modulename, &arc_size); - if (!arc_data) { - SystemError(GetLastError(), "Could not open archive"); - return 1; - } - - /* OK. So this program can act as installer (self-extracting - * zip-file, or as uninstaller when started with '-u logfile' - * command line flags. - * - * The installer is usually started without command line flags, - * and the uninstaller is usually started with the '-u logfile' - * flag. What to do if some innocent user double-clicks the - * exe-file? - * The following implements a defensive strategy... - */ - - /* Try to extract the configuration data into a temporary file */ - if (ExtractInstallData(arc_data, arc_size, &exe_size, - &ini_file, &pre_install_script)) - return DoInstall(); - - if (!ini_file && __argc > 1) { - return DoUninstall(__argc, __argv); - } - - - basename = strrchr(modulename, '\\'); - if (basename) - ++basename; - - /* Last guess about the purpose of this program */ - if (basename && (0 == strncmp(basename, "Remove", 6))) - SystemError(0, "This program is normally started by windows"); - else - SystemError(0, "Setup program invalid or damaged"); - return 1; -} diff --git a/third_party/python/PC/bdist_wininst/install.rc b/third_party/python/PC/bdist_wininst/install.rc deleted file mode 100644 index dfa2ffcd7..000000000 --- a/third_party/python/PC/bdist_wininst/install.rc +++ /dev/null @@ -1,77 +0,0 @@ -/* - IMPORTANT NOTE: IF THIS FILE IS CHANGED, PCBUILD\BDIST_WININST.VCXPROJ MUST - BE REBUILT AS WELL. - - IF CHANGES TO THIS FILE ARE CHECKED IN, THE RECOMPILED BINARIES MUST BE - CHECKED IN AS WELL! -*/ - -#include -#include "resource.h" - -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL -#pragma code_page(1252) - -IDB_BITMAP BITMAP DISCARDABLE "PythonPowered.bmp" - - -IDD_INTRO DIALOGEX 0, 0, 379, 178 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Setup" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - LTEXT "This Wizard will install %s on your computer. Click Next to continue or Cancel to exit the Setup Wizard.", - IDC_TITLE,125,10,247,20,NOT WS_GROUP - EDITTEXT IDC_INTRO_TEXT,125,31,247,131,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - CONTROL 110,IDC_BITMAP,"Static",SS_BITMAP | SS_CENTERIMAGE,6,8, - 104,163,WS_EX_CLIENTEDGE - LTEXT "",IDC_BUILD_INFO,125,163,247,8 -END - -IDD_SELECTPYTHON DIALOGEX 0, 0, 379, 178 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Setup" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - LTEXT "Select python installation to use:",IDC_TITLE,125,10, - 247,12,NOT WS_GROUP - EDITTEXT IDC_PATH,191,136,181,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "Python Directory:",IDC_STATIC,125,137,55,8 - LISTBOX IDC_VERSIONS_LIST,125,24,247,106,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - CONTROL 110,IDC_BITMAP,"Static",SS_BITMAP | SS_CENTERIMAGE,6,8, - 104,163,WS_EX_CLIENTEDGE - EDITTEXT IDC_INSTALL_PATH,191,157,181,14,ES_AUTOHSCROLL | - ES_READONLY - LTEXT "Installation Directory:",IDC_STATIC,125,158,66,8 - PUSHBUTTON "Find other ...",IDC_OTHERPYTHON,322,7,50,14,NOT - WS_VISIBLE -END - -IDD_INSTALLFILES DIALOGEX 0, 0, 379, 178 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Setup" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - LTEXT "Click Next to begin the installation. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the Wizard.", - IDC_TITLE,125,10,246,31,NOT WS_GROUP - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 125,157,246,14 - CTEXT "Installation progress:",IDC_INFO,125,137,246,8 - CONTROL 110,IDC_BITMAP,"Static",SS_BITMAP | SS_CENTERIMAGE,6,8, - 104,163,WS_EX_CLIENTEDGE -END - -IDD_FINISHED DIALOGEX 0, 0, 379, 178 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Setup" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Click the Finish button to exit the Setup wizard.", - IDC_TITLE,125,10,247,31,NOT WS_GROUP - CONTROL 110,IDC_BITMAP,"Static",SS_BITMAP | SS_CENTERIMAGE,6,8, - 104,163,WS_EX_CLIENTEDGE - EDITTEXT IDC_INFO,125,40,247,131,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP -END diff --git a/third_party/python/PC/bdist_wininst/resource.h b/third_party/python/PC/bdist_wininst/resource.h deleted file mode 100644 index 86aeabb13..000000000 --- a/third_party/python/PC/bdist_wininst/resource.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - IMPORTANT NOTE: IF THIS FILE IS CHANGED, PCBUILD\BDIST_WININST.VCXPROJ MUST - BE REBUILT AS WELL. - - IF CHANGES TO THIS FILE ARE CHECKED IN, THE RECOMPILED BINARIES MUST BE - CHECKED IN AS WELL! -*/ - -#define IDD_DIALOG1 101 -#define IDB_BITMAP1 103 -#define IDD_INTRO 107 -#define IDD_SELECTPYTHON 108 -#define IDD_INSTALLFILES 109 -#define IDD_FINISHED 110 -#define IDB_BITMAP 110 -#define IDC_EDIT1 1000 -#define IDC_TITLE 1000 -#define IDC_START 1001 -#define IDC_PROGRESS 1003 -#define IDC_INFO 1004 -#define IDC_PYTHON15 1006 -#define IDC_PATH 1007 -#define IDC_PYTHON16 1008 -#define IDC_INSTALL_PATH 1008 -#define IDC_PYTHON20 1009 -#define IDC_BROWSE 1010 -#define IDC_INTRO_TEXT 1021 -#define IDC_VERSIONS_LIST 1022 -#define IDC_BUILD_INFO 1024 -#define IDC_BITMAP 1025 -#define IDC_OTHERPYTHON 1026 diff --git a/third_party/python/PC/clinic/_testconsole.c.h b/third_party/python/PC/clinic/_testconsole.c.h deleted file mode 100644 index 93860cf5b..000000000 --- a/third_party/python/PC/clinic/_testconsole.c.h +++ /dev/null @@ -1,82 +0,0 @@ -/*[clinic input] -preserve -[clinic start generated code]*/ - -#if defined(MS_WINDOWS) - -PyDoc_STRVAR(_testconsole_write_input__doc__, -"write_input($module, /, file, s)\n" -"--\n" -"\n" -"Writes UTF-16-LE encoded bytes to the console as if typed by a user."); - -#define _TESTCONSOLE_WRITE_INPUT_METHODDEF \ - {"write_input", (PyCFunction)_testconsole_write_input, METH_FASTCALL, _testconsole_write_input__doc__}, - -static PyObject * -_testconsole_write_input_impl(PyObject *module, PyObject *file, - PyBytesObject *s); - -static PyObject * -_testconsole_write_input(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"file", "s", NULL}; - static _PyArg_Parser _parser = {"OS:write_input", _keywords, 0}; - PyObject *file; - PyBytesObject *s; - - if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, - &file, &s)) { - goto exit; - } - return_value = _testconsole_write_input_impl(module, file, s); - -exit: - return return_value; -} - -#endif /* defined(MS_WINDOWS) */ - -#if defined(MS_WINDOWS) - -PyDoc_STRVAR(_testconsole_read_output__doc__, -"read_output($module, /, file)\n" -"--\n" -"\n" -"Reads a str from the console as written to stdout."); - -#define _TESTCONSOLE_READ_OUTPUT_METHODDEF \ - {"read_output", (PyCFunction)_testconsole_read_output, METH_FASTCALL, _testconsole_read_output__doc__}, - -static PyObject * -_testconsole_read_output_impl(PyObject *module, PyObject *file); - -static PyObject * -_testconsole_read_output(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"file", NULL}; - static _PyArg_Parser _parser = {"O:read_output", _keywords, 0}; - PyObject *file; - - if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, - &file)) { - goto exit; - } - return_value = _testconsole_read_output_impl(module, file); - -exit: - return return_value; -} - -#endif /* defined(MS_WINDOWS) */ - -#ifndef _TESTCONSOLE_WRITE_INPUT_METHODDEF - #define _TESTCONSOLE_WRITE_INPUT_METHODDEF -#endif /* !defined(_TESTCONSOLE_WRITE_INPUT_METHODDEF) */ - -#ifndef _TESTCONSOLE_READ_OUTPUT_METHODDEF - #define _TESTCONSOLE_READ_OUTPUT_METHODDEF -#endif /* !defined(_TESTCONSOLE_READ_OUTPUT_METHODDEF) */ -/*[clinic end generated code: output=3a8dc0c421807c41 input=a9049054013a1b77]*/ diff --git a/third_party/python/PC/clinic/msvcrtmodule.c.h b/third_party/python/PC/clinic/msvcrtmodule.c.h deleted file mode 100644 index 6935cad7b..000000000 --- a/third_party/python/PC/clinic/msvcrtmodule.c.h +++ /dev/null @@ -1,572 +0,0 @@ -/*[clinic input] -preserve -[clinic start generated code]*/ - -PyDoc_STRVAR(msvcrt_heapmin__doc__, -"heapmin($module, /)\n" -"--\n" -"\n" -"Minimize the malloc() heap.\n" -"\n" -"Force the malloc() heap to clean itself up and return unused blocks\n" -"to the operating system. On failure, this raises OSError."); - -#define MSVCRT_HEAPMIN_METHODDEF \ - {"heapmin", (PyCFunction)msvcrt_heapmin, METH_NOARGS, msvcrt_heapmin__doc__}, - -static PyObject * -msvcrt_heapmin_impl(PyObject *module); - -static PyObject * -msvcrt_heapmin(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return msvcrt_heapmin_impl(module); -} - -PyDoc_STRVAR(msvcrt_locking__doc__, -"locking($module, fd, mode, nbytes, /)\n" -"--\n" -"\n" -"Lock part of a file based on file descriptor fd from the C runtime.\n" -"\n" -"Raises IOError on failure. The locked region of the file extends from\n" -"the current file position for nbytes bytes, and may continue beyond\n" -"the end of the file. mode must be one of the LK_* constants listed\n" -"below. Multiple regions in a file may be locked at the same time, but\n" -"may not overlap. Adjacent regions are not merged; they must be unlocked\n" -"individually."); - -#define MSVCRT_LOCKING_METHODDEF \ - {"locking", (PyCFunction)msvcrt_locking, METH_VARARGS, msvcrt_locking__doc__}, - -static PyObject * -msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes); - -static PyObject * -msvcrt_locking(PyObject *module, PyObject *args) -{ - PyObject *return_value = NULL; - int fd; - int mode; - long nbytes; - - if (!PyArg_ParseTuple(args, "iil:locking", - &fd, &mode, &nbytes)) { - goto exit; - } - return_value = msvcrt_locking_impl(module, fd, mode, nbytes); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_setmode__doc__, -"setmode($module, fd, mode, /)\n" -"--\n" -"\n" -"Set the line-end translation mode for the file descriptor fd.\n" -"\n" -"To set it to text mode, flags should be os.O_TEXT; for binary, it\n" -"should be os.O_BINARY.\n" -"\n" -"Return value is the previous mode."); - -#define MSVCRT_SETMODE_METHODDEF \ - {"setmode", (PyCFunction)msvcrt_setmode, METH_VARARGS, msvcrt_setmode__doc__}, - -static long -msvcrt_setmode_impl(PyObject *module, int fd, int flags); - -static PyObject * -msvcrt_setmode(PyObject *module, PyObject *args) -{ - PyObject *return_value = NULL; - int fd; - int flags; - long _return_value; - - if (!PyArg_ParseTuple(args, "ii:setmode", - &fd, &flags)) { - goto exit; - } - _return_value = msvcrt_setmode_impl(module, fd, flags); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_open_osfhandle__doc__, -"open_osfhandle($module, handle, flags, /)\n" -"--\n" -"\n" -"Create a C runtime file descriptor from the file handle handle.\n" -"\n" -"The flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,\n" -"and os.O_TEXT. The returned file descriptor may be used as a parameter\n" -"to os.fdopen() to create a file object."); - -#define MSVCRT_OPEN_OSFHANDLE_METHODDEF \ - {"open_osfhandle", (PyCFunction)msvcrt_open_osfhandle, METH_VARARGS, msvcrt_open_osfhandle__doc__}, - -static long -msvcrt_open_osfhandle_impl(PyObject *module, intptr_t handle, int flags); - -static PyObject * -msvcrt_open_osfhandle(PyObject *module, PyObject *args) -{ - PyObject *return_value = NULL; - intptr_t handle; - int flags; - long _return_value; - - if (!PyArg_ParseTuple(args, ""_Py_PARSE_INTPTR"i:open_osfhandle", - &handle, &flags)) { - goto exit; - } - _return_value = msvcrt_open_osfhandle_impl(module, handle, flags); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_get_osfhandle__doc__, -"get_osfhandle($module, fd, /)\n" -"--\n" -"\n" -"Return the file handle for the file descriptor fd.\n" -"\n" -"Raises IOError if fd is not recognized."); - -#define MSVCRT_GET_OSFHANDLE_METHODDEF \ - {"get_osfhandle", (PyCFunction)msvcrt_get_osfhandle, METH_O, msvcrt_get_osfhandle__doc__}, - -static intptr_t -msvcrt_get_osfhandle_impl(PyObject *module, int fd); - -static PyObject * -msvcrt_get_osfhandle(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int fd; - intptr_t _return_value; - - if (!PyArg_Parse(arg, "i:get_osfhandle", &fd)) { - goto exit; - } - _return_value = msvcrt_get_osfhandle_impl(module, fd); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromVoidPtr((void *)_return_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_kbhit__doc__, -"kbhit($module, /)\n" -"--\n" -"\n" -"Return true if a keypress is waiting to be read."); - -#define MSVCRT_KBHIT_METHODDEF \ - {"kbhit", (PyCFunction)msvcrt_kbhit, METH_NOARGS, msvcrt_kbhit__doc__}, - -static long -msvcrt_kbhit_impl(PyObject *module); - -static PyObject * -msvcrt_kbhit(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - PyObject *return_value = NULL; - long _return_value; - - _return_value = msvcrt_kbhit_impl(module); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_getch__doc__, -"getch($module, /)\n" -"--\n" -"\n" -"Read a keypress and return the resulting character as a byte string.\n" -"\n" -"Nothing is echoed to the console. This call will block if a keypress is\n" -"not already available, but will not wait for Enter to be pressed. If the\n" -"pressed key was a special function key, this will return \'\\000\' or\n" -"\'\\xe0\'; the next call will return the keycode. The Control-C keypress\n" -"cannot be read with this function."); - -#define MSVCRT_GETCH_METHODDEF \ - {"getch", (PyCFunction)msvcrt_getch, METH_NOARGS, msvcrt_getch__doc__}, - -static int -msvcrt_getch_impl(PyObject *module); - -static PyObject * -msvcrt_getch(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - PyObject *return_value = NULL; - char s[1]; - - s[0] = msvcrt_getch_impl(module); - return_value = PyBytes_FromStringAndSize(s, 1); - - return return_value; -} - -PyDoc_STRVAR(msvcrt_getwch__doc__, -"getwch($module, /)\n" -"--\n" -"\n" -"Wide char variant of getch(), returning a Unicode value."); - -#define MSVCRT_GETWCH_METHODDEF \ - {"getwch", (PyCFunction)msvcrt_getwch, METH_NOARGS, msvcrt_getwch__doc__}, - -static wchar_t -msvcrt_getwch_impl(PyObject *module); - -static PyObject * -msvcrt_getwch(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - PyObject *return_value = NULL; - wchar_t _return_value; - - _return_value = msvcrt_getwch_impl(module); - return_value = PyUnicode_FromOrdinal(_return_value); - - return return_value; -} - -PyDoc_STRVAR(msvcrt_getche__doc__, -"getche($module, /)\n" -"--\n" -"\n" -"Similar to getch(), but the keypress will be echoed if possible."); - -#define MSVCRT_GETCHE_METHODDEF \ - {"getche", (PyCFunction)msvcrt_getche, METH_NOARGS, msvcrt_getche__doc__}, - -static int -msvcrt_getche_impl(PyObject *module); - -static PyObject * -msvcrt_getche(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - PyObject *return_value = NULL; - char s[1]; - - s[0] = msvcrt_getche_impl(module); - return_value = PyBytes_FromStringAndSize(s, 1); - - return return_value; -} - -PyDoc_STRVAR(msvcrt_getwche__doc__, -"getwche($module, /)\n" -"--\n" -"\n" -"Wide char variant of getche(), returning a Unicode value."); - -#define MSVCRT_GETWCHE_METHODDEF \ - {"getwche", (PyCFunction)msvcrt_getwche, METH_NOARGS, msvcrt_getwche__doc__}, - -static wchar_t -msvcrt_getwche_impl(PyObject *module); - -static PyObject * -msvcrt_getwche(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - PyObject *return_value = NULL; - wchar_t _return_value; - - _return_value = msvcrt_getwche_impl(module); - return_value = PyUnicode_FromOrdinal(_return_value); - - return return_value; -} - -PyDoc_STRVAR(msvcrt_putch__doc__, -"putch($module, char, /)\n" -"--\n" -"\n" -"Print the byte string char to the console without buffering."); - -#define MSVCRT_PUTCH_METHODDEF \ - {"putch", (PyCFunction)msvcrt_putch, METH_O, msvcrt_putch__doc__}, - -static PyObject * -msvcrt_putch_impl(PyObject *module, char char_value); - -static PyObject * -msvcrt_putch(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - char char_value; - - if (!PyArg_Parse(arg, "c:putch", &char_value)) { - goto exit; - } - return_value = msvcrt_putch_impl(module, char_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_putwch__doc__, -"putwch($module, unicode_char, /)\n" -"--\n" -"\n" -"Wide char variant of putch(), accepting a Unicode value."); - -#define MSVCRT_PUTWCH_METHODDEF \ - {"putwch", (PyCFunction)msvcrt_putwch, METH_O, msvcrt_putwch__doc__}, - -static PyObject * -msvcrt_putwch_impl(PyObject *module, int unicode_char); - -static PyObject * -msvcrt_putwch(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int unicode_char; - - if (!PyArg_Parse(arg, "C:putwch", &unicode_char)) { - goto exit; - } - return_value = msvcrt_putwch_impl(module, unicode_char); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_ungetch__doc__, -"ungetch($module, char, /)\n" -"--\n" -"\n" -"Opposite of getch.\n" -"\n" -"Cause the byte string char to be \"pushed back\" into the\n" -"console buffer; it will be the next character read by\n" -"getch() or getche()."); - -#define MSVCRT_UNGETCH_METHODDEF \ - {"ungetch", (PyCFunction)msvcrt_ungetch, METH_O, msvcrt_ungetch__doc__}, - -static PyObject * -msvcrt_ungetch_impl(PyObject *module, char char_value); - -static PyObject * -msvcrt_ungetch(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - char char_value; - - if (!PyArg_Parse(arg, "c:ungetch", &char_value)) { - goto exit; - } - return_value = msvcrt_ungetch_impl(module, char_value); - -exit: - return return_value; -} - -PyDoc_STRVAR(msvcrt_ungetwch__doc__, -"ungetwch($module, unicode_char, /)\n" -"--\n" -"\n" -"Wide char variant of ungetch(), accepting a Unicode value."); - -#define MSVCRT_UNGETWCH_METHODDEF \ - {"ungetwch", (PyCFunction)msvcrt_ungetwch, METH_O, msvcrt_ungetwch__doc__}, - -static PyObject * -msvcrt_ungetwch_impl(PyObject *module, int unicode_char); - -static PyObject * -msvcrt_ungetwch(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int unicode_char; - - if (!PyArg_Parse(arg, "C:ungetwch", &unicode_char)) { - goto exit; - } - return_value = msvcrt_ungetwch_impl(module, unicode_char); - -exit: - return return_value; -} - -#if defined(_DEBUG) - -PyDoc_STRVAR(msvcrt_CrtSetReportFile__doc__, -"CrtSetReportFile($module, type, file, /)\n" -"--\n" -"\n" -"Wrapper around _CrtSetReportFile.\n" -"\n" -"Only available on Debug builds."); - -#define MSVCRT_CRTSETREPORTFILE_METHODDEF \ - {"CrtSetReportFile", (PyCFunction)msvcrt_CrtSetReportFile, METH_VARARGS, msvcrt_CrtSetReportFile__doc__}, - -static long -msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file); - -static PyObject * -msvcrt_CrtSetReportFile(PyObject *module, PyObject *args) -{ - PyObject *return_value = NULL; - int type; - int file; - long _return_value; - - if (!PyArg_ParseTuple(args, "ii:CrtSetReportFile", - &type, &file)) { - goto exit; - } - _return_value = msvcrt_CrtSetReportFile_impl(module, type, file); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -#endif /* defined(_DEBUG) */ - -#if defined(_DEBUG) - -PyDoc_STRVAR(msvcrt_CrtSetReportMode__doc__, -"CrtSetReportMode($module, type, mode, /)\n" -"--\n" -"\n" -"Wrapper around _CrtSetReportMode.\n" -"\n" -"Only available on Debug builds."); - -#define MSVCRT_CRTSETREPORTMODE_METHODDEF \ - {"CrtSetReportMode", (PyCFunction)msvcrt_CrtSetReportMode, METH_VARARGS, msvcrt_CrtSetReportMode__doc__}, - -static long -msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode); - -static PyObject * -msvcrt_CrtSetReportMode(PyObject *module, PyObject *args) -{ - PyObject *return_value = NULL; - int type; - int mode; - long _return_value; - - if (!PyArg_ParseTuple(args, "ii:CrtSetReportMode", - &type, &mode)) { - goto exit; - } - _return_value = msvcrt_CrtSetReportMode_impl(module, type, mode); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -#endif /* defined(_DEBUG) */ - -#if defined(_DEBUG) - -PyDoc_STRVAR(msvcrt_set_error_mode__doc__, -"set_error_mode($module, mode, /)\n" -"--\n" -"\n" -"Wrapper around _set_error_mode.\n" -"\n" -"Only available on Debug builds."); - -#define MSVCRT_SET_ERROR_MODE_METHODDEF \ - {"set_error_mode", (PyCFunction)msvcrt_set_error_mode, METH_O, msvcrt_set_error_mode__doc__}, - -static long -msvcrt_set_error_mode_impl(PyObject *module, int mode); - -static PyObject * -msvcrt_set_error_mode(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int mode; - long _return_value; - - if (!PyArg_Parse(arg, "i:set_error_mode", &mode)) { - goto exit; - } - _return_value = msvcrt_set_error_mode_impl(module, mode); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - -#endif /* defined(_DEBUG) */ - -PyDoc_STRVAR(msvcrt_SetErrorMode__doc__, -"SetErrorMode($module, mode, /)\n" -"--\n" -"\n" -"Wrapper around SetErrorMode."); - -#define MSVCRT_SETERRORMODE_METHODDEF \ - {"SetErrorMode", (PyCFunction)msvcrt_SetErrorMode, METH_O, msvcrt_SetErrorMode__doc__}, - -static PyObject * -msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode); - -static PyObject * -msvcrt_SetErrorMode(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - unsigned int mode; - - if (!PyArg_Parse(arg, "I:SetErrorMode", &mode)) { - goto exit; - } - return_value = msvcrt_SetErrorMode_impl(module, mode); - -exit: - return return_value; -} - -#ifndef MSVCRT_CRTSETREPORTFILE_METHODDEF - #define MSVCRT_CRTSETREPORTFILE_METHODDEF -#endif /* !defined(MSVCRT_CRTSETREPORTFILE_METHODDEF) */ - -#ifndef MSVCRT_CRTSETREPORTMODE_METHODDEF - #define MSVCRT_CRTSETREPORTMODE_METHODDEF -#endif /* !defined(MSVCRT_CRTSETREPORTMODE_METHODDEF) */ - -#ifndef MSVCRT_SET_ERROR_MODE_METHODDEF - #define MSVCRT_SET_ERROR_MODE_METHODDEF -#endif /* !defined(MSVCRT_SET_ERROR_MODE_METHODDEF) */ -/*[clinic end generated code: output=ae04e2b50eef8b63 input=a9049054013a1b77]*/ diff --git a/third_party/python/PC/clinic/winreg.c.h b/third_party/python/PC/clinic/winreg.inc similarity index 100% rename from third_party/python/PC/clinic/winreg.c.h rename to third_party/python/PC/clinic/winreg.inc diff --git a/third_party/python/PC/clinic/winsound.c.h b/third_party/python/PC/clinic/winsound.inc similarity index 100% rename from third_party/python/PC/clinic/winsound.c.h rename to third_party/python/PC/clinic/winsound.inc diff --git a/third_party/python/PC/config.c b/third_party/python/PC/config.c index bab910041..3b41861c3 100644 --- a/third_party/python/PC/config.c +++ b/third_party/python/PC/config.c @@ -1,9 +1,10 @@ +/* clang-format off */ /* Module configuration */ /* This file contains the table of built-in modules. See create_builtin() in import.c. */ -#include "Python.h" +#include "third_party/python/Include/Python.h" extern PyObject* PyInit_array(void); #ifndef MS_WINI64 diff --git a/third_party/python/PC/dl_nt.c b/third_party/python/PC/dl_nt.c index c87c51eb5..ed55d72f9 100644 --- a/third_party/python/PC/dl_nt.c +++ b/third_party/python/PC/dl_nt.c @@ -1,3 +1,4 @@ +/* clang-format off */ /* Entry point for the Windows NT DLL. @@ -8,8 +9,7 @@ forgotten) from the programmer. */ -#include "Python.h" -#include "windows.h" +#include "third_party/python/Include/Python.h" #ifdef Py_ENABLE_SHARED #ifdef MS_DLL_ID diff --git a/third_party/python/PC/dllbase_nt.txt b/third_party/python/PC/dllbase_nt.txt deleted file mode 100644 index 93a15d12b..000000000 --- a/third_party/python/PC/dllbase_nt.txt +++ /dev/null @@ -1,77 +0,0 @@ -In Win32, DLL's are "pre-linked" using a specified base address. -When the DLL is loaded, an attempt is made to place it at -that address. If that address is already in use, a new base address -is selected, and the DLL subject to fixups. Apparently, these -fixups are very slow, and significant performance gains can be -made by selecting a good base address. - -This document is to allocate base addresses to core Python -and Python .PYD files, to give a better change of optimal performance. -This base address is passed to the linker using the /BASE -command line switch. - - -Python.exe/Pythonw.exe - 1d000000 - 1e000000 (-1) -Python.dll - 1e000000 - 1e100000 (-1) - -Standard Extension Modules 1e100000 - 1e200000 "" - - _symtable 1e100000 - 1e110000 pyd removed in 2.4 - - bsddb 1e180000 - 1e188000 pyd removed in 3.0 - - _tkinter 1e190000 - 1e1A0000 - - parser 1e1A0000 - 1e1B0000 pyd removed in 2.4 - - zlib 1e1B0000 - 1e1C0000 - - winreg 1e1C0000 - 1e1D0000 pyd removed in 2.4 - - _socket 1e1D0000 - 1e1E0000 - - _sre 1e1E0000 - 1e1F0000 pyd removed in 2.4 - - mmap 1e1F0000 - 1e1FFFFF pyd removed in 2.4 - -More standard extensions 1D100000 - 1e000000 - - pyexpat 1D100000 - 1D110000 - - select 1D110000 - 1D120000 - - unicodedata 1D120000 - 1D160000 - - winsound 1D160000 - 1D170000 - - bZ2 1D170000 - 1D180000 - - datetime 1D180000 - 1D190000 pyd removed in 2.4 - - _csv 1D190000 - 1D1A0000 pyd removed in 2.4 - - _ctypes 1D1A0000 - 1D1B0000 - -Other extension modules - - win32api 1e200000 - 1e220000 - - win32ras 1e220000 - 1e230000 - - win32lz 1e230000 - 1e240000 - - timer 1e240000 - 1e250000 - - mmapfile 1e250000 - 1e260000 - - win32pipe 1e260000 - 1e270000 - - avl 1e270000 - 1e270000 - - dbhash 1e280000 - 1e290000 - - win32net 1e290000 - 1e2A0000 - - win32security 1e2A0000 - 1e2B0000 - - win32print 1e2B0000 - 1e2c0000 - - 1e2d0000 - 1e2e0000 - - win32gui 1e2e0000 - 1e2f0000 - - _imaging 1e2f0000 - 1e300000 - - multiarray 1e300000 - 1e310000 - - win32help 1e310000 - 1e320000 - - win32clipboard 1e320000 - 1e330000 - - win2kras 1e330000 - 1e340000 - - pythoncom 1e340000 - 1e400000 - - win32ui 1e400000 - 1e500000 - - win32uiole 1e500000 - 1e600000 - - pywintypes 1e600000 - 1e700000 - - win32process 1e700000 - 1e800000 - - odbc 1e710000 - 1e720000 - - dbi 1e720000 - 1e730000 - - win32file 1e730000 - 1e740000 - - win32wnet 1e740000 - 1e750000 - - win32com.shell 1e750000 - 1e760000 - - win32com.internet 1e760000 - 1e770000 - - win32com.exchange 1e770000 - 1e780000 - - win32com.exchdapi 1e780000 - 1e790000 - - win32com.axscript 1e790000 - 1e7a0000 - - win32com.axdebug 1e7b0000 - 1e7c0000 - - win32com.adsi 1e7f0000 - 1e800000 - - win32event 1e810000 - 1e820000 - - win32evtlog 1e820000 - 1e830000 - - win32com.axcontrol 1e830000 - 1e840000 - - diff --git a/third_party/python/PC/empty.c b/third_party/python/PC/empty.c deleted file mode 100644 index 846b4d0d6..000000000 --- a/third_party/python/PC/empty.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -int __stdcall -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -{ - return 0; -} \ No newline at end of file diff --git a/third_party/python/PC/errmap.h b/third_party/python/PC/errmap.h deleted file mode 100644 index 985f673a4..000000000 --- a/third_party/python/PC/errmap.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Generated file. Do not edit. */ -int winerror_to_errno(int winerror) -{ - switch(winerror) { - case 2: return 2; - case 3: return 2; - case 4: return 24; - case 5: return 13; - case 6: return 9; - case 7: return 12; - case 8: return 12; - case 9: return 12; - case 10: return 7; - case 11: return 8; - case 15: return 2; - case 16: return 13; - case 17: return 18; - case 18: return 2; - case 19: return 13; - case 20: return 13; - case 21: return 13; - case 22: return 13; - case 23: return 13; - case 24: return 13; - case 25: return 13; - case 26: return 13; - case 27: return 13; - case 28: return 13; - case 29: return 13; - case 30: return 13; - case 31: return 13; - case 32: return 13; - case 33: return 13; - case 34: return 13; - case 35: return 13; - case 36: return 13; - case 53: return 2; - case 65: return 13; - case 67: return 2; - case 80: return 17; - case 82: return 13; - case 83: return 13; - case 89: return 11; - case 108: return 13; - case 109: return 32; - case 112: return 28; - case 114: return 9; - case 128: return 10; - case 129: return 10; - case 130: return 9; - case 132: return 13; - case 145: return 41; - case 158: return 13; - case 161: return 2; - case 164: return 11; - case 167: return 13; - case 183: return 17; - case 188: return 8; - case 189: return 8; - case 190: return 8; - case 191: return 8; - case 192: return 8; - case 193: return 8; - case 194: return 8; - case 195: return 8; - case 196: return 8; - case 197: return 8; - case 198: return 8; - case 199: return 8; - case 200: return 8; - case 201: return 8; - case 202: return 8; - case 206: return 2; - case 215: return 11; - case 232: return 32; - case 267: return 20; - case 1816: return 12; - default: return EINVAL; - } -} diff --git a/third_party/python/PC/errmap.mak b/third_party/python/PC/errmap.mak deleted file mode 100644 index 646bcd0a2..000000000 --- a/third_party/python/PC/errmap.mak +++ /dev/null @@ -1,5 +0,0 @@ -errmap.h: generrmap.exe - .\generrmap.exe > errmap.h - -genermap.exe: generrmap.c - cl generrmap.c diff --git a/third_party/python/PC/external/Externals.txt b/third_party/python/PC/external/Externals.txt deleted file mode 100644 index 618fe16fd..000000000 --- a/third_party/python/PC/external/Externals.txt +++ /dev/null @@ -1,3 +0,0 @@ -The files in this folder are from the Microsoft.VisualStudio.Setup.Configuration.Native package on Nuget. - -They are licensed under the MIT license. diff --git a/third_party/python/PC/external/include/Setup.Configuration.h b/third_party/python/PC/external/include/Setup.Configuration.h deleted file mode 100644 index 1fb31878d..000000000 --- a/third_party/python/PC/external/include/Setup.Configuration.h +++ /dev/null @@ -1,827 +0,0 @@ -// The MIT License(MIT) -// Copyright(C) Microsoft Corporation.All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files(the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions : -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -// - -#pragma once - -// Constants -// -#ifndef E_NOTFOUND -#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND) -#endif - -#ifndef E_FILENOTFOUND -#define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) -#endif - -#ifndef E_NOTSUPPORTED -#define E_NOTSUPPORTED HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) -#endif - -// Enumerations -// -///

-/// The state of an instance. -/// -enum InstanceState -{ - /// - /// The instance state has not been determined. - /// - eNone = 0, - - /// - /// The instance installation path exists. - /// - eLocal = 1, - - /// - /// A product is registered to the instance. - /// - eRegistered = 2, - - /// - /// No reboot is required for the instance. - /// - eNoRebootRequired = 4, - - /// - /// No errors were reported for the instance. - /// - eNoErrors = 8, - - /// - /// The instance represents a complete install. - /// - eComplete = MAXUINT, -}; - -// Forward interface declarations -// -#ifndef __ISetupInstance_FWD_DEFINED__ -#define __ISetupInstance_FWD_DEFINED__ -typedef struct ISetupInstance ISetupInstance; -#endif - -#ifndef __ISetupInstance2_FWD_DEFINED__ -#define __ISetupInstance2_FWD_DEFINED__ -typedef struct ISetupInstance2 ISetupInstance2; -#endif - -#ifndef __ISetupLocalizedProperties_FWD_DEFINED__ -#define __ISetupLocalizedProperties_FWD_DEFINED__ -typedef struct ISetupLocalizedProperties ISetupLocalizedProperties; -#endif - -#ifndef __IEnumSetupInstances_FWD_DEFINED__ -#define __IEnumSetupInstances_FWD_DEFINED__ -typedef struct IEnumSetupInstances IEnumSetupInstances; -#endif - -#ifndef __ISetupConfiguration_FWD_DEFINED__ -#define __ISetupConfiguration_FWD_DEFINED__ -typedef struct ISetupConfiguration ISetupConfiguration; -#endif - -#ifndef __ISetupConfiguration2_FWD_DEFINED__ -#define __ISetupConfiguration2_FWD_DEFINED__ -typedef struct ISetupConfiguration2 ISetupConfiguration2; -#endif - -#ifndef __ISetupPackageReference_FWD_DEFINED__ -#define __ISetupPackageReference_FWD_DEFINED__ -typedef struct ISetupPackageReference ISetupPackageReference; -#endif - -#ifndef __ISetupHelper_FWD_DEFINED__ -#define __ISetupHelper_FWD_DEFINED__ -typedef struct ISetupHelper ISetupHelper; -#endif - -#ifndef __ISetupErrorState_FWD_DEFINED__ -#define __ISetupErrorState_FWD_DEFINED__ -typedef struct ISetupErrorState ISetupErrorState; -#endif - -#ifndef __ISetupErrorState2_FWD_DEFINED__ -#define __ISetupErrorState2_FWD_DEFINED__ -typedef struct ISetupErrorState2 ISetupErrorState2; -#endif - -#ifndef __ISetupFailedPackageReference_FWD_DEFINED__ -#define __ISetupFailedPackageReference_FWD_DEFINED__ -typedef struct ISetupFailedPackageReference ISetupFailedPackageReference; -#endif - -#ifndef __ISetupFailedPackageReference2_FWD_DEFINED__ -#define __ISetupFailedPackageReference2_FWD_DEFINED__ -typedef struct ISetupFailedPackageReference2 ISetupFailedPackageReference2; -#endif - -#ifndef __ISetupPropertyStore_FWD_DEFINED__ -#define __ISetupPropertyStore_FWD_DEFINED__ -typedef struct ISetupPropertyStore ISetupPropertyStore; -#endif - -#ifndef __ISetupLocalizedPropertyStore_FWD_DEFINED__ -#define __ISetupLocalizedPropertyStore_FWD_DEFINED__ -typedef struct ISetupLocalizedPropertyStore ISetupLocalizedPropertyStore; -#endif - -// Forward class declarations -// -#ifndef __SetupConfiguration_FWD_DEFINED__ -#define __SetupConfiguration_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class SetupConfiguration SetupConfiguration; -#endif - -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// Interface definitions -// -EXTERN_C const IID IID_ISetupInstance; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Information about an instance of a product. -/// -struct DECLSPEC_UUID("B41463C3-8866-43B5-BC33-2B0676F7F42E") DECLSPEC_NOVTABLE ISetupInstance : public IUnknown -{ - /// - /// Gets the instance identifier (should match the name of the parent instance directory). - /// - /// The instance identifier. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetInstanceId)( - _Out_ BSTR* pbstrInstanceId - ) = 0; - - /// - /// Gets the local date and time when the installation was originally installed. - /// - /// The local date and time when the installation was originally installed. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetInstallDate)( - _Out_ LPFILETIME pInstallDate - ) = 0; - - /// - /// Gets the unique name of the installation, often indicating the branch and other information used for telemetry. - /// - /// The unique name of the installation, often indicating the branch and other information used for telemetry. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetInstallationName)( - _Out_ BSTR* pbstrInstallationName - ) = 0; - - /// - /// Gets the path to the installation root of the product. - /// - /// The path to the installation root of the product. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetInstallationPath)( - _Out_ BSTR* pbstrInstallationPath - ) = 0; - - /// - /// Gets the version of the product installed in this instance. - /// - /// The version of the product installed in this instance. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetInstallationVersion)( - _Out_ BSTR* pbstrInstallationVersion - ) = 0; - - /// - /// Gets the display name (title) of the product installed in this instance. - /// - /// The LCID for the display name. - /// The display name (title) of the product installed in this instance. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetDisplayName)( - _In_ LCID lcid, - _Out_ BSTR* pbstrDisplayName - ) = 0; - - /// - /// Gets the description of the product installed in this instance. - /// - /// The LCID for the description. - /// The description of the product installed in this instance. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(GetDescription)( - _In_ LCID lcid, - _Out_ BSTR* pbstrDescription - ) = 0; - - /// - /// Resolves the optional relative path to the root path of the instance. - /// - /// A relative path within the instance to resolve, or NULL to get the root path. - /// The full path to the optional relative path within the instance. If the relative path is NULL, the root path will always terminate in a backslash. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the property is not defined. - STDMETHOD(ResolvePath)( - _In_opt_z_ LPCOLESTR pwszRelativePath, - _Out_ BSTR* pbstrAbsolutePath - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupInstance2; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Information about an instance of a product. -/// -struct DECLSPEC_UUID("89143C9A-05AF-49B0-B717-72E218A2185C") DECLSPEC_NOVTABLE ISetupInstance2 : public ISetupInstance -{ - /// - /// Gets the state of the instance. - /// - /// The state of the instance. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetState)( - _Out_ InstanceState* pState - ) = 0; - - /// - /// Gets an array of package references registered to the instance. - /// - /// Pointer to an array of . - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the packages property is not defined. - STDMETHOD(GetPackages)( - _Out_ LPSAFEARRAY* ppsaPackages - ) = 0; - - /// - /// Gets a pointer to the that represents the registered product. - /// - /// Pointer to an instance of . This may be NULL if does not return . - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the packages property is not defined. - STDMETHOD(GetProduct)( - _Outptr_result_maybenull_ ISetupPackageReference** ppPackage - ) = 0; - - /// - /// Gets the relative path to the product application, if available. - /// - /// The relative path to the product application, if available. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetProductPath)( - _Outptr_result_maybenull_ BSTR* pbstrProductPath - ) = 0; - - /// - /// Gets the error state of the instance, if available. - /// - /// The error state of the instance, if available. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetErrors)( - _Outptr_result_maybenull_ ISetupErrorState** ppErrorState - ) = 0; - - /// - /// Gets a value indicating whether the instance can be launched. - /// - /// Whether the instance can be launched. - /// Standard HRESULT indicating success or failure. - /// - /// An instance could have had errors during install but still be launched. Some features may not work correctly, but others will. - /// - STDMETHOD(IsLaunchable)( - _Out_ VARIANT_BOOL* pfIsLaunchable - ) = 0; - - /// - /// Gets a value indicating whether the instance is complete. - /// - /// Whether the instance is complete. - /// Standard HRESULT indicating success or failure. - /// - /// An instance is complete if it had no errors during install, resume, or repair. - /// - STDMETHOD(IsComplete)( - _Out_ VARIANT_BOOL* pfIsComplete - ) = 0; - - /// - /// Gets product-specific properties. - /// - /// A pointer to an instance of . This may be NULL if no properties are defined. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetProperties)( - _Outptr_result_maybenull_ ISetupPropertyStore** ppProperties - ) = 0; - - /// - /// Gets the directory path to the setup engine that installed the instance. - /// - /// The directory path to the setup engine that installed the instance. - /// Standard HRESULT indicating success or failure, including E_FILENOTFOUND if the instance state does not exist. - STDMETHOD(GetEnginePath)( - _Outptr_result_maybenull_ BSTR* pbstrEnginePath - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupLocalizedProperties; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Provides localized properties of an instance of a product. -/// -struct DECLSPEC_UUID("F4BD7382-FE27-4AB4-B974-9905B2A148B0") DECLSPEC_NOVTABLE ISetupLocalizedProperties : public IUnknown -{ - /// - /// Gets localized product-specific properties. - /// - /// A pointer to an instance of . This may be NULL if no properties are defined. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetLocalizedProperties)( - _Outptr_result_maybenull_ ISetupLocalizedPropertyStore** ppLocalizedProperties - ) = 0; - - /// - /// Gets localized channel-specific properties. - /// - /// A pointer to an instance of . This may be NULL if no channel properties are defined. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetLocalizedChannelProperties)( - _Outptr_result_maybenull_ ISetupLocalizedPropertyStore** ppLocalizedChannelProperties - ) = 0; -}; -#endif - -EXTERN_C const IID IID_IEnumSetupInstances; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// An enumerator of installed objects. -/// -struct DECLSPEC_UUID("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848") DECLSPEC_NOVTABLE IEnumSetupInstances : public IUnknown -{ - /// - /// Retrieves the next set of product instances in the enumeration sequence. - /// - /// The number of product instances to retrieve. - /// A pointer to an array of . - /// A pointer to the number of product instances retrieved. If is 1 this parameter may be NULL. - /// S_OK if the number of elements were fetched, S_FALSE if nothing was fetched (at end of enumeration), E_INVALIDARG if is greater than 1 and pceltFetched is NULL, or E_OUTOFMEMORY if an could not be allocated. - STDMETHOD(Next)( - _In_ ULONG celt, - _Out_writes_to_(celt, *pceltFetched) ISetupInstance** rgelt, - _Out_opt_ _Deref_out_range_(0, celt) ULONG* pceltFetched - ) = 0; - - /// - /// Skips the next set of product instances in the enumeration sequence. - /// - /// The number of product instances to skip. - /// S_OK if the number of elements could be skipped; otherwise, S_FALSE; - STDMETHOD(Skip)( - _In_ ULONG celt - ) = 0; - - /// - /// Resets the enumeration sequence to the beginning. - /// - /// Always returns S_OK; - STDMETHOD(Reset)(void) = 0; - - /// - /// Creates a new enumeration object in the same state as the current enumeration object: the new object points to the same place in the enumeration sequence. - /// - /// A pointer to a pointer to a new interface. If the method fails, this parameter is undefined. - /// S_OK if a clone was returned; otherwise, E_OUTOFMEMORY. - STDMETHOD(Clone)( - _Deref_out_opt_ IEnumSetupInstances** ppenum - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupConfiguration; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Gets information about product instances installed on the machine. -/// -struct DECLSPEC_UUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B") DECLSPEC_NOVTABLE ISetupConfiguration : public IUnknown -{ - /// - /// Enumerates all launchable product instances installed. - /// - /// An enumeration of completed, installed product instances. - /// Standard HRESULT indicating success or failure. - STDMETHOD(EnumInstances)( - _Out_ IEnumSetupInstances** ppEnumInstances - ) = 0; - - /// - /// Gets the instance for the current process path. - /// - /// The instance for the current process path. - /// - /// The instance for the current process path, or E_NOTFOUND if not found. - /// The may indicate the instance is invalid. - /// - /// - /// The returned instance may not be launchable. - /// -STDMETHOD(GetInstanceForCurrentProcess)( - _Out_ ISetupInstance** ppInstance - ) = 0; - - /// - /// Gets the instance for the given path. - /// - /// The instance for the given path. - /// - /// The instance for the given path, or E_NOTFOUND if not found. - /// The may indicate the instance is invalid. - /// - /// - /// The returned instance may not be launchable. - /// -STDMETHOD(GetInstanceForPath)( - _In_z_ LPCWSTR wzPath, - _Out_ ISetupInstance** ppInstance - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupConfiguration2; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Gets information about product instances. -/// -struct DECLSPEC_UUID("26AAB78C-4A60-49D6-AF3B-3C35BC93365D") DECLSPEC_NOVTABLE ISetupConfiguration2 : public ISetupConfiguration -{ - /// - /// Enumerates all product instances. - /// - /// An enumeration of all product instances. - /// Standard HRESULT indicating success or failure. - STDMETHOD(EnumAllInstances)( - _Out_ IEnumSetupInstances** ppEnumInstances - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupPackageReference; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// A reference to a package. -/// -struct DECLSPEC_UUID("da8d8a16-b2b6-4487-a2f1-594ccccd6bf5") DECLSPEC_NOVTABLE ISetupPackageReference : public IUnknown -{ - /// - /// Gets the general package identifier. - /// - /// The general package identifier. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetId)( - _Out_ BSTR* pbstrId - ) = 0; - - /// - /// Gets the version of the package. - /// - /// The version of the package. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetVersion)( - _Out_ BSTR* pbstrVersion - ) = 0; - - /// - /// Gets the target process architecture of the package. - /// - /// The target process architecture of the package. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetChip)( - _Out_ BSTR* pbstrChip - ) = 0; - - /// - /// Gets the language and optional region identifier. - /// - /// The language and optional region identifier. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetLanguage)( - _Out_ BSTR* pbstrLanguage - ) = 0; - - /// - /// Gets the build branch of the package. - /// - /// The build branch of the package. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetBranch)( - _Out_ BSTR* pbstrBranch - ) = 0; - - /// - /// Gets the type of the package. - /// - /// The type of the package. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetType)( - _Out_ BSTR* pbstrType - ) = 0; - - /// - /// Gets the unique identifier consisting of all defined tokens. - /// - /// The unique identifier consisting of all defined tokens. - /// Standard HRESULT indicating success or failure, including E_UNEXPECTED if no Id was defined (required). - STDMETHOD(GetUniqueId)( - _Out_ BSTR* pbstrUniqueId - ) = 0; - - /// - /// Gets a value indicating whether the package refers to an external extension. - /// - /// A value indicating whether the package refers to an external extension. - /// Standard HRESULT indicating success or failure, including E_UNEXPECTED if no Id was defined (required). - STDMETHOD(GetIsExtension)( - _Out_ VARIANT_BOOL* pfIsExtension - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupHelper; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Helper functions. -/// -/// -/// You can query for this interface from the class. -/// -struct DECLSPEC_UUID("42b21b78-6192-463e-87bf-d577838f1d5c") DECLSPEC_NOVTABLE ISetupHelper : public IUnknown -{ - /// - /// Parses a dotted quad version string into a 64-bit unsigned integer. - /// - /// The dotted quad version string to parse, e.g. 1.2.3.4. - /// A 64-bit unsigned integer representing the version. You can compare this to other versions. - /// Standard HRESULT indicating success or failure, including E_INVALIDARG if the version is not valid. - STDMETHOD(ParseVersion)( - _In_ LPCOLESTR pwszVersion, - _Out_ PULONGLONG pullVersion - ) = 0; - - /// - /// Parses a dotted quad version string into a 64-bit unsigned integer. - /// - /// The string containing 1 or 2 dotted quad version strings to parse, e.g. [1.0,) that means 1.0.0.0 or newer. - /// A 64-bit unsigned integer representing the minimum version, which may be 0. You can compare this to other versions. - /// A 64-bit unsigned integer representing the maximum version, which may be MAXULONGLONG. You can compare this to other versions. - /// Standard HRESULT indicating success or failure, including E_INVALIDARG if the version range is not valid. - STDMETHOD(ParseVersionRange)( - _In_ LPCOLESTR pwszVersionRange, - _Out_ PULONGLONG pullMinVersion, - _Out_ PULONGLONG pullMaxVersion - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupErrorState; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Information about the error state of an instance. -/// -struct DECLSPEC_UUID("46DCCD94-A287-476A-851E-DFBC2FFDBC20") DECLSPEC_NOVTABLE ISetupErrorState : public IUnknown -{ - /// - /// Gets an array of failed package references. - /// - /// Pointer to an array of , if packages have failed. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetFailedPackages)( - _Outptr_result_maybenull_ LPSAFEARRAY* ppsaFailedPackages - ) = 0; - - /// - /// Gets an array of skipped package references. - /// - /// Pointer to an array of , if packages have been skipped. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetSkippedPackages)( - _Outptr_result_maybenull_ LPSAFEARRAY* ppsaSkippedPackages - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupErrorState2; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Information about the error state of an instance. -/// -struct DECLSPEC_UUID("9871385B-CA69-48F2-BC1F-7A37CBF0B1EF") DECLSPEC_NOVTABLE ISetupErrorState2 : public ISetupErrorState -{ - /// - /// Gets the path to the error log. - /// - /// The path to the error log. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetErrorLogFilePath)( - _Outptr_result_maybenull_ BSTR* pbstrErrorLogFilePath - ) = 0; -}; -#endif - -EXTERN_C const IID IID_ISetupFailedPackageReference; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// A reference to a failed package. -/// -struct DECLSPEC_UUID("E73559CD-7003-4022-B134-27DC650B280F") DECLSPEC_NOVTABLE ISetupFailedPackageReference : public ISetupPackageReference -{ -}; - -#endif - -EXTERN_C const IID IID_ISetupFailedPackageReference2; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// A reference to a failed package. -/// -struct DECLSPEC_UUID("0FAD873E-E874-42E3-B268-4FE2F096B9CA") DECLSPEC_NOVTABLE ISetupFailedPackageReference2 : public ISetupFailedPackageReference -{ - /// - /// Gets the path to the optional package log. - /// - /// The path to the optional package log. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetLogFilePath)( - _Outptr_result_maybenull_ BSTR* pbstrLogFilePath - ) = 0; - - /// - /// Gets the description of the package failure. - /// - /// The description of the package failure. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetDescription)( - _Outptr_result_maybenull_ BSTR* pbstrDescription - ) = 0; - - /// - /// Gets the signature to use for feedback reporting. - /// - /// The signature to use for feedback reporting. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetSignature)( - _Outptr_result_maybenull_ BSTR* pbstrSignature - ) = 0; - - /// - /// Gets the array of details for this package failure. - /// - /// Pointer to an array of details as BSTRs. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetDetails)( - _Out_ LPSAFEARRAY* ppsaDetails - ) = 0; - - /// - /// Gets an array of packages affected by this package failure. - /// - /// Pointer to an array of for packages affected by this package failure. This may be NULL. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetAffectedPackages)( - _Out_ LPSAFEARRAY* ppsaAffectedPackages - ) = 0; -}; - -#endif - -EXTERN_C const IID IID_ISetupPropertyStore; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Provides named properties. -/// -/// -/// You can get this from an , , or derivative. -/// -struct DECLSPEC_UUID("C601C175-A3BE-44BC-91F6-4568D230FC83") DECLSPEC_NOVTABLE ISetupPropertyStore : public IUnknown -{ - /// - /// Gets an array of property names in this property store. - /// - /// Pointer to an array of property names as BSTRs. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetNames)( - _Out_ LPSAFEARRAY* ppsaNames - ) = 0; - - /// - /// Gets the value of a named property in this property store. - /// - /// The name of the property to get. - /// The value of the property. - /// Standard HRESULT indicating success or failure, including E_NOTFOUND if the property is not defined or E_NOTSUPPORTED if the property type is not supported. - STDMETHOD(GetValue)( - _In_ LPCOLESTR pwszName, - _Out_ LPVARIANT pvtValue - ) = 0; -}; - -#endif - -EXTERN_C const IID IID_ISetupLocalizedPropertyStore; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/// -/// Provides localized named properties. -/// -/// -/// You can get this from an . -/// -struct DECLSPEC_UUID("5BB53126-E0D5-43DF-80F1-6B161E5C6F6C") DECLSPEC_NOVTABLE ISetupLocalizedPropertyStore : public IUnknown -{ - /// - /// Gets an array of property names in this property store. - /// - /// The LCID for the property names. - /// Pointer to an array of property names as BSTRs. - /// Standard HRESULT indicating success or failure. - STDMETHOD(GetNames)( - _In_ LCID lcid, - _Out_ LPSAFEARRAY* ppsaNames - ) = 0; - - /// - /// Gets the value of a named property in this property store. - /// - /// The name of the property to get. - /// The LCID for the property. - /// The value of the property. - /// Standard HRESULT indicating success or failure, including E_NOTFOUND if the property is not defined or E_NOTSUPPORTED if the property type is not supported. - STDMETHOD(GetValue)( - _In_ LPCOLESTR pwszName, - _In_ LCID lcid, - _Out_ LPVARIANT pvtValue - ) = 0; -}; - -#endif - -// Class declarations -// -EXTERN_C const CLSID CLSID_SetupConfiguration; - -#ifdef __cplusplus -/// -/// This class implements , , and . -/// -class DECLSPEC_UUID("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D") SetupConfiguration; -#endif - -// Function declarations -// -/// -/// Gets an that provides information about product instances installed on the machine. -/// -/// The that provides information about product instances installed on the machine. -/// Reserved for future use. -/// Standard HRESULT indicating success or failure. -STDMETHODIMP GetSetupConfiguration( - _Out_ ISetupConfiguration** ppConfiguration, - _Reserved_ LPVOID pReserved -); - -#ifdef __cplusplus -} -#endif diff --git a/third_party/python/PC/external/v140/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib b/third_party/python/PC/external/v140/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib deleted file mode 100644 index 675a501d8cb5a76e24c571cfca42cc8b3b3fe73f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2384 zcmc&$K~EY%6#f7eOPhwYUV3Ok6O-1FG0j?SEEUlJHtEHMvZx!;CAjq38>e3V z3;qIsfaxD-5B`8A{SiId_jYGiwnb$P#z|)0yf=?GGv9pgEiV=u-R9n#L^>608MUA; zXbTxF8??_0HJj7KteyZc2}I9HoB;7DVEUB1VHDRlH!3w_`_MuWH@udaBC~uWY|A)fY(6PKowf9@) zHDhI|wuIG|zv|&^W1=I86{x=TYE<(3*+^r_(NQm_P(k8e>n7zBl%Xb%!bpL&B~=2n*5>ukYaI*QP(klCj2zlNCQvi$Vd9IT}SGS zsDed2U={gWLGcn#lSDN9bYlRINgi)M@nfZ4RpwHqVtGxh2gD=N_{iKr^yFERMq)3` z{1~Gqvimf8(?00X{g1aJk&BDL*c6nKfV+fI2V4mDq{RiyJCX2F*@u1v-zR@*VfzOj zMC0f{Q)n!rpn65=ey8a*h7?MKWpuV6%XU3s_MxW70-EY1J` diff --git a/third_party/python/PC/external/v140/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib b/third_party/python/PC/external/v140/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib deleted file mode 100644 index 40f70b2682d35b5699c1b9eea57e6c76f67a1bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2392 zcmd5-%}(1u5dQ3dpf0MSv=-if#8 z>+jr?PPJL`J9XF7OAWu%($~D>J$Jv;uKKQbtmjF6Y`}5yJGT9MD13?>D~MEnvyq4`a5fsg*m_`RYne86k6O;q>BwkhB#aepg5bJTfiuD^F$J7Y3-~Yr1uFHizh(7L z0UdGZTfjSY4Y*M(%NUY<6)o~@>-A<6DM{Ec(5M|vb1__5(QGA#=ig@EI|{LxZjD6I z>x~bc{kc+L0*5sCER9fGh`-X^deyJarRCHk8vLMkpJK7Zs99LJ2-lgyNgWU7X^mXR zehbM9A`Dh=k4AI%{yw*`A>Hh zhy8E43x%Ttwa{Xv;tTcvf63CKGCG~@)gD_>1*5-<1M{)}%;>t9>UDjLUXosB^jB$w zni+k^OdW?+k15@u&q`E$m&|^AgNi|HCPE2`S}`)gXTeX#6{BDJDuyBb{KNc|MyT)T n9>&3bgHpVWmn33c&t`is3BcvXR=BnoD4j{n41aTPR@<~+QEn>j diff --git a/third_party/python/PC/external/v141/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib b/third_party/python/PC/external/v141/amd64/Microsoft.VisualStudio.Setup.Configuration.Native.lib deleted file mode 100644 index 675a501d8cb5a76e24c571cfca42cc8b3b3fe73f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2384 zcmc&$K~EY%6#f7eOPhwYUV3Ok6O-1FG0j?SEEUlJHtEHMvZx!;CAjq38>e3V z3;qIsfaxD-5B`8A{SiId_jYGiwnb$P#z|)0yf=?GGv9pgEiV=u-R9n#L^>608MUA; zXbTxF8??_0HJj7KteyZc2}I9HoB;7DVEUB1VHDRlH!3w_`_MuWH@udaBC~uWY|A)fY(6PKowf9@) zHDhI|wuIG|zv|&^W1=I86{x=TYE<(3*+^r_(NQm_P(k8e>n7zBl%Xb%!bpL&B~=2n*5>ukYaI*QP(klCj2zlNCQvi$Vd9IT}SGS zsDed2U={gWLGcn#lSDN9bYlRINgi)M@nfZ4RpwHqVtGxh2gD=N_{iKr^yFERMq)3` z{1~Gqvimf8(?00X{g1aJk&BDL*c6nKfV+fI2V4mDq{RiyJCX2F*@u1v-zR@*VfzOj zMC0f{Q)n!rpn65=ey8a*h7?MKWpuV6%XU3s_MxW70-EY1J` diff --git a/third_party/python/PC/external/v141/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib b/third_party/python/PC/external/v141/win32/Microsoft.VisualStudio.Setup.Configuration.Native.lib deleted file mode 100644 index 40f70b2682d35b5699c1b9eea57e6c76f67a1bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2392 zcmd5-%}(1u5dQ3dpf0MSv=-if#8 z>+jr?PPJL`J9XF7OAWu%($~D>J$Jv;uKKQbtmjF6Y`}5yJGT9MD13?>D~MEnvyq4`a5fsg*m_`RYne86k6O;q>BwkhB#aepg5bJTfiuD^F$J7Y3-~Yr1uFHizh(7L z0UdGZTfjSY4Y*M(%NUY<6)o~@>-A<6DM{Ec(5M|vb1__5(QGA#=ig@EI|{LxZjD6I z>x~bc{kc+L0*5sCER9fGh`-X^deyJarRCHk8vLMkpJK7Zs99LJ2-lgyNgWU7X^mXR zehbM9A`Dh=k4AI%{yw*`A>Hh zhy8E43x%Ttwa{Xv;tTcvf63CKGCG~@)gD_>1*5-<1M{)}%;>t9>UDjLUXosB^jB$w zni+k^OdW?+k15@u&q`E$m&|^AgNi|HCPE2`S}`)gXTeX#6{BDJDuyBb{KNc|MyT)T n9>&3bgHpVWmn33c&t`is3BcvXR=BnoD4j{n41aTPR@<~+QEn>j diff --git a/third_party/python/PC/frozen_dllmain.c b/third_party/python/PC/frozen_dllmain.c index 0156c5008..b70042c67 100644 --- a/third_party/python/PC/frozen_dllmain.c +++ b/third_party/python/PC/frozen_dllmain.c @@ -44,7 +44,6 @@ changed, here is a snippet from the pythoncom extension module. // end of example code from pythoncom's DllMain.cpp ***************************************************************************/ -#include "windows.h" static char *possibleModules[] = { "pywintypes", @@ -55,80 +54,70 @@ static char *possibleModules[] = { BOOL CallModuleDllMain(char *modName, DWORD dwReason); - /* Called by a frozen .EXE only, so that built-in extension modules are initialized correctly */ -void PyWinFreeze_ExeInit(void) -{ - char **modName; - for (modName = possibleModules;*modName;*modName++) { -/* printf("Initialising '%s'\n", *modName); */ - CallModuleDllMain(*modName, DLL_PROCESS_ATTACH); - } +void PyWinFreeze_ExeInit(void) { + char **modName; + for (modName = possibleModules; *modName; *modName++) { + /* printf("Initialising '%s'\n", *modName); */ + CallModuleDllMain(*modName, DLL_PROCESS_ATTACH); + } } /* Called by a frozen .EXE only, so that built-in extension modules are cleaned up */ -void PyWinFreeze_ExeTerm(void) -{ - // Must go backwards - char **modName; - for (modName = possibleModules+Py_ARRAY_LENGTH(possibleModules)-2; - modName >= possibleModules; - *modName--) { -/* printf("Terminating '%s'\n", *modName);*/ +void PyWinFreeze_ExeTerm(void) { + // Must go backwards + char **modName; + for (modName = possibleModules + Py_ARRAY_LENGTH(possibleModules) - 2; + modName >= possibleModules; *modName--) { + /* printf("Terminating '%s'\n", *modName);*/ + CallModuleDllMain(*modName, DLL_PROCESS_DETACH); + } +} + +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { + BOOL ret = TRUE; + switch (dwReason) { + case DLL_PROCESS_ATTACH: { + char **modName; + for (modName = possibleModules; *modName; *modName++) { + BOOL ok = CallModuleDllMain(*modName, dwReason); + if (!ok) ret = FALSE; + } + break; + } + case DLL_PROCESS_DETACH: { + // Must go backwards + char **modName; + for (modName = possibleModules + Py_ARRAY_LENGTH(possibleModules) - 2; + modName >= possibleModules; *modName--) CallModuleDllMain(*modName, DLL_PROCESS_DETACH); + break; } + } + return ret; } -BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) -{ - BOOL ret = TRUE; - switch (dwReason) { - case DLL_PROCESS_ATTACH: - { - char **modName; - for (modName = possibleModules;*modName;*modName++) { - BOOL ok = CallModuleDllMain(*modName, dwReason); - if (!ok) - ret = FALSE; - } - break; - } - case DLL_PROCESS_DETACH: - { - // Must go backwards - char **modName; - for (modName = possibleModules+Py_ARRAY_LENGTH(possibleModules)-2; - modName >= possibleModules; - *modName--) - CallModuleDllMain(*modName, DLL_PROCESS_DETACH); - break; - } - } - return ret; +BOOL CallModuleDllMain(char *modName, DWORD dwReason) { + BOOL(WINAPI * pfndllmain)(HINSTANCE, DWORD, LPVOID); + + char funcName[255]; + HMODULE hmod = GetModuleHandleW(NULL); + strcpy(funcName, "_DllMain"); + strcat(funcName, modName); + strcat(funcName, "@12"); // stdcall convention. + pfndllmain = + (BOOL(WINAPI *)(HINSTANCE, DWORD, LPVOID))GetProcAddress(hmod, funcName); + if (pfndllmain == NULL) { + /* No function by that name exported - then that module does + not appear in our frozen program - return OK + */ + return TRUE; + } + return (*pfndllmain)(hmod, dwReason, NULL); } - -BOOL CallModuleDllMain(char *modName, DWORD dwReason) -{ - BOOL (WINAPI * pfndllmain)(HINSTANCE, DWORD, LPVOID); - - char funcName[255]; - HMODULE hmod = GetModuleHandleW(NULL); - strcpy(funcName, "_DllMain"); - strcat(funcName, modName); - strcat(funcName, "@12"); // stdcall convention. - pfndllmain = (BOOL (WINAPI *)(HINSTANCE, DWORD, LPVOID))GetProcAddress(hmod, funcName); - if (pfndllmain==NULL) { - /* No function by that name exported - then that module does - not appear in our frozen program - return OK - */ - return TRUE; - } - return (*pfndllmain)(hmod, dwReason, NULL); -} - diff --git a/third_party/python/PC/generrmap.c b/third_party/python/PC/generrmap.c deleted file mode 100644 index 953344c0d..000000000 --- a/third_party/python/PC/generrmap.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include -#include - -/* Extract the mapping of Win32 error codes to errno */ - -int main() -{ - int i; - _setmode(fileno(stdout), O_BINARY); - printf("/* Generated file. Do not edit. */\n"); - printf("int winerror_to_errno(int winerror)\n"); - printf("{\n switch(winerror) {\n"); - for(i=1; i < 65000; i++) { - _dosmaperr(i); - if (errno == EINVAL) { - /* Issue #12802 */ - if (i == ERROR_DIRECTORY) - errno = ENOTDIR; - /* Issue #13063 */ - else if (i == ERROR_NO_DATA) - errno = EPIPE; - else - continue; - } - printf(" case %d: return %d;\n", i, errno); - } - printf(" default: return EINVAL;\n"); - printf(" }\n}\n"); -} diff --git a/third_party/python/PC/getpathp.c b/third_party/python/PC/getpathp.c index f6f362c7f..5ee54a7d7 100644 --- a/third_party/python/PC/getpathp.c +++ b/third_party/python/PC/getpathp.c @@ -1,3 +1,4 @@ +#include "windows.h" /* Return the initial module search path. */ /* Used by DOS, Windows 3.1, Windows 95/98, Windows NT. */ @@ -78,17 +79,17 @@ ---------------------------------------------------------------- */ +#include #include "Python.h" #include "osdefs.h" -#include #ifndef MS_WINDOWS #error getpathp.c should only be built on Windows #endif -#include #include +#include #ifdef HAVE_SYS_TYPES_H #include @@ -116,106 +117,94 @@ #define LANDMARK L"lib\\os.py" #endif -static wchar_t prefix[MAXPATHLEN+1]; -static wchar_t progpath[MAXPATHLEN+1]; +static wchar_t prefix[MAXPATHLEN + 1]; +static wchar_t progpath[MAXPATHLEN + 1]; static wchar_t *module_search_path = NULL; - -static int -is_sep(wchar_t ch) /* determine if "ch" is a separator character */ +static int is_sep(wchar_t ch) /* determine if "ch" is a separator character */ { #ifdef ALTSEP - return ch == SEP || ch == ALTSEP; + return ch == SEP || ch == ALTSEP; #else - return ch == SEP; + return ch == SEP; #endif } /* assumes 'dir' null terminated in bounds. Never writes beyond existing terminator. */ -static void -reduce(wchar_t *dir) -{ - size_t i = wcsnlen_s(dir, MAXPATHLEN+1); - if (i >= MAXPATHLEN+1) - Py_FatalError("buffer overflow in getpathp.c's reduce()"); +static void reduce(wchar_t *dir) { + size_t i = wcsnlen_s(dir, MAXPATHLEN + 1); + if (i >= MAXPATHLEN + 1) + Py_FatalError("buffer overflow in getpathp.c's reduce()"); - while (i > 0 && !is_sep(dir[i])) - --i; - dir[i] = '\0'; + while (i > 0 && !is_sep(dir[i])) --i; + dir[i] = '\0'; } -static int -change_ext(wchar_t *dest, const wchar_t *src, const wchar_t *ext) -{ - if (src && src != dest) { - size_t src_len = wcsnlen_s(src, MAXPATHLEN+1); - size_t i = src_len; - if (i >= MAXPATHLEN+1) { - Py_FatalError("buffer overflow in getpathp.c's reduce()"); - } - - while (i > 0 && src[i] != '.' && !is_sep(src[i])) - --i; - - if (i == 0) { - dest[0] = '\0'; - return -1; - } - - if (is_sep(src[i])) { - i = src_len; - } - - if (wcsncpy_s(dest, MAXPATHLEN+1, src, i)) { - dest[0] = '\0'; - return -1; - } - } else { - wchar_t *s = wcsrchr(dest, L'.'); - if (s) { - s[0] = '\0'; - } +static int change_ext(wchar_t *dest, const wchar_t *src, const wchar_t *ext) { + if (src && src != dest) { + size_t src_len = wcsnlen_s(src, MAXPATHLEN + 1); + size_t i = src_len; + if (i >= MAXPATHLEN + 1) { + Py_FatalError("buffer overflow in getpathp.c's reduce()"); } - if (wcscat_s(dest, MAXPATHLEN+1, ext)) { - dest[0] = '\0'; - return -1; + while (i > 0 && src[i] != '.' && !is_sep(src[i])) --i; + + if (i == 0) { + dest[0] = '\0'; + return -1; } - return 0; + if (is_sep(src[i])) { + i = src_len; + } + + if (wcsncpy_s(dest, MAXPATHLEN + 1, src, i)) { + dest[0] = '\0'; + return -1; + } + } else { + wchar_t *s = wcsrchr(dest, L'.'); + if (s) { + s[0] = '\0'; + } + } + + if (wcscat_s(dest, MAXPATHLEN + 1, ext)) { + dest[0] = '\0'; + return -1; + } + + return 0; } -static int -exists(wchar_t *filename) -{ - return GetFileAttributesW(filename) != 0xFFFFFFFF; +static int exists(wchar_t *filename) { + return GetFileAttributesW(filename) != 0xFFFFFFFF; } /* Assumes 'filename' MAXPATHLEN+1 bytes long - may extend 'filename' by one character. */ -static int -ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc too */ +static int ismodule(wchar_t *filename, + int update_filename) /* Is module -- check for .pyc too */ { - size_t n; + size_t n; - if (exists(filename)) - return 1; + if (exists(filename)) return 1; - /* Check for the compiled version of prefix. */ - n = wcsnlen_s(filename, MAXPATHLEN+1); - if (n < MAXPATHLEN) { - int exist = 0; - filename[n] = L'c'; - filename[n + 1] = L'\0'; - exist = exists(filename); - if (!update_filename) - filename[n] = L'\0'; - return exist; - } - return 0; + /* Check for the compiled version of prefix. */ + n = wcsnlen_s(filename, MAXPATHLEN + 1); + if (n < MAXPATHLEN) { + int exist = 0; + filename[n] = L'c'; + filename[n + 1] = L'\0'; + exist = exists(filename); + if (!update_filename) filename[n] = L'\0'; + return exist; + } + return 0; } /* Add a path component, by appending stuff to buffer. @@ -229,113 +218,106 @@ ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc */ static int _PathCchCombineEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCombineEx)(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags); +typedef HRESULT(__stdcall *PPathCchCombineEx)(PWSTR pszPathOut, + size_t cchPathOut, + PCWSTR pszPathIn, PCWSTR pszMore, + unsigned long dwFlags); static PPathCchCombineEx _PathCchCombineEx; -static void -join(wchar_t *buffer, const wchar_t *stuff) -{ - if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) - _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); - else - _PathCchCombineEx = NULL; - _PathCchCombineEx_Initialized = 1; - } +static void join(wchar_t *buffer, const wchar_t *stuff) { + if (_PathCchCombineEx_Initialized == 0) { + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (pathapi) + _PathCchCombineEx = + (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); + else + _PathCchCombineEx = NULL; + _PathCchCombineEx_Initialized = 1; + } - if (_PathCchCombineEx) { - if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) - Py_FatalError("buffer overflow in getpathp.c's join()"); - } else { - if (!PathCombineW(buffer, buffer, stuff)) - Py_FatalError("buffer overflow in getpathp.c's join()"); - } + if (_PathCchCombineEx) { + if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN + 1, buffer, stuff, 0))) + Py_FatalError("buffer overflow in getpathp.c's join()"); + } else { + if (!PathCombineW(buffer, buffer, stuff)) + Py_FatalError("buffer overflow in getpathp.c's join()"); + } } static int _PathCchCanonicalizeEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, unsigned long dwFlags); +typedef HRESULT(__stdcall *PPathCchCanonicalizeEx)(PWSTR pszPathOut, + size_t cchPathOut, + PCWSTR pszPathIn, + unsigned long dwFlags); static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; -static void canonicalize(wchar_t *buffer, const wchar_t *path) -{ - if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) { - _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); - } - else { - _PathCchCanonicalizeEx = NULL; - } - _PathCchCanonicalizeEx_Initialized = 1; +static void canonicalize(wchar_t *buffer, const wchar_t *path) { + if (_PathCchCanonicalizeEx_Initialized == 0) { + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (pathapi) { + _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress( + pathapi, "PathCchCanonicalizeEx"); + } else { + _PathCchCanonicalizeEx = NULL; } + _PathCchCanonicalizeEx_Initialized = 1; + } - if (_PathCchCanonicalizeEx) { - if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - Py_FatalError("buffer overflow in getpathp.c's canonicalize()"); - } + if (_PathCchCanonicalizeEx) { + if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + Py_FatalError("buffer overflow in getpathp.c's canonicalize()"); } - else { - if (!PathCanonicalizeW(buffer, path)) { - Py_FatalError("buffer overflow in getpathp.c's canonicalize()"); - } + } else { + if (!PathCanonicalizeW(buffer, path)) { + Py_FatalError("buffer overflow in getpathp.c's canonicalize()"); } + } } /* gotlandmark only called by search_for_prefix, which ensures 'prefix' is null terminated in bounds. join() ensures 'landmark' can not overflow prefix if too long. */ -static int -gotlandmark(const wchar_t *landmark) -{ - int ok; - Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN); +static int gotlandmark(const wchar_t *landmark) { + int ok; + Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN); - join(prefix, landmark); - ok = ismodule(prefix, FALSE); - prefix[n] = '\0'; - return ok; + join(prefix, landmark); + ok = ismodule(prefix, FALSE); + prefix[n] = '\0'; + return ok; } /* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd. assumption provided by only caller, calculate_path() */ -static int -search_for_prefix(wchar_t *argv0_path, const wchar_t *landmark) -{ - /* Search from argv0_path, until landmark is found */ - wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path); - do { - if (gotlandmark(landmark)) - return 1; - reduce(prefix); - } while (prefix[0]); - return 0; +static int search_for_prefix(wchar_t *argv0_path, const wchar_t *landmark) { + /* Search from argv0_path, until landmark is found */ + wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path); + do { + if (gotlandmark(landmark)) return 1; + reduce(prefix); + } while (prefix[0]); + return 0; } - -static int -get_dllpath(wchar_t *dllpath) -{ +static int get_dllpath(wchar_t *dllpath) { #ifdef Py_ENABLE_SHARED - extern HANDLE PyWin_DLLhModule; - if (PyWin_DLLhModule && GetModuleFileNameW(PyWin_DLLhModule, dllpath, MAXPATHLEN)) { - return 0; - } + extern HANDLE PyWin_DLLhModule; + if (PyWin_DLLhModule && + GetModuleFileNameW(PyWin_DLLhModule, dllpath, MAXPATHLEN)) { + return 0; + } #endif - return -1; + return -1; } - #ifdef Py_ENABLE_SHARED /* a string loaded from the DLL at startup.*/ extern const char *PyWin_DLLVersionString; - /* Load a PYTHONPATH value from the registry. Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. @@ -349,156 +331,142 @@ extern const char *PyWin_DLLVersionString; in advance. It could be simplied now Win16/Win32s is dead! */ -static wchar_t * -getpythonregpath(HKEY keyBase, int skipcore) -{ - HKEY newKey = 0; - DWORD dataSize = 0; - DWORD numKeys = 0; - LONG rc; - wchar_t *retval = NULL; - WCHAR *dataBuf = NULL; - static const WCHAR keyPrefix[] = L"Software\\Python\\PythonCore\\"; - static const WCHAR keySuffix[] = L"\\PythonPath"; - size_t versionLen, keyBufLen; - DWORD index; - WCHAR *keyBuf = NULL; - WCHAR *keyBufPtr; - WCHAR **ppPaths = NULL; +static wchar_t *getpythonregpath(HKEY keyBase, int skipcore) { + HKEY newKey = 0; + DWORD dataSize = 0; + DWORD numKeys = 0; + LONG rc; + wchar_t *retval = NULL; + WCHAR *dataBuf = NULL; + static const WCHAR keyPrefix[] = L"Software\\Python\\PythonCore\\"; + static const WCHAR keySuffix[] = L"\\PythonPath"; + size_t versionLen, keyBufLen; + DWORD index; + WCHAR *keyBuf = NULL; + WCHAR *keyBufPtr; + WCHAR **ppPaths = NULL; - /* Tried to use sysget("winver") but here is too early :-( */ - versionLen = strlen(PyWin_DLLVersionString); - /* Space for all the chars, plus one \0 */ - keyBufLen = sizeof(keyPrefix) + - sizeof(WCHAR)*(versionLen-1) + - sizeof(keySuffix); - keyBuf = keyBufPtr = PyMem_RawMalloc(keyBufLen); - if (keyBuf==NULL) goto done; + /* Tried to use sysget("winver") but here is too early :-( */ + versionLen = strlen(PyWin_DLLVersionString); + /* Space for all the chars, plus one \0 */ + keyBufLen = + sizeof(keyPrefix) + sizeof(WCHAR) * (versionLen - 1) + sizeof(keySuffix); + keyBuf = keyBufPtr = PyMem_RawMalloc(keyBufLen); + if (keyBuf == NULL) goto done; - memcpy_s(keyBufPtr, keyBufLen, keyPrefix, sizeof(keyPrefix)-sizeof(WCHAR)); - keyBufPtr += Py_ARRAY_LENGTH(keyPrefix) - 1; - mbstowcs(keyBufPtr, PyWin_DLLVersionString, versionLen); - keyBufPtr += versionLen; - /* NULL comes with this one! */ - memcpy(keyBufPtr, keySuffix, sizeof(keySuffix)); - /* Open the root Python key */ - rc=RegOpenKeyExW(keyBase, - keyBuf, /* subkey */ - 0, /* reserved */ - KEY_READ, - &newKey); - if (rc!=ERROR_SUCCESS) goto done; - /* Find out how big our core buffer is, and how many subkeys we have */ - rc = RegQueryInfoKey(newKey, NULL, NULL, NULL, &numKeys, NULL, NULL, - NULL, NULL, &dataSize, NULL, NULL); - if (rc!=ERROR_SUCCESS) goto done; - if (skipcore) dataSize = 0; /* Only count core ones if we want them! */ - /* Allocate a temp array of char buffers, so we only need to loop - reading the registry once - */ - ppPaths = PyMem_RawMalloc( sizeof(WCHAR *) * numKeys ); - if (ppPaths==NULL) goto done; - memset(ppPaths, 0, sizeof(WCHAR *) * numKeys); - /* Loop over all subkeys, allocating a temp sub-buffer. */ - for(index=0;index 0) { - *(szCur++) = L';'; - dataSize--; - } - if (ppPaths[index]) { - Py_ssize_t len = wcslen(ppPaths[index]); - wcsncpy(szCur, ppPaths[index], len); - szCur += len; - assert(dataSize > (DWORD)len); - dataSize -= (DWORD)len; - } - } - if (skipcore) - *szCur = '\0'; - else { - /* If we have no values, we dont need a ';' */ - if (numKeys) { - *(szCur++) = L';'; - dataSize--; - } - /* Now append the core path entries - - this will include the NULL - */ - rc = RegQueryValueExW(newKey, NULL, 0, NULL, - (LPBYTE)szCur, &dataSize); - if (rc != ERROR_SUCCESS) { - PyMem_RawFree(dataBuf); - goto done; - } - } - /* And set the result - caller must free */ - retval = dataBuf; + /* original datasize from RegQueryInfo doesn't include the \0 */ + dataBuf = PyMem_RawMalloc((dataSize + 1) * sizeof(WCHAR)); + if (dataBuf) { + WCHAR *szCur = dataBuf; + /* Copy our collected strings */ + for (index = 0; index < numKeys; index++) { + if (index > 0) { + *(szCur++) = L';'; + dataSize--; + } + if (ppPaths[index]) { + Py_ssize_t len = wcslen(ppPaths[index]); + wcsncpy(szCur, ppPaths[index], len); + szCur += len; + assert(dataSize > (DWORD)len); + dataSize -= (DWORD)len; + } } + if (skipcore) + *szCur = '\0'; + else { + /* If we have no values, we dont need a ';' */ + if (numKeys) { + *(szCur++) = L';'; + dataSize--; + } + /* Now append the core path entries - + this will include the NULL + */ + rc = RegQueryValueExW(newKey, NULL, 0, NULL, (LPBYTE)szCur, &dataSize); + if (rc != ERROR_SUCCESS) { + PyMem_RawFree(dataBuf); + goto done; + } + } + /* And set the result - caller must free */ + retval = dataBuf; + } done: - /* Loop freeing my temp buffers */ - if (ppPaths) { - for(index=0; index= 0) { - wchar_t * context = NULL; - wchar_t * tok = wcstok_s(tmpbuffer, L" \t\r\n", &context); - if ((tok != NULL) && !wcscmp(tok, key)) { - tok = wcstok_s(NULL, L" \t", &context); - if ((tok != NULL) && !wcscmp(tok, L"=")) { - tok = wcstok_s(NULL, L"\r\n", &context); - if (tok != NULL) { - wcsncpy(value, tok, MAXPATHLEN); - result = 1; - break; - } - } - } - } - } + if (p == NULL) break; + n = strlen(p); + if (p[n - 1] != '\n') { + /* line has overflowed - bail */ + break; } - return result; + if (p[0] == '#') /* Comment - skip */ + continue; + decoded = PyUnicode_DecodeUTF8(buffer, n, "surrogateescape"); + if (decoded != NULL) { + Py_ssize_t k; + k = PyUnicode_AsWideChar(decoded, tmpbuffer, MAXPATHLEN * 2); + Py_DECREF(decoded); + if (k >= 0) { + wchar_t *context = NULL; + wchar_t *tok = wcstok_s(tmpbuffer, L" \t\r\n", &context); + if ((tok != NULL) && !wcscmp(tok, key)) { + tok = wcstok_s(NULL, L" \t", &context); + if ((tok != NULL) && !wcscmp(tok, L"=")) { + tok = wcstok_s(NULL, L"\r\n", &context); + if (tok != NULL) { + wcsncpy(value, tok, MAXPATHLEN); + result = 1; + break; + } + } + } + } + } + } + return result; } -static int -read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, int *nosite) -{ - FILE *sp_file = _Py_wfopen(path, L"r"); - if (sp_file == NULL) - return -1; +static int read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, + int *nosite) { + FILE *sp_file = _Py_wfopen(path, L"r"); + if (sp_file == NULL) return -1; - wcscpy_s(prefix, MAXPATHLEN+1, path); - reduce(prefix); - *isolated = 1; - *nosite = 1; + wcscpy_s(prefix, MAXPATHLEN + 1, path); + reduce(prefix); + *isolated = 1; + *nosite = 1; - size_t bufsiz = MAXPATHLEN; - size_t prefixlen = wcslen(prefix); + size_t bufsiz = MAXPATHLEN; + size_t prefixlen = wcslen(prefix); - wchar_t *buf = (wchar_t*)PyMem_RawMalloc(bufsiz * sizeof(wchar_t)); - if (buf == NULL) { - goto error; + wchar_t *buf = (wchar_t *)PyMem_RawMalloc(bufsiz * sizeof(wchar_t)); + if (buf == NULL) { + goto error; + } + buf[0] = '\0'; + + while (!feof(sp_file)) { + char line[MAXPATHLEN + 1]; + char *p = fgets(line, MAXPATHLEN + 1, sp_file); + if (!p) break; + if (*p == '\0' || *p == '\r' || *p == '\n' || *p == '#') continue; + while (*++p) { + if (*p == '\r' || *p == '\n') { + *p = '\0'; + break; + } } - buf[0] = '\0'; - while (!feof(sp_file)) { - char line[MAXPATHLEN + 1]; - char *p = fgets(line, MAXPATHLEN + 1, sp_file); - if (!p) - break; - if (*p == '\0' || *p == '\r' || *p == '\n' || *p == '#') - continue; - while (*++p) { - if (*p == '\r' || *p == '\n') { - *p = '\0'; - break; - } - } + if (strcmp(line, "import site") == 0) { + *nosite = 0; + continue; + } else if (strncmp(line, "import ", 7) == 0) { + Py_FatalError("only 'import site' is supported in ._pth file"); + } - if (strcmp(line, "import site") == 0) { - *nosite = 0; - continue; - } else if (strncmp(line, "import ", 7) == 0) { - Py_FatalError("only 'import site' is supported in ._pth file"); - } - - DWORD wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, NULL, 0); - wchar_t *wline = (wchar_t*)PyMem_RawMalloc((wn + 1) * sizeof(wchar_t)); - if (wline == NULL) { - goto error; - } - wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, wline, wn + 1); - wline[wn] = '\0'; - - size_t usedsiz = wcslen(buf); - while (usedsiz + wn + prefixlen + 4 > bufsiz) { - bufsiz += MAXPATHLEN; - wchar_t *tmp = (wchar_t*)PyMem_RawRealloc(buf, (bufsiz + 1) * - sizeof(wchar_t)); - if (tmp == NULL) { - PyMem_RawFree(wline); - goto error; - } - buf = tmp; - } - - if (usedsiz) { - wcscat_s(buf, bufsiz, L";"); - usedsiz += 1; - } - - errno_t result; - _Py_BEGIN_SUPPRESS_IPH - result = wcscat_s(buf, bufsiz, prefix); - _Py_END_SUPPRESS_IPH - if (result == EINVAL) { - Py_FatalError("invalid argument during ._pth processing"); - } else if (result == ERANGE) { - Py_FatalError("buffer overflow during ._pth processing"); - } - wchar_t *b = &buf[usedsiz]; - join(b, wline); + DWORD wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, NULL, 0); + wchar_t *wline = (wchar_t *)PyMem_RawMalloc((wn + 1) * sizeof(wchar_t)); + if (wline == NULL) { + goto error; + } + wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, wline, wn + 1); + wline[wn] = '\0'; + size_t usedsiz = wcslen(buf); + while (usedsiz + wn + prefixlen + 4 > bufsiz) { + bufsiz += MAXPATHLEN; + wchar_t *tmp = + (wchar_t *)PyMem_RawRealloc(buf, (bufsiz + 1) * sizeof(wchar_t)); + if (tmp == NULL) { PyMem_RawFree(wline); + goto error; + } + buf = tmp; } - module_search_path = buf; + if (usedsiz) { + wcscat_s(buf, bufsiz, L";"); + usedsiz += 1; + } - fclose(sp_file); - return 0; + errno_t result; + _Py_BEGIN_SUPPRESS_IPH result = wcscat_s(buf, bufsiz, prefix); + _Py_END_SUPPRESS_IPH if (result == EINVAL) { + Py_FatalError("invalid argument during ._pth processing"); + } + else if (result == ERANGE) { + Py_FatalError("buffer overflow during ._pth processing"); + } + wchar_t *b = &buf[usedsiz]; + join(b, wline); + + PyMem_RawFree(wline); + } + + module_search_path = buf; + + fclose(sp_file); + return 0; error: - PyMem_RawFree(buf); - fclose(sp_file); - return -1; + PyMem_RawFree(buf); + fclose(sp_file); + return -1; } +static void calculate_path(void) { + wchar_t argv0_path[MAXPATHLEN + 1]; + wchar_t *buf; + size_t bufsz; + wchar_t *pythonhome = Py_GetPythonHome(); + wchar_t *envpath = NULL; -static void -calculate_path(void) -{ - wchar_t argv0_path[MAXPATHLEN+1]; - wchar_t *buf; - size_t bufsz; - wchar_t *pythonhome = Py_GetPythonHome(); - wchar_t *envpath = NULL; + int skiphome, skipdefault; + wchar_t *machinepath = NULL; + wchar_t *userpath = NULL; + wchar_t zip_path[MAXPATHLEN + 1]; - int skiphome, skipdefault; - wchar_t *machinepath = NULL; - wchar_t *userpath = NULL; - wchar_t zip_path[MAXPATHLEN+1]; + if (!Py_IgnoreEnvironmentFlag) { + envpath = _wgetenv(L"PYTHONPATH"); + } - if (!Py_IgnoreEnvironmentFlag) { - envpath = _wgetenv(L"PYTHONPATH"); - } + get_progpath(); + /* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */ + wcscpy_s(argv0_path, MAXPATHLEN + 1, progpath); + reduce(argv0_path); - get_progpath(); - /* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */ - wcscpy_s(argv0_path, MAXPATHLEN+1, progpath); - reduce(argv0_path); + /* Search for a sys.path file */ + { + wchar_t spbuffer[MAXPATHLEN + 1]; - /* Search for a sys.path file */ - { - wchar_t spbuffer[MAXPATHLEN+1]; + if ((!get_dllpath(spbuffer) && !change_ext(spbuffer, spbuffer, L"._pth") && + exists(spbuffer)) || + (progpath[0] && !change_ext(spbuffer, progpath, L"._pth") && + exists(spbuffer))) { - if ((!get_dllpath(spbuffer) && !change_ext(spbuffer, spbuffer, L"._pth") && exists(spbuffer)) || - (progpath[0] && !change_ext(spbuffer, progpath, L"._pth") && exists(spbuffer))) { - - if (!read_pth_file(spbuffer, prefix, &Py_IsolatedFlag, &Py_NoSiteFlag)) { - return; - } - } - } - - /* Search for an environment configuration file, first in the - executable's directory and then in the parent directory. - If found, open it for use when searching for prefixes. - */ - - { - wchar_t envbuffer[MAXPATHLEN+1]; - wchar_t tmpbuffer[MAXPATHLEN+1]; - const wchar_t *env_cfg = L"pyvenv.cfg"; - FILE * env_file = NULL; - - wcscpy_s(envbuffer, MAXPATHLEN+1, argv0_path); - join(envbuffer, env_cfg); - env_file = _Py_wfopen(envbuffer, L"r"); - if (env_file == NULL) { - errno = 0; - reduce(envbuffer); - reduce(envbuffer); - join(envbuffer, env_cfg); - env_file = _Py_wfopen(envbuffer, L"r"); - if (env_file == NULL) { - errno = 0; - } - } - if (env_file != NULL) { - /* Look for a 'home' variable and set argv0_path to it, if found */ - if (find_env_config_value(env_file, L"home", tmpbuffer)) { - wcscpy_s(argv0_path, MAXPATHLEN+1, tmpbuffer); - } - fclose(env_file); - env_file = NULL; - } - } - - /* Calculate zip archive path from DLL or exe path */ - if (!get_dllpath(zip_path)) { - change_ext(zip_path, zip_path, L".zip"); - } else { - change_ext(zip_path, progpath, L".zip"); - } - - if (pythonhome == NULL || *pythonhome == '\0') { - if (zip_path[0] && exists(zip_path)) { - wcscpy_s(prefix, MAXPATHLEN+1, zip_path); - reduce(prefix); - pythonhome = prefix; - } else if (search_for_prefix(argv0_path, LANDMARK)) - pythonhome = prefix; - else - pythonhome = NULL; - } - else - wcscpy_s(prefix, MAXPATHLEN+1, pythonhome); - - if (envpath && *envpath == '\0') - envpath = NULL; - - - skiphome = pythonhome==NULL ? 0 : 1; -#ifdef Py_ENABLE_SHARED - machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome); - userpath = getpythonregpath(HKEY_CURRENT_USER, skiphome); -#endif - /* We only use the default relative PYTHONPATH if we havent - anything better to use! */ - skipdefault = envpath!=NULL || pythonhome!=NULL || \ - machinepath!=NULL || userpath!=NULL; - - /* We need to construct a path from the following parts. - (1) the PYTHONPATH environment variable, if set; - (2) for Win32, the zip archive file path; - (3) for Win32, the machinepath and userpath, if set; - (4) the PYTHONPATH config macro, with the leading "." - of each component replaced with pythonhome, if set; - (5) the directory containing the executable (argv0_path). - The length calculation calculates #4 first. - Extra rules: - - If PYTHONHOME is set (in any way) item (3) is ignored. - - If registry values are used, (4) and (5) are ignored. - */ - - /* Calculate size of return buffer */ - if (pythonhome != NULL) { - wchar_t *p; - bufsz = 1; - for (p = PYTHONPATH; *p; p++) { - if (*p == DELIM) - bufsz++; /* number of DELIM plus one */ - } - bufsz *= wcslen(pythonhome); - } - else - bufsz = 0; - bufsz += wcslen(PYTHONPATH) + 1; - bufsz += wcslen(argv0_path) + 1; - if (userpath) - bufsz += wcslen(userpath) + 1; - if (machinepath) - bufsz += wcslen(machinepath) + 1; - bufsz += wcslen(zip_path) + 1; - if (envpath != NULL) - bufsz += wcslen(envpath) + 1; - - module_search_path = buf = PyMem_RawMalloc(bufsz*sizeof(wchar_t)); - if (buf == NULL) { - /* We can't exit, so print a warning and limp along */ - fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n"); - if (envpath) { - fprintf(stderr, "Using environment $PYTHONPATH.\n"); - module_search_path = envpath; - } - else { - fprintf(stderr, "Using default static path.\n"); - module_search_path = PYTHONPATH; - } - PyMem_RawFree(machinepath); - PyMem_RawFree(userpath); + if (!read_pth_file(spbuffer, prefix, &Py_IsolatedFlag, &Py_NoSiteFlag)) { return; + } } + } + /* Search for an environment configuration file, first in the + executable's directory and then in the parent directory. + If found, open it for use when searching for prefixes. + */ + + { + wchar_t envbuffer[MAXPATHLEN + 1]; + wchar_t tmpbuffer[MAXPATHLEN + 1]; + const wchar_t *env_cfg = L"pyvenv.cfg"; + FILE *env_file = NULL; + + wcscpy_s(envbuffer, MAXPATHLEN + 1, argv0_path); + join(envbuffer, env_cfg); + env_file = _Py_wfopen(envbuffer, L"r"); + if (env_file == NULL) { + errno = 0; + reduce(envbuffer); + reduce(envbuffer); + join(envbuffer, env_cfg); + env_file = _Py_wfopen(envbuffer, L"r"); + if (env_file == NULL) { + errno = 0; + } + } + if (env_file != NULL) { + /* Look for a 'home' variable and set argv0_path to it, if found */ + if (find_env_config_value(env_file, L"home", tmpbuffer)) { + wcscpy_s(argv0_path, MAXPATHLEN + 1, tmpbuffer); + } + fclose(env_file); + env_file = NULL; + } + } + + /* Calculate zip archive path from DLL or exe path */ + if (!get_dllpath(zip_path)) { + change_ext(zip_path, zip_path, L".zip"); + } else { + change_ext(zip_path, progpath, L".zip"); + } + + if (pythonhome == NULL || *pythonhome == '\0') { + if (zip_path[0] && exists(zip_path)) { + wcscpy_s(prefix, MAXPATHLEN + 1, zip_path); + reduce(prefix); + pythonhome = prefix; + } else if (search_for_prefix(argv0_path, LANDMARK)) + pythonhome = prefix; + else + pythonhome = NULL; + } else + wcscpy_s(prefix, MAXPATHLEN + 1, pythonhome); + + if (envpath && *envpath == '\0') envpath = NULL; + + skiphome = pythonhome == NULL ? 0 : 1; +#ifdef Py_ENABLE_SHARED + machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome); + userpath = getpythonregpath(HKEY_CURRENT_USER, skiphome); +#endif + /* We only use the default relative PYTHONPATH if we havent + anything better to use! */ + skipdefault = envpath != NULL || pythonhome != NULL || machinepath != NULL || + userpath != NULL; + + /* We need to construct a path from the following parts. + (1) the PYTHONPATH environment variable, if set; + (2) for Win32, the zip archive file path; + (3) for Win32, the machinepath and userpath, if set; + (4) the PYTHONPATH config macro, with the leading "." + of each component replaced with pythonhome, if set; + (5) the directory containing the executable (argv0_path). + The length calculation calculates #4 first. + Extra rules: + - If PYTHONHOME is set (in any way) item (3) is ignored. + - If registry values are used, (4) and (5) are ignored. + */ + + /* Calculate size of return buffer */ + if (pythonhome != NULL) { + wchar_t *p; + bufsz = 1; + for (p = PYTHONPATH; *p; p++) { + if (*p == DELIM) bufsz++; /* number of DELIM plus one */ + } + bufsz *= wcslen(pythonhome); + } else + bufsz = 0; + bufsz += wcslen(PYTHONPATH) + 1; + bufsz += wcslen(argv0_path) + 1; + if (userpath) bufsz += wcslen(userpath) + 1; + if (machinepath) bufsz += wcslen(machinepath) + 1; + bufsz += wcslen(zip_path) + 1; + if (envpath != NULL) bufsz += wcslen(envpath) + 1; + + module_search_path = buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); + if (buf == NULL) { + /* We can't exit, so print a warning and limp along */ + fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n"); if (envpath) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), envpath)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - *buf++ = DELIM; - } - if (zip_path[0]) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), zip_path)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - *buf++ = DELIM; - } - if (userpath) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), userpath)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - *buf++ = DELIM; - PyMem_RawFree(userpath); - } - if (machinepath) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), machinepath)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - *buf++ = DELIM; - PyMem_RawFree(machinepath); - } - if (pythonhome == NULL) { - if (!skipdefault) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), PYTHONPATH)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - *buf++ = DELIM; - } + fprintf(stderr, "Using environment $PYTHONPATH.\n"); + module_search_path = envpath; } else { - wchar_t *p = PYTHONPATH; - wchar_t *q; - size_t n; - for (;;) { - q = wcschr(p, DELIM); - if (q == NULL) - n = wcslen(p); - else - n = q-p; - if (p[0] == '.' && is_sep(p[1])) { - if (wcscpy_s(buf, bufsz - (buf - module_search_path), pythonhome)) - Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); - buf = wcschr(buf, L'\0'); - p++; - n--; - } - wcsncpy(buf, p, n); - buf += n; - *buf++ = DELIM; - if (q == NULL) - break; - p = q+1; - } + fprintf(stderr, "Using default static path.\n"); + module_search_path = PYTHONPATH; } - if (argv0_path) { - wcscpy(buf, argv0_path); + PyMem_RawFree(machinepath); + PyMem_RawFree(userpath); + return; + } + + if (envpath) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), envpath)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + } + if (zip_path[0]) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), zip_path)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + } + if (userpath) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), userpath)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + PyMem_RawFree(userpath); + } + if (machinepath) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), machinepath)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + PyMem_RawFree(machinepath); + } + if (pythonhome == NULL) { + if (!skipdefault) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), PYTHONPATH)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + } + } else { + wchar_t *p = PYTHONPATH; + wchar_t *q; + size_t n; + for (;;) { + q = wcschr(p, DELIM); + if (q == NULL) + n = wcslen(p); + else + n = q - p; + if (p[0] == '.' && is_sep(p[1])) { + if (wcscpy_s(buf, bufsz - (buf - module_search_path), pythonhome)) + Py_FatalError("buffer overflow in getpathp.c's calculate_path()"); buf = wcschr(buf, L'\0'); - *buf++ = DELIM; + p++; + n--; + } + wcsncpy(buf, p, n); + buf += n; + *buf++ = DELIM; + if (q == NULL) break; + p = q + 1; } - *(buf - 1) = L'\0'; - /* Now to pull one last hack/trick. If sys.prefix is - empty, then try and find it somewhere on the paths - we calculated. We scan backwards, as our general policy - is that Python core directories are at the *end* of - sys.path. We assume that our "lib" directory is - on the path, and that our 'prefix' directory is - the parent of that. - */ - if (*prefix==L'\0') { - wchar_t lookBuf[MAXPATHLEN+1]; - wchar_t *look = buf - 1; /* 'buf' is at the end of the buffer */ - while (1) { - Py_ssize_t nchars; - wchar_t *lookEnd = look; - /* 'look' will end up one character before the - start of the path in question - even if this - is one character before the start of the buffer - */ - while (look >= module_search_path && *look != DELIM) - look--; - nchars = lookEnd-look; - wcsncpy(lookBuf, look+1, nchars); - lookBuf[nchars] = L'\0'; - /* Up one level to the parent */ - reduce(lookBuf); - if (search_for_prefix(lookBuf, LANDMARK)) { - break; - } - /* If we are out of paths to search - give up */ - if (look < module_search_path) - break; - look--; - } + } + if (argv0_path) { + wcscpy(buf, argv0_path); + buf = wcschr(buf, L'\0'); + *buf++ = DELIM; + } + *(buf - 1) = L'\0'; + /* Now to pull one last hack/trick. If sys.prefix is + empty, then try and find it somewhere on the paths + we calculated. We scan backwards, as our general policy + is that Python core directories are at the *end* of + sys.path. We assume that our "lib" directory is + on the path, and that our 'prefix' directory is + the parent of that. + */ + if (*prefix == L'\0') { + wchar_t lookBuf[MAXPATHLEN + 1]; + wchar_t *look = buf - 1; /* 'buf' is at the end of the buffer */ + while (1) { + Py_ssize_t nchars; + wchar_t *lookEnd = look; + /* 'look' will end up one character before the + start of the path in question - even if this + is one character before the start of the buffer + */ + while (look >= module_search_path && *look != DELIM) look--; + nchars = lookEnd - look; + wcsncpy(lookBuf, look + 1, nchars); + lookBuf[nchars] = L'\0'; + /* Up one level to the parent */ + reduce(lookBuf); + if (search_for_prefix(lookBuf, LANDMARK)) { + break; + } + /* If we are out of paths to search - give up */ + if (look < module_search_path) break; + look--; } + } } - -void -Py_SetPath(const wchar_t *path) -{ - if (module_search_path != NULL) { - PyMem_RawFree(module_search_path); - module_search_path = NULL; - } - if (path != NULL) { - extern wchar_t *Py_GetProgramName(void); - wchar_t *prog = Py_GetProgramName(); - wcsncpy(progpath, prog, MAXPATHLEN); - prefix[0] = L'\0'; - module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t)); - if (module_search_path != NULL) - wcscpy(module_search_path, path); - } +void Py_SetPath(const wchar_t *path) { + if (module_search_path != NULL) { + PyMem_RawFree(module_search_path); + module_search_path = NULL; + } + if (path != NULL) { + extern wchar_t *Py_GetProgramName(void); + wchar_t *prog = Py_GetProgramName(); + wcsncpy(progpath, prog, MAXPATHLEN); + prefix[0] = L'\0'; + module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t)); + if (module_search_path != NULL) wcscpy(module_search_path, path); + } } -wchar_t * -Py_GetPath(void) -{ - if (!module_search_path) - calculate_path(); - return module_search_path; +wchar_t *Py_GetPath(void) { + if (!module_search_path) calculate_path(); + return module_search_path; } -wchar_t * -Py_GetPrefix(void) -{ - if (!module_search_path) - calculate_path(); - return prefix; +wchar_t *Py_GetPrefix(void) { + if (!module_search_path) calculate_path(); + return prefix; } -wchar_t * -Py_GetExecPrefix(void) -{ - return Py_GetPrefix(); +wchar_t *Py_GetExecPrefix(void) { + return Py_GetPrefix(); } -wchar_t * -Py_GetProgramFullPath(void) -{ - if (!module_search_path) - calculate_path(); - return progpath; +wchar_t *Py_GetProgramFullPath(void) { + if (!module_search_path) calculate_path(); + return progpath; } /* Load python3.dll before loading any extension module that might refer @@ -996,43 +925,41 @@ Py_GetProgramFullPath(void) */ static int python3_checked = 0; static HANDLE hPython3; -int -_Py_CheckPython3() -{ - wchar_t py3path[MAXPATHLEN+1]; - if (python3_checked) { - return hPython3 != NULL; - } - python3_checked = 1; - - /* If there is a python3.dll next to the python3y.dll, - use that DLL */ - if (!get_dllpath(py3path)) { - reduce(py3path); - join(py3path, PY3_DLLNAME); - hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - if (hPython3 != NULL) { - return 1; - } - } - - /* If we can locate python3.dll in our application dir, - use that DLL */ - wcscpy(py3path, Py_GetPrefix()); - if (py3path[0]) { - join(py3path, PY3_DLLNAME); - hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - if (hPython3 != NULL) { - return 1; - } - } - - /* For back-compat, also search {sys.prefix}\DLLs, though - that has not been a normal install layout for a while */ - wcscpy(py3path, Py_GetPrefix()); - if (py3path[0]) { - join(py3path, L"DLLs\\" PY3_DLLNAME); - hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - } +int _Py_CheckPython3() { + wchar_t py3path[MAXPATHLEN + 1]; + if (python3_checked) { return hPython3 != NULL; + } + python3_checked = 1; + + /* If there is a python3.dll next to the python3y.dll, + use that DLL */ + if (!get_dllpath(py3path)) { + reduce(py3path); + join(py3path, PY3_DLLNAME); + hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (hPython3 != NULL) { + return 1; + } + } + + /* If we can locate python3.dll in our application dir, + use that DLL */ + wcscpy(py3path, Py_GetPrefix()); + if (py3path[0]) { + join(py3path, PY3_DLLNAME); + hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (hPython3 != NULL) { + return 1; + } + } + + /* For back-compat, also search {sys.prefix}\DLLs, though + that has not been a normal install layout for a while */ + wcscpy(py3path, Py_GetPrefix()); + if (py3path[0]) { + join(py3path, L"DLLs\\" PY3_DLLNAME); + hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + } + return hPython3 != NULL; } diff --git a/third_party/python/PC/icons/launcher.icns b/third_party/python/PC/icons/launcher.icns deleted file mode 100644 index 59a917f20d37ca7d86723f75fbb8e8324ce69710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264476 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%0AdTDAIDM)O;*NRiX8na-1gE4QZ z!^foI?5oe6C5*mq0q(Q*i7826P8x{}C8fU>aSk5f>3yQKbLzFc@m}QKzXxl6kk>u& zZk=E>$nrC_$bw=+-!S^+aQav*Y9Ss^|%uFOOGvqh#reC&jIoo>Bt}+P=@V z`Ih17m&@e&rWq}N6i}@Z7|837-BvFVzK3E;+>s)nTI?3d>8zzpG(kFbtkJDS)0wCy zgWL+s|Dud05CsXw<{1pRaW&pNH08$Rl+5{P47u@mz1nG2A>cy`GTt(?+N10fZNB*I zD*t>+Q)FSf}?cU1GB=azz*Z{F|F2_m8cU@~JY)m-g#k#~ii>XBG|XG*Zbs z)HX61^AeL4ZXq}+n4J&KbnzcaJiXQ(9|6|^LN~2JYz9LK?f{a-M$#p4$B^rB7CcQ zS}^B41sdLB>7bHMZxkxqIwyQsmjRDXE#Hk^SEaIbn%mwibP*WPA@v^}*JA>=Qpc0e zzL4nN7wKJob%ILrpL<}M%RIOms#{@2Y(xZXOw)X#D{+B=e%asZe5i zcs_Y})_qp+X^#8+;`{utiF#b`F{tq(?J;iERqd0@zWVOF*(l+7`-1fL?)~o9-4Ocr z?(p_n>HA{YnJ@m%c=P-U>-M<*9QeVj*m!sc`}_*|9PHt_d3aKLxYT=|EOy+&5cIY# zjGKbBQ}Y$BM`E?mTZ2+MMS>zyRO??hf{dt)T11M>JE^@KmMg3Hk?Zjt4si}6!fQ&J z)Py6yyGlbkpD~M2z*;QJ=Ji?+8)H5_YB@k(@6Qqz>pG>l?z!yv^vIg?*ag{a%}_X% z)11K3gIDr&QILtq+qwtzn6^z~(W>mes3rg7D$MIU0l=NYMPty2w>7i z2B1kkD}dl%Yaxz%;Wtg;DA2A5`%jg?^({W6V&sEk5!vS{QPhAsLY>>lW)aBaF?DW&a)#&~ z4cVvQEQC2mP$Y@m=hsY6Z`%+Sv@ZzuFDut(%{QQSm#3^^VC@+TgIY4kyf_Ktv~-o) zClCH`L4U$FI2@Sf1$V4bAj5)3B}!EyRT*@ewtO7b?kY!{14G^Oc$U@$b5fDD)%^NTras@x3mO>bxwB-d~?y*PPSOiD( z+5MizX4gLelQe*yejBZ4#WMWL1UFPA78$aMxT@j`<1BaxZ@dIFH+0L)8euy1!TPb8 z4BKAq6kgU*8CyYFboDRd73RH2pkyU&nVzvYH20VTQ5KXP2%fM985)YTx(mc;%?Q^j zdR+$RCK)Cjf(HGNVrn<+hk!K{nvfdU!xIKk@uOHG3$cHB!(@vE2^P_@Bq32MIZu?z z+Ji9HtQBQ*0jb8ck4kHB#aO7~DU96y-kEcgIIW73HrQ)s6y}p27iu_l7ziHliJl;@sv|2f*Gjxg&0bND zO`h7C@#8+0B%I|C(ZHmO!2nR70}xI1-36jYa-nzeZWgtjK9A-3)cw)f;;_xuE!#!` zGlBi($}zKBDblLEVa~FMhzqed7DG_NuKFe7NsZm zlB9Ez2tU@$ol`kqi+{6zYA4m+CbMR!t*gDr$r>4~OrPcXiHynb9#kZJRAsTSFYifqKxPv(qzt+n61j-VjOMbHzuBd)|QygP?}B z-E=5~%!#K`LR}Bp9Nmf)E>R{)W`V4J{K&0RwHy3?A>4|HpSL%1mZf`kRH^gAiB9uP z6b>c2LX{C}0Y)QD&2@7Z@3P)E&$)t)@}kj~1t(uwFEui)I(%t;IgEJp3pIK3iKI+@ z2~RDDCP#TN3b(yRH2vqObef6tdS<#giF26>lz(iMkEUuuDkm6047wn z7qhY69R5X@tjNJsAupR2-n)*8oj&GpK-~qwSX8mZNsph0%SzBMNt1^ITt?*^81rt< zj?0R!d;ET|F#2q&WP^Vrnk2|*8Bl*=Ac>Gi?nJNWZxTAw%5y4S-}J#K!MR}CGedDS&J^nbIAO%tOwJ? zAkT=*{0M>J{)d+}!vg($MH|)qSXTO4hCU>3O8o>vE8V7QeG~~YPPCqMzu%`*A}L`b z>CgrB1D&{$gd+CY9&J3Uv@8D+T5#QxX{AfGZ3L+iC^M&7;fTy-T|YmUhur)6DwUdaylu?)Pe#gdh0jfQvmtk&y?%*9_G>n7ex{ zVdXD^|DAH+v;r>w|Ga14gaY((L9b|0!qD69yOT44c<YI%|8)!c12A+$;Elz>Ik(!f6 zjgq@B0}m)3a=U$E?8rvJsMg`gFgfItd1IgOxwkr$guCPtm;-WX=H&~9!j;Lh?4Lyc zNWB+Awm+wg%qpJ#q-i_YZ%x&6n;Nxsf{1ZbM=TtvH1f!ZhOVlI*m^yT0xRGrKZpkz z(H$G|?%k5zD)v-YeIK20n`AFTwQHnSfe)(6Dn_vC%BkG zBf&Lb)tb6}_TVmdS@PltPs(2;l2l!0_Q!IEkurf+?|>la{cI zKdxL?q&%-d4nZ4PfVPAo;|8%cI^YJ0tL zoJO3#zhRjD++!n~^zf}Nb#-g>W>)BDo*hgZf)`T1Z_%wf9^;%5*aK6JXn=N_^SV%PR-b_yS#aWEeGV4(W>4b$ zUznP}Gd~4{TR#mN13$G&am_PqpG!kd3Nfb%p`In0jriR2-weg^2C50OJb4EcM?lS; zFjLkH5PmC=+**ZL9AWos{pWiLc>YVKgDzfv240iWqEn6fU@L7PwHIaDm~sZJIKi0e z{T{Ynr}<>SW>dY+0Cwn^NDsVa{fDXc3^MI8QDv}VeI5f3jN=W4?EXIdE;b^e#2;$< z>R_ZPP=YO0+!doUG5cXA6AMJ9l$1m+wr~Ujeczg2j9?%hWmQn<-Ry=?18q^69w~vQ zXGUHy8>LXWtY-=?Hh`P5^U}clL|`80yLmm`=^_jrZ;|BKRd9t83yWAE9ltzmE?cJk z%mx}9Q0iqYs9svS)`Cz&?5XKXC9Ft`dhK#M91wNGn%&E3Ua#}GMCX9F{;`CHZSD%2 zoWJx_VyVl+40oLCJR~AKU>oVc2aw01iY8bxd~9k*u^1+8n0=h+K?VQ-G%?;VZA=d0 z4>9t7CBC}2(2S%Hl}HiZ$(TXuNuPxu9_{t&FKX~V*x)8KKkzR<`uPfoXObsx5EqOI z)*F&5gQCJ`h(z$!i+DW0? zS^HBJJrsceAW$KaX1|#b zlyhfXyCiXf{(N$lMjTTX8Stl8SbtT)X+cOcQuCKUeWZoK_UKMcU{%V$L(OVcmm;pl zH@EdNx!dFPAn)#7%0?!(#%UinW;l+-v9~T9Sj@NhVy+-gCc@f8KY0hLM%&eS{FEkR0BV`&3W~2 zTKwG~=3W`3a+(MLupieI?B*x5mpnIN+H1*=`7mBG83WM73-BN9S;c zCEhzWAa-t2>^H4qvr=o&Cw35^QC+F^pG&33<%q8bdPgWW0TOAo5=}{Qyonc$9RU~# z38NRIg@F)Oj_`^P+Pb zLFF*#($^tQN}ep&?Y_7aWQ&4Xq;;+n0isc#%b&nI!N6u#<(kw>I?Y@Y0hjoe#rE|V z$gN1wM2#=icG-RtuA-0d{qXzi9@W||{Fv<1$uRM{It_4v?@pNjbMyDA%34ubLJxO$1koI(e8-{B54-bA5 zD4z@!0KJ!aDUaGFFGwvz%o7x#RHjV^N%@xA0i8wtL}{<<0=$W{q)j6G;QUz#_@{6R zmpH>l*pG_t1yUvo_9@htb6iOouD*9){C3cSDhFTOu2U^5UqIwnA&{tFa5=i!s+!Y zN=C&KvsWrV6Pr$&O6J`mZUqD*UMWEfsxflF_2%Uh> zLP`0ZCoY(~&4e3>R&ZOGA3YD~!?IA?--d0^AO>QN7)1-!5` zXr$yZ8T#V$0_hzno{AQQ zI=aG4C#&Zd^Ym=tfjc58s(;Rc zm^ByY=?bCMD))n0U0j5E6N4g{;1aCUdg$^$FZc)`a8tc6Zx~ms8xZLZQ1yX=NI`j? zlx|4+*AUSHLTURkhO%#hwL(3yP5TZ#^#6JKStg>lc8`&#Qal6T_i0Q+08ceP(|rmZ z%;dNyHF!z$QG1kl6}r*i0F!8yekxt+41T6>ySs?k82x*0g||uO`2NBumLYgv59ibl zCAn~tV>Jv)tTd6>jBBJ{zIy}4H_-xE}mdIs;}p5umk=izzFme~mN z7=q-FORIZWFJkALbnc6LkH08EheMnchS*m*wEXAB5Q6idR9YyLsJ zK{%KJCd5F?aMa#K+c3`93t4XqE=o0LHF9u2E*Qx|yhSLm=Li5<2G1cWWL&ohRbhxc zbFvp!-IU{aAB$VL2V!5jnc}a`od7Swdz4xO#TM!@JWiMmWn`1yBh1~%X=cEEGsr^a}2;EKu9%$M}`{tXWKxK3sMH+tHo%xb_ zjt-hjd5=?Na31@Ux=UL%8gQqOCRv^?_SIyqZx(;4Y)As#Rh`p#x0J=3hy}$l942FF z;lTVczU;K>s}xWrdv*UDpD9+;VS9_{Gth+_R20G!5ypH?$1^SnMAxXH&fD%RN%Zit zU#)WiOLE2(oh1>@kk7^|O+7}UKW&UAe4ZfqjSs-qQ;+8J*i*g4*-c6^DRu@Sm@CK3 zwO}j zGmftOhNo_G53z2hu|#f3QxN~ss9_Z#-$j+mI#QSj={FaL&Cts~{Q|hp2A@=}PH|pr z`2fs>b8p{=p&3*|88UI6znv`ct6>9=N#&F;dm(am4u>k=zvi|I^4SFUM$H*>w+pur zoPeI8qvWCC%Ep;To`gS-9f0b>GRg@TV0rZq+;F4i_+*NKZ?cHWqD9&C2)q=irKvSb zy_(n~{IWThOV8FbvnrU&opD~KzGN1hJ}t`lN@Lfu?&~o72KZ6j9Lc}P9{02&BA+{^ zfFSo=e&;ByP)DA`XIq6h zpGR4LV>fsRQ{KmksBHnY=O{@!ZIhniS4qjUelW0S!?{#O3@${EtM6s(o}=OG13(jd zwi%4U{vQJT@kg@&wJz!H;Nd8o8)w7WjE2A8I&XKv9HmQep2OMYbwG&$bf^C?87|c9 z`2O}7B&A_(Ygbdnp!TP%1|~J{g*KrDcH(!DFs(R<>6!4srtIBJfc|rB_`&xKGa6wLpORcGL&4$}wd_4H z;-p={L&gHFDl7o*XSceR$7yY^C-pEYla#dUdUvRmiXf7SII#Foab3t2BVzy5 znl}nlaF}*m@J%w|{t+o%hp@e-W<+xzm9RODwUwq`K0U=DvY7n|(8yZc3!JF|3hFe9d80X~Lb&EDdG{&N1#r%4MKBaek~;?R zd5$N)_s%)jZ~KRBh4z)oN8&lECwJ*b6CI@6s=ktf8yOGfe+rIIt~u}{P4XDgoepj! z>7m<7{C#RmY1=&`5HIwB%{Kbdb z>~RM$-;$0CeHkdJO7UZ{z#~4yF)pWjlH@x|pfPjJQfN|5WMa2Yowqd)g{DXP$PMCx zwyoKT&tn|l85#H?7zB61A?%1nzW`7~#iy;OVu~$*0c{I|4xY$S!pln-c-Y{?1 zz0aLR&@0gS#2F}9#{FNv^BkwZNzdLE&!sgr6(UZ{I74 z`ruhGgT)lMm5$WJ{B=%+wVV_A6Unx#S5-UmbWiP`jp}=y!jkv~3lwiu^FQyqbL{=W z60~LwJmo^9SmVQyvd^vTj(DOx>zFr@2iKwb!GfD40< z`Ba{>eN$Zgd4!*-BOVwb73lZgOJ0(fpi_yK@a90YYdm?- z&RfE%LAP?HVfzGhFWLc7qGLe83&IKLS6b?O~iXtLREw4EMd}qW{BTiw}pkaBAb< zyFR*1#9&dBs6%F-0Z{U!Uv>EsdDRLb=oA%-t4=0x&-AT@Zxlq-no*^@5EA%)^Lx-E zL(wSDm8Tg(*l^(yA6~;Sc(Stw_+?jhX4K5@P_EdJfM#amf;5W(v18mD^LbA+P2L_Y z_5V@EEm^^zm6@~xVFzGHk=od(E3wzD+ftja6}|Zzb2khr?!Hh=4Dv7bzws(R0b)-l zW*K$D6sEhA$-TL)jwBHlHkuKZ!W=HFgipb+(M>geoPeTx=n;L`@Ds-yxc)h-JMgNi zA!&KyQWVt)0EJa+S6ukDFXWJYA1C}(SsQ0m#%L^%&1dKpeX(s5vG2&IFP3666@2!$ z6*6WJNM6&i^19GRnj`}*XnoBUt2$Q1%C*rx zmJ|(ZiKi0U;E2hsneLJC)-?mx2LX&2`CIQQxre6%fQc}68DAQ`+%^&JaY|yv*S;e^sRyTrGDq_~=FG?$w^e z`*B2=>=x;*=ou`|>8)Q49O-*)Lsy8`hRjluK#v4iK95X7CxJphP5Z>s3~daGSew-k z7FkrvD~u_$pZ!|bM-)|;e73+8VLxLOY~^r;rP-)FfOAT_UEH2-rX*U5OTC~J$=h&S zq5?w_yB>Q%6^w|iMw{A1tc0mx67AoI*>AW>&77!-hK|skx&#IGQ*GYn9G=(LbDw@r zDTEh?LPp$P$CSl&o5XCbgH4dcv@a*WjTIe6Qw7~*9%%9sK`nWhAbALjLB3n*Xbypq~z7e|Luc98`DuUm0jKrkyc~h!28k*DwK$zO}}a z{P1Qyg8~Nv^=%P>OY@@k$Yc`)_6}S4IJAnzBC{)Epm`gS{%A#Lm=bg+!BL+}loQM< z8uxkYhF&0#f_Gtx463?Z{Id;#a}d7H{+H1B*Qn)LKt=^CbXT;LWbxch*gE!&(DoMI zwc;<5zm6Q@G(ftO6ybXsr8jAI-nt`uQ=+^6vm4XyFEhdgS8b zuVnKYD=tCowSxHPbB1kY`i>BHoo>NlU|iOvx^`0kX`*6;|1 z)~g^5>AieV1O^r#si8Dz*DPoBt>ZZb@M>44#mi3Var$4dn?VJo1sB$XU+|i3B8i?u6X%TYYrV?OW8ON- zgr0l>F1K9j=9CeM=iCKT2CWg3ka~&vz)IFHowI69vLuwQYypB|-2Quu` z4!}PbMHf3oZOR&{Z^b#=^@ON@S8Hp;mnwz`M13*|7EWh<;P}3MU6Qv`PsMYM&s1ts zC-mI0S$!BAa9`POL zDmOoyj1HqK4pG;r-h;WZs9y4APh0LnUk|w!cNkd9s&O+p!{(Gr4|~im1fP)a`pP-9 zY|ur+0UaKb zG_PE~h0U6st@dU;OwQM3= z5jLUQ`stwU;6Jbr%bF*)Y{v(uM-bS4A2ToIo3@D77 zVWzSPq04N2Bp~T{e&7h%kX2ZWpj%~NN9K$ybw#H4&^)9)(}l8}^Rugcu*wpn3{Kwv zEv&r(Glpb=7S~@HX|dTJFhKeGry+QZruCP_V2CaW&gq*6U2HmN_Fr=njAZMT{Ocst?Pbr87uC=3EdXlZ z&VEB^P4w@^qO@I1;s|7BYbiT&`Bu3XBb?%<*bm4s`p6$%gzp$1>d#x9-0CLEmrMXb zu}$YvPZQ8r-Jt*fLXmsLr>m&_@@$SAE9S%pK}8qS;zmr+HNBD}nizfKyH{T1u!acp z(?4APi0aBvw{YKXun$_95lcg5k5F~(hho%)tC?7ca79wr%vas5!7|WDW3%?S_mh?v z;Afo-ZFU<8bQC9>NT(U7A82SRyd9I3sPcTsMS*i(yh^0lUj=xIh2Jx!@7XWjS zYp=~(9P#JOC_HS3B%3?XpST}!#kFO~1ZQ1Sqkq&%`Lljsr3wlQPR_MM2MlCpZsY=$h@Ke*i77V0}ws)j&X~8gEMMARE_VFd%1@ zj-wM&Wdjk1CP>04f6k8aolekXqt`$Xo|$lz?rffvpK-pyxw;EuMdA$fdq*%OY(KvI zf*d@-eosVkWw)mX$`so1elNRSF3ZdS6=y=2K>?TQm{DFenq+k&eBVPaGXii*>3jgm z+FSZdnCcwlRZM&E7a%R&$&_x?C}Qa+^G=$E>;&AG#0@5%LXZ7hfIN7z~D&J^I23-Jls#0aHUs{c) zqDd|@$Qh7^4Mt@AbR!c1Lfg0E4<5KIaE$6#!H+aVv-dAv9b%1-Sf`Bwp`!qOmSrR& zwiAq4s}?g)zub|kE)68<58ng9O3tWJL?->=FoK+NlsQ-IRIOrcsPJ^O9Kc#5s@6Um zK+bt4r2XR5y}*%c25>cBst3w+bSQVQ&*#bCAEpAWF?qPB912&eeh$i&^2Dj!ugjr@ z$D1 z8MI#S$urZ1$f8-kRA7ZzTY*R%s|C7S`v2(cDN>**1fn-@E2e%3k65o zPGiCgf8?BE?K2yXDbrH}SaZd6(-@lm`cG^n^RTKrYEzblc&Z)bRs zLR?ewkYs(P2EcF)$_TkacM){yak3SP1Oe^F0<^kTm&iFPr|^o_T<{kO~xxjAFPO0NxfhC`|IOeU43 z@2(yrk00OXYvB}w^6{^SdFV%$J+I!t1z4;v3LyDc&3L@Ee2`9ZRyS+j!6i}QGbKtR z`PKZ;__(5kn_pzX5bvlsCa?m5brafj;$`9FQELM8PO!&krQ^Sk$WJ7MU{=;w(fc$4S#Z2eM!fp zRulzPN(5qR;B z-WHNshlgyJZNx5Kr~~V4#61X3gxuqY4smQ{)ag7W6{jq{EL&IU{IGGDln6|jVi7CQ zFQ`OlHe8!u%mDDu&Wbg78oh&>L&0z?@u486>#bf92{|QufD~Gh!=(FW6^V5;%$4+F z`XT=EsSfYFy0{DZm$EM~`$a}=mtu`&Py2yzW4^u7?NLP3-Eqolkoi6M^+*1v=%#=Pjds&|4 zk7cvh7&gI-?H%P|yZMI)!ICr;lsR($)n<66ji2R+J#WWny$h?(2lfJP3ig|aQW5Hd zfsG}4U`7fXsBS$T8>RQ4%lJORV7cWvf|_TVOyg|7fQ!N_R%yiz`&Y$>Ho10RyEzS- zKnH|8jr4|jGbb40!W22aX2Q+TT^pXN&Qu#Yc7S@RyKLO62Ya@B3Qi|v8tS^%-bH>I z$>I-C&@T8OBBUhV**ojV(n`WYih#J93$ZR=&H3^eK47_O^%0UV-gP3ynPq%pWv`F5 z>9WD<)szq$%ppfRUf94|VY%o(p8bWe`9IHmPyZOv^EmGu1%3#<)~-Ce{G?ci_i%hW zFTPVxc4NuBLD%0ISQj^9R6Z{Pm>j=S#>2pjQ~&1NFYR~VgIrI+(;uRDuVUMPEWhCL z>l}z^ReC&~!nM!{{D5BCub{KM7JYqldu4ybNsF(fGy3owTv_mtm6M*^_^q7&gCNAK zE?`W>d_Vy>0igJ?6<%&3Ld^gu?HCsZtIBIo6~qEMe*!T#KyXzn4?aV*jf8Gw6mxk5 zhU7b6Y930#kK`Ewc2>F%- z`cMZ@Ui3#8F9Ppwu&3zU^ZvGG7Imx?)zNSkxJqV+Rc=fZid~*1gi*GYYE$QXg2>E9 zdeykAXd~?tc}yKA%giB!1m6)en3p6J4Z=`?;0#5Jja=i~6-j>9kEM8mmFL7kplJLt zp`AvVdMsTd97bG^iKoNo65$_-PNY7{e)*2#IsFMn1pi$v(Op-|*5^OM~D;SQvvK?)XrECN^wRg*PXIbZygLA_g;zY>FVUo7AM z!=0fT9eH=z^ZA#QZ|A&|nPX=~bM~Bgb`EZ9TU1*DF}n~{J%8iqC6e&|9^z6zk_^p+ zuVw1UPp+x0Zr6s7O)Cmur}GuK=sjM%O;adsjw`|dfj80aBKmOOILU&}RC4QS1Uq2T zT2$oYN6@+)A0*QsKQ_v-mT*lr_<`aeFeX6;)u`_|tFwIS2yX>LG1CZjkRrYO?MWbg zp_Fb%@V#=UG;9xDlJ95D+>n7D05H5EOkP$D1`-qU7heJ+Aug;4008pq1p$Bn`*nP9 zr~-bSKepl;4gdhK1OMHCBQ~W*008&^62bz?u9=rxZk|g=SuZ~?9Aqa(1F@<6{(gD@ z2u2F1L6GC+&FV$XhD~~2v-99rTO*S^S!dFwZ9WYyCf6SAt&8mo7EK4?PC|V!D1cQ^ z`2Lraq5Smli1D$Rhgv;+_!t^M8q*v(7nu+4ytofy74}_*)ix(uHxAk>Z20(794C?_ zRk6&goKj>~36Dkm__Z^f5WltceMD%41t5-hsBS4tN#u<1ITK$_i7^5HPt=+Vz`t%k zeI)Uh(!9_q*&3bX?5%(g_*Vq*hz<%cAMZd*ct#=dJ2QOjO(Fi;JDmagPsSq%=-YUZ z`HMyqpO?O%wzF+3{Na6P0{j*6w<23i4WAn4=l;Uo=2(ro%O!_WK9;h0n}?VMQd(@Ho^=hab&(nq`jo!x$k)V?rZ<#i@j4e#_J?->>1=|IPS2AAn!dZW<=;vAxiHS%bSlYJTyz z<(K}a3ASfN%v_Em*D>`)jJQscO}!IEj~NZG0rI&**>nY zB-3GSS>V44zXkvSY}-#8OSlWqGha|sn57qrWjPT1-`ns50?={%*EDQ3#^I4cxBWRT9q zRwPR~2?qkyQwRHB58%JmR{{gXA7*x_{y#*02RzjO|M;6wAsPxr6h-zb?i5NH8D(W< zB|E7ONyfFP$jaVjMP^pE60*)dWftjhDB1J=&-eL!|GyqRy3YIkdcB@|zu&sdh!`xn zNg%1`gG~#+dRbZ7+FD=D?f7@yvv&#H%yhH?*{BL4YGShp9zz;D80M45785L9z4A8k z;cVFwrSfLeeo?dX9toW&x)bMM%fW3e_;vXOJ$qLa?)KYMMKwlKyU9S=VGrftb4%ZL zQ#RjT3RqYp=N;jnip)<{lp~$omW+_IY={K#{**&O>UFY6!rW}dpQ%SXk52r}qiikL z^zl$u8u?F7g`QOpNWk&^2N(+@5`BlTC%oulR}9e@YrVO)SiU^`aKL3tk&_hfvpz85 zI8^SYu1Vyp4~xW-g#KH0mJ#7kz~x@-VhU@{DRgZh=9s#z&y>C|E?zA1b#ZcfKU+Dk z?L1tG+1)hy_Iei+q3p&sOZNxRBI@JuEw2}fQs1Blk_ZXqi$v3duT)+$gl6JkqCqzT!I$Ms$I>;dVKIdf*pPH{a(VRNDT<5t=D`1l&RX3J@O zJgrr7-D$_8+OcgL@r6|$3Asur6IWkLa0?>X-@Z-EDIGq%TwlXK(_gGnI(RQ2HZE># z%TD0y4pra#a1zo*N001pfcLBL$!?L1>@W$Dk%xwS)@S-loJ~JBtW2Z?yAC*)W~QZ` zu(JN56O@_}v_%!%R2tygQ(Uf6S7F%Y?810$kwe{|pD`6%)%iUQF1|aaGK6bC2NJ)V zN0?17I{H0b@)&6i|shv6p0ANBY_Q?))@p?(CnIMrKD*;*fu*XWNv zcPBB`-{TxFED2cy>$XcVN~Q&S(eCWl%9u&PjZ0mPX2p&XN4;fE%w7r)+7P3(V5x>B z@eQJM9Ygx9u@(yW8&!G~n0w7#Dx9$BC>E8!SY6}FBy{z}u%D-a2Ox_y&sB?eByELlwk37k>{oL|I z9jjtdP!}irQL>Yn5NCKs{f`@sD(ShknP$@lLv_?<2$W>P~%Pn;RrWLvQaYw{Y#Iwzl3YKK~9x zL_PHFsW$FP`#*=E9n6hP973&jaLar>rP_Plb-qnDqjl6G?C_Bzi>M$Q7#I+Bv;~e& z-X&eP*w#|*U|M(=6zVdKbbaAGT~pKdaW2)yJ6VqcGB%(u<>Qg2`g(fS+~cm`FeWDA z0ZinFBqQS5sCYT{HutDLZ0`m~IgM0%6Lrb~BX4v~&$n;(uqIt&O@K^wcG|Dxk&Y9D zvX&E~p^Z3!!>^`($GH$AMNP9)zSM^tQ(j2n*;EUC-j^X7pDGT$zj})GwTEP`jDJf5F60*iiTOdHcdjU`rVe|O zMadi)^Y;m5G24321%@!gb%Fa2Yx5Yy4yCtyU3}L~$sFpq5%1+ypT_e_T~Aa=EGQgT zt|H0Ggfe{U`iTf*yGbzfw0i92uA-8XDLAcfxawg}O8n)_)Di9kWh(ee zG*C_#T5q1u_v=-o$?ky>>O$xmZV zoXo}T;OyL+aDO;6D@%whXq%Ol<=V)7f2Df;ryZeeKAXBddcPd$c-WSyZjf7K&{?2g zf04s$H)dR%tjp5oBK~`r&!6~~5*Ac(Z(*T@xMW4AnXwN;SztxYC z?WNj}kS5Sr0>)5q^8UYt2;bh`-g0to1zSLUc8W(MCZl4uTmyba)WPoW2rZ>$Goc1i zQU~dg>WRKEA>gd0%wa03;0%ma=dOW9&3+tXxs;+q7UbsSon)bksZ#n|1kc}uSr%2t zW#e3becH*>Baq~EgS+mby!&*=6IKNjs$4~EABq7#Cq42jUih_ZoLf+kh-r!D`)fHL zfBKZ^S?#D-XWAZooFi|+?4`7>_OQBzvY=McuL?M!w!E)etHGD6X7a z3@>pRxy{Wt4q9t=+h$XCLeCTa0~2a zWO%~Ju<830wcg(FW1=MXpMWaqIJ!OEyzk=Uk2u0XjkO53px2l?Kk%TgK(Zp*NBHW+ z9G6M>#psdnf4BHdw!QsP5>3kw(S z@uJ-FDIqi0&P(MJZv$L=4GfJNF*&HDZ~HN@YUvk`*7%`bOpTol;cUR%FHXgP+5J74 zk+ihh>o$|Fosh*TZCgYk!N2xXJ(=#0unuHmj_2BB1~`&maRiL`hzd%~R3;$iXgvAE zl^Tbke5)skzFQAKqffg}8=2wSP77=-_g%-mY6#+X3VG**UUdGJ{|T$2dK*Vbu;QjV zFGDsYW<2S{o_v>j~b6_Wt-(HH|gHZAmN#N!Uv$W8&ZZifx>W$Cdx7Ue`A?wBsHRXJF(#FVTDoVV7(vNti%jKrJjqeTlS|UZe*A~e+ z*73SlR&Nf87$r|nPj_!segFR5B;WE8BNNl>knHs{x4tFYv_u*=%Eg4FR>b3m+YEp_ zyuBb6emrXB9oR2(?tg}JE(IKdThdDCz0aRNpFxRv{P?jpJ457A-;KL7!&L*=hNi%% z1?B%xdV{Fp2xUHDTit+?iK%Jvou3!BH4vn#e6Hb$fw}qcxNk{i<#mXIQy!o9ICX5;0z1Bwvs4YLGZ^V^|4t9f~^e`RJQb_H?EXIsa2^%`2_gz~An zuP5$bgj7b0P$)$mKXc&CcD!5KiCAg1-@SO!_B^@T6etbd76;)cpN6|b|K+z zWt~6kLrQba8)g5gey6d%xa$vRiVtI5?FY9iJ#d6c*_zc?EIbOgxW{k$Kxn+Jys0}F z@e7NFVGPFbN(%@gvZtmT!5|2Ui4pHt&nJ9L9Aag7vPQUHoiaK)`f)R6?wXldj{i~5 zuRz&&(Mf^-;83Co@uPZ42rkEROiQ(e4RecvI^U@AzeOcQTwHwC*WKJa@ppSto*MuD zWkq>&)JnOLi710>AXzNhjvcW8&H_$-&Z2&)_Gg{{V(kuABj7JNucq2mcI*DN2M@|} zYqr*&Zm!P#g=_B$3Ocb3bN5bcwr-p0DM6$w5I3u<-e(L{1&f{)8+#ZKip9ERHM}|! z_4h9Pn~|xPandV(HY+o;(>nN^E%(^XTsMN&e-x2o#LJ9AP=eZ!F;K7bE|qhBZh>JGMnN>n);ofKVoVVzUB( z5H%_KI$%mseiMSy&%Da>g!eT3>#()4%J}SpI!}dk*8BIx_MOMc90Kz$gtGnHn+U-s zJc<$eH@QaxN^X6BYiQx!i&gQrZBNX3`I514PFP4N%yS|6y}9?I0VGl1fsl-DH*?WS z$HZ|U!jJePX?z2es?Nc|?Dao2Bd}H__-M{4y>z3-j_^}@GM+_-8E1m#Dn>T7+uGWQ zl0l`lnETb#K!vyWDw66?3H#M+{;xiO{e4zeGqyqf;K73qgm?^5vcD}xTJ_Q;bLU}u zLj!{}xWlwj&Rj{=+-*0Uo(wKPHy(F8JyqP4w1Q?^+kvEk`fbD zOy>LC^2>Hf-X#!h$9pe*FQ3YK4|=N)X$m-4K~lV1_}J$3gfswxBp>j|aCfXYA7*Ix z#xVDKrl@HNh-2nHJ{5aVQSd!7&iyjZ-#=U;_d&#S?=f7rA8(F`m2n7j3l~3pn)2d` z$>Q=KBNFVTl(iB(M?>Bfxw0g32}8O!{@sbf!i`OB_FUYg$Ubz6jM`J)y}Rszyv^T0aCT@Wn|j+GM7b>P0OJi zqk_)>j8@`VV=yPBL7fip(f6zAHEiGW@}O{~{OFu)RAi=$LPiX1fbRyIszu>%it`@L z$;t5qhYUCBJ2+&5lsR*!w4lP)rK?!;eQ74F(L6MH>p_Dt5k&#{ql2V!kOudvE9MjC zE{WG{d^6jdPe=Q(m1wTITPcRL$ z=0@f8?_qkSsnyK0o)48F(n$1PG6oe`jL7r4w7LG!P3uC`!k-Zfi`8aBU~o@iyTbea zeiJgs%!N<*Et``SC>VG>z~C66EHtdzAz>_F>#x7!#NVHFzy=BX4&JtSOgB~~7(Vo# zFzopdboVikgUsr?^29CB`nqhEnl+)hFbMT>9s#tx#T)uzvVC>F8*_~&W%trRzAhf$ z*OnmP*All-Aq30;#=g9G90G>?d*heA;Wof$PJECa1;q6^E$<~cl34h!HfMJN=G?~L zI;z|LWLUFi5D^}3)c8CuENs8`;(LqYpu4m@q*{YIPp46YVzG?o9Y)EB8aKt3`$qtp z1W+@(hTTHK!fumk!0hK08sb&@5fKr9SHAbUdll3|(6j$UMVYFir&nI2389V0>G7Lc zC8TJ9IZE^x-3_$dA;nJiai${XTBBGVVfn<>t>#lX~Tn65_grVZ4(Ae+nurY+(7Qs zkH_jUCQDUsfF6$hRdI_`s&48$vU@|;*e@2%TjF#Zj&#Vsz2X!%-r1{nDu53;iX+hf z`d&&wvn&%6lWc1)K4D=E9Eo5c5xv!o;b3+I-ZnS?dtc$?;4n8^jHmc~H@;lg%?q?m zr=^)(dM~^%oW#=iu50jVuxyr$;h)XPJ3~Hh^hqPeq2dG}Lr$2IWcVp{_nu+v(N;opXg#AM`e zPiG-z*lWG!_7K*&zo-eo%dJ{6d3NC#z|7A0%yp)?&jb*GIHm}00dWzVh{`ZlerSqX zAGHUR<(Kz1+tLJP%e5}cdSyJy-Zd{l21QM zzv?wdD0j60AmHIAr{3qm%VrfJX5+Y`xLI^kGdlUsw_w|)Kk4B*KtlXS)4~eLpLsvu zV+Lb86l)5JGtQd!yE`K4eeW|d+@Y(LCzQPiOE)6f&yNO(XQih%fCm7haQg1(MKZ^5 zwA|gd@GZxhD z)WSWY&|O;c4l4WM2(O}CpScB{5wHCF`0$ZU&#x!1Bxd_;e(ag?fb#JC?^f@)h6a^9 z#?%%+Hv3V$7nuVfIwfv?0tuk}NvKj z5xo;7YMNeN{v|Ph{L(jG`vHKkm-U<|jnT#c2=7ze?Wd{ViJ1Pg%Y!&5w}N#K6wa&E zEi0RQSYuy~R=Xk$%^hH8EiEn2*)meLb>WiI zkH5+0zMF1jjz&Ro@xFTYhx4`V?F`OJVOm3tuy8Wvg>mAnG1FAfr_2T1;m- z=Mq3$yMs_x2wet3=kFN1L>-x__J^l;K+Zb%%H__Sg}}P*?Vq6Yv=Pk+B7cZwPR{?6&|!`EMh zNTCj0?MsqNnW?GiVykq!QKNn7kIxE1t-Fn>N-dmliU#|6R1qVHOnY1Cx{&vV=|hBP z@ctS^`VE1c(h&CAL(b23=#V3PMIE|huMiXm(cVJk3UAb zZq${8YOKfH4Yc6KF~i8nDC5263b;9~Elg6QrB1O!0SMi%r*o{; z!q&i+>|tl4nkyvCkGA$XPK@DRmWkS5IkU}OT1=}!AXXzS$N z-r_myk*^ZSVa3ho9LOR0`F)>YNlA%gQ`iZV61^w3rbA${n$3{$M(GA}Z zD$o(+^pzn1ukk^%;H z;tfG$OVPz1GhUAmM_#DXSdO)W^gsCdjJ;=Y@D?BqVyCa81JKOq>+9RMMoR)1r)6cg zL-@|w_UfKKEXtSWsp(N))J(3sBbV`CAX$+jU3XEJH6ewh`uQriamVzFbdV}k3TdMVg?p-909|aT;TwU+ruOBi!YU6zd5_pA((36 zQzO`?{8j&&g&l7#ki6p#2x#l8t3x5F$Us;3?TZ5fCXM!e-@d)0mKs9%$NiqH4L@r= z2c|W5VrsNz&j~y?BcA^rf&Rp1rW?!T*F)1$7Czs>s9hCI70&(m8LQG?G5QipAj(z!KkHUa{h$yxZ~#EpJ(FxXf4VQ`cVxx1cf#xS>(@vuDo$ zH*=_jfcXRRnL%YxHZPgWh@-Q&&f^3xRQ@LyT<1po_Vca^B4I57EtGg11T|4`9uov- z7+ktrV4x)Kx8}1tD^Lt`=x1QSRH=n+E!SUXfY9)c(3}aC^J0L>++?rsd&4{;czxI) zPRiybXi~QI&A`WxX|-ac>H#w-#^#t;^@H@8@7`W+PF;R9w+de5R=pYZtC!sOp|J2Y zRsT5cK>tjty~<)^W3yA#uu=kzP@Ljc?g}-e74!IafXqP&^wR)KMV$qJI5|T?AeCut zJm!_}yE216)BncyTyTc4V5NQ{WOVvza3|*rfYw2nM*Fmi>F$mpNhmF_K_<-aJ%IJ+ zcOEJ?7$|jtyyP|<+uXi9nzoDcgrcHFcgB@Is?uEwD}wmed7wlKYF{NmZ;yz{=_wlj z%XDNZHBqHOYK7SsTDm{{*>n1c@64=<*_{D~!nrHI(}i~$sj9vFApLo_*+%K)<=qlf z#6A6b>@!P7F)#U$CP_nGaj;|y;6+VT?W5x2$i3GVG^K5t*~Wjb6+UZ@DvLS7GBsfR zG6!{=9@baP^qEFhE9+{G218Us;M!@lLLiB3RlK0(#rRlqD`D>uJ;6(X44B<(I$cNu4goGTZbC@)K_0Y@EHgGTDAvJq>%GZDGx^8y; zXMH+1Z0oWy#8lx*;-QeF<}QlBuGw@S=Y!XcHkS9&D~)=OVDYZMyvf_OoZDTg>hYV) zNM7aFHhCa4b5z9 z$ZjZBhqzX`v8bc+@>WNY(Dby&(_0 z+c?>UTR951)^JJ9u|sF_F1c#=Kgh>8jGe$`yQEd<_via5i zYT?U1Jl)*nzZ%pGsoKk0eWp8j=#WWc?Omvbo`!EA6<#rgb?d(-!V1fn(T>*SBU;|O zl^-|$KvvrgH7(R#J^qwz+Zt`fy@MML^jj@iKXXL(b`O*~Yyrd~@Y2M6uoD0A?^w4_ zEF7n3QLP@4+L@yIKJ{r_uQzHD;frabJ*j1|%Kc_2p>@0nEsg8)&@0`zF3u`Oak_P@ z2Rd}n&Ey{0T5r!7>4a~Y4GmvLL>^+l8`HF5C_n^Qq7z|L~Y*8z&g!`O>GUK2AL5=;Tyv+XjWjuv9RdW*$Gmh<99KH}`l$HK%G}#BAe~ z@^VOdgk}yBqx{$A{-AhGurT6RV(qwYhVq-LJRAPt33C&lDlKkog zMu9B|xLdqjGV=TY>KFSwLh9l~yMNv>dVNysL(rq!Xpw1KV^o7^R_<{AFsNfRh>xl z)SMK1XrZDVHorYbY-9QMGuqEn4kts|q#JDzWlkw>jVTJ9@V+VIHGWQI$NFP#WKOyr zi~rUB%ppt$>>+vA#IYnFe+V5)gLu`adf!KFa}>s$Mxi%00q0`^amj}us2-2Db)vfg+YvJrn!P+YP|>Yh6mb!eo_9Ja+19+;Dz6TwK^+#j zwh=SN1>rNI1U1r$W28Y2b&?6`TZwbr((Dj8uP_D*rMWBVIyT|ChLMM=l%6_1~}zqtoChmVOV)qk$}fpM8T&(4brg{npI?!`pB=?!Z)`TrP#KNZ$N|}aGOmkxfu{gDN z7d041u+M0d*KIEgm9We~#j9Y>U8V`hkm zi=$>1$OIcBem2gUTj`&j@WQtO>j$DH3||R^rQcFY7QYpuXh0Kr4Xz@tPjF(UU47ZO z>2C$fkam9vI;Kvoqtfxe5U(MdRk%AqWI>daLkB4E;pb^O&P8cR)oivzxhR!wh!=ta z6wp3Gs1y&`FNlpHXluetI2TTomPJ``Zw_yaXl)Cwp&chx54 zJrQ%pWq7(?bmIC}RE$>{bACz5HE1!H1icv?yiP4|)jniH%w&~yL*1S$Zp{S~_wlQz zs0RQ3SHm0*zLsh^Lw+?D)()T>hcE&Nvt%L-^qCfiAO1n@pH{TQCoFB?%D)O<81U%n z>H>;Ac<^A`D(itH(vq&L9Ua`FK;QS>n>U}ZelK6XbcIfXQ6oMSx(`q>{~c%5)6tPk z<=78r^q{{->6Q94Lwg#rPsO7suXq#_>8~(AG=EsprxNh?IeXxf|=h^!V&lV;I#Ptlyw=oX=C%CfDeUP4(Lbn>cuKS*ir6A&bEf^{R*}AP1DZIqc9lY zQr(wh+DK(8o(1HT&`YH8GX4gstjZ_eZiYrk+RO);e(LFXkg@4Umzi0@v1$=`kDA5_lGMI1esXLCM1*=gE{ z&tPCZnhk>%ri~p?(Wv|=A}uRR&6&0rNh?xnV2p}e!Rs5=4_d+Rm3S?=cO=5_ruj6j zoYzYJ8R!0++)vO*6#1(i>4rcr_Jixqo%l=`xoZbf_?CDGbQ7NFh>mn7zgmwi$}Crh z!5f32Z&_=R;rxO5C0ia*1KWSlY9ePe?+68T-fM1i`sfxf;`qnez6Lwyj# zxqqL|i>|*jA7GV9T1v_cK6+|L)|BbOPm-3Wirb8@^HrUT-9qzjLtlqu^+PjUM-+9y zhM~3ZtyNMw2ITfVxK2+i8wn15I2R^>+N4liEiTgBafEl(xj^s_vqKq_BL`ZemMaA= zyD7h)^}Jtm)W|gDisR^V$+MZAvBjH8g@>x|EA3#aE1%oAAj)w+{pEbu^5c(p#~K`< z*_zG?^LRzh182~-UpnR<4tEMYBVSwz%Jjfr=U98pO@m0E;v!@}iM>C#TC#jauT?(x+kbca3FKomz1}ULxi@01x z;=gqEQQGneKb2{&>g%U&ZLXU(P89sUmcb*or8(mJTlzHr-3nj3(-*DRwxp9L{R0&B zaEIe}PmI*mfC0?5wucc#;=X>1ooFmzl!C~?7^6@=a|akgv>~Sw!f$rx6FqUCXZEqf z-Lgl&zgfSwPT8~W{oZNem8!dkv94hU1#ePufL%Im!ZZ!5ATc)duG;*(2<0sZWSv>FbJSl*Q!;QPQ?cPb@_1I< zyXtClYWn<13}sC;kaAxhr8~5~8Ajk>;IPGiJ$8XzV|s*gRNS}VX0XCwA0&FFe$1Ss z^`HBq?4ab0e5hUHJncBnf z1pB9QUQ^mt)xbMoYrGfI=-u<;dDk+ts-d_M1>;N)epjf+vPpnjduwqfQEab!9_T(SdQOtpBwNl|mDZ zU1ryYI;tz%czAoR)pLW>_d0 z+t8`|#DAZKl|y-JGUY3Ie2bmYvp%wmv$TJ$w4n@m6=ET&w!IKg{ZD9P0$`J97s~R_ z0o1ZaL`Ir4PV5($yzk_cZOz~Ihe#CcHQ#mB#3U;fkA_-lg5R---{ zQHY1das9a_1u5r~dM-litWDswPR_SZ7>8={iZ)d^YfVKo{{js!L;+!Qs}yKaZ0lNT zc;zM~lyy2-i{Dget5u;j2j&`t4;PCD+`D&=Z5N#;+BoNx)^00R5Qn#)!5khu++`xZp`9AG{1iTHbILeN(`{U=MCCg zC@mPPcH~>tW%Idy|HpQgiAOwhrEp!M5hA@?+>g-15X<9ZO!yQMMZnnB9+F#V#^2&R zAI1|D0SI*(eOH?rqZ?`rX{yRaV6sJ zFi>&1tdFAJl|I#DO4q0%v^AZUmL?=5B-QpKe(WfE+)aK)!~twZ3FZC>ajI3GGIG+u z*PZ8gENlC9clQ!%u5^=w5n*Knv%=2`@dx%oslF`CEl9l1QmkObwfWlxQ2`IR#fCJ{ zD*;gM)8DK(&x5MLY~ks)4ztBJN%AgR-96g4wAt5=oB`)2G<=uh=bbf#!YFHCl;=Hz5P2uCxkOo5d9$k!*dwf==) zN%6QKx2LyTSnX!nw8xW%{4pfu)k9D+MUyq&C#kcH#}zc0@KE%fpQk{A3zjsU)AP7u zSec$&gzr*w^X2)OKcEJ>P#bk%AXlLEj}T+2rS1&$`JK>6&JyQ=-}S4M?ChR%yLIE^ z%0`mY|FtJZM2y#;L%`n2qBj5kize>oEgIg*8|vvvm8G|b95I#riX}Iezl4lFccYWe z+yePn&K9Q)|Auzu@xPjWT}gbMy<-K&S=Q+Bq(gSI?|XDN?Ut=(p~l#TrKR@n!%n_d ze4w4rRasnYz~j47U_*E5_`Z4PZ|6>DUvU(F{P1|M@6w|kJB9Wa4AuXIzH8jb=PRfX z;cqs5y^@H|+%kzuqj^uKeUH>*Xvyhq9r_3HRyJR>`eM>KHpUnWCC*nWZQ`S;unJN7 zaC1ta{Y{vsDZ^hYasjJd{zFHlKluy?)0T`^W;yiPI`P9Lr4x-$SaBWxDRSZH8Z|%7 z&7KFL;H^-}vTUp?YW5=UQjZc-EJW|J3#GcGrjX1etX4ZkW2rP)_4vL$91^uM$}kPr zshC_a*Pt~_mN_R6n`OU6FBoZAVVoB%h8aGBmixH_=y$m$-qmShD`gZS@_o~TR zdVcTq4M@|~=V#`bBD6=?*Cp6Q*zcQB@z zHG|?xVBNX6dDjjG9)x**zh!ObKY^~>Z{C_DnhPVv8YWx`%yBpB_3IR$&9xZYm4)sr@W_dl^fu_7Qga6~ zCh76=_h(_+s4y`3{1b+lpd>->`ND-Odg~^QYSF&2{f6)r?D*5g_`v!b{bjfe2L{yd zBK#&Q-lMLBgKF45sVA(auX5N;Uldtx#9(VgHr-|8Eh1Cs$GXYW6!ujK0dKijYi~A` zrIVs5j0oq*7W|%0DSpL6rZ4t0s@24pT$7+5)N;0Qs()c%G!RCD$V;( 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%0Dx4BR`WSi2DG*beSsyPeD(Z?R3>K_o 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%0Auq6b;nj`{Pa!Bv?@g){O10d~RWACY_N8&Y& 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 E4^n&fng9R* diff --git a/third_party/python/PC/icons/launcher.ico b/third_party/python/PC/icons/launcher.ico deleted file mode 100644 index c4e3c693dcb4a9baa6ba26cdfe1359fc552db2f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87263 zcmXtA1z1!;*S?gbq@=Wzv;~O3qJSXXT@s?8gmf(n(ya)H3QJ0Zv~)^}G)T8JEV;XE z@L#|0|Mq!!xHIgXGk4CJGv~bLy#N3KKn48!5CCLAq&fifg4c?Q|7{B~0f43k07y#y zw_QXH0A9}lfSddO+hhR1?hXJfEdOoyUju+1KLDVm{crmv2>`^0fCGXb0)QKM_Y45e z!v8luHz4!`0DOP{Z+vc`h#vspwBR?n|NH$Sa2!=Bg8v_%8;B+cfTO1b|35xA@RAt3 zUzY%g(bZPHPQgY2in;zwOZI3K|BZP5$x7rDEdnI`~HcmMk#=yNM_0G|VR zru^8@@9RNkpjYZ<=281>!#+p9KqxJtvXSgv_l#FB$}Jk!Mst)@TEBHlrWVPN=!&iivhdqVMi&c_ zWQ)KGb>O|zOqo?5I&k=dlpFV}i&7pJ=Bo`~|m_kFRq*2Cwl5Bf3--Edba6X&KHma(mhs{TA zuOqM8Fo#MeCg~@fml#Zy%S=V?LTRUNf@Un?C|%J+p^iPMgF(-_`uep_QZBEckfT;) zZe5*`e~_=QbRrj|VqrvxpxZFtP6^2T0b!xCJN-LcR9Wf!y0o&g@9*#zI;v|0ThUMR z{?xy*SVF!6m%z~kaJ39!{37+{iH1g;d!U8}rPQ0be7PiY5-Jm6#u-`%clS}L2AiIf z&7mr<9sNzHM!NXVdAIiRuWSp8iwTS(#@UUHW=+dT?P2&IeChK|@9U9ozq=i5hOy0k zoFW>n%5G`IiLSb{AQye%7v9pZ|78Cn1?^@3PnD8?MZ5Jq8%)zRr2+%JhcKlm>YRoK zlg8!Vgqv2G4Q*|lzKh=JZ`+ratQ|u~6NY($4y8X^S}ofa84fZLZkt{?!Gn$cvmUri z+a9m|tf*}FJGLt`t9i<5Er;2!F|Brp@q)KE*RUqx)>`%gB{knbf4m~7fE$S{ZY@&Y z3HrNZ-*rGE0Z&j3{QaK=01@}`L_9y+ga_E1W3Gzf09e5t*(Ji3u09F1vyu?B~DJn(sQ z=>8hB`i;czjKO3bUy-5Gx>YR%aO_o1^qd;NFK_Jb?bUrdI|237SEz7)dlM>)Jb}2v zQ)c8@zDXT@)yds!KC&Hyv?f#>wb=(={YK}X{oy*Z?$Nn?>h8N0Uq(-cmj6@NNaXAL zyTem8^7yE|$#4==PDZnW-h!L_K0eys9v!?aHEr^`Ei3z#E$xMagYrYsKTD<-UTYfgl65o6AUHMc?f}*kzKKii|6y~fDVpSVB{?NqN zw_$t&Rb#ZqM*J?6KVwql7W&sjU$uJn$1WN}7%3tJj#YlR|IhqibtYMuo11@Rh|C=m zf}W(n)sT%<55vzh@5TDqL>4C`k^(T1?E+e8b`OQ3;Dw3f=DSXA1^jUm^FbDw>{ifD zLHb7wc2#vVLg^aO<31u=d#EhC5J}1|!8YH#afM|}Z*Om|O>Ldt7GS+VrWx(f)jQO2&N! zcE(A~DHmPmGNV3nx|t-kE^>AJxXNur_r;;9ZjxIigGqcFG=LqxjBYz)m%fi4#T48O zpLe)Lfb<=%{fUKbUb_96PCutOJo+31s%FxUO?-e?2LY*B?vZ_daBN zll?yEfBZ+N;tG=I&m~ccm{2j^=_{ob{rKUNSSlvu^6Zsk)H1(D+DE<%r&q6E8>Zne z&d+Z%GolwAYhwK^t|^&)y3u~#5lS=|eAsgO`|d(a#P4X>ZkAhPK-05pY_W+UyyCdq zAD@vE7#M4&Y$U5LaU-e1m_dS+{?{DU% zR@qryVlgFQziqr|6gTnhCxaq`U2t%FrE8&fTm}zC*b>%KO|0K%Zd~(Gf>VN}6f_b!*36*e!h!F`PNv+cOXs z&`<0s=+qS*+$A`>xDcicNfWa$?tN5UWA~H7k@>k%Uv5w!BMVi^V>8B%&Ud5*^A;8s zf>UABGczKAq$ODdlFwl|0YaY%M_Dl@jaQpOSiKwr)}j(}1X{Rawz{*U;5BE5g&lET-W@?-hB=|`M8q0ADz0lKMorfTW*0%y)kvTH)XHnw{{?8 z?dQgFWK+FcQJHBLXLNAxhfsPf+Wa(YcB|^&#=*7!CeE3gGr!08vdC{R7vOy#J&rR; zU9Yxe(OFHp@&sB`WS5#*x&xW*{q~tVdT%y;PTO>v1&@Rld|S&Ekl=h@@mv$eN`2o@f!_q^OX4z_#`}7E zzY@I4^0R97@&;y(ur@4S^{@j4)|oLCvbKo>ZhLA%;<&(`Mb@FR#+|He&{9eb6; zDK9MFR$M%A{@|!Z>MGUmB zwj(w%9ozMUd*6}172Xe6qn{RXuJpt(_-D@BetLbvdCia?AiZ`izi;G=w8XLo(f5xX z49H)7>24)6pQtVWj1Pk0K?*gxIO_o|*~iwQs?KbsfnC7Re&eU}=c@hB?oazQX2O-c zD`n4tYfAk3)wC;Ef3&Q>n3$N+y{Aj#Fh4kI3f4 z+$X!kQj+jN2$qw>vvXl9X*%xM9;an*pZ9i*cIuuL>^tN&UD4w2%`@NbP=tZXlZE~ZPAy0JGXA}tJ3tflf04iK?q2F@b!_e>uqrh{TCxyVvDZeC=c}MNwPl^ z=_Y91HAI#Lym*&Gf4d2s#FHs^bN;+0-*pmj(zznAs;WCX7sX|O;fSlGA)AT`u=P7L z<;Aa34`Nt08@UV^Kzjw&DKtFa)%PNC-x=qBHM{>S<6fyNF-+3)ujbAL7$iMwFxm6G z`Axin5mrK`ws~#j^Mj!SevxZat)*Fueqc(Kx6KLu<>g%MtDkKSv$~7TyR+B-^-?H4 zV3!KMJhQW@eqD69NJYZ-pDFpti7y_WrUr?9_>j}&J5_U&D)s3YV+R;m7R(!EoT)$c zJ}PmNW)TLb4@{|dOihx)RQ}ghy#=k^Dx~=a{BA*qSM_7~iSBN~OV2^xN?GT5JUn*15u%c^xkN@d-+`cU{KQ;|3R%ipSq^naI8r znMd?L)%ap4)AOSF^;y_hm9nLx{X{!AiQ;H3IusE9-d@RCH*f>$qUz@M{v(bU3!y6*l^xWH6 z>>|Ng)(=?LdU|!&?{`diKhaplr>K|}o%{*&E*fA-)4zUZOG$KR!Ful*Pug!YoatO# zo}l*XHo5JQ1i^|VTi3+#fTPLk^qz%#aA|X*(G<3w>Z2k-c=z+2{7(*d&Fb2}JA63h zda5_fkravz4_SWXRE0_BT3M{ImvRvetH&#^3-)lMdz68_pX+HVLZ=X{YpFIIGzOcvrRQDLD)*VJ# zzs~YM2*z%w7rML3d|(VnMG!sQgC|mnh_!2?f_GRxWSQq|k^+-{E9ZpXb&>i|#R5=&OH?}t`TA8Y|$2WKr&(=C7fa?;MFg}ONo!PXdjlnH{!?;KvYU|32fjrj*uW*Z2uQ&0 z^&oc-Ig$NZL?FpT0Y{fkBQ7f*fx#K$mBFVI-P6fl58Sg$Lo`P)K>>tcD+?z__c9K_ z-G=_%dR`dsA!NP=cE5~EH!?2$!NrSc;El@Mm=`x{k~JyCK!S2^ncev`QL%^ z(v1icF})SD!*S5A!quGa;fXWOx5yzl=+;Qmnhxi3<7r@5GmS1%e zLCNeTVdhbE*qW1*qv@-!;M4AZZ7Z^TUrJ}&kyBBQNhP80RxP#%m)?jYF6i=Dy(lbJ z<`BWQDR$7&Cm#TaN(qk6(!NOAq`rdKZ1WbNTo15XC56q_IB7K4wD{>E4H={UEh@F) zvin#P)PIo2>u$~!Dr#%Bd*+ui=CuoB!TMIOJ815HtD~f|Ir7%2@cxsORfP}7zEo(f z4bhgFy`O$^B$Xrd3VMG*!+DkC6ain7PE}vqo44sqyn?11_7jCF8eucz6sU@JzdlM; zCGdL0X%a_|I?q_$mw|BmcF%wAM#VL|Dej44)YSIMc7Bw5QY+NtUJp6dlu(d?Gk95( zDW<3k5ZE004i2LxFopWlx|UD3jW_|iGY7dtT?%4z)@0sqIb&p5Xn!t+){}sq_2ZJa zXtR$zu$y}{04X(lvTNnv>DiJ%6ZuD4{0?zONQCpU?M165in%`gxRun+hYT_t_V9TS zCdXpzu1LI>0}Jq)2cT){T@F=4@vkHJinopf-W)4nopY8QM!ZEYGJKv!?b_-Rv5VRVrc>C_{2ov6v*P@;-4mOmyE-rGj{n$6-L{qTX55S z@3zQn=8)hKdOmq)ofxv#nXQQiEJY|^7)?hGS%09^AreiP;bJ-sZxL9#gFQ2G%AYB{ zHj@3a8#dqIrmCZpG~H%zZ*R0pI1!(a@G3$=US9rBTX6IALlG6veqyOX-`#WM-(%Fdq))e{mJ$D^N)YM0gfxAhJ@d+)tE=&hrj%|ei1#gmOtnzKjT~Zxp!o=e04{olM@8RXnc;A z4t76%4-E)CDf>6TIIy@Ln_t8KRL^I6g zz3*W`hv=O`c<=FgUn<5ZmpS=joBw-|0y3t;-3kW(GeoNqm^r_5*QWO*?!%jwd`@&$ z$IX*lRUyKghS0HomT_y5C^{-FrK`s0tDZnAx}m^B2;56a%Dn$zBkM4awI1@BK20g~ zf+q;Z)xVjqJ>f{jCw1N8jC&zZBK=h^E#Rl||w4_?AQtc6P%f!{-~AGBAVjJ8ayF z4U#U{TKnGQ@JRP&PpD0E(mR_+K0G4Z`TeSF$eJ#=rb7+BmLAv_he)idu8>1uucx`b z`--3B+o|=~&mPeuy10sd7SN%OipLq7wFtJ&uRy4&QT?(iIj6(Fm`z=5c-LZH z=SC;w@FDM`p5A2$GEuCpP^|sdYX6rNC348Y#i^*gM1A^CtSH|!sc5L+?3J?IwUBJ7 zQYr_-%jJbSLJ+eotmYMGp~@{S)o2>&=urH5^_Gl?h)AC%8|*3O{s$iV9$9bJ30vJB z$6=#+|18f(xheRX1}uP4RtUOMUgiQ%T93xoZZ>EwW~w;}qKX!v9jr&EE7y@`BOfr3 z4Su}Zz7F?M-}-LxXeu80OBmolhPb=aO0=PJPx3*$u&df}C?B(N(?I81N#McmZr3-h zFCVx3kAE_k-n}9)ebY+TQlW4)8%U1~Ida^`Z$6`<+PXMscW0fqR)}3jr@!;t?9V9M z8>zw0qTm@Td2cb~ysJ(ru=|{q%nxQIZ)G%oD@gwHgR6gvm~ZV4vC_nknNk5uk~_^l z2l~BTR#sO30IkT#$b3vDBxGs0K#*~&wZ5({2Lyv!TU)me4j2!a6P|(?s(29o6rP?{ zNiRtGzTP@NYFSw}L7CU}%dGEnzSt`qSDK*W=b&+KJl}Mo6LR*&Wfi%i%utX&e|zq# zLYUAhDd?EC@I=OBv{YslP~r8FfN!U=7bF&6b2%P0?<`ja*k<`R89A-*3W1^y1!T%wf}>c%Sd-)<`<1C+fSLrzLsO;d^9!%QDGOX=U4I zqAv$mtfm#FbgS3mChI|e2a5@1~IdSZC%tH?W`(vsN?z9?o5)DVFW9Q z^~975{NIYI({R(r2;I9XFE2L*^T%~eeZABU!t?Y7CAyCt92z4)B%UZ*}FxkoZ z5n54bY-seccU8LJ$QRVxsd}ckl4eP4HZHad_LT&VO}7~Pj=VZ)JkYOJXA*F6KS7B8 zIP)loGz7mDk_aO3+$>aGg)e^|UMnVKVP{tcYbj^M;2wSH>dHh>B~0VK5e;R1)u{Im znlYS84h{|;?BX`A`fJ}wS@5ksO9V9VZk_gO2#oQFVFuo!!_QDJr`Q&uaG#fkhciyd z1sRi_q6~-V#vS|7dlSI*Q5qbCwG9nUshxrl^gwR8vKTI*Kh_*@SqS+V%cxJOeFE^B ze4Zp4?T$)?Ib*?6NN#z#RzTvvas}w=*`Bh?`O)5#dab*p)7YK=w|D1H?b>cjl2hRJ zKv{+O(e*?y{tv@b9D8u<3dUoMDjx0Sh3qi{aO z%1Y(%k)og6~7Ko^4FR1mlXn5y(F3Nk^EB@KL72R?$MAM4b>r$6l>AzE!)w2{ES zIuo0pQ7hzeA7jORuP0m_hM03C(&PXOQ&%3ge03D zSR>ps6*S^S^uNEwI3sMiNl=s(^Bt__I5IWRGujrUc%QFh^(~WTzHppO&_O@!AW5CA z_%YXr&{5BR^4ain8v-D*T7RavhTn5QfQWwnvpBF$*Vfh+%X(e+`bb3g^V-_zNAuO7 z!KpWtejNVDD^{7AelSu>s~PALVGyK}67+I=HdvW_BW0&DToxAe5hh8RJqYvl^7`?) zuKpk3$(+-$47~~BCR4H|x5*=(sE1m%1vQp>`gnUk8}Z-&bH`+Boi3@*WBc9nuPri( zzB)APU7IqIy$ovK1SL6*nhOWWhnP^#Fx46ieKp_QRq_Dry~@x(!xlH-!Z|i~z8DX)J{^t$q1kB(8k$6PK(P z8E9Ic&cfhNwj!UOSE`jJIbniQCvLd=af_+fCRo@ zKQ>c=Orx>*m|x#*#97nSOlO|)1=X9(qX~u?gY%OSi*-lYB0# zzZz?J;xo2jTJ3;O=1FHV$!tV&pHKIlpL8fcP5iL&U?NPRdO6_wBGqI$NzlDI?VYFO z?nnAYz{K3#=S;%Vp|ziJ1yz#dL;_#h+7x!aTS>A^CSH*zBqWUIW_#~VHpT8~ zR|xtWNP67Le2F-mz4NBCP!Kr^##Gm3|00K+vCoX)?yIy}2&X1=tS z65UdrQMXUU$aKCz6lLF#OXoaAATviLbKlRvC__l&<;sI^Hmw3C1YhL?jRQto{7-A$ z!e49-rj8$gdCaFX?(evBp>)`a>gq1gk zhX1`Ox1E^#SUeyw{%X=sPAX@H5&BkZvnw+!GD|e~cdK0V-iXL94;U);rdB|1U+^3e zcw|(HsQvC*ucDOpm(V8`{*W%FB8h^8<_Bd2NV_w_oUesVRUZD23&1WDoRwW^a9z>(A*L^yC3-o5)_WFJ|U zojlS)uF%v)W142u4Lr{U&`YE;F)QGa6^nYp=JuuW)zEhNKGHH5Kd^j4gI-SZ6U*e^Uw0ej`+ z2NJDk`b%5lH&O{f;F9XXxBkU28|aWlk^<5FX4oB?%{mUb(hMBm{H6( zgF$XWOKb(^xzV*KLYA8;m0nN2b^MJhx$ElS;GoYI!LATw`tT&j0@s%ZTJRS#s;KTC zn8W7OKJ4W$$+qM5TT-i}wsA>78J!nS%y{EkG2ZOu$*unL{-i zCkxUhR2xUyf-w|LPZhQ;Pa~MEg|^u?d>ecY%nSA)lI)!(zMO;5ZzNVTCk$Q@HcZHg zCnI}HBIb3za#=q6B@-hw{p1SIE@M7~l>7;?<4uT(xgP{=&nqy=nZDY+Zy=t+^0{E8GTonx_1h^o+;^^SOYoc!vQu!sPp*JKcwoh--6?MCN(J-X4TPs;La7SHRaA# zb=h;!kQp`6t0B0fYI)%${PWEcc|Qr954-(3{@cG*PzW*x zrr8T7#d&rRCL%ow34OwnJ?_2b&A^P^#Hc_q{;ar#Iwsze|-rbsDL0#VDZTNV~GgF#5!JX`w3V1szT)q z(-Cu15c2?vK?0V(SV$RSN`GuReIS?y;o56I)41YYJnSb(rsY2P6)Z#Ri1x37GVLN& zZEpGKXHc$05L7Uedao0(%Lf>W>!RGJit&zvFSRws;Vlb^;0>vgtSS@e+BgMb-mTUtVS7E zAt7RgowHB4GB&sPv4&j|Y$vy-mq4{wb|op6$-bHy?w$^o)=eMA69t^2$)9Ocm;Uj9 z3{UMqp=8PQd=sf=_@S@w^xc18<<<`6-^_5rT(5V4+w0@{E=;!AR9Hf>?{be%4m?f~ zlLk7skrTxz47!rk>N=9q4(-ngxE(0m%zeUD5?5I?ZS!EGucA$<2^G+)@a3FlGO~K) zH-pcI&BA+l#aCqzfJ&=*n)7fwo)8gvQQajGeNNDbD7=;Cl&yBH`Z;Wm9YzhN)Z>j; z;ow1dJAEqgX&yf-9qKqKq%3G!>xYqX_^4DTDk3qluh4aO z@nHk_{@R zULnv~?71KW#y3mqk((rVR)0`vrNt}`GP79O=6`tPi3v;}6M`rQrM0@q4T{yxbQ@y< z*_iXfqG9E=EYd zNwj^8Hxw?OT6ovdi&K1M6#{&c53I+kBxO66e9<8p!)uJr!4<#d3kw*IAt(PUi(MC>BYAMnt_3={ z{R)TlY`3X)AeWVu&F@Q$kGGwvu=4l4J_o{@Zyj>;@`yCjL|0uI79S=2K7ws-&+0u_ zqG7Y+kOvD^M<>rN-@A-XTfaaPIB7^^%_DGW7yf)%~wa!s=ojm=3=`khrVZ@cR ztohfgxMEF4K{4!;QurXQh$2e4qFs=fujnEqhK;+##(Pf}C<%XhH{*s>kM8wSZ!nmj zj|skVXM2@?xLwNsuYELH4wn!7(z)A=%RZ&8?zhA~G zbBQ6m(%=nnINR*0j;TK|{OlPuNw&JrPdh9m`S;zmk}TN4!GSq>=fQkKvonX3j7&6m zC4!uIHJ%f2t$L&J=90n#Dn(aZ%u3WZGbObWAM5HyTm=TLXZ)2Bnl(CcM`7gIahD~PMqv6E#%m-Z~Dtcq2f2^S9D0v>mw25agh#|Sm*M9sa0PE6; zm{w<=_tVqHIWAhBAU96rC^Vd~=^ra@=Mp6KlnZcx8q)hqXdQw(-w#YJe7j$UZTm0a zXpA5zM4S>^KN#pUg0vf|2mX*?P3m4h?@B-Bb5v10dl^}Qm|$AwDyj<>FGPd{&DMcw zczp<~zYz~sJT{c1$_eJQmr_7BGklC02k2u%|sr!vW#xjc3 zx{`g5Brzg?4E$*gl&0p8<-4&E8cOhQ30XgTd3pVb#2FT4IXXD-VIJw-PEBF{Nzt`; zJ{yVn^9jxbt+rBDz+uU%WkdArl9+;)G$B4ebgq5bxaEl%aDcxxhXSbm-J2f4BDVz7 zY1Hk4pBeGF9PAuz2V;LJD`YX#A}j{EA5!<6QEahOC{7_#m;>Q59#4cFKoCjW_gUvV z8igV%5)jA93cfHqlut-ZbY{d7gL>Up(DL-Gxl5&cZq$G1tGy8V%xF!+0-Fo2mnqab zM&kOHfFX=!qF|#x!Mz@eG7hM_av@>w5{s6+Y)truE`>i0J_2ruZ&upi~{T;|H%t0m&Cz z^>h-7c_!IP1Vy6r=+i9@9+HV<{Z(W$Er2= zI@Xn+sIu>?eM_+wxoMsyh;1T=ltZCmv%w`htzMQok(Y*I?F(cO%7K#-_ZzT5wx=Lr`D|fqOwTbg zvq30QJOn`+lFj~^xGaBVsWtE)c3ysr2g#qLTtSjY7=8JP{{HB2k#=v>s2 zd#%7wl5SCb(EH;=${)>Yg7Q;v=^S8#I4}9P^KRxj_YlpTP zYlTrv)f5YGWODpA3z?JGR*m$G<;kf1i6b_WUJi0X?)2bWj*PBDyrZyw(c$fr6<0^) z&E!{jlbcnx)T(1PK~!pOsm04PpPGi4PQSxntk|#9;{u zX{MW5^m=c~A+yWxR`JRksrdNXH4@wYe5$fV##J^6r*LGn^QmL^9^oX1I+rmNV z1iR!4cPYGaW_vo6vLh$yU6lWHGCL)0H?j<6YDdnucP{U&*&C11=uZoG$Qt*zNaA5_*x*etwS=2a)_m|co1B#xz{t_Alsjqk5Mu}sgZ7sWlL8c7zeAtzd<#x{~MQDl!Qzoy?f|Gtj$ z`g&A4MCSLjKc=qGDmZJ3RJ2o-OpzYel*(yB0OsGfSg0tjLi5Ii@Y_jvHUGESKfre% zIH9QLLF+e{M|Y*w7^tI;5#2P*ACqkLD@)Si-HLpVtt*T{S ziq|Q8&@4f-TIhl^OX^rZU;CRlyZ!YMQMo7E7&|qOWg!IK{uPCT{`zDbXEwojdP;tr z(h=cizz}r5@UVKI&5O9mF%r!#4zWKc@>XQG%Nfb~A~gG}kujJX2qgqWU3Pr#&~Qea zF|Uj*EX1pF`V-q+UCz{Dn6JHiEO*j>i-aGiyd`!mqWk;mK*N07!Hz`pu)y{(Qu3{YzwT%;}zcvjq1YOF%IcIpFIQ)qp@g%*SnpUj(^Iz=n z#GQ^jYjLY000eE~a)H=XqU;Q5H_o<`)XEhX8_ego%iyaBl|h>#{*0I+UHLESkNL(Q zsO+rkgj?@kc=lpy`a}d!2ry_<;(2ZD&2b1~@v(I$B=5mZ?Mq}Y@uI9v88Lg;I#XD| zheARKnH7H?$nA@sfI5`R#}yj4Bs?hs=H});lI~?UC&Db|=I4($B|=!i_Y@cd2s>?Q z;aAwLRD+;XmGjrKoU!UCZ*ET5t-^i=sB>5nSb##TL)R`VZ9F*IT3nyu!{D606}ev| ze#$Z1)=hB+GDat}X0qW>D&p;$bcixJx}Xk)UwyYS!x^_IlcjhEc(63qAQk>TO}0kW zqU&dng}Q>r9QA>(TQtrewO`?LsgNX;q5*)2W>@HT6s0p_tq*zn2sKRpWx<&$5mtQ0%F=E1HY~ zqB*zV77hH;{#ui!=ttHnTvgb7n3Ek_GP}KH@S-vohp{f; z!Y0w-?#?F~#L7FGw}CWFH#0sMme+ngixpF#3o`0m-aCCL2I2m?LbPEAwO$x$`|zrj z%X&1veKF{Z+$$ysxw1`F`0Z!>iY`wYBkrmkX^=FNktV+y;21Xz)3`V7w1}VMUOqVm z4={C0=+5~z)40UxY5(-5jKc7v0Y&?E>#;K;Q%qYu;=&1YeX%T9V{i#&SHqS^KB5 z%&}PT(`U~HrmUqX-}poSmm)fqohJPy&7#!~T$l_~tY6pLgI7aGKYTM*82sc39#%m7 zr`fy{zrC=t>#A~)Oeo1qh__2@G`U;7{C?jTv3IWmJcbSJr-T{Cq^F_L=|v*mS?Dwl|OZ z77O8x_18@ipU&t9Z{SjSdm@sLj*1#R0(v88y3!LvU85~1R-G6_HBnBJB#4GDZk`k& z0qiVu6nx7gmNOB_C8Dh_ZCH7q`|cN->!~WC$ZL7kRI5n>>-o5n87=^W0oC5KR5NG? z54M^G;?G({{-PdD&@L+{HZTXfCJ$CxCMT!ocds0UW~hE?BJ{)-p51zjyV|`c^7YO? zIhU^5DF5x=(-ss2ZVBw2%-aQ{7f4JDe4pXk4*56(cEv?D%*~(#Wut}m7bVJ-BbRck zB!q9)PLn4NmfPE(Hm2t|)c*R8&z8kus~_OYNIO6w!+R!GyWIz-9`c1HZZAvkHIKCU ze)+?|Pv*_jrQJS$*ycWEl@O~yXf-eKrANtkKc_r!&Q0f%yfWq24dnObK2#-)e_wgW zANx?kmY2eBQmL$$=#zu_m))NRKF`U6Ka5|ZCs7mMwdDQe-XfziZ4&pvcr^o2eF&|h zb3_+ZDMWk`g`lk`i=)V77ptO%5iS=K2|Maf>h(IhGVktP z%|3GVfx(l=kR=nT zaPu&~+O|-Xo3Jxa`{B8M(j0TXa~u>VwB(y@8m}~+VpGc!Rb-L$C6eQAsZP?)d}5Bm zM3+u8_WlG@Or_3yEx~kk@==%fr$y)?8?_{^%Tn?C#6M>j^tm9%zF`%TtX{i(4&CAZ z2uCp;_fc#1v$`+`w823B(!Rpr;#MlUWX_xJ&@?FZbf^k$KE3Qi6WfznL@NZZ3idHg zVhYGXG>h)8CLB$42NFvS9XW|A;9P`z`8f6DA(`9jAe&-&xJc~2wB+rbIO&#m-74AIy8d(A<>)7G>;4N`2M@3^zFRz5V_~fK{lB~oWc9Zk5f(&5dT@>je)~2{lUiM z?Sk1HS45x;VlL-5{Sqxq?~8A!YJ1jNol2>Dw-NB9Zsd z24=h=r?rsB%`m3RY{F%1lJ;*O&M*PuEI0d&vzFJkyuBn?dTkow%FFo zmPbr)$%kvBZj$Ko1o?HcJ1vZeE|YLKJ4^WMxaGYUz!6SEDj~X*J$Alc8{UT;$M5?vjJ13zc6iSmn>nLCo`G=}+r? zxL{=%op76I!CT3)#$eH-hQZg;cW)rst%1{LRm*2=IA|B;Xbk5VakB9izGR1}U#CORu|m#arLLrg!X3 zD_K((Zxel;3aVC-nSCbbB^J^_bEq!2;No1rLvM7xV|X^3xc&p&(8h{WJQ-rBdlcDW zrt{tjKYDF=Q9yW{|LAi9v+N13qG18Rpg7-eRr{!R0rO-b_!VnqFM=~W@!VVB_B88kpL>Zw|NTV4w^!j zX~@LXCrIg%z?mF>hxiO=Y_43h+Bb+;_mBa>^}4VYft0Tyk^zsCf);T4b(`0|cF{yf zzz=_Eq@P{GK14zSbqM#|O4pe+mkY!o2Ov$!hM~3@*R?g_j(kOUFVyVj`Gq4W=hwC$ zfz6N80Kom%*{$!3K?6?HI42WSPWraMQObZ!P#XaGmF)>M-T1ssbQTVO(9h+f1!kECronxXMy~A^YzpNID);AS!1dm^P%&9eyZM)LJ;W!Vvi}@p z;+h7XC;Uj}V+P^KRjBL=xwreflZyausD@br(pvtmztw*Z>x&j~O402`c5^ zc-a6KJX2h?$CSh>=>Mj?q0k~|e`xZtxj!J7g+!8kJDgy(325_Q95*TWlPznwQcf}jbOT)AGqV2Ik;aQTW zoQ{8OBESPQJdyrKn>Q1Ft$pFE_sEVPBvYLSMEjV@WYQ4dc$l)7pmXQxxq}31fhT#0 zSOxR#oj18qtiuK8qnN0K^G0JE&{p@K$uGt#WQszP;pa3~q`z?Xo316=HlQDsX^?25 zSpE@0(!v@ylDIcP5$be4`&{8Y!ZQWdA`8IWK<sBQ9>@a(=oY=1-P&Bm@ki;0%Jch|Wt&^&Ya(Ik zXZ9X^1Us@oTFac*D^1-GsVCLmSYn?$)F;BRX!4%5AxmhJ87a4#-IMm*B=Ow=>A!Fv zhVLtw!4Ecyl_Q1VYQ$I2n@S4C3tr8;t$K1;-NclZT!QRg)>HT=wRtFeGCSZ> zY$S3la|DwujPrwcBqB?h)@hAS9Z8l(s!(Bpf&=pNo_Ezd-l)LmMIpgKr$mbLzO~^t z%$sZ3k%McVzDv=8kS5wkQ0NT|H8SsLlH?HDa>l;_2LKB0fBzTYPRPk1gWs!057|r? zsx@bRP8B^Gk^M7d3li3v$klHapx>@zyrhMBPA>Hj;y)7T==SK9_XeGqoH}v~JYPVv zK?L8W96|OmgW|*slT)mBa}enL36y#1Ohl-n_6Si6nbQB6hP{(2V*2==AM%V$+lu8U zNZlMD$1E#k#&@q%s@W9QTz_o(k{@{4gPHW;Rc7#09(oh_1Yip#=h98lbMGk?sBBT| z^kh}j*=i?L6ejb_Q|ux|rC?{y96OfN{4=voljSA@8DF8p#Q|95n5*d`!HcZp$ZM;gpdz1p#tX?oe31ya6W&;}U`N?-_0CH1?)(EmgWAOQ<=*U+WQB z?%%K1#L*S|j&d-P?V{p!8{x@Av2jmQ5iCi8Ln?#=b*ap z=YF2|eZTMb``+*O|2F&VX|1)_9d@!8h~pU2MD0o_^AcxsRRas5;uVx?(12O@vkCf;^&;9_HYG^4fqYU+E5VK?gaJOU*K^N4=b{J?4O!`7 z-@B{EnC~;+lA}6s-~by3hna=?_3Pr#n+`cCOdi~Ce6_NK^T5(w@}qje7WD+vbE!^t z@zUDdsg;*&0tPN}u4Is}3?M#5%dVKabGM(fD>3CyVy<>E~kCRBs)F~`&D!XJm}IF=((5FG8$s9oV-pokEwN?y{ze)FVSYO z>FB(BE!D8fg>&?Vt&>LayR)q{{*P@eZj2HNRPQ`}zm0(u&Kz98`mTHB*5ZBV?bEcl zGmkgE@O15uO;2N#v|#=6kP1GEt2`Xg^-a}YExh}hbmmN8b&pWm*kIO|4L?!(;Pf+M zR^x|{npWFtag6$U|9GS7U^%;2k#|D1?ggE!k#zQV&5PsIVb=`q7VhFQILBO; zvXox^@w7wV15&|rXJ3{4h7cFX<{sbmvF-q?j{_fhLwB3K%zi&`On@L*-}bcCUN+%L zLK36Ftd?btz_Ij_pX^hc26ME8j7)m8_aj$MO?^!g`?s2{X-K!B@@cSHb-4sA0jUfk zDm3?e`TAVPsVFR%MRsYn@lKO5nL+okjWfX{Wvze#ad%M$5|2kiJh8oK`kL6?=Dr860T6_RI4X~u17%MI&zR7#4@-}dtKsT25K)=tdlvaz>0 z5iwqVc7X4^Oaum6P!<_lM)>ybw*0FX=HG;2%fXgU-DEZZ z0_v?YAg?x?*l;#Xcf2t+Yl*RNhk*LUkW8l2A6XvhMDRU#A>x0=?$u zlCAGEpSx?m9lW${^UsfR+$H_#kMi>h`*rBHI$P!yOOHugX!L(jbv|}uePyLqiQ_HC zeM3Q39=Z7DygXJpE`Ki}H<_5%>@-QE|CEX2RF}Zx%x}E-(*IhZOjt}hs{<;VbD7-T zEK%ru9aGHI%G0>+rWsU=1n2{_ z=;VR+T+5;H&V%ipTIfJ}!SwR4God%aHp4<#h%+i+xRxO9*tTxsXx!8=i1n|2+_%NS zTU&LoZ%X|{E7v4bWitEj5U_j$Eji74I^tYo8+)5=CW4!Ysxw zX%`+ATN8SDRN&3eYo|}Bo>Y`P*=U%SaiKlPI8E(YdNn>m6-W4Ftyeo8Ik6<#W8x;M z^rHRaq!z#9+8Zm!v)>iY#ufa;8(Yi(tNAd+D>~xPn|WfBNW#`#YkOu)5iV1 zDlKHES@blh;?@17=#-*&`um(_B`9;bIOoNClimuqk2W~h+I+M8lp?Lsp0~D%rEch3 zBHQ7Umw(1bjc$+G*vrhuj2QPNjDAzdt&=exl+@1AIcvK$&6#dbQpNeR>iX(!UBl-O z>Ng!Hy}Nt-at9rBBGHsNfzVl+@YyhD_P7@n=4H$#95x0Uf8HE?(A))UI`y#$SjDKP z&eRFcIKiM|dWk)<7k@#0VVWiIaQkJGvy+6Mxy<2xk8OI5lieJ0bY2E~o{1YIK4T*B z$Vw6I8x@kHV4_-V8ny(0)f?Zl!lKLOp9%TlCMJS?)j*M6MfYY>3;l9zA-QerBuv z4FB@I1b$kle0CmFh9e<#r*sf+eKg?(n-oFlLHi53j2fi1v^`Ak-CXQrX6ii(_0c-9 z^wJUd$w_|p%%>DI=tS%0!n?w29sLyaHqRwIJc(SdK6}DbOdeWi>@TrUu?;^FOm$|^ zk7d{kf-n!4aChC!g04dQzF&q~U*&z}EUijVI}7;z-4s-4RbokRU~(0dh<|n5W4|a> zMUfyn(70lW&bC#qE6lBC9DTNb*~k+&I|&C%A^C$RELbP7_-R^X11DH5 z8p@$mP^0ZA#CSIfGueSc zP4}P()1Bz)_1!2EY?OrriniK=qOJF!7#k@RZ!3*n*h!;88(LI$1ECKN^r+Zz1$u5H zi(cBxqUR3B(JKd8^ucKK0cB{ubuXzw=M_3%Aq8;gDA!05PI!)6s36{L1{OS zpp4t{DC^EqlzrzIO7u`dZ*M81Wbbn*+g}5v`Rk#KfJ=zveGD}Q%c91ReJJOi5-JE# zK~3RDP~qdth!kvyazczyeyA}j359T|8OjecMTHTjsQAfs^ghxYl|8dWrO$7miWnPI z677h}V(ii9wL(0og4Kqw z9)va8F?68=L%N?abg2_V*C2cuT*EF5nSQ~L$yW^7gKGn>*>?A^3C;-MV!P zfo3%F_4P%8fq@8CLI~DbC@Lxn#l*xQc=eAG6BE(9ckfVIS{j1SkPzvq6UvKnMg`BD zQSLK0R2c1wiep?+d7KL>P4GtLiFZ-;D_7Kz?2YPD15s^y2>O`u5H)6pqVB@`=u_cy z)KU1Bnb?d>80d&kO-(^~63xy`qp4X8!AFOSL-GGD4~AjCWeuS}BYsOml*B*a ze^18!6p+8h{z~~zBruGfy_5{}Ck=?IeCn&Bq@bXr@+b)h_%nSWM8Piw5(_b87qA~H zDV;ceT!CzkKdk%<01idYmYhF3`=7}eR(}4p5}Cj}1(nJ_Goaw(`QrTl9bf0P@@b%O z0%zfLN}7s-&Yw9@@F}?e0>4~U8Sv*>c#L653djG>z(U^t0zc)vDwzUah7-OR7OJ4| z-^8CMKxW~dFVsT$-zwnWIF@lf~x9yO8D1r)h_~n;#Xl+K)u#pn1zMeGF6X40IvmT zhto=mig5A^bVlFbI?|u`IB!^q=<3xh%q)Pfr$^=h2#_gIIumq8m0u-#r@S0A4M5WtHdQ~7X_0A7gSd*f+9BH?|Ff^1?!aS7B|sQ^xZ3nyTUB|U^EFU9y> zSm=%9Y6N(59G}bp_{?zvRRlULPY87QfB;^HBA$8h1j9{LT`iUxh;uMsjR0*(FsCEL zf#*3+=s9@e2nJZK(5B6J0m!Y0_XB3;rC{jknJlZq$z{N+5qc1&Pl&rph{Uj5BEiI% zK+MIkNWxVN6A}{IM6Lo#H=y9t(=Vl8x~?j4fxrd8rzYf@;Rsg=231v8DLyEMG@z65 zxq$%7Zw%1WTV~GpXXS^04~5Sq5J=IGbrnV;5~86(feA;P0ijKJ0f4|NoB$)vKbU3M zB?^J_PcVezSD6s>^$BM9urtGb#?XM?fG@-+M6Lp;L^20JfJ`AT5bsP-jhTQ?gv!r_ z5l@YenyM=B(E%e^?e6VBKmcce+zN|DfI7$re7y@7&R>H559No0Tu9WE>@i?~npB0w zMPoiV{w7K*;H~%@2RQzP3l}uuVT3RPVkDj|lpfC>%Owzjk>_+6c4rq*n6E@i9YP(D zOMvqa6vFZ0hnYZeq3sQz6XOJ+37%tB#(0aCx;x0>X8(Q}_-uQx_(CJl=Y>BE3JOml zk6!34bX8S`gh(ibOs+J7)l8@36f2#rtz6qRni$6Kd2nHm;!3z)U<9X*A5X=C-2?7}Q61u@3 zt;h`d<8VZL2Lc43$*$r&lL-I^h6Dp>ObRpb`%*|~?@L!cKIn&B^Bu7eh{GtG$0rXQ zGYULT#EdeGsv!R+a{fZV?-9HkEEJ&-2dK&%P_zW%_+C!obYs2FkvI4}4gmMFJfXftIn^Kl6{0`2c@83phKu|! zGBr;Q=mGlQ_%|b%kO9cq8I!v&c*)4*s9)G*WD0@B{1IjPsq$LC-V4CVg`se~K!hBk z5X9N1aPS*GKIvgq>)F}YSJuLChUuS@E#Q$!Ed1aha`|x%e#3_W1dBZ!zqTnFA3kw$ zaioQRvO6Du$VKxzK9sqN!haLYr&!e@(7*Bg!bccninE3@2drSZ{|0R_X|ey}J(wB_ zfOkz`AEwSln1AQ_10Np2&@+LDt1xwXvH!E-*tvs!{mz~1+1IaSBhR0dNfe&`ad^AL z5vX#po&Su^j^po?m*2VG&5h$Xe9V|&fVYeRbe>oL2A!OQX0Ld;~>3DIFQ;75xtaX$R-TymW; z&rqt4Zr&yS#U;##|LXoXD*Ru9E<98I$tBKX(apQee|4QG5zGrNX+FH*w$F$EpK=H1 z>HU*S7V09z{8x9r{ub()d0v_XE;lqL7`!cUJ}GjcqobLA4;JYP6~^1 zA1hs(o_{)xYyXm9Ouh`sBN)=;b|B zoNy1lPxM7)uYFNnN&u?Mev0aIaoO-o^ro=@hdzG%NR|(GH|C-5O~vTPr!v&t zR*gp5^HG0C73%r&5qIXDC4R+=y$b#qoSIB}F$NRtVz)Z0ii_aR1fdvm` zD*1anq+<%+e?fs@>f?t2!O8#XVToaD75;?BsvfE-Djox)sGItiEO1DGhyMjmU?Fl* z`SeLLf|9c0n_mey1kTJ~;e*Knt&@t!l&h-L&inrYZoQF(#WesV7l5FS7eiSI&qO78p%7$vGCu&0$>LHQ*FX?; zXj}mJg?fU9D4s|7ojw-J$;r6_hsT8@I8W+iStH&QKEJ~+(6{E{WMy69@<31TBCv$> zv{18(O0Wzg7X;di@(&>?9v;AuOU7j-MGR8tF z6hU%oM3L527(T}_36}Y=$Hp@ddyyO-9{vFSAKr&zQyLEhT{H$nQvfs~5MwYbi}0je z1cwKNHM^Z~WAEVPTIh>cEbtTz5atH37_}sr(9o8_{^B_%Dk4J8fRlL@GxM@#%jlOZ zS(m7f7h7350!t@EnGv(Hh*!&=6HGDiV$vd;MIZwns8tXgEnBt(Fm@%AYgR1{rx;Bz zGa{y!m6;Nr6AjBSJ3IqC2Ts-%%*;%92K37c$rYu60elny63n0@WDyB~hQ$Ls&Jo@W zz!8o>za*F3+V^3uC0Le~84%O)o?}XgswlI>>;PT_XNeu!jfGN#Tyk5a;c__BvNBpj zfG#VG2HXq~z@A~~2d6q*%BV9tj~ zGYULN+RPzD1|!mB&4WWNy(YusotuRlr$V8R@J>S}2|u((6mUTI5|unau2oiOH&;BG zLLc9hMlHY_7%swNUec6y=3(9DPG)j}K6D8(e0f>Tm8%QzcpViac-^{rJN7ly77p+y zeR34uRTuIq!|-awO${Y#kv{Qn{QN>%#QsH}+=VFdzsma?+=6$3e%WvJY4$HEQ!wWF zM;MI}rS_q{p8Om5dHM)5q%AA+T+g2mosHbD7Z~`9yGS4JZyVOGy;EjN#LD2{xqmQ= z@OXdr!0FQ(V(HP*F@O1srkHfog-r-XdzGB^b6_9VVKFhk{inx34B15gf;Yp5ds&$g zvCM1VKb!4L__GcSmPN$-SvpKyP>jDD-aYH#^gzBNd=zj%FeOIgj04or#p3w##Q z04mcA^Io9vA6yt@hC~=z{{ie*GDw$UX#EQRCm)8HM*la!@p;Bfv`z zaAD8vL;!aZ|M{!yI3G`TVP}TBIOnkIB)iZ7$S&-w{%`@r35WZin!oOP7dqO)Zud9W z3C{z<3odCs{NHuk=kfl@CGTq?pTD|`^?}PCp#Ek+Xp6gZxbPfzK?H%j7&pbm_o+N! zWx+1)Q^{{2AObgd+2_j-&zL{S zIE-RI%N^g3M%gKl_oC!|=uJ*keTN^_2W(&5gT8b9rMr~usW7j*BoDev3h1TVNtAR) zmAu!)_n8GjI-rN7k8(q=`k1_#@~UfyMQVPJ&eddkXZ5 z7W9nNLC@$iSd%u;Ihxlq(gQuC1^ps3h%<*hBd%j~1LAE!CkNLt!uN}AZf@lLqK}Wy zAG$@)o;@S$7RATMBX|^}w{PE~l#~>dk&%Jk$9tlZ_?xIPBM>!Y1fhn^5Y$u!M>RDyzwPk~P)~CS>S-wj9iUP)(w2w%V2{`L zr2&rqhQJUJd1m{{~h`~MsI7+OKrqJ$obo!1Jc)KcvgT zBU4;_&mPeS3k=NTQ&AnY!Z6?cva);hjjvp}yvXHzx}P6*j+xnf|Ni|zLPA1(+qP{6 z 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%0Dg?fUi3+pYzmFJX3ep`@u^)X?l+4x0p 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