13.12.2010, 18:53, "Francesco R" <viv...@gmail.com>: > 2010/12/13 Ryan Hill <dirtye...@gentoo.org> >> On Sun, 12 Dec 2010 09:01:13 -0400 >> "Sergio D. Rodríguez Inclan" <srinc...@gmail.com> wrote: >> >>> El 12/12/2010 02:46 a.m., Ryan Hill escribió: >>> > I think the fewer sources of magic USE flags the better. Maybe we could >>> > document how to figure out what instruction sets a processor supports in >>> > the >>> > handbook instead. >> >>> A good manual would be greatly appreciated :) >> >> I wrote a guide a couple weeks ago that might be a good starting point. >> >> http://en.gentoo-wiki.com/wiki/Hardware_CFLAGS > > if I read correctly the article on the wiki it does circa what the script > reported below does. > would be possible to adopt something similar for automatic C*FLAGS selection > if someone step in willing to take the pain to mantain it. > > #!/usr/bin/python > # Copyright 2010 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > # Author: Francesco Riosa > # extrapolated from http://en.gentoo-wiki.com/wiki/Hardware_CFLAGS, errors > are mine > > # kate: encoding utf-8; eol unix > # kate: indent-width 4; mixedindent off; replace-tabs on; > # kate: remove-trailing-space on; space-indent on > > # echo "int main() { return 0; }" | gcc -march=native -v -E - 2>&1 | grep > march > # echo "int main() { return 0; }" | gcc -march=core2 -v -Q -x c - 2>&1 > > """ > example output: > ./hw-cflags.py > extrapolating flags for gcc-4.4.5 > useful flags: -march=core2 -msse4.1 --param l1-cache-size=32 --param > l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=generic > redundant: -mcx16 -msahf > > extrapolating flags for gcc-4.5.1 > useful flags: -march=core2 -msse4.1 --param l1-cache-size=32 --param > l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=core2 > redundant: -mcx16 -msahf > """ > > import os > import time > import fnmatch > from subprocess import Popen, PIPE > > GCC_PATH = '/usr/bin/' > GCC_LIST = fnmatch.filter(os.listdir(GCC_PATH), 'gcc-[0-9].*') > GCC_LIST.sort() > > def extract_flags(gcccmd, header): > # get output from gcc > buf = '' > devnul = open('/dev/null', 'w') > p = Popen(gcccmd, stdin=PIPE, stdout=devnul, stderr=PIPE) > p.stdin.write("""int main() { return 0; }""") > p.stdin.close() > while p.poll() is None: > t = p.stderr.read() > buf = "buf%s" % t > time.sleep(0.01) > p.stderr.close() > devnul.close() > > # parse it > flags = [] > add = False > for line in buf.split('\n'): > if line.startswith(header): > add = True > flags += line.strip().split(' ') > continue > if add: > if line.startswith(' '): > flags += line.strip().split(' ') > else: > break > > # extract flags we are interested in > t = [] > march = '' > mtune = '-mtune=generic' > for i in xrange(len(flags)): > if flags[i].startswith('-m'): > if flags[i].startswith('-mtune'): > mtune = flags[i] > elif flags[i].startswith('-march'): > march = flags[i] > else: > t.append(flags[i]) > elif flags[i] == '--param': > t.append("%s %s" % (flags[i], flags[i+1])) > flags = t > > return march, mtune, flags > > for gcc in GCC_LIST: > > print "extrapolating flags for %s" % gcc > > gcccmd = [ GCC_PATH + gcc, '-march=native', '-v', '-E', '-', ] > header='COLLECT_GCC_OPTIONS' > march, mtune, flags_native = extract_flags(gcccmd, header) > > gcccmd = [ GCC_PATH + gcc, march, '-v', '-Q', '-x', 'c', '-', ] > header='options enabled:' > t, t, flags_enabled = extract_flags(gcccmd, header) > > redundant_flags = [] > useful_flags = [] > > for x in flags_native: > if x in flags_enabled: > redundant_flags.append(x) > else: > useful_flags.append(x) > > if gcc < "gcc-4.5.0": > mtune = '-mtune=generic' > > print " useful flags: %s %s %s " % (march, " ".join(useful_flags), mtune) > print " redundant: %s" % " ".join(redundant_flags) > print
Note that for some architectures (e.g, PowerPC) you need to add "-mcpu" case (-mcpu has the same meaning as -march on x86) -- Regards, Konstantin