Update LLVM build for PPC64

Adds support for PPC64 LLVM build to CMake and gn

Bug: b/135175069
Signed-off-by: Colin Samples <colin.samples+git@gmail.com>
Change-Id: I3123a6e1457d3a5b2528516dadc019617afa4988
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/32810
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 23710c5..c954e62 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,12 @@
     else()
         set(ARCH "mipsel")
     endif()
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc*")
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+        set(ARCH "ppc64le")
+    else()
+        message(FATAL_ERROR "Architecture is not supported")
+    endif()
 else()
     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
         set(ARCH "x86_64")
@@ -918,6 +924,7 @@
     ${LLVM_DIR}/lib/Support/APSInt.cpp
     ${LLVM_DIR}/lib/Support/ARMAttributeParser.cpp
     ${LLVM_DIR}/lib/Support/ARMBuildAttrs.cpp
+    ${LLVM_DIR}/lib/Support/Atomic.cpp
     ${LLVM_DIR}/lib/Support/BinaryStreamError.cpp
     ${LLVM_DIR}/lib/Support/BinaryStreamReader.cpp
     ${LLVM_DIR}/lib/Support/BinaryStreamRef.cpp
@@ -1025,11 +1032,13 @@
     ${LLVM_DIR}/lib/Transforms/Scalar/EarlyCSE.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/GVN.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/LICM.cpp
+    ${LLVM_DIR}/lib/Transforms/Scalar/LoopDataPrefetch.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/LoopStrengthReduce.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/MergeICmps.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/Reassociate.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/SCCP.cpp
+    ${LLVM_DIR}/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/SimplifyCFGPass.cpp
     ${LLVM_DIR}/lib/Transforms/Scalar/SROA.cpp
     ${LLVM_DIR}/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -1296,6 +1305,52 @@
         ${LLVM_DIR}/lib/Target/ARM/ThumbRegisterInfo.cpp
         ${LLVM_DIR}/lib/Target/ARM/Utils/ARMBaseInfo.cpp
     )
+elseif(ARCH STREQUAL "ppc64le")
+    list(APPEND LLVM_LIST
+        ${LLVM_DIR}/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/MCTargetDesc/PPCPredicates.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCAsmPrinter.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCBoolRetToInt.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCBranchCoalescing.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCBranchSelector.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCCCState.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCCTRLoops.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCEarlyReturn.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCExpandISEL.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCFastISel.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCFrameLowering.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCHazardRecognizers.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCInstrInfo.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCISelLowering.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCMachineFunctionInfo.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCMCInstLower.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCMIPeephole.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCPreEmitPeephole.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCQPXLoadSplat.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCReduceCRLogicals.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCRegisterInfo.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCSubtarget.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCTargetMachine.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCTargetObjectFile.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCTLSDynamicCall.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCTOCRegDeps.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCVSXCopy.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp
+        ${LLVM_DIR}/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp
+    )
 endif()
 
 if(REACTOR_EMIT_DEBUG_INFO)
@@ -1324,12 +1379,14 @@
     ${LLVM_DIR}/lib/Target/AArch64
     ${LLVM_DIR}/lib/Target/ARM
     ${LLVM_DIR}/lib/Target/Mips
+    ${LLVM_DIR}/lib/Target/PowerPC
     ${LLVM_DIR}/lib/Target/X86
     ${LLVM_CONFIG_DIR}/common/include
     ${LLVM_CONFIG_DIR}/common/lib/IR
     ${LLVM_CONFIG_DIR}/common/lib/Target/AArch64
     ${LLVM_CONFIG_DIR}/common/lib/Target/ARM
     ${LLVM_CONFIG_DIR}/common/lib/Target/Mips
+    ${LLVM_CONFIG_DIR}/common/lib/Target/PowerPC
     ${LLVM_CONFIG_DIR}/common/lib/Target/X86
     ${LLVM_CONFIG_DIR}/common/lib/Transforms/InstCombine
 )
diff --git a/third_party/llvm-7.0/BUILD.gn b/third_party/llvm-7.0/BUILD.gn
index 25415af..011272a 100644
--- a/third_party/llvm-7.0/BUILD.gn
+++ b/third_party/llvm-7.0/BUILD.gn
@@ -83,12 +83,14 @@
   "llvm/lib/Target/AArch64/",
   "llvm/lib/Target/ARM/",
   "llvm/lib/Target/Mips/",
+  "llvm/lib/Target/PowerPC/",
   "llvm/lib/Target/X86/",
   "configs/common/include/",
   "configs/common/lib/IR/",
   "configs/common/lib/Target/AArch64/",
   "configs/common/lib/Target/ARM/",
   "configs/common/lib/Target/Mips/",
+  "configs/common/lib/Target/PowerPC/",
   "configs/common/lib/Target/X86/",
   "configs/common/lib/Transforms/InstCombine/",
 ]
@@ -328,6 +330,8 @@
     deps += [":swiftshader_llvm_aarch64"]
   } else if (target_cpu == "mipsel" || target_cpu == "mips64el") {
     deps += [":swiftshader_llvm_mips"]
+  } else if (target_cpu == "ppc64") {
+    deps += [":swiftshader_llvm_ppc"]
   } else {
     assert(false, "Unsupported target_cpu")
   }
@@ -603,6 +607,58 @@
   include_dirs = llvm_include_dirs
 }
 
+swiftshader_source_set("swiftshader_llvm_ppc") {
+  sources = [
+    "llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp",
+    "llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp",
+    "llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp",
+    "llvm/lib/Target/PowerPC/MCTargetDesc/PPCPredicates.cpp",
+    "llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp",
+    "llvm/lib/Target/PowerPC/PPCBoolRetToInt.cpp",
+    "llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp",
+    "llvm/lib/Target/PowerPC/PPCBranchSelector.cpp",
+    "llvm/lib/Target/PowerPC/PPCCCState.cpp",
+    "llvm/lib/Target/PowerPC/PPCCTRLoops.cpp",
+    "llvm/lib/Target/PowerPC/PPCEarlyReturn.cpp",
+    "llvm/lib/Target/PowerPC/PPCExpandISEL.cpp",
+    "llvm/lib/Target/PowerPC/PPCFastISel.cpp",
+    "llvm/lib/Target/PowerPC/PPCFrameLowering.cpp",
+    "llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp",
+    "llvm/lib/Target/PowerPC/PPCInstrInfo.cpp",
+    "llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp",
+    "llvm/lib/Target/PowerPC/PPCISelLowering.cpp",
+    "llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp",
+    "llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.cpp",
+    "llvm/lib/Target/PowerPC/PPCMCInstLower.cpp",
+    "llvm/lib/Target/PowerPC/PPCMIPeephole.cpp",
+    "llvm/lib/Target/PowerPC/PPCPreEmitPeephole.cpp",
+    "llvm/lib/Target/PowerPC/PPCQPXLoadSplat.cpp",
+    "llvm/lib/Target/PowerPC/PPCReduceCRLogicals.cpp",
+    "llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp",
+    "llvm/lib/Target/PowerPC/PPCSubtarget.cpp",
+    "llvm/lib/Target/PowerPC/PPCTargetMachine.cpp",
+    "llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp",
+    "llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp",
+    "llvm/lib/Target/PowerPC/PPCTLSDynamicCall.cpp",
+    "llvm/lib/Target/PowerPC/PPCTOCRegDeps.cpp",
+    "llvm/lib/Target/PowerPC/PPCVSXCopy.cpp",
+    "llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp",
+    "llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp",
+    "llvm/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp",
+  ]
+
+  configs = [ ":swiftshader_llvm_private_config" ]
+
+  include_dirs = llvm_include_dirs
+}
+
 swiftshader_source_set("swiftshader_llvm_codegen") {
   sources = [
     "llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp",
@@ -899,6 +955,7 @@
     "llvm/lib/Support/APSInt.cpp",
     "llvm/lib/Support/ARMAttributeParser.cpp",
     "llvm/lib/Support/ARMBuildAttrs.cpp",
+    "llvm/lib/Support/Atomic.cpp",
     "llvm/lib/Support/BinaryStreamError.cpp",
     "llvm/lib/Support/BinaryStreamReader.cpp",
     "llvm/lib/Support/BinaryStreamRef.cpp",