1addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver/* 2addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * Copyright 2011, Google Inc. 3addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * All rights reserved. 4addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * 5addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * Redistribution and use in source and binary forms, with or without 6addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * modification, are permitted provided that the following conditions are 7addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * met: 8addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * 9addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * * Redistributions of source code must retain the above copyright 10addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * notice, this list of conditions and the following disclaimer. 11addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * * Redistributions in binary form must reproduce the above 12addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * copyright notice, this list of conditions and the following disclaimer 13addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * in the documentation and/or other materials provided with the 14addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * distribution. 15addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * * Neither the name of Google Inc. nor the names of its 16addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * contributors may be used to endorse or promote products derived from 17addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * this software without specific prior written permission. 18addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * 19addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver */ 31addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 32addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver#include <stdio.h> 33addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver#include <dlfcn.h> 34addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 35addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruvertypedef struct InlineOperation { 36addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver void * func; 37addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver const char* classDescriptor; 38addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver const char* methodName; 39addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver const char* methodSignature; 40addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver} InlineOperation; 41addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 42addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruvertypedef const InlineOperation* (*dvmGetInlineOpsTablePtr)(); 43addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruvertypedef int (*dvmGetInlineOpsTableLengthPtr)(); 44addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 45addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruvervoid main(int argc, char **argv) { 46addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver int i; 47addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 48addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver void *libdvm = dlopen("libdvm.so", RTLD_LAZY); 49addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 50addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver if (libdvm == NULL) { 51addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver printf("Failed to load libdvm\n"); 52addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver return; 53addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver } 54addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 55addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver dvmGetInlineOpsTablePtr dvmGetInlineOpsTable = dlsym(libdvm, "dvmGetInlineOpsTable"); 56addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 57addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver if (dvmGetInlineOpsTable == NULL) { 58addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver printf("Failed to load dvmGetInlineOpsTable\n"); 59addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver dlclose(libdvm); 60addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver return; 61addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver } 62addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 63addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver dvmGetInlineOpsTableLengthPtr dvmGetInlineOpsTableLength = dlsym(libdvm, "dvmGetInlineOpsTableLength"); 64addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 65addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver if (dvmGetInlineOpsTableLength == NULL) { 66addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver printf("Failed to load dvmGetInlineOpsTableLength\n"); 67addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver dlclose(libdvm); 68addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver return; 69addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver } 70addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 71addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver const InlineOperation *inlineTable = dvmGetInlineOpsTable(); 72addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver int length = dvmGetInlineOpsTableLength(); 73addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 74addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver for (i=0; i<length; i++) { 75addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver InlineOperation *item = &inlineTable[i]; 76addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 77addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver printf("%s->%s%s\n", item->classDescriptor, item->methodName, item->methodSignature); 78addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver } 79addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver 80addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver dlclose(libdvm); 81addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver return; 82addb2dcdd4a3e74f45b0cb880a62de0ef7655918Ben Gruver}