aboutsummaryrefslogtreecommitdiff
path: root/tcg/tcg.h
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2019-02-07 13:26:40 +0000
committerRichard Henderson <richard.henderson@linaro.org>2019-02-11 08:52:44 -0800
commitbef16ab4e641636b4e85c3d863b4257ce0be4e6f (patch)
treeff857b9e8eda32e70d336d6b855befd609685714 /tcg/tcg.h
parenta044e3de2917d54b95f1211f4d14ec30cac9a59f (diff)
downloadqemu-bef16ab4e641636b4e85c3d863b4257ce0be4e6f.zip
qemu-bef16ab4e641636b4e85c3d863b4257ce0be4e6f.tar.gz
qemu-bef16ab4e641636b4e85c3d863b4257ce0be4e6f.tar.bz2
tcg: Diagnose referenced labels that have not been emitted
Currently, a jump to a label that is not defined anywhere will be emitted not be relocated. This results in a jump to a random jump target. With tcg debugging, print a diagnostic to the -d op file and abort. This could help debug or detect errors like c2d9644e6d ("target/arm: Fix crash on conditional instruction in an IT block") Reported-by: Roman Kapl <code@rkapl.cz> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tcg/tcg.h')
-rw-r--r--tcg/tcg.h12
1 files changed, 9 insertions, 3 deletions
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 045c24a..32b7cf3 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -244,16 +244,21 @@ typedef struct TCGRelocation {
intptr_t addend;
} TCGRelocation;
-typedef struct TCGLabel {
+typedef struct TCGLabel TCGLabel;
+struct TCGLabel {
+ unsigned present : 1;
unsigned has_value : 1;
- unsigned id : 15;
+ unsigned id : 14;
unsigned refs : 16;
union {
uintptr_t value;
tcg_insn_unit *value_ptr;
TCGRelocation *first_reloc;
} u;
-} TCGLabel;
+#ifdef CONFIG_DEBUG_TCG
+ QSIMPLEQ_ENTRY(TCGLabel) next;
+#endif
+};
typedef struct TCGPool {
struct TCGPool *next;
@@ -685,6 +690,7 @@ struct TCGContext {
#endif
#ifdef CONFIG_DEBUG_TCG
+ QSIMPLEQ_HEAD(, TCGLabel) labels;
int temps_in_use;
int goto_tb_issue_mask;
#endif