mirror of git://gcc.gnu.org/git/gcc.git
next-mapping.h: Add copyright header.
gcc/testsuite: * objc-obj-c++-shared/next-mapping.h: Add copyright header. Split type definitions and NSConstantString class into... * objc-obj-c++-shared/objc-test-suite-types.h: New. * objc-obj-c++-shared/nsconstantstring-class.h: New. * objc-obj-c++-shared/nsconstantstring-class-impl.h: New. * objc-obj-c++-shared/nsconstantstring-class-impl.m: New. * objc-obj-c++-shared/nsconstantstring-class-impl.mm: New. * objc-obj-c++-shared/next-abi.h: Add copyright header, minor update to comments. * objc-obj-c++-shared/objc-test-suite-next-encode-assist.h: Adjust encode defines for newer NeXT system headers. * obj-c++.dg/template-4.mm: Adjust to use nsconstantstring headers. * obj-c++.dg/torture/strings/string1.mm: Likewise. * objc.dg/foreach-5.m: Likewise. * objc.dg/foreach-2.m: Likewise. * objc.dg/foreach-4.m: Likewise. * objc.dg/torture/strings/string1.m: Likewise. * objc.dg/torture/strings/string2.m: Likewise. * objc.dg/torture/strings/string3.m: Likewise. * objc.dg/torture/strings/string4.m: Likewise. * obj-c++.dg/torture/strings/const-str-3.mm: Adjust to use type header and stand alone. * obj-c++.dg/strings/strings-2.mm: Likewise. * objc.dg/torture/strings/const-str-3.m: Likewise. * objc.dg/strings/strings-2.m: Likewise. * objc.dg/strings/const-str-12b.m: Likewise. From-SVN: r168653
This commit is contained in:
parent
2aa9c6ae42
commit
5826c8d29e
|
@ -1,3 +1,32 @@
|
|||
2011-01-11 Iain Sandoe <iains@gcc.gnu.org>
|
||||
|
||||
* objc-obj-c++-shared/next-mapping.h: Add copyright header.
|
||||
Split type definitions and NSConstantString class into...
|
||||
* objc-obj-c++-shared/objc-test-suite-types.h: New.
|
||||
* objc-obj-c++-shared/nsconstantstring-class.h: New.
|
||||
* objc-obj-c++-shared/nsconstantstring-class-impl.h: New.
|
||||
* objc-obj-c++-shared/nsconstantstring-class-impl.m: New.
|
||||
* objc-obj-c++-shared/nsconstantstring-class-impl.mm: New.
|
||||
* objc-obj-c++-shared/next-abi.h: Add copyright header, minor update
|
||||
to comments.
|
||||
* objc-obj-c++-shared/objc-test-suite-next-encode-assist.h: Adjust
|
||||
encode defines for newer NeXT system headers.
|
||||
* obj-c++.dg/template-4.mm: Adjust to use nsconstantstring headers.
|
||||
* obj-c++.dg/torture/strings/string1.mm: Likewise.
|
||||
* objc.dg/foreach-5.m: Likewise.
|
||||
* objc.dg/foreach-2.m: Likewise.
|
||||
* objc.dg/foreach-4.m: Likewise.
|
||||
* objc.dg/torture/strings/string1.m: Likewise.
|
||||
* objc.dg/torture/strings/string2.m: Likewise.
|
||||
* objc.dg/torture/strings/string3.m: Likewise.
|
||||
* objc.dg/torture/strings/string4.m: Likewise.
|
||||
* obj-c++.dg/torture/strings/const-str-3.mm: Adjust to use type
|
||||
header and stand alone.
|
||||
* obj-c++.dg/strings/strings-2.mm: Likewise.
|
||||
* objc.dg/torture/strings/const-str-3.m: Likewise.
|
||||
* objc.dg/strings/strings-2.m: Likewise.
|
||||
* objc.dg/strings/const-str-12b.m: Likewise.
|
||||
|
||||
2011-01-12 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/32511
|
||||
|
|
|
@ -5,24 +5,24 @@
|
|||
/* { dg-options "-fconstant-string-class=MyTestString" } */
|
||||
/* { dg-options "-mno-constant-cfstrings -fconstant-string-class=MyTestString" { target *-*-darwin* } } */
|
||||
|
||||
/* { dg-additional-sources "../../objc-obj-c++-shared/Object1.mm" } */
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include "../../objc-obj-c++-shared/objc-test-suite-types.h"
|
||||
|
||||
#include <stdlib.h> /* For abort() */
|
||||
|
||||
@interface MyTestString : Object
|
||||
@interface MyTestString
|
||||
{
|
||||
void *dummy_class_ptr;
|
||||
char *string;
|
||||
unsigned int len;
|
||||
}
|
||||
+ initialize;
|
||||
/* All strings should contain the C string 'test'. Call -check to
|
||||
test that this is true. */
|
||||
- (void) check;
|
||||
@end
|
||||
|
||||
@implementation MyTestString
|
||||
+ initialize {return self;}
|
||||
- (void) check
|
||||
{
|
||||
if (len != 4 || string[0] != 't' || string[1] != 'e'
|
||||
|
@ -31,13 +31,7 @@
|
|||
}
|
||||
@end
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
# ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class _MyTestStringClassReference;
|
||||
# else
|
||||
struct objc_class _MyTestStringClassReference;
|
||||
# endif
|
||||
#endif
|
||||
TNS_STRING_REF_T _MyTestStringClassReference; /* Only used by NeXT. */
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
@ -59,6 +53,7 @@ int main (void)
|
|||
}
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
#include <string.h>
|
||||
/* The MyTestString metaclass will need to be initialized before we can
|
||||
send messages to strings. */
|
||||
|
||||
|
|
|
@ -3,17 +3,21 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.mm" } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.mm ../objc-obj-c++-shared/nsconstantstring-class-impl.mm" } */
|
||||
|
||||
#include "../objc-obj-c++-shared/Object1.h"
|
||||
#include "../objc-obj-c++-shared/next-mapping.h"
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
#include "../objc-obj-c++-shared/Object1.h"
|
||||
#include "../objc-obj-c++-shared/next-mapping.h"
|
||||
|
||||
#define CHECK_IF(expr) if(!(expr)) abort()
|
||||
|
||||
template <class ARR, class TYPE> class TestT
|
||||
|
|
|
@ -6,32 +6,26 @@
|
|||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-fconstant-string-class=Foo" } */
|
||||
/* { dg-options "-mno-constant-cfstrings -fconstant-string-class=Foo" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.mm" } */
|
||||
|
||||
#import "../../../objc-obj-c++-shared/Object1.h"
|
||||
#import "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include "../../../objc-obj-c++-shared/objc-test-suite-types.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <memory.h>
|
||||
#include <objc/objc.h>
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/objc-api.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
@interface Foo: Object {
|
||||
@interface Foo {
|
||||
void *dummy_class_ref;
|
||||
char *cString;
|
||||
unsigned int len;
|
||||
}
|
||||
+ initialize;
|
||||
- (char *)customString;
|
||||
@end
|
||||
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class _FooClassReference;
|
||||
#else
|
||||
struct objc_class _FooClassReference;
|
||||
#endif
|
||||
TNS_STRING_REF_T _FooClassReference; /* Only used by NeXT. */
|
||||
|
||||
@implementation Foo : Object
|
||||
@implementation Foo
|
||||
+ initialize {return self;}
|
||||
- (char *)customString {
|
||||
return cString;
|
||||
}
|
||||
|
@ -45,11 +39,14 @@ int main () {
|
|||
abort();
|
||||
printf("Strings are being uniqued properly\n");
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
/* This memcpy has to be done before the first message is sent to a
|
||||
constant string object. Can't be moved to +initialize since _that_
|
||||
is already a message. */
|
||||
|
||||
memcpy(&_FooClassReference, objc_get_class("Foo"), sizeof(_FooClassReference));
|
||||
memcpy(&_FooClassReference, objc_getClass("Foo"), sizeof(_FooClassReference));
|
||||
#endif
|
||||
|
||||
if (strcmp ([string customString], "bla")) {
|
||||
abort ();
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.mm" } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.mm ../../../objc-obj-c++-shared/nsconstantstring-class-impl.mm" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
|
@ -13,6 +13,8 @@
|
|||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../../../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
int main(int argc, char **args)
|
||||
|
|
|
@ -1,3 +1,23 @@
|
|||
/* Check which version of the API and ABI are appropriate for the target.
|
||||
Copyright (C) 2010, 2011 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Iain Sandoe <iains@gcc.gnu.org>
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _OBJC_NEXT_ABI_H_
|
||||
#define _OBJC_NEXT_ABI_H_
|
||||
|
@ -6,9 +26,8 @@
|
|||
*/
|
||||
|
||||
/* By default we do nothing - therefore ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
* is reliable for detecting
|
||||
* (a) versions of the compiler that are transitional to the new next ABI
|
||||
* (b) versions of the target that require the new ABI.
|
||||
* is reliable for detecting versions of the target that require either
|
||||
* API=2, or both API & ABI = 2 (m64 code).
|
||||
*
|
||||
* This applies for versions of OSX >= 10.5 (darwin9).
|
||||
*
|
||||
|
|
|
@ -1,42 +1,79 @@
|
|||
/* Compatibility header between runtimes and APIs.
|
||||
Copyright (C) 2010, 2011 Free Software Foundation, Inc.
|
||||
|
||||
Original Authors: Ziemowit Laski <zlaski@apple.com>
|
||||
David Ayers <d.ayers@inode.at>
|
||||
|
||||
re-work for ObjC2 by Iain Sandoe <iains@gcc.gnu.org>
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _OBJC_NEXT_MAPPING_H_
|
||||
#define _OBJC_NEXT_MAPPING_H_
|
||||
|
||||
/* This file "renames" various ObjC GNU runtime entry points
|
||||
(and fakes the existence of several others)
|
||||
if the NeXT runtime is being used. */
|
||||
/* Authors: Ziemowit Laski <zlaski@apple.com> */
|
||||
/* David Ayers <d.ayers@inode.at> */
|
||||
/* Darwin 64bit/OBJC2 modifications Iain Sandoe */
|
||||
/* This file provides a two-way mapping of API names for the original
|
||||
GNU & NeXT APIs.
|
||||
|
||||
It is being expanded to provide mapping (where possible) between between the
|
||||
older API and API-2.
|
||||
*/
|
||||
|
||||
#include "objc-test-suite-types.h"
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
|
||||
#define CLASSPTRFIELD(x) (x)->class_pointer
|
||||
# define CLASSFIELD class_pointer
|
||||
# define CLASSPTRFIELD(x) (x)->class_pointer
|
||||
# define SUPERCLASS superClass
|
||||
# define OBJC_GETCLASS objc_get_class
|
||||
|
||||
#else
|
||||
/* Includes next-abi.h to set NEXT_OBJC_USE_NEW_INTERFACE etc.*/
|
||||
#ifndef _OBJC_OBJECT1_H_
|
||||
#include "Object1.h"
|
||||
#endif
|
||||
#include <objc/objc-class.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
# ifdef __objc_api_INCLUDE_GNU
|
||||
# define class_createInstance(C, S) class_create_instance(C)
|
||||
# endif
|
||||
# define method_get_types(M) (M)->method_types
|
||||
|
||||
/* Force a definition of nil that is compatible with GNU runtime. */
|
||||
#undef nil
|
||||
#define nil ((id)0)
|
||||
#else /* NeXT */
|
||||
|
||||
#define objc_get_class(C) objc_getClass(C)
|
||||
#define objc_get_meta_class(C) objc_getMetaClass(C)
|
||||
#define class_get_class_method(C, S) class_getClassMethod(C, S)
|
||||
#define class_get_instance_method(C, S) class_getInstanceMethod(C, S)
|
||||
#define sel_get_name(S) sel_getName(S)
|
||||
#define class_create_instance(C) class_createInstance(C, 0)
|
||||
#define class_get_class_name(C) object_getClassName(C)
|
||||
/* Include next-abi.h to set NEXT_OBJC_USE_NEW_INTERFACE etc.*/
|
||||
# include "next-abi.h"
|
||||
|
||||
#define CLASSPTRFIELD(x) (x)->isa
|
||||
# ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
/* API=2. */
|
||||
# include <objc/runtime.h>
|
||||
# else
|
||||
/* API=0. */
|
||||
# include <objc/objc-class.h>
|
||||
# endif
|
||||
|
||||
# define CLASSPTRFIELD(x) (x)->isa
|
||||
# define SUPERCLASS superclass
|
||||
# define OBJC_GETCLASS objc_getClass
|
||||
|
||||
# define objc_get_class(C) objc_getClass(C)
|
||||
# define objc_get_meta_class(C) objc_getMetaClass(C)
|
||||
# define class_get_class_method(C, S) class_getClassMethod(C, S)
|
||||
# define class_get_instance_method(C, S) class_getInstanceMethod(C, S)
|
||||
# define sel_get_name(S) sel_getName(S)
|
||||
# define class_create_instance(C) class_createInstance(C, 0)
|
||||
# define class_get_class_name(C) object_getClassName(C)
|
||||
# define objc_lookup_class(N) objc_lookUpClass(N)
|
||||
|
||||
# ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
# define object_class_name(O) (object_getClassName(O))
|
||||
# define object_get_class(O) (object_getClass((id)O))
|
||||
# define object_get_super_class(O) class_get_super_class(object_get_class(O))
|
||||
|
@ -51,7 +88,8 @@
|
|||
# define class_is_meta_class(C) (class_isMetaClass((Class)C) ? YES: NO)
|
||||
# define class_is_class(C) (class_is_meta_class(C) == NO)
|
||||
|
||||
#else
|
||||
# else /* OLD API */
|
||||
|
||||
# define object_class_name(O) (O->name)
|
||||
# define object_get_super_class(O) class_get_super_class(*(struct objc_class **)O)
|
||||
# define object_get_class(O) (*(struct objc_class **)O)
|
||||
|
@ -64,94 +102,8 @@
|
|||
# define class_get_super_class(C) (((struct objc_class *)C)->super_class)
|
||||
# define class_is_meta_class(C) (CLS_GETINFO((struct objc_class *)C, CLS_META)? YES: NO)
|
||||
# define class_is_class(C) (CLS_GETINFO((struct objc_class *)C, CLS_CLASS)? YES: NO)
|
||||
#endif
|
||||
|
||||
#define objc_lookup_class(N) objc_lookUpClass(N)
|
||||
# endif /* NEXT_OBJC_USE_NEW_INTERFACE */
|
||||
|
||||
/* You need either an empty +initialize method or an empty -forward:: method.
|
||||
The NeXT runtime unconditionally sends +initialize to classes when they are
|
||||
first used, and unconditionally tries to forward methods that the class
|
||||
doesn't understand (including +initialize). If you have neither +initialize
|
||||
nor -forward::, the runtime complains.
|
||||
|
||||
The simplest workaround is to add
|
||||
|
||||
+ initialize { return self; }
|
||||
|
||||
to every root class @implementation. */
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
|
||||
/* A small, portable NSConstantString implementation for use with the NeXT
|
||||
runtime.
|
||||
|
||||
On full-fledged Mac OS X systems, NSConstantString is provided
|
||||
as part of the Foundation framework. However, on bare Darwin systems,
|
||||
Foundation is not included, and hence there is no NSConstantString
|
||||
implementation to link against.
|
||||
|
||||
This code is derived from the GNU runtime's NXConstantString implementation.
|
||||
*/
|
||||
|
||||
/* This definition cut out of <objc/Object.h> with the OBJC2 deprecation
|
||||
messages removed.
|
||||
*/
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class {
|
||||
Class isa;
|
||||
#if NEXT_OBJC_ABI_VERSION < 2
|
||||
Class super_class ;
|
||||
const char *name ;
|
||||
long version ;
|
||||
long info ;
|
||||
long instance_size ;
|
||||
struct anon *ivars ; /* objc_ivar_list */
|
||||
struct anon1 **methodLists ; /* objc_method_list */
|
||||
struct objc_cache *cache ;
|
||||
struct objc_protocol_list *protocols ;
|
||||
#endif
|
||||
} _NSConstantStringClassReference ;
|
||||
#else
|
||||
struct objc_class _NSConstantStringClassReference ;
|
||||
#endif
|
||||
|
||||
@interface NSConstantString : Object
|
||||
{
|
||||
char *c_string;
|
||||
unsigned int len;
|
||||
}
|
||||
|
||||
-(const char *) cString;
|
||||
-(unsigned int) length;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSConstantString
|
||||
|
||||
-(const char *) cString
|
||||
{
|
||||
return (c_string);
|
||||
}
|
||||
|
||||
-(unsigned int) length
|
||||
{
|
||||
return (len);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/* The NSConstantString metaclass will need to be initialized before we can
|
||||
send messages to strings. */
|
||||
|
||||
void objc_constant_string_init (void) __attribute__((constructor));
|
||||
void objc_constant_string_init (void) {
|
||||
memcpy (&_NSConstantStringClassReference,
|
||||
objc_getClass ("NSConstantString"),
|
||||
sizeof (_NSConstantStringClassReference));
|
||||
}
|
||||
|
||||
#endif /*__NEXT_RUNTIME__ */
|
||||
# endif /*__NEXT_RUNTIME__ */
|
||||
#endif /* _OBJC_NEXT_MAPPING_H_ */
|
|
@ -0,0 +1,61 @@
|
|||
/* A small NSConstantString implementation for use with the NeXT runtime.
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Iain Sandoe <iains@gcc.gnu.org>
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
|
||||
#include "nsconstantstring-class.h"
|
||||
#include <string.h>
|
||||
|
||||
/* On full-fledged Mac OS X systems, NSConstantString is provided
|
||||
as part of the Foundation framework. However, on bare Darwin systems,
|
||||
Foundation is not included, and hence there is no NSConstantString
|
||||
implementation to link against.
|
||||
|
||||
This code is derived from the GNU runtime's NXConstantString implementation.
|
||||
*/
|
||||
|
||||
@implementation NSConstantString
|
||||
/* NeXT requires this or forward: */
|
||||
+initialize { return self; }
|
||||
|
||||
-(const char *) cString
|
||||
{
|
||||
return (c_string);
|
||||
}
|
||||
|
||||
-(unsigned int) length
|
||||
{
|
||||
return (len);
|
||||
}
|
||||
@end
|
||||
|
||||
TNS_STRING_REF_T _NSConstantStringClassReference;
|
||||
|
||||
/* The NSConstantString metaclass will need to be initialized before we can
|
||||
send messages to strings. */
|
||||
|
||||
void objc_constant_string_init (void) __attribute__((constructor));
|
||||
void objc_constant_string_init (void) {
|
||||
memcpy (&_NSConstantStringClassReference,
|
||||
objc_getClass ("NSConstantString"),
|
||||
sizeof (_NSConstantStringClassReference));
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,3 @@
|
|||
/* Allow code to be shared between the FEs but avoid issues with
|
||||
C++-only flags. */
|
||||
#include "nsconstantstring-class-impl.h"
|
|
@ -0,0 +1,3 @@
|
|||
/* Allow code to be shared between the FEs but avoid issues with
|
||||
C++-only flags. */
|
||||
#include "nsconstantstring-class-impl.h"
|
|
@ -0,0 +1,51 @@
|
|||
/* A small NSConstantString implementation for use with the NeXT runtime.
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _test_suite_nsconstantstring_class_h_
|
||||
#define _test_suite_nsconstantstring_class_h_
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
|
||||
/* On full-fledged Mac OS X systems, NSConstantString is provided
|
||||
as part of the Foundation framework. However, on bare Darwin systems,
|
||||
Foundation is not included, and hence there is no NSConstantString
|
||||
implementation to link against.
|
||||
|
||||
This code is derived from the GNU runtime's NXConstantString implementation.
|
||||
*/
|
||||
|
||||
#include "objc-test-suite-types.h"
|
||||
|
||||
extern TNS_STRING_REF_T _NSConstantStringClassReference;
|
||||
|
||||
@interface NSConstantString
|
||||
{
|
||||
Class isa;
|
||||
char *c_string;
|
||||
unsigned int len;
|
||||
}
|
||||
|
||||
+ (id) initialize;
|
||||
|
||||
- (const char *) cString;
|
||||
- (unsigned int) length;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __NEXT_RUNTIME__ */
|
||||
#endif /* _test_suite_nsconstantstring_class_h_ */
|
|
@ -10,6 +10,13 @@ typedef void * PMETH;
|
|||
#else
|
||||
#include <objc/objc-runtime.h>
|
||||
typedef struct objc_method * PMETH;
|
||||
|
||||
/* Missing from old NeXT objc headers... */
|
||||
#define _C_LNG_LNG 'q'
|
||||
#define _C_ULNG_LNG 'Q'
|
||||
#define _C_ATOM '%'
|
||||
#define _C_BOOL 'B'
|
||||
|
||||
#endif
|
||||
|
||||
/* The NeXT headers do not define NULL. */
|
||||
|
@ -17,24 +24,6 @@ typedef struct objc_method * PMETH;
|
|||
#define NULL 0
|
||||
#endif
|
||||
|
||||
/* The NeXT runtimes do not include these functions (at least not through
|
||||
any public API). They are required for the objc/execute/bf-* and bycopy-3. */
|
||||
|
||||
/* Not sure why the following are missing from NeXT objc headers... */
|
||||
|
||||
#ifndef _C_LNG_LNG
|
||||
#define _C_LNG_LNG 'q'
|
||||
#endif
|
||||
#ifndef _C_ULNG_LNG
|
||||
#define _C_ULNG_LNG 'Q'
|
||||
#endif
|
||||
#ifndef _C_ATOM
|
||||
#define _C_ATOM '%'
|
||||
#endif
|
||||
#ifndef _C_BOOL
|
||||
#define _C_BOOL 'B'
|
||||
#endif
|
||||
|
||||
#define _C_CONST 'r'
|
||||
#define _C_IN 'n'
|
||||
#define _C_INOUT 'N'
|
||||
|
@ -53,7 +42,8 @@ typedef struct objc_method * PMETH;
|
|||
#define _F_ONEWAY 0x10
|
||||
#define _F_GCINVISIBLE 0x20
|
||||
|
||||
/* Functions available in the GNU runtime, emulated here for testing with NeXT. */
|
||||
/* The NeXT runtimes do not include these functions (at least not through
|
||||
any public API). They are required for the objc/execute/bf-* and bycopy-3. */
|
||||
|
||||
struct objc_struct_layout
|
||||
{
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
/* Define test-suite types to minimize conditional test-case source.
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
Contributed by Iain Sandoe
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _OBJC_TEST_SUITE_TYPES_H_
|
||||
#define _OBJC_TEST_SUITE_TYPES_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define ProtoBool bool
|
||||
#else
|
||||
#define ProtoBool _Bool
|
||||
#endif
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
|
||||
#define METHOD Method_t
|
||||
#define IVAR_T struct objc_ivar
|
||||
|
||||
/* dummy const string class ref. */
|
||||
typedef void * TNS_STRING_REF_T;
|
||||
|
||||
#else /* NeXT */
|
||||
|
||||
#include "next-abi.h"
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
#include <objc/runtime.h>
|
||||
#else
|
||||
#include <objc/objc-runtime.h>
|
||||
#endif
|
||||
|
||||
/* Force a definition of nil that is compatible with GNU runtime. */
|
||||
#undef nil
|
||||
#define nil ((id)0)
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#define METHOD Method
|
||||
|
||||
/* Where there are equivalent interfaces between APIs we substitute
|
||||
a macro or typedef. */
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
typedef void * PMETH;
|
||||
#define IVAR_T Ivar
|
||||
#else
|
||||
typedef struct objc_method * PMETH;
|
||||
#define IVAR_T struct objc_ivar
|
||||
#endif
|
||||
|
||||
#ifdef __OBJC2__
|
||||
/* Const String Class ref. */
|
||||
typedef Class TNS_STRING_REF_T;
|
||||
#else
|
||||
/* Const String Class ref. */
|
||||
/* We need objc_class - but we don't need endless reminders that it's deprecated. */
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
typedef struct objc_class TNS_STRING_REF_T;
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif /*__NEXT_RUNTIME__ */
|
||||
#endif /* _OBJC_TEST_SUITE_TYPES_H_ */
|
|
@ -5,12 +5,14 @@
|
|||
/* { dg-skip-if "No NeXT fast enum. pre-Darwin9" { *-*-darwin[5-8]* } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m ../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#include "../objc-obj-c++-shared/Object1.h"
|
||||
#include "../objc-obj-c++-shared/next-mapping.h"
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
extern int printf (const char *, ...);
|
||||
|
|
|
@ -5,12 +5,14 @@
|
|||
/* { dg-skip-if "No NeXT fast enum. pre-Darwin9" { *-*-darwin[5-8]* } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m ../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#import "../objc-obj-c++-shared/Object1.h"
|
||||
#import "../objc-obj-c++-shared/next-mapping.h"
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
extern int printf (const char *, ...);
|
||||
|
|
|
@ -5,12 +5,14 @@
|
|||
/* { dg-skip-if "No NeXT fast enum. pre-Darwin9" { *-*-darwin[5-8]* } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
|
||||
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m ../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#import "../objc-obj-c++-shared/Object1.h"
|
||||
#import "../objc-obj-c++-shared/next-mapping.h"
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
extern int printf (const char *, ...);
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
/* { dg-options "-fconstant-string-class=Foo" } */
|
||||
/* { dg-options "-mno-constant-cfstrings -fconstant-string-class=Foo" { target *-*-darwin* } } */
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1.h"
|
||||
#import "../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include <objc/Object.h>
|
||||
#include "../../objc-obj-c++-shared/objc-test-suite-types.h"
|
||||
|
||||
@interface Foo: Object {
|
||||
char *cString;
|
||||
|
@ -19,11 +19,7 @@
|
|||
+ (Foo *) getString: (int) which;
|
||||
@end
|
||||
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class _FooClassReference;
|
||||
#else
|
||||
struct objc_class _FooClassReference;
|
||||
#endif
|
||||
TNS_STRING_REF_T _FooClassReference; /* Only used by NeXT. */
|
||||
|
||||
@implementation Bar
|
||||
+ (Foo *) getString: (int) which {
|
||||
|
|
|
@ -5,24 +5,25 @@
|
|||
/* { dg-options "-fconstant-string-class=MyTestString" } */
|
||||
/* { dg-options "-mno-constant-cfstrings -fconstant-string-class=MyTestString" { target *-*-darwin* } } */
|
||||
|
||||
/* { dg-additional-sources "../../objc-obj-c++-shared/Object1.m" } */
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include "../../objc-obj-c++-shared/objc-test-suite-types.h"
|
||||
|
||||
#include <stdlib.h> /* For abort() */
|
||||
|
||||
@interface MyTestString : Object
|
||||
@interface MyTestString
|
||||
{
|
||||
void *dummy_class_ptr;
|
||||
char *string;
|
||||
unsigned int len;
|
||||
}
|
||||
+ initialize;
|
||||
/* All strings should contain the C string 'test'. Call -check to
|
||||
test that this is true. */
|
||||
- (void) check;
|
||||
@end
|
||||
|
||||
@implementation MyTestString
|
||||
+ initialize {return self;}
|
||||
|
||||
- (void) check
|
||||
{
|
||||
if (len != 4 || string[0] != 't' || string[1] != 'e'
|
||||
|
@ -31,13 +32,7 @@
|
|||
}
|
||||
@end
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
# ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class _MyTestStringClassReference;
|
||||
# else
|
||||
struct objc_class _MyTestStringClassReference;
|
||||
# endif
|
||||
#endif
|
||||
TNS_STRING_REF_T _MyTestStringClassReference; /* Only used by NeXT. */
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
@ -61,6 +56,7 @@ int main (void)
|
|||
#ifdef __NEXT_RUNTIME__
|
||||
/* The MyTestString metaclass will need to be initialized before we can
|
||||
send messages to strings. */
|
||||
#include <string.h>
|
||||
|
||||
void testsuite_mytest_string_init (void) __attribute__((constructor));
|
||||
void testsuite_mytest_string_init (void) {
|
||||
|
|
|
@ -4,28 +4,27 @@
|
|||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-options "-fconstant-string-class=Foo" } */
|
||||
/* { dg-options "-mno-constant-cfstrings -fconstant-string-class=Foo" { target *-*-darwin* } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include "../../../objc-obj-c++-shared/objc-test-suite-types.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@interface Foo: Object {
|
||||
@interface Foo {
|
||||
void *dummy_class_ref;
|
||||
char *cString;
|
||||
unsigned int len;
|
||||
}
|
||||
+ initialize;
|
||||
- (char *)customString;
|
||||
@end
|
||||
|
||||
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
|
||||
struct fudge_objc_class _FooClassReference;
|
||||
#else
|
||||
struct objc_class _FooClassReference;
|
||||
#endif
|
||||
TNS_STRING_REF_T _FooClassReference; /* Only used by NeXT. */
|
||||
|
||||
@implementation Foo
|
||||
+ initialize {return self;}
|
||||
|
||||
@implementation Foo : Object
|
||||
- (char *)customString {
|
||||
return cString;
|
||||
}
|
||||
|
@ -39,11 +38,13 @@ int main () {
|
|||
abort();
|
||||
printf("Strings are being uniqued properly\n");
|
||||
|
||||
#ifdef __NEXT_RUNTIME__
|
||||
/* This memcpy has to be done before the first message is sent to a
|
||||
constant string object. Can't be moved to +initialize since _that_
|
||||
is already a message. */
|
||||
is already a message. */
|
||||
|
||||
memcpy(&_FooClassReference, objc_get_class("Foo"), sizeof(_FooClassReference));
|
||||
memcpy(&_FooClassReference, objc_getClass("Foo"), sizeof(_FooClassReference));
|
||||
#endif
|
||||
if (strcmp ([string customString], "bla")) {
|
||||
abort ();
|
||||
}
|
||||
|
|
|
@ -1,18 +1,17 @@
|
|||
/* Based on a test case contributed by Nicola Pero. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-options "-mno-constant-cfstrings -Wno-deprecated-declarations" { target *-*-darwin* } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../../../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
int main(int argc, void **args)
|
||||
|
|
|
@ -1,18 +1,17 @@
|
|||
/* Based on a test case contributed by Nicola Pero. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-options "-mno-constant-cfstrings -Wno-deprecated-declarations" { target *-*-darwin* } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#include "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../../../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
int main(int argc, void **args)
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/* Based on a test case contributed by Nicola Pero. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-options "-mno-constant-cfstrings -Wno-deprecated-declarations" { target *-*-darwin* } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#import "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../../../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
#define STRING "this is a string"
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/* Based on a test case contributed by Nicola Pero. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-mno-constant-cfstrings" { target *-*-darwin* } } */
|
||||
/* { dg-options "-mno-constant-cfstrings -Wno-deprecated-declarations" { target *-*-darwin* } } */
|
||||
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
|
||||
/* { dg-additional-sources "../../../objc-obj-c++-shared/nsconstantstring-class-impl.m" } */
|
||||
|
||||
#include "../../../objc-obj-c++-shared/Object1.h"
|
||||
#import "../../../objc-obj-c++-shared/next-mapping.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef __NEXT_RUNTIME__
|
||||
#include <objc/NXConstStr.h>
|
||||
#else
|
||||
#include "../../../objc-obj-c++-shared/nsconstantstring-class.h"
|
||||
#endif
|
||||
|
||||
int main(int argc, void **args)
|
||||
|
|
Loading…
Reference in New Issue