GAS supports specification of section header's type using a numeric
value [1]. This patch brings the same functionality to LLVM. That allows
to setup some target-specific section types belong to the SHT_LOPROC -
SHT_HIPROC range. If we attempt to print unknown section type, MCSectionELF
class shows an error message. It's better than print sole '@' sign
without any section type name.
In case of MIPS, example of such section's type is SHT_MIPS_DWARF.
Without the patch we will have to implement some workarounds
in probably not-MIPS-specific part of code base to convert SHT_MIPS_DWARF
to the @progbits while printing assembly and to assign SHT_MIPS_DWARF for
@progbits sections named .debug_* if we encounter such section in
an input assembly.
[1] https://sourceware.org/binutils/docs/as/Section.html
Differential Revision: https://reviews.llvm.org/D29719
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297446
91177308-0d34-0410-b5e6-
96231b3b80d8
return TokError("expected '@<type>', '%<type>' or \"<type>\"");
if (!L.is(AsmToken::String))
Lex();
- if (getParser().parseIdentifier(TypeName))
+ if (L.is(AsmToken::Integer)) {
+ TypeName = getTok().getString();
+ Lex();
+ } else if (getParser().parseIdentifier(TypeName))
return TokError("expected identifier in directive");
return false;
}
Type = ELF::SHT_NOTE;
else if (TypeName == "unwind")
Type = ELF::SHT_X86_64_UNWIND;
- else
+ else if (TypeName.getAsInteger(0, Type))
return TokError("unknown section type");
}
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/Support/ELF.h"
+#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
OS << "progbits";
else if (Type == ELF::SHT_X86_64_UNWIND)
OS << "unwind";
+ else
+ report_fatal_error("unsupported type 0x" + Twine::utohexstr(Type) +
+ " for section " + getSectionName());
if (EntrySize) {
assert(Flags & ELF::SHF_MERGE);
--- /dev/null
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux-gnu %s -o - \
+// RUN: | llvm-readobj -s -t | FileCheck --check-prefix=OBJ %s
+
+// RUN: not llvm-mc -filetype=asm -triple=x86_64-pc-linux-gnu %s -o - 2>&1 \
+// RUN: | FileCheck --check-prefix=ASM %s
+
+ .section .sec,"a",@0x7fffffff
+
+// OBJ: Section {
+// OBJ: Name: .sec
+// OBJ-NEXT: Type: (0x7FFFFFFF)
+// OBJ: }
+
+// ASM: unsupported type 0x7fffffff for section .sec
--- /dev/null
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux-gnu %s -o - \
+// RUN: | llvm-readobj -s -t | FileCheck --check-prefix=OBJ %s
+
+// RUN: llvm-mc -filetype=asm -triple=x86_64-pc-linux-gnu %s -o - \
+// RUN: | FileCheck --check-prefix=ASM %s
+
+ .section .sec1,"a",@0x70000001
+ .section .sec2,"a",@1879048193
+
+// OBJ: Section {
+// OBJ: Name: .sec1
+// OBJ-NEXT: Type: SHT_X86_64_UNWIND (0x70000001)
+// OBJ: }
+// OBJ: Section {
+// OBJ: Name: .sec2
+// OBJ-NEXT: Type: SHT_X86_64_UNWIND (0x70000001)
+// OBJ: }
+
+// ASM: .section .sec1,"a",@unwind
+// ASM: .section .sec2,"a",@unwind