diff --git a/.github/calcrom/calcrom.pl b/.github/calcrom/calcrom.pl deleted file mode 100755 index ef0bf4149..000000000 --- a/.github/calcrom/calcrom.pl +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/perl - -# Usage: -# calcrom.pl [--verbose][--data] -# -# mapfile: path to .map file output by LD -# verbose: set to get more detailed output -# data: set to output % breakdown of data - -use IPC::Cmd qw[ run ]; -use Getopt::Long; - -my $usage = "Usage: calcrom.pl file.map [--verbose][--data]\n"; -my $verbose = ""; -my $showData; - -GetOptions("verbose" => \$verbose, "data" => \$showData) or die $usage; -(@ARGV == 1) - or die $usage; -open(my $file, $ARGV[0]) - or die "ERROR: could not open file '$ARGV[0]'.\n"; - -my $src = 0; -my $asm = 0; -my $srcdata = 0; -my $data = 0; -my @pairs = (); -while (my $line = <$file>) -{ - if ($line =~ /^ \.(\w+)\s+0x[0-9a-f]+\s+(0x[0-9a-f]+) (\w+)\/(.+)\.o/) - { - my $section = $1; - my $size = hex($2); - my $dir = $3; - my $basename = $4; - if ($size & 3) - { - $size += 4 - ($size % 3); - } - - if ($section =~ /text/) - { - if ($dir eq 'src') - { - $src += $size; - } - elsif ($dir eq 'asm') - { - if (!($basename =~ /(crt0|libagbsyscall|libgcnmultiboot|m4a_1)/)) - { - push @pairs, [$basename, $size]; - } - $asm += $size; - } - } - elsif ($section =~ /rodata/) - { - if ($dir eq 'src') - { - $srcdata += $size; - } - elsif ($dir eq 'data') - { - $data += $size; - } - } - } -} - -my @sorted = sort { $a->[1] <=> $b->[1] } @pairs; -(my $elffname = $ARGV[0]) =~ s/\.map/.elf/; - -# Note that the grep filters out all branch labels. It also requires a minimum -# line length of 5, to filter out a ton of generated symbols (like AcCn). No -# settings to nm seem to remove these symbols. Finally, nm prints out a separate -# entry for whenever a name appears in a file, not just where it's defined. uniq -# removes all the duplicate entries. -# -# -# You'd expect this to take a while, because of uniq. It runs in under a second, -# though. Uniq is pretty fast! -my $base_cmd = "nm $elffname | awk '{print \$3}' | grep '^[^_].\\{4\\}' | uniq"; - -# This looks for Unknown_, Unknown_, or sub_, followed by an address. Note that -# it matches even if stuff precedes the unknown, like sUnknown/gUnknown. -my $undoc_regex = "'[Uu]nknown_[0-9a-fA-F]\\{5,7\\}\\|sub_[0-9a-fA-F]\\{5,7\\}'"; - -# This looks for every symbol with an address at the end of it. Some things are -# given a name based on their type / location, but still have an unknown purpose. -# For example, FooMap_EventScript_FFFFFFF. -# The above may be double counted here, and will need to be filtered out. -my $partial_doc_regex = "'_[0-28][0-9a-fA-F]\\{5,7\\}'"; - -my $count_cmd = "wc -l"; - -# It sucks that we have to run this three times, but I can't figure out how to get -# stdin working for subcommands in perl while still having a timeout. It's decently -# fast anyway. -my $total_syms_as_string; -(run ( - command => "$base_cmd | $count_cmd", - buffer => \$total_syms_as_string, - timeout => 60 -)) - or die "ERROR: Error while getting all symbols: $?"; - -my $undocumented_as_string; -(run ( - command => "$base_cmd | grep $undoc_regex | $count_cmd", - buffer => \$undocumented_as_string, - timeout => 60 -)) - or die "ERROR: Error while filtering for undocumented symbols: $?"; - -my $partial_documented_as_string; -(run ( - command => "$base_cmd | grep $partial_doc_regex | grep -v $undoc_regex | $count_cmd", - buffer => \$partial_documented_as_string, - timeout => 60 -)) - or die "ERROR: Error while filtering for partial symbols: $?"; - -# Performing addition on a string converts it to a number. Any string that fails -# to convert to a number becomes 0. So if our converted number is 0, but our string -# is nonzero, then the conversion was an error. -$undocumented_as_string =~ s/^\s+|\s+$//g; -my $undocumented = $undocumented_as_string + 0; -(($undocumented != 0) or (($undocumented == 0) and ($undocumented_as_string eq "0"))) - or die "ERROR: Cannot convert string to num: '$undocumented_as_string'"; - -$partial_documented_as_string =~ s/^\s+|\s+$//g; -my $partial_documented = $partial_documented_as_string + 0; -(($partial_documented != 0) or (($partial_documented == 0) and ($partial_documented_as_string eq "0"))) - or die "ERROR: Cannot convert string to num: '$partial_documented_as_string'"; - -$total_syms_as_string =~ s/^\s+|\s+$//g; -my $total_syms = $total_syms_as_string + 0; -(($total_syms != 0) or (($total_syms == 0) and ($total_syms_as_string eq "0"))) - or die "ERROR: Cannot convert string to num: '$total_syms_as_string'"; - -($total_syms != 0) - or die "ERROR: No symbols found."; - -my $total = $src + $asm; -my $srcPct = sprintf("%.4f", 100 * $src / $total); -my $asmPct = sprintf("%.4f", 100 * $asm / $total); - -my $documented = $total_syms - ($undocumented + $partial_documented); -my $docPct = sprintf("%.4f", 100 * $documented / $total_syms); -my $partialPct = sprintf("%.4f", 100 * $partial_documented / $total_syms); -my $undocPct = sprintf("%.4f", 100 * $undocumented / $total_syms); - -if ($asm == 0) -{ - print "Code decompilation is 100% complete\n" -} -else -{ - print "$total total bytes of code\n"; - print "$src bytes of code in src ($srcPct%)\n"; - print "$asm bytes of code in asm ($asmPct%)\n"; -} -print "\n"; - -if ($verbose != 0) -{ - print "BREAKDOWN\n"; - foreach my $item (@sorted) - { - print " $item->[1] bytes in asm/$item->[0].s\n" - } - print "\n"; -} - -if ($partial_documented == 0 && $undocumented == 0) -{ - print "Documentation is 100% complete\n" -} -else -{ - print "$total_syms total symbols\n"; - print "$documented symbols documented ($docPct%)\n"; - print "$partial_documented symbols partially documented ($partialPct%)\n"; - print "$undocumented symbols undocumented ($undocPct%)\n"; -} - -if ($showData) -{ - print "\n"; - - my $dataTotal = $srcdata + $data; - my $srcDataPct = sprintf("%.4f", 100 * $srcdata / $dataTotal); - my $dataPct = sprintf("%.4f", 100 * $data / $dataTotal); - print "$dataTotal total bytes of data\n"; - print "$srcdata bytes of data in src ($srcDataPct%)\n"; - print "$data bytes of data in data ($dataPct%)\n"; -} diff --git a/.github/calcrom/webhook.sh b/.github/calcrom/webhook.sh deleted file mode 100755 index fd54b660b..000000000 --- a/.github/calcrom/webhook.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -ex - -build_name=$1 -map_file=$build_name.map -if [ ! -f $map_file ]; then - echo "$map_file does not exist!" - exit 1 -fi - -output=$(perl $(dirname "$0")/calcrom.pl $build_name.map | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g') -curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`\\n$build_name progress:\\n$output\\n\`\`\`\"}" -H "Content-Type: application/json" -X POST "$CALCROM_DISCORD_WEBHOOK_URL" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 7ae5c5844..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: CI - -on: - push: - branches: [ master ] - pull_request: - -jobs: - build: - runs-on: ubuntu-latest - env: - GAME_VERSION: FIRERED - GAME_LANGUAGE: ENGLISH - GAME_REVISION: 0 - MODERN: 0 - COMPARE: 1 - steps: - - name: Checkout - uses: actions/checkout@master - - - name: Checkout agbcc - uses: actions/checkout@master - with: - path: 'agbcc' - repository: 'pret/agbcc' - - - name: Checkout symbols - if: ${{ github.event_name == 'push' }} - uses: actions/checkout@master - with: - path: 'symbols' - ref: 'symbols' - - - name: Install binutils - run: sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi - # build-essential, git, and libpng-dev are already installed - # gcc-arm-none-eabi is only needed for the modern build - # as an alternative to dkP - - - name: Install agbcc - run: | - ./build.sh - ./install.sh ../ - working-directory: ./agbcc - - - name: Compare FireRed - run: | - make -j${nproc} all syms - - - name: Compare FireRed rev1 - env: - GAME_REVISION: 1 - run: | - make -j${nproc} all syms - - - name: Compare LeafGreen - env: - GAME_VERSION: LEAFGREEN - run: | - make -j${nproc} all syms - - - name: Compare LeafGreen rev1 - env: - GAME_VERSION: LEAFGREEN - GAME_REVISION: 1 - run: | - make -j${nproc} all syms - - - name: Build Modern - env: - MODERN: 1 - COMPARE: 0 - run: | - make -j${nproc} all - - - name: Move symfiles - if: ${{ github.event_name == 'push' }} - run: | - cp *.sym symbols/ - echo "SYMBOLS_COMMIT_MSG=$( git log --format=%s ${GITHUB_SHA} )" >> $GITHUB_ENV - - - name: Update symfiles - if: ${{ github.event_name == 'push' }} - uses: EndBug/add-and-commit@v7 - with: - branch: symbols - cwd: "./symbols" - add: "*.sym" - message: ${{ env.SYMBOLS_COMMIT_MSG }}