/* * Copyright (c) 2013 The Native Client Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "native_client/src/trusted/service_runtime/nacl_config.h" .text /* * This test attempts to get both the assembler and the linker to generate * all the different kinds of nop instructions they will generate when * doing alignment padding in the code segment. Running the output through * the validator ensures that it accepts all these nop forms. */ .macro fill_before length /* * Fill space at the start of a bundle leaving exactly |length| * bytes before the end of the bundle. */ .fill ((1 << NACL_BLOCK_SHIFT) - \length) / NACL_HALT_LEN, \ NACL_HALT_LEN, NACL_HALT_OPCODE .endm .macro try length /* * Create the circumstance where exactly |length| bytes must be * filled to perform '.p2align NACL_BLOCK_SHIFT', and then let the * assembler fill it with its choice of nops. */ .p2align NACL_BLOCK_SHIFT test_as_nop_\length\(): fill_before \length .p2align NACL_BLOCK_SHIFT nop /* * Now create the same circumstance in the linker when it stitches * this section to the next one (which has sh_addralign=32). */ .pushsection .text.nop.\length, "ax", %progbits .p2align NACL_BLOCK_SHIFT test_ld_nop_\length\(): fill_before \length .popsection .endm #if NACL_BLOCK_SHIFT == 5 && NACL_HALT_LEN == 1 try 1 try 2 try 3 try 4 try 5 try 6 try 7 try 8 try 9 try 10 try 11 try 12 try 13 try 14 try 15 try 16 try 17 try 18 try 19 try 20 try 21 try 22 try 23 try 24 try 25 try 26 try 27 try 29 try 30 try 31 #elif NACL_BLOCK_SHIFT == 4 && NACL_HALT_LEN == 4 try 4 try 8 try 12 #else # error "architecture not handled by this test" #endif /* * This section follows .text.nop.31 and creates (by virtue of its * alignment) the need for the linker to generate the last nop * sequence. */ .pushsection .text.nop.end, "ax", %progbits .p2align NACL_BLOCK_SHIFT nop .popsection