|
|
|
@ -361,7 +361,28 @@ int main(int argc, char **argv) { |
|
|
|
|
raise EnvironmentException('Could not run sizeof test binary.') |
|
|
|
|
return int(res.stdout) |
|
|
|
|
|
|
|
|
|
def cross_alignment(self, typename, env): |
|
|
|
|
templ = '''#include<stddef.h> |
|
|
|
|
struct tmp { |
|
|
|
|
char c; |
|
|
|
|
%s target; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
int testarray[%d-offsetof(struct tmp, target)]; |
|
|
|
|
''' |
|
|
|
|
try: |
|
|
|
|
extra_args = env.cross_info.config['properties'][self.language + '_args'] |
|
|
|
|
except KeyError: |
|
|
|
|
pass |
|
|
|
|
for i in range(1, 1024): |
|
|
|
|
code = templ % (typename, i) |
|
|
|
|
if self.compiles(code, extra_args): |
|
|
|
|
return i |
|
|
|
|
raise EnvironmentException('Cross checking offsetof overflowed.') |
|
|
|
|
|
|
|
|
|
def alignment(self, typename, env): |
|
|
|
|
if self.is_cross: |
|
|
|
|
return self.cross_alignment(typename, env) |
|
|
|
|
templ = '''#include<stdio.h> |
|
|
|
|
#include<stddef.h> |
|
|
|
|
|
|
|
|
@ -375,23 +396,7 @@ int main(int argc, char **argv) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
''' |
|
|
|
|
varname = 'alignment ' + typename |
|
|
|
|
varname = varname.replace(' ', '_') |
|
|
|
|
if self.is_cross: |
|
|
|
|
val = env.cross_info.config['properties'][varname] |
|
|
|
|
if val is not None: |
|
|
|
|
if isinstance(val, int): |
|
|
|
|
return val |
|
|
|
|
raise EnvironmentException('Cross variable {0} is not an integer.'.format(varname)) |
|
|
|
|
cross_failed = False |
|
|
|
|
try: |
|
|
|
|
res = self.run(templ % typename) |
|
|
|
|
except CrossNoRunException: |
|
|
|
|
cross_failed = True |
|
|
|
|
if cross_failed: |
|
|
|
|
message = '''Can not determine alignment of {0} because cross compiled binaries are not runnable. |
|
|
|
|
Please define the corresponding variable {1} in your cross compilation definition file.'''.format(typename, varname) |
|
|
|
|
raise EnvironmentException(message) |
|
|
|
|
res = self.run(templ % typename) |
|
|
|
|
if not res.compiled: |
|
|
|
|
raise EnvironmentException('Could not compile alignment test.') |
|
|
|
|
if res.returncode != 0: |
|
|
|
|