From d8ddc95315aca00e4ddcf5f4b5ee80d0ac564f92 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Fri, 11 Jul 2014 23:15:09 -0600 Subject: [PATCH 1/5] use c++11 enhanced-for and auto in type-generator --- makefile | 4 +- src/tools/type-generator/main.cpp | 309 ++++++++++++------------------ 2 files changed, 123 insertions(+), 190 deletions(-) diff --git a/makefile b/makefile index 77b3fcaf96..f852d37e64 100755 --- a/makefile +++ b/makefile @@ -378,7 +378,7 @@ warnings = -Wall -Wextra -Werror -Wunused-parameter -Winit-self \ target-cflags = -DTARGET_BYTES_PER_WORD=$(pointer-size) -common-cflags = $(warnings) -fno-rtti -fno-exceptions -I$(classpath-src) \ +common-cflags = $(warnings) -std=c++0x -fno-rtti -fno-exceptions -I$(classpath-src) \ "-I$(JAVA_HOME)/include" -I$(src) -I$(build) -Iinclude $(classpath-cflags) \ -D__STDC_LIMIT_MACROS -D_JNI_IMPLEMENTATION_ -DAVIAN_VERSION=\"$(version)\" \ -DAVIAN_INFO="\"$(info)\"" \ @@ -397,7 +397,7 @@ endif build-cflags = $(common-cflags) -fPIC -fvisibility=hidden \ "-I$(JAVA_HOME)/include/linux" -I$(src) -pthread -converter-cflags = -D__STDC_CONSTANT_MACROS -Iinclude/ -Isrc/ \ +converter-cflags = -D__STDC_CONSTANT_MACROS -std=c++0x -Iinclude/ -Isrc/ \ -fno-rtti -fno-exceptions \ -DAVIAN_TARGET_ARCH=AVIAN_ARCH_UNKNOWN \ -DAVIAN_TARGET_FORMAT=AVIAN_FORMAT_UNKNOWN \ diff --git a/src/tools/type-generator/main.cpp b/src/tools/type-generator/main.cpp index ccb2464650..f11a548e82 100644 --- a/src/tools/type-generator/main.cpp +++ b/src/tools/type-generator/main.cpp @@ -161,16 +161,12 @@ class Class { } ss << " {\n"; - for (std::vector::const_iterator it = fields.begin(); - it != fields.end(); - it++) { - ss << " " << (*it)->dump() << "\n"; + for (const auto f : fields) { + ss << " " << f->dump() << "\n"; } - for (std::set::const_iterator it = methods.begin(); - it != methods.end(); - ++it) { - ss << " " << it->dump() << "\n"; + for (const auto m : methods) { + ss << " " << m.dump() << "\n"; } ss << "}"; return ss.str(); @@ -226,23 +222,23 @@ inline bool endsWith(const std::string& b, const std::string& a) return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin()); } -std::string enumName(Module& module, Field& f) +std::string enumName(Module& module, Field* f) { - std::string& type = f.typeName; + std::string& type = f->typeName; if (type == "void*") { return "word"; } else if (type == "maybe_object") { return "uintptr_t"; - } else if (f.javaSpec.size() != 0 - && (f.javaSpec[0] == 'L' || f.javaSpec[0] == '[')) { + } else if (f->javaSpec.size() != 0 + && (f->javaSpec[0] == 'L' || f->javaSpec[0] == '[')) { return "object"; } - std::map::iterator it = module.classes.find(f.typeName); - assert(f.typeName.size() > 0); + const auto it = module.classes.find(f->typeName); + assert(f->typeName.size() > 0); if (it != module.classes.end()) { return "object"; } else { - return f.typeName; + return f->typeName; } } @@ -408,7 +404,7 @@ unsigned sizeOf(Module& module, const std::string& type) } else if (namesPointer(type)) { return BytesPerWord; } else { - std::map::iterator it = module.classes.find(type); + const auto it = module.classes.find(type); if (it != module.classes.end()) { return BytesPerWord; } else { @@ -459,8 +455,7 @@ class ClassParser { if (fields.find(f.field->name) != fields.end()) { // printf("alias %s.%s -> %s.%s\n", cl->name.c_str(), // f.field->name.c_str(), cl->name.c_str(), f.aliasName.c_str()); - std::map::iterator it - = fields.find(f.field->name); + const auto it = fields.find(f.field->name); assert(it != fields.end()); Field* renamed = it->second; fields.erase(it); @@ -474,11 +469,11 @@ class ClassParser { renamed->javaSpec = f.field->javaSpec; } else { // printf("ignoring absent alias %s.%s -> %s.%s\n", cl->name.c_str(), - // f.field->name.c_str(), cl->name.c_str(), f. aliasName.c_str()); + // f.field->name.c_str(), cl->name.c_str(), f-> aliasName.c_str()); } } else { // printf("ignoring already defined alias %s.%s -> %s.%s\n", - // cl->name.c_str(), f.field->name.c_str(), cl->name.c_str(), f. + // cl->name.c_str(), f.field->name.c_str(), cl->name.c_str(), f-> // aliasName.c_str()); } } else { @@ -508,10 +503,8 @@ class ClassParser { cl->super = super; assert(!super->arrayField); assert(fields.size() == 0); - for (std::vector::iterator it = super->fields.begin(); - it != super->fields.end(); - it++) { - add(FieldSpec(false, *it)); + for (const auto f : super->fields) { + add(FieldSpec(false, f)); } } }; @@ -826,31 +819,27 @@ void layoutClass(Module& module, Class* cl) alignment = BytesPerWord; - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - it++) { - Field& f = **it; + for (const auto f : cl->fields) { + f->elementSize = sizeOf(module, f->typeName); - f.elementSize = sizeOf(module, f.typeName); - - if (!f.polyfill) { // polyfills contribute no size - alignment = f.elementSize; + if (!f->polyfill) { // polyfills contribute no size + alignment = f->elementSize; offset = (offset + alignment - 1) & ~(alignment - 1); - f.offset = offset; + f->offset = offset; - size = f.elementSize; + size = f->elementSize; offset += size; } } if (cl->arrayField) { - Field& f = *cl->arrayField; + Field* f = cl->arrayField; - f.elementSize = sizeOf(module, f.typeName); + f->elementSize = sizeOf(module, f->typeName); - alignment = f.elementSize; + alignment = f->elementSize; offset = (offset + alignment - 1) & ~(alignment - 1); - f.offset = offset; + f->offset = offset; } // offset = (offset + BytesPerWord - 1) & ~(BytesPerWord - 1); cl->fixedSize = offset; @@ -858,10 +847,8 @@ void layoutClass(Module& module, Class* cl) void layoutClasses(Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; layoutClass(module, cl); } } @@ -890,79 +877,69 @@ std::string cppClassName(Class* cl) } } -std::string cppFieldType(Module& module, Field& f) +std::string cppFieldType(Module& module, Field* f) { - if (f.javaSpec.size() != 0) { - if (f.javaSpec[0] == 'L') { - std::string className = f.javaSpec.substr(1, f.javaSpec.size() - 2); - std::map::iterator it - = module.javaClasses.find(className); + if (f->javaSpec.size() != 0) { + if (f->javaSpec[0] == 'L') { + std::string className = f->javaSpec.substr(1, f->javaSpec.size() - 2); + const auto it = module.javaClasses.find(className); if (it != module.javaClasses.end()) { return cppClassName(it->second); } - } else if (f.javaSpec[0] == '[') { - std::map::iterator it - = module.javaClasses.find(f.javaSpec); + } else if (f->javaSpec[0] == '[') { + const auto it = module.javaClasses.find(f->javaSpec); if (it != module.javaClasses.end()) { return cppClassName(it->second); } } } - std::map::iterator it = module.classes.find(f.typeName); - assert(f.typeName.size() > 0); + const auto it = module.classes.find(f->typeName); + assert(f->typeName.size() > 0); if (it != module.classes.end()) { return cppClassName(it->second); - } else if (f.typeName == "maybe_object") { + } else if (f->typeName == "maybe_object") { return "uintptr_t"; } else { - return f.typeName; + return f->typeName; } } -void writeAccessor(Output* out, Class* cl, Field& field) +void writeAccessor(Output* out, Class* cl, Field* f) { - std::string typeName = field.typeName; + std::string typeName = f->typeName; out->write("const unsigned "); out->write(capitalize(cl->name)); - out->write(capitalize(field.name)); + out->write(capitalize(f->name)); out->write(" = "); - writeOffset(out, field.offset); + writeOffset(out, f->offset); out->write(";\n\n"); out->write("#define HAVE_"); out->write(capitalize(cl->name)); - out->write(capitalize(field.name)); + out->write(capitalize(f->name)); out->write(" 1\n\n"); } void writeAccessors(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - ++it) { - Field& f = **it; - - if (!f.polyfill) { + for (const auto p : module.classes) { + Class* cl = p.second; + for (const auto f : cl->fields) { + if (!f->polyfill) { writeAccessor(out, cl, f); } } if (cl->arrayField) { - writeAccessor(out, cl, *cl->arrayField); + writeAccessor(out, cl, cl->arrayField); } } } void writeSizes(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("const unsigned FixedSizeOf"); out->write(capitalize(cl->name)); @@ -992,43 +969,34 @@ std::string obfuscate(const std::string& s) void writeConstructorParameters(Output* out, Module& module, Class* cl) { - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - ++it) { - Field& f = **it; - if (!f.polyfill) { + for (const auto f : cl->fields) { + if (!f->polyfill) { out->write(", "); out->write(cppFieldType(module, f)); out->write(" "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); } } } void writeConstructorArguments(Output* out, Class* cl) { - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - ++it) { - Field& f = **it; - if (!f.polyfill) { + for (const auto f : cl->fields) { + if (!f->polyfill) { out->write(", "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); } } } void writeConstructorInitializations(Output* out, Class* cl) { - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - ++it) { - Field& f = **it; - if (!f.polyfill) { + for (const auto f : cl->fields) { + if (!f->polyfill) { out->write(" o->set"); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("(t, "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); out->write(");\n"); } } @@ -1036,10 +1004,8 @@ void writeConstructorInitializations(Output* out, Class* cl) void writeClassDeclarations(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - it++) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("class Gc"); out->write(capitalize(cl->name)); @@ -1048,41 +1014,37 @@ void writeClassDeclarations(Output* out, Module& module) out->write("\n"); } -bool isFieldGcVisible(Module& module, Field& f) +bool isFieldGcVisible(Module& module, Field* f) { - return enumName(module, f) == "object" && !f.nogc; + return enumName(module, f) == "object" && !f->nogc; } -bool isFieldGcMarkable(Module& module, Field& f) +bool isFieldGcMarkable(Module& module, Field* f) { - return (f.typeName == "maybe_object" || enumName(module, f) == "object") - && !f.nogc; + return (f->typeName == "maybe_object" || enumName(module, f) == "object") + && !f->nogc; } void writeClassAccessors(Output* out, Module& module, Class* cl) { - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - ++it) { - Field& f = **it; - - if (!f.polyfill) { + for (const auto f : cl->fields) { + if (!f->polyfill) { out->write(" void set"); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("(Thread* t UNUSED, "); out->write(cppFieldType(module, f)); out->write(" value) { "); if (isFieldGcMarkable(module, f)) { out->write("setField(t, this , "); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write(", reinterpret_cast(value));"); } else { out->write("field_at<"); out->write(cppFieldType(module, f)); out->write(">("); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write(") = value;"); } out->write(" }\n"); @@ -1090,47 +1052,47 @@ void writeClassAccessors(Output* out, Module& module, Class* cl) out->write(" "); out->write(cppFieldType(module, f)); out->write("* "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); out->write("Ptr() { return &field_at<"); out->write(cppFieldType(module, f)); out->write(">("); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("); }\n"); } out->write(" "); out->write(cppFieldType(module, f)); - if (!f.polyfill && !isFieldGcMarkable(module, f)) { + if (!f->polyfill && !isFieldGcMarkable(module, f)) { out->write("&"); } out->write(" "); - out->write(obfuscate(f.name)); - if (f.threadParam || f.polyfill) { + out->write(obfuscate(f->name)); + if (f->threadParam || f->polyfill) { out->write("(Thread*"); } else { out->write("("); } - if (f.polyfill) { + if (f->polyfill) { out->write("); // polyfill, assumed to be implemented elsewhere\n"); } else { out->write(") { return field_at<"); out->write(cppFieldType(module, f)); out->write(">("); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("); }\n"); } } if (cl->arrayField) { - Field& f = *cl->arrayField; + Field* f = cl->arrayField; out->write(" avian::util::Slice<"); if (isFieldGcVisible(module, f)) { out->write("const "); } out->write(cppFieldType(module, f)); out->write("> "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); out->write("() { return avian::util::Slice<"); if (isFieldGcVisible(module, f)) { out->write("const "); @@ -1143,31 +1105,31 @@ void writeClassAccessors(Output* out, Module& module, Class* cl) out->write(cppFieldType(module, f)); out->write(">("); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("), field_at("); out->write(capitalize(cl->name)); out->write("Length)); }\n"); out->write(" void set"); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write("Element(Thread* t UNUSED, size_t index, "); out->write(cppFieldType(module, f)); out->write(" value) { "); if (isFieldGcMarkable(module, f)) { out->write("setField(t, this , "); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write(" + index * ("); - out->write(sizeOf(module, f.typeName)); + out->write(sizeOf(module, f->typeName)); out->write("), reinterpret_cast(value));"); } else { out->write("field_at<"); out->write(cppFieldType(module, f)); out->write(">("); out->write(capitalize(cl->name)); - out->write(capitalize(f.name)); + out->write(capitalize(f->name)); out->write(" + index * ("); - out->write(sizeOf(module, f.typeName)); + out->write(sizeOf(module, f->typeName)); out->write(")) = value;"); } out->write(" }\n"); @@ -1176,10 +1138,8 @@ void writeClassAccessors(Output* out, Module& module, Class* cl) void writeClasses(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - it++) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("class Gc"); out->write(capitalize(cl->name)); @@ -1206,10 +1166,8 @@ void writeClasses(Output* out, Module& module) void writeInitializerDeclarations(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("void init"); out->write(capitalize(cl->name)); out->write("(Thread* t, Gc"); @@ -1224,10 +1182,8 @@ void writeInitializerDeclarations(Output* out, Module& module) void writeConstructorDeclarations(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("Gc"); out->write(capitalize(cl->name)); out->write("* make"); @@ -1242,10 +1198,8 @@ void writeConstructorDeclarations(Output* out, Module& module) void writeInitializers(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; out->write("void init"); out->write(capitalize(cl->name)); out->write("(Thread* t, Gc"); @@ -1271,10 +1225,8 @@ void writeInitializers(Output* out, Module& module) void writeConstructors(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; bool hasObjectMask = cl->name == "singleton"; @@ -1309,21 +1261,18 @@ void writeConstructors(Output* out, Module& module) writeConstructorParameters(out, module, cl); out->write(")\n{\n"); - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - it++) { - Field& f = **it; - if (enumName(module, f) == "object" and not f.nogc) { + for (const auto f : cl->fields) { + if (enumName(module, f) == "object" and not f->nogc) { out->write(" PROTECT(t, "); - out->write(obfuscate(f.name)); + out->write(obfuscate(f->name)); out->write(");\n"); hasObjectMask = true; } } if (cl->arrayField) { - Field& f = *cl->arrayField; - if (f.typeName == "object" and not f.nogc) { + Field* f = cl->arrayField; + if (f->typeName == "object" and not f->nogc) { hasObjectMask = true; } } @@ -1351,10 +1300,8 @@ void writeConstructors(Output* out, Module& module) void writeEnums(Output* out, Module& module) { bool wrote = false; - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; if (wrote) { out->write(",\n"); } else { @@ -1385,19 +1332,16 @@ uint32_t typeObjectMask(Module& module, Class* cl) uint32_t mask = 1; - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - it++) { - Field& f = **it; - unsigned offset = f.offset / BytesPerWord; + for (const auto f : cl->fields) { + unsigned offset = f->offset / BytesPerWord; if (isFieldGcVisible(module, f)) { set(&mask, offset); } } if (cl->arrayField) { - Field& f = *cl->arrayField; - unsigned offset = f.offset / BytesPerWord; + Field* f = cl->arrayField; + unsigned offset = f->offset / BytesPerWord; if (isFieldGcVisible(module, f)) { set(&mask, offset); } @@ -1455,10 +1399,8 @@ void writeInitializations(Output* out, Module& module) writeInitialization(out, module, alreadyInited, module.classes["intArray"]); writeInitialization(out, module, alreadyInited, module.classes["class"]); - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; if (cl->name != "intArray" && cl->name != "class") { writeInitialization(out, module, alreadyInited, cl); } @@ -1493,10 +1435,8 @@ void writeJavaInitialization(Output* out, Class* cl) void writeJavaInitializations(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; if (cl->javaName.size()) { writeJavaInitialization(out, cl); } @@ -1521,10 +1461,8 @@ void writeNameInitialization(Output* out, Class* cl) void writeNameInitializations(Output* out, Module& module) { - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; if (!cl->javaName.size()) { writeNameInitialization(out, cl); } @@ -1534,14 +1472,11 @@ void writeNameInitializations(Output* out, Module& module) void writeMap(Output* out, Module& module, Class* cl) { std::ostringstream ss; - for (std::vector::iterator it = cl->fields.begin(); - it != cl->fields.end(); - it++) { - Field& f = **it; + for (const auto f : cl->fields) { ss << "Type_"; ss << enumName(module, f); - if (f.nogc) { + if (f->nogc) { ss << "_nogc"; } @@ -1549,7 +1484,7 @@ void writeMap(Output* out, Module& module, Class* cl) } if (cl->arrayField) { - Field& f = *cl->arrayField; + Field* f = cl->arrayField; ss << "Type_array, "; ss << "Type_"; ss << enumName(module, f); @@ -1567,10 +1502,8 @@ void writeMaps(Output* out, Module& module) out->write(module.classes.size()); out->write("] = {\n"); bool wrote = false; - for (std::map::iterator it = module.classes.begin(); - it != module.classes.end(); - ++it) { - Class* cl = it->second; + for (const auto p : module.classes) { + Class* cl = p.second; if (wrote) { out->write(",\n"); } else { From 060b5c8f13501b6a2d756420c7016a255553a99c Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Sat, 12 Jul 2014 09:41:52 -0600 Subject: [PATCH 2/5] use c++11 variadic templates in Compiler::call --- include/avian/codegen/compiler.h | 36 ++- include/avian/util/cpp.h | 54 +++++ include/avian/util/slice.h | 14 +- src/codegen/compiler.cpp | 24 +- src/compile.cpp | 382 +++++++++++++------------------ 5 files changed, 261 insertions(+), 249 deletions(-) create mode 100644 include/avian/util/cpp.h diff --git a/include/avian/codegen/compiler.h b/include/avian/codegen/compiler.h index 6b38e91054..6e07a06d87 100644 --- a/include/avian/codegen/compiler.h +++ b/include/avian/codegen/compiler.h @@ -25,6 +25,37 @@ class TraceHandler { virtual void handleTrace(Promise* address, unsigned argumentIndex) = 0; }; +template +class Args { + public: + ir::Value* values[N]; + + template + Args(Ts... ts) : values{ts...} + { + } + + operator util::Slice () { + return util::Slice(&values[0], N); + } +}; + +inline Args<0> args() +{ + return Args<0>(); +} + +inline Args<1> args(ir::Value* first) +{ + return Args<1> { first}; +} + +template +inline Args<1 + util::ArgumentCount::Result> args(ir::Value* first, Ts... rest) +{ + return Args<1 + util::ArgumentCount::Result> { first, rest... }; +} + class Compiler { public: class Client { @@ -83,12 +114,11 @@ class Compiler { virtual unsigned topOfStack() = 0; virtual ir::Value* peek(unsigned footprint, unsigned index) = 0; - virtual ir::Value* call(ir::Value* address, + virtual ir::Value* nativeCall(ir::Value* address, unsigned flags, TraceHandler* traceHandler, ir::Type resultType, - unsigned argumentCount, - ...) = 0; + util::Slice arguments) = 0; virtual ir::Value* stackCall(ir::Value* address, unsigned flags, diff --git a/include/avian/util/cpp.h b/include/avian/util/cpp.h new file mode 100644 index 0000000000..f886c9054d --- /dev/null +++ b/include/avian/util/cpp.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2008-2014, Avian Contributors + + Permission to use, copy, modify, and/or distribute this software + for any purpose with or without fee is hereby granted, provided + that the above copyright notice and this permission notice appear + in all copies. + + There is NO WARRANTY for this software. See license.txt for + details. */ + +#ifndef AVIAN_UTIL_CPP_H +#define AVIAN_UTIL_CPP_H + +#include "allocator.h" +#include "math.h" +#include "assert.h" + +namespace avian { +namespace util { + +template +struct NonConst; + +template +struct NonConst { + typedef T Type; +}; + +template +struct NonConst { + typedef T Type; +}; + +template +struct ArgumentCount; + +template +struct ArgumentCount { + enum { + Result = 1 + ArgumentCount::Result + }; +}; + +template<> +struct ArgumentCount<> { + enum { + Result = 0 + }; +}; + +} // namespace util +} // namespace avian + +#endif // AVIAN_UTIL_CPP_H diff --git a/include/avian/util/slice.h b/include/avian/util/slice.h index a5003f1ac5..e9cd0ec0e3 100644 --- a/include/avian/util/slice.h +++ b/include/avian/util/slice.h @@ -14,23 +14,11 @@ #include "allocator.h" #include "math.h" #include "assert.h" +#include "cpp.h" namespace avian { namespace util { -template -struct NonConst; - -template -struct NonConst { - typedef T Type; -}; - -template -struct NonConst { - typedef T Type; -}; - template class Slice { public: diff --git a/src/codegen/compiler.cpp b/src/codegen/compiler.cpp index 67c622741f..cfa755dd83 100644 --- a/src/codegen/compiler.cpp +++ b/src/codegen/compiler.cpp @@ -2534,31 +2534,27 @@ class MyCompiler : public Compiler { return s->value; } - virtual ir::Value* call(ir::Value* address, + virtual ir::Value* nativeCall(ir::Value* address, unsigned flags, TraceHandler* traceHandler, ir::Type resultType, - unsigned argumentCount, - ...) + util::Slice arguments) { - va_list a; - va_start(a, argumentCount); - bool bigEndian = c.arch->bigEndian(); unsigned footprint = 0; unsigned size = TargetBytesPerWord; - RUNTIME_ARRAY(ir::Value*, arguments, argumentCount); + RUNTIME_ARRAY(ir::Value*, args, arguments.count); int index = 0; - for (unsigned i = 0; i < argumentCount; ++i) { - Value* o = va_arg(a, Value*); + for (unsigned i = 0; i < arguments.count; ++i) { + Value* o = static_cast(arguments[i]); if (o) { if (bigEndian and size > TargetBytesPerWord) { - RUNTIME_ARRAY_BODY(arguments)[index++] = o->nextWord; + RUNTIME_ARRAY_BODY(args)[index++] = o->nextWord; } - RUNTIME_ARRAY_BODY(arguments)[index] = o; + RUNTIME_ARRAY_BODY(args)[index] = o; if ((not bigEndian) and size > TargetBytesPerWord) { - RUNTIME_ARRAY_BODY(arguments)[++index] = o->nextWord; + RUNTIME_ARRAY_BODY(args)[++index] = o->nextWord; } size = TargetBytesPerWord; ++index; @@ -2568,8 +2564,6 @@ class MyCompiler : public Compiler { ++footprint; } - va_end(a); - Value* result = value(&c, resultType); appendCall(&c, static_cast(address), @@ -2577,7 +2571,7 @@ class MyCompiler : public Compiler { flags, traceHandler, result, - util::Slice(RUNTIME_ARRAY_BODY(arguments), index)); + util::Slice(RUNTIME_ARRAY_BODY(args), index)); return result; } diff --git a/src/compile.cpp b/src/compile.cpp index 5dc187d93a..1426d2a8c9 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -3084,12 +3084,11 @@ bool useLongJump(MyThread* t, uintptr_t target) void compileSafePoint(MyThread* t, Compiler* c, Frame* frame) { - c->call(c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 1, - c->threadRegister()); + args(c->threadRegister())); } void compileDirectInvoke(MyThread* t, @@ -3229,13 +3228,11 @@ void compileDirectReferenceInvoke(MyThread* t, compileReferenceInvoke( frame, - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::iptr(), - 2, - c->threadRegister(), - frame->append(pair)), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::iptr(), + args(c->threadRegister(), frame->append(pair))), reference, isStatic, tailCall); @@ -3260,13 +3257,11 @@ void compileDirectAbstractInvoke(MyThread* t, compileAbstractInvoke( frame, - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::iptr(), - 2, - c->threadRegister(), - frame->append(target)), + args(c->threadRegister(), frame->append(target))), target, tailCall); } @@ -3287,13 +3282,11 @@ void handleMonitorEvent(MyThread* t, Frame* frame, intptr_t function) frame->context, 1, ir::Type::object(), savedTargetIndex(t, method)); } - c->call(c->constant(function, ir::Type::iptr()), + c->nativeCall(c->constant(function, ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - lock); + args(c->threadRegister(), lock)); } } @@ -3923,12 +3916,11 @@ loop: frame->pushObject(); - c->call(c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 1, - c->threadRegister()); + args(c->threadRegister())); } if (DebugInstructions) { @@ -4082,22 +4074,22 @@ loop: switch (instruction) { case aastore: { - c->call(c->constant(getThunk(t, setMaybeNullThunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - 4, - c->threadRegister(), - array, - c->binaryOp(lir::Add, - ir::Type::i4(), - c->constant(TargetArrayBody, ir::Type::i4()), - c->binaryOp(lir::ShiftLeft, - ir::Type::i4(), - c->constant(log(TargetBytesPerWord), - ir::Type::i4()), - index)), - value); + c->nativeCall( + c->constant(getThunk(t, setMaybeNullThunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), + array, + c->binaryOp(lir::Add, + ir::Type::i4(), + c->constant(TargetArrayBody, ir::Type::i4()), + c->binaryOp(lir::ShiftLeft, + ir::Type::i4(), + c->constant(log(TargetBytesPerWord), + ir::Type::i4()), + index)), + value)); } break; case fastore: @@ -4180,15 +4172,14 @@ loop: thunk = makeBlankObjectArrayFromReferenceThunk; } - frame->push(ir::Type::object(), - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::object(), - 3, - c->threadRegister(), - frame->append(argument), - length)); + frame->push( + ir::Type::object(), + c->nativeCall( + c->constant(getThunk(t, thunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::object(), + args(c->threadRegister(), frame->append(argument), length))); } break; case areturn: { @@ -4228,13 +4219,11 @@ loop: case athrow: { ir::Value* target = frame->pop(ir::Type::object()); - c->call(c->constant(getThunk(t, throw_Thunk), ir::Type::iptr()), - Compiler::NoReturn, - frame->trace(0, 0), - ir::Type::void_(), - 2, - c->threadRegister(), - target); + c->nativeCall(c->constant(getThunk(t, throw_Thunk), ir::Type::iptr()), + Compiler::NoReturn, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), target)); c->nullaryOp(lir::Trap); } @@ -4269,14 +4258,12 @@ loop: ir::Value* instance = c->peek(1, 0); - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - 3, - c->threadRegister(), - frame->append(argument), - instance); + c->nativeCall( + c->constant(getThunk(t, thunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), frame->append(argument), instance)); } break; case d2f: { @@ -4316,16 +4303,12 @@ loop: goto branch; } else { frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, compareDoublesGThunk), - ir::Type::iptr()), - 0, - 0, - ir::Type::i4(), - 4, - static_cast(0), - a, - static_cast(0), - b)); + c->nativeCall(c->constant(getThunk(t, compareDoublesGThunk), + ir::Type::iptr()), + 0, + 0, + ir::Type::i4(), + args(nullptr, a, nullptr, b))); } } break; @@ -4337,16 +4320,12 @@ loop: goto branch; } else { frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, compareDoublesLThunk), - ir::Type::iptr()), - 0, - 0, - ir::Type::i4(), - 4, - static_cast(0), - a, - static_cast(0), - b)); + c->nativeCall(c->constant(getThunk(t, compareDoublesLThunk), + ir::Type::iptr()), + 0, + 0, + ir::Type::i4(), + args(nullptr, a, nullptr, b))); } } break; @@ -4427,14 +4406,12 @@ loop: goto branch; } else { frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, compareFloatsGThunk), - ir::Type::iptr()), - 0, - 0, - ir::Type::i4(), - 2, - a, - b)); + c->nativeCall(c->constant(getThunk(t, compareFloatsGThunk), + ir::Type::iptr()), + 0, + 0, + ir::Type::i4(), + args(a, b))); } } break; @@ -4446,14 +4423,12 @@ loop: goto branch; } else { frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, compareFloatsLThunk), - ir::Type::iptr()), - 0, - 0, - ir::Type::i4(), - 2, - a, - b)); + c->nativeCall(c->constant(getThunk(t, compareFloatsLThunk), + ir::Type::iptr()), + 0, + 0, + ir::Type::i4(), + args(a, b))); } } break; @@ -4493,14 +4468,12 @@ loop: and (field->code() == DoubleField or field->code() == LongField)) { PROTECT(t, field); - c->call(c->constant(getThunk(t, acquireMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field)); + c->nativeCall(c->constant(getThunk(t, acquireMonitorForObjectThunk), + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), frame->append(field))); } ir::Value* table; @@ -4511,14 +4484,13 @@ loop: PROTECT(t, field); if (classNeedsInit(t, field->class_())) { - c->call( + c->nativeCall( c->constant(getThunk(t, tryInitClassThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field->class_())); + args(c->threadRegister(), + frame->append(field->class_()))); } table = frame->append(field->class_()->staticTable()); @@ -4614,14 +4586,13 @@ loop: if (field->flags() & ACC_VOLATILE) { if (TargetBytesPerWord == 4 and (field->code() == DoubleField or field->code() == LongField)) { - c->call(c->constant(getThunk(t, releaseMonitorForObjectThunk), + c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field)); + args(c->threadRegister(), + frame->append(field))); } else { c->nullaryOp(lir::LoadBarrier); } @@ -4637,28 +4608,26 @@ loop: ir::Value* result; if (instruction == getstatic) { - result = c->call( + result = c->nativeCall( c->constant(getThunk(t, getStaticFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 2, - c->threadRegister(), - frame->append(pair)); + args(c->threadRegister(), + frame->append(pair))); } else { ir::Value* instance = frame->pop(ir::Type::object()); - result = c->call( + result = c->nativeCall( c->constant(getThunk(t, getFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), - instance); + instance)); } frame->pushReturnValue(fieldCode, result); @@ -4950,14 +4919,13 @@ loop: } frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::i4(), - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(argument), - instance)); + instance))); } break; case invokeinterface: { @@ -4999,14 +4967,13 @@ loop: unsigned rSize = resultSize(t, returnCode); ir::Value* result = c->stackCall( - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::iptr(), - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(argument), - c->peek(1, parameterFootprint - 1)), + c->peek(1, parameterFootprint - 1))), tailCall ? Compiler::TailJump : 0, frame->trace(0, 0), operandTypeForFieldCode(t, returnCode), @@ -5146,17 +5113,16 @@ loop: compileReferenceInvoke( frame, - c->call( + c->nativeCall( c->constant(getThunk(t, findVirtualMethodFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::iptr(), - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), c->peek(1, - methodReferenceParameterFootprint(t, ref, false) - 1)), + methodReferenceParameterFootprint(t, ref, false) - 1))), ref, false, isReferenceTailCall(t, code, ip, context->method, ref)); @@ -5283,16 +5249,15 @@ loop: goto branch; } else { frame->push(ir::Type::i4(), - c->call(c->constant(getThunk(t, compareLongsThunk), + c->nativeCall(c->constant(getThunk(t, compareLongsThunk), ir::Type::iptr()), 0, 0, ir::Type::i4(), - 4, - static_cast(0), + args(nullptr, a, - static_cast(0), - b)); + nullptr, + b))); } } break; @@ -5330,29 +5295,27 @@ loop: if (UNLIKELY(v == 0)) { frame->push( ir::Type::object(), - c->call( + c->nativeCall( c->constant(getThunk(t, getJClassFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::object(), - 2, - c->threadRegister(), - frame->append(makePair(t, context->method, reference)))); + args(c->threadRegister(), + frame->append(makePair(t, context->method, reference))))); } } if (v) { if (objectClass(t, v) == type(t, GcClass::Type)) { frame->push(ir::Type::object(), - c->call(c->constant(getThunk(t, getJClass64Thunk), + c->nativeCall(c->constant(getThunk(t, getJClass64Thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::object(), - 2, - c->threadRegister(), - frame->append(v))); + args(c->threadRegister(), + frame->append(v)))); } else { frame->push(ir::Type::object(), frame->append(v)); } @@ -5468,16 +5431,15 @@ loop: } assertT(t, start); - ir::Value* address = c->call( + ir::Value* address = c->nativeCall( c->constant(getThunk(t, lookUpAddressThunk), ir::Type::iptr()), 0, 0, ir::Type::iptr(), - 4, - key, - frame->absoluteAddressOperand(start), - c->constant(pairCount, ir::Type::i4()), - default_); + args(key, + frame->absoluteAddressOperand(start), + c->constant(pairCount, ir::Type::i4()), + default_)); c->jmp(context->bootContext ? c->binaryOp(lir::Add, @@ -5572,26 +5534,24 @@ loop: case monitorenter: { ir::Value* target = frame->pop(ir::Type::object()); - c->call(c->constant(getThunk(t, acquireMonitorForObjectThunk), + c->nativeCall(c->constant(getThunk(t, acquireMonitorForObjectThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - target); + args(c->threadRegister(), + target)); } break; case monitorexit: { ir::Value* target = frame->pop(ir::Type::object()); - c->call(c->constant(getThunk(t, releaseMonitorForObjectThunk), + c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - target); + args(c->threadRegister(), + target)); } break; case multianewarray: { @@ -5622,15 +5582,14 @@ loop: context->method) + t->arch->frameReturnAddressSize(); ir::Value* result - = c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), + = c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::object(), - 4, - c->threadRegister(), + args(c->threadRegister(), frame->append(argument), c->constant(dimensions, ir::Type::i4()), - c->constant(offset, ir::Type::i4())); + c->constant(offset, ir::Type::i4()))); frame->popFootprint(dimensions); frame->push(ir::Type::object(), result); @@ -5662,13 +5621,12 @@ loop: } frame->push(ir::Type::object(), - c->call(c->constant(getThunk(t, thunk), ir::Type::iptr()), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::object(), - 2, - c->threadRegister(), - frame->append(argument))); + args(c->threadRegister(), + frame->append(argument)))); } break; case newarray: { @@ -5677,15 +5635,14 @@ loop: ir::Value* length = frame->pop(ir::Type::i4()); frame->push(ir::Type::object(), - c->call(c->constant(getThunk(t, makeBlankArrayThunk), + c->nativeCall(c->constant(getThunk(t, makeBlankArrayThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::object(), - 3, - c->threadRegister(), + args(c->threadRegister(), c->constant(type, ir::Type::i4()), - length)); + length))); } break; case nop: @@ -5721,14 +5678,13 @@ loop: if (classNeedsInit(t, field->class_())) { PROTECT(t, field); - c->call( + c->nativeCall( c->constant(getThunk(t, tryInitClassThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field->class_())); + args(c->threadRegister(), + frame->append(field->class_()))); } staticTable = field->class_()->staticTable(); @@ -5746,14 +5702,13 @@ loop: and (fieldCode == DoubleField or fieldCode == LongField)) { PROTECT(t, field); - c->call(c->constant(getThunk(t, acquireMonitorForObjectThunk), + c->nativeCall(c->constant(getThunk(t, acquireMonitorForObjectThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field)); + args(c->threadRegister(), + frame->append(field))); } else { c->nullaryOp(lir::StoreStoreBarrier); } @@ -5818,27 +5773,25 @@ loop: case ObjectField: if (instruction == putfield) { - c->call( + c->nativeCall( c->constant(getThunk(t, setMaybeNullThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 4, - c->threadRegister(), + args(c->threadRegister(), table, c->constant(targetFieldOffset(context, field), ir::Type::i4()), - value); + value)); } else { - c->call( + c->nativeCall( c->constant(getThunk(t, setObjectThunk), ir::Type::iptr()), 0, 0, ir::Type::void_(), - 4, - c->threadRegister(), + args(c->threadRegister(), table, c->constant(targetFieldOffset(context, field), ir::Type::i4()), - value); + value)); } break; @@ -5849,14 +5802,13 @@ loop: if (field->flags() & ACC_VOLATILE) { if (TargetBytesPerWord == 4 and (fieldCode == DoubleField or fieldCode == LongField)) { - c->call(c->constant(getThunk(t, releaseMonitorForObjectThunk), + c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), ir::Type::iptr()), 0, frame->trace(0, 0), ir::Type::void_(), - 2, - c->threadRegister(), - frame->append(field)); + args(c->threadRegister(), + frame->append(field))); } else { c->nullaryOp(lir::StoreLoadBarrier); } @@ -5879,91 +5831,85 @@ loop: case FloatField: case IntField: { if (instruction == putstatic) { - c->call( + c->nativeCall( c->constant(getThunk(t, setStaticFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), - value); + value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); - c->call(c->constant(getThunk(t, setFieldValueFromReferenceThunk), + c->nativeCall(c->constant(getThunk(t, setFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 4, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), instance, - value); + value)); } } break; case DoubleField: case LongField: { if (instruction == putstatic) { - c->call(c->constant( + c->nativeCall(c->constant( getThunk(t, setStaticLongFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 4, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), - static_cast(0), - value); + nullptr, + value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); - c->call( + c->nativeCall( c->constant(getThunk(t, setLongFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 5, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), instance, - static_cast(0), - value); + nullptr, + value)); } } break; case ObjectField: { if (instruction == putstatic) { - c->call( + c->nativeCall( c->constant( getThunk(t, setStaticObjectFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 3, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), - value); + value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); - c->call( + c->nativeCall( c->constant(getThunk(t, setObjectFieldValueFromReferenceThunk), ir::Type::iptr()), 0, frame->trace(0, 0), rType, - 4, - c->threadRegister(), + args(c->threadRegister(), frame->append(pair), instance, - value); + value)); } } break; From 1ad1fe904824cdbf2230fd6cc3419cab1fa0bdf4 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Sat, 12 Jul 2014 11:54:19 -0600 Subject: [PATCH 3/5] use enum class in ir --- include/avian/codegen/compiler.h | 4 +-- include/avian/codegen/ir.h | 4 +-- src/codegen/compiler.cpp | 12 +++---- src/codegen/compiler/event.cpp | 12 +++---- src/compile.cpp | 56 ++++++++++++++++---------------- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/include/avian/codegen/compiler.h b/include/avian/codegen/compiler.h index 6e07a06d87..802601229d 100644 --- a/include/avian/codegen/compiler.h +++ b/include/avian/codegen/compiler.h @@ -140,7 +140,7 @@ class Compiler { ir::Value* index, intptr_t handler) = 0; - virtual ir::Value* truncateThenExtend(ir::SignExtendMode signExtend, + virtual ir::Value* truncateThenExtend(ir::ExtendMode extendMode, ir::Type extendType, ir::Type truncateType, ir::Value* src) = 0; @@ -148,7 +148,7 @@ class Compiler { virtual ir::Value* truncate(ir::Type type, ir::Value* src) = 0; virtual void store(ir::Value* src, ir::Value* dst) = 0; - virtual ir::Value* load(ir::SignExtendMode signExtend, + virtual ir::Value* load(ir::ExtendMode extendMode, ir::Value* src, ir::Type dstType) = 0; diff --git a/include/avian/codegen/ir.h b/include/avian/codegen/ir.h index d694f0c154..8d35f9fe23 100644 --- a/include/avian/codegen/ir.h +++ b/include/avian/codegen/ir.h @@ -132,9 +132,9 @@ class Type { } }; -enum SignExtendMode { SignExtend, ZeroExtend }; +enum class ExtendMode { Signed, Unsigned }; -enum CallingConvention { NativeCallingConvention, AvianCallingConvention }; +enum class CallingConvention { Native, Avian }; class Value { public: diff --git a/src/codegen/compiler.cpp b/src/codegen/compiler.cpp index cfa755dd83..36a4e5783a 100644 --- a/src/codegen/compiler.cpp +++ b/src/codegen/compiler.cpp @@ -2567,7 +2567,7 @@ class MyCompiler : public Compiler { Value* result = value(&c, resultType); appendCall(&c, static_cast(address), - ir::NativeCallingConvention, + ir::CallingConvention::Native, flags, traceHandler, result, @@ -2586,7 +2586,7 @@ class MyCompiler : public Compiler { Stack* b UNUSED = c.stack; appendCall(&c, static_cast(address), - ir::AvianCallingConvention, + ir::CallingConvention::Avian, flags, traceHandler, result, @@ -2741,14 +2741,14 @@ class MyCompiler : public Compiler { return dst; } - virtual ir::Value* truncateThenExtend(ir::SignExtendMode signExtend, + virtual ir::Value* truncateThenExtend(ir::ExtendMode extendMode, ir::Type extendType, ir::Type truncateType, ir::Value* src) { Value* dst = value(&c, extendType); appendMove(&c, - signExtend == ir::SignExtend ? lir::Move : lir::MoveZ, + extendMode == ir::ExtendMode::Signed ? lir::Move : lir::MoveZ, TargetBytesPerWord, truncateType.size(c.targetInfo), static_cast(src), @@ -2772,7 +2772,7 @@ class MyCompiler : public Compiler { static_cast(dst)); } - virtual ir::Value* load(ir::SignExtendMode signExtend, + virtual ir::Value* load(ir::ExtendMode extendMode, ir::Value* src, ir::Type dstType) { @@ -2780,7 +2780,7 @@ class MyCompiler : public Compiler { Value* dst = value(&c, dstType); appendMove(&c, - signExtend == ir::SignExtend ? lir::Move : lir::MoveZ, + extendMode == ir::ExtendMode::Signed ? lir::Move : lir::MoveZ, src->type.size(c.targetInfo), src->type.size(c.targetInfo), static_cast(src), diff --git a/src/codegen/compiler/event.cpp b/src/codegen/compiler/event.cpp index f59f5d124e..7bb0257f3f 100644 --- a/src/codegen/compiler/event.cpp +++ b/src/codegen/compiler/event.cpp @@ -368,13 +368,13 @@ class CallEvent : public Event { popIndex(0), stackArgumentIndex(0), flags(flags), - stackArgumentFootprint(callingConvention == ir::AvianCallingConvention + stackArgumentFootprint(callingConvention == ir::CallingConvention::Avian ? arguments.count : 0) { uint32_t registerMask = c->regFile->generalRegisters.mask; - if (callingConvention == ir::NativeCallingConvention) { + if (callingConvention == ir::CallingConvention::Native) { assertT(c, (flags & Compiler::TailJump) == 0); assertT(c, stackArgumentFootprint == 0); @@ -450,7 +450,7 @@ class CallEvent : public Event { Stack* stack = stackBefore; - if (callingConvention == ir::AvianCallingConvention) { + if (callingConvention == ir::CallingConvention::Avian) { for (size_t i = 0; i < arguments.count; i++) { stack = stack->next; } @@ -1257,7 +1257,7 @@ void appendCombine(Context* c, appendCall(c, value(c, ir::Type::addr(), constantSite(c, handler)), - ir::NativeCallingConvention, + ir::CallingConvention::Native, 0, 0, resultValue, @@ -1413,7 +1413,7 @@ void appendTranslate(Context* c, op, firstValue->type.size(c->targetInfo), resultValue->type.size(c->targetInfo)))), - ir::NativeCallingConvention, + ir::CallingConvention::Native, 0, 0, resultValue, @@ -1849,7 +1849,7 @@ void appendBranch(Context* c, Value* result = value(c, ir::Type::addr()); appendCall(c, value(c, ir::Type::addr(), constantSite(c, handler)), - ir::NativeCallingConvention, + ir::CallingConvention::Native, 0, 0, result, diff --git a/src/compile.cpp b/src/compile.cpp index 1426d2a8c9..65a1417a72 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -3575,7 +3575,7 @@ ir::Value* popLongAddress(Frame* frame) { return TargetBytesPerWord == 8 ? frame->popLarge(ir::Type::i8()) - : frame->c->load(ir::SignExtend, + : frame->c->load(ir::ExtendMode::Signed, frame->popLarge(ir::Type::i8()), ir::Type::iptr()); } @@ -3616,7 +3616,7 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) ir::Value* address = popLongAddress(frame); frame->pop(ir::Type::object()); frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(address, ir::Type::i1()), ir::Type::i4())); return true; @@ -3634,7 +3634,7 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) ir::Value* address = popLongAddress(frame); frame->pop(ir::Type::object()); frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(address, ir::Type::i2()), ir::Type::i4())); return true; @@ -3656,7 +3656,7 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) ir::Type type = MATCH(target->name(), "getInt") ? ir::Type::i4() : ir::Type::f4(); frame->push(type, - c->load(ir::SignExtend, c->memory(address, type), type)); + c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); return true; } else if ((MATCH(target->name(), "putInt") and MATCH(target->spec(), "(JI)V")) @@ -3678,7 +3678,7 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) ir::Type type = MATCH(target->name(), "getLong") ? ir::Type::i8() : ir::Type::f8(); frame->pushLarge(type, - c->load(ir::SignExtend, c->memory(address, type), type)); + c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); return true; } else if ((MATCH(target->name(), "putLong") and MATCH(target->spec(), "(JJ)V")) @@ -3696,7 +3696,7 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) ir::Value* address = popLongAddress(frame); frame->pop(ir::Type::object()); frame->pushLarge(ir::Type::i8(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(address, ir::Type::iptr()), ir::Type::i8())); return true; @@ -3976,7 +3976,7 @@ loop: frame->push( ir::Type::object(), c->load( - ir::SignExtend, + ir::ExtendMode::Signed, c->memory(array, ir::Type::object(), TargetArrayBody, index), ir::Type::object())); break; @@ -3984,7 +3984,7 @@ loop: case faload: frame->push( ir::Type::f4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::f4(), TargetArrayBody, index), ir::Type::f4())); break; @@ -3992,7 +3992,7 @@ loop: case iaload: frame->push( ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::i4(), TargetArrayBody, index), ir::Type::i4())); break; @@ -4000,7 +4000,7 @@ loop: case baload: frame->push( ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::i1(), TargetArrayBody, index), ir::Type::i4())); break; @@ -4008,7 +4008,7 @@ loop: case caload: frame->push( ir::Type::i4(), - c->load(ir::ZeroExtend, + c->load(ir::ExtendMode::Unsigned, c->memory(array, ir::Type::i2(), TargetArrayBody, index), ir::Type::i4())); break; @@ -4016,7 +4016,7 @@ loop: case daload: frame->pushLarge( ir::Type::f8(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::f8(), TargetArrayBody, index), ir::Type::f8())); break; @@ -4024,7 +4024,7 @@ loop: case laload: frame->pushLarge( ir::Type::i8(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::i8(), TargetArrayBody, index), ir::Type::i8())); break; @@ -4032,7 +4032,7 @@ loop: case saload: frame->push( ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(array, ir::Type::i2(), TargetArrayBody, index), ir::Type::i4())); break; @@ -4190,7 +4190,7 @@ loop: case arraylength: { frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(frame->pop(ir::Type::object()), ir::Type::iptr(), TargetArrayLength), @@ -4509,7 +4509,7 @@ loop: case ByteField: case BooleanField: frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::i1(), targetFieldOffset(context, field)), @@ -4518,7 +4518,7 @@ loop: case CharField: frame->push(ir::Type::i4(), - c->load(ir::ZeroExtend, + c->load(ir::ExtendMode::Unsigned, c->memory(table, ir::Type::i2(), targetFieldOffset(context, field)), @@ -4527,7 +4527,7 @@ loop: case ShortField: frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::i2(), targetFieldOffset(context, field)), @@ -4536,7 +4536,7 @@ loop: case FloatField: frame->push(ir::Type::f4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::f4(), targetFieldOffset(context, field)), @@ -4545,7 +4545,7 @@ loop: case IntField: frame->push(ir::Type::i4(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::i4(), targetFieldOffset(context, field)), @@ -4554,7 +4554,7 @@ loop: case DoubleField: frame->pushLarge(ir::Type::f8(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::f8(), targetFieldOffset(context, field)), @@ -4563,7 +4563,7 @@ loop: case LongField: frame->pushLarge(ir::Type::i8(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::i8(), targetFieldOffset(context, field)), @@ -4572,7 +4572,7 @@ loop: case ObjectField: frame->push(ir::Type::object(), - c->load(ir::SignExtend, + c->load(ir::ExtendMode::Signed, c->memory(table, ir::Type::object(), targetFieldOffset(context, field)), @@ -4662,7 +4662,7 @@ loop: case i2b: { frame->push(ir::Type::i4(), - c->truncateThenExtend(ir::SignExtend, + c->truncateThenExtend(ir::ExtendMode::Signed, ir::Type::i4(), ir::Type::i1(), frame->pop(ir::Type::i4()))); @@ -4670,7 +4670,7 @@ loop: case i2c: { frame->push(ir::Type::i4(), - c->truncateThenExtend(ir::ZeroExtend, + c->truncateThenExtend(ir::ExtendMode::Unsigned, ir::Type::i4(), ir::Type::i2(), frame->pop(ir::Type::i4()))); @@ -4688,7 +4688,7 @@ loop: case i2l: frame->pushLarge(ir::Type::i8(), - c->truncateThenExtend(ir::SignExtend, + c->truncateThenExtend(ir::ExtendMode::Signed, ir::Type::i8(), ir::Type::i4(), frame->pop(ir::Type::i4()))); @@ -4696,7 +4696,7 @@ loop: case i2s: { frame->push(ir::Type::i4(), - c->truncateThenExtend(ir::SignExtend, + c->truncateThenExtend(ir::ExtendMode::Signed, ir::Type::i4(), ir::Type::i2(), frame->pop(ir::Type::i4()))); @@ -6113,7 +6113,7 @@ next: 0, normalizedKey); - c->jmp(c->load(ir::SignExtend, + c->jmp(c->load(ir::ExtendMode::Signed, context->bootContext ? c->binaryOp(lir::Add, ir::Type::iptr(), From 31de9a48c9fe45e6ea7e56539ec772a9070e9891 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Wed, 16 Jul 2014 18:07:56 -0600 Subject: [PATCH 4/5] reformat --- include/avian/codegen/compiler.h | 27 +-- include/avian/util/cpp.h | 14 +- src/codegen/compiler.cpp | 8 +- src/compile.cpp | 296 ++++++++++++++---------------- src/tools/type-generator/main.cpp | 1 - 5 files changed, 165 insertions(+), 181 deletions(-) diff --git a/include/avian/codegen/compiler.h b/include/avian/codegen/compiler.h index 802601229d..9e96e79539 100644 --- a/include/avian/codegen/compiler.h +++ b/include/avian/codegen/compiler.h @@ -25,17 +25,19 @@ class TraceHandler { virtual void handleTrace(Promise* address, unsigned argumentIndex) = 0; }; -template +template class Args { public: ir::Value* values[N]; - template - Args(Ts... ts) : values{ts...} + template + Args(Ts... ts) + : values{ts...} { } - operator util::Slice () { + operator util::Slice() + { return util::Slice(&values[0], N); } }; @@ -47,13 +49,14 @@ inline Args<0> args() inline Args<1> args(ir::Value* first) { - return Args<1> { first}; + return Args<1>{first}; } -template -inline Args<1 + util::ArgumentCount::Result> args(ir::Value* first, Ts... rest) +template +inline Args<1 + util::ArgumentCount::Result> args(ir::Value* first, + Ts... rest) { - return Args<1 + util::ArgumentCount::Result> { first, rest... }; + return Args<1 + util::ArgumentCount::Result>{first, rest...}; } class Compiler { @@ -115,10 +118,10 @@ class Compiler { virtual ir::Value* peek(unsigned footprint, unsigned index) = 0; virtual ir::Value* nativeCall(ir::Value* address, - unsigned flags, - TraceHandler* traceHandler, - ir::Type resultType, - util::Slice arguments) = 0; + unsigned flags, + TraceHandler* traceHandler, + ir::Type resultType, + util::Slice arguments) = 0; virtual ir::Value* stackCall(ir::Value* address, unsigned flags, diff --git a/include/avian/util/cpp.h b/include/avian/util/cpp.h index f886c9054d..6be12af1a8 100644 --- a/include/avian/util/cpp.h +++ b/include/avian/util/cpp.h @@ -31,21 +31,17 @@ struct NonConst { typedef T Type; }; -template +template struct ArgumentCount; -template +template struct ArgumentCount { - enum { - Result = 1 + ArgumentCount::Result - }; + enum { Result = 1 + ArgumentCount::Result }; }; -template<> +template <> struct ArgumentCount<> { - enum { - Result = 0 - }; + enum { Result = 0 }; }; } // namespace util diff --git a/src/codegen/compiler.cpp b/src/codegen/compiler.cpp index 36a4e5783a..fbb64bf923 100644 --- a/src/codegen/compiler.cpp +++ b/src/codegen/compiler.cpp @@ -2535,10 +2535,10 @@ class MyCompiler : public Compiler { } virtual ir::Value* nativeCall(ir::Value* address, - unsigned flags, - TraceHandler* traceHandler, - ir::Type resultType, - util::Slice arguments) + unsigned flags, + TraceHandler* traceHandler, + ir::Type resultType, + util::Slice arguments) { bool bigEndian = c.arch->bigEndian(); diff --git a/src/compile.cpp b/src/compile.cpp index 65a1417a72..6435df5bf3 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -3084,11 +3084,12 @@ bool useLongJump(MyThread* t, uintptr_t target) void compileSafePoint(MyThread* t, Compiler* c, Frame* frame) { - c->nativeCall(c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister())); + c->nativeCall( + c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister())); } void compileDirectInvoke(MyThread* t, @@ -3258,10 +3259,10 @@ void compileDirectAbstractInvoke(MyThread* t, compileAbstractInvoke( frame, c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::iptr(), - args(c->threadRegister(), frame->append(target))), + 0, + frame->trace(0, 0), + ir::Type::iptr(), + args(c->threadRegister(), frame->append(target))), target, tailCall); } @@ -3283,10 +3284,10 @@ void handleMonitorEvent(MyThread* t, Frame* frame, intptr_t function) } c->nativeCall(c->constant(function, ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), lock)); + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), lock)); } } @@ -3655,8 +3656,9 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) frame->pop(ir::Type::object()); ir::Type type = MATCH(target->name(), "getInt") ? ir::Type::i4() : ir::Type::f4(); - frame->push(type, - c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); + frame->push( + type, + c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); return true; } else if ((MATCH(target->name(), "putInt") and MATCH(target->spec(), "(JI)V")) @@ -3677,8 +3679,9 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target) frame->pop(ir::Type::object()); ir::Type type = MATCH(target->name(), "getLong") ? ir::Type::i8() : ir::Type::f8(); - frame->pushLarge(type, - c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); + frame->pushLarge( + type, + c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); return true; } else if ((MATCH(target->name(), "putLong") and MATCH(target->spec(), "(JJ)V")) @@ -3916,11 +3919,12 @@ loop: frame->pushObject(); - c->nativeCall(c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister())); + c->nativeCall( + c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister())); } if (DebugInstructions) { @@ -4489,8 +4493,7 @@ loop: 0, frame->trace(0, 0), ir::Type::void_(), - args(c->threadRegister(), - frame->append(field->class_()))); + args(c->threadRegister(), frame->append(field->class_()))); } table = frame->append(field->class_()->staticTable()); @@ -4587,12 +4590,11 @@ loop: if (TargetBytesPerWord == 4 and (field->code() == DoubleField or field->code() == LongField)) { c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), - frame->append(field))); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), frame->append(field))); } else { c->nullaryOp(lir::LoadBarrier); } @@ -4614,8 +4616,7 @@ loop: 0, frame->trace(0, 0), rType, - args(c->threadRegister(), - frame->append(pair))); + args(c->threadRegister(), frame->append(pair))); } else { ir::Value* instance = frame->pop(ir::Type::object()); @@ -4625,9 +4626,7 @@ loop: 0, frame->trace(0, 0), rType, - args(c->threadRegister(), - frame->append(pair), - instance)); + args(c->threadRegister(), frame->append(pair), instance)); } frame->pushReturnValue(fieldCode, result); @@ -4918,14 +4917,14 @@ loop: thunk = instanceOfFromReferenceThunk; } - frame->push(ir::Type::i4(), - c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::i4(), - args(c->threadRegister(), - frame->append(argument), - instance))); + frame->push( + ir::Type::i4(), + c->nativeCall( + c->constant(getThunk(t, thunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::i4(), + args(c->threadRegister(), frame->append(argument), instance))); } break; case invokeinterface: { @@ -4968,12 +4967,12 @@ loop: ir::Value* result = c->stackCall( c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::iptr(), - args(c->threadRegister(), - frame->append(argument), - c->peek(1, parameterFootprint - 1))), + 0, + frame->trace(0, 0), + ir::Type::iptr(), + args(c->threadRegister(), + frame->append(argument), + c->peek(1, parameterFootprint - 1))), tailCall ? Compiler::TailJump : 0, frame->trace(0, 0), operandTypeForFieldCode(t, returnCode), @@ -5120,9 +5119,10 @@ loop: frame->trace(0, 0), ir::Type::iptr(), args(c->threadRegister(), - frame->append(pair), - c->peek(1, - methodReferenceParameterFootprint(t, ref, false) - 1))), + frame->append(pair), + c->peek(1, + methodReferenceParameterFootprint(t, ref, false) + - 1))), ref, false, isReferenceTailCall(t, code, ip, context->method, ref)); @@ -5250,14 +5250,11 @@ loop: } else { frame->push(ir::Type::i4(), c->nativeCall(c->constant(getThunk(t, compareLongsThunk), - ir::Type::iptr()), - 0, - 0, - ir::Type::i4(), - args(nullptr, - a, - nullptr, - b))); + ir::Type::iptr()), + 0, + 0, + ir::Type::i4(), + args(nullptr, a, nullptr, b))); } } break; @@ -5302,20 +5299,21 @@ loop: frame->trace(0, 0), ir::Type::object(), args(c->threadRegister(), - frame->append(makePair(t, context->method, reference))))); + frame->append( + makePair(t, context->method, reference))))); } } if (v) { if (objectClass(t, v) == type(t, GcClass::Type)) { - frame->push(ir::Type::object(), - c->nativeCall(c->constant(getThunk(t, getJClass64Thunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::object(), - args(c->threadRegister(), - frame->append(v)))); + frame->push( + ir::Type::object(), + c->nativeCall(c->constant(getThunk(t, getJClass64Thunk), + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::object(), + args(c->threadRegister(), frame->append(v)))); } else { frame->push(ir::Type::object(), frame->append(v)); } @@ -5535,23 +5533,21 @@ loop: case monitorenter: { ir::Value* target = frame->pop(ir::Type::object()); c->nativeCall(c->constant(getThunk(t, acquireMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), - target)); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), target)); } break; case monitorexit: { ir::Value* target = frame->pop(ir::Type::object()); c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), - target)); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), target)); } break; case multianewarray: { @@ -5583,13 +5579,13 @@ loop: ir::Value* result = c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::object(), - args(c->threadRegister(), - frame->append(argument), - c->constant(dimensions, ir::Type::i4()), - c->constant(offset, ir::Type::i4()))); + 0, + frame->trace(0, 0), + ir::Type::object(), + args(c->threadRegister(), + frame->append(argument), + c->constant(dimensions, ir::Type::i4()), + c->constant(offset, ir::Type::i4()))); frame->popFootprint(dimensions); frame->push(ir::Type::object(), result); @@ -5620,13 +5616,13 @@ loop: thunk = makeNewFromReferenceThunk; } - frame->push(ir::Type::object(), - c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::object(), - args(c->threadRegister(), - frame->append(argument)))); + frame->push( + ir::Type::object(), + c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::object(), + args(c->threadRegister(), frame->append(argument)))); } break; case newarray: { @@ -5636,13 +5632,13 @@ loop: frame->push(ir::Type::object(), c->nativeCall(c->constant(getThunk(t, makeBlankArrayThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::object(), - args(c->threadRegister(), - c->constant(type, ir::Type::i4()), - length))); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::object(), + args(c->threadRegister(), + c->constant(type, ir::Type::i4()), + length))); } break; case nop: @@ -5683,8 +5679,7 @@ loop: 0, frame->trace(0, 0), ir::Type::void_(), - args(c->threadRegister(), - frame->append(field->class_()))); + args(c->threadRegister(), frame->append(field->class_()))); } staticTable = field->class_()->staticTable(); @@ -5703,12 +5698,11 @@ loop: PROTECT(t, field); c->nativeCall(c->constant(getThunk(t, acquireMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), - frame->append(field))); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), frame->append(field))); } else { c->nullaryOp(lir::StoreStoreBarrier); } @@ -5779,9 +5773,10 @@ loop: frame->trace(0, 0), ir::Type::void_(), args(c->threadRegister(), - table, - c->constant(targetFieldOffset(context, field), ir::Type::i4()), - value)); + table, + c->constant(targetFieldOffset(context, field), + ir::Type::i4()), + value)); } else { c->nativeCall( c->constant(getThunk(t, setObjectThunk), ir::Type::iptr()), @@ -5789,9 +5784,10 @@ loop: 0, ir::Type::void_(), args(c->threadRegister(), - table, - c->constant(targetFieldOffset(context, field), ir::Type::i4()), - value)); + table, + c->constant(targetFieldOffset(context, field), + ir::Type::i4()), + value)); } break; @@ -5803,12 +5799,11 @@ loop: if (TargetBytesPerWord == 4 and (fieldCode == DoubleField or fieldCode == LongField)) { c->nativeCall(c->constant(getThunk(t, releaseMonitorForObjectThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - ir::Type::void_(), - args(c->threadRegister(), - frame->append(field))); + ir::Type::iptr()), + 0, + frame->trace(0, 0), + ir::Type::void_(), + args(c->threadRegister(), frame->append(field))); } else { c->nullaryOp(lir::StoreLoadBarrier); } @@ -5837,37 +5832,32 @@ loop: 0, frame->trace(0, 0), rType, - args(c->threadRegister(), - frame->append(pair), - value)); + args(c->threadRegister(), frame->append(pair), value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); - c->nativeCall(c->constant(getThunk(t, setFieldValueFromReferenceThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - rType, - args(c->threadRegister(), - frame->append(pair), - instance, - value)); + c->nativeCall( + c->constant(getThunk(t, setFieldValueFromReferenceThunk), + ir::Type::iptr()), + 0, + frame->trace(0, 0), + rType, + args( + c->threadRegister(), frame->append(pair), instance, value)); } } break; case DoubleField: case LongField: { if (instruction == putstatic) { - c->nativeCall(c->constant( - getThunk(t, setStaticLongFieldValueFromReferenceThunk), - ir::Type::iptr()), - 0, - frame->trace(0, 0), - rType, - args(c->threadRegister(), - frame->append(pair), - nullptr, - value)); + c->nativeCall( + c->constant( + getThunk(t, setStaticLongFieldValueFromReferenceThunk), + ir::Type::iptr()), + 0, + frame->trace(0, 0), + rType, + args(c->threadRegister(), frame->append(pair), nullptr, value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); @@ -5878,10 +5868,10 @@ loop: frame->trace(0, 0), rType, args(c->threadRegister(), - frame->append(pair), - instance, - nullptr, - value)); + frame->append(pair), + instance, + nullptr, + value)); } } break; @@ -5894,9 +5884,7 @@ loop: 0, frame->trace(0, 0), rType, - args(c->threadRegister(), - frame->append(pair), - value)); + args(c->threadRegister(), frame->append(pair), value)); } else { ir::Value* instance = frame->pop(ir::Type::object()); @@ -5906,10 +5894,8 @@ loop: 0, frame->trace(0, 0), rType, - args(c->threadRegister(), - frame->append(pair), - instance, - value)); + args( + c->threadRegister(), frame->append(pair), instance, value)); } } break; diff --git a/src/tools/type-generator/main.cpp b/src/tools/type-generator/main.cpp index f11a548e82..f360109b26 100644 --- a/src/tools/type-generator/main.cpp +++ b/src/tools/type-generator/main.cpp @@ -1473,7 +1473,6 @@ void writeMap(Output* out, Module& module, Class* cl) { std::ostringstream ss; for (const auto f : cl->fields) { - ss << "Type_"; ss << enumName(module, f); if (f->nogc) { From 99815694400b512440825861c54df709508fdb34 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Thu, 17 Jul 2014 10:19:11 -0600 Subject: [PATCH 5/5] update README with new build requirements (gcc 4.6, MSVC 11) --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 78515e4eb0..1b366ad85a 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,9 @@ Building Build requirements include: * GNU make 3.80 or later - * GCC 3.4 or later (4.5.1 or later for Windows/x86_64) + * GCC 4.6 or later or LLVM Clang 3.1 or later (see use-clang option below) - * JDK 1.5 or later + * JDK 1.6 or later * MinGW 3.4 or later (only if compiling for Windows) * zlib 1.2.3 or later @@ -226,24 +226,25 @@ still need to have GCC installed - MSVC is only used to compile the C++ portions of the VM, while the assembly code and helper tools are built using GCC. -The MSVC build has been tested with Visual Studio Express Edition -versions 8, 9, and 10. Other versions may also work. +*Note that the MSVC build isn't tested regularly, so is fairly likely to be broken.* + +Avian targets MSVC 11 and above (it uses c++ features not available in older versions). To build with MSVC, install Cygwin as described above and set the following environment variables: - $ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/cygdrive/c/Program Files/Microsoft Visual Studio 9.0/Common7/IDE:/cygdrive/c/Program Files/Microsoft Visual Studio 9.0/VC/BIN:/cygdrive/c/Program Files/Microsoft Visual Studio 9.0/Common7/Tools:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v3.5:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Program Files/Microsoft Visual Studio 9.0/VC/VCPackages:/cygdrive/c/Program Files/Microsoft SDKs/Windows/v6.0A/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem" - $ export LIBPATH="C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;" - $ export VCINSTALLDIR="C:\Program Files\Microsoft Visual Studio 9.0\VC" - $ export LIB="C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib;" - $ export INCLUDE="C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include;" + $ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/Common7/IDE:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/VC/BIN:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/Common7/Tools:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v3.5:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/VC/VCPackages:/cygdrive/c/Program Files/Microsoft SDKs/Windows/v6.0A/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem" + $ export LIBPATH="C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 11.0\VC\LIB;" + $ export VCINSTALLDIR="C:\Program Files\Microsoft Visual Studio 11.0\VC" + $ export LIB="C:\Program Files\Microsoft Visual Studio 11.0\VC\LIB;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib;" + $ export INCLUDE="C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include;" Adjust these definitions as necessary according to your MSVC installation. Finally, build with the msvc flag set to the MSVC tool directory: - $ make msvc="/cygdrive/c/Program Files/Microsoft Visual Studio 9.0/VC" + $ make msvc="/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/VC" Building with the OpenJDK Class Library