summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/arm/ArchUtility.cc
diff options
context:
space:
mode:
author Elliott Hughes <enh@google.com> 2011-10-14 19:13:56 -0700
committer Elliott Hughes <enh@google.com> 2011-10-16 11:01:28 -0700
commit3b6baaa203fa63f1522b2172a1645f90412afdae (patch)
tree7de428a7d53f2b2b9c2274d49181befd5786b8fa /src/compiler/codegen/arm/ArchUtility.cc
parent7abe9c933402f01d638086b2715b09b64b8595e0 (diff)
Bring our native stack usage down.
I'd have preferred to have a 512-byte limit, but there are some monsters in the verifier; 2000-line functions and the like. I'm also not policing tests (except for one silly one). They can use all the stack they like. This fixes the IntMath test (the stack overflow test was failing because we were using more than 4KiB to throw!). Change-Id: I7e53e2fde2b39fde1910f8ee5b1712e8a66069c7
Diffstat (limited to 'src/compiler/codegen/arm/ArchUtility.cc')
-rw-r--r--src/compiler/codegen/arm/ArchUtility.cc74
1 files changed, 24 insertions, 50 deletions
diff --git a/src/compiler/codegen/arm/ArchUtility.cc b/src/compiler/codegen/arm/ArchUtility.cc
index c4d3b6d780..2a20efa046 100644
--- a/src/compiler/codegen/arm/ArchUtility.cc
+++ b/src/compiler/codegen/arm/ArchUtility.cc
@@ -18,6 +18,8 @@
#include "ArmLIR.h"
#include "../Ralloc.h"
+#include <string>
+
static const char* coreRegNames[16] = {
"r0",
"r1",
@@ -104,11 +106,10 @@ const char* ccNames[] = {"eq","ne","cs","cc","mi","pl","vs","vc",
* Interpret a format string and build a string no longer than size
* See format key in Assemble.c.
*/
-STATIC void buildInsnString(const char* fmt, ArmLIR* lir, char* buf,
- unsigned char* baseAddr, int size)
+STATIC std::string buildInsnString(const char* fmt, ArmLIR* lir, unsigned char* baseAddr)
{
+ std::string buf;
int i;
- char* bufEnd = &buf[size-1];
const char* fmtEnd = &fmt[strlen(fmt)];
char tbuf[256];
const char* name;
@@ -233,21 +234,14 @@ STATIC void buildInsnString(const char* fmt, ArmLIR* lir, char* buf,
default:
strcpy(tbuf,"DecodeError1");
break;
- }
- if (buf+strlen(tbuf) <= bufEnd) {
- strcpy(buf, tbuf);
- buf += strlen(tbuf);
- } else {
- break;
- }
+ }
+ buf += tbuf;
}
} else {
- *buf++ = *fmt++;
+ buf += *fmt++;
}
- if (buf == bufEnd)
- break;
}
- *buf = 0;
+ return buf;
}
void oatDumpResourceMask(LIR* lir, u8 mask, const char* prefix)
@@ -365,19 +359,11 @@ void oatDumpLIRInsn(CompilationUnit* cUnit, LIR* arg, unsigned char* baseAddr)
if (lir->flags.isNop && !dumpNop) {
break;
} else {
- // TODO: rewrite using string
- char opOperands[256];
- char opName[256];
- buildInsnString(EncodingMap[lir->opcode].name, lir, opName,
- baseAddr, 256);
- buildInsnString(EncodingMap[lir->opcode].fmt, lir, opOperands,
- baseAddr, 256);
- char tBuf[256];
- snprintf(tBuf, 256, "%p (%04x): %-9s%s%s%s",
- baseAddr + offset, offset,
- opName, opOperands, lir->flags.isNop ? "(nop)" : "",
- lir->flags.squashed ? "(squashed)" : "");
- LOG(INFO) << tBuf;
+ std::string op_name(buildInsnString(EncodingMap[lir->opcode].name, lir, baseAddr));
+ std::string op_operands(buildInsnString(EncodingMap[lir->opcode].fmt, lir, baseAddr));
+ LOG(INFO) << StringPrintf("%p (%04x): %-9s%s%s%s", baseAddr + offset, offset,
+ op_name.c_str(), op_operands.c_str(), lir->flags.isNop ? "(nop)" : "",
+ lir->flags.squashed ? "(squashed)" : "");
}
break;
}
@@ -453,20 +439,14 @@ void oatCodegenDump(CompilationUnit* cUnit)
}
for (lirInsn = cUnit->classPointerList; lirInsn; lirInsn = lirInsn->next) {
armLIR = (ArmLIR*) lirInsn;
- char buf[100];
- snprintf(buf, 100, "%x (%04x): .class (%s)",
- armLIR->generic.offset, armLIR->generic.offset,
- ((CallsiteInfo *) armLIR->operands[0])->classDescriptor);
- LOG(INFO) << buf;
+ LOG(INFO) << StringPrintf("%x (%04x): .class (%s)",
+ armLIR->generic.offset, armLIR->generic.offset,
+ ((CallsiteInfo *) armLIR->operands[0])->classDescriptor);
}
for (lirInsn = cUnit->literalList; lirInsn; lirInsn = lirInsn->next) {
armLIR = (ArmLIR*) lirInsn;
- char buf[100];
- snprintf(buf, 100, "%x (%04x): .word (%#x)",
- armLIR->generic.offset, armLIR->generic.offset,
- armLIR->operands[0]);
- LOG(INFO) << buf;
-
+ LOG(INFO) << StringPrintf("%x (%04x): .word (%#x)",
+ armLIR->generic.offset, armLIR->generic.offset, armLIR->operands[0]);
}
std::string signature = method->GetSignature()->ToModifiedUtf8();
@@ -474,22 +454,16 @@ void oatCodegenDump(CompilationUnit* cUnit)
std::string descriptor = method->GetDeclaringClass()->GetDescriptor()->
ToModifiedUtf8();
- char buf[256];
-
// Dump mapping table
if (cUnit->mappingTable.size() > 0) {
- sprintf(buf,"\n MappingTable %s%s_%s_mappingTable[%d] = {",
- descriptor.c_str(), name.c_str(), signature.c_str(),
- cUnit->mappingTable.size());
- for (unsigned int i = 0; i < strlen(buf); i++)
- if (buf[i] == ';') buf[i] = '_';
- LOG(INFO) << buf;
- strcpy(buf," ");
+ std::string line(StringPrintf("\n MappingTable %s%s_%s_mappingTable[%d] = {",
+ descriptor.c_str(), name.c_str(), signature.c_str(), cUnit->mappingTable.size()));
+ std::replace(line.begin(), line.end(), ';', '_');
+ LOG(INFO) << line;
for (uint32_t i = 0; i < cUnit->mappingTable.size(); i+=2) {
- sprintf(buf+strlen(buf)," {0x%08x, 0x%04x},",
+ line = StringPrintf(" {0x%08x, 0x%04x},",
cUnit->mappingTable[i], cUnit->mappingTable[i+1]);
- LOG(INFO) << buf;
- strcpy(buf," ");
+ LOG(INFO) << line;
}
LOG(INFO) <<" };\n\n";
}