Merge change 24415 into eclair

* changes:
  Move ARM disassembler out of libacc and into the acc command-line tool.
This commit is contained in:
Android (Google) Code Review 2009-09-09 16:32:58 -04:00
commit 0e1f612d5d
8 changed files with 76 additions and 90 deletions

View file

@ -77,6 +77,12 @@ void accGetScriptLabel(ACCscript* script, const ACCchar * name,
void accGetPragmas(ACCscript* script, ACCsizei* actualStringCount, void accGetPragmas(ACCscript* script, ACCsizei* actualStringCount,
ACCsizei maxStringCount, ACCchar** strings); ACCsizei maxStringCount, ACCchar** strings);
/* Used to implement disassembly */
void accGetProgramBinary(ACCscript* script,
ACCvoid** base,
ACCsizei* length);
#ifdef __cplusplus #ifdef __cplusplus
}; };
#endif #endif

View file

@ -7,10 +7,6 @@ include $(CLEAR_VARS)
LOCAL_MODULE:= libacc LOCAL_MODULE:= libacc
LOCAL_SRC_FILES := acc.cpp LOCAL_SRC_FILES := acc.cpp
ifeq ($(TARGET_ARCH),arm)
LOCAL_SRC_FILES += disassem.cpp
endif
LOCAL_SHARED_LIBRARIES := libdl libcutils LOCAL_SHARED_LIBRARIES := libdl libcutils
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)
@ -24,10 +20,6 @@ LOCAL_SRC_FILES := acc.cpp
LOCAL_CFLAGS := -O0 -g LOCAL_CFLAGS := -O0 -g
ifeq ($(TARGET_ARCH),arm)
LOCAL_SRC_FILES += disassem.cpp
endif
LOCAL_STATIC_LIBRARIES := libcutils LOCAL_STATIC_LIBRARIES := libcutils
LOCAL_LDLIBS := -ldl LOCAL_LDLIBS := -ldl

View file

@ -39,10 +39,6 @@
#define PROVIDE_X64_CODEGEN #define PROVIDE_X64_CODEGEN
#endif #endif
#ifdef PROVIDE_ARM_CODEGEN
#include "disassem.h"
#endif
#if (defined(__VFP_FP__) && !defined(__SOFTFP__)) #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
#define ARM_USE_VFP #define ARM_USE_VFP
#endif #endif
@ -55,7 +51,6 @@
#define LOG_STACK(...) do {} while(0) #define LOG_STACK(...) do {} while(0)
// #define LOG_STACK(...) fprintf (stderr, __VA_ARGS__) // #define LOG_STACK(...) fprintf (stderr, __VA_ARGS__)
#define ENABLE_ARM_DISASSEMBLY
// #define PROVIDE_TRACE_CODEGEN // #define PROVIDE_TRACE_CODEGEN
// Uncomment to save input to a text file in DEBUG_DUMP_PATTERN // Uncomment to save input to a text file in DEBUG_DUMP_PATTERN
@ -484,11 +479,6 @@ class Compiler : public ErrorSink {
*/ */
virtual void adjustStackAfterCall(Type* pDecl, int l, bool isIndirect) = 0; virtual void adjustStackAfterCall(Type* pDecl, int l, bool isIndirect) = 0;
/* Print a disassembly of the assembled code to out. Return
* non-zero if there is an error.
*/
virtual int disassemble(FILE* out) = 0;
/* Generate a symbol at the current PC. t is the head of a /* Generate a symbol at the current PC. t is the head of a
* linked list of addresses to patch. * linked list of addresses to patch.
*/ */
@ -695,9 +685,9 @@ class Compiler : public ErrorSink {
public: public:
ARMCodeGenerator() { ARMCodeGenerator() {
#ifdef ARM_USE_VFP #ifdef ARM_USE_VFP
LOGD("Using ARM VFP hardware floating point."); // LOGD("Using ARM VFP hardware floating point.");
#else #else
LOGD("Using ARM soft floating point."); // LOGD("Using ARM soft floating point.");
#endif #endif
} }
@ -1764,24 +1754,6 @@ class Compiler : public ErrorSink {
#endif #endif
} }
virtual int disassemble(FILE* out) {
#ifdef ENABLE_ARM_DISASSEMBLY
disasmOut = out;
disasm_interface_t di;
di.di_readword = disassemble_readword;
di.di_printaddr = disassemble_printaddr;
di.di_printf = disassemble_printf;
int base = getBase();
int pc = getPC();
for(int i = base; i < pc; i += 4) {
fprintf(out, "%08x: %08x ", i, *(int*) i);
::disasm(&di, i, 0);
}
#endif
return 0;
}
/** /**
* alignment (in bytes) for this type of data * alignment (in bytes) for this type of data
*/ */
@ -1833,27 +1805,6 @@ class Compiler : public ErrorSink {
} }
private: private:
static FILE* disasmOut;
static u_int
disassemble_readword(u_int address)
{
return(*((u_int *)address));
}
static void
disassemble_printaddr(u_int address)
{
fprintf(disasmOut, "0x%08x", address);
}
static void
disassemble_printf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(disasmOut, fmt, ap);
va_end(ap);
}
static const int BRANCH_REL_ADDRESS_MASK = 0x00ffffff; static const int BRANCH_REL_ADDRESS_MASK = 0x00ffffff;
@ -2783,10 +2734,6 @@ class Compiler : public ErrorSink {
return 5; return 5;
} }
virtual int disassemble(FILE* out) {
return 0;
}
/* output a symbol and patch all calls to it */ /* output a symbol and patch all calls to it */
virtual void gsym(int t) { virtual void gsym(int t) {
int n; int n;
@ -3114,10 +3061,6 @@ class Compiler : public ErrorSink {
return mpBase->jumpOffset(); return mpBase->jumpOffset();
} }
virtual int disassemble(FILE* out) {
return mpBase->disassemble(out);
}
/* output a symbol and patch all calls to it */ /* output a symbol and patch all calls to it */
virtual void gsym(int t) { virtual void gsym(int t) {
fprintf(stderr, "gsym(%d)\n", t); fprintf(stderr, "gsym(%d)\n", t);
@ -5755,15 +5698,6 @@ public:
return true; return true;
} }
int dump(FILE* out) {
fwrite(codeBuf.getBase(), 1, codeBuf.getSize(), out);
return 0;
}
int disassemble(FILE* out) {
return pGen->disassemble(out);
}
/* Look through the symbol table to find a symbol. /* Look through the symbol table to find a symbol.
* If found, return its value. * If found, return its value.
*/ */
@ -5796,10 +5730,14 @@ public:
} }
} }
void getProgramBinary(ACCvoid** base, ACCsizei* length) {
*base = codeBuf.getBase();
*length = (ACCsizei) codeBuf.getSize();
}
char* getErrorMessage() { char* getErrorMessage() {
return mErrorBuf.getUnwrapped(); return mErrorBuf.getUnwrapped();
} }
}; };
const char* Compiler::operatorChars = const char* Compiler::operatorChars =
@ -5813,10 +5751,6 @@ const char Compiler::operatorLevel[] =
2, 2 /* ~ ! */ 2, 2 /* ~ ! */
}; };
#ifdef PROVIDE_ARM_CODEGEN
FILE* Compiler::ARMCodeGenerator::disasmOut;
#endif
#ifdef PROVIDE_X86_CODEGEN #ifdef PROVIDE_X86_CODEGEN
const int Compiler::X86CodeGenerator::operatorHelper[] = { const int Compiler::X86CodeGenerator::operatorHelper[] = {
0x1, // ++ 0x1, // ++
@ -6014,8 +5948,9 @@ void accGetPragmas(ACCscript* script, ACCsizei* actualStringCount,
} }
extern "C" extern "C"
void accDisassemble(ACCscript* script) { void accGetProgramBinary(ACCscript* script,
script->compiler.disassemble(stderr); ACCvoid** base, ACCsizei* length) {
script->compiler.getProgramBinary(base, length);
} }

View file

@ -21,7 +21,8 @@ include $(CLEAR_VARS)
LOCAL_MODULE:= acc LOCAL_MODULE:= acc
LOCAL_SRC_FILES:= \ LOCAL_SRC_FILES:= \
main.cpp main.cpp \
disassem.cpp
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libacc libacc

View file

@ -20,6 +20,14 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#if defined(__arm__)
#define PROVIDE_ARM_DISASSEMBLY
#endif
#ifdef PROVIDE_ARM_DISASSEMBLY
#include "disassem.h"
#endif
#include <acc/acc.h> #include <acc/acc.h>
@ -29,15 +37,57 @@ int run(MainPtr mainFunc, int argc, char** argv) {
return mainFunc(argc, argv); return mainFunc(argc, argv);
} }
// Private API for development:
extern "C"
void accDisassemble(ACCscript* script);
ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) { ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) {
return (ACCvoid*) dlsym(RTLD_DEFAULT, name); return (ACCvoid*) dlsym(RTLD_DEFAULT, name);
} }
#ifdef PROVIDE_ARM_DISASSEMBLY
static FILE* disasmOut;
static u_int
disassemble_readword(u_int address)
{
return(*((u_int *)address));
}
static void
disassemble_printaddr(u_int address)
{
fprintf(disasmOut, "0x%08x", address);
}
static void
disassemble_printf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(disasmOut, fmt, ap);
va_end(ap);
}
static int disassemble(ACCscript* script, FILE* out) {
disasmOut = out;
disasm_interface_t di;
di.di_readword = disassemble_readword;
di.di_printaddr = disassemble_printaddr;
di.di_printf = disassemble_printf;
ACCvoid* base;
ACCsizei length;
accGetProgramBinary(script, &base, &length);
unsigned long* pBase = (unsigned long*) base;
unsigned long* pEnd = (unsigned long*) (((unsigned char*) base) + length);
for(unsigned long* pInstruction = pBase; pInstruction < pEnd; pInstruction++) {
fprintf(out, "%08x: %08x ", (int) pInstruction, *pInstruction);
::disasm(&di, (uint) pInstruction, 0);
}
return 0;
}
#endif // PROVIDE_ARM_DISASSEMBLY
int main(int argc, char** argv) { int main(int argc, char** argv) {
const char* inFile = NULL; const char* inFile = NULL;
bool printListing; bool printListing;
@ -121,7 +171,9 @@ int main(int argc, char** argv) {
} }
if (printListing) { if (printListing) {
accDisassemble(script); #ifdef PROVIDE_ARM_DISASSEMBLY
disassemble(script, stderr);
#endif
} }
if (runResults) { if (runResults) {