Ticket #7813: 0001-Fix-mismatched-visibility-of-StgRun.patch

File 0001-Fix-mismatched-visibility-of-StgRun.patch, 9.4 KB (added by PHO, 13 months ago)
  • rts/StgCRun.c

    From 715e773915949d5c6e17b328955a147fbb3509c7 Mon Sep 17 00:00:00 2001
    From: PHO <pho@cielonegro.org>
    Date: Thu, 4 Apr 2013 17:20:39 +0900
    Subject: [PATCH] Fix mismatched visibility of StgRun
    
    We were previously declaring StgRun as a private symbol (in
    rts/StgRun.h), but were actually defining it as a public one (in
    rts/StgCRun.c). This caused a linkage problem with old binutils. See:
    http://www.haskell.org/pipermail/ghc-devs/2013-April/000932.html
    ---
     rts/StgCRun.c | 119 ++++++++++++++++++++++++++++++++++++++++------------------
     1 file changed, 83 insertions(+), 36 deletions(-)
    
    diff --git a/rts/StgCRun.c b/rts/StgCRun.c
    index f0fa6c7..4f853c4 100644
    a b  
    7070   any architecture (using miniinterpreter) 
    7171   -------------------------------------------------------------------------- */ 
    7272 
     73RTS_PRIVATE 
    7374StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED) 
    7475{ 
    7576    while (f) { 
    StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED) 
    8384    return (StgRegTable *)R1.p; 
    8485} 
    8586 
     87RTS_PRIVATE 
    8688StgFunPtr StgReturn(void) 
    8789{ 
    8890    return 0; 
    StgWord8 *win32AllocStack(void) 
    118120 
    119121#ifdef darwin_HOST_OS 
    120122#define STG_GLOBAL ".globl " 
     123#define STG_HIDDEN ".private_extern " 
    121124#else 
    122125#define STG_GLOBAL ".global " 
     126#define STG_HIDDEN ".hidden " 
    123127#endif 
    124128 
    125129/* 
    StgRunIsImplementedInAssembler(void) 
    164168{ 
    165169    __asm__ volatile ( 
    166170        STG_GLOBAL STG_RUN "\n" 
     171        STG_HIDDEN STG_RUN "\n" 
    167172        STG_RUN ":\n\t" 
    168173 
    169174        /* 
    StgRunIsImplementedInAssembler(void) 
    200205        "jmp *%%eax\n\t" 
    201206 
    202207        STG_GLOBAL STG_RETURN "\n" 
     208        STG_HIDDEN STG_RETURN "\n" 
    203209        STG_RETURN ":\n\t" 
    204210 
    205211        "movl %%esi, %%eax\n\t"   /* Return value in R1  */ 
    StgRunIsImplementedInAssembler(void) 
    236242 
    237243#ifdef x86_64_HOST_ARCH 
    238244 
    239 extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg); 
     245#define STG_GLOBAL ".globl " 
     246 
     247#ifdef darwin_HOST_OS 
     248#define STG_HIDDEN ".private_extern " 
     249#else 
     250#define STG_HIDDEN ".hidden " 
     251#endif 
    240252 
    241253static void GNUC3_ATTRIBUTE(used) 
    242254StgRunIsImplementedInAssembler(void) 
    StgRunIsImplementedInAssembler(void) 
    245257        /* 
    246258         * save callee-saves registers on behalf of the STG code. 
    247259         */ 
    248         ".globl " STG_RUN "\n" 
     260        STG_GLOBAL STG_RUN "\n" 
     261        STG_HIDDEN STG_RUN "\n" 
    249262        STG_RUN ":\n\t" 
    250263        "subq %1, %%rsp\n\t" 
    251264        "movq %%rsp, %%rax\n\t" 
    StgRunIsImplementedInAssembler(void) 
    279292#endif 
    280293        "jmp *%%rax\n\t" 
    281294 
    282         ".globl " STG_RETURN "\n" 
    283          STG_RETURN ":\n\t" 
     295        STG_GLOBAL STG_RETURN "\n" 
     296        STG_HIDDEN STG_RETURN "\n" 
     297        STG_RETURN ":\n\t" 
    284298 
    285299        "movq %%rbx, %%rax\n\t"   /* Return value in R1  */ 
    286300 
    StgRunIsImplementedInAssembler(void) 
    351365 
    352366#ifdef sparc_HOST_ARCH 
    353367 
     368RTS_PRIVATE 
    354369StgRegTable * 
    355370StgRun(StgFunPtr f, StgRegTable *basereg) { 
    356371 
    StgRun(StgFunPtr f, StgRegTable *basereg) { 
    363378    __asm__ volatile ( 
    364379                 ".align 4\n" 
    365380                 ".global " STG_RETURN "\n" 
     381                 ".hidden " STG_RETURN "\n" 
    366382                 STG_RETURN ":" 
    367383                 : : "p" (space) : "l0","l1","l2","l3","l4","l5","l6","l7"); 
    368384    /* we tell the C compiler that l0-l7 are clobbered on return to 
    StgRun(StgFunPtr f, StgRegTable *basereg) { 
    400416 
    401417#ifdef powerpc_HOST_ARCH 
    402418 
    403 extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg); 
     419#define STG_GLOBAL ".globl " 
     420 
     421#ifdef darwin_HOST_OS 
     422#define STG_HIDDEN ".private_extern " 
     423#else 
     424#define STG_HIDDEN ".hidden " 
     425#endif 
    404426 
    405427#ifdef darwin_HOST_OS 
    406428void StgRunIsImplementedInAssembler(void) 
    void StgRunIsImplementedInAssembler(void) 
    408430#if HAVE_SUBSECTIONS_VIA_SYMBOLS 
    409431            // if the toolchain supports deadstripping, we have to 
    410432            // prevent it here (it tends to get confused here). 
    411         __asm__ volatile (".no_dead_strip _StgRunIsImplementedInAssembler"); 
     433        __asm__ volatile (".no_dead_strip _StgRunIsImplementedInAssembler\n"); 
    412434#endif 
    413435        __asm__ volatile ( 
    414                 "\n.globl _StgRun\n" 
    415                 "_StgRun:\n" 
     436                STG_GLOBAL STG_RUN "\n" 
     437                STG_HIDDEN STG_RUN "\n" 
     438                STG_RUN ":\n" 
    416439                "\tmflr r0\n" 
    417440                "\tbl saveFP # f14\n" 
    418441                "\tstmw r13,-220(r1)\n" 
    void StgRunIsImplementedInAssembler(void) 
    421444                "\tmtctr r3\n" 
    422445                "\tmr r12,r3\n" 
    423446                "\tbctr\n" 
    424                 ".globl _StgReturn\n" 
    425                 "_StgReturn:\n" 
     447                STG_GLOBAL STG_RETURN "\n" 
     448                STG_HIDDEN STG_RETURN "\n" 
     449                STG_RETURN ":\n" 
    426450                "\tmr r3,r14\n" 
    427451                "\tla r1,%0(r1)\n" 
    428452                "\tlmw r13,-220(r1)\n" 
    void StgRunIsImplementedInAssembler(void) 
    441465// *) The Link Register is saved to a different offset in the caller's stack frame 
    442466//    (Linux: 4(r1), Darwin 8(r1)) 
    443467 
     468#define STG_FUNCTION(SYMBOL) ".type " SYMBOL ",@function" 
     469 
    444470static void GNUC3_ATTRIBUTE(used) 
    445471StgRunIsImplementedInAssembler(void) 
    446472{ 
    447473        __asm__ volatile ( 
    448                 "\t.globl StgRun\n" 
    449                 "\t.type StgRun,@function\n" 
    450                 "StgRun:\n" 
     474                STG_GLOBAL STG_RUN "\n" 
     475                STG_HIDDEN STG_RUN "\n" 
     476                STG_FUNCTION(STG_RUN) "\n" 
     477                STG_RUN ":\n" 
    451478                "\tmflr 0\n" 
    452479                "\tstw 0,4(1)\n" 
    453480                "\tmr 5,1\n" 
    StgRunIsImplementedInAssembler(void) 
    475502                "\tmtctr 3\n" 
    476503                "\tmr 12,3\n" 
    477504                "\tbctr\n" 
    478                 ".globl StgReturn\n" 
    479                 "\t.type StgReturn,@function\n" 
    480                 "StgReturn:\n" 
     505                STG_GLOBAL STG_RETURN "\n" 
     506                STG_HIDDEN STG_RETURN "\n" 
     507                STG_FUNCTION(STG_RETURN) "\n" 
     508                STG_RETURN ":\n" 
    481509                "\tmr 3,14\n" 
    482510                "\tla 5,%0(1)\n" 
    483511                "\tlmw 13,-220(5)\n" 
    StgRunIsImplementedInAssembler(void) 
    517545 
    518546#ifdef powerpc64_HOST_ARCH 
    519547 
     548#define STG_GLOBAL ".globl " 
     549#define STG_HIDDEN ".hidden " 
     550#define STG_FUNCTION(SYMBOL) ".type " SYMBOL ",@function" 
     551#define STG_DOTTED(SYMBOL) "." SYMBOL 
     552 
    520553#ifdef linux_HOST_OS 
    521554extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg); 
    522555 
    StgRunIsImplementedInAssembler(void) 
    533566        __asm__ volatile ( 
    534567                ".section \".opd\",\"aw\"\n" 
    535568                ".align 3\n" 
    536                 ".globl StgRun\n" 
    537                 "StgRun:\n" 
    538                 "\t.quad\t.StgRun,.TOC.@tocbase,0\n" 
    539                 "\t.size StgRun,24\n" 
    540                 ".globl StgReturn\n" 
    541                 "StgReturn:\n" 
    542                 "\t.quad\t.StgReturn,.TOC.@tocbase,0\n" 
    543                 "\t.size StgReturn,24\n" 
     569                STG_GLOBAL STG_RUN "\n" 
     570                STG_HIDDEN STG_RUN "\n" 
     571                STG_RUN ":\n" 
     572                "\t.quad\t" STG_DOTTED(STG_RUN) ",.TOC.@tocbase,0\n" 
     573                "\t.size " STG_RUN ",24\n" 
     574                STG_GLOBAL STG_RETURN "\n" 
     575                STG_HIDDEN STG_RETURN "\n" 
     576                STG_RETURN ":\n" 
     577                "\t.quad\t" STG_DOTTED(STG_RETURN) ",.TOC.@tocbase,0\n" 
     578                "\t.size " STG_RETURN ",24\n" 
    544579                ".previous\n" 
    545                 ".globl .StgRun\n" 
    546                 ".type .StgRun,@function\n" 
    547                 ".StgRun:\n" 
     580                STG_GLOBAL STG_DOTTED(STG_RUN) "\n" 
     581                STG_HIDDEN STG_DOTTED(STG_RUN) "\n" 
     582                STG_FUNCTION(STG_DOTTED(STG_RUN)) "\n" 
     583                STG_DOTTED(STG_RUN) ":\n" 
    548584                "\tmflr 0\n" 
    549585                "\tmr 5, 1\n" 
    550586                "\tstd 0, 16(1)\n" 
    StgRunIsImplementedInAssembler(void) 
    591627                "\tld 3, 0(3)\n" 
    592628                "\tmtctr 3\n" 
    593629                "\tbctr\n" 
    594                 ".globl .StgReturn\n" 
    595                 ".type .StgReturn,@function\n" 
    596                 ".StgReturn:\n" 
     630                STG_GLOBAL STG_DOTTED(STG_RETURN) "\n" 
     631                STG_HIDDEN STG_DOTTED(STG_RETURN) "\n" 
     632                STG_FUNCTION(STG_DOTTED(STG_RETURN)) "\n" 
     633                STG_DOTTED(STG_RETURN) ":\n" 
    597634                "\tmr 3,14\n" 
    598635                "\tla 5, %0(1)\n" // load address == addi r5, r1, %0 
    599636                "\tld 2, -296(5)\n" 
    StgRunIsImplementedInAssembler(void) 
    652689 
    653690#ifdef arm_HOST_ARCH 
    654691 
     692#define STG_GLOBAL ".globl " 
     693 
     694#ifdef ios_HOST_OS 
     695#define STG_HIDDEN ".private_extern " 
     696#define STG_FUNCTION(SYMBOL) /* empty */ 
     697#else 
     698#define STG_HIDDEN ".hidden " 
     699#define STG_FUNCTION(SYMBOL) ".type " SYMBOL ", %%function\n" 
     700#endif 
     701 
    655702#if defined(__thumb__) 
    656 #define THUMB_FUNC ".thumb\n\t.thumb_func\n\t" 
     703#define THUMB_FUNC ".thumb\n.thumb_func\n" 
    657704#else 
    658705#define THUMB_FUNC 
    659706#endif 
    660707 
     708RTS_PRIVATE 
    661709StgRegTable * 
    662710StgRun(StgFunPtr f, StgRegTable *basereg) { 
    663711    StgRegTable * r; 
    StgRun(StgFunPtr f, StgRegTable *basereg) { 
    682730        /* 
    683731         * Jump to function argument. 
    684732         */ 
    685         "bx %1\n\t" 
     733        "bx %1\n" 
    686734 
    687         ".globl " STG_RETURN "\n\t" 
     735        STG_GLOBAL STG_RETURN "\n" 
     736        STG_HIDDEN STG_RETURN "\n" 
    688737        THUMB_FUNC 
    689 #if !defined(ios_HOST_OS) 
    690         ".type " STG_RETURN ", %%function\n" 
    691 #endif 
     738        STG_FUNTION(STG_RETURN) 
    692739        STG_RETURN ":\n\t" 
    693740        /* 
    694741         * Free the space we allocated