summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-03-08 03:03:53 -0500
committerGriffinR <griffin.g.richards@gmail.com>2021-03-10 16:45:38 -0500
commitb2f0efc6f7882d4d8f5da28e5e8748cd4f91159d (patch)
treeb95324c81c904ffeb040b00b354257a136536525
parent42b93f8359b07bc99516f5cf6cf1f42ec65ba029 (diff)
Replace Travis CI with Github workflow
-rwxr-xr-x.github/calcrom/webhook.sh (renamed from .travis/calcrom/webhook.sh)7
-rw-r--r--.github/workflows/build.yml47
-rw-r--r--.travis.yml46
-rwxr-xr-x.travis/calcrom/calcrom.pl188
-rw-r--r--ld_script_modern.txt7
5 files changed, 55 insertions, 240 deletions
diff --git a/.travis/calcrom/webhook.sh b/.github/calcrom/webhook.sh
index 86da74c87..2a3015969 100755
--- a/.travis/calcrom/webhook.sh
+++ b/.github/calcrom/webhook.sh
@@ -1,10 +1,5 @@
#!/bin/bash -ex
-# Only run this script if it's the master branch build.
-if [[ "$TRAVIS_BRANCH" != "master" || "$TRAVIS_PULL_REQUEST" != "false" ]]; then
- exit 0
-fi
-
build_name=$1
map_file=$build_name.map
if [ ! -f $map_file ]; then
@@ -13,4 +8,4 @@ if [ ! -f $map_file ]; then
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\":\"\`\`\`$build_name progress:\\n$output\`\`\`\"}" -H "Content-Type: application/json" -X POST $CALCROM_DISCORD_WEBHOOK_URL
+curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`$build_name progress:\\n$output\`\`\`\"}" -H "Content-Type: application/json" -X POST "$CALCROM_DISCORD_WEBHOOK_URL"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..f8ad97065
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,47 @@
+name: CI
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+
+jobs:
+ build:
+ runs-on: ubuntu-18.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@master
+
+ - 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: |
+ git clone https://github.com/pret/agbcc.git
+ cd agbcc
+ ./build.sh
+ ./install.sh ../
+
+ - name: Compare FireRed
+ run: |
+ make -j${nproc} compare_firered
+ make -j${nproc} compare_firered_rev1
+
+ - name: Compare LeafGreen
+ run: |
+ make -j${nproc} compare_leafgreen
+ make -j${nproc} compare_leafgreen_rev1
+
+ - name: Modern
+ run: make -j${nproc} modern
+
+ - name: Webhook
+ if: ${{ github.event_name == 'push' }}
+ env:
+ CALCROM_DISCORD_WEBHOOK_USERNAME: OK
+ CALCROM_DISCORD_WEBHOOK_AVATAR_URL: https://i.imgur.com/38BQHdd.png
+ CALCROM_DISCORD_WEBHOOK_URL: ${{ secrets.CALCROM_DISCORD_WEBHOOK_URL }}
+ run: sh .github/calcrom/webhook.sh pokefirered
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 2f9187233..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-language: generic
-dist: bionic
-os: linux
-env:
- global:
- - DEVKITPRO=$HOME
- - DEVKITARM=$DEVKITPRO/devkitARM
-addons:
- apt:
- packages:
- - gcc-multilib
- - linux-libc-dev
- - zlib-dev
-cache:
- apt: true
-install:
- - pushd $HOME
- - travis_retry wget https://github.com/devkitPro/buildscripts/releases/download/devkitARM_r52/devkitARM_r52-linux.tar.xz
- - tar xJf devkitARM*.tar.xz
- - travis_retry wget https://github.com/devkitPro/devkitarm-rules/releases/download/v1.0.0/devkitarm-rules-1.0.0.tar.xz
- - tar xJf devkitarm-rules-*.tar.xz -C $DEVKITARM
- - travis_retry git clone https://github.com/pret/agbcc.git
- - cd agbcc && sh build.sh && sh install.sh $TRAVIS_BUILD_DIR
- - popd
-jobs:
- include:
- - os: linux
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - g++-7
- env: _="Build"
- script:
- - make tools CXX=g++-7
- - make -j2 compare
- - make -j2 compare_leafgreen
- - make -j2 compare_firered_rev1
- - make -j2 compare_leafgreen_rev1
- - make -j2 modern
- - make -j2 leafgreen_modern
- - make -j2 firered_rev1_modern
- - make -j2 leafgreen_rev1_modern
-after_success:
- - .travis/calcrom/webhook.sh pokefirered
diff --git a/.travis/calcrom/calcrom.pl b/.travis/calcrom/calcrom.pl
deleted file mode 100755
index fb0a9df8c..000000000
--- a/.travis/calcrom/calcrom.pl
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/perl
-
-# Usage:
-# calcrom.pl <mapfile> [--verbose]
-#
-# mapfile: path to .map file output by LD
-# verbose: set to get more detailed output
-
-use IPC::Cmd qw[ run ];
-use Getopt::Long;
-
-my $verbose = "";
-
-GetOptions("verbose" => \$verbose);
-(@ARGV == 1)
- or die "ERROR: no map file specified.\n";
-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;
-
-# 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 pokefirered.elf | awk '{print \$3}' | grep '^[^_].\\{4\\}' | uniq";
-
-# This looks for Unknown_, Unknown_, or sub_, followed by just numbers. Note that
-# it matches even if stuff precedes the unknown, like sUnknown/gUnknown.
-my $undoc_cmd = "grep '[Uu]nknown_[0-9a-fA-F]*\\|sub_[0-9a-fA-F]*'";
-
-# 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.
-my $partial_doc_cmd = "grep '_[0-38][0-9a-fA-F]\\{5,6\\}'";
-
-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 | $undoc_cmd | $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 | $partial_doc_cmd | $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.
-my $undocumented = $undocumented_as_string + 0;
-(($undocumented != 0) and ($undocumented_as_string ne "0"))
- or die "ERROR: Cannot convert string to num: '$undocumented_as_string'";
-
-my $partial_documented = $partial_documented_as_string + 0;
-(($partial_documented != 0) and ($partial_documented_as_string ne "0"))
- or die "ERROR: Cannot convert string to num: '$partial_documented_as_string'";
-
-my $total_syms = $total_syms_as_string + 0;
-(($total_syms != 0) and ($total_syms_as_string ne "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);
-
-# partial_documented is double-counting the unknown_* and sub_* symbols.
-$partial_documented = $partial_documented - $undocumented;
-
-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";
-}
-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/ld_script_modern.txt b/ld_script_modern.txt
index 588685112..9f1508067 100644
--- a/ld_script_modern.txt
+++ b/ld_script_modern.txt
@@ -41,6 +41,13 @@ SECTIONS {
*(.text*);
} =0
+ .text.unlikely :
+ ALIGN(4)
+ {
+ src/crt0.o(.text.unlikely);
+ *(.text.unlikely*);
+ } =0
+
script_data :
ALIGN(4)
{