From ee24d756bf207a67779fad9a497a52085d1ea81f Mon Sep 17 00:00:00 2001 From: epetrich Date: Sun, 3 Apr 2005 03:20:57 +0000 Subject: [PATCH] * src/SDCCast.c (decorateType): fixed bug #1105626 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3716 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 4 ++++ src/SDCCast.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3e5c7c17..72c5bda4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-04-03 Erik Petrich + + * src/SDCCast.c (decorateType): fixed bug #1105626 + 2005-04-02 Vangelis Rokas * device/include/asm/pic16/features.h, diff --git a/src/SDCCast.c b/src/SDCCast.c index e0ea695a..f9183db0 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -3565,11 +3565,39 @@ decorateType (ast * tree, RESULT_TYPE resultType) if (IS_ADDRESS_OF_OP(tree->right) && IS_AST_SYM_VALUE (tree->right->left) && SPEC_ABSA (AST_SYMBOL (tree->right->left)->etype)) { + + symbol * sym = AST_SYMBOL (tree->right->left); + unsigned int gptype = 0; + unsigned int addr = SPEC_ADDR (sym->etype); + if (IS_GENPTR (LTYPE (tree)) && GPTRSIZE > FPTRSIZE) + { + switch (SPEC_SCLS (sym->etype)) + { + case S_CODE: + gptype = GPTYPE_CODE; + break; + case S_XDATA: + gptype = GPTYPE_FAR; + break; + case S_DATA: + gptype = GPTYPE_NEAR; + break; + case S_IDATA: + gptype = GPTYPE_IDATA; + break; + case S_PDATA: + gptype = GPTYPE_XSTACK; + break; + default: + gptype = 0; + } + addr |= gptype << (8*(GPTRSIZE - 1)); + } + tree->type = EX_VALUE; tree->opval.val = - valCastLiteral (LTYPE (tree), - SPEC_ADDR (AST_SYMBOL (tree->right->left)->etype)); + valCastLiteral (LTYPE (tree), addr); TTYPE (tree) = tree->opval.val->type; TETYPE (tree) = getSpec (TTYPE (tree)); tree->left = NULL; -- 2.30.2