Only in ecl-8.12.0: build
Only in ecl-8.12.0: Makefile
diff -u -r ecl-8.12.0-orig/src/c/arch/ffi_x86.d ecl-8.12.0/src/c/arch/ffi_x86.d
--- ecl-8.12.0-orig/src/c/arch/ffi_x86.d	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/c/arch/ffi_x86.d	2009-02-23 02:21:33.000000000 -0500
@@ -47,6 +47,16 @@
 		ecl_fficall_align(sizeof(int));
 		ecl_fficall_push_int(i);
 		break;
+#ifdef HAVE_LONG_LONG
+	case ECL_FFI_LONG_LONG:
+	  ecl_fficall_align(sizeof(int));
+	  ecl_fficall_push_bytes(&data->ll, sizeof(long long));
+	  break;
+	case ECL_FFI_UNSIGNED_LONG_LONG:
+	  ecl_fficall_align(sizeof(int));
+	  ecl_fficall_push_bytes(&data->ull, sizeof(unsigned long long));
+	  break;
+#endif /* HAVE_LONG_LONG */
 	case ECL_FFI_DOUBLE:
 		ecl_fficall_align(sizeof(int));
 		ecl_fficall_push_bytes(&data->d, sizeof(double));
@@ -88,6 +98,12 @@
 #endif
 	if (return_type <= ECL_FFI_UNSIGNED_LONG) {
 		fficall->output.i = ((int (*)())f_ptr)();
+#ifdef HAVE_LONG_LONG
+	} else if (return_type == ECL_FFI_LONG_LONG) {
+	  fficall->output.ll = ((long long * (*)())f_ptr)();
+	} else if (return_type == ECL_FFI_UNSIGNED_LONG_LONG) {
+	  fficall->output.ull = ((unsigned long long * (*)())f_ptr)();
+#endif /* HAVE_LONG_LONG */
 	} else if (return_type == ECL_FFI_POINTER_VOID) {
 		fficall->output.pv = ((void * (*)())f_ptr)();
 	} else if (return_type == ECL_FFI_CSTRING) {
@@ -190,6 +206,8 @@
 	}
 	case ECL_FFI_VOID:
 		return;
+	default:
+	  FEerror("Unknown return type from Lisp callback", 0);
 	}
 }
 
diff -u -r ecl-8.12.0-orig/src/c/ffi.d ecl-8.12.0/src/c/ffi.d
--- ecl-8.12.0-orig/src/c/ffi.d	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/c/ffi.d	2009-02-23 02:28:54.000000000 -0500
@@ -28,6 +28,10 @@
 	@':unsigned-int',
 	@':long',
 	@':unsigned-long',
+#ifdef HAVE_LONG_LONG
+	@':long-long',
+	@':unsigned-long-long',
+#endif /* HAVE_LONG_LONG */
 	@':pointer-void',
 	@':cstring',
 	@':object',
@@ -51,6 +55,10 @@
 	sizeof(unsigned int),
 	sizeof(long),
 	sizeof(unsigned long),
+#ifdef HAVE_LONG_LONG
+	sizeof(long long),
+	sizeof(unsigned long long),
+#endif /* HAVE_LONG_LONG */
 	sizeof(void *),
 	sizeof(char *),
 	sizeof(cl_object),
diff -u -r ecl-8.12.0-orig/src/c/main.d ecl-8.12.0/src/c/main.d
--- ecl-8.12.0-orig/src/c/main.d	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/c/main.d	2009-02-23 05:59:06.000000000 -0500
@@ -542,6 +542,9 @@
 #ifdef ECL_DYNAMIC_FFI
 	ADD_FEATURE("DFFI");
 #endif
+#ifdef HAVE_LONG_LONG
+	ADD_FEATURE("LONG-LONG");
+#endif
 #ifdef ECL_UNICODE
 	ADD_FEATURE("UNICODE");
 #endif
diff -u -r ecl-8.12.0-orig/src/c/symbols_list2.h ecl-8.12.0/src/c/symbols_list2.h
--- ecl-8.12.0-orig/src/c/symbols_list2.h	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/c/symbols_list2.h	2009-02-23 05:28:50.000000000 -0500
@@ -1410,6 +1410,7 @@
 {KEY_ "FLOAT",NULL},
 {KEY_ "INT",NULL},
 {KEY_ "LONG",NULL},
+{KEY_ "LONG-LONG",NULL},
 {KEY_ "POINTER-SELF",NULL},
 {KEY_ "POINTER-VOID",NULL},
 {KEY_ "SHORT",NULL},
@@ -1420,6 +1421,7 @@
 {KEY_ "UNSIGNED-CHAR",NULL},
 {KEY_ "UNSIGNED-INT",NULL},
 {KEY_ "UNSIGNED-LONG",NULL},
+{KEY_ "UNSIGNED-LONG-LONG",NULL},
 {KEY_ "UNSIGNED-SHORT",NULL},
 {SYS_ "C-CHAR-BIT",NULL},
 {SYS_ "C-CHAR-MAX",NULL},
diff -u -r ecl-8.12.0-orig/src/c/symbols_list.h ecl-8.12.0/src/c/symbols_list.h
--- ecl-8.12.0-orig/src/c/symbols_list.h	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/c/symbols_list.h	2009-02-23 05:20:39.000000000 -0500
@@ -1410,6 +1410,7 @@
 {KEY_ "FLOAT", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "INT", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "LONG", KEYWORD, NULL, -1, OBJNULL},
+{KEY_ "LONG-LONG", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "POINTER-SELF", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "POINTER-VOID", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "SHORT", KEYWORD, NULL, -1, OBJNULL},
@@ -1420,6 +1421,7 @@
 {KEY_ "UNSIGNED-CHAR", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "UNSIGNED-INT", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "UNSIGNED-LONG", KEYWORD, NULL, -1, OBJNULL},
+{KEY_ "UNSIGNED-LONG-LONG", KEYWORD, NULL, -1, OBJNULL},
 {KEY_ "UNSIGNED-SHORT", KEYWORD, NULL, -1, OBJNULL},
 {SYS_ "C-CHAR-BIT", SI_CONSTANT, NULL, -1, MAKE_FIXNUM(CHAR_BIT)},
 {SYS_ "C-CHAR-MAX", SI_CONSTANT, NULL, -1, MAKE_FIXNUM(CHAR_MAX)},
diff -u -r ecl-8.12.0-orig/src/cmp/cmpcbk.lsp ecl-8.12.0/src/cmp/cmpcbk.lsp
--- ecl-8.12.0-orig/src/cmp/cmpcbk.lsp	2008-12-17 10:41:52.000000000 -0500
+++ ecl-8.12.0/src/cmp/cmpcbk.lsp	2009-02-23 06:21:17.000000000 -0500
@@ -56,6 +56,8 @@
     (:unsigned-int . "ECL_FFI_UNSIGNED_INT")
     (:long . "ECL_FFI_LONG")
     (:unsigned-long . "ECL_FFI_UNSIGNED_LONG")
+    ;; #+long-long (:long-long . "ECL_FFI_LONG_LONG")
+    ;; #+long-long (:unsigned-long-long . "ECL_FFI_UNSIGNED_LONG_LONG")
     (:pointer-void . "ECL_FFI_POINTER_VOID")
     (:cstring . "ECL_FFI_CSTRING")
     (:object . "ECL_FFI_OBJECT")
diff -u -r ecl-8.12.0-orig/src/h/object.h ecl-8.12.0/src/h/object.h
--- ecl-8.12.0-orig/src/h/object.h	2008-12-17 10:41:53.000000000 -0500
+++ ecl-8.12.0/src/h/object.h	2009-02-23 01:12:56.000000000 -0500
@@ -602,6 +602,10 @@
 	ECL_FFI_UNSIGNED_INT,
 	ECL_FFI_LONG,
 	ECL_FFI_UNSIGNED_LONG,
+#ifdef HAVE_LONG_LONG
+	ECL_FFI_LONG_LONG,
+	ECL_FFI_UNSIGNED_LONG_LONG,
+#endif /* HAVE_LONG_LONG */
 	ECL_FFI_POINTER_VOID,
 	ECL_FFI_CSTRING,
 	ECL_FFI_OBJECT,
@@ -621,6 +625,10 @@
 	unsigned short us;
 	long l;
 	unsigned long ul;
+#ifdef HAVE_LONG_LONG
+	long long ll;
+	unsigned long long ull;
+#endif /* HAVE_LONG_LONG */
 	void *pv;
 	char *pc;
 	cl_object o;
diff -u -r ecl-8.12.0-orig/src/lsp/ffi.lsp ecl-8.12.0/src/lsp/ffi.lsp
--- ecl-8.12.0-orig/src/lsp/ffi.lsp	2008-12-17 10:41:53.000000000 -0500
+++ ecl-8.12.0/src/lsp/ffi.lsp	2009-02-23 06:08:19.000000000 -0500
@@ -62,7 +62,10 @@
   (and (symbolp name)
        (member name '(:byte :unsigned-byte :short :unsigned-short
 		      :int :unsigned-int :char :unsigned-char
-		      :long :unsigned-long :pointer-void :object
+		      :long :unsigned-long 
+		      #+long-long :long-long 
+		      #+long-long :unsigned-long-long
+		      :pointer-void :object
 		      :float :double :cstring)
 	       :test 'eq)))
 

