[build] Extend bin_to_coff.py to support ARM and ARM64.

TEST=local
Bug: https://github.com/dart-lang/sdk/issues/47824
Change-Id: I9e15bb538e63ee16a2646c78fb786e135d1184ad
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/240441
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 7f0bd21..2877fb3 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -604,9 +604,7 @@
       args += [ "--executable" ]
     }
 
-    if (current_cpu == "x64") {
-      args += [ "--64-bit" ]
-    }
+    args += [ "--arch=$current_cpu" ]
     inputs = [ invoker.input ]
     outputs = [ output ]
   }
diff --git a/runtime/tools/bin_to_coff.py b/runtime/tools/bin_to_coff.py
index f98f051f..b75521ad 100644
--- a/runtime/tools/bin_to_coff.py
+++ b/runtime/tools/bin_to_coff.py
@@ -32,8 +32,14 @@
 # } FILHDR;
 FILE_HEADER_FORMAT = 'HHIIIHH'
 FILE_HEADER_SIZE = calcsize(FILE_HEADER_FORMAT)
-FILE_HEADER_MAGIC_X64 = 0x8664
-FILE_HEADER_MAGIC_IA32 = 0x014c
+FILE_HEADER_MAGICS = {
+    'x86': 0x014c,
+    'x64': 0x8664,
+    'arm': 0x1c0,
+    'arm64': 0xaa64,
+    'riscv32': 0x5032,
+    'riscv64': 0x5064,
+}
 FILE_HEADER_NUM_SECTIONS = 1
 FILE_HEADER_TIMESTAMP = 0
 FILE_HEADER_SIZE_OF_OPTIONAL = 0
@@ -112,12 +118,12 @@
         '--size_symbol_name',
         dest='size_name',
         help='Name of the symbol for the size of the binary data')
-    parser.add_argument(
-        '--64-bit', dest='use_64_bit', action='store_true', default=False)
+    parser.add_argument('--arch', dest='arch')
     parser.add_argument(
         '--executable', dest='executable', action='store_true', default=False)
 
     args = parser.parse_args()
+    use_64_bit = args.arch in ['x64', 'arm64', 'riscv64']
 
     with open(args.input, 'rb') as f:
         section_data = f.read()
@@ -130,7 +136,7 @@
     includes_size_name = (args.size_name != None)
 
     # Symbols on x86 are prefixed with '_'
-    symbol_prefix = b'' if args.use_64_bit else b'_'
+    symbol_prefix = b'_' if args.arch == 'x86' else b''
     num_symbols = 2 if includes_size_name else 1
     symbol_name = symbol_prefix + args.symbol_name.encode()
     size_symbol_name = None
@@ -138,8 +144,8 @@
         size_symbol = args.size_name if args.size_name else args.symbol_name + "Size"
         size_symbol_name = symbol_prefix + size_symbol.encode()
 
-    size_symbol_format = SIZE_SYMBOL_FORMAT_X64 if args.use_64_bit else SIZE_FORMAT
-    size_symbol_size = SIZE_SYMBOL_LENGTH_X64 if args.use_64_bit else SIZE_LENGTH
+    size_symbol_format = SIZE_SYMBOL_FORMAT_X64 if use_64_bit else SIZE_FORMAT
+    size_symbol_size = SIZE_SYMBOL_LENGTH_X64 if use_64_bit else SIZE_LENGTH
 
     # The symbol table is directly after the data section
     symbol_table_ptr = (FILE_HEADER_SIZE + SECTION_HEADER_SIZE + section_size +
@@ -166,7 +172,7 @@
         num_symbols * SYMBOL_TABLE_ENTRY_SIZE + SIZE_LENGTH + size_symbol_size +
         string_table_len)
 
-    FILE_HEADER_MAGIC = FILE_HEADER_MAGIC_X64 if args.use_64_bit else FILE_HEADER_MAGIC_IA32
+    FILE_HEADER_MAGIC = FILE_HEADER_MAGICS[args.arch]
 
     # Populate the file header. Basically constant except for the pointer to the
     # beginning of the symbol table.