From 2d5d8eda5ae326ef91cc07a28bcf05992716f407 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Wed, 9 Feb 2011 17:16:49 +0900 Subject: [PATCH] Save the caller's address when creating new relocations. --- tools/qfcc/include/reloc.h | 1 + tools/qfcc/source/reloc.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/tools/qfcc/include/reloc.h b/tools/qfcc/include/reloc.h index d2fc9636b..9f507269b 100644 --- a/tools/qfcc/include/reloc.h +++ b/tools/qfcc/include/reloc.h @@ -69,6 +69,7 @@ typedef struct reloc_s { reloc_type type; int line; string_t file; + void *return_address; } reloc_t; struct statement_s; diff --git a/tools/qfcc/source/reloc.c b/tools/qfcc/source/reloc.c index 96dba64ce..4967dc40f 100644 --- a/tools/qfcc/source/reloc.c +++ b/tools/qfcc/source/reloc.c @@ -161,6 +161,7 @@ new_reloc (int offset, reloc_type type) ref->type = type; ref->line = pr.source_line; ref->file = pr.source_file; + ref->return_address = __builtin_return_address (0); return ref; } @@ -168,6 +169,7 @@ void reloc_op_def (def_t *def, int offset, int field) { reloc_t *ref = new_reloc (offset, rel_op_a_def + field); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -176,6 +178,7 @@ void reloc_op_def_ofs (def_t *def, int offset, int field) { reloc_t *ref = new_reloc (offset, rel_op_a_def_ofs + field); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -184,6 +187,7 @@ void reloc_def_def (def_t *def, int offset) { reloc_t *ref = new_reloc (offset, rel_def_def); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -192,6 +196,7 @@ void reloc_def_def_ofs (def_t *def, int offset) { reloc_t *ref = new_reloc (offset, rel_def_def_ofs); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -200,6 +205,7 @@ void reloc_def_func (function_t *func, int offset) { reloc_t *ref = new_reloc (offset, rel_def_func); + ref->return_address = __builtin_return_address (0); ref->next = func->refs; func->refs = ref; } @@ -208,6 +214,7 @@ void reloc_def_string (int offset) { reloc_t *ref = new_reloc (offset, rel_def_string); + ref->return_address = __builtin_return_address (0); ref->next = pr.relocs; pr.relocs = ref; } @@ -216,6 +223,7 @@ void reloc_def_field (def_t *def, int offset) { reloc_t *ref = new_reloc (offset, rel_def_field); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -224,6 +232,7 @@ void reloc_def_field_ofs (def_t *def, int offset) { reloc_t *ref = new_reloc (offset, rel_def_field_ofs); + ref->return_address = __builtin_return_address (0); ref->next = def->relocs; def->relocs = ref; } @@ -232,6 +241,7 @@ void reloc_def_op (ex_label_t *label, int offset) { reloc_t *ref = new_reloc (offset, rel_def_op); + ref->return_address = __builtin_return_address (0); ref->next = pr.relocs; ref->label = label; pr.relocs = ref;