def declare_global_var(self, var): """ :param var: """ align = var.align if align is None: align = 1 if var.array(): var_size = var.size if isinstance(var, microprobe.code.var.VariableArray): var_size = var.elems return "%s %s[%d] __attribute__ ((aligned (%d)));\n" % ( var.type, var.name, var_size, align ) elif var.value is not None: return "%s %s __attribute__ ((aligned (%d))) = %s;\n" % ( var.type, var.name, align, str(var.value) ) else: return "%s %s __attribute__ ((aligned (%d)));\n" % ( var.type, var.name, align )
def declare_global_var(self, var): """ :param var: """ align = var.align if align is None or align is 0: align = "" else: align = " __attribute__ ((aligned (%d)))" % align if var.array(): if var.value is not None: valuestr = "" value = var.value if not isinstance(value, list): value = [value] get_value = getnextf(itertools.cycle(value)) for dummy_idx in range(var.elems): value = get_value() if callable(value): value = value() valuestr = "%s%s," % (valuestr, value) return "%s %s[%d] %s = {%s};\n" % (var.type, var.name, var.size, align, valuestr) else: return "%s %s[%d] %s;\n" % (var.type, var.name, var.size, align) else: if var.value is not None: return "%s %s %s = %s;\n" % (var.type, var.name, align, var.value) else: return "%s %s %s;\n" % (var.type, var.name, align)
def init_global_var(self, var, value): """ :param var: :param value: """ if var.array(): if var.type == "char": if self._max_array_var is None: if value == "random": string = "{FILE *devrandom = fopen(\"/dev/urandom\","\ " \"r\");\n" string = string + "fread(&%s, sizeof(%s), %d , "\ "devrandom);\n" % (var.name, var.type, var.size) string = string + "fclose(devrandom);}\n" self._max_array_var = var self._max_array_var_value = value return string elif isinstance(value, six.integer_types): return "{memset(&%s, %d, %d);}\n" % (var.name, value, var.size) else: raise NotImplementedError else: if value == self._max_array_var_value: varant = self._max_array_var if var.size > varant.size: self._max_array_var = var self._max_array_var_value = value size = varant.size else: size = var.size return "{for (int i=0;i<%d;i=i+%d) "\ "memcpy(&%s[i], &%s" ", %d);}\n" % ( var.size, varant.size, var.name, varant.name, size) elif isinstance(value, six.integer_types): return "{memset(&%d, %d, %d);}\n" % (var.name, value, var.size) else: raise NotImplementedError elif (var.type == "int" or var.type == "long" or var.type == "float" or var.type == "double" or var.type == "long long"): initialization = "" for xsize in range(var.elems): initialization += "%s[%d] = " % (var.name, xsize) if var.value is None: initialization += "0" else: initialization += str(var.value) initialization += ";\n" return initialization else: raise NotImplementedError else: if isinstance(value, six.integer_types): return "%s = %d;\n" % (var.name, value) else: raise NotImplementedError
def init_global_var(self, var, value): """ :param var: :param value: """ if var.array(): if var.type == "char" or var.type == "uint8_t": if self._max_array_var is None: if callable(value): value = value() if value == "random": string = "{FILE *devrandom = fopen(\"/dev/urandom\","\ " \"r\");\n" string = string + "fread(&%s, sizeof(%s), %d , "\ "devrandom);\n" % (var.name, var.type, var.size) string = string + "fclose(devrandom);}\n" self._max_array_var = var self._max_array_var_value = value return string elif isinstance(value, six.integer_types): value = min(value, 2**31) value = max(value, -2**31) return "{memset(&%s, %d, %d);}\n" % (var.name, value, var.size) else: raise NotImplementedError else: if value == self._max_array_var_value: varant = self._max_array_var if var.size > varant.size: self._max_array_var = var self._max_array_var_value = value rstr = [] rstr.append("{for (int i=0;i<%d;i=i+%d) " "memcpy(&%s[i], &%s" ", %d);}" % ((var.size // varant.size) * varant.size, varant.size, var.name, varant.name, varant.size)) rstr.append( "{for (int i=%d;i<%d;i=i+%d) " "memcpy(&%s[i], &%s" ", %d);}" % ((var.size // varant.size) * varant.size, var.size, (var.size % varant.size), var.name, varant.name, (var.size % varant.size))) return "\n".join(rstr) + '\n' else: return "{for (int i=0;i<%d;i=i+%d) "\ "memcpy(&%s[i], &%s" ", %d);}\n" % ( var.size, var.size, var.name, varant.name, var.size) # size = varant.size # else: # size = var.size cgdc = gcd(var.size, varant.size) return "{for (int i=0;i<%d;i=i+%d) "\ "memcpy(&%s[i], &%s" ", %d);}\n" % ( var.size, cgdc, var.name, varant.name, cgdc) elif isinstance(value, six.integer_types): value = min(value, 2**31) value = max(value, -2**31) return "{memset(&%d, %d, %d);}\n" % (var.name, value, var.size) else: raise NotImplementedError else: raise NotImplementedError else: if isinstance(value, six.integer_types): return "%s = %d;\n" % (var.name, value) elif value == 'random': return "%s = %d;\n" % (var.name, 0) else: raise NotImplementedError( "Init support for value '%s' not implemented yet" % value)
def __call__(self, building_block, target): """ :param building_block: :param dummy_target: """ for var in self._variables: if (var.address is not None and not building_block.context.symbolic): # This is an absolute address that we need to modify # to be relative to the data segment var.set_address(var.address - building_block.context.data_segment) LOG.debug("Declaring: %s", var) building_block.register_var(var, building_block.context) if not self._code_init: return context = building_block.context instrs = [] for var in self._variables: values = var.value if var.array(): typesize = var.size // var.elems elems = var.elems if not isinstance(var.value, list): values = [var.value] * elems else: typesize = var.size elems = 1 if not isinstance(var.value, list): values = [var.value] * elems assert len(values) == elems vreg = target.scratch_registers[0] iaddress = var.address.copy() for value in values: instrs += target.set_register(vreg, value, context) context.set_register_value(vreg, value) try: instrs += target.store_integer(vreg, iaddress, typesize * 8, context) except MicroprobeCodeGenerationError: areg = target.scratch_registers[1] instrs += target.set_register_to_address( areg, iaddress, context, ) context.set_register_value(areg, iaddress) instrs += target.store_integer(vreg, iaddress, typesize * 8, context) iaddress += typesize building_block.add_init(instrs)