Beberapa waktu lalu, muncul pesan error ketika melakukan kompilasi OpenOCD setelah melakukan upgrade compiler ke gcc versi 10.1.1. Pesan error yang muncul ketika proses kompilasi berlangsung adalah sebagai berikut:

In file included from ./src/flash/common.h:21,
                 from src/flash/nor/core.h:25,
                 from src/flash/nor/imp.h:22,
                 from src/flash/nor/jtagspi.c:22:
src/flash/nor/jtagspi.c: In function ‘jtagspi_write_enable’:
./src/helper/log.h:133:2: error: ‘status’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  133 |  log_printf_lf(LOG_LVL_ERROR, __FILE__, __LINE__, __func__, expr)
      |  ^~~~~~~~~~~~~
src/flash/nor/jtagspi.c:262:11: note: ‘status’ was declared here
  262 |  uint32_t status;
      |           ^~~~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I./src -I./src -I./src/helper -DPKGDATADIR=\"/usr/local/share/openocd\" -DBINDIR=\"/usr/local/bin\" -I./jimtcl -I./jimtcl -Wall -Wstrict-prototypes -Wformat-security -Wshadow -Wextra -Wno-unused-parameter -Wbad-function-cast -Wcast-align -Wredundant-decls -Werror -g -O2 -MT src/flash/nor/lpc2000.lo -MD -MP -MF src/flash/nor/.deps/lpc2000.Tpo -c src/flash/nor/lpc2000.c -o src/flash/nor/lpc2000.o
src/flash/nor/jtagspi.c: In function ‘jtagspi_wait’:
src/flash/nor/jtagspi.c:249:15: error: ‘status’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  249 |   if ((status & SPIFLASH_BSY_BIT) == 0) {
      |       ~~~~~~~~^~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

Berikut ini adalah kode pada file src/flash/nor/jtagspi.c yang menimbulkan pesan error di atas, dan mitigasinya agar tidak menimbulkan error, yaitu melakukan inisialisasi dengan nilai 0:

static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
{
    uint32_t status = 0;        // inisialisasi dengan nilai 0 untuk menghindari error
    int64_t t0 = timeval_ms();
    int64_t dt;

    do {
        dt = timeval_ms() - t0;
        jtagspi_read_status(bank, &status);
        if ((status & SPIFLASH_BSY_BIT) == 0) {
            LOG_DEBUG("waited %" PRId64 " ms", dt);
            return ERROR_OK;
        }
        alive_sleep(1);
    } while (dt <= timeout_ms);

    LOG_ERROR("timeout, device still busy");
    return ERROR_FAIL;
}

static int jtagspi_write_enable(struct flash_bank *bank)
{
    uint32_t status = 0;        // inisialisasi dengan nilai 0 untuk menghindari error

    jtagspi_cmd(bank, SPIFLASH_WRITE_ENABLE, NULL, NULL, 0);
    jtagspi_read_status(bank, &status);
    if ((status & SPIFLASH_WE_BIT) == 0) {
        LOG_ERROR("Cannot enable write to flash. Status=0x%08" PRIx32, status);
        return ERROR_FAIL;
    }
    return ERROR_OK;
}

Berikut ini adalah hasil diff yang dapat digunakan untuk melakukan patching source di atas:

diff -ru openocd-old/src/flash/nor/jtagspi.c openocd/src/flash/nor/jtagspi.c
--- openocd-old/src/flash/nor/jtagspi.c 2020-05-12 13:08:09.011492531 +0800
+++ openocd/src/flash/nor/jtagspi.c     2020-05-12 13:11:52.241937440 +0800
@@ -239,7 +239,7 @@

 static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
 {
-       uint32_t status;
+       uint32_t status = 0;
        int64_t t0 = timeval_ms();
        int64_t dt;

@@ -259,7 +259,7 @@

 static int jtagspi_write_enable(struct flash_bank *bank)
 {
-       uint32_t status;
+       uint32_t status = 0;

        jtagspi_cmd(bank, SPIFLASH_WRITE_ENABLE, NULL, NULL, 0);
        jtagspi_read_status(bank, &status);

Agar lebih mudah, diff di atas dapat disimpan sebagai file, misalnya openocd_fix_status.diff. Dan cara menggunakannya misalnya seperti ini:

% git clone --recursive "https://repo.or.cz/openocd.git"
% patch -p0 < openocd_fix_status.diff

Jika proses patching gagal, perhatikan bahwa file diff di atas menggunakan spasi bukan tabulasi yang dapat menimbulkan error. Setelah proses patching selesai, maka proses kompilasi dapat dilanjutkan. Cukup pindah ke direktori openocd lalu lakukan konfigurasi, kompilasi dan instalasi (sebagai root):

% cd openocd
% ./configure
% make -j4
% sudo make install-strip
% make distclean

Sekian jurnal singkat kali ini, semoga bermanfaat. Terima kasih kepada Allah SWT, dan Anda yang telah membaca tutorial ini.