diff --git a/llvm/include/llvm/BinaryFormat/XCOFF.h b/llvm/include/llvm/BinaryFormat/XCOFF.h index 5774e01429d37..19d44a5ac57f1 100644 --- a/llvm/include/llvm/BinaryFormat/XCOFF.h +++ b/llvm/include/llvm/BinaryFormat/XCOFF.h @@ -328,6 +328,7 @@ enum CFileStringType : uint8_t { enum CFileLangId : uint8_t { TB_C = 0, ///< C language. + TB_Fortran = 1, ///< Fortran language. TB_CPLUSPLUS = 9 ///< C++ language. }; diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp index 30fa72703275f..036210d6b0efa 100644 --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/llvm/lib/MC/XCOFFObjectWriter.cpp @@ -1104,11 +1104,36 @@ void XCOFFObjectWriter::writeRelocations() { void XCOFFObjectWriter::writeSymbolTable(const MCAsmLayout &Layout) { // Write C_FILE symbols. - // The n_name of a C_FILE symbol is the source file's name when no auxiliary - // entries are present. for (const std::pair &F : FileNames) { - writeSymbolEntry(F.first, /*Value=*/0, XCOFF::ReservedSectionNum::N_DEBUG, - /*SymbolType=*/0, XCOFF::C_FILE, + // The n_name of a C_FILE symbol is the source file's name when no auxiliary + // entries are present. + StringRef FileName = F.first; + + // For C_FILE symbols, the Source Language ID overlays the high-order byte + // of the SymbolType field, and the CPU Version ID is defined as the + // low-order byte. + // AIX's system assembler determines the source language ID based on the + // source file's name suffix, and the behavior here is consistent with it. + uint8_t LangID; + if (FileName.ends_with(".c")) + LangID = XCOFF::TB_C; + else if (FileName.ends_with_insensitive(".f") || + FileName.ends_with_insensitive(".f77") || + FileName.ends_with_insensitive(".f90") || + FileName.ends_with_insensitive(".f95") || + FileName.ends_with_insensitive(".f03") || + FileName.ends_with_insensitive(".f08")) + LangID = XCOFF::TB_Fortran; + else + LangID = XCOFF::TB_CPLUSPLUS; + uint8_t CpuID; + if (is64Bit()) + CpuID = XCOFF::TCPU_PPC64; + else + CpuID = XCOFF::TCPU_COM; + + writeSymbolEntry(FileName, /*Value=*/0, XCOFF::ReservedSectionNum::N_DEBUG, + /*SymbolType=*/(LangID << 8) | CpuID, XCOFF::C_FILE, /*NumberOfAuxEntries=*/0); } diff --git a/llvm/test/CodeGen/PowerPC/aix-extern-weak.ll b/llvm/test/CodeGen/PowerPC/aix-extern-weak.ll index e343f7011a311..154bd6418947d 100644 --- a/llvm/test/CodeGen/PowerPC/aix-extern-weak.ll +++ b/llvm/test/CodeGen/PowerPC/aix-extern-weak.ll @@ -68,8 +68,9 @@ declare extern_weak void @foo_ext_weak(ptr) ; CHECKSYM-NEXT: Name: ; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0 ; CHECKSYM-NEXT: Section: N_DEBUG -; CHECKSYM-NEXT: Source Language ID: TB_C (0x0) -; CHECKSYM-NEXT: CPU Version ID: 0x0 +; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3) +; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; CHECKSYM-NEXT: StorageClass: C_FILE (0x67) ; CHECKSYM-NEXT: NumberOfAuxEntries: 0 ; CHECKSYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-extern.ll b/llvm/test/CodeGen/PowerPC/aix-extern.ll index 4666abf560b5a..23bf7ecab350c 100644 --- a/llvm/test/CodeGen/PowerPC/aix-extern.ll +++ b/llvm/test/CodeGen/PowerPC/aix-extern.ll @@ -91,8 +91,9 @@ declare i32 @bar_extern(ptr) ; CHECKSYM-NEXT: Name: ; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0 ; CHECKSYM-NEXT: Section: N_DEBUG -; CHECKSYM-NEXT: Source Language ID: TB_C (0x0) -; CHECKSYM-NEXT: CPU Version ID: 0x0 +; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3) +; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; CHECKSYM-NEXT: StorageClass: C_FILE (0x67) ; CHECKSYM-NEXT: NumberOfAuxEntries: 0 ; CHECKSYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-filename-c.ll b/llvm/test/CodeGen/PowerPC/aix-filename-c.ll new file mode 100644 index 0000000000000..2adc51cc2aecc --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-filename-c.ll @@ -0,0 +1,11 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefixes=OBJ,OBJ32 %s +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -filetype=obj -o %t64.o < %s +; RUN: llvm-readobj --symbols %t64.o | FileCheck --check-prefixes=OBJ,OBJ64 %s + +source_filename = "1.c" + +; OBJ: Name: 1.c +; OBJ: Source Language ID: TB_C (0x0) +; OBJ32: CPU Version ID: TCPU_COM (0x3) +; OBJ64: CPU Version ID: TCPU_PPC64 (0x2) diff --git a/llvm/test/CodeGen/PowerPC/aix-filename-cpp.ll b/llvm/test/CodeGen/PowerPC/aix-filename-cpp.ll new file mode 100644 index 0000000000000..22496be1dfc88 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-filename-cpp.ll @@ -0,0 +1,11 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefixes=OBJ,OBJ32 %s +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -filetype=obj -o %t64.o < %s +; RUN: llvm-readobj --symbols %t64.o | FileCheck --check-prefixes=OBJ,OBJ64 %s + +source_filename = "1.cpp" + +; OBJ: Name: 1.cpp +; OBJ: Source Language ID: TB_CPLUSPLUS (0x9) +; OBJ32: CPU Version ID: TCPU_COM (0x3) +; OBJ64: CPU Version ID: TCPU_PPC64 (0x2) diff --git a/llvm/test/CodeGen/PowerPC/aix-filename-f.ll b/llvm/test/CodeGen/PowerPC/aix-filename-f.ll new file mode 100644 index 0000000000000..914c4facc3cf5 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-filename-f.ll @@ -0,0 +1,11 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefixes=OBJ,OBJ32 %s +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -filetype=obj -o %t64.o < %s +; RUN: llvm-readobj --symbols %t64.o | FileCheck --check-prefixes=OBJ,OBJ64 %s + +source_filename = "1.f95" + +; OBJ: Name: 1.f95 +; OBJ: Source Language ID: TB_Fortran (0x1) +; OBJ32: CPU Version ID: TCPU_COM (0x3) +; OBJ64: CPU Version ID: TCPU_PPC64 (0x2) diff --git a/llvm/test/CodeGen/PowerPC/aix-func-dsc-gen.ll b/llvm/test/CodeGen/PowerPC/aix-func-dsc-gen.ll index f774870aeedbf..23fb51e944424 100644 --- a/llvm/test/CodeGen/PowerPC/aix-func-dsc-gen.ll +++ b/llvm/test/CodeGen/PowerPC/aix-func-dsc-gen.ll @@ -16,8 +16,8 @@ entry: ; CHECK-NEXT: Name: ; CHECK-NEXT: Value (SymbolTableIndex): 0x0 ; CHECK-NEXT: Section: N_DEBUG -; CHECK-NEXT: Source Language ID: TB_C (0x0) -; CHECK-NEXT: CPU Version ID: 0x0 +; CHECK-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; CHECK-NEXT: CPU Version ID: TCPU_COM (0x3) ; CHECK-NEXT: StorageClass: C_FILE (0x67) ; CHECK-NEXT: NumberOfAuxEntries: 0 ; CHECK-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-llvm-intrinsic.ll b/llvm/test/CodeGen/PowerPC/aix-llvm-intrinsic.ll index b4b695138376d..09aec55a5b3df 100644 --- a/llvm/test/CodeGen/PowerPC/aix-llvm-intrinsic.ll +++ b/llvm/test/CodeGen/PowerPC/aix-llvm-intrinsic.ll @@ -43,8 +43,9 @@ declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg) ; CHECKSYM-NEXT: Name: ; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0 ; CHECKSYM-NEXT: Section: N_DEBUG -; CHECKSYM-NEXT: Source Language ID: TB_C (0x0) -; CHECKSYM-NEXT: CPU Version ID: 0x0 +; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3) +; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; CHECKSYM-NEXT: StorageClass: C_FILE (0x67) ; CHECKSYM-NEXT: NumberOfAuxEntries: 0 ; CHECKSYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc-large.ll b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc-large.ll index a9984b81e3560..2dae8ee96e20d 100644 --- a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc-large.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc-large.ll @@ -213,8 +213,8 @@ entry: ; SYM-NEXT: Name: ; SYM-NEXT: Value (SymbolTableIndex): 0x0 ; SYM-NEXT: Section: N_DEBUG -; SYM-NEXT: Source Language ID: TB_C (0x0) -; SYM-NEXT: CPU Version ID: 0x0 +; SYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; SYM-NEXT: CPU Version ID: TCPU_COM (0x3) ; SYM-NEXT: StorageClass: C_FILE (0x67) ; SYM-NEXT: NumberOfAuxEntries: 0 ; SYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc.ll b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc.ll index d1223325df292..0779686b54f3a 100644 --- a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-reloc.ll @@ -174,8 +174,8 @@ entry: ; SYM-NEXT: Name: ; SYM-NEXT: Value (SymbolTableIndex): 0x0 ; SYM-NEXT: Section: N_DEBUG -; SYM-NEXT: Source Language ID: TB_C (0x0) -; SYM-NEXT: CPU Version ID: 0x0 +; SYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; SYM-NEXT: CPU Version ID: TCPU_COM (0x3) ; SYM-NEXT: StorageClass: C_FILE (0x67) ; SYM-NEXT: NumberOfAuxEntries: 0 ; SYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll index 6b3de05c583a0..3bbdadcdb7bae 100644 --- a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll @@ -69,8 +69,8 @@ ; SYMS-NEXT: Name: ; SYMS-NEXT: Value (SymbolTableIndex): 0x0 ; SYMS-NEXT: Section: N_DEBUG -; SYMS-NEXT: Source Language ID: TB_C (0x0) -; SYMS-NEXT: CPU Version ID: 0x0 +; SYMS-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; SYMS-NEXT: CPU Version ID: TCPU_COM (0x3) ; SYMS-NEXT: StorageClass: C_FILE (0x67) ; SYMS-NEXT: NumberOfAuxEntries: 0 ; SYMS-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-weak.ll b/llvm/test/CodeGen/PowerPC/aix-weak.ll index e01fe63ec5f0d..bc098b83e372f 100644 --- a/llvm/test/CodeGen/PowerPC/aix-weak.ll +++ b/llvm/test/CodeGen/PowerPC/aix-weak.ll @@ -103,8 +103,9 @@ entry: ; CHECKSYM-NEXT: Name: ; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0 ; CHECKSYM-NEXT: Section: N_DEBUG -; CHECKSYM-NEXT: Source Language ID: TB_C (0x0) -; CHECKSYM-NEXT: CPU Version ID: 0x0 +; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3) +; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; CHECKSYM-NEXT: StorageClass: C_FILE (0x67) ; CHECKSYM-NEXT: NumberOfAuxEntries: 0 ; CHECKSYM-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll b/llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll index bd050ca5ae907..4913549938670 100644 --- a/llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll +++ b/llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll @@ -211,8 +211,9 @@ ; SYMS-NEXT: Name: ; SYMS-NEXT: Value (SymbolTableIndex): 0x0 ; SYMS-NEXT: Section: N_DEBUG -; SYMS-NEXT: Source Language ID: TB_C (0x0) -; SYMS-NEXT: CPU Version ID: 0x0 +; SYMS-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; SYMS32-NEXT: CPU Version ID: TCPU_COM (0x3) +; SYMS64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; SYMS-NEXT: StorageClass: C_FILE (0x67) ; SYMS-NEXT: NumberOfAuxEntries: 0 ; SYMS-NEXT: } diff --git a/llvm/test/CodeGen/PowerPC/aix-xcoff-reloc.ll b/llvm/test/CodeGen/PowerPC/aix-xcoff-reloc.ll index 782b078a0e497..97a5fbcf78f5d 100644 --- a/llvm/test/CodeGen/PowerPC/aix-xcoff-reloc.ll +++ b/llvm/test/CodeGen/PowerPC/aix-xcoff-reloc.ll @@ -162,8 +162,9 @@ declare i32 @bar(i32) ; SYM-NEXT: Name: ; SYM-NEXT: Value (SymbolTableIndex): 0x0 ; SYM-NEXT: Section: N_DEBUG -; SYM-NEXT: Source Language ID: TB_C (0x0) -; SYM-NEXT: CPU Version ID: 0x0 +; SYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9) +; SYM32-NEXT: CPU Version ID: TCPU_COM (0x3) +; SYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2) ; SYM-NEXT: StorageClass: C_FILE (0x67) ; SYM-NEXT: NumberOfAuxEntries: 0 ; SYM-NEXT: } diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index 8f4e55be2d915..74ebcc4ec7d85 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -710,7 +710,7 @@ static StringRef GetSymbolValueName(XCOFF::StorageClass SC) { const EnumEntry CFileLangIdClass[] = { #define ECase(X) \ { #X, XCOFF::X } - ECase(TB_C), ECase(TB_CPLUSPLUS) + ECase(TB_C), ECase(TB_Fortran), ECase(TB_CPLUSPLUS) #undef ECase };