1*753d2d2eSraf /* 2*753d2d2eSraf * CDDL HEADER START 3*753d2d2eSraf * 4*753d2d2eSraf * The contents of this file are subject to the terms of the 5*753d2d2eSraf * Common Development and Distribution License, Version 1.0 only 6*753d2d2eSraf * (the "License"). You may not use this file except in compliance 7*753d2d2eSraf * with the License. 8*753d2d2eSraf * 9*753d2d2eSraf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*753d2d2eSraf * or http://www.opensolaris.org/os/licensing. 11*753d2d2eSraf * See the License for the specific language governing permissions 12*753d2d2eSraf * and limitations under the License. 13*753d2d2eSraf * 14*753d2d2eSraf * When distributing Covered Code, include this CDDL HEADER in each 15*753d2d2eSraf * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*753d2d2eSraf * If applicable, add the following below this CDDL HEADER, with the 17*753d2d2eSraf * fields enclosed by brackets "[]" replaced with your own identifying 18*753d2d2eSraf * information: Portions Copyright [yyyy] [name of copyright owner] 19*753d2d2eSraf * 20*753d2d2eSraf * CDDL HEADER END 21*753d2d2eSraf */ 22*753d2d2eSraf /* 23*753d2d2eSraf * Copyright (c) 1997-1999 by Sun Microsystems, Inc. 24*753d2d2eSraf * All rights reserved. 25*753d2d2eSraf */ 26*753d2d2eSraf 27*753d2d2eSraf #pragma ident "%Z%%M% %I% %E% SMI" 28*753d2d2eSraf 29*753d2d2eSraf 30*753d2d2eSraf #include <stdio.h> 31*753d2d2eSraf #include <unistd.h> 32*753d2d2eSraf #include <sys/types.h> 33*753d2d2eSraf #include "parser.h" 34*753d2d2eSraf #include "trace.h" 35*753d2d2eSraf #include "util.h" 36*753d2d2eSraf #include "db.h" 37*753d2d2eSraf #include "symtab.h" 38*753d2d2eSraf #include "io.h" 39*753d2d2eSraf #include "printfuncs.h" 40*753d2d2eSraf #include "errlog.h" 41*753d2d2eSraf #include "parseproto.h" 42*753d2d2eSraf 43*753d2d2eSraf static void generate_interface_predeclaration(char *, ENTRY *); 44*753d2d2eSraf static void generate_linkage_function(char *, char *); 45*753d2d2eSraf 46*753d2d2eSraf 47*753d2d2eSraf /* 48*753d2d2eSraf * generate_linkage -- make code for the linkage part of an individual 49*753d2d2eSraf * interface. Assumes Bodyfp. 50*753d2d2eSraf */ 51*753d2d2eSraf void 52*753d2d2eSraf generate_linkage(ENTRY *function) 53*753d2d2eSraf { 54*753d2d2eSraf char *library_name = db_get_current_library(), 55*753d2d2eSraf *function_name; 56*753d2d2eSraf char composite_name[MAXLINE]; 57*753d2d2eSraf 58*753d2d2eSraf errlog(BEGIN, "generate_linkage() {"); 59*753d2d2eSraf 60*753d2d2eSraf function_name = name_of(function); 61*753d2d2eSraf (void) snprintf(composite_name, sizeof (composite_name), 62*753d2d2eSraf "%s_%s", library_name, function_name); 63*753d2d2eSraf 64*753d2d2eSraf /* Print the predeclaration of the interceptor. */ 65*753d2d2eSraf generate_interface_predeclaration(composite_name, function); 66*753d2d2eSraf /* Collect things we'll use more than once. */ 67*753d2d2eSraf 68*753d2d2eSraf /* Next the struct used to pass parameters. */ 69*753d2d2eSraf (void) fprintf(Bodyfp, "static abisym_t __abi_%s_%s_sym;\n", 70*753d2d2eSraf library_name, function_name); 71*753d2d2eSraf 72*753d2d2eSraf /* The linkage function, */ 73*753d2d2eSraf generate_linkage_function(library_name, function_name); 74*753d2d2eSraf 75*753d2d2eSraf (void) fputs("\n\n", Bodyfp); 76*753d2d2eSraf errlog(END, "}"); 77*753d2d2eSraf } 78*753d2d2eSraf 79*753d2d2eSraf 80*753d2d2eSraf /* 81*753d2d2eSraf * generate_interface_predeclaration -- make things know so the compiler 82*753d2d2eSraf * won't kak. 83*753d2d2eSraf */ 84*753d2d2eSraf static void 85*753d2d2eSraf generate_interface_predeclaration(char *composite_name, ENTRY *function) 86*753d2d2eSraf { 87*753d2d2eSraf decl_t *pp; 88*753d2d2eSraf char *p = symtab_get_prototype(); 89*753d2d2eSraf char buf[BUFSIZ]; 90*753d2d2eSraf 91*753d2d2eSraf (void) fprintf(Bodyfp, "\n/* from \"%s\", line %d */\n", 92*753d2d2eSraf symtab_get_filename(), line_of(function)); 93*753d2d2eSraf (void) fprintf(Bodyfp, "static "); 94*753d2d2eSraf 95*753d2d2eSraf if (p[strlen(p)-1] != ';') 96*753d2d2eSraf (void) snprintf(buf, BUFSIZ, "%s;", strnormalize(p)); 97*753d2d2eSraf else 98*753d2d2eSraf (void) snprintf(buf, BUFSIZ, "%s", strnormalize(p)); 99*753d2d2eSraf 100*753d2d2eSraf decl_Parse(buf, &pp); 101*753d2d2eSraf decl_AddArgNames(pp); 102*753d2d2eSraf symtab_set_prototype(decl_ToString(buf, DTS_DECL, pp, composite_name)); 103*753d2d2eSraf (void) fprintf(Bodyfp, "%s;\n", symtab_get_prototype()); 104*753d2d2eSraf decl_Destroy(pp); 105*753d2d2eSraf } 106*753d2d2eSraf 107*753d2d2eSraf 108*753d2d2eSraf 109*753d2d2eSraf /* 110*753d2d2eSraf * generate_linkage_function -- The linkage function itself. 111*753d2d2eSraf */ 112*753d2d2eSraf static void 113*753d2d2eSraf generate_linkage_function(char *lib, char *func) 114*753d2d2eSraf { 115*753d2d2eSraf (void) fprintf(Bodyfp, 116*753d2d2eSraf "void *__abi_%s_%s(void *real, int vflag) { \n", lib, func); 117*753d2d2eSraf (void) fprintf(Bodyfp, " ABI_REAL(%s, %s) = real;\n", lib, func); 118*753d2d2eSraf (void) fprintf(Bodyfp, " ABI_VFLAG(%s, %s) = vflag;\n", lib, func); 119*753d2d2eSraf (void) fprintf(Bodyfp, 120*753d2d2eSraf " return ((void *) %s_%s);\n}\n", lib, func); 121*753d2d2eSraf } 122