LINUX.ORG.RU

Где/как покомпилить/позапускать для Itanium/powerpc/sparc?

 , , , ,


0

1

Хочу проверить, корректно ли срабатывают мои ifdef'ы для этих платформ и правильно ли расставились размеры для новозаданных фиксированных размеров для с89. То есть проверить

#include <stdio.h>

#if defined(__x86_64__) || defined(_M_X64)
    typedef unsigned     char u8;
    typedef   signed     char i8;
    typedef unsigned    short u16;
    typedef   signed    short i16;
    typedef unsigned      int u32;
    typedef   signed      int i32;
#elif defined(__i386) || defined(_M_IX86)
    typedef unsigned          char u8;
    typedef   signed          char i8;
    typedef unsigned         short u16;
    typedef   signed         short i16;
    typedef unsigned           int u32;
    typedef   signed           int i32;
#endif

#if defined(__ia64) || defined(__itanium__) || defined(_M_IA64)
    typedef unsigned     char u8;
    typedef   signed     char i8;
    typedef unsigned    short u16;
    typedef   signed    short i16;
    typedef unsigned      int u32;
    typedef   signed      int i32;
#endif

// power pc/power pc64/sparc/sparc 64/arm

int main()
{
    printf("sizeof(u8)  = 1? %s\n", sizeof(u8)  == 1 ? "true" : "false");
    printf("sizeof(i8)  = 1? %s\n", sizeof(i8)  == 1 ? "true" : "false");
    printf("sizeof(u16) = 2? %s\n", sizeof(u16) == 2 ? "true" : "false");
    printf("sizeof(i16) = 2? %s\n", sizeof(i16) == 2 ? "true" : "false");
    printf("sizeof(u32) = 4? %s\n", sizeof(u32) == 4 ? "true" : "false");
    printf("sizeof(i32) = 4? %s\n", sizeof(i32) == 4 ? "true" : "false");

    return 0;
}

Как и где это проверить? Можно ли поставить какие-нибудь эмуляторы? Пусть работает по такту в час, лишь бы скомпилилось и запустилось.

QEMU. Просто бинарники компиляй и им же запускай, так называемый user mde. Итаниума правда там нет.

a1batross ★★★★★ ()
Последнее исправление: a1batross (всего исправлений: 1)

Найди готовую либу с этими тайпдефами подо все платформы

annulen ★★★★★ ()

Сделай для архитектур кроме x86 и amd64 #error not supported yet patch is welcome, когда (если вообще) тебе прийдет патч - интегрируешь в код

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 1)

Можно поставить кросскомпиляторы и подсмотреть какой код они генерят.

int f(void) { return sizeof(long(*)(long)); }

Выводит 8:

; $ ia64-unknown-linux-gnu-gcc -O2 -S main.c
f:
        nop 0
        addl r8 = 8, r0
        br.ret.sptk.many rp

Для оригинального примера чуть длиннее:

; $ ia64-unknown-linux-gnu-gcc -S main.c
; $ cat main.s
        .file   "main.c"
        .pred.safe_across_calls p1-p5,p16-p63
        .section        .rodata
        .align 8
.LC0:
        stringz "true"
        .align 8
.LC1:
        stringz "sizeof(u8)  = 1? %s\n"
        .align 8
.LC2:
        stringz "sizeof(i8)  = 1? %s\n"
        .align 8
.LC3:
        stringz "sizeof(u16) = 2? %s\n"
        .align 8
.LC4:
        stringz "sizeof(i16) = 2? %s\n"
        .align 8
.LC5:
        stringz "sizeof(u32) = 4? %s\n"
        .align 8
.LC6:
        stringz "sizeof(i32) = 4? %s\n"
        .text
        .align 16
        .global main#
        .type   main#, @function
        .proc main#
main:
        .prologue 14, 32
        .save ar.pfs, r33
        alloc r33 = ar.pfs, 0, 4, 2, 0
        .vframe r34
        mov r34 = r12
        .save rp, r32
        mov r32 = b0
        mov r35 = r1
        .body
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC1)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        ;;
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC2)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        ;;
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC3)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        ;;
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC4)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        ;;
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC5)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        ;;
        movl r37 = @gprel(.LC0)
        ;;
        add r37 = r1, r37
        movl r36 = @gprel(.LC6)
        ;;
        add r36 = r1, r36
        br.call.sptk.many b0 = printf#
        mov r1 = r35
        mov r14 = r0
        ;;
        mov r8 = r14
        mov ar.pfs = r33
        mov b0 = r32
        .restore sp
        mov r12 = r34
        br.ret.sptk.many b0
        ;;
        .endp main#
        .ident  "GCC: (Gentoo 5.4.0 p1.0, pie-0.6.5) 5.4.0"
        .section        .note.GNU-stack,"",@progbits

Строки «false» в коде нет вообще :)

sf ★★ ()
Ответ на: комментарий от someoneelsenotme

Ну так просто возьми этот хидер из системы и изучи его.

Gorthauer ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.