| 1 | #!/usr/bin/env bash
|
| 2 | #
|
| 3 | # Junk drawer for ASDL.
|
| 4 | #
|
| 5 | # Usage:
|
| 6 | # asdl/run.sh <function name>
|
| 7 |
|
| 8 | set -o nounset
|
| 9 | set -o pipefail
|
| 10 | set -o errexit
|
| 11 |
|
| 12 | REPO_ROOT=$(cd "$(dirname $0)/.."; pwd)
|
| 13 | readonly REPO_ROOT
|
| 14 |
|
| 15 | source build/common.sh
|
| 16 |
|
| 17 | export PYTHONPATH='.:vendor/'
|
| 18 |
|
| 19 | #
|
| 20 | # Native Code
|
| 21 | #
|
| 22 |
|
| 23 | # http://www.commandlinefu.com/commands/view/6004/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively
|
| 24 | # http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb
|
| 25 | gdb-trace() {
|
| 26 | # -args goes before the executable
|
| 27 | gdb -batch -ex "run" -ex "bt" -args "$@" 2>&1
|
| 28 | }
|
| 29 |
|
| 30 | # http://stackoverflow.com/questions/22769246/disassemble-one-function-using-objdump
|
| 31 | # It would be nice to disassemble a single function.
|
| 32 |
|
| 33 | disassemble() {
|
| 34 | local opt_flag=${1:-'-O0'}
|
| 35 | local out=_tmp/typed_arith_demo$opt_flag.S
|
| 36 | $CLANGXX -std='c++11' $opt_flag -I _tmp -o $out -S \
|
| 37 | -mllvm --x86-asm-syntax=intel asdl/typed_arith_demo.cc
|
| 38 | #cat $out
|
| 39 | }
|
| 40 |
|
| 41 | llvm() {
|
| 42 | local opt_flag=${1:-'-O0'}
|
| 43 | local out=_tmp/typed_arith_demo$opt_flag.ll
|
| 44 | $CLANGXX -std='c++11' $opt_flag -I _tmp -o $out -S \
|
| 45 | -emit-llvm asdl/typed_arith_demo.cc
|
| 46 | #cat $out
|
| 47 | }
|
| 48 |
|
| 49 | # With -O0, you can see all the functions. With -O2, they ARE inlined.
|
| 50 | objdump-arith() {
|
| 51 | # NOTE: This doesn't take into account different optimization levels
|
| 52 | objdump -d _tmp/typed_arith_demo | grep '^0'
|
| 53 | }
|
| 54 | # https://sourceware.org/ml/binutils/2010-04/msg00447.html
|
| 55 | # http://stackoverflow.com/questions/4274804/query-on-ffunction-section-fdata-sections-options-of-gcc
|
| 56 | # Hm you can force a function. Write it inline with typed_arith_demo.cc then.
|
| 57 |
|
| 58 | # TODO: Is there a pattern we can grep for to test if ANY accessor was NOT
|
| 59 | # inlined? Demangle names I guess.
|
| 60 | nm-arith() {
|
| 61 | nm _tmp/typed_arith_demo
|
| 62 | }
|
| 63 |
|
| 64 | opt-stats() {
|
| 65 | wc -l _tmp/*.S
|
| 66 | echo
|
| 67 | wc -l _tmp/*.ll
|
| 68 | echo
|
| 69 | md5sum _tmp/*.S
|
| 70 | echo
|
| 71 | md5sum _tmp/*.ll
|
| 72 | }
|
| 73 |
|
| 74 | compare-opts() {
|
| 75 | # http://stackoverflow.com/questions/15548023/clang-optimization-levels
|
| 76 | # Says -Os is identical to -O2? But not according to my test!
|
| 77 |
|
| 78 | for opt in -Os -O0 -O1 -O2 -O3 -O4; do
|
| 79 | echo $opt
|
| 80 | disassemble $opt
|
| 81 | llvm $opt
|
| 82 | done
|
| 83 | opt-stats
|
| 84 | }
|
| 85 |
|
| 86 | regress() {
|
| 87 | bin/osh -n configure > _tmp/configure-tree-abbrev.txt
|
| 88 | bin/osh --ast-format text -n configure > _tmp/configure-tree-full.txt
|
| 89 | { wc -l _tmp/configure*.txt
|
| 90 | md5sum _tmp/configure*.txt
|
| 91 | } #| tee _tmp/gold.txt
|
| 92 | }
|
| 93 |
|
| 94 | # To check if the lines go over 100 characters.
|
| 95 | line-length-hist() {
|
| 96 | for f in _tmp/configure*.txt; do
|
| 97 | echo $f
|
| 98 | awk '{ print length($0) } ' $f | sort -n | uniq -c | tail
|
| 99 | done
|
| 100 | }
|
| 101 |
|
| 102 | gen-cpp-errors() {
|
| 103 |
|
| 104 | # This doesn't produce an error, even though 'int?' isn't representable in C++
|
| 105 | cat >_tmp/bad.asdl <<EOF
|
| 106 | module bad {
|
| 107 | foo = (int? x, int y)
|
| 108 | }
|
| 109 | EOF
|
| 110 |
|
| 111 | asdl/asdl_main.py cpp _tmp/bad.asdl _tmp/asdl_bad
|
| 112 |
|
| 113 | ls -l _tmp/asdl_bad*
|
| 114 | }
|
| 115 |
|
| 116 | "$@"
|