huff-language/huff-rs

Detect duplicate destination labels

erhant opened this issue · 2 comments

erhant commented

Huff (v0.3.2) allows one to place multiple destinations for the same label:

#define macro MAIN() = takes(0) returns(0) {
    label jump
    label: 0x00
    label: 0x00
}

It apparently chooses the position of the last one as the jump target, as seen by the runtime code (result of huffc -r) of the code above:

// 610006565b5f5b5f

/* 00 */ PUSH2 0x0006
/* 03 */ JUMP
/* 04 */ JUMPDEST
/* 05 */ PUSH0
/* 06 */ JUMPDEST
/* 07 */ PUSH0

Although an unlikely bug, it would do no harm to catch this bug at compile time.

I definitely think the compiler should raise an error here, duplicate label definitions should not be allowed. Huff also won't throw an error if you accidentally declare a duplicate label as so:

#define macro A() = takes(0) returns(0) {
    first:
        sub
}

#define macro B() = takes(0) returns(0) {
    first:
        add
}

#define macro MAIN() = takes(0) returns(0) {
    A()
    B()
    first jump
}
erhant commented

Indeed, I would even go further and say it would be better if we could have scoped labels:

#define macro INNER() = {
    loop:
        // ...
        loop jumpi
}

#define macro OUTER() = {
    loop:
        // ...
        INNER()
        // ....
        loop jumpi
}

In the example above, the loop label of INNER macro will be confused with that of the OUTER, but they could perhaps be handled within the scope of the macro that they are referenced in, or a macro-specific suffix/prefix could be added to labels to get that scoping effect maybe?

NOTE: This cost me so many hours during the huffathon 🥲