16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Copyright (C) 2009-2013, International Business Machines
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Corporation and others.  All Rights Reserved.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *******************************************************************************
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define VC_EXTRALEAN
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define WIN32_LEAN_AND_MEAN
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOUSER
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOSERVICE
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOIME
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOMCX
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <windows.h>
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <time.h>
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   ifdef __GNUC__
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#       define WINDOWS_WITH_GNUC
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   endif
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_IS_LINUX_BASED && U_HAVE_ELF_H
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define U_ELF
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   include <elf.h>
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   if defined(ELFCLASS64)
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#       define U_ELF64
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   endif
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Old elf.h headers may not have EM_X86_64, or have EM_X8664 instead. */
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   ifndef EM_X86_64
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#       define EM_X86_64 62
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   endif
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define ICU_ENTRY_OFFSET 0
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "filestrm.h"
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "toolutil.h"
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uclean.h"
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uoptions.h"
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "pkg_genc.h"
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU))
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HEX_0X 0 /*  0x1234 */
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HEX_0H 1 /*  01234h */
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prototypes --------------------------------------------------------------- */
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetOutFilename(const char *inFilename, const char *destdir, char *outFilename, char *entryName, const char *newSuffix, const char *optFilename);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite8(FileStream *out, uint8_t byte, uint32_t column);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite32(FileStream *out, uint32_t byte, uint32_t column);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS400
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite8str(FileStream *out, uint8_t byte, uint32_t column);
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* -------------------------------------------------------------------------- */
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCreating Template Files for New Platforms
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLet the cc compiler help you get started.
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCompile this program
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const unsigned int x[5] = {1, 2, 0xdeadbeef, 0xffffffff, 16};
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwith the -S option to produce assembly output.
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFor example, this will generate array.s:
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggcc -S array.c
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgThis will produce a .s file that may look like this:
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .file   "array.c"
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .version        "01.01"
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggcc2_compiled.:
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .globl x
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .section        .rodata
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .align 4
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .type    x,@object
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .size    x,20
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgx:
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .long   1
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .long   2
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .long   -559038737
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .long   -1
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .long   16
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    .ident  "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)"
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwhich gives a starting point that will compile, and can be transformed
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgto become the template, generally with some consulting of as docs and
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgsome experimentation.
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIf you want ICU to automatically use this assembly, you should
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgspecify "GENCCODE_ASSEMBLY=-a name" in the specific config/mh-* file,
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwhere the name is the compiler or platform that you used in this
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassemblyHeader data structure.
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct AssemblyType {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *name;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *header;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *beginLine;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *footer;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t      hexType; /* HEX_0X or HEX_0h */
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} assemblyHeader[] = {
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // For gcc assemblers, the meaning of .align changes depending on the
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // hardware, so we use .balign 16 which always means 16 bytes.
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // https://sourceware.org/binutils/docs/as/Pseudo-Ops.html
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"gcc",
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl %s\n"
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section .note.GNU-stack,\"\",%%progbits\n"
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section .rodata\n"
1224dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "\t.balign 16\n"
1234dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        /* The 3 lines below are added for Chrome. */
1244dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "#ifdef U_HIDE_DATA_SYMBOL\n"
1254dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "\t.hidden %s\n"
1264dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "#endif\n"
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.type %s,%%object\n"
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s:\n\n",
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".long ","",HEX_0X
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"gcc-darwin",
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*"\t.section __TEXT,__text,regular,pure_instructions\n"
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"*/
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl _%s\n"
1364dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        /* The 3 lines below are added for Chrome. */
1374dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "#ifdef U_HIDE_DATA_SYMBOL\n"
1384dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "\t.private_extern _%s\n"
1394dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org        "#endif\n"
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.data\n"
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.const\n"
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.balign 16\n"
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "_%s:\n\n",
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".long ","",HEX_0X
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"gcc-cygwin",
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl _%s\n"
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section .rodata\n"
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.balign 16\n"
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "_%s:\n\n",
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".long ","",HEX_0X
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"gcc-mingw64",
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl %s\n"
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section .rodata\n"
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.balign 16\n"
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s:\n\n",
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".long ","",HEX_0X
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 16 bytes alignment.
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// http://docs.oracle.com/cd/E19641-01/802-1947/802-1947.pdf
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"sun",
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section \".rodata\"\n"
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.align   16\n"
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl     %s\n"
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s:\n",
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".word ","",HEX_0X
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 16 bytes alignment for sun-x86.
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// http://docs.oracle.com/cd/E19963-01/html/821-1608/eoiyg.html
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"sun-x86",
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "Drodata.rodata:\n"
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.type   Drodata.rodata,@object\n"
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.size   Drodata.rodata,0\n"
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.globl  %s\n"
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.align  16\n"
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s:\n",
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".4byte ","",HEX_0X
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 1<<4 bit alignment for aix.
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.aixassem%2Fdoc%2Falangref%2Fidalangref_csect_pseudoop.htm
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"xlc",
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".globl %s{RO}\n"
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.toc\n"
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s:\n"
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.csect %s{RO}, 4\n",
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".long ","",HEX_0X
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"aCC-ia64",
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.file   \"%s.s\"\n"
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.type   %s,@object\n"
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.global %s\n"
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.secalias .abe$0.rodata, \".rodata\"\n"
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.section .abe$0.rodata = \"a\", \"progbits\"\n"
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.align  16\n"
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s::\t",
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "data4 ","",HEX_0X
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {"aCC-parisc",
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.SPACE  $TEXT$\n"
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.SUBSPA $LIT$\n"
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "%s\n"
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.EXPORT %s\n"
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t.ALIGN  16\n",
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ".WORD ","",HEX_0X
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// align 16 bytes
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//  http://msdn.microsoft.com/en-us/library/dwa9fwef.aspx
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "masm",
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "\tTITLE %s\n"
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "; generated by genccode\n"
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ".386\n"
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ".model flat\n"
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "\tPUBLIC _%s\n"
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "ICUDATA_%s\tSEGMENT READONLY PARA PUBLIC FLAT 'DATA'\n"
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "\tALIGN 16\n"
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "_%s\tLABEL DWORD\n",
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "\tDWORD ","\nICUDATA_%s\tENDS\n\tEND\n",HEX_0H
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t assemblyHeaderIndex = -1;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t hexType = HEX_0X;
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcheckAssemblyHeaderName(const char* optAssembly) {
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx;
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assemblyHeaderIndex = -1;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (idx = 0; idx < (int32_t)(sizeof(assemblyHeader)/sizeof(assemblyHeader[0])); idx++) {
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (uprv_strcmp(optAssembly, assemblyHeader[idx].name) == 0) {
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            assemblyHeaderIndex = idx;
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            hexType = assemblyHeader[idx].hexType; /* set the hex type */
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return TRUE;
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprintAssemblyHeadersToStdErr(void) {
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr, "%s", assemblyHeader[0].name);
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (idx = 1; idx < (int32_t)(sizeof(assemblyHeader)/sizeof(assemblyHeader[0])); idx++) {
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, ", %s", assemblyHeader[idx].name);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ")\n");
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwriteAssemblyCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optFilename, char *outFilePath) {
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t column = MAX_COLUMN;
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char entry[64];
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t buffer[1024];
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *bufferStr = (char *)buffer;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FileStream *in, *out;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size_t i, length;
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    in=T_FileStream_open(filename, "rb");
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(in==NULL) {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open input file %s\n", filename);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2754dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org    getOutFilename(filename, destdir, bufferStr, entry, ".S", optFilename);
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    out=T_FileStream_open(bufferStr, "w");
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(out==NULL) {
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open output file %s\n", bufferStr);
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (outFilePath != NULL) {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(outFilePath, bufferStr);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef WINDOWS_WITH_GNUC
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Need to fix the file seperator character when using MinGW. */
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/');
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(optEntryPoint != NULL) {
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(entry, optEntryPoint);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcat(entry, "_dat");
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* turn dashes or dots in the entry name into underscores */
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=uprv_strlen(entry);
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(entry[i]=='-' || entry[i]=='.') {
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            entry[i]='_';
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(bufferStr, assemblyHeader[assemblyHeaderIndex].header,
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entry, entry, entry, entry,
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entry, entry, entry, entry);
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, bufferStr);
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine);
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;) {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=T_FileStream_read(in, buffer, sizeof(buffer));
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length==0) {
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (length != sizeof(buffer)) {
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* pad with extra 0's when at the end of the file */
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(i=0; i < (length % sizeof(uint32_t)); ++i) {
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                buffer[length+i] = 0;
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<(length/sizeof(buffer[0])); i++) {
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            column = write32(out, buffer[i], column);
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, "\n");
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(bufferStr, assemblyHeader[assemblyHeaderIndex].footer,
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entry, entry, entry, entry,
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entry, entry, entry, entry);
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, bufferStr);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(in)) {
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file read error while generating from file %s\n", filename);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(out)) {
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file write error while generating from file %s\n", filename);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(out);
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(in);
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwriteCCode(const char *filename, const char *destdir, const char *optName, const char *optFilename, char *outFilePath) {
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t column = MAX_COLUMN;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[4096], entry[64];
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FileStream *in, *out;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size_t i, length;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    in=T_FileStream_open(filename, "rb");
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(in==NULL) {
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open input file %s\n", filename);
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(optName != NULL) { /* prepend  'icudt28_' */
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      strcpy(entry, optName);
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      strcat(entry, "_");
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      entry[0] = 0;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    getOutFilename(filename, destdir, buffer, entry+uprv_strlen(entry), ".c", optFilename);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (outFilePath != NULL) {
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(outFilePath, buffer);
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    out=T_FileStream_open(buffer, "w");
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(out==NULL) {
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open output file %s\n", buffer);
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* turn dashes or dots in the entry name into underscores */
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=uprv_strlen(entry);
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(entry[i]=='-' || entry[i]=='.') {
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            entry[i]='_';
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS400
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TODO: Fix this once the compiler implements this feature. Keep in sync with udatamem.c
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    This is here because this platform can't currently put
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const data into the read-only pages of an object or
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    shared library (service program). Only strings are allowed in read-only
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pages, so we use char * strings to store the data.
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    In order to prevent the beginning of the data from ever matching the
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    magic numbers we must still use the initial double.
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    [grhoten 4/24/2003]
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(buffer,
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#ifndef IN_GENERATED_CCODE\n"
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#define IN_GENERATED_CCODE\n"
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#define U_DISABLE_RENAMING 1\n"
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#include \"unicode/umachine.h\"\n"
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#endif\n"
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "U_CDECL_BEGIN\n"
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "const struct {\n"
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "    double bogus;\n"
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "    const char *bytes; \n"
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "} %s={ 0.0, \n",
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entry);
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, buffer);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;) {
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=T_FileStream_read(in, buffer, sizeof(buffer));
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length==0) {
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<length; ++i) {
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            column = write8str(out, (uint8_t)buffer[i], column);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, "\"\n};\nU_CDECL_END\n");
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Function renaming shouldn't be done in data */
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(buffer,
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#ifndef IN_GENERATED_CCODE\n"
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#define IN_GENERATED_CCODE\n"
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#define U_DISABLE_RENAMING 1\n"
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#include \"unicode/umachine.h\"\n"
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "#endif\n"
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "U_CDECL_BEGIN\n"
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "const struct {\n"
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "    double bogus;\n"
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "    uint8_t bytes[%ld]; \n"
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "} %s={ 0.0, {\n",
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (long)T_FileStream_size(in), entry);
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, buffer);
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;) {
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=T_FileStream_read(in, buffer, sizeof(buffer));
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length==0) {
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<length; ++i) {
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            column = write8(out, (uint8_t)buffer[i], column);
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, "\n}\n};\nU_CDECL_END\n");
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(in)) {
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file read error while generating from file %s\n", filename);
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(out)) {
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file write error while generating from file %s\n", filename);
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(out);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(in);
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite32(FileStream *out, uint32_t bitField, uint32_t column) {
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char bitFieldStr[64]; /* This is more bits than needed for a 32-bit number */
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *s = bitFieldStr;
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint8_t *ptrIdx = (uint8_t *)&bitField;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char hexToStr[16] = {
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        '0','1','2','3',
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        '4','5','6','7',
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        '8','9','A','B',
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        'C','D','E','F'
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the value, possibly with comma and newline */
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(column==MAX_COLUMN) {
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* first byte */
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(column<32) {
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *(s++)=',';
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++column;
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *(s++)='\n';
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(s, assemblyHeader[assemblyHeaderIndex].beginLine);
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s+=uprv_strlen(s);
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bitField < 10) {
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* It's a small number. Don't waste the space for 0x */
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *(s++)=hexToStr[bitField];
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int seenNonZero = 0; /* This is used to remove leading zeros */
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(hexType==HEX_0X) {
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *(s++)='0';
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *(s++)='x';
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(hexType==HEX_0H) {
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *(s++)='0';
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* This creates a 32-bit field */
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_IS_BIG_ENDIAN
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < sizeof(uint32_t); i++)
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = sizeof(uint32_t)-1; i >= 0 ; i--)
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uint8_t value = ptrIdx[i];
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (value || seenNonZero) {
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *(s++)=hexToStr[value>>4];
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *(s++)=hexToStr[value&0xF];
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                seenNonZero = 1;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(hexType==HEX_0H) {
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *(s++)='h';
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *(s++)=0;
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, bitFieldStr);
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return column;
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite8(FileStream *out, uint8_t byte, uint32_t column) {
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char s[4];
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i=0;
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* convert the byte value to a string */
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(byte>=100) {
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s[i++]=(char)('0'+byte/100);
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        byte%=100;
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(i>0 || byte>=10) {
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s[i++]=(char)('0'+byte/10);
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        byte%=10;
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    s[i++]=(char)('0'+byte);
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    s[i]=0;
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the value, possibly with comma and newline */
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(column==MAX_COLUMN) {
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* first byte */
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(column<16) {
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_writeLine(out, ",");
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++column;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_writeLine(out, ",\n");
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, s);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return column;
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS400
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwrite8str(FileStream *out, uint8_t byte, uint32_t column) {
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char s[8];
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (byte > 7)
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(s, "\\x%X", byte);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(s, "\\%X", byte);
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the value, possibly with comma and newline */
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(column==MAX_COLUMN) {
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* first byte */
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_writeLine(out, "\"");
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(column<24) {
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++column;
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_writeLine(out, "\"\n\"");
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        column=1;
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_writeLine(out, s);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return column;
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetOutFilename(const char *inFilename, const char *destdir, char *outFilename, char *entryName, const char *newSuffix, const char *optFilename) {
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *basename=findBasename(inFilename), *suffix=uprv_strrchr(basename, '.');
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* copy path */
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(destdir!=NULL && *destdir!=0) {
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        do {
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *outFilename++=*destdir++;
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } while(*destdir!=0);
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(*(outFilename-1)!=U_FILE_SEP_CHAR) {
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *outFilename++=U_FILE_SEP_CHAR;
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        inFilename=basename;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while(inFilename<basename) {
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *outFilename++=*inFilename++;
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(suffix==NULL) {
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* the filename does not have a suffix */
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(entryName, inFilename);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(optFilename != NULL) {
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          uprv_strcpy(outFilename, optFilename);
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          uprv_strcpy(outFilename, inFilename);
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcat(outFilename, newSuffix);
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char *saveOutFilename = outFilename;
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* copy basename */
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while(inFilename<suffix) {
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(*inFilename=='-') {
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* iSeries cannot have '-' in the .o objects. */
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *outFilename++=*entryName++='_';
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                inFilename++;
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else {
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *outFilename++=*entryName++=*inFilename++;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* replace '.' by '_' */
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *outFilename++=*entryName++='_';
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++inFilename;
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* copy suffix */
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while(*inFilename!=0) {
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *outFilename++=*entryName++=*inFilename++;
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *entryName=0;
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(optFilename != NULL) {
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_strcpy(saveOutFilename, optFilename);
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_strcat(saveOutFilename, newSuffix);
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* add ".c" */
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_strcpy(outFilename, newSuffix);
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CAN_GENERATE_OBJECTS
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char *optMatchArch) {
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    union {
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char        bytes[2048];
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Elf32_Ehdr  header32;
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Elf32_Ehdr and ELF64_Ehdr are identical for the necessary fields. */
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        IMAGE_FILE_HEADER header;
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } buffer;
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *filename;
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FileStream *in;
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const IMAGE_FILE_HEADER *pHeader;
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   error "Unknown platform for CAN_GENERATE_OBJECTS."
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(optMatchArch != NULL) {
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        filename=optMatchArch;
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* set defaults */
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* set EM_386 because elf.h does not provide better defaults */
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pCPU=EM_386;
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pBits=32;
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB);
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* _M_IA64 should be defined in windows.h */
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   if defined(_M_IA64)
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pCPU=IMAGE_FILE_MACHINE_IA64;
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   elif defined(_M_AMD64)
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pCPU=IMAGE_FILE_MACHINE_AMD64;
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   else
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pCPU=IMAGE_FILE_MACHINE_I386;
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   endif
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pBits= *pCPU==IMAGE_FILE_MACHINE_I386 ? 32 : 64;
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pIsBigEndian=FALSE;
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   error "Unknown platform for CAN_GENERATE_OBJECTS."
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    in=T_FileStream_open(filename, "rb");
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(in==NULL) {
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open match-arch file %s\n", filename);
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=T_FileStream_read(in, buffer.bytes, sizeof(buffer.bytes));
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length<sizeof(Elf32_Ehdr)) {
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: match-arch file %s is too short\n", filename);
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer.header32.e_ident[0]!=ELFMAG0 ||
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer.header32.e_ident[1]!=ELFMAG1 ||
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer.header32.e_ident[2]!=ELFMAG2 ||
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer.header32.e_ident[3]!=ELFMAG3 ||
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer.header32.e_ident[EI_CLASS]<ELFCLASS32 || buffer.header32.e_ident[EI_CLASS]>ELFCLASS64
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: match-arch file %s is not an ELF object file, or not supported\n", filename);
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pBits= buffer.header32.e_ident[EI_CLASS]==ELFCLASS32 ? 32 : 64; /* only 32 or 64: see check above */
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF64
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(*pBits!=32 && *pBits!=64) {
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: currently only supports 32-bit and 64-bit ELF format\n");
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(*pBits!=32) {
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: built with elf.h missing 64-bit definitions\n");
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pIsBigEndian=(UBool)(buffer.header32.e_ident[EI_DATA]==ELFDATA2MSB);
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(*pIsBigEndian!=U_IS_BIG_ENDIAN) {
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: currently only same-endianness ELF formats are supported\n");
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* TODO: Support byte swapping */
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pCPU=buffer.header32.e_machine;
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length<sizeof(IMAGE_FILE_HEADER)) {
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: match-arch file %s is too short\n", filename);
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_UNSUPPORTED_ERROR);
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* TODO: Use buffer.header.  Keep aliasing legal.  */
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pHeader=(const IMAGE_FILE_HEADER *)buffer.bytes;
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pCPU=pHeader->Machine;
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The number of bits is implicit with the Machine value.
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * *pBits is ignored in the calling code, so this need not be precise.
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pBits= *pCPU==IMAGE_FILE_MACHINE_I386 ? 32 : 64;
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Windows always runs on little-endian CPUs. */
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *pIsBigEndian=FALSE;
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   error "Unknown platform for CAN_GENERATE_OBJECTS."
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(in);
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgwriteObjectCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optMatchArch, const char *optFilename, char *outFilePath) {
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* common variables */
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[4096], entry[40]={ 0 };
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FileStream *in, *out;
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *newSuffix;
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, entryLength, length, size, entryOffset=0, entryLengthOffset=0;
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint16_t cpu, bits;
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool makeBigEndian;
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* platform-specific variables and initialization code */
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 32-bit Elf file header */
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf32_Ehdr header32={
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* e_ident[] */
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELFCLASS32,
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB,
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            EV_CURRENT /* EI_VERSION */
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ET_REL,
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EM_386,
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EV_CURRENT, /* e_version */
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_entry */
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phoff */
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf32_Off)sizeof(Elf32_Ehdr), /* e_shoff */
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_flags */
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf32_Half)sizeof(Elf32_Ehdr), /* eh_size */
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phentsize */
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phnum */
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf32_Half)sizeof(Elf32_Shdr), /* e_shentsize */
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        5, /* e_shnum */
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2 /* e_shstrndx */
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 32-bit Elf section header table */
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf32_Shdr sectionHeaders32[5]={
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* SHN_UNDEF */
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .symtab */
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_name */
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_SYMTAB,
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)), /* sh_offset */
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Word)(2*sizeof(Elf32_Sym)), /* sh_size */
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            3, /* sh_link=sect hdr index of .strtab */
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_info=One greater than the symbol table index of the last
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                * local symbol (with STB_LOCAL). */
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            4, /* sh_addralign */
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Word)(sizeof(Elf32_Sym)) /* sh_entsize */
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .shstrtab */
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            9, /* sh_name */
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_STRTAB,
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)), /* sh_offset */
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            40, /* sh_size */
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_addralign */
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .strtab */
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            19, /* sh_name */
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_STRTAB,
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)+40), /* sh_offset */
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Word)sizeof(entry), /* sh_size */
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_addralign */
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .rodata */
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            27, /* sh_name */
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_PROGBITS,
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHF_ALLOC, /* sh_flags */
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)+40+sizeof(entry)), /* sh_offset */
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_size */
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            16, /* sh_addralign */
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* symbol table */
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf32_Sym symbols32[2]={
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* STN_UNDEF */
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* data entry point */
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* st_name */
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* st_value */
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* st_size */
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* st_other */
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            4 /* st_shndx=index of related section table entry */
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* section header string table, with decimal string offsets */
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char sectionStrings[40]=
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  0 */ "\0"
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  1 */ ".symtab\0"
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  9 */ ".shstrtab\0"
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 19 */ ".strtab\0"
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 27 */ ".rodata\0"
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 35 */ "\0\0\0\0"; /* contains terminating NUL */
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 40: padded to multiple of 8 bytes */
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Use entry[] for the string table which will contain only the
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * entry point name.
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * entry[0] must be 0 (NUL)
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The entry point name can be up to 38 characters long (sizeof(entry)-2).
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 16-align .rodata in the .o file, just in case */
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char padding[16]={ 0 };
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t paddingSize;
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF64
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 64-bit Elf file header */
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf64_Ehdr header64={
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* e_ident[] */
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELFCLASS64,
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB,
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            EV_CURRENT /* EI_VERSION */
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ET_REL,
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EM_X86_64,
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EV_CURRENT, /* e_version */
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_entry */
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phoff */
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf64_Off)sizeof(Elf64_Ehdr), /* e_shoff */
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_flags */
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf64_Half)sizeof(Elf64_Ehdr), /* eh_size */
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phentsize */
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, /* e_phnum */
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (Elf64_Half)sizeof(Elf64_Shdr), /* e_shentsize */
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        5, /* e_shnum */
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2 /* e_shstrndx */
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 64-bit Elf section header table */
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf64_Shdr sectionHeaders64[5]={
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* SHN_UNDEF */
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .symtab */
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_name */
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_SYMTAB,
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)), /* sh_offset */
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Xword)(2*sizeof(Elf64_Sym)), /* sh_size */
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            3, /* sh_link=sect hdr index of .strtab */
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_info=One greater than the symbol table index of the last
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                * local symbol (with STB_LOCAL). */
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            4, /* sh_addralign */
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Xword)(sizeof(Elf64_Sym)) /* sh_entsize */
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .shstrtab */
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            9, /* sh_name */
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_STRTAB,
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)), /* sh_offset */
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            40, /* sh_size */
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_addralign */
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .strtab */
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            19, /* sh_name */
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_STRTAB,
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_flags */
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)+40), /* sh_offset */
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Xword)sizeof(entry), /* sh_size */
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* sh_addralign */
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* .rodata */
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            27, /* sh_name */
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHT_PROGBITS,
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SHF_ALLOC, /* sh_flags */
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_addr */
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)+40+sizeof(entry)), /* sh_offset */
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_size */
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_link */
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* sh_info */
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            16, /* sh_addralign */
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* sh_entsize */
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 64-bit symbol table
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * careful: different order of items compared with Elf32_sym!
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Elf64_Sym symbols64[2]={
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* STN_UNDEF */
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* data entry point */
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1, /* st_name */
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* st_other */
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            4, /* st_shndx=index of related section table entry */
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0, /* st_value */
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0 /* st_size */
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_ELF64 */
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* entry[] have a leading NUL */
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    entryOffset=1;
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* in the common code, count entryLength from after the NUL */
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    entryLengthOffset=1;
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newSuffix=".o";
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct {
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        IMAGE_FILE_HEADER fileHeader;
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        IMAGE_SECTION_HEADER sections[2];
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char linkerOptions[100];
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } objHeader;
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IMAGE_SYMBOL symbols[1];
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct {
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DWORD sizeofLongNames;
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char longNames[100];
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } symbolNames;
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * entry sometimes have a leading '_'
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * overwritten if entryOffset==0 depending on the target platform
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * see check for cpu below
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    entry[0]='_';
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newSuffix=".obj";
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   error "Unknown platform for CAN_GENERATE_OBJECTS."
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* deal with options, files and the entry point name */
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    getArchitecture(&cpu, &bits, &makeBigEndian, optMatchArch);
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("genccode: --match-arch cpu=%hu bits=%hu big-endian=%d\n", cpu, bits, makeBigEndian);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(cpu==IMAGE_FILE_MACHINE_I386) {
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        entryOffset=1;
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    in=T_FileStream_open(filename, "rb");
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(in==NULL) {
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open input file %s\n", filename);
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size=T_FileStream_size(in);
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    getOutFilename(filename, destdir, buffer, entry+entryOffset, newSuffix, optFilename);
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (outFilePath != NULL) {
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(outFilePath, buffer);
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(optEntryPoint != NULL) {
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(entry+entryOffset, optEntryPoint);
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcat(entry+entryOffset, "_dat");
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* turn dashes in the entry name into underscores */
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    entryLength=(int32_t)uprv_strlen(entry+entryLengthOffset);
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<entryLength; ++i) {
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(entry[entryLengthOffset+i]=='-') {
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            entry[entryLengthOffset+i]='_';
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open the output file */
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    out=T_FileStream_open(buffer, "wb");
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(out==NULL) {
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: unable to open output file %s\n", buffer);
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(bits==32) {
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        header32.e_ident[EI_DATA]= makeBigEndian ? ELFDATA2MSB : ELFDATA2LSB;
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        header32.e_machine=cpu;
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 16-align .rodata in the .o file, just in case */
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        paddingSize=sectionHeaders32[4].sh_offset & 0xf;
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(paddingSize!=0) {
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                paddingSize=0x10-paddingSize;
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sectionHeaders32[4].sh_offset+=paddingSize;
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sectionHeaders32[4].sh_size=(Elf32_Word)size;
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbols32[1].st_size=(Elf32_Word)size;
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* write .o headers */
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, &header32, (int32_t)sizeof(header32));
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, sectionHeaders32, (int32_t)sizeof(sectionHeaders32));
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, symbols32, (int32_t)sizeof(symbols32));
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else /* bits==64 */ {
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_ELF64
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        header64.e_ident[EI_DATA]= makeBigEndian ? ELFDATA2MSB : ELFDATA2LSB;
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        header64.e_machine=cpu;
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 16-align .rodata in the .o file, just in case */
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        paddingSize=sectionHeaders64[4].sh_offset & 0xf;
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(paddingSize!=0) {
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                paddingSize=0x10-paddingSize;
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sectionHeaders64[4].sh_offset+=paddingSize;
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sectionHeaders64[4].sh_size=(Elf64_Xword)size;
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbols64[1].st_size=(Elf64_Xword)size;
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* write .o headers */
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, &header64, (int32_t)sizeof(header64));
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, sectionHeaders64, (int32_t)sizeof(sectionHeaders64));
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, symbols64, (int32_t)sizeof(symbols64));
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_write(out, sectionStrings, (int32_t)sizeof(sectionStrings));
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_write(out, entry, (int32_t)sizeof(entry));
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(paddingSize!=0) {
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, padding, paddingSize);
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_HAS_WIN32_API
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* populate the .obj headers */
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_memset(&objHeader, 0, sizeof(objHeader));
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_memset(&symbols, 0, sizeof(symbols));
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_memset(&symbolNames, 0, sizeof(symbolNames));
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the linker export directive */
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strcpy(objHeader.linkerOptions, "-export:");
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=8;
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strcpy(objHeader.linkerOptions+length, entry);
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length+=entryLength;
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strcpy(objHeader.linkerOptions+length, ",data ");
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length+=6;
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* set the file header */
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.fileHeader.Machine=cpu;
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.fileHeader.NumberOfSections=2;
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.fileHeader.TimeDateStamp=(DWORD)time(NULL);
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.fileHeader.PointerToSymbolTable=IMAGE_SIZEOF_FILE_HEADER+2*IMAGE_SIZEOF_SECTION_HEADER+length+size; /* start of symbol table */
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.fileHeader.NumberOfSymbols=1;
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* set the section for the linker options */
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy((char *)objHeader.sections[0].Name, ".drectve", 8);
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[0].SizeOfRawData=length;
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[0].PointerToRawData=IMAGE_SIZEOF_FILE_HEADER+2*IMAGE_SIZEOF_SECTION_HEADER;
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[0].Characteristics=IMAGE_SCN_LNK_INFO|IMAGE_SCN_LNK_REMOVE|IMAGE_SCN_ALIGN_1BYTES;
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* set the data section */
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy((char *)objHeader.sections[1].Name, ".rdata", 6);
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[1].SizeOfRawData=size;
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[1].PointerToRawData=IMAGE_SIZEOF_FILE_HEADER+2*IMAGE_SIZEOF_SECTION_HEADER+length;
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    objHeader.sections[1].Characteristics=IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_ALIGN_16BYTES|IMAGE_SCN_MEM_READ;
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* set the symbol table */
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(entryLength<=8) {
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strncpy((char *)symbols[0].N.ShortName, entry, entryLength);
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbolNames.sizeofLongNames=4;
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbols[0].N.Name.Short=0;
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbols[0].N.Name.Long=4;
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        symbolNames.sizeofLongNames=4+entryLength+1;
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(symbolNames.longNames, entry);
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    symbols[0].SectionNumber=2;
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    symbols[0].StorageClass=IMAGE_SYM_CLASS_EXTERNAL;
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the file header and the linker options section */
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_write(out, &objHeader, objHeader.sections[1].PointerToRawData);
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   error "Unknown platform for CAN_GENERATE_OBJECTS."
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* copy the data file into section 2 */
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;) {
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=T_FileStream_read(in, buffer, sizeof(buffer));
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length==0) {
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        T_FileStream_write(out, buffer, (int32_t)length);
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* write the symbol table */
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_write(out, symbols, IMAGE_SIZEOF_SYMBOL);
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_write(out, &symbolNames, symbolNames.sizeofLongNames);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(in)) {
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file read error while generating from file %s\n", filename);
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(T_FileStream_error(out)) {
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "genccode: file write error while generating from file %s\n", filename);
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(U_FILE_ACCESS_ERROR);
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(out);
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    T_FileStream_close(in);
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1200