LLVM/project 00b9918 — llvm/lib/CodeGen RegisterCoalescer.cpp, llvm/test/CodeGen/AMDGPU coalescer-subreg-implicit-def-phi-input.mir

RegisterCoalescer: Restore subrange PHI inputs of pruned undef values

When joining erases an IMPLICIT_DEF or a copy, the liveness of undefined
lanes may have started at that instruction, so pruneSubRegValues removes
those subrange values. If such a value was live-out into a subrange PHI,
the PHI is left without an input from that predecessor, even though
after the join the lane value from the earlier def of the joined
register reaches it. The main range does not have this gap because
pruneValues collects the pruned end points and joinVirtRegs restores
them with extendToIndices.

Record the PHI kills of the pruned value, the predecessor block ends
where it is live-out into a PHI as in LiveIntervals::hasPHIKill, and
restore them with extendToIndices once operands are rewritten, together
with the existing subrange shrinking. The rewrite is needed so
computeSubRangeUndefs sees the defs of both registers. Only PHI kills are
restored; the in-block kills of a pruned value are reads of an undef
lane and get undef flags instead.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+125-0llvm/test/CodeGen/X86/coalescer-subreg-implicit-def-phi-input.mir
+72-25llvm/lib/CodeGen/RegisterCoalescer.cpp
+74-0llvm/test/CodeGen/AMDGPU/coalescer-subreg-implicit-def-phi-input.mir
+10-10llvm/test/CodeGen/Thumb2/LowOverheadLoops/fast-fp-loops.ll
+281-354 files

LLVM/project 6f6cf1a — clang/lib/Sema SemaOverload.cpp, clang/test/SemaCXX overloaded-builtin-operators-arithmetic-pruning.cpp

[clang] Don't add built-in operator candidates that can't be viable (#227584)

If an operand of an operator has (or converts to) an arithmetic or
enumeration type, AddBuiltinOperatorCandidates() adds a built-in
candidate for every pair of promoted arithmetic types, and each
candidate tries to convert both operands. That's 121 candidates for `a
== b` on arm64 macOS.

If an operand can't convert to any of these types, none of these
candidates are viable (e.g. `e == E::kFoo` for a scoped enumeration E).
So conservatively track if each operand can convert to an arithmetic
type, and only add these candidates if all operands can convert.
Non-viable built-in candidates aren't used for anything and are safe to
not add.

For 60 random Chromium TUs (linux x64, -O2) picked with probability
proportional to their compile time, sum over all TUs:

    CPU time: 186.6 s => 183.3 s, -1.81%

    [8 lines not shown]
DeltaFile
+71-0clang/test/SemaCXX/overloaded-builtin-operators-arithmetic-pruning.cpp
+37-14clang/lib/Sema/SemaOverload.cpp
+108-142 files

LLVM/project 2c10250 — lldb/include/lldb/Core Debugger.h, lldb/include/lldb/Utility StringPool.h

[lldb] Add StringPool and per-debugger and system pool handles (NFC) (#228611)

Move the ConstString pool into a StringPool class and add a non-owning
StringPoolRef handle. This is in preparation for having one global and
multiple per-Debugger ConstString pool. Strings at the SB API layer will
be interned into the appropriate pool. As long as these remain
references, this operation is a NOOP.
DeltaFile
+252-0lldb/source/Utility/StringPool.cpp
+15-231lldb/source/Utility/ConstString.cpp
+86-0lldb/include/lldb/Utility/StringPool.h
+74-0lldb/unittests/Utility/StringPoolTest.cpp
+6-0lldb/include/lldb/Core/Debugger.h
+4-0lldb/source/Initialization/SystemInitializerCommon.cpp
+437-2312 files not shown
+439-2318 files

LLVM/project b488848 — llvm/lib/Target/SPIRV SPIRVInstructionSelector.cpp, llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector select.ll

[SPIRV] Splat scalar condition for vector OpSelect prior to SPIR-V 1.4 (#229267)

Before SPIR-V 1.4, the Condition operand of an OpSelect instruction with
a vector Result Type must be a vector of Booleans with the same number
of components as the result vector. LLVM IR allows a scalar i1 condition
when selecting between vectors, which causes spirv-val to reject the
module on SPIR-V 1.0 through 1.3 targets.

When targeting SPIR-V versions below 1.4, splat a scalar boolean
condition into a matching boolean vector via OpCompositeConstruct before
emitting OpSelect.
DeltaFile
+47-0llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_masked_gather_scatter/select.ll
+31-15llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+35-5llvm/test/CodeGen/SPIRV/instructions/select.ll
+36-0llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/select.ll
+149-204 files

LLVM/project 4f05619 — mlir/include/mlir/Dialect/AMDGPU/Utils Chipset.h

People keep updating clang-format
DeltaFile
+0-1mlir/include/mlir/Dialect/AMDGPU/Utils/Chipset.h
+0-11 files

LLVM/project 2e091b2 — llvm/lib/CodeGen/GlobalISel RegBankSelect.cpp

[NewPM] Properly initialize NewPM reg-bank-select (#229534)

The NewPM initialization of the pass didn't call computeOptMode as the
legacy one does. Missed in porting:
https://github.com/llvm/llvm-project/pull/217756
DeltaFile
+1-1llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
+1-11 files

LLVM/project 2186afb — clang/docs ReleaseNotes.md, clang/lib/Sema SemaDeclAttr.cpp

[clang] Fix handling of invalid nonnull attribute arguments (#229519)

The nonnull attribute accepts a variadic list of indexes to function
pointer parameters, specifying which ones are not allowed to take a null
value. If an index is invalid (e.g. the referenced function parameter is
not a pointer), then the index is dropped from the semantic attribute
retained in the AST.

Previously, if all the specified indicies were invalid, Clang would
associate a semantic nonnull attribute with no arguments on the
FunctionDecl, which would cause all pointer arguments to be treated as
nonnull. Now, if there are no valid indicies specified, the attribute is
dropped entirely and so no pointer arguments are treated as nonnull.

Fixes #228670
DeltaFile
+19-1clang/test/Sema/nonnull.c
+10-0clang/lib/Sema/SemaDeclAttr.cpp
+4-0clang/docs/ReleaseNotes.md
+33-13 files

LLVM/project f64d236 — mlir/lib/Dialect/GPU/Transforms PromoteShuffleToAMDGPU.cpp

More clang-format
DeltaFile
+0-1mlir/lib/Dialect/GPU/Transforms/PromoteShuffleToAMDGPU.cpp
+0-11 files

LLVM/project ad328b1 — mlir/include/mlir/Dialect/AMDGPU/Utils Chipset.h, mlir/lib/Conversion/ArithToAMDGPU ArithToAMDGPU.cpp

Use a new clang-format
DeltaFile
+0-2mlir/lib/Conversion/ArithToAMDGPU/ArithToAMDGPU.cpp
+0-1mlir/lib/Dialect/GPU/Transforms/PromoteShuffleToAMDGPU.cpp
+0-1mlir/include/mlir/Dialect/AMDGPU/Utils/Chipset.h
+0-43 files

LLVM/project 684e931 — mlir/docs ReleaseNotes.md, mlir/include/mlir/Dialect/GPU/Pipelines Passes.h

Review feedback
DeltaFile
+6-3mlir/docs/ReleaseNotes.md
+4-4mlir/include/mlir/Dialect/GPU/Pipelines/Passes.h
+10-72 files

LLVM/project ed3d5f5 — mlir/docs ReleaseNotes.md, mlir/include/mlir/Conversion Passes.td

Review feedback and typo fixes
DeltaFile
+22-7mlir/include/mlir/Conversion/Passes.td
+9-8mlir/docs/ReleaseNotes.md
+4-5mlir/unittests/Dialect/AMDGPU/AMDGPUUtilsTest.cpp
+6-1mlir/include/mlir/Dialect/AMDGPU/Transforms/Passes.td
+1-2mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
+1-2mlir/lib/Conversion/ArithToAMDGPU/ArithToAMDGPU.cpp
+43-251 files not shown
+44-277 files

LLVM/project 28c92ba — mlir/lib/Conversion/AMDGPUToROCDL AMDGPUToROCDL.cpp, mlir/lib/Conversion/GPUToROCDL LowerGpuOpsToROCDLOps.cpp

[mlir] Migrate AMDGPU/ROCDL to targets, not chipset versions

**migration tl;dr:** Replace usages of `amdgpu::Chipset` with `ROCDL::TargetInfo`, ideally move from `chipset=` to `arch=`. If you don't use upstream pipelines, call 'TargetInfo::migrateArchFeaturesToModuleFlags` at the appropriate location.

Further note: if you've got a build pipeline that's getting a `gfxXXX` name from something like `rocm_agent_enumerator`, using a full triple name like the ones you get from `rocminfo` is preferred.

`amdgpu::Chipset` was an awkward hack that was hard to keep up to date
with changes in the compiler/new architectures, and didn't properly
support generic targets (and has been strongly disfavored by the
compiler team).

This PR replaces `amdgpu::Chipset` with `ROCDL::TargetInfo`, a
structure that uses LLVM's TargetParser and the underlying LLVM
features tables to get the real nature of the target being compiled
for.

This also helps MLIR move to
new-style (`-mtriple=amdgpuX.YZ-amd-amdhsa`) over "old
style" (`-mtriple=amdgcn-amd-amdhsa -mcpu=gfxXYZ`) triples.

    [36 lines not shown]
DeltaFile
+316-323mlir/lib/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.cpp
+105-0mlir/test/Dialect/LLVMIR/rocdl-attach-target-arch.mlir
+87-4mlir/lib/Dialect/GPU/Transforms/ROCDLAttachTarget.cpp
+46-40mlir/lib/Dialect/AMDGPU/Transforms/EmulateAtomics.cpp
+49-24mlir/test/Dialect/AMDGPU/amdgpu-emulate-atomics.mlir
+30-30mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
+633-421103 files not shown
+1,179-718109 files

LLVM/project d6482bc — mlir/include/mlir/Dialect/AMDGPU/Utils Chipset.h

Fix build errors post-rebase
DeltaFile
+5-2mlir/include/mlir/Dialect/AMDGPU/Utils/Chipset.h
+5-21 files

LLVM/project f9cdffa — llvm/lib/Target/AMDGPU AMDGPUISelDAGToDAG.h AMDGPUISelDAGToDAG.cpp, llvm/test/CodeGen/AMDGPU gds-atomic.ll gds-load-store.ll

AMDGPU: Select region address space loads and stores (#229500)

Fix the annoying asymmetry where we handle local and region for some
atomics but not the full suite of operations. I run into this about once per
year and want to be done with it.

The ugly bits here are to deal with the fact that it appears m0 still requires
initialization in gfx9+. It was simpler to handle the true16 case by
preprocessing the selection to a 32-bit extload as the load truly is, and go
through the ordinary m0 gluing.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+4,568-0llvm/test/CodeGen/AMDGPU/gds-load-store.ll
+63-52llvm/lib/Target/AMDGPU/SIInstrInfo.td
+60-8llvm/lib/Target/AMDGPU/DSInstructions.td
+35-4llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
+10-6llvm/test/CodeGen/AMDGPU/gds-atomic.ll
+1-0llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.h
+4,737-706 files

LLVM/project bee4d69 — flang/test/Lower/OpenMP map-descriptor-deferral.f90 declare-mapper.f90, flang/test/Transforms omp-map-info-finalization.fir

Revert "[flang][mlir][OpenMP] Report Fortran names for privatized target maps…"

This reverts commit cf131447a0a2f0c16afe4aeb9deecafe2b747942.
DeltaFile
+0-82offload/test/offloading/fortran/target-firstprivate-info.f90
+7-23mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+0-28mlir/test/Target/LLVMIR/omptarget-map-names.mlir
+11-11flang/test/Transforms/omp-map-info-finalization.fir
+10-10flang/test/Lower/OpenMP/declare-mapper.f90
+9-9flang/test/Lower/OpenMP/map-descriptor-deferral.f90
+37-16329 files not shown
+113-25835 files

LLVM/project be54bc2 — flang-rt/unittests/Runtime Reduction.cpp Complex.cpp, flang/lib/Optimizer/Dialect FIRType.cpp

Build fixes
DeltaFile
+7-5flang-rt/unittests/Runtime/Complex.cpp
+2-1flang-rt/unittests/Runtime/Reduction.cpp
+1-0flang/lib/Optimizer/Dialect/FIRType.cpp
+10-63 files

LLVM/project 84f5758 — flang/lib/Semantics check-omp-atomic.cpp check-omp-structure.h, flang/test/Semantics/OpenMP declare-target02.f90 flush02.f90

[flang][OpenMP] Switch clause verification to descriptor-based

Delete all the scattered pieces of clause verification that are now
replaced by the unified handling.
DeltaFile
+57-273flang/lib/Semantics/check-omp-structure.cpp
+299-0flang/lib/Semantics/check-omp-syntax.cpp
+22-10flang/lib/Semantics/check-omp-structure.h
+0-31flang/lib/Semantics/check-omp-atomic.cpp
+8-8flang/test/Semantics/OpenMP/flush02.f90
+15-0flang/test/Semantics/OpenMP/declare-target02.f90
+401-32236 files not shown
+515-38342 files

LLVM/project 57f7dee — flang/lib/Semantics check-omp-syntax.cpp, flang/test/Semantics/OpenMP uses-allocators-version51.f90 uses-allocators-version50.f90

[flang][OpenMP] Improve diagnostics about modifier properties

Use OpenMPDeprecated and OpenMPFuture warning categories for modifier
diagnostics as well, analogously to how they are used for clauses.
DeltaFile
+66-30flang/lib/Semantics/check-omp-syntax.cpp
+4-4flang/test/Semantics/OpenMP/map-modifiers-v60.f90
+3-3flang/test/Semantics/OpenMP/uses-allocators-version50.f90
+3-3flang/test/Semantics/OpenMP/to-clause-v45.f90
+3-3flang/test/Semantics/OpenMP/from-clause-v45.f90
+2-2flang/test/Semantics/OpenMP/uses-allocators-version51.f90
+81-456 files not shown
+88-5212 files

LLVM/project c993fea — llvm/lib/Target/AMDGPU AMDGPULegalizerInfo.cpp, llvm/test/CodeGen/AMDGPU/GlobalISel regbankselect-amdgcn.s.buffer.load.ll atomicrmw-fmin-fmax.ll

AMDGPU/GlobalISel: Use integer types when narrowing loads and stores

The narrowScalar mutation for loads and stores produced untyped scalars.
For FP-typed values this resulted in an untyped G_OR in the lowerLoad
expansion for unaligned private accesses, which failed to select.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+441-448llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-private.mir
+268-270llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-flat.mir
+361-0llvm/test/CodeGen/AMDGPU/GlobalISel/load-store-private-unaligned-f64.ll
+16-16llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-amdgcn.s.buffer.load.ll
+16-16llvm/test/CodeGen/AMDGPU/GlobalISel/atomicrmw-fmin-fmax.ll
+3-3llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
+1,105-7536 files

LLVM/project e272733 — flang/include/flang/Semantics expression.h, flang/lib/Evaluate intrinsics.cpp

[flang][Semantics] Enforce F2023 C1545 only for generic references

F2023 C1545 requires the consequent-args of a conditional argument to
agree on corank and on the ALLOCATABLE and POINTER attributes, but only
in a reference to a generic procedure. Flang applied the constraint to
every reference containing a conditional argument and rejected conforming
code.

Move the cross-consequent checks out of CheckConditionalArg() and run
them from CheckAndResolveGenericReference(), before ResolveGeneric()
and only when the reference is generic. C1545 is a constraint, not one
of the generic resolution rules in F2023 15.5.5, so check it separately
from candidate matching.

When C1545 fails, return a GenericResolution with errorReported set
without calling ResolveGeneric(). The callers stop analyzing the
reference without additional generic-resolution diagnostics.
GetCalleeAndArguments() also returns before fallback intrinsic probing.
The parse-tree symbol stays generic, so a second analysis of the

    [24 lines not shown]
DeltaFile
+261-18flang/test/Semantics/conditional-arg.f90
+65-48flang/lib/Semantics/check-call.cpp
+34-5flang/lib/Semantics/expression.cpp
+16-0flang/lib/Evaluate/intrinsics.cpp
+14-0flang/include/flang/Semantics/expression.h
+8-0flang/lib/Semantics/check-call.h
+398-711 files not shown
+403-717 files

LLVM/project e484f5c — llvm/lib/Target/AMDGPU SILoadStoreOptimizer.cpp, llvm/test/CodeGen/AMDGPU load-store-opt-ds-gds-gfx7.mir load-store-opt-ds-gds-gfx9.mir

AMDGPU: Fix SILoadStoreOptimizer dropping gds bit on DS merges (#229520)

When forming read2/write2 from a pair of DS_READ/DS_WRITE
instructions, the gds operand was unconditionally set to 0, turning
GDS accesses into LDS accesses. Preserve the gds bit, refuse to pair
an LDS access with a GDS access, and select the M0-reading opcode
variant for GDS on targets that otherwise use the _gfx9 forms.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+171-0llvm/test/CodeGen/AMDGPU/load-store-opt-ds-gds-gfx9.mir
+170-0llvm/test/CodeGen/AMDGPU/load-store-opt-ds-gds-gfx7.mir
+25-17llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp
+366-173 files

LLVM/project 8ba9aaf — lldb/source/Plugins/Process/gdb-remote GDBRemoteCommunicationServerLLGS.cpp

fix: use `sendErrorResponse`
DeltaFile
+3-2lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+3-21 files

LLVM/project 1216d8a — lldb/test/API/tools/lldb-server TestGdbRemote_jThreadExtendedInfo.py

fix: remove leftover print
DeltaFile
+0-1lldb/test/API/tools/lldb-server/TestGdbRemote_jThreadExtendedInfo.py
+0-11 files

LLVM/project b4b5c58 — llvm/lib/CodeGen/GlobalISel LegalizerHelper.cpp, llvm/test/CodeGen/AMDGPU/GlobalISel legalize-load-constant.mir legalize-load-flat.mir

GlobalISel: Use integer types when splitting loads in lowerLoad

lowerLoad built the split pieces using the destination type with the
element size changed, which preserved floating-point types. An
unaligned f64 load was decomposed into G_ZEXTLOAD, G_SHL and G_OR on
f32 and f64, which then crashed in AMDGPU RegBankLegalize. Build the
pieces as integers and bitcast to a non-integer result type, as
lowerStore already does.

The pieces are now consistently integer typed, which allows more
constants to be CSEd in the existing tests.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+3,156-2,598llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-local.mir
+2,662-2,708llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-private.mir
+2,490-2,634llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-global.mir
+1,880-1,952llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-flat.mir
+1,812-1,908llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-load-constant.mir
+13-12llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+12,013-11,8126 files

LLVM/project 65aa5f2 — mlir/include/mlir/Dialect/AMDGPU/Utils Chipset.h, mlir/lib/Conversion/ArithToAMDGPU ArithToAMDGPU.cpp

Use a new clang-format
DeltaFile
+0-2mlir/lib/Conversion/ArithToAMDGPU/ArithToAMDGPU.cpp
+0-1mlir/lib/Dialect/GPU/Transforms/PromoteShuffleToAMDGPU.cpp
+0-1mlir/include/mlir/Dialect/AMDGPU/Utils/Chipset.h
+0-43 files

LLVM/project 678102a — libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array sized_delete_array.pass.cpp, libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single sized_delete.pass.cpp

[libc++] Pass -fsized-deallocation to the sized_delete tests on AppleClang 23 (#229257)

AppleClang 23 still defaults to -fno-sized-deallocation, so explicitly
pass -fsized-deallocation in the tests that require it.
DeltaFile
+2-0libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete.pass.cpp
+2-0libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array.pass.cpp
+4-02 files

LLVM/project 8eebb58 — llvm/lib/Target/AMDGPU SIISelLowering.cpp, llvm/test/CodeGen/AMDGPU idot4s.ll idot4-test.ll

[AMDGPU] Extract byte lanes of a split vector from the 32-bit source

After a <4 x i8> is split into i16 halves, a byte lane is extended
from an i16 shift of a truncate. Rewrite it on the 32-bit source as an
and of srl or a sign_extend_inreg of srl, which select to a single bit
field extract.

Uniform zero and any extends are left alone, their i16 shift is already
promoted to i32.
DeltaFile
+154-227llvm/test/CodeGen/AMDGPU/v4i8-byte-lane-ext.ll
+108-134llvm/test/CodeGen/AMDGPU/idot4u.ll
+79-87llvm/test/CodeGen/AMDGPU/min.ll
+47-62llvm/test/CodeGen/AMDGPU/idot4-test.ll
+33-48llvm/test/CodeGen/AMDGPU/idot4s.ll
+64-0llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+485-5584 files not shown
+515-59210 files

LLVM/project 291d060 — llvm/test/CodeGen/AMDGPU v4i8-byte-lane-ext.ll

[AMDGPU] Precommit test for byte lane extension after vector split
DeltaFile
+747-0llvm/test/CodeGen/AMDGPU/v4i8-byte-lane-ext.ll
+747-01 files

LLVM/project eea742a — llvm/lib/Target/AMDGPU AMDGPUTargetTransformInfo.cpp, llvm/test/Analysis/CostModel/AMDGPU narrow-int-to-bfloat.ll narrow-int-to-fp.ll

[AMDGPU] Do not price the extension of a loaded i40, i48 or i56 in int to fp casts

A widened constant or invariant load still pays it.
DeltaFile
+100-100llvm/test/Analysis/CostModel/AMDGPU/narrow-int-to-fp.ll
+24-24llvm/test/Analysis/CostModel/AMDGPU/narrow-int-to-bfloat.ll
+18-6llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp
+142-1303 files

LLVM/project 8a3aea0 — llvm/lib/Target/AMDGPU AMDGPUTargetTransformInfo.cpp, llvm/test/Analysis/CostModel/AMDGPU narrow-int-to-bfloat.ll narrow-int-to-fp.ll

few fixes
DeltaFile
+90-90llvm/test/Analysis/CostModel/AMDGPU/narrow-int-to-fp.ll
+24-24llvm/test/Analysis/CostModel/AMDGPU/narrow-int-to-bfloat.ll
+10-1llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp
+124-1153 files