aboutsummaryrefslogtreecommitdiff
path: root/gas
AgeCommit message (Collapse)AuthorFilesLines
2025-03-07Fix imm20 range check in MSP430 port of gasNick Clifton7-11/+45
2025-03-07gas: don't permit "repeat" expressions with .cfi_{escape,fde_data}Jan Beulich1-8/+14
Repeat counts greater than 1 will emit data directly into the current (sub-)section. That's wrong with .cfi_*, which defer data emission until much later: N-1 instances of the specified data would not end up in .eh_frame (or whatever the section that CFI data was specified to go into). Simply disallow "repeat" expressions in such cases.
2025-03-07gas/listing: drop forward declarationsJan Beulich1-11/+0
These aren't needed (anymore); all static functions are defined before their first use.
2025-03-07gas: centralize declaration of listing_tailJan Beulich4-6/+3
Besides it being somewhat off to have three decls scattered across the code base, it is generally bad practice for the definition of a symbol to not also observe its declaration (making sure the two won't go out of sync).
2025-03-07gas: leave expression symbols alone when processing equatesJan Beulich6-5/+46
PR gas/32721 In this bogus piece of code distilled from fuzzing and slightly edited: A=%eax|%! Y=A Z=A or $6,Z the first of the equates with A on the rhs changes A's section (due to the use of S_GET_VALUE()), from expression to register, thus yielding Y in the expression section (and X_op being O_symbol), but Z in the register section (and X_op being O_register with X_add_value being -1). There shouldn't be random O_register expressions, though, for targets setting md_register_arithmetic to false. Plus both Y and Z would better be exchangeable. In pseudo_set() wire handling of O_symbol expressions referencing a symbol in the expression section to that of other stuff ending up in this section. Also avoid bogus O_register expressions to be created, for targets setting md_register_arithmetic to false: S_GET_VALUE() would resolve any arithmetic, which must not happen for such targets. To be on the safe side for such targets, also amend resolve_register(). Correct another earlier oversight there too (affecting at least Z80), by using the new expr_copy() helper there as well. Undo 46b9f07dfe79 ("PR 32721, internal error in tc-i386.c:parse_register"), albeit without losing the simplification it did.
2025-03-07gas: fold is_end_of_line[] into lex_type[]Jan Beulich6-73/+46
... by way of introducing LEX_EOL and LEX_EOS. As a prereq convert the remaining open-coded accesses. The Alpha change is actually a functional one: The array slot for '!' having been set to 1 is very unlikely to have been correct. 1 means "end of line", when surely "end of statement" was always meant.
2025-03-07rl78: drop redundant statement separator checkJan Beulich1-2/+1
With the switch to the use of is_end_of_stmt() in 2dd0370c433d ("rl78: use is_whitespace()") the open-coded checking against line_separator_chars[] can be dropped.
2025-03-07Z8k: use is_end_of_stmt()Jan Beulich1-5/+5
... instead of open-coding it.
2025-03-07x86: use is_end_of_stmt()Jan Beulich2-7/+7
... instead of open-coding it.
2025-03-07VAX: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it. This also fixes two array underrun issues, when plain char is a signed type.
2025-03-07TILEPro: use is_end_of_stmt()Jan Beulich1-4/+4
... instead of open-coding it. Also convert a variable to plain char (allowing to drop two casts), which is how it's actually used.
2025-03-07Tile-Gx: use is_end_of_stmt()Jan Beulich1-4/+4
... instead of open-coding it. Also convert a variable to plain char (allowing to drop two casts), which is how it's actually used.
2025-03-07C6x: use is_end_of_stmt()Jan Beulich1-13/+13
... instead of open-coding it.
2025-03-07C54x: use is_end_of_stmt()Jan Beulich1-19/+19
... instead of open-coding it. In tic54x_stringer() this also fixes an array overrun issue: Converting plain char to unsigned int could have yielded huge values when plain char is a signed type. In subsym_substitute() also convert a local variable to plain char, as that's what it's really holding (and how it's used everywhere else).
2025-03-07C4x: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07C30: use is_end_of_stmt()Jan Beulich1-3/+3
... instead of open-coding it.
2025-03-07Sparc: use is_end_of_stmt()Jan Beulich1-3/+3
... instead of open-coding it. This also fixes two array underrun issues, when plain char is a signed type.
2025-03-07SH: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07Score: use is_end_of_stmt()Jan Beulich2-8/+8
... instead of open-coding it.
2025-03-07RISC-V: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it.
2025-03-07pru: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07PPC: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it.
2025-03-07MMIX: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it.
2025-03-07MIPS: use is_end_of_stmt()Jan Beulich1-7/+7
... instead of open-coding it.
2025-03-07MicroBlaze: use is_end_of_stmt()Jan Beulich1-4/+4
... instead of open-coding it.
2025-03-07M68k: use is_end_of_stmt()Jan Beulich1-21/+21
... instead of open-coding it.
2025-03-07M68HC1x: use is_end_of_stmt()Jan Beulich1-7/+7
... instead of open-coding it. With this there's no need for op_end (and hence op_start) to be other than pointer to plain char. Which in turn eliminates the need for several questionable casts.
2025-03-07IQ2000: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it.
2025-03-07LoongArch: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07HP-PA: use is_end_of_stmt()Jan Beulich1-3/+3
... instead of open-coding it.
2025-03-07dlx: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07C-Sky: use is_end_of_stmt()Jan Beulich1-8/+8
... instead of open-coding it.
2025-03-07cris: use is_end_of_stmt()Jan Beulich1-1/+1
Fix use of is_end_of_line[] directly instead of through the is_end_of_stmt() macro.
2025-03-07aarch64: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it.
2025-03-07Arm: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it. This also fixes an array underrun issue: The wrong casting to plain int could have yielded negative values when plain char is a signed type.
2025-03-07Alpha: use is_end_of_stmt()Jan Beulich1-1/+1
... instead of open-coding it. Note that writes to the array need to be left alone; they can only be converted when the array is folded into lex_type[].
2025-03-07Mach-O: use is_end_of_stmt()Jan Beulich1-4/+4
... instead of open-coding it.
2025-03-07ELF: use is_end_of_stmt()Jan Beulich1-2/+2
... instead of open-coding it.
2025-03-07{,E}COFF: use is_end_of_stmt()Jan Beulich2-3/+3
... instead of open-coding it. Convert a variable's type to plain char then as well, as that's what it's really holding (and how it's used everywhere else).
2025-03-04clean-up create_obj_attrs_section: comment about .gnu.attributes VS ↵Matthieu Longo1-10/+10
.gnu.build.attributes
2025-03-04Move BFD_FAKE_SECTION to libbfd.hAlan Modra1-8/+2
BFD_FAKE_SECTION and its sidekick GLOBAL_SYM_INIT don't need to be cluttering bfd.h, and probably shouldn't be used outside bfd/. To make them internal to bfd, make the bfd ecoff small common section declaration global so it can be used instead of a duplicate in gas/ecoff.c. Oddly this needs to go in bfd/ecofflink.c rather than bfd/ecoff.c as the former is compiled for all targets needing the ecoff small common section (some via a call in gas/config/obj-elf.c to a function in gas/ecoff.c) while the latter is not. While doing this rename ecoff_scom_section to _bfd_ecoff_scom_section and remove support for traditional C from GLOBAL_SYM_INIT.
2025-03-03RISC-V: Support ssqosid extension with version 1.0.Kito Cheng9-0/+26
It only add one new CSR: `srmcfg`. Ref: https://github.com/riscv/riscv-ssqosid/releases/tag/v1.0
2025-03-03RISC-V: Re-define mapping symbol $x to the file elf architecture attributeAndrew Oates2-0/+19
The mapping symbol "$x" without an ISA string "means using ISA configuration from ELF attribute."[1]. Currently the code does not reset the subset_list. This means that a previous mapping symbol that overrides the ISA string will continue to be used, rather than the default string set in the ELF file's .riscv.attributes section. This can cause incorrect or failed instruction decodings. In practice, this causes problems when disassembling code generated by LLVM, which (unlike gas) does not emit explicit mapping symbols at the start of each section. This change stores the default architecture string seen at the beginning of disassembly in the global parse data struct, and restores that to subset_list whenever a bare "$x" symbol is seen. [1] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#mapping-symbol Before this patch, the mapping-x.s was dumped as, 00000000 <.text>: 0: 00000013 nop 4: 0001 .insn 2, 0x0001 6: 0001 .insn 2, 0x0001 Which is caused by the definiation of $x was conflict with the psABI.
2025-03-03RISC-V: Stop generating mapping symbol $x, replace with $x<isa>.Nelson Chu2-28/+30
The psABI defined $x to the architecture which is same as the file elf attribute. But GNU defined it to that is same as the previous $x<isa>, and always generated $x<isa> at the begining of each section. That is because considering two objects have different architecture in their elf attributes, then $x will always be wrong after linking since the merged arch string will be changed. For example, object A with rv32ic and object B with rv32ia, $x from A is rv32ic and $x from B is rv32ia, but the final output is rv32ica, so $x from A and B need to be updated to rv32ic and rv32ia by linker respectively. I think let linker to do this is not good, so in order to follow the psABI, we will stop generating the $x for now. Instead, all $x will be replaced with the corresponding $x<isa>. The dis-assembler will also treat $x like what psABI defined.
2025-02-26gas: sframe: partially process DWARF unwind info in CFI_escapeIndu Bhagat12-13/+364
CFI_escape is most commonly used to include DWARF expressions in the unwind information. One may also use CFI_escape to add OS-specific CFI opcodes. Up until now, SFrame generation process would skip generating SFrame FDE at the mere sight of a CFI_escape opcode. Fine tune the handling of CFI_escape for SFrame generation by explicitly checking for few "harmless" (in context of SFrame generation) CFI_escape DWARF info: - DW_CFA_expression affecting registers of no significance to SFrame stack trace info - DW_CFA_value_offset affecting registers of no significance to SFrame stack trace info Expose the current cfi_escape_data structure in dw2gencfi.c to the relevant header file to allow SFrame generation APIs to use it too. Valid unwind info may be split across multiple .cfi_escape directives. Conversely, it is also allowed to simply put multiple DWARF expressions and/or operations in a single .cfi_escape directive. Handling all of these cases correctly will need parsing/processing that is not deemed worth the effort in context of SFrame generation; We continue to skip generating SFrame FDE for these cases and warn the user. In future, SFrame stack trace format may support non-SP/FP as base register (albeit in limited form). Add an explicit check in sframe_xlate_do_escape_expr (to test against the current CFA register) to ensure the functionality continues to work. Use differentiated warning text in sframe_xlate_do_val_offset to avoid confusion to the user as the same function is used for handling .cfi_val_offset and .cfi_escape DW_CFA_val_offset,... Also, add a common test with DWARF reg 12 which is non SP / FP on x86_64 and aarch64 (and s390x too). gas/ * gas/dw2gencfi.c (struct cfi_escape_data): Move from ... * gas/dw2gencfi.h (struct cfi_escape_data): ... to. * gas/gen-sframe.c (sframe_xlate_do_val_offset): Include string for .cfi_escape conditionally. (sframe_xlate_do_escape_expr): New definition. (sframe_xlate_do_escape_val_offset): Likewise. (sframe_xlate_do_cfi_escape): Likewise. (sframe_do_cfi_insn): Handle CFI_escape explicitly. gas/testsuite/ * gas/cfi-sframe/cfi-sframe.exp: Add new tests. * gas/cfi-sframe/cfi-sframe-common-9.d: New test. * gas/cfi-sframe/cfi-sframe-common-9.s: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-1.d: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-1.s: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-2.d: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-2.s: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-3.d: New test. * gas/cfi-sframe/cfi-sframe-x86_64-empty-3.s: New test.
2025-02-26RISC-V: Fix abort when displaying data and partial instructionsCharlie Jenkins3-1/+183
If data is encountered that is not a power of two, dump all of the data with a .<N>byte directive. The current largest support risc-v instruction length is 22, so the data over 22 bytes will be displayed by, .insn, 22, ... + .<N-22>byte. Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
2025-02-23gas: avoid dangling pointers into freed memoryAlan Modra1-1/+14
The oss-fuzz gas fuzzer is quite broken in that it doesn't reinitialise all gas and bfd static variables between runs. Since gas naughtily modifies bfd_und_section and bfd_abs_section those bfd statics can hold pointers into freed memory between runs. This patch fixes oss-fuzz issue 398060144.
2025-02-22MIPS objdump: Recognize o64 ABI namesMaximilian Ciric3-0/+48
Add gpr and fpr names for the o64 ABI to objdump. With the recent addition of both EABIs, this completes support for the standard ABI options (ABI-breaking options such as -modd-spreg or -mabi=32 -mfp64 notwithstanding). The names have been verified against GCC's usage of the registers. Notably, the only(?) documentation that defines the o64 ABI at https://gcc.gnu.org/projects/mipso64-abi.html appears to contain a mistake w.r.t. floating-point arguments. In particular: > If the first and second arguments floating-point arguments to a > function are 32-bit values, they are passed in $f12 and $f14. As from 4.0.0 this does not happen in GCC's implementation of the ABI; a pair of single-float arguments are still passed in $f12 and $f13, the same as when one or both of the arguments are double-precision floats. The registers $f12, $f13 and $f14 have been named $fa0, $fa1 and $ft10 to match the implementation. Signed-off-by: Maximilian Ciric <max.ciric@gmail.com>
2025-02-21x86: GOT is an ELF-only entityJan Beulich2-1/+4
Make md_undefined_symbol() conditional upon dealing with ELF, much like other architectures (e.g. Arm32 and Arm64) have it. This avoids errors in gas and even assertions in libbfd when "accidentally" e.g. a COFF- targeting source file uses "_GLOBAL_OFFSET_TABLE_" for whatever reason. While there also convert the final return statement to properly use NULL. NB: In principle 64-bit Mach-O knows GOT, too. Yet only an i?86-macho assembler can be built right now, as per configure.tgt. Pretty clearly adjustments to gotrel[] would also be necessary before these targets could actually work reasonably cleanly.
2025-02-21ix86: restrict use of GOT32X relocsJan Beulich1-1/+4
The ELF linker rejects use of this reloc type without a base register for PIC code. Suppress its use by gas in such cases. To keep things building for non-ELF, include the entire containing if() in an #ifdef: All consumers of ->fx_tcbit* live in such conditionals as well, hence there's no reason to keep the producer active.