/* * Copyright (c) 2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ #include <stdlib.h> #include "test.h" // PASS(), FAIL(), XPASS(), XFAIL() int resolverCallCount = 0; int realTestCallCount = 0; void test$FOO(); void test$FOO() { //printf("test\n"); ++realTestCallCount; } void* test_chooser() __asm__("_test"); void* test_chooser() { __asm__(".symbol_resolver _test"); //printf("resolver\n"); ++resolverCallCount; return test$FOO; } void test(); static void (*t)(void) = test; void check() { t(); // call through initialized pointer t = test; // re-assign pointer via non-lazy-poitner t(); // call agin through pointer test(); // call through stub if ( resolverCallCount != 1 ) FAIL("symbol-resolver-pointer: resolved called %d times", resolverCallCount); else if ( realTestCallCount != 3 ) FAIL("symbol-resolver-pointer: real test function called %d times", realTestCallCount); else PASS("symbol-resolver-pointer"); }