diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h
--- a/llvm/include/llvm/Object/XCOFFObjectFile.h
+++ b/llvm/include/llvm/Object/XCOFFObjectFile.h
@@ -370,7 +370,7 @@
   const void *getPointerToSymbolTable() const { return SymbolTblPtr; }
 
   Expected<StringRef> getSymbolSectionName(XCOFFSymbolRef Ref) const;
-
+  unsigned getSymbolSectionID(SymbolRef Sym) const;
   XCOFFSymbolRef toSymbolRef(DataRefImpl Ref) const;
 
   // File header related interfaces.
@@ -525,6 +525,15 @@
 
   Expected<StringRef> getName() const;
   bool isFunction() const;
+  bool isExternal() const;
+  bool isWeakExternal() const;
+  bool isUndefined() const;
+  bool isCommon() const;
+  bool isFileRecord() const;
+  bool isDebug() const;
+  bool isSectionDefinition() const;
+  bool isHidden() const;
+  bool isExported() const;
   bool isCsectSymbol() const;
   Expected<XCOFFCsectAuxRef> getXCOFFCsectAuxRef() const;
 
diff --git a/llvm/lib/Object/SymbolSize.cpp b/llvm/lib/Object/SymbolSize.cpp
--- a/llvm/lib/Object/SymbolSize.cpp
+++ b/llvm/lib/Object/SymbolSize.cpp
@@ -12,6 +12,7 @@
 #include "llvm/Object/ELFObjectFile.h"
 #include "llvm/Object/MachO.h"
 #include "llvm/Object/Wasm.h"
+#include "llvm/Object/XCOFFObjectFile.h"
 
 using namespace llvm;
 using namespace object;
@@ -30,7 +31,8 @@
     return M->getSectionID(Sec);
   if (isa<WasmObjectFile>(&O))
     return Sec.getIndex();
-
+  if (isa<XCOFFObjectFile>(&O))
+    return Sec.getIndex();
   return cast<COFFObjectFile>(O).getSectionID(Sec);
 }
 
@@ -39,6 +41,8 @@
     return M->getSymbolSectionID(Sym);
   if (const auto *M = dyn_cast<WasmObjectFile>(&O))
     return M->getSymbolSectionId(Sym);
+  if (const auto *M = dyn_cast<XCOFFObjectFile>(&O))
+    return M->getSymbolSectionID(Sym);
   return cast<COFFObjectFile>(O).getSymbolSectionID(Sym);
 }
 
diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp
--- a/llvm/lib/Object/XCOFFObjectFile.cpp
+++ b/llvm/lib/Object/XCOFFObjectFile.cpp
@@ -25,6 +25,7 @@
 
 static const uint8_t FunctionSym = 0x20;
 static const uint16_t NoRelMask = 0x0001;
+static const uint32_t SymVisMask = 0xF000;
 static const size_t SymbolAuxTypeOffset = 17;
 
 // Checks that [Ptr, Ptr + Size) bytes fall inside the memory buffer
@@ -207,7 +208,22 @@
 
 Expected<SymbolRef::Type>
 XCOFFObjectFile::getSymbolType(DataRefImpl Symb) const {
-  llvm_unreachable("Not yet implemented!");
+  XCOFFSymbolRef XCOFFSymRef(Symb, this);
+  if (XCOFFSymRef.isUndefined())
+    return SymbolRef::ST_Unknown;
+  if (XCOFFSymRef.isCommon())
+    return SymbolRef::ST_Data;
+  if (XCOFFSymRef.isDebug() || XCOFFSymRef.isSectionDefinition())
+    return SymbolRef::ST_Debug;
+  if (XCOFFSymRef.isFileRecord())
+    return SymbolRef::ST_File;
+  if (XCOFFSymRef.isFunction())
+    return SymbolRef::ST_Function;
+
+  int16_t SecNum = XCOFFSymRef.getSectionNumber();
+  if (isReservedSectionNumber(SecNum))
+    return SymbolRef::ST_Data;
+
   return SymbolRef::ST_Other;
 }
 
@@ -386,8 +402,24 @@
 }
 
 Expected<uint32_t> XCOFFObjectFile::getSymbolFlags(DataRefImpl Symb) const {
-  uint32_t Result = 0;
-  llvm_unreachable("Not yet implemented!");
+  uint32_t Result = SymbolRef::SF_None;
+  XCOFFSymbolRef XCOFFSymRef(Symb, this);
+  if (XCOFFSymRef.isExternal() || XCOFFSymRef.isWeakExternal())
+    Result |= SymbolRef::SF_Global;
+  if (XCOFFSymRef.isWeakExternal() && XCOFFSymRef.getNumberOfAuxEntries())
+    Result |= SymbolRef::SF_Weak;
+  if (XCOFFSymRef.isUndefined())
+    Result |= SymbolRef::SF_Undefined;
+  if (XCOFFSymRef.isFileRecord() || XCOFFSymRef.isSectionDefinition())
+    Result |= SymbolRef::SF_FormatSpecific;
+  if (XCOFFSymRef.getSectionNumber() == XCOFF::N_ABS)
+    Result |= SymbolRef::SF_Absolute;
+  if (XCOFFSymRef.isCommon())
+    Result |= SymbolRef::SF_Common;
+  if (XCOFFSymRef.isHidden())
+    Result |= SymbolRef::SF_Hidden;
+  if (XCOFFSymRef.isExported())
+    Result |= SymbolRef::SF_Exported;
   return Result;
 }
 
@@ -506,6 +538,11 @@
   }
 }
 
+unsigned XCOFFObjectFile::getSymbolSectionID(SymbolRef Sym) const {
+  XCOFFSymbolRef XCOFFSymRef(Sym.getRawDataRefImpl(), this);
+  return XCOFFSymRef.getSectionNumber();
+}
+
 bool XCOFFObjectFile::isReservedSectionNumber(int16_t SectionNumber) {
   return (SectionNumber <= 0 && SectionNumber >= -2);
 }
@@ -804,6 +841,49 @@
   return (OwningObjectPtr->getSectionFlags(SI.get()) & XCOFF::STYP_TEXT);
 }
 
+bool XCOFFSymbolRef::isExternal() const {
+  return getStorageClass() == XCOFF::C_EXT;
+}
+
+bool XCOFFSymbolRef::isWeakExternal() const {
+  return getStorageClass() == XCOFF::C_WEAKEXT;
+}
+
+bool XCOFFSymbolRef::isUndefined() const {
+  return ((isExternal() && getSectionNumber() == XCOFF::N_UNDEF &&
+       getSymbolType() == 0) || isWeakExternal());
+}
+
+bool XCOFFSymbolRef::isCommon() const {
+  return (getStorageClass() == XCOFF::C_EXT &&
+          getSectionNumber() == XCOFF::N_UNDEF && getSymbolType() != 0);
+}
+
+bool XCOFFSymbolRef::isFileRecord() const {
+  return getStorageClass() == XCOFF::C_FILE;
+}
+
+bool XCOFFSymbolRef::isDebug() const {
+  return getSectionNumber() == XCOFF::N_DEBUG;
+}
+
+bool XCOFFSymbolRef::isSectionDefinition() const {
+  if (!getNumberOfAuxEntries())
+    return false;
+  bool isAppdomainGlobal =
+      getStorageClass() == XCOFF::C_EXT && getSectionNumber() == XCOFF::N_ABS;
+  bool isOrdinarySection = getStorageClass() == XCOFF::C_STAT;
+  return isAppdomainGlobal || isOrdinarySection;
+}
+
+bool XCOFFSymbolRef::isHidden() const {
+  return (getSymbolType() & SymVisMask) == XCOFF::SYM_V_HIDDEN;
+}
+
+bool XCOFFSymbolRef::isExported() const {
+  return (getSymbolType() & SymVisMask) == XCOFF::SYM_V_EXPORTED;
+}
+
 bool XCOFFSymbolRef::isCsectSymbol() const {
   XCOFF::StorageClass SC = getStorageClass();
   return (SC == XCOFF::C_EXT || SC == XCOFF::C_WEAKEXT ||
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic32.o b/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic32.o
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001

literal 0
Hc$@<O00001

diff --git a/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic64.o b/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic64.o
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001

literal 0
Hc$@<O00001

diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
--- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
@@ -1,5 +1,3 @@
-# REQUIRES: powerpc-registered-target
-
 # RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \
 # RUN:   FileCheck %s
 
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test
--- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test
@@ -1,5 +1,3 @@
-# REQUIRES: powerpc-registered-target
-
 # RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \
 # RUN:   FileCheck --check-prefixes=COMMON,PLAIN %s
 
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg b/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg
--- a/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg
+++ b/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg
@@ -0,0 +1,2 @@
+if not 'PowerPC' in config.root.targets:
+    config.unsupported = True
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test b/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test
--- a/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test
@@ -0,0 +1,48 @@
+# RUN: llvm-objdump -d -l %p/Inputs/basic32.o | FileCheck %s --check-prefix=LINES32
+# RUN: llvm-objdump -d -l %p/Inputs/basic64.o | FileCheck %s --check-prefix=LINES64
+
+## basic32.o Compiled with IBM XL C/C++ for AIX, V16.1.1.0
+## Compiler command: xlc basic.c -c -qdbgfmt=dwarf -g -q32 -o basic32.o
+##
+## basic64.o Compiled with IBM XL C/C++ for AIX, V16.1.1.0
+## Compiler command: xlc basic.c -c -qdbgfmt=dwarf -g -q64 -o basic64.o
+##
+## basic.c:
+## int main(void)
+## {
+##   return 0;
+## }
+
+# LINES32:       Inputs/basic32.o:	file format aixcoff-rs6000
+# LINES32:       Disassembly of section .text:
+# LINES32:       00000000 <.text>:
+# LINES32:       ; .main():
+# LINES32-NEXT:  ; /basic.c:1
+# LINES32-NEXT:         0: 38 60 00 00  	li 3, 0
+# LINES32-NEXT:  ; /basic.c:3
+# LINES32-NEXT:         4: 48 00 00 04  	b 0x8
+# LINES32-NEXT:  ; /basic.c:4
+# LINES32-NEXT:         8: 4e 80 00 20  	blr
+# LINES32-NEXT:         c: 00 00 00 00  	<unknown>
+# LINES32-NEXT:        10: 00 00 20 40  	<unknown>
+# LINES32-NEXT:        14: 00 00 00 01  	<unknown>
+# LINES32-NEXT:        18: 00 00 00 0c  	<unknown>
+# LINES32-NEXT:        1c: 00 04 6d 61  	<unknown>
+# LINES32-NEXT:        20: 69 6e 00 00  	xori 14, 11, 0
+
+# LINES64:       Inputs/basic64.o:	file format aix5coff64-rs6000
+# LINES64:       Disassembly of section .text:
+# LINES64:       0000000000000000 <.main>:
+# LINES64:       ; .main():
+# LINES64-NEXT:  ; /basic.c:1
+# LINES64-NEXT:         0: 38 60 00 00  	li 3, 0
+# LINES64-NEXT:  ; /basic.c:3
+# LINES64-NEXT:         4: 48 00 00 04  	b 0x8
+# LINES64-NEXT:  ; /basic.c:4
+# LINES64-NEXT:         8: 4e 80 00 20  	blr
+# LINES64-NEXT:         c: 00 00 00 00  	<unknown>
+# LINES64-NEXT:        10: 00 00 20 40  	<unknown>
+# LINES64-NEXT:        14: 00 00 00 01  	<unknown>
+# LINES64-NEXT:        18: 00 00 00 0c  	<unknown>
+# LINES64-NEXT:        1c: 00 04 6d 61  	<unknown>
+# LINES64-NEXT:        20: 69 6e 00 00  	xori 14, 11, 0
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test b/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test
--- a/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test
@@ -1,5 +1,3 @@
-# REQUIRES: powerpc-registered-target
-
 # RUN: llvm-objdump -r %p/Inputs/xcoff-section-headers.o | \
 # RUN:   FileCheck --match-full-lines --strict-whitespace %s