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

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

    From 715e773915949d5c6e17b328955a147fbb3509c7 Mon Sep 17 00:00:00 2001
    From: PHO <[email protected]>
    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