Home  |  Linux  | Mysql  | PHP  | XML
From:Nuno Lopes Date:Thu Oct 23 10:12:09 2008
Subject:cvs: pecl /llvm phpllvm.cpp phpllvm_compile.cpp phpllvm_execute.cpp phpllvm_execute.h
nlopess		Thu Oct 23 14:12:09 2008 UTC

  Modified files:              
    /pecl/llvm	phpllvm.cpp phpllvm_compile.cpp phpllvm_execute.cpp 
              	phpllvm_execute.h 
  Log:
  fix execute data padding
  fix some typos in the execute data struct dumping, it isnt fully working, though
  use the new raw_ostream API instead of std::ostream
  remove some useless TSRMLS_D/C
  
http://cvs.php.net/viewvc.cgi/pecl/llvm/phpllvm.cpp?r1=1.7&r2=1.8&diff_format=u
Index: pecl/llvm/phpllvm.cpp
diff -u pecl/llvm/phpllvm.cpp:1.7 pecl/llvm/phpllvm.cpp:1.8
--- pecl/llvm/phpllvm.cpp:1.7	Tue Jul 29 00:54:51 2008
+++ pecl/llvm/phpllvm.cpp	Thu Oct 23 14:12:09 2008
@@ -62,10 +62,10 @@
 
 	REGISTER_INI_ENTRIES();
 
-	init_jit_engine(NULL TSRMLS_CC);
+	init_jit_engine(NULL);
 
 	if (INI_BOOL("phpllvm.active"))
-		override_executor(TSRMLS_C);
+		override_executor();
 
 	return SUCCESS;
 }
@@ -74,12 +74,12 @@
 static PHP_MSHUTDOWN_FUNCTION(phpllvm)
 {
 	if (INI_BOOL("phpllvm.active"))
-		restore_executor(TSRMLS_C);
+		restore_executor();
 
 	UNREGISTER_INI_ENTRIES();
 
 	save_module(TEMP_FILE);
-	destroy_jit_engine(TSRMLS_C);
+	destroy_jit_engine();
 
 	return SUCCESS;
 }
@@ -96,7 +96,7 @@
 static PHP_MINFO_FUNCTION(phpllvm)
 {
 	php_info_print_table_start();
-	php_info_print_table_row(2, "Revision", "$Revision: 1.7 $");
+	php_info_print_table_row(2, "Revision", "$Revision: 1.8 $");
 	php_info_print_table_row(2, "LLVM version", getLLVMString());
 	php_info_print_table_end();
 
http://cvs.php.net/viewvc.cgi/pecl/llvm/phpllvm_compile.cpp?r1=1.18&r2=1.19&diff_format=u
Index: pecl/llvm/phpllvm_compile.cpp
diff -u pecl/llvm/phpllvm_compile.cpp:1.18 pecl/llvm/phpllvm_compile.cpp:1.19
--- pecl/llvm/phpllvm_compile.cpp:1.18	Sat Aug  9 15:17:00 2008
+++ pecl/llvm/phpllvm_compile.cpp	Thu Oct 23 14:12:09 2008
@@ -305,6 +305,14 @@
 	return process_oparray;
 }
 
+
+static void add_padding(std::vector<Constant*> &v, unsigned bytes)
+{
+	for (unsigned i = 0; i < bytes; ++i) {
+		v.push_back(ConstantInt::get(Type::Int8Ty, 0));
+	}
+}
+
 static GlobalVariable* dump_class_entry(zend_class_entry* class_entry, Module* mod) {
 	const Type* class_entry_type = mod->getTypeByName(STRUCT("zend_class_entry"));
 
@@ -498,10 +506,7 @@
 		op_members.push_back(ConstantInt::get(Type::Int8Ty, opcodes[i].opcode));
 
 #ifdef COMPILED_WITH_CLANG
-		// clang adds some padding
-		for (uint i = 0; i < 3; ++i) {
-			op_members.push_back(ConstantInt::get(Type::Int8Ty, 0));
-		}
+		add_padding(op_members, 3);
 #endif
 
 		ops.push_back(ConstantStruct::get(op_type, op_members));
@@ -581,11 +586,12 @@
 }
 
 static GlobalVariable* dump_try_catch_array(zend_try_catch_element* elements, int count, Module* mod) {
-	const StructType* try_catch_element_type = cast<const StructType>(mod->getTypeByName(STRUCT("zend_try_catch_element")));
+	const StructType* try_catch_element_type = cast<const StructType>(mod->getTypeByName(STRUCT("zend_label")));
+	const Type* uint_type = Type::Int32Ty; // TODO: adjust this automatically
 
 	std::vector<Constant*> members;
 
-	for(int i = 0; i < count; i++) {
+	for (int i = 0; i < count; ++i) {
 		// typedef struct _zend_try_catch_element {
 		// 	zend_uint try_op;
 		// 	zend_uint catch_op;  /* ketchup! */
@@ -594,8 +600,8 @@
 
 		std::vector<Constant*> element_members;
 
-		element_members.push_back(ConstantInt::get(Type::Int32Ty, elements[i].try_op));
-		element_members.push_back(ConstantInt::get(Type::Int32Ty, elements[i].catch_op));
+		element_members.push_back(ConstantInt::get(uint_type, elements[i].try_op));
+		element_members.push_back(ConstantInt::get(uint_type, elements[i].catch_op));
 
 		members.push_back(ConstantStruct::get(try_catch_element_type, element_members));
 	}
@@ -618,14 +624,15 @@
 
 static GlobalVariable* dump_op_array(zend_op_array* op_array, Module* mod, ExecutionEngine* engine) {
 	const StructType* op_array_type = cast<const StructType>(mod->getTypeByName(STRUCT("zend_op_array")));
-	const Type* class_entry_type = mod->getTypeByName(STRUCT("zend_class_entry"));
-	const Type* function_type = mod->getTypeByName(UNION("zend_function"));
 	const Type* arg_info_type = mod->getTypeByName(STRUCT("zend_arg_info"));
-	const Type* compiled_variable_type = mod->getTypeByName(STRUCT("zend_compiled_variable"));
 	const Type* brk_cont_element_type = mod->getTypeByName(STRUCT("zend_brk_cont_element"));
-	const Type* try_catch_element_type = mod->getTypeByName(STRUCT("zend_try_catch_element"));
-	const Type* hashtable_type = mod->getTypeByName(STRUCT("HashTable"));
+	const Type* class_entry_type = mod->getTypeByName(STRUCT("zend_class_entry"));
+	const Type* compiled_variable_type = mod->getTypeByName(STRUCT("zend_compiled_variable"));
+	const Type* function_type = mod->getTypeByName(UNION("zend_function"));
+	const Type* hashtable_type = mod->getTypeByName(STRUCT("hashtable"));
+	const Type* label_type = mod->getTypeByName(STRUCT("zend_label"));
 	const Type* op_type = mod->getTypeByName(STRUCT("zend_op"));
+	const Type* uint_type = Type::Int32Ty; // TODO: adjust this automatically
 
 	std::vector<Constant*> members;
 
@@ -633,42 +640,47 @@
 
 	// zend_uchar type;
 	members.push_back(ConstantInt::get(Type::Int8Ty, op_array->type));
+	add_padding(members, 3);
 
 	// char *function_name;
 	if (op_array->function_name) {
 		Constant* string = ConstantArray::get(op_array->function_name);
 		GlobalVariable* var = new GlobalVariable(string->getType(), true, GlobalValue::InternalLinkage, string, "function_name", mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(Type::Int8Ty)));
+	}
 
 	// zend_class_entry *scope;
-	if (op_array->scope)
+	if (op_array->scope) {
 		members.push_back(dump_class_entry(op_array->scope, mod));
-	else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(class_entry_type)));
+	}
 
 	// zend_uint fn_flags;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->fn_flags));
+	members.push_back(ConstantInt::get(uint_type, op_array->fn_flags));
 
 	// union _zend_function *prototype;
-	if (op_array->prototype)
+	if (op_array->prototype) {
 		members.push_back(dump_function(op_array->prototype, mod));
-	else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(function_type)));
+	}
 
 	// zend_uint num_args;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->num_args));
+	members.push_back(ConstantInt::get(uint_type, op_array->num_args));
 
 	// zend_uint required_num_args;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->num_args));
+	members.push_back(ConstantInt::get(uint_type, op_array->num_args));
 
 	// zend_arg_info *arg_info;
-	if (op_array->prototype) {
+	if (op_array->arg_info) {
 		GlobalVariable* var = dump_arg_info_array(op_array->arg_info, op_array->num_args, mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(arg_info_type)));
+	}
 
 	// zend_bool pass_rest_by_reference;
 	members.push_back(ConstantInt::get(Type::Int8Ty, op_array->pass_rest_by_reference));
@@ -679,41 +691,46 @@
 	// zend_bool done_pass_two;
 	members.push_back(ConstantInt::get(Type::Int8Ty, op_array->done_pass_two));
 
+	add_padding(members, 1);
+
 	// zend_uint *refcount;
-	if (op_array->function_name) {
-		GlobalVariable* var = new GlobalVariable(Type::Int32Ty, true, GlobalValue::InternalLinkage, ConstantInt::get(Type::Int32Ty, *op_array->refcount), "refcount", mod);
+	if (op_array->refcount) {
+		GlobalVariable* var = new GlobalVariable(uint_type, true, GlobalValue::InternalLinkage, ConstantInt::get(uint_type, *op_array->refcount), "refcount", mod);
 		members.push_back(var);
-	} else
-		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(Type::Int32Ty)));
+	} else {
+		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(uint_type)));
+	}
 
 	// zend_op *opcodes;
 	GlobalVariable* opcodes = dump_opcodes(op_array->opcodes, op_array->last, mod, engine);
 	members.push_back(opcodes);
 
 	// zend_uint last, size;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->last));
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->last)); // not "size" intentionally
+	members.push_back(ConstantInt::get(uint_type, op_array->last));
+	members.push_back(ConstantInt::get(uint_type, op_array->last)); // not "size" intentionally
 
 	// zend_compiled_variable *vars;
 	if (op_array->vars) {
 		GlobalVariable* var = dump_compiled_vars(op_array->vars, op_array->last_var, mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(compiled_variable_type)));
+	}
 
 	// int last_var, size_var;
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->last_var));
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->size_var));
 
 	// zend_uint T;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->T));
+	members.push_back(ConstantInt::get(uint_type, op_array->T));
 
 	// zend_brk_cont_element *brk_cont_array;
 	if (op_array->brk_cont_array) {
 		GlobalVariable* var = dump_brk_cont_array(op_array->brk_cont_array, op_array->last_brk_cont, mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(brk_cont_element_type)));
+	}
 
 	// int last_brk_cont;
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->last_brk_cont));
@@ -721,11 +738,13 @@
 	// int current_brk_cont;
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->current_brk_cont));
 
+	// zend_try_catch_element *try_catch_array;
 	if (op_array->try_catch_array) {
 		GlobalVariable* var = dump_try_catch_array(op_array->try_catch_array, op_array->last_try_catch, mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
-		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(try_catch_element_type)));
+	} else {
+		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(label_type)));
+	}
 
 	// int last_try_catch;
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->last_try_catch));
@@ -741,47 +760,50 @@
 		indices.push_back(ConstantInt::get(Type::Int32Ty, 0));
 		indices.push_back(ConstantInt::get(Type::Int32Ty, start));
 		members.push_back(ConstantExpr::getGetElementPtr(opcodes, &indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(op_type)));
+	}
 
 	// int backpatch_count;
 	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->backpatch_count));
 
 	// zend_uint this_var;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->this_var));
+	members.push_back(ConstantInt::get(uint_type, op_array->this_var));
 
 	// char *filename;
 	if (op_array->filename) {
 		Constant* string = ConstantArray::get(op_array->filename);
 		GlobalVariable* var = new GlobalVariable(string->getType(), true, GlobalValue::InternalLinkage, string, "filename", mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(Type::Int8Ty)));
+	}
 
 	// zend_uint line_start;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->line_start));
+	members.push_back(ConstantInt::get(uint_type, op_array->line_start));
 
 	// zend_uint line_end;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->line_end));
+	members.push_back(ConstantInt::get(uint_type, op_array->line_end));
 
 	// char *doc_comment;
 	if (op_array->doc_comment) {
 		Constant* string = ConstantArray::get(op_array->doc_comment);
 		GlobalVariable* var = new GlobalVariable(string->getType(), true, GlobalValue::InternalLinkage, string, "doc_comment", mod);
 		members.push_back(ConstantExpr::getGetElementPtr(var, &zero_indices[0], 2));
-	} else
+	} else {
 		members.push_back(ConstantPointerNull::get(PointerType::getUnqual(Type::Int8Ty)));
+	}
 
 	// zend_uint doc_comment_len;
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->doc_comment_len));
+	members.push_back(ConstantInt::get(uint_type, op_array->doc_comment_len));
 
 	// zend_uint early_binding; /* the linked list of delayed declarations */
-	members.push_back(ConstantInt::get(Type::Int32Ty, op_array->early_binding));
+	members.push_back(ConstantInt::get(uint_type, op_array->early_binding));
 
 	// void *reserved[ZEND_MAX_RESERVED_RESOURCES];
 	const ArrayType *ptr_array_type = ArrayType::get(PointerType::getUnqual(Type::Int8Ty), ZEND_MAX_RESERVED_RESOURCES);
 	std::vector<Constant*> vals;
-	for(int i = 0; op_array->reserved[i] && i < ZEND_MAX_RESERVED_RESOURCES; i++) {
+	for(unsigned i = 0; op_array->reserved[i] && i < ZEND_MAX_RESERVED_RESOURCES; i++) {
 		// TODO: Do these need to be deep copied?
 		GlobalVariable* var = new GlobalVariable(Type::Int8Ty, true, GlobalValue::InternalLinkage, ConstantInt::get(Type::Int8Ty, (uint64_t) op_array->reserved[i]), "reserved_ptr", mod);
 		vals.push_back(var);
http://cvs.php.net/viewvc.cgi/pecl/llvm/phpllvm_execute.cpp?r1=1.12&r2=1.13&diff_format=u
Index: pecl/llvm/phpllvm_execute.cpp
diff -u pecl/llvm/phpllvm_execute.cpp:1.12 pecl/llvm/phpllvm_execute.cpp:1.13
--- pecl/llvm/phpllvm_execute.cpp:1.12	Tue Aug 12 15:14:11 2008
+++ pecl/llvm/phpllvm_execute.cpp	Thu Oct 23 14:12:09 2008
@@ -21,29 +21,24 @@
 #include "phpllvm_compile.h"
 
 #include <llvm/PassManager.h>
-#include <llvm/CallingConv.h>
-#include <llvm/Support/IRBuilder.h>
-
-#include "llvm/ModuleProvider.h"
+#include <llvm/ModuleProvider.h>
 #include <llvm/ExecutionEngine/ExecutionEngine.h>
 #include <llvm/ExecutionEngine/GenericValue.h>
 #include <llvm/Support/MemoryBuffer.h>
 #include <llvm/Bitcode/ReaderWriter.h>
 #include <llvm/Analysis/Verifier.h>
 #include <llvm/Assembly/PrintModulePass.h>
-
-#include "llvm/Target/TargetData.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Transforms/IPO.h"
-
-#include <fstream>
+#include <llvm/Target/TargetData.h>
+#include <llvm/Transforms/Scalar.h>
+#include <llvm/Transforms/IPO.h>
+#include <llvm/Support/raw_ostream.h>
 
 using namespace llvm;
 using namespace phpllvm;
 
-/* pointer to the original Zend engine execute function */
+// pointer to the original Zend engine execute function
 typedef void (zend_execute_t)(zend_op_array *op_array TSRMLS_DC);
-static zend_execute_t *old_execute;
+static zend_execute_t *old_execute = NULL;
 
 static ExecutionEngine* engine;
 static Module* module;
@@ -65,31 +60,36 @@
 	verifyModule(*module, AbortProcessAction);
 #endif
 
-	std::ofstream bc_os(filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
-	if (!bc_os.fail()) {
-		WriteBitcodeToFile(module, bc_os);
+	std::string ErrorInfo;
+	raw_fd_ostream os(filename, ErrorInfo);
+
+	if (ErrorInfo.empty()) {
+		WriteBitcodeToFile(module, os);
 	}
 }
 
-void phpllvm::init_jit_engine(const char* filename TSRMLS_DC) {
+void phpllvm::init_jit_engine(const char* filename) {
 
-	if (!filename)
+	if (!filename) {
 		filename = "module_template.bc";
+	}
 
-	/* read in the template that includes the handlers */
+	// read in the template that includes the handlers
 	MemoryBuffer* buf;
 	std::string err;
 
-	if (!(buf = MemoryBuffer::getFile(filename, &err)))
+	if (!(buf = MemoryBuffer::getFile(filename, &err))) {
 		fprintf(stderr, "Couldn't read handlers file: %s", err.c_str());
+	}
 
-	if (!(module = ParseBitcodeFile(buf, &err)))
+	if (!(module = ParseBitcodeFile(buf, &err))) {
 		fprintf(stderr, "Couldn't parse handlers file: %s", err.c_str());
+	}
 
 	provider = new ExistingModuleProvider(module);
 	engine = ExecutionEngine::create(provider);
 
-	/* Force codegen of handlers. */
+	// Force codegen of handlers. this is a workaround for an LLVM bug in the JIT engine
 	for (Module::iterator I = module->begin(), E = module->end(); I != E; ++I) {
 		Function *Fn = &*I;
 		if (!Fn->isDeclaration() && Fn->getName().compare(0, 5, "ZEND_") == 0) {
@@ -98,44 +98,36 @@
 		}
 	}
 
-	/* Set up the optimization passes */
+	// Set up the optimization passes
 	opt_fpass_manager = new FunctionPassManager(provider);
 
 	opt_fpass_manager->add(new TargetData(*engine->getTargetData()));
 	pass_manager.add(new TargetData(*engine->getTargetData()));
 
 	// IPO optimizations
-	// Inline function calls.
 	pass_manager.add(createFunctionInliningPass());
 
 	// local optimizations
-	// Do simple "peephole" optimizations and bit-twiddling optzns.
 	opt_fpass_manager->add(createInstructionCombiningPass());
-	// Reassociate expressions.
 	opt_fpass_manager->add(createReassociatePass());
-	// Eliminate Common SubExpressions.
 	opt_fpass_manager->add(createGVNPass());
-	// Simplify the control flow graph (deleting unreachable blocks, etc).
 	opt_fpass_manager->add(createCFGSimplificationPass());
 }
 
-void phpllvm::destroy_jit_engine(TSRMLS_D) {
+void phpllvm::destroy_jit_engine() {
 	delete engine;
-	engine = NULL;
-	provider = NULL;
-
 	delete opt_fpass_manager;
-	opt_fpass_manager = NULL;
 }
 
-void phpllvm::override_executor(TSRMLS_D) {
+void phpllvm::override_executor() {
 	old_execute = zend_execute;
 	zend_execute = phpllvm::execute;
 }
 
-void phpllvm::restore_executor(TSRMLS_D) {
-	if (old_execute)
+void phpllvm::restore_executor() {
+	if (old_execute) {
 		zend_execute = old_execute;
+	}
 }
 
 void phpllvm::execute(zend_op_array *op_array TSRMLS_DC) {
http://cvs.php.net/viewvc.cgi/pecl/llvm/phpllvm_execute.h?r1=1.5&r2=1.6&diff_format=u
Index: pecl/llvm/phpllvm_execute.h
diff -u pecl/llvm/phpllvm_execute.h:1.5 pecl/llvm/phpllvm_execute.h:1.6
--- pecl/llvm/phpllvm_execute.h:1.5	Tue Jul 29 00:54:51 2008
+++ pecl/llvm/phpllvm_execute.h	Thu Oct 23 14:12:09 2008
@@ -26,13 +26,13 @@
 
 namespace phpllvm {
 
-	void init_jit_engine(const char* filename TSRMLS_DC);
+	void init_jit_engine(const char* filename);
 
-	void destroy_jit_engine(TSRMLS_D);
+	void destroy_jit_engine();
 
-	void override_executor(TSRMLS_D);
+	void override_executor();
 
-	void restore_executor(TSRMLS_D);
+	void restore_executor();
 
 	void execute(zend_op_array *op_array TSRMLS_DC);
 

Navigate in group php.pecl.cvs at sever news.php.net
Previous Next


Your recent visits
Re: Using Heap::Elem
Re: [PHP] simplexml - can it do what I need?
RE: [PHP-WIN] What about php 5.3 and printers or PHP_PRINTER.DLL ?
Re: [PHP-INSTALL] Browser tries to download php file
Re: [PHP] 64 Bit IIS 6 ( 32 Bit mode ) + 32Bit php connect with MS-SQL Server


  
© No Copyright
You are free to use Anything
Site Maintained by Zareef Ahmed
Powered By PHP Consultants