Пример #1
0
    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
            )
Пример #2
0
    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)
Пример #3
0
    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
Пример #4
0
    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)
Пример #5
0
    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)