[llvm-branch-commits] [clang] [flang] [lld] [llvm] [Flang] LLVM_ENABLE_RUNTIMES=flang-rt (PR #110217)

Michael Kruse via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Nov 11 06:57:20 PST 2024


https://github.com/Meinersbur updated https://github.com/llvm/llvm-project/pull/110217

>From f89c561fe1d11ead1172e576479ceff5b84fb8f7 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 27 Sep 2024 09:18:49 +0200
Subject: [PATCH 01/32] [Flang] LLVM_ENABLE_RUNTIMES=FortranRuntime

Extract Flang's runtime library to use the LLVM_ENABLE_RUNTIME
mechanism.
---
 FortranRuntime/.clang-format                  |  21 +
 FortranRuntime/CMakeLists.txt                 | 184 ++++++++
 FortranRuntime/CODE_OWNERS.TXT                |  14 +
 FortranRuntime/LICENSE.TXT                    | 234 +++++++++++
 FortranRuntime/README.md                      |  20 +
 .../cmake/config.h.cmake.in                   |   0
 .../cmake/modules/AddFortranRuntime.cmake     | 109 +++++
 .../include/flang/Common/Fortran-consts.h     |  50 +++
 .../flang/Common}/ISO_Fortran_binding.h       |   5 +-
 .../Common}/ISO_Fortran_binding_wrapper.h     |   7 +-
 .../include/flang/Common/api-attrs.h          |   5 +-
 .../flang/Common}/binary-floating-point.h     |   2 +-
 .../flang/Common/bit-population-count.h       |   0
 .../include/flang/Common/constexpr-bitset.h   |   0
 .../include/flang/Common}/decimal.h           |   5 +-
 .../include/flang/Common/enum-class.h         |   0
 .../include/flang/Common/enum-set.h           |   0
 .../include/flang/Common/fast-int-set.h       |   2 +-
 .../include/flang/Common/float128.h           |   2 +-
 .../include/flang/Common/format.h             |   2 +-
 .../include/flang/Common/idioms.h             |   0
 .../flang/Common/leading-zero-bit-count.h     |   0
 .../include/flang/Common/optional.h           |   0
 .../include/flang/Common/real.h               |   0
 .../include/flang/Common/reference-wrapper.h  |   0
 .../include/flang/Common/restorer.h           |   0
 .../include/flang/Common/target-rounding.h    |  40 ++
 .../include/flang/Common/uint128.h            |   0
 .../include/flang/Common/variant.h            |   0
 .../include/flang/Common/visit.h              |   0
 .../include/flang/Common/windows-include.h    |   0
 .../include/flang/Runtime/CUDA/allocator.h    |   0
 .../include/flang/Runtime/CUDA/descriptor.h   |   0
 .../include/flang/Runtime/allocatable.h       |   0
 .../flang/Runtime/allocator-registry.h        |   2 +-
 .../include/flang/Runtime/array-constructor.h |   0
 .../include/flang/Runtime/assign.h            |   0
 .../include/flang/Runtime/c-or-cpp.h          |   0
 .../include/flang/Runtime/character.h         |   0
 .../include/flang/Runtime/command.h           |   0
 .../include/flang/Runtime/cpp-type.h          |   2 +-
 .../include/flang/Runtime/derived-api.h       |   0
 .../include/flang/Runtime/descriptor.h        |   2 +-
 .../include/flang/Runtime/entry-names.h       |   5 +-
 .../include/flang/Runtime/exceptions.h        |   2 +-
 .../include/flang/Runtime/execute.h           |   2 +-
 .../include/flang/Runtime/extensions.h        |   0
 .../flang/Runtime/freestanding-tools.h        |   0
 .../include/flang/Runtime/inquiry.h           |   2 +-
 .../include/flang/Runtime/io-api.h            |   0
 .../include/flang/Runtime/iostat.h            |   0
 .../include/flang/Runtime/magic-numbers.h     |   6 +-
 .../include/flang/Runtime/main.h              |   0
 .../flang/Runtime/matmul-instances.inc        |   0
 .../include/flang/Runtime/matmul-transpose.h  |   0
 .../include/flang/Runtime/matmul.h            |   0
 .../include/flang/Runtime/memory.h            |   0
 .../include/flang/Runtime/misc-intrinsic.h    |   0
 .../include/flang/Runtime/numeric.h           |   0
 .../include/flang/Runtime/pointer.h           |   0
 .../include/flang/Runtime/ragged.h            |   2 +-
 .../include/flang/Runtime/random.h            |   0
 .../include/flang/Runtime/reduce.h            |   0
 .../include/flang/Runtime/reduction.h         |   0
 .../include/flang/Runtime/stop.h              |   0
 .../include/flang/Runtime/support.h           |   2 +-
 .../include/flang/Runtime/temporary-stack.h   |   0
 .../include/flang/Runtime/time-intrinsic.h    |   0
 .../include/flang/Runtime/transformational.h  |   0
 .../include/flang/Runtime/type-code.h         |   4 +-
 .../include/flang/Testing}/fp-testing.h       |  14 +-
 .../include/flang/Testing}/testing.h          |   8 +
 FortranRuntime/lib/CMakeLists.txt             |  12 +
 .../lib/Common}/big-radix-floating-point.h    |   6 +-
 .../lib/Common}/binary-to-decimal.cpp         |   4 +-
 .../lib/Common}/decimal-to-binary.cpp         |   6 +-
 FortranRuntime/lib/Runtime/CMakeLists.txt     | 242 +++++++++++
 .../lib/Runtime}/CUDA/CMakeLists.txt          |   2 +-
 .../lib/Runtime}/CUDA/allocator.cpp           |   4 +-
 .../lib/Runtime}/CUDA/descriptor.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/CMakeLists.txt  |   2 +-
 .../lib/Runtime}/Float128Math/acos.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/acosh.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/asin.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/asinh.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/atan.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/atan2.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/atanh.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/ceil.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/complex-math.c  |   5 +-
 .../lib/Runtime}/Float128Math/complex-math.h  |   2 +-
 .../lib/Runtime}/Float128Math/cos.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/cosh.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/erf.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/erfc.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/exp.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/exponent.cpp    |   2 +-
 .../lib/Runtime}/Float128Math/floor.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/fma.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/fraction.cpp    |   2 +-
 .../lib/Runtime}/Float128Math/hypot.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/j0.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/j1.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/jn.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/lgamma.cpp      |   2 +-
 .../lib/Runtime}/Float128Math/llround.cpp     |   2 +-
 .../lib/Runtime}/Float128Math/log.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/log10.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/lround.cpp      |   2 +-
 .../lib/Runtime}/Float128Math/math-entries.h  |   2 +-
 .../lib/Runtime}/Float128Math/mod-real.cpp    |   2 +-
 .../lib/Runtime}/Float128Math/modulo-real.cpp |   2 +-
 .../lib/Runtime}/Float128Math/nearest.cpp     |   2 +-
 .../lib/Runtime}/Float128Math/norm2.cpp       |   2 +-
 .../Float128Math/numeric-template-specs.h     |   2 +-
 .../lib/Runtime}/Float128Math/pow.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/random.cpp      |   2 +-
 .../lib/Runtime}/Float128Math/round.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/rrspacing.cpp   |   2 +-
 .../lib/Runtime}/Float128Math/scale.cpp       |   2 +-
 .../Runtime}/Float128Math/set-exponent.cpp    |   2 +-
 .../lib/Runtime}/Float128Math/sin.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/sinh.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/spacing.cpp     |   2 +-
 .../lib/Runtime}/Float128Math/sqrt.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/tan.cpp         |   2 +-
 .../lib/Runtime}/Float128Math/tanh.cpp        |   2 +-
 .../lib/Runtime}/Float128Math/tgamma.cpp      |   2 +-
 .../lib/Runtime}/Float128Math/trunc.cpp       |   2 +-
 .../lib/Runtime}/Float128Math/y0.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/y1.cpp          |   2 +-
 .../lib/Runtime}/Float128Math/yn.cpp          |   2 +-
 .../lib/Runtime}/ISO_Fortran_binding.cpp      |   4 +-
 .../lib/Runtime}/ISO_Fortran_util.h           |   4 +-
 .../lib/Runtime}/allocatable.cpp              |   4 +-
 .../lib/Runtime}/allocator-registry.cpp       |   2 +-
 .../lib/Runtime}/array-constructor.cpp        |   2 +-
 .../lib/Runtime}/assign-impl.h                |   2 +-
 .../lib/Runtime}/assign.cpp                   |   2 +-
 .../lib/Runtime}/buffer.cpp                   |   2 +-
 .../lib/Runtime}/buffer.h                     |   2 +-
 .../lib/Runtime}/character.cpp                |   2 +-
 .../lib/Runtime}/command.cpp                  |   2 +-
 .../lib/Runtime}/complex-powi.cpp             |  15 +-
 .../lib/Runtime}/complex-reduction.c          |   5 +-
 .../lib/Runtime}/complex-reduction.h          |   5 +-
 .../lib/Runtime}/connection.cpp               |   2 +-
 .../lib/Runtime}/connection.h                 |   2 +-
 .../lib/Runtime}/copy.cpp                     |   2 +-
 .../lib/Runtime}/copy.h                       |   2 +-
 .../lib/Runtime}/derived-api.cpp              |   3 +-
 .../lib/Runtime}/derived.cpp                  |   2 +-
 .../lib/Runtime}/derived.h                    |   2 +-
 .../lib/Runtime}/descriptor-io.cpp            |   2 +-
 .../lib/Runtime}/descriptor-io.h              |   2 +-
 .../lib/Runtime}/descriptor.cpp               |   2 +-
 .../lib/Runtime}/dot-product.cpp              |   2 +-
 .../lib/Runtime}/edit-input.cpp               |   2 +-
 .../lib/Runtime}/edit-input.h                 |   4 +-
 .../lib/Runtime}/edit-output.cpp              |   2 +-
 .../lib/Runtime}/edit-output.h                |   4 +-
 .../lib/Runtime}/emit-encoded.h               |   2 +-
 .../lib/Runtime}/environment-default-list.h   |   5 +-
 .../lib/Runtime}/environment.cpp              |   2 +-
 .../lib/Runtime}/environment.h                |   4 +-
 .../lib/Runtime}/exceptions.cpp               |   2 +-
 .../lib/Runtime}/execute.cpp                  |   2 +-
 .../lib/Runtime}/extensions.cpp               |   2 +-
 .../lib/Runtime}/external-unit.cpp            |   2 +-
 .../lib/Runtime}/extrema.cpp                  |   2 +-
 .../lib/Runtime}/file.cpp                     |   2 +-
 .../lib/Runtime}/file.h                       |   2 +-
 .../lib/Runtime}/findloc.cpp                  |   2 +-
 .../lib/Runtime}/format-implementation.h      |   4 +-
 .../lib/Runtime}/format.cpp                   |   2 +-
 .../lib/Runtime}/format.h                     |   6 +-
 .../lib/Runtime}/inquiry.cpp                  |   2 +-
 .../lib/Runtime}/internal-unit.cpp            |   2 +-
 .../lib/Runtime}/internal-unit.h              |   2 +-
 .../lib/Runtime}/io-api-common.h              |   2 +-
 .../lib/Runtime}/io-api-minimal.cpp           |   2 +-
 .../lib/Runtime}/io-api.cpp                   |   2 +-
 .../lib/Runtime}/io-error.cpp                 |   2 +-
 .../lib/Runtime}/io-error.h                   |   2 +-
 .../lib/Runtime}/io-stmt.cpp                  |   2 +-
 .../lib/Runtime}/io-stmt.h                    |   2 +-
 .../lib/Runtime}/iostat.cpp                   |   2 +-
 .../lib/Runtime}/iso_fortran_env_impl.f90     |   2 +-
 .../lib/Runtime}/lock.h                       |   2 +-
 .../lib/Runtime}/main.cpp                     |   2 +-
 .../lib/Runtime}/matmul-transpose.cpp         |   2 +-
 .../lib/Runtime}/matmul.cpp                   |   2 +-
 .../lib/Runtime}/memory.cpp                   |   2 +-
 .../lib/Runtime}/misc-intrinsic.cpp           |   2 +-
 .../lib/Runtime}/namelist.cpp                 |   2 +-
 .../lib/Runtime}/namelist.h                   |   2 +-
 .../lib/Runtime}/non-tbp-dio.cpp              |   2 +-
 .../lib/Runtime}/non-tbp-dio.h                |   5 +-
 .../lib/Runtime}/numeric-templates.h          |   2 +-
 .../lib/Runtime}/numeric.cpp                  |   2 +-
 .../lib/Runtime}/pointer.cpp                  |   2 +-
 .../lib/Runtime}/product.cpp                  |   2 +-
 .../lib/Runtime}/pseudo-unit.cpp              |   2 +-
 .../lib/Runtime}/ragged.cpp                   |   2 +-
 .../lib/Runtime}/random-templates.h           |   2 +-
 .../lib/Runtime}/random.cpp                   |   2 +-
 .../lib/Runtime}/reduce.cpp                   |   2 +-
 .../lib/Runtime}/reduction-templates.h        |   2 +-
 .../lib/Runtime}/reduction.cpp                |   2 +-
 .../lib/Runtime}/stack.h                      |   2 +-
 .../lib/Runtime}/stat.cpp                     |   2 +-
 .../lib/Runtime}/stat.h                       |   4 +-
 .../lib/Runtime}/stop.cpp                     |   2 +-
 .../lib/Runtime}/sum.cpp                      |   2 +-
 .../lib/Runtime}/support.cpp                  |   2 +-
 .../lib/Runtime}/temporary-stack.cpp          |   4 +-
 .../lib/Runtime}/terminator.cpp               |   2 +-
 .../lib/Runtime}/terminator.h                 |   2 +-
 .../lib/Runtime}/time-intrinsic.cpp           |   2 +-
 .../lib/Runtime}/tools.cpp                    |   2 +-
 .../lib/Runtime}/tools.h                      |   2 +-
 .../lib/Runtime}/transformational.cpp         |   2 +-
 .../lib/Runtime}/type-code.cpp                |   3 +-
 .../lib/Runtime}/type-info.cpp                |   2 +-
 .../lib/Runtime}/type-info.h                  |   4 +-
 .../lib/Runtime}/unit-map.cpp                 |   2 +-
 .../lib/Runtime}/unit-map.h                   |   2 +-
 .../lib/Runtime}/unit.cpp                     |   2 +-
 .../lib/Runtime}/unit.h                       |   2 +-
 .../lib/Runtime}/utf.cpp                      |   2 +-
 .../lib/Runtime}/utf.h                        |   2 +-
 FortranRuntime/lib/Testing/CMakeLists.txt     |  19 +
 .../lib/Testing}/fp-testing.cpp               |  12 +-
 .../lib/Testing}/testing.cpp                  |  10 +-
 .../module/.clang-format                      |   0
 FortranRuntime/module/CMakeLists.txt          |  63 +++
 .../module/__cuda_builtins.f90                |   0
 .../module/__fortran_builtins.f90             |   0
 .../module/__fortran_ieee_exceptions.f90      |   0
 .../module/__fortran_type_info.f90            |   0
 .../module/__ppc_intrinsics.f90               |   0
 .../module/__ppc_types.f90                    |   0
 .../module/cudadevice.f90                     |   2 +-
 .../module/ieee_arithmetic.f90                |   0
 .../module/ieee_exceptions.f90                |   0
 .../module/ieee_features.f90                  |   0
 .../module/iso_c_binding.f90                  |   0
 .../module/iso_fortran_env.f90                |   0
 {flang => FortranRuntime}/module/mma.f90      |  43 +-
 FortranRuntime/test/CMakeLists.txt            |  70 ++++
 FortranRuntime/test/NonGtestUnit/lit.cfg.py   |  21 +
 .../test/NonGtestUnit/lit.site.cfg.py.in      |  13 +
 .../test/Runtime/no-cpp-dep.c                 |  12 +-
 FortranRuntime/test/Unit/lit.cfg.py           |  21 +
 FortranRuntime/test/Unit/lit.site.cfg.py.in   |  14 +
 FortranRuntime/test/lit.cfg.py                |  78 ++++
 FortranRuntime/test/lit.site.cfg.py.in        |  17 +
 FortranRuntime/unittests/CMakeLists.txt       |  62 +++
 .../unittests/Common/CMakeLists.txt           |  13 +
 .../unittests/Common/FastIntSetTest.cpp       |   2 +-
 .../unittests/Decimal/CMakeLists.txt          |  20 +
 .../unittests/Decimal/quick-sanity-test.cpp   |  10 +-
 .../unittests/Decimal/thorough-test.cpp       |  10 +-
 .../unittests/Evaluate/CMakeLists.txt         |  19 +
 .../Evaluate/ISO-Fortran-binding.cpp          |  12 +-
 .../unittests/Evaluate/reshape.cpp            |  10 +-
 .../unittests/Runtime/AccessTest.cpp          |   2 +-
 .../unittests/Runtime/Allocatable.cpp         |   2 +-
 .../unittests/Runtime/ArrayConstructor.cpp    |   2 +-
 .../unittests/Runtime/BufferTest.cpp          |   4 +-
 .../unittests/Runtime/CMakeLists.txt          |  19 +-
 .../unittests/Runtime/CUDA/AllocatorCUF.cpp   |   4 +-
 .../unittests/Runtime/CharacterTest.cpp       |   2 +-
 .../unittests/Runtime/CommandTest.cpp         |   2 +-
 .../unittests/Runtime/Complex.cpp             |   4 +-
 .../unittests/Runtime/CrashHandlerFixture.cpp |   4 +-
 .../unittests/Runtime/CrashHandlerFixture.h   |   2 +-
 .../unittests/Runtime/Derived.cpp             |   2 +-
 .../unittests/Runtime/ExternalIOTest.cpp      |   2 +-
 .../unittests/Runtime/Format.cpp              |   8 +-
 .../unittests/Runtime/Inquiry.cpp             |   2 +-
 .../unittests/Runtime/ListInputTest.cpp       |   4 +-
 .../unittests/Runtime/LogicalFormatTest.cpp   |   2 +-
 .../unittests/Runtime/Matmul.cpp              |   2 +-
 .../unittests/Runtime/MatmulTranspose.cpp     |   2 +-
 .../unittests/Runtime/MiscIntrinsic.cpp       |   2 +-
 .../unittests/Runtime/Namelist.cpp            |   4 +-
 .../unittests/Runtime/Numeric.cpp             |   2 +-
 .../unittests/Runtime/NumericalFormatTest.cpp |   2 +-
 .../unittests/Runtime/Pointer.cpp             |   2 +-
 .../unittests/Runtime/Ragged.cpp              |   2 +-
 .../unittests/Runtime/Random.cpp              |   2 +-
 .../unittests/Runtime/Reduction.cpp           |   2 +-
 .../unittests/Runtime/RuntimeCrashTest.cpp    |   4 +-
 .../unittests/Runtime/Stop.cpp                |   4 +-
 .../unittests/Runtime/Support.cpp             |   2 +-
 .../unittests/Runtime/TemporaryStack.cpp      |   4 +-
 .../unittests/Runtime/Time.cpp                |   2 +-
 .../unittests/Runtime/Transformational.cpp    |   2 +-
 .../unittests/Runtime/tools.h                 |   2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp    |   3 +-
 clang/lib/Driver/ToolChains/Flang.cpp         |   4 -
 flang/CMakeLists.txt                          |  45 +-
 flang/docs/FlangDriver.md                     |   5 +-
 flang/include/flang/Evaluate/call.h           |   6 +-
 .../include/flang/Evaluate/characteristics.h  |   6 +-
 flang/include/flang/Evaluate/common.h         |  18 +-
 flang/include/flang/Evaluate/constant.h       |   4 +-
 flang/include/flang/Evaluate/expression.h     |   6 +-
 flang/include/flang/Evaluate/formatting.h     |   2 +-
 flang/include/flang/Evaluate/intrinsics.h     |   2 +-
 flang/include/flang/Evaluate/shape.h          |   2 +-
 flang/include/flang/Evaluate/target.h         |  17 +-
 flang/include/flang/Evaluate/tools.h          |   4 +-
 flang/include/flang/Evaluate/traverse.h       |   2 +-
 flang/include/flang/Evaluate/type.h           |   6 +-
 flang/include/flang/Evaluate/variable.h       |   4 +-
 .../include/flang/Frontend/FrontendOptions.h  |   2 +-
 flang/include/flang/Lower/AbstractConverter.h |   2 +-
 flang/include/flang/Lower/Bridge.h            |   2 +-
 flang/include/flang/Lower/CallInterface.h     |   2 +-
 flang/include/flang/Lower/ConvertType.h       |   2 +-
 flang/include/flang/Lower/LoweringOptions.h   |   2 +-
 flang/include/flang/Lower/PFTBuilder.h        |   4 +-
 flang/include/flang/Lower/Support/Utils.h     |   2 +-
 flang/include/flang/Lower/SymbolMap.h         |   2 +-
 .../flang/Optimizer/Builder/FIRBuilder.h      |   2 +-
 .../flang/Optimizer/Builder/IntrinsicCall.h   |   1 +
 .../Optimizer/Builder/PPCIntrinsicCall.h      |   2 +-
 .../Optimizer/Builder/Runtime/RTBuilder.h     |   2 +-
 .../flang/Optimizer/CodeGen/DescriptorModel.h |   2 +-
 .../Dialect/CUF/Attributes/CUFAttr.h          |   2 +-
 .../flang/Optimizer/Support/TypeCode.h        |   2 +-
 flang/include/flang/Optimizer/Support/Utils.h |   2 +-
 flang/include/flang/Parser/char-block.h       |   2 +-
 flang/include/flang/Parser/dump-parse-tree.h  |   4 +-
 flang/include/flang/Parser/message.h          |   2 +-
 flang/include/flang/Parser/parse-state.h      |   2 +-
 flang/include/flang/Parser/parse-tree.h       |   4 +-
 flang/include/flang/Parser/parsing.h          |   2 +-
 flang/include/flang/Parser/provenance.h       |   2 +-
 flang/include/flang/Parser/source.h           |   2 +-
 flang/include/flang/Parser/user-state.h       |   2 +-
 flang/include/flang/Semantics/expression.h    |   4 +-
 .../flang/Semantics/runtime-type-info.h       |   2 +-
 flang/include/flang/Semantics/scope.h         |   4 +-
 flang/include/flang/Semantics/semantics.h     |   2 +-
 flang/include/flang/Semantics/symbol.h        |   4 +-
 flang/include/flang/Semantics/tools.h         |   2 +-
 flang/include/flang/Semantics/type.h          |   2 +-
 .../{Common => Support}/Fortran-features.h    |   4 +-
 .../flang/{Common => Support}/Fortran.h       |  38 +-
 .../{Common => Support}/MathOptionsBase.def   |   0
 .../{Common => Support}/MathOptionsBase.h     |   8 +-
 .../{Common => Support}/OpenMP-features.h     |   2 +-
 .../flang/{Common => Support}/Version.h       |   2 +-
 .../flang/{Common => Support}/default-kinds.h |   4 +-
 .../flang/{Common => Support}/indirection.h   |   4 +-
 .../flang/{Common => Support}/interval.h      |   4 +-
 .../{Common => Support}/reference-counted.h   |   2 +-
 .../flang/{Common => Support}/reference.h     |   2 +-
 .../static-multimap-view.h                    |   2 +-
 .../flang/{Common => Support}/template.h      |   4 +-
 .../flang/{Common => Support}/unwrap.h        |   6 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   2 +-
 flang/lib/CMakeLists.txt                      |   5 +-
 flang/lib/Common/CMakeLists.txt               |  60 +--
 flang/lib/Decimal/CMakeLists.txt              |  86 ----
 flang/lib/Evaluate/CMakeLists.txt             |   3 +-
 flang/lib/Evaluate/call.cpp                   |   2 +-
 flang/lib/Evaluate/characteristics.cpp        |   2 +-
 flang/lib/Evaluate/common.cpp                 |   4 +
 flang/lib/Evaluate/fold-implementation.h      |   6 +-
 flang/lib/Evaluate/formatting.cpp             |   2 +-
 flang/lib/Evaluate/intrinsics-library.cpp     |   2 +-
 flang/lib/Evaluate/intrinsics.cpp             |   2 +-
 flang/lib/Evaluate/real.cpp                   |   2 +-
 flang/lib/Evaluate/shape.cpp                  |   2 +-
 flang/lib/Evaluate/target.cpp                 |   2 +-
 flang/lib/Frontend/CMakeLists.txt             |   2 +-
 flang/lib/Frontend/CompilerInstance.cpp       |   2 +-
 flang/lib/Frontend/CompilerInvocation.cpp     |   6 +-
 flang/lib/Frontend/FrontendActions.cpp        |   2 +-
 flang/lib/Lower/Bridge.cpp                    |   2 +-
 flang/lib/Lower/CMakeLists.txt                |   2 +-
 flang/lib/Lower/CallInterface.cpp             |   2 +-
 flang/lib/Lower/ConvertExpr.cpp               |   4 +-
 flang/lib/Lower/Mangler.cpp                   |   2 +-
 flang/lib/Optimizer/Builder/IntrinsicCall.cpp |  21 +-
 flang/lib/Optimizer/CodeGen/TypeConverter.cpp |   2 +-
 flang/lib/Optimizer/Dialect/FIRType.cpp       |   2 +-
 .../lib/Optimizer/Transforms/AddDebugInfo.cpp |   2 +-
 .../Transforms/AssumedRankOpConversion.cpp    |   2 +-
 flang/lib/Optimizer/Transforms/CMakeLists.txt |   1 +
 .../Optimizer/Transforms/CufOpConversion.cpp  |   2 +-
 .../Transforms/ExternalNameConversion.cpp     |   2 +-
 .../Optimizer/Transforms/LoopVersioning.cpp   |   2 +-
 .../Transforms/SimplifyIntrinsics.cpp         |   2 +-
 .../lib/Optimizer/Transforms/StackReclaim.cpp |   2 +-
 flang/lib/Optimizer/Transforms/VScaleAttr.cpp |   2 +-
 flang/lib/Parser/CMakeLists.txt               |   2 +-
 flang/lib/Parser/basic-parsers.h              |   4 +-
 flang/lib/Parser/parse-tree.cpp               |   2 +-
 flang/lib/Parser/prescan.h                    |   2 +-
 flang/lib/Parser/unparse.cpp                  |   4 +-
 flang/lib/Semantics/CMakeLists.txt            |   2 +-
 flang/lib/Semantics/assignment.h              |   2 +-
 flang/lib/Semantics/check-case.cpp            |   4 +-
 flang/lib/Semantics/check-coarray.cpp         |   2 +-
 flang/lib/Semantics/check-cuda.cpp            |   2 +-
 flang/lib/Semantics/check-data.h              |   2 +-
 flang/lib/Semantics/check-do-forall.cpp       |   2 +-
 flang/lib/Semantics/check-return.cpp          |   2 +-
 flang/lib/Semantics/check-select-rank.cpp     |   2 +-
 flang/lib/Semantics/check-select-type.cpp     |   2 +-
 flang/lib/Semantics/check-stop.cpp            |   2 +-
 flang/lib/Semantics/data-to-inits.h           |   4 +-
 flang/lib/Semantics/expression.cpp            |   2 +-
 flang/lib/Semantics/pointer-assignment.cpp    |   2 +-
 flang/lib/Semantics/resolve-labels.cpp        |   2 +-
 flang/lib/Semantics/resolve-names-utils.cpp   |   6 +-
 flang/lib/Semantics/resolve-names.cpp         |   6 +-
 flang/lib/Semantics/rewrite-parse-tree.cpp    |   2 +-
 flang/lib/Semantics/semantics.cpp             |   2 +-
 flang/lib/Semantics/tools.cpp                 |   4 +-
 flang/lib/Support/CMakeLists.txt              |  56 +++
 .../{Common => Support}/Fortran-features.cpp  |   6 +-
 flang/lib/{Common => Support}/Fortran.cpp     |   6 +-
 flang/lib/{Common => Support}/Version.cpp     |   4 +-
 flang/lib/Support/big-radix-floating-point.h  | 396 ++++++++++++++++++
 .../lib/{Common => Support}/default-kinds.cpp |   4 +-
 flang/lib/{Common => Support}/idioms.cpp      |   2 +-
 flang/runtime/CMakeLists.txt                  | 314 --------------
 flang/test/CMakeLists.txt                     |   4 +-
 flang/test/Driver/linker-flags.f90            |   6 +-
 .../test/Driver/msvc-dependent-lib-flags.f90  |   4 -
 flang/test/lib/CMakeLists.txt                 |   1 +
 flang/test/lit.cfg.py                         |  23 -
 flang/test/lit.site.cfg.py.in                 |   1 -
 flang/tools/CMakeLists.txt                    |   1 -
 flang/tools/bbc/CMakeLists.txt                |   1 +
 flang/tools/bbc/bbc.cpp                       |   8 +-
 flang/tools/f18-parse-demo/CMakeLists.txt     |   2 +
 flang/tools/f18-parse-demo/f18-parse-demo.cpp |   4 +-
 flang/tools/f18/CMakeLists.txt                | 173 --------
 flang/tools/f18/dump.cpp                      |  42 --
 flang/tools/fir-opt/CMakeLists.txt            |   2 +
 flang/tools/flang-driver/CMakeLists.txt       |   3 +
 flang/tools/tco/CMakeLists.txt                |   2 +
 flang/unittests/CMakeLists.txt                |  37 --
 flang/unittests/Common/CMakeLists.txt         |   3 -
 flang/unittests/Decimal/CMakeLists.txt        |  10 -
 flang/unittests/Evaluate/CMakeLists.txt       |  24 +-
 .../Evaluate/bit-population-count.cpp         |   2 +-
 flang/unittests/Evaluate/expression.cpp       |   2 +-
 flang/unittests/Evaluate/folding.cpp          |   2 +-
 flang/unittests/Evaluate/integer.cpp          |   2 +-
 flang/unittests/Evaluate/intrinsics.cpp       |   2 +-
 .../Evaluate/leading-zero-bit-count.cpp       |   2 +-
 flang/unittests/Evaluate/logical.cpp          |   2 +-
 flang/unittests/Evaluate/real.cpp             |   4 +-
 flang/unittests/Evaluate/uint128.cpp          |   2 +-
 flang/unittests/Runtime/CUDA/CMakeLists.txt   |  15 -
 lld/COFF/MinGW.cpp                            |   6 +-
 llvm/CMakeLists.txt                           |   2 +-
 .../modules/LLVMExternalProjectUtils.cmake    |  16 +-
 llvm/projects/CMakeLists.txt                  |   5 +-
 llvm/runtimes/CMakeLists.txt                  |  32 +-
 runtimes/CMakeLists.txt                       |   3 +-
 469 files changed, 2512 insertions(+), 1388 deletions(-)
 create mode 100644 FortranRuntime/.clang-format
 create mode 100644 FortranRuntime/CMakeLists.txt
 create mode 100644 FortranRuntime/CODE_OWNERS.TXT
 create mode 100644 FortranRuntime/LICENSE.TXT
 create mode 100644 FortranRuntime/README.md
 rename flang/runtime/config.h.cmake => FortranRuntime/cmake/config.h.cmake.in (100%)
 create mode 100644 FortranRuntime/cmake/modules/AddFortranRuntime.cmake
 create mode 100644 FortranRuntime/include/flang/Common/Fortran-consts.h
 rename {flang/include/flang => FortranRuntime/include/flang/Common}/ISO_Fortran_binding.h (97%)
 rename {flang/include/flang => FortranRuntime/include/flang/Common}/ISO_Fortran_binding_wrapper.h (85%)
 rename {flang => FortranRuntime}/include/flang/Common/api-attrs.h (99%)
 rename {flang/include/flang/Decimal => FortranRuntime/include/flang/Common}/binary-floating-point.h (99%)
 rename {flang => FortranRuntime}/include/flang/Common/bit-population-count.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/constexpr-bitset.h (100%)
 rename {flang/include/flang/Decimal => FortranRuntime/include/flang/Common}/decimal.h (97%)
 rename {flang => FortranRuntime}/include/flang/Common/enum-class.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/enum-set.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/fast-int-set.h (99%)
 rename {flang => FortranRuntime}/include/flang/Common/float128.h (96%)
 rename {flang => FortranRuntime}/include/flang/Common/format.h (99%)
 rename {flang => FortranRuntime}/include/flang/Common/idioms.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/leading-zero-bit-count.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/optional.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/real.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/reference-wrapper.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/restorer.h (100%)
 create mode 100644 FortranRuntime/include/flang/Common/target-rounding.h
 rename {flang => FortranRuntime}/include/flang/Common/uint128.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/variant.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/visit.h (100%)
 rename {flang => FortranRuntime}/include/flang/Common/windows-include.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/CUDA/allocator.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/CUDA/descriptor.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/allocatable.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/allocator-registry.h (96%)
 rename {flang => FortranRuntime}/include/flang/Runtime/array-constructor.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/assign.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/c-or-cpp.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/character.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/command.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/cpp-type.h (98%)
 rename {flang => FortranRuntime}/include/flang/Runtime/derived-api.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/descriptor.h (99%)
 rename {flang => FortranRuntime}/include/flang/Runtime/entry-names.h (97%)
 rename {flang => FortranRuntime}/include/flang/Runtime/exceptions.h (91%)
 rename {flang => FortranRuntime}/include/flang/Runtime/execute.h (93%)
 rename {flang => FortranRuntime}/include/flang/Runtime/extensions.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/freestanding-tools.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/inquiry.h (94%)
 rename {flang => FortranRuntime}/include/flang/Runtime/io-api.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/iostat.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/magic-numbers.h (98%)
 rename {flang => FortranRuntime}/include/flang/Runtime/main.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/matmul-instances.inc (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/matmul-transpose.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/matmul.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/memory.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/misc-intrinsic.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/numeric.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/pointer.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/ragged.h (97%)
 rename {flang => FortranRuntime}/include/flang/Runtime/random.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/reduce.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/reduction.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/stop.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/support.h (96%)
 rename {flang => FortranRuntime}/include/flang/Runtime/temporary-stack.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/time-intrinsic.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/transformational.h (100%)
 rename {flang => FortranRuntime}/include/flang/Runtime/type-code.h (96%)
 rename {flang/unittests/Evaluate => FortranRuntime/include/flang/Testing}/fp-testing.h (56%)
 rename {flang/unittests/Evaluate => FortranRuntime/include/flang/Testing}/testing.h (80%)
 create mode 100644 FortranRuntime/lib/CMakeLists.txt
 rename {flang/lib/Decimal => FortranRuntime/lib/Common}/big-radix-floating-point.h (98%)
 rename {flang/lib/Decimal => FortranRuntime/lib/Common}/binary-to-decimal.cpp (99%)
 rename {flang/lib/Decimal => FortranRuntime/lib/Common}/decimal-to-binary.cpp (99%)
 create mode 100644 FortranRuntime/lib/Runtime/CMakeLists.txt
 rename {flang/runtime => FortranRuntime/lib/Runtime}/CUDA/CMakeLists.txt (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/CUDA/allocator.cpp (94%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/CUDA/descriptor.cpp (91%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/CMakeLists.txt (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/acos.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/acosh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/asin.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/asinh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/atan.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/atan2.cpp (88%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/atanh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/ceil.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/complex-math.c (92%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/complex-math.h (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/cos.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/cosh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/erf.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/erfc.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/exp.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/exponent.cpp (90%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/floor.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/fma.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/fraction.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/hypot.cpp (88%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/j0.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/j1.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/jn.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/lgamma.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/llround.cpp (88%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/log.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/log10.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/lround.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/math-entries.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/mod-real.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/modulo-real.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/nearest.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/norm2.cpp (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/numeric-template-specs.h (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/pow.cpp (88%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/random.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/round.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/rrspacing.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/scale.cpp (90%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/set-exponent.cpp (88%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/sin.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/sinh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/spacing.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/sqrt.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/tan.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/tanh.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/tgamma.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/trunc.cpp (89%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/y0.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/y1.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/Float128Math/yn.cpp (87%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/ISO_Fortran_binding.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/ISO_Fortran_util.h (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/allocatable.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/allocator-registry.cpp (94%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/array-constructor.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/assign-impl.h (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/assign.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/buffer.cpp (92%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/buffer.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/character.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/command.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/complex-powi.cpp (91%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/complex-reduction.c (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/complex-reduction.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/connection.cpp (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/connection.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/copy.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/copy.h (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/derived-api.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/derived.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/derived.h (94%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/descriptor-io.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/descriptor-io.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/descriptor.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/dot-product.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/edit-input.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/edit-input.h (95%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/edit-output.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/edit-output.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/emit-encoded.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/environment-default-list.h (85%)
 mode change 100755 => 100644
 rename {flang/runtime => FortranRuntime/lib/Runtime}/environment.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/environment.h (95%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/exceptions.cpp (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/execute.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/extensions.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/external-unit.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/extrema.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/file.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/file.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/findloc.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/format-implementation.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/format.cpp (92%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/format.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/inquiry.cpp (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/internal-unit.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/internal-unit.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-api-common.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-api-minimal.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-api.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-error.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-error.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-stmt.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/io-stmt.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/iostat.cpp (98%)
 rename {flang/module => FortranRuntime/lib/Runtime}/iso_fortran_env_impl.f90 (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/lock.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/main.cpp (94%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/matmul-transpose.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/matmul.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/memory.cpp (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/misc-intrinsic.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/namelist.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/namelist.h (96%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/non-tbp-dio.cpp (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/non-tbp-dio.h (93%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/numeric-templates.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/numeric.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/pointer.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/product.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/pseudo-unit.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/ragged.cpp (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/random-templates.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/random.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/reduce.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/reduction-templates.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/reduction.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/stack.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/stat.cpp (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/stat.h (95%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/stop.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/sum.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/support.cpp (94%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/temporary-stack.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/terminator.cpp (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/terminator.h (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/time-intrinsic.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/tools.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/tools.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/transformational.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/type-code.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/type-info.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/type-info.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/unit-map.cpp (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/unit-map.h (97%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/unit.cpp (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/unit.h (99%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/utf.cpp (98%)
 rename {flang/runtime => FortranRuntime/lib/Runtime}/utf.h (97%)
 create mode 100644 FortranRuntime/lib/Testing/CMakeLists.txt
 rename {flang/unittests/Evaluate => FortranRuntime/lib/Testing}/fp-testing.cpp (86%)
 rename {flang/unittests/Evaluate => FortranRuntime/lib/Testing}/testing.cpp (88%)
 rename {flang => FortranRuntime}/module/.clang-format (100%)
 create mode 100644 FortranRuntime/module/CMakeLists.txt
 rename {flang => FortranRuntime}/module/__cuda_builtins.f90 (100%)
 rename {flang => FortranRuntime}/module/__fortran_builtins.f90 (100%)
 rename {flang => FortranRuntime}/module/__fortran_ieee_exceptions.f90 (100%)
 rename {flang => FortranRuntime}/module/__fortran_type_info.f90 (100%)
 rename {flang => FortranRuntime}/module/__ppc_intrinsics.f90 (100%)
 rename {flang => FortranRuntime}/module/__ppc_types.f90 (100%)
 rename {flang => FortranRuntime}/module/cudadevice.f90 (96%)
 rename {flang => FortranRuntime}/module/ieee_arithmetic.f90 (100%)
 rename {flang => FortranRuntime}/module/ieee_exceptions.f90 (100%)
 rename {flang => FortranRuntime}/module/ieee_features.f90 (100%)
 rename {flang => FortranRuntime}/module/iso_c_binding.f90 (100%)
 rename {flang => FortranRuntime}/module/iso_fortran_env.f90 (100%)
 rename {flang => FortranRuntime}/module/mma.f90 (98%)
 create mode 100644 FortranRuntime/test/CMakeLists.txt
 create mode 100644 FortranRuntime/test/NonGtestUnit/lit.cfg.py
 create mode 100644 FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
 rename {flang => FortranRuntime}/test/Runtime/no-cpp-dep.c (75%)
 create mode 100644 FortranRuntime/test/Unit/lit.cfg.py
 create mode 100644 FortranRuntime/test/Unit/lit.site.cfg.py.in
 create mode 100644 FortranRuntime/test/lit.cfg.py
 create mode 100644 FortranRuntime/test/lit.site.cfg.py.in
 create mode 100644 FortranRuntime/unittests/CMakeLists.txt
 create mode 100644 FortranRuntime/unittests/Common/CMakeLists.txt
 rename {flang => FortranRuntime}/unittests/Common/FastIntSetTest.cpp (97%)
 create mode 100644 FortranRuntime/unittests/Decimal/CMakeLists.txt
 rename {flang => FortranRuntime}/unittests/Decimal/quick-sanity-test.cpp (91%)
 rename {flang => FortranRuntime}/unittests/Decimal/thorough-test.cpp (85%)
 create mode 100644 FortranRuntime/unittests/Evaluate/CMakeLists.txt
 rename {flang => FortranRuntime}/unittests/Evaluate/ISO-Fortran-binding.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Evaluate/reshape.cpp (88%)
 rename {flang => FortranRuntime}/unittests/Runtime/AccessTest.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/Allocatable.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/ArrayConstructor.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/BufferTest.cpp (97%)
 rename {flang => FortranRuntime}/unittests/Runtime/CMakeLists.txt (54%)
 rename {flang => FortranRuntime}/unittests/Runtime/CUDA/AllocatorCUF.cpp (95%)
 rename {flang => FortranRuntime}/unittests/Runtime/CharacterTest.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/CommandTest.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/Complex.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/CrashHandlerFixture.cpp (92%)
 rename {flang => FortranRuntime}/unittests/Runtime/CrashHandlerFixture.h (91%)
 rename {flang => FortranRuntime}/unittests/Runtime/Derived.cpp (96%)
 rename {flang => FortranRuntime}/unittests/Runtime/ExternalIOTest.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/Format.cpp (96%)
 rename {flang => FortranRuntime}/unittests/Runtime/Inquiry.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/ListInputTest.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/LogicalFormatTest.cpp (96%)
 rename {flang => FortranRuntime}/unittests/Runtime/Matmul.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/MatmulTranspose.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/MiscIntrinsic.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/Namelist.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/Numeric.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/NumericalFormatTest.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/Pointer.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/Ragged.cpp (94%)
 rename {flang => FortranRuntime}/unittests/Runtime/Random.cpp (97%)
 rename {flang => FortranRuntime}/unittests/Runtime/Reduction.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/RuntimeCrashTest.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/Stop.cpp (96%)
 rename {flang => FortranRuntime}/unittests/Runtime/Support.cpp (97%)
 rename {flang => FortranRuntime}/unittests/Runtime/TemporaryStack.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/Time.cpp (98%)
 rename {flang => FortranRuntime}/unittests/Runtime/Transformational.cpp (99%)
 rename {flang => FortranRuntime}/unittests/Runtime/tools.h (96%)
 rename flang/include/flang/{Common => Support}/Fortran-features.h (98%)
 rename flang/include/flang/{Common => Support}/Fortran.h (73%)
 rename flang/include/flang/{Common => Support}/MathOptionsBase.def (100%)
 rename flang/include/flang/{Common => Support}/MathOptionsBase.h (86%)
 rename flang/include/flang/{Common => Support}/OpenMP-features.h (94%)
 rename flang/include/flang/{Common => Support}/Version.h (95%)
 rename flang/include/flang/{Common => Support}/default-kinds.h (96%)
 rename flang/include/flang/{Common => Support}/indirection.h (98%)
 rename flang/include/flang/{Common => Support}/interval.h (97%)
 rename flang/include/flang/{Common => Support}/reference-counted.h (96%)
 rename flang/include/flang/{Common => Support}/reference.h (97%)
 rename flang/include/flang/{Common => Support}/static-multimap-view.h (97%)
 rename flang/include/flang/{Common => Support}/template.h (99%)
 rename flang/include/flang/{Common => Support}/unwrap.h (97%)
 delete mode 100644 flang/lib/Decimal/CMakeLists.txt
 create mode 100644 flang/lib/Support/CMakeLists.txt
 rename flang/lib/{Common => Support}/Fortran-features.cpp (91%)
 rename flang/lib/{Common => Support}/Fortran.cpp (96%)
 rename flang/lib/{Common => Support}/Version.cpp (95%)
 create mode 100644 flang/lib/Support/big-radix-floating-point.h
 rename flang/lib/{Common => Support}/default-kinds.cpp (94%)
 rename flang/lib/{Common => Support}/idioms.cpp (89%)
 delete mode 100644 flang/runtime/CMakeLists.txt
 delete mode 100644 flang/tools/f18/CMakeLists.txt
 delete mode 100644 flang/tools/f18/dump.cpp
 delete mode 100644 flang/unittests/Common/CMakeLists.txt
 delete mode 100644 flang/unittests/Decimal/CMakeLists.txt
 delete mode 100644 flang/unittests/Runtime/CUDA/CMakeLists.txt

diff --git a/FortranRuntime/.clang-format b/FortranRuntime/.clang-format
new file mode 100644
index 00000000000000..c1dfe06fdf5782
--- /dev/null
+++ b/FortranRuntime/.clang-format
@@ -0,0 +1,21 @@
+---
+# See: https://clang.llvm.org/docs/ClangFormatStyleOptions.html
+BasedOnStyle: LLVM
+AlignAfterOpenBracket: DontAlign
+AlignEscapedNewlines: DontAlign
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignOperands: false
+AlignTrailingComments: false
+IncludeCategories:
+  - Regex:           '^<'
+    Priority:        4
+  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
+    Priority:        3
+  - Regex:           '^"(flang|\.\.)/'
+    Priority:        2
+  - Regex:           '.*'
+    Priority:        1
+...
+
+# vim:set filetype=yaml:
diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
new file mode 100644
index 00000000000000..765e1445fc1a18
--- /dev/null
+++ b/FortranRuntime/CMakeLists.txt
@@ -0,0 +1,184 @@
+#===-- CMakeLists.txt ------------------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+#
+# Build instructions for the FortranRuntime library and Fortran modules required
+# by programs compiled by Flang. This is file is intended to be included using
+# the LLVM_ENABLE_RUNTIMES mechanism.
+#
+#===------------------------------------------------------------------------===#
+
+set(LLVM_SUBPROJECT_TITLE "Fortran Runtime")
+set(FORTRANRUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(FORTRANRUNTIME_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+
+list(APPEND CMAKE_MODULE_PATH
+  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
+  )
+include(AddFortranRuntime)
+
+
+
+############################
+# Build Mode Introspection #
+############################
+
+# Setting these variables from an LLVM build is sufficient that FortranRuntime can
+# construct the output paths, so it can behave as if it were in-tree here.
+set(LLVM_TREE_AVAILABLE OFF)
+if (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSION)
+  # This is a bootstap build
+  set(LLVM_TREE_AVAILABLE ON)
+endif()
+
+if (LLVM_TREE_AVAILABLE)
+  # Despite Clang in the name, get_clang_resource_dir does not depend on Clang being added to the build
+  # flang-new uses the same resource dir as clang.
+  include(GetClangResourceDir) 
+  get_clang_resource_dir(FORTRANRUNTIME_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
+  get_clang_resource_dir(FORTRANRUNTIME_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command find the install prefix itself
+
+  # FIXME: If compiling multiple triples, include dirs overwrite each other
+  get_clang_resource_dir(FORTRANRUNTIME_BUILD_INCLUDE_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "include")
+  get_clang_resource_dir(FORTRANRUNTIME_INSTALL_INCLUDE_DIR SUBDIR "include") 
+else ()
+  set(FORTRANRUNTIME_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
+  set(FORTRANRUNTIME_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
+
+  set(FORTRANRUNTIME_BUILD_INCLUDE_DIR "${LLVM_INCLUDE_DIR}")
+  set(FORTRANRUNTIME_INSTALL_INCLUDE_DIR "include")
+endif ()
+
+
+if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
+  set(FORTRANRUNTIME_BUILD_LIB_DIR "${FORTRANRUNTIME_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+  set(FORTRANRUNTIME_INSTALL_LIB_DIR "${FORTRANRUNTIME_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+endif()
+
+
+
+
+#################
+# Build Options #
+#################
+
+option(FORTRANRUNTIME_INCLUDE_TESTS
+         "Generate build targets for the FortranRuntime unit tests."
+         ${LLVM_INCLUDE_TESTS})
+
+# The out of tree builds of the compiler and the Fortran runtime
+# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
+# to be composable. Failure to synchronize this setting may result
+# in linking errors or fatal failures in F128 runtime functions.
+set(FORTRARUNTIME_F128_MATH_LIB "" CACHE STRING
+  "Specifies the target library used for implementing IEEE-754 128-bit float \
+  math in F18 runtime, e.g. it might be libquadmath for targets where \
+  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
+  is mapped to long double, etc."
+  )
+if (FLANG_RUNTIME_F128_MATH_LIB)
+  add_compile_definitions(
+    FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}"
+    )
+endif()
+
+option(FLANG_EXPERIMENTAL_CUDA_RUNTIME "Compile Fortran runtime as CUDA sources (experimental)" OFF)
+if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
+  message(FATAL_ERROOR "FLANG_EXPERIMENTAL_CUDA_RUNTIME currently not supported")
+endif()
+
+
+
+
+########################
+# System Introspection #
+########################
+
+include(TestBigEndian)
+test_big_endian(IS_BIGENDIAN)
+if (IS_BIGENDIAN)
+  add_compile_definitions(FLANG_BIG_ENDIAN=1)
+else ()
+  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
+endif ()
+
+include(CheckCXXSymbolExists)
+include(CheckCXXSourceCompiles)
+check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
+# Can't use symbol exists here as the function is overloaded in C++
+check_cxx_source_compiles(
+  "#include <string.h>
+   int main() {
+     char buf[4096];
+     return strerror_s(buf, 4096, 0);
+   }
+  "
+  HAVE_DECL_STRERROR_S)
+
+# Check if 128-bit float computations can be done via long double
+check_cxx_source_compiles(
+  "#include <cfloat>
+   #if LDBL_MANT_DIG != 113
+   #error LDBL_MANT_DIG != 113
+   #endif
+   int main() { return 0; }
+  "
+  HAVE_LDBL_MANT_DIG_113)
+
+# Check if 128-bit float computations can be done via long double
+check_cxx_source_compiles(
+  "#include <cfloat>
+   #if LDBL_MANT_DIG != 113
+   #error LDBL_MANT_DIG != 113
+   #endif
+   int main() { return 0; }
+  "
+  HAVE_LDBL_MANT_DIG_113)
+
+
+#####################
+# Build Preparation #
+#####################
+
+enable_language(Fortran)
+
+# C++17 required for FortranRuntime, user or other runtimes may override this.
+# GTest included later also requires C++17.
+set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") 
+set(CMAKE_CXX_STANDARD_REQUIRED YES)
+
+# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
+# to avoid an unwanted dependency on libstdc++/libc++.so.
+add_definitions(-U_GLIBCXX_ASSERTIONS)
+add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
+
+
+configure_file(cmake/config.h.cmake.in config.h)
+
+configure_file(
+  "${FORTRANRUNTIME_SOURCE_DIR}/include/flang/Common/ISO_Fortran_binding.h"
+  "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/ISO_Fortran_binding.h"
+)
+install(
+  FILES   "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/ISO_Fortran_binding.h"
+  DESTINATION "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}"
+)
+
+
+
+###################
+# Build Artifacts #
+###################
+
+add_subdirectory(lib)
+add_subdirectory(module)
+
+if (FORTRANRUNTIME_INCLUDE_TESTS)
+  add_subdirectory(unittests)
+  add_subdirectory(test)
+endif()
+
diff --git a/FortranRuntime/CODE_OWNERS.TXT b/FortranRuntime/CODE_OWNERS.TXT
new file mode 100644
index 00000000000000..649243aa1e8fec
--- /dev/null
+++ b/FortranRuntime/CODE_OWNERS.TXT
@@ -0,0 +1,14 @@
+This file is a list of the people responsible for ensuring that patches for a
+particular part of Flang are reviewed, either by themself or by someone else.
+They are also the gatekeepers for their part of Flang, with the final word on
+what goes in or not.
+
+The list is sorted by surname and formatted to allow easy grepping and
+beautification by scripts. The fields are: name (N), email (E), web-address
+(W), PGP key ID and fingerprint (P), description (D), snail-mail address
+(S) and (I) IRC handle. Each entry should contain at least the (N), (E) and
+(D) fields.
+
+N: Steve Scalpone
+E: sscalpone at nvidia.com
+D: Anything not covered by others
diff --git a/FortranRuntime/LICENSE.TXT b/FortranRuntime/LICENSE.TXT
new file mode 100644
index 00000000000000..53bb2e7fbc7643
--- /dev/null
+++ b/FortranRuntime/LICENSE.TXT
@@ -0,0 +1,234 @@
+==============================================================================
+The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
+==============================================================================
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+    1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+    2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+    3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+    4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+    5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+    6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+    7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+    8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+    9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+    END OF TERMS AND CONDITIONS
+
+    APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+    Copyright [yyyy] [name of copyright owner]
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+
+---- LLVM Exceptions to the Apache 2.0 License ----
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
+
+==============================================================================
+Software from third parties included in the LLVM Project:
+==============================================================================
+The LLVM Project contains third party software which is under different license
+terms. All such code will be identified clearly using at least one of two
+mechanisms:
+1) It will be in a separate directory tree with its own `LICENSE.txt` or
+   `LICENSE` file at the top containing the specific license and restrictions
+   which apply to that software, or
+2) It will contain specific license and restriction terms at the top of every
+   file.
diff --git a/FortranRuntime/README.md b/FortranRuntime/README.md
new file mode 100644
index 00000000000000..6fd4b3359f7888
--- /dev/null
+++ b/FortranRuntime/README.md
@@ -0,0 +1,20 @@
+# Fortran Runtime
+
+Fortran Runtime is the runtime library for code emitted by the Flang
+compiler (https://flang.llvm.org).
+
+## Getting Started
+
+### Bootstrap Build
+
+```sh
+cmake -S <path-to-llvm-project>/llvm -DLLVM_ENABLE_PROJECTS=flang -DLLVM_ENABLE_RUNTIMES=FortranRuntime
+```
+
+### Runtime-only build
+
+```sh
+cmake -S <path-to-llvm-project>/runtimes -DLLVM_ENABLE_RUNTIMES=FortranRuntime -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir-or-installprefix>/bin/flang-new
+```
+
+
diff --git a/flang/runtime/config.h.cmake b/FortranRuntime/cmake/config.h.cmake.in
similarity index 100%
rename from flang/runtime/config.h.cmake
rename to FortranRuntime/cmake/config.h.cmake.in
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
new file mode 100644
index 00000000000000..a4fc95495610cc
--- /dev/null
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -0,0 +1,109 @@
+#===-- cmake/modules/AddFortranRuntime.cmake -------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+# Builds a library with common option for FortranRuntime.
+#
+# Usage:
+#
+# add_fortranruntime_library(name sources ...
+#   SHARED
+#     Build a dynamic (.so/.dll) library
+#   STATIC
+#     Build a static (.a/.lib) library
+#   OBJECT
+#     Create only object- and Fortran module files without static/dynamic library
+#   INSTALL_WITH_TOOLCHAIN
+#     Install library into Clang's resource directory so it can be found by the Flang driver during compilation, including tests
+#   EXCLUDE_FROM_ALL
+#     Do not build library by default; typically used for libraries needed for testing only, no install
+#   LINK_TO_LLVM
+#     Library requires include path and linking to LLVM's Support component
+#   ADDITIONAL_HEADERS
+#     May specify header files for IDE generators.
+# )
+function (add_fortranruntime_library name)
+  set(options STATIC SHARED OBJECT INSTALL_WITH_TOOLCHAIN EXCLUDE_FROM_ALL LINK_TO_LLVM)
+  set(multiValueArgs ADDITIONAL_HEADERS)
+  cmake_parse_arguments(ARG
+    "${options}"
+    ""
+    "${multiValueArgs}"
+    ${ARGN})
+
+  # Also add header files to IDEs to list as part of the library
+  set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
+
+  # Forward libtype to add_library
+  set(extra_args "")
+  if (ARG_SHARED)
+    list(APPEND extra_args SHARED)
+  endif ()
+  if (ARG_STATIC)
+    list(APPEND extra_args STATIC)
+  endif ()
+  if (ARG_OBJECT)
+    list(APPEND extra_args OBJECT)
+  endif ()
+  if (EXCLUDE_FROM_ALL)
+    list(APPEND extra_args EXCLUDE_FROM_ALL)
+  endif ()
+
+  add_library(${name} ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS}   )
+  if (ARG_INSTALL_WITH_TOOLCHAIN)
+    set_target_properties(${name} PROPERTIES FOLDER "Fortran Runtime/Toolchain Libraries")
+  elseif (ARG_OBJECT)
+    set_target_properties(${name} PROPERTIES FOLDER "Fortran Runtime/Object Libraries")
+  else ()
+    set_target_properties(${name} PROPERTIES FOLDER "Fortran Runtime/Libraries")
+  endif ()
+
+  target_compile_features(${name} PRIVATE cxx_std_17)
+     if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
+       target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
+    elseif(MSVC)
+      target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
+    endif()
+
+  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")   # For configured config.h for be found
+  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+
+set_target_properties(${name}
+  PROPERTIES
+    Fortran_MODULE_DIRECTORY "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/flang"
+)
+
+  if (ARG_LINK_TO_LLVM)
+    if (LLVM_LINK_LLVM_DYLIB)
+      set(llvm_libs LLVM)
+    else()
+      llvm_map_components_to_libnames(llvm_libs Support)
+    endif()
+    target_link_libraries(${name} PUBLIC  ${llvm_libs})
+     target_include_directories(${name} PRIVATE  ${LLVM_INCLUDE_DIRS})
+  endif ()
+
+  # If this is part of the toolchain, put it into the compiler's resource directory.
+  # Otherwise it is part of testing and is not installed at all.
+  # TODO: Consider multi-configuration builds
+  if (INSTALL_WITH_TOOLCHAIN)
+    set_target_properties(${name}
+      PROPERTIES 
+        LIBRARY_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
+        ARCHIVE_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
+        RUNTIME_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
+    )
+
+    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+      install(TARGETS ${name}
+        LIBRARY DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
+        ARCHIVE DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
+        RUNTIME DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
+      )
+    endif ()
+  endif ()
+endfunction (add_fortranruntime_library)
diff --git a/FortranRuntime/include/flang/Common/Fortran-consts.h b/FortranRuntime/include/flang/Common/Fortran-consts.h
new file mode 100644
index 00000000000000..3156c6c50c3b9a
--- /dev/null
+++ b/FortranRuntime/include/flang/Common/Fortran-consts.h
@@ -0,0 +1,50 @@
+//===-- include/flang/Common/Fortran-consts.h -------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FORTRAN_COMMON_FORTRAN_CONSTS_H_
+#define FORTRAN_COMMON_FORTRAN_CONSTS_H_
+
+// Fortran language concepts that are used in many phases are defined
+// once here to avoid redundancy and needless translation.
+
+#include "flang/Common/enum-class.h"
+#include <cstdint>
+
+namespace Fortran::common {
+
+// Fortran has five kinds of intrinsic data types, plus the derived types.
+ENUM_CLASS(TypeCategory, Integer, Real, Complex, Character, Logical, Derived)
+ENUM_CLASS(VectorElementCategory, Integer, Unsigned, Real)
+
+
+ENUM_CLASS(IoStmtKind, None, Backspace, Close, Endfile, Flush, Inquire, Open,
+    Print, Read, Rewind, Wait, Write)
+
+// Defined I/O variants
+ENUM_CLASS(
+    DefinedIo, ReadFormatted, ReadUnformatted, WriteFormatted, WriteUnformatted)
+
+// Fortran arrays may have up to 15 dimensions (See Fortran 2018 section 5.4.6).
+static constexpr int maxRank{15};
+
+
+// Floating-point rounding modes; these are packed into a byte to save
+// room in the runtime's format processing context structure.  These
+// enumerators are defined with the corresponding values returned from
+// llvm.get.rounding.
+enum class RoundingMode : std::uint8_t {
+  ToZero, // ROUND=ZERO, RZ - truncation
+  TiesToEven, // ROUND=NEAREST, RN - default IEEE rounding
+  Up, // ROUND=UP, RU
+  Down, // ROUND=DOWN, RD
+  TiesAwayFromZero, // ROUND=COMPATIBLE, RC - ties round away from zero
+};
+
+
+} // namespace Fortran::common
+#endif // FORTRAN_COMMON_FORTRAN_CONSTS_H_
diff --git a/flang/include/flang/ISO_Fortran_binding.h b/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
similarity index 97%
rename from flang/include/flang/ISO_Fortran_binding.h
rename to FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
index 89a10ce69a2ba2..21247103bcc552 100644
--- a/flang/include/flang/ISO_Fortran_binding.h
+++ b/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
@@ -1,11 +1,10 @@
-/*===-- include/flang/ISO_Fortran_binding.h -----------------------*- C++ -*-===
+/*===-- include/flang/Common/ISO_Fortran_binding.h ------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 #ifndef CFI_ISO_FORTRAN_BINDING_H_
 #define CFI_ISO_FORTRAN_BINDING_H_
diff --git a/flang/include/flang/ISO_Fortran_binding_wrapper.h b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
similarity index 85%
rename from flang/include/flang/ISO_Fortran_binding_wrapper.h
rename to FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
index 37289bdbabd03c..ee02f6f129732e 100644
--- a/flang/include/flang/ISO_Fortran_binding_wrapper.h
+++ b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
@@ -1,11 +1,10 @@
-/*===-- include/flang/ISO_Fortran_binding_wrapper.h ---------------*- C++ -*-===
+/*===-- include/flang/Common/ISO_Fortran_binding_wrapper.h ----------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 #ifndef FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
 #define FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
@@ -23,7 +22,7 @@
 
 /* clang-format off */
 #include <stddef.h>
-#include "Common/api-attrs.h"
+#include "flang/Common/api-attrs.h"
 #ifdef __cplusplus
 namespace Fortran {
 namespace ISO {
diff --git a/flang/include/flang/Common/api-attrs.h b/FortranRuntime/include/flang/Common/api-attrs.h
similarity index 99%
rename from flang/include/flang/Common/api-attrs.h
rename to FortranRuntime/include/flang/Common/api-attrs.h
index d73e60996bc81f..b56a3c8a047af6 100644
--- a/flang/include/flang/Common/api-attrs.h
+++ b/FortranRuntime/include/flang/Common/api-attrs.h
@@ -1,11 +1,10 @@
-/*===-- include/flang/Common/api-attrs.h ---------------------------*- C -*-=//
+/*===-- include/flang/Common/api-attrs.h ----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===------------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 /*
  * The file defines a set macros that can be used to apply
diff --git a/flang/include/flang/Decimal/binary-floating-point.h b/FortranRuntime/include/flang/Common/binary-floating-point.h
similarity index 99%
rename from flang/include/flang/Decimal/binary-floating-point.h
rename to FortranRuntime/include/flang/Common/binary-floating-point.h
index 1e0cde97d98e61..1409b94192740c 100644
--- a/flang/include/flang/Decimal/binary-floating-point.h
+++ b/FortranRuntime/include/flang/Common/binary-floating-point.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Decimal/binary-floating-point.h -----------*- C++ -*-===//
+//===-- include/flang/Common/binary-floating-point.h ------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/bit-population-count.h b/FortranRuntime/include/flang/Common/bit-population-count.h
similarity index 100%
rename from flang/include/flang/Common/bit-population-count.h
rename to FortranRuntime/include/flang/Common/bit-population-count.h
diff --git a/flang/include/flang/Common/constexpr-bitset.h b/FortranRuntime/include/flang/Common/constexpr-bitset.h
similarity index 100%
rename from flang/include/flang/Common/constexpr-bitset.h
rename to FortranRuntime/include/flang/Common/constexpr-bitset.h
diff --git a/flang/include/flang/Decimal/decimal.h b/FortranRuntime/include/flang/Common/decimal.h
similarity index 97%
rename from flang/include/flang/Decimal/decimal.h
rename to FortranRuntime/include/flang/Common/decimal.h
index 443163d058e28b..2a75b98c112225 100644
--- a/flang/include/flang/Decimal/decimal.h
+++ b/FortranRuntime/include/flang/Common/decimal.h
@@ -1,11 +1,10 @@
-/*===-- include/flang/Decimal/decimal.h ---------------------------*- C++ -*-===
+/*===-- include/flang/Common/decimal.h ------------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 /* C and C++ API for binary-to/from-decimal conversion package. */
 
diff --git a/flang/include/flang/Common/enum-class.h b/FortranRuntime/include/flang/Common/enum-class.h
similarity index 100%
rename from flang/include/flang/Common/enum-class.h
rename to FortranRuntime/include/flang/Common/enum-class.h
diff --git a/flang/include/flang/Common/enum-set.h b/FortranRuntime/include/flang/Common/enum-set.h
similarity index 100%
rename from flang/include/flang/Common/enum-set.h
rename to FortranRuntime/include/flang/Common/enum-set.h
diff --git a/flang/include/flang/Common/fast-int-set.h b/FortranRuntime/include/flang/Common/fast-int-set.h
similarity index 99%
rename from flang/include/flang/Common/fast-int-set.h
rename to FortranRuntime/include/flang/Common/fast-int-set.h
index d1c9c756a44a65..48209a773c4cd1 100644
--- a/flang/include/flang/Common/fast-int-set.h
+++ b/FortranRuntime/include/flang/Common/fast-int-set.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/fast-int-set.h --------------------*- C++ -*-===//
+//===-- include/flang/Common/fast-int-set.h ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/float128.h b/FortranRuntime/include/flang/Common/float128.h
similarity index 96%
rename from flang/include/flang/Common/float128.h
rename to FortranRuntime/include/flang/Common/float128.h
index 2e76bc0a162e61..a7036bf679e5ae 100644
--- a/flang/include/flang/Common/float128.h
+++ b/FortranRuntime/include/flang/Common/float128.h
@@ -1,4 +1,4 @@
-/*===-- flang/Common/float128.h ----------------------------------*- C -*-===
+/*===-- include/flang/Common/float128.h -----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/format.h b/FortranRuntime/include/flang/Common/format.h
similarity index 99%
rename from flang/include/flang/Common/format.h
rename to FortranRuntime/include/flang/Common/format.h
index 2374ff6983cf41..138e84b72b733d 100644
--- a/flang/include/flang/Common/format.h
+++ b/FortranRuntime/include/flang/Common/format.h
@@ -10,7 +10,7 @@
 #define FORTRAN_COMMON_FORMAT_H_
 
 #include "enum-set.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include <cstring>
 
 // Define a FormatValidator class template to validate a format expression
diff --git a/flang/include/flang/Common/idioms.h b/FortranRuntime/include/flang/Common/idioms.h
similarity index 100%
rename from flang/include/flang/Common/idioms.h
rename to FortranRuntime/include/flang/Common/idioms.h
diff --git a/flang/include/flang/Common/leading-zero-bit-count.h b/FortranRuntime/include/flang/Common/leading-zero-bit-count.h
similarity index 100%
rename from flang/include/flang/Common/leading-zero-bit-count.h
rename to FortranRuntime/include/flang/Common/leading-zero-bit-count.h
diff --git a/flang/include/flang/Common/optional.h b/FortranRuntime/include/flang/Common/optional.h
similarity index 100%
rename from flang/include/flang/Common/optional.h
rename to FortranRuntime/include/flang/Common/optional.h
diff --git a/flang/include/flang/Common/real.h b/FortranRuntime/include/flang/Common/real.h
similarity index 100%
rename from flang/include/flang/Common/real.h
rename to FortranRuntime/include/flang/Common/real.h
diff --git a/flang/include/flang/Common/reference-wrapper.h b/FortranRuntime/include/flang/Common/reference-wrapper.h
similarity index 100%
rename from flang/include/flang/Common/reference-wrapper.h
rename to FortranRuntime/include/flang/Common/reference-wrapper.h
diff --git a/flang/include/flang/Common/restorer.h b/FortranRuntime/include/flang/Common/restorer.h
similarity index 100%
rename from flang/include/flang/Common/restorer.h
rename to FortranRuntime/include/flang/Common/restorer.h
diff --git a/FortranRuntime/include/flang/Common/target-rounding.h b/FortranRuntime/include/flang/Common/target-rounding.h
new file mode 100644
index 00000000000000..970d8fb61fbd1b
--- /dev/null
+++ b/FortranRuntime/include/flang/Common/target-rounding.h
@@ -0,0 +1,40 @@
+//===-- include/flang/Common/target-rounding.h ------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FORTRAN_COMMON_TARGET_ROUNDING_H_
+#define FORTRAN_COMMON_TARGET_ROUNDING_H_
+
+
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Common/enum-set.h"
+
+
+namespace Fortran::common {
+
+// Floating-point rounding control
+struct Rounding {
+  common::RoundingMode mode{common::RoundingMode::TiesToEven};
+  // When set, emulate status flag behavior peculiar to x86
+  // (viz., fail to set the Underflow flag when an inexact product of a
+  // multiplication is rounded up to a normal number from a subnormal
+  // in some rounding modes)
+#if __x86_64__ || __riscv || __loongarch__
+  bool x86CompatibleBehavior{true};
+#else
+  bool x86CompatibleBehavior{false};
+#endif
+};
+
+
+// These are ordered like the bits in a common fenv.h header file.
+ENUM_CLASS(RealFlag, InvalidArgument, Denorm, DivideByZero, Overflow, Underflow,
+    Inexact)
+using RealFlags = common::EnumSet<RealFlag, RealFlag_enumSize>;
+
+}
+#endif // FORTRAN_COMMON_TARGET_ROUNDING_H_
diff --git a/flang/include/flang/Common/uint128.h b/FortranRuntime/include/flang/Common/uint128.h
similarity index 100%
rename from flang/include/flang/Common/uint128.h
rename to FortranRuntime/include/flang/Common/uint128.h
diff --git a/flang/include/flang/Common/variant.h b/FortranRuntime/include/flang/Common/variant.h
similarity index 100%
rename from flang/include/flang/Common/variant.h
rename to FortranRuntime/include/flang/Common/variant.h
diff --git a/flang/include/flang/Common/visit.h b/FortranRuntime/include/flang/Common/visit.h
similarity index 100%
rename from flang/include/flang/Common/visit.h
rename to FortranRuntime/include/flang/Common/visit.h
diff --git a/flang/include/flang/Common/windows-include.h b/FortranRuntime/include/flang/Common/windows-include.h
similarity index 100%
rename from flang/include/flang/Common/windows-include.h
rename to FortranRuntime/include/flang/Common/windows-include.h
diff --git a/flang/include/flang/Runtime/CUDA/allocator.h b/FortranRuntime/include/flang/Runtime/CUDA/allocator.h
similarity index 100%
rename from flang/include/flang/Runtime/CUDA/allocator.h
rename to FortranRuntime/include/flang/Runtime/CUDA/allocator.h
diff --git a/flang/include/flang/Runtime/CUDA/descriptor.h b/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
similarity index 100%
rename from flang/include/flang/Runtime/CUDA/descriptor.h
rename to FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
diff --git a/flang/include/flang/Runtime/allocatable.h b/FortranRuntime/include/flang/Runtime/allocatable.h
similarity index 100%
rename from flang/include/flang/Runtime/allocatable.h
rename to FortranRuntime/include/flang/Runtime/allocatable.h
diff --git a/flang/include/flang/Runtime/allocator-registry.h b/FortranRuntime/include/flang/Runtime/allocator-registry.h
similarity index 96%
rename from flang/include/flang/Runtime/allocator-registry.h
rename to FortranRuntime/include/flang/Runtime/allocator-registry.h
index acfada506fafc6..411cc68f58ec33 100644
--- a/flang/include/flang/Runtime/allocator-registry.h
+++ b/FortranRuntime/include/flang/Runtime/allocator-registry.h
@@ -1,4 +1,4 @@
-//===-- runtime/allocator-registry.h ----------------------------*- C++ -*-===//
+//===-- include/flang/Runtime/allocator-registry.h --------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Runtime/array-constructor.h b/FortranRuntime/include/flang/Runtime/array-constructor.h
similarity index 100%
rename from flang/include/flang/Runtime/array-constructor.h
rename to FortranRuntime/include/flang/Runtime/array-constructor.h
diff --git a/flang/include/flang/Runtime/assign.h b/FortranRuntime/include/flang/Runtime/assign.h
similarity index 100%
rename from flang/include/flang/Runtime/assign.h
rename to FortranRuntime/include/flang/Runtime/assign.h
diff --git a/flang/include/flang/Runtime/c-or-cpp.h b/FortranRuntime/include/flang/Runtime/c-or-cpp.h
similarity index 100%
rename from flang/include/flang/Runtime/c-or-cpp.h
rename to FortranRuntime/include/flang/Runtime/c-or-cpp.h
diff --git a/flang/include/flang/Runtime/character.h b/FortranRuntime/include/flang/Runtime/character.h
similarity index 100%
rename from flang/include/flang/Runtime/character.h
rename to FortranRuntime/include/flang/Runtime/character.h
diff --git a/flang/include/flang/Runtime/command.h b/FortranRuntime/include/flang/Runtime/command.h
similarity index 100%
rename from flang/include/flang/Runtime/command.h
rename to FortranRuntime/include/flang/Runtime/command.h
diff --git a/flang/include/flang/Runtime/cpp-type.h b/FortranRuntime/include/flang/Runtime/cpp-type.h
similarity index 98%
rename from flang/include/flang/Runtime/cpp-type.h
rename to FortranRuntime/include/flang/Runtime/cpp-type.h
index fe21dd544cf7d8..27b43de7d0f0f6 100644
--- a/flang/include/flang/Runtime/cpp-type.h
+++ b/FortranRuntime/include/flang/Runtime/cpp-type.h
@@ -11,7 +11,7 @@
 #ifndef FORTRAN_RUNTIME_CPP_TYPE_H_
 #define FORTRAN_RUNTIME_CPP_TYPE_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/float128.h"
 #include "flang/Common/uint128.h"
 #include <complex>
diff --git a/flang/include/flang/Runtime/derived-api.h b/FortranRuntime/include/flang/Runtime/derived-api.h
similarity index 100%
rename from flang/include/flang/Runtime/derived-api.h
rename to FortranRuntime/include/flang/Runtime/derived-api.h
diff --git a/flang/include/flang/Runtime/descriptor.h b/FortranRuntime/include/flang/Runtime/descriptor.h
similarity index 99%
rename from flang/include/flang/Runtime/descriptor.h
rename to FortranRuntime/include/flang/Runtime/descriptor.h
index 030d0c1031fbaa..2fe5b11200cf6d 100644
--- a/flang/include/flang/Runtime/descriptor.h
+++ b/FortranRuntime/include/flang/Runtime/descriptor.h
@@ -18,7 +18,7 @@
 // User C code is welcome to depend on that ISO_Fortran_binding.h file,
 // but should never reference this internal header.
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/memory.h"
 #include "flang/Runtime/type-code.h"
 #include <algorithm>
diff --git a/flang/include/flang/Runtime/entry-names.h b/FortranRuntime/include/flang/Runtime/entry-names.h
similarity index 97%
rename from flang/include/flang/Runtime/entry-names.h
rename to FortranRuntime/include/flang/Runtime/entry-names.h
index 68582b92b54941..52de2496d9421d 100644
--- a/flang/include/flang/Runtime/entry-names.h
+++ b/FortranRuntime/include/flang/Runtime/entry-names.h
@@ -1,11 +1,10 @@
-/*===-- include/flang/Runtime/entry-names.h -------------------------*- C -*-=//
+/*===-- include/flang/Runtime/entry-names.h -------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===------------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 /* Defines the macro RTNAME(n) which decorates the external name of a runtime
  * library function or object with extra characters so that it
diff --git a/flang/include/flang/Runtime/exceptions.h b/FortranRuntime/include/flang/Runtime/exceptions.h
similarity index 91%
rename from flang/include/flang/Runtime/exceptions.h
rename to FortranRuntime/include/flang/Runtime/exceptions.h
index 1ab22da103a50f..1fb74e14e54d30 100644
--- a/flang/include/flang/Runtime/exceptions.h
+++ b/FortranRuntime/include/flang/Runtime/exceptions.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/exceptions.h ----------------*- C++ -*-===//
+//===-- include/flang/Runtime/exceptions.h ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Runtime/execute.h b/FortranRuntime/include/flang/Runtime/execute.h
similarity index 93%
rename from flang/include/flang/Runtime/execute.h
rename to FortranRuntime/include/flang/Runtime/execute.h
index ca137b9d1823c4..ba3e950ca92941 100644
--- a/flang/include/flang/Runtime/execute.h
+++ b/FortranRuntime/include/flang/Runtime/execute.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/command.h -------------------------*- C++ -*-===//
+//===-- include/flang/Runtime/execute.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Runtime/extensions.h b/FortranRuntime/include/flang/Runtime/extensions.h
similarity index 100%
rename from flang/include/flang/Runtime/extensions.h
rename to FortranRuntime/include/flang/Runtime/extensions.h
diff --git a/flang/include/flang/Runtime/freestanding-tools.h b/FortranRuntime/include/flang/Runtime/freestanding-tools.h
similarity index 100%
rename from flang/include/flang/Runtime/freestanding-tools.h
rename to FortranRuntime/include/flang/Runtime/freestanding-tools.h
diff --git a/flang/include/flang/Runtime/inquiry.h b/FortranRuntime/include/flang/Runtime/inquiry.h
similarity index 94%
rename from flang/include/flang/Runtime/inquiry.h
rename to FortranRuntime/include/flang/Runtime/inquiry.h
index c7a7487f1a1b18..36ef929ed5b2f1 100644
--- a/flang/include/flang/Runtime/inquiry.h
+++ b/FortranRuntime/include/flang/Runtime/inquiry.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/inquiry.h ----------------*- C++ -*-===//
+//===-- include/flang/Runtime/inquiry.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Runtime/io-api.h b/FortranRuntime/include/flang/Runtime/io-api.h
similarity index 100%
rename from flang/include/flang/Runtime/io-api.h
rename to FortranRuntime/include/flang/Runtime/io-api.h
diff --git a/flang/include/flang/Runtime/iostat.h b/FortranRuntime/include/flang/Runtime/iostat.h
similarity index 100%
rename from flang/include/flang/Runtime/iostat.h
rename to FortranRuntime/include/flang/Runtime/iostat.h
diff --git a/flang/include/flang/Runtime/magic-numbers.h b/FortranRuntime/include/flang/Runtime/magic-numbers.h
similarity index 98%
rename from flang/include/flang/Runtime/magic-numbers.h
rename to FortranRuntime/include/flang/Runtime/magic-numbers.h
index bab0e9ae05299a..931df690766219 100644
--- a/flang/include/flang/Runtime/magic-numbers.h
+++ b/FortranRuntime/include/flang/Runtime/magic-numbers.h
@@ -1,10 +1,10 @@
-#if 0 /*===-- include/flang/Runtime/magic-numbers.h -----------------------===*/
-/*
+#if 0 /*===-- include/flang/Runtime/magic-numbers.h ---------------*- C -*-===*/
+ *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===----------------------------------------------------------------------===*/
+/*===----------------------------------------------------------------------===*/
 #endif
 #if 0
 This header can be included into both Fortran and C.
diff --git a/flang/include/flang/Runtime/main.h b/FortranRuntime/include/flang/Runtime/main.h
similarity index 100%
rename from flang/include/flang/Runtime/main.h
rename to FortranRuntime/include/flang/Runtime/main.h
diff --git a/flang/include/flang/Runtime/matmul-instances.inc b/FortranRuntime/include/flang/Runtime/matmul-instances.inc
similarity index 100%
rename from flang/include/flang/Runtime/matmul-instances.inc
rename to FortranRuntime/include/flang/Runtime/matmul-instances.inc
diff --git a/flang/include/flang/Runtime/matmul-transpose.h b/FortranRuntime/include/flang/Runtime/matmul-transpose.h
similarity index 100%
rename from flang/include/flang/Runtime/matmul-transpose.h
rename to FortranRuntime/include/flang/Runtime/matmul-transpose.h
diff --git a/flang/include/flang/Runtime/matmul.h b/FortranRuntime/include/flang/Runtime/matmul.h
similarity index 100%
rename from flang/include/flang/Runtime/matmul.h
rename to FortranRuntime/include/flang/Runtime/matmul.h
diff --git a/flang/include/flang/Runtime/memory.h b/FortranRuntime/include/flang/Runtime/memory.h
similarity index 100%
rename from flang/include/flang/Runtime/memory.h
rename to FortranRuntime/include/flang/Runtime/memory.h
diff --git a/flang/include/flang/Runtime/misc-intrinsic.h b/FortranRuntime/include/flang/Runtime/misc-intrinsic.h
similarity index 100%
rename from flang/include/flang/Runtime/misc-intrinsic.h
rename to FortranRuntime/include/flang/Runtime/misc-intrinsic.h
diff --git a/flang/include/flang/Runtime/numeric.h b/FortranRuntime/include/flang/Runtime/numeric.h
similarity index 100%
rename from flang/include/flang/Runtime/numeric.h
rename to FortranRuntime/include/flang/Runtime/numeric.h
diff --git a/flang/include/flang/Runtime/pointer.h b/FortranRuntime/include/flang/Runtime/pointer.h
similarity index 100%
rename from flang/include/flang/Runtime/pointer.h
rename to FortranRuntime/include/flang/Runtime/pointer.h
diff --git a/flang/include/flang/Runtime/ragged.h b/FortranRuntime/include/flang/Runtime/ragged.h
similarity index 97%
rename from flang/include/flang/Runtime/ragged.h
rename to FortranRuntime/include/flang/Runtime/ragged.h
index f52a619c55b43e..ff157ea16f081e 100644
--- a/flang/include/flang/Runtime/ragged.h
+++ b/FortranRuntime/include/flang/Runtime/ragged.h
@@ -1,4 +1,4 @@
-//===-- Runtime/ragged.h ----------------------------------------*- C++ -*-===//
+//===-- include/flang/Runtime/ragged.h --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Runtime/random.h b/FortranRuntime/include/flang/Runtime/random.h
similarity index 100%
rename from flang/include/flang/Runtime/random.h
rename to FortranRuntime/include/flang/Runtime/random.h
diff --git a/flang/include/flang/Runtime/reduce.h b/FortranRuntime/include/flang/Runtime/reduce.h
similarity index 100%
rename from flang/include/flang/Runtime/reduce.h
rename to FortranRuntime/include/flang/Runtime/reduce.h
diff --git a/flang/include/flang/Runtime/reduction.h b/FortranRuntime/include/flang/Runtime/reduction.h
similarity index 100%
rename from flang/include/flang/Runtime/reduction.h
rename to FortranRuntime/include/flang/Runtime/reduction.h
diff --git a/flang/include/flang/Runtime/stop.h b/FortranRuntime/include/flang/Runtime/stop.h
similarity index 100%
rename from flang/include/flang/Runtime/stop.h
rename to FortranRuntime/include/flang/Runtime/stop.h
diff --git a/flang/include/flang/Runtime/support.h b/FortranRuntime/include/flang/Runtime/support.h
similarity index 96%
rename from flang/include/flang/Runtime/support.h
rename to FortranRuntime/include/flang/Runtime/support.h
index ba9c2598bb0ddd..4a6d4357e87103 100644
--- a/flang/include/flang/Runtime/support.h
+++ b/FortranRuntime/include/flang/Runtime/support.h
@@ -10,7 +10,7 @@
 #ifndef FORTRAN_RUNTIME_SUPPORT_H_
 #define FORTRAN_RUNTIME_SUPPORT_H_
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/entry-names.h"
 #include <cstddef>
 #include <cstdint>
diff --git a/flang/include/flang/Runtime/temporary-stack.h b/FortranRuntime/include/flang/Runtime/temporary-stack.h
similarity index 100%
rename from flang/include/flang/Runtime/temporary-stack.h
rename to FortranRuntime/include/flang/Runtime/temporary-stack.h
diff --git a/flang/include/flang/Runtime/time-intrinsic.h b/FortranRuntime/include/flang/Runtime/time-intrinsic.h
similarity index 100%
rename from flang/include/flang/Runtime/time-intrinsic.h
rename to FortranRuntime/include/flang/Runtime/time-intrinsic.h
diff --git a/flang/include/flang/Runtime/transformational.h b/FortranRuntime/include/flang/Runtime/transformational.h
similarity index 100%
rename from flang/include/flang/Runtime/transformational.h
rename to FortranRuntime/include/flang/Runtime/transformational.h
diff --git a/flang/include/flang/Runtime/type-code.h b/FortranRuntime/include/flang/Runtime/type-code.h
similarity index 96%
rename from flang/include/flang/Runtime/type-code.h
rename to FortranRuntime/include/flang/Runtime/type-code.h
index 8e7314e0af1efc..3c1b03dfaa1140 100644
--- a/flang/include/flang/Runtime/type-code.h
+++ b/FortranRuntime/include/flang/Runtime/type-code.h
@@ -9,9 +9,9 @@
 #ifndef FORTRAN_RUNTIME_TYPE_CODE_H_
 #define FORTRAN_RUNTIME_TYPE_CODE_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/optional.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include <utility>
 
 namespace Fortran::runtime {
diff --git a/flang/unittests/Evaluate/fp-testing.h b/FortranRuntime/include/flang/Testing/fp-testing.h
similarity index 56%
rename from flang/unittests/Evaluate/fp-testing.h
rename to FortranRuntime/include/flang/Testing/fp-testing.h
index 22dfa2d7d80c60..16c6017e8529d5 100644
--- a/flang/unittests/Evaluate/fp-testing.h
+++ b/FortranRuntime/include/flang/Testing/fp-testing.h
@@ -1,12 +1,20 @@
+//===-- include/flang/Testing/fp-testing.h ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef FORTRAN_TEST_EVALUATE_FP_TESTING_H_
 #define FORTRAN_TEST_EVALUATE_FP_TESTING_H_
 
-#include "flang/Evaluate/target.h"
+#include "flang/Common/target-rounding.h"
 #include <fenv.h>
 
 using Fortran::common::RoundingMode;
-using Fortran::evaluate::RealFlags;
-using Fortran::evaluate::Rounding;
+using Fortran::common::RealFlags;
+using Fortran::common::Rounding;
 
 class ScopedHostFloatingPointEnvironment {
 public:
diff --git a/flang/unittests/Evaluate/testing.h b/FortranRuntime/include/flang/Testing/testing.h
similarity index 80%
rename from flang/unittests/Evaluate/testing.h
rename to FortranRuntime/include/flang/Testing/testing.h
index 422e2853c05bc6..d763109d62d373 100644
--- a/flang/unittests/Evaluate/testing.h
+++ b/FortranRuntime/include/flang/Testing/testing.h
@@ -1,3 +1,11 @@
+//===-- include/flang/Testing/testing.h -------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef FORTRAN_EVALUATE_TESTING_H_
 #define FORTRAN_EVALUATE_TESTING_H_
 
diff --git a/FortranRuntime/lib/CMakeLists.txt b/FortranRuntime/lib/CMakeLists.txt
new file mode 100644
index 00000000000000..8c4382078a8e70
--- /dev/null
+++ b/FortranRuntime/lib/CMakeLists.txt
@@ -0,0 +1,12 @@
+#===-- lib/CMakeLists.txt --------------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_subdirectory(Runtime)
+if (FORTRANRUNTIME_INCLUDE_TESTS)
+  add_subdirectory(Testing)
+endif ()
diff --git a/flang/lib/Decimal/big-radix-floating-point.h b/FortranRuntime/lib/Common/big-radix-floating-point.h
similarity index 98%
rename from flang/lib/Decimal/big-radix-floating-point.h
rename to FortranRuntime/lib/Common/big-radix-floating-point.h
index f9afebf5b3d703..7b8fb03710a3d4 100644
--- a/flang/lib/Decimal/big-radix-floating-point.h
+++ b/FortranRuntime/lib/Common/big-radix-floating-point.h
@@ -1,4 +1,4 @@
-//===-- lib/Decimal/big-radix-floating-point.h ------------------*- C++ -*-===//
+//===-- lib/Common/big-radix-floating-point.h -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -24,8 +24,8 @@
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Common/uint128.h"
-#include "flang/Decimal/binary-floating-point.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/binary-floating-point.h"
+#include "flang/Common/decimal.h"
 #include <cinttypes>
 #include <limits>
 #include <type_traits>
diff --git a/flang/lib/Decimal/binary-to-decimal.cpp b/FortranRuntime/lib/Common/binary-to-decimal.cpp
similarity index 99%
rename from flang/lib/Decimal/binary-to-decimal.cpp
rename to FortranRuntime/lib/Common/binary-to-decimal.cpp
index b64865e95df24d..fb2caefdae8fa1 100644
--- a/flang/lib/Decimal/binary-to-decimal.cpp
+++ b/FortranRuntime/lib/Common/binary-to-decimal.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Decimal/binary-to-decimal.cpp ---------------------------------===//
+//===-- lib/Common/binary-to-decimal.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "big-radix-floating-point.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 #include <cassert>
 #include <cfloat>
 #include <string>
diff --git a/flang/lib/Decimal/decimal-to-binary.cpp b/FortranRuntime/lib/Common/decimal-to-binary.cpp
similarity index 99%
rename from flang/lib/Decimal/decimal-to-binary.cpp
rename to FortranRuntime/lib/Common/decimal-to-binary.cpp
index 94c51774237399..0ef24d3bcfecfc 100644
--- a/flang/lib/Decimal/decimal-to-binary.cpp
+++ b/FortranRuntime/lib/Common/decimal-to-binary.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Decimal/decimal-to-binary.cpp ---------------------------------===//
+//===-- lib/Common/decimal-to-binary.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,8 +9,8 @@
 #include "big-radix-floating-point.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/leading-zero-bit-count.h"
-#include "flang/Decimal/binary-floating-point.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/binary-floating-point.h"
+#include "flang/Common/decimal.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include <cinttypes>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
new file mode 100644
index 00000000000000..3402dd5fe6af8f
--- /dev/null
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -0,0 +1,242 @@
+#===-- lib/Runtime/CMakeLists.txt ------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_subdirectory(Float128Math)
+
+set(sources
+  ISO_Fortran_binding.cpp
+  allocator-registry.cpp
+  allocatable.cpp
+  array-constructor.cpp
+  assign.cpp
+  buffer.cpp
+  character.cpp
+  command.cpp
+  complex-powi.cpp
+  complex-reduction.c
+  connection.cpp
+  copy.cpp
+  derived-api.cpp
+  derived.cpp
+  descriptor-io.cpp
+  descriptor.cpp
+  dot-product.cpp
+  edit-input.cpp
+  edit-output.cpp
+  environment.cpp
+  exceptions.cpp
+  execute.cpp
+  extensions.cpp
+  external-unit.cpp
+  extrema.cpp
+  file.cpp
+  findloc.cpp
+  format.cpp
+  inquiry.cpp
+  internal-unit.cpp
+  io-api.cpp
+  io-api-minimal.cpp
+  io-error.cpp
+  io-stmt.cpp
+  iso_fortran_env_impl.f90
+  iostat.cpp
+  main.cpp
+  matmul-transpose.cpp
+  matmul.cpp
+  memory.cpp
+  misc-intrinsic.cpp
+  namelist.cpp
+  non-tbp-dio.cpp
+  numeric.cpp
+  pointer.cpp
+  product.cpp
+  pseudo-unit.cpp
+  ragged.cpp
+  random.cpp
+  reduce.cpp
+  reduction.cpp
+  stat.cpp
+  stop.cpp
+  sum.cpp
+  support.cpp
+  temporary-stack.cpp
+  terminator.cpp
+  time-intrinsic.cpp
+  tools.cpp
+  transformational.cpp
+  type-code.cpp
+  type-info.cpp
+  unit-map.cpp
+  unit.cpp
+  utf.cpp
+  ../Common/binary-to-decimal.cpp
+  ../Common/decimal-to-binary.cpp
+)
+
+# List of files that are buildable for all devices.
+set(supported_files
+  ISO_Fortran_binding.cpp
+  allocatable.cpp
+  allocator-registry.cpp
+  array-constructor.cpp
+  assign.cpp
+  buffer.cpp
+  character.cpp
+  connection.cpp
+  copy.cpp
+  derived-api.cpp
+  derived.cpp
+  descriptor.cpp
+  descriptor-io.cpp
+  dot-product.cpp
+  edit-input.cpp
+  edit-output.cpp
+  environment.cpp
+  extrema.cpp
+  external-unit.cpp
+  file.cpp
+  findloc.cpp
+  format.cpp
+  inquiry.cpp
+  internal-unit.cpp
+  io-api.cpp
+  io-api-minimal.cpp
+  io-error.cpp
+  io-stmt.cpp
+  iostat.cpp
+  matmul-transpose.cpp
+  matmul.cpp
+  memory.cpp
+  misc-intrinsic.cpp
+  namelist.cpp
+  non-tbp-dio.cpp
+  numeric.cpp
+  pointer.cpp
+  product.cpp
+  pseudo-unit.cpp
+  ragged.cpp
+  stat.cpp
+  sum.cpp
+  support.cpp
+  terminator.cpp
+  tools.cpp
+  transformational.cpp
+  type-code.cpp
+  type-info.cpp
+  unit.cpp
+  utf.cpp
+  )
+
+
+  set(public_headers "")
+  file(GLOB_RECURSE public_headers 
+    "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Runtime/*.h" 
+    "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h" 
+    )
+
+
+  set(private_headers "")
+  file(GLOB_RECURSE private_headers 
+    "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h" 
+    "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h" 
+    )
+
+
+
+
+
+
+
+
+
+get_target_property(f128_sources
+  FortranFloat128MathILib INTERFACE_SOURCES
+  )
+if (f128_sources)
+  # The interface may define special macros for Float128Math files,
+  # so we need to propagate them.
+  get_target_property(f128_defs
+    FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS
+    )
+  set_property(SOURCE ${f128_sources}
+    APPEND PROPERTY COMPILE_DEFINITIONS
+    ${f128_defs}
+    )
+  list(APPEND sources ${f128_sources})
+endif()
+
+
+
+
+
+
+
+
+
+
+
+
+if (NOT DEFINED WIN32)
+  add_fortranruntime_library(FortranRuntime STATIC
+    ${sources}
+    INSTALL_WITH_TOOLCHAIN
+    ADDITIONAL_HEADERS ${public_headers} ${private_headers}
+  )
+
+  # For unittests that link to FortranRuntime. Should link to the static version of the library.
+  add_library(FortranRuntime.static ALIAS FortranRuntime)
+else()
+  # ${sources} also contains Fortran files. CMake write the generated Fortran files into the same directory (lib/Runtime/iso_fortran_env_impl.mod), so we need to compile it only once and add the object files to different runtime version.
+  add_fortranruntime_library(FortranRuntime.obj OBJECT
+      ${sources}
+ 
+      ADDITIONAL_HEADERS ${public_headers} ${private_headers}
+    )
+
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
+  add_fortranruntime_library(FortranRuntime.static STATIC $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN  #${sources}
+    )
+
+  
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
+  add_fortranruntime_library(FortranRuntime.dynamic SHARED $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources} 
+    )
+
+  
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
+  add_fortranruntime_library(FortranRuntime.static_dbg STATIC $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources}
+    )
+
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
+  add_fortranruntime_library(FortranRuntime.dynamic_dbg SHARED $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources}
+    )
+  target_link_libraries(FortranRuntime.dynamic_dbg PRIVATE FortranRuntime.obj)
+
+  # Target for building all versions of the runtime
+  add_custom_target(FortranRuntime)
+  set_target_properties(FortranRuntime PROPERTIES FOLDER "Fortran Runtime/Meta")
+  add_dependencies(FortranRuntime FortranRuntime.static FortranRuntime.dynamic
+    FortranRuntime.static_dbg FortranRuntime.dynamic_dbg)
+
+  if (MSVC)
+    # The Fortran files compiled with flang-new assumes libcall functions such as `__udivti3`
+    # Add LLVM_ENABLE_RUNTIMES=compiler-rt for it to be available during the runtimes build
+    # FIXME: Can embed linker command --dependent-lib into object files as already done with FortranRuntime.<mode>.lib
+    if (NOT TARGET clang_rt.builtins-x86_64)
+      message(WARNING
+        "compiler-rt needed when compiling with msvc\n"
+        "Flang/LLVM will emit code that calls into libgcc/compiler-rt, but using the MSVC linker will only link Microsoft's CRT automatically\n"
+        "Add compiler-rt to LLVM_ENABLE_RUNTIMES to fix"
+      )
+    endif ()
+    target_link_libraries(FortranRuntime.static PUBLIC clang_rt.builtins-x86_64)
+    target_link_libraries(FortranRuntime.dynamic PUBLIC clang_rt.builtins-x86_64)
+    target_link_libraries(FortranRuntime.static_dbg PUBLIC clang_rt.builtins-x86_64)
+    target_link_libraries(FortranRuntime.dynamic_dbg PUBLIC clang_rt.builtins-x86_64)
+  endif ()
+endif()
diff --git a/flang/runtime/CUDA/CMakeLists.txt b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
similarity index 93%
rename from flang/runtime/CUDA/CMakeLists.txt
rename to FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
index 81055b2737c0f1..f75b854d1eb3ba 100644
--- a/flang/runtime/CUDA/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- runtime/CUDA/CMakeLists.txt -----------------------------------------===#
+#===-- lib/Runtime/CUDA/CMakeLists.txt -------------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/CUDA/allocator.cpp b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
similarity index 94%
rename from flang/runtime/CUDA/allocator.cpp
rename to FortranRuntime/lib/Runtime/CUDA/allocator.cpp
index d4a473d58e86cd..379f52b45057a0 100644
--- a/flang/runtime/CUDA/allocator.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/CUDA/allocator.cpp ----------------------------------------===//
+//===-- lib/Runtime/CUDA/allocator.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 #include "../stat.h"
 #include "../terminator.h"
 #include "../type-info.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocator-registry.h"
 
diff --git a/flang/runtime/CUDA/descriptor.cpp b/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
similarity index 91%
rename from flang/runtime/CUDA/descriptor.cpp
rename to FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
index 1031b1e601b646..9664fea4ebc78a 100644
--- a/flang/runtime/CUDA/descriptor.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/CUDA/descriptor.cpp ---------------------------------------===//
+//===-- lib/Runtime/CUDA/descriptor.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/CMakeLists.txt b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
similarity index 98%
rename from flang/runtime/Float128Math/CMakeLists.txt
rename to FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
index a5f5bec1e7e4b8..1ff158c401855f 100644
--- a/flang/runtime/Float128Math/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- runtime/Float128Math/CMakeLists.txt ---------------------------------===#
+#===-- lib/Runtime/Float128Math/CMakeLists.txt -----------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/acos.cpp b/FortranRuntime/lib/Runtime/Float128Math/acos.cpp
similarity index 87%
rename from flang/runtime/Float128Math/acos.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/acos.cpp
index 14ff6944856844..7b15e4a0bfd3ae 100644
--- a/flang/runtime/Float128Math/acos.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/acos.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/acos.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/acos.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/acosh.cpp b/FortranRuntime/lib/Runtime/Float128Math/acosh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/acosh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/acosh.cpp
index 9d70804e44a470..c873259b4545b8 100644
--- a/flang/runtime/Float128Math/acosh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/acosh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/acosh.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/acosh.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/asin.cpp b/FortranRuntime/lib/Runtime/Float128Math/asin.cpp
similarity index 87%
rename from flang/runtime/Float128Math/asin.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/asin.cpp
index 6781b23f0363db..8866d51430197a 100644
--- a/flang/runtime/Float128Math/asin.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/asin.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/asin.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/asin.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/asinh.cpp b/FortranRuntime/lib/Runtime/Float128Math/asinh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/asinh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/asinh.cpp
index 1310bc61c1de0f..288193001ce1da 100644
--- a/flang/runtime/Float128Math/asinh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/asinh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/asinh.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/asinh.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/atan.cpp b/FortranRuntime/lib/Runtime/Float128Math/atan.cpp
similarity index 87%
rename from flang/runtime/Float128Math/atan.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/atan.cpp
index f01382df90c0ee..390c080b4d501b 100644
--- a/flang/runtime/Float128Math/atan.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/atan.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/atan.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/atan.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/atan2.cpp b/FortranRuntime/lib/Runtime/Float128Math/atan2.cpp
similarity index 88%
rename from flang/runtime/Float128Math/atan2.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/atan2.cpp
index dd646b0452b115..3c206b75704431 100644
--- a/flang/runtime/Float128Math/atan2.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/atan2.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/atan2.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/atan2.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/atanh.cpp b/FortranRuntime/lib/Runtime/Float128Math/atanh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/atanh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/atanh.cpp
index 5fc5ba5debc81a..77ceb188f04e42 100644
--- a/flang/runtime/Float128Math/atanh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/atanh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/atanh.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/atanh.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/ceil.cpp b/FortranRuntime/lib/Runtime/Float128Math/ceil.cpp
similarity index 87%
rename from flang/runtime/Float128Math/ceil.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/ceil.cpp
index ed4d164a62bedc..46bc253bd0922d 100644
--- a/flang/runtime/Float128Math/ceil.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/ceil.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/ceil.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/ceil.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/complex-math.c b/FortranRuntime/lib/Runtime/Float128Math/complex-math.c
similarity index 92%
rename from flang/runtime/Float128Math/complex-math.c
rename to FortranRuntime/lib/Runtime/Float128Math/complex-math.c
index d0180c63a0d7bf..f34ef7da76e599 100644
--- a/flang/runtime/Float128Math/complex-math.c
+++ b/FortranRuntime/lib/Runtime/Float128Math/complex-math.c
@@ -1,11 +1,10 @@
-/*===-- runtime/Float128Math/complex-math.c -------------------------*- C -*-===
+/*===-- lib/Runtime/Float128Math/complex-math.c ---------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 #include "complex-math.h"
 
diff --git a/flang/runtime/Float128Math/complex-math.h b/FortranRuntime/lib/Runtime/Float128Math/complex-math.h
similarity index 96%
rename from flang/runtime/Float128Math/complex-math.h
rename to FortranRuntime/lib/Runtime/Float128Math/complex-math.h
index 81dd53a175d1aa..6f5c7954bab035 100644
--- a/flang/runtime/Float128Math/complex-math.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/complex-math.h
@@ -1,4 +1,4 @@
-/*===-- runtime/Float128Math/complex-math.h -------------------------*- C -*-===
+/*===-- lib/Runtime/Float128Math/complex-math.h ---------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/cos.cpp b/FortranRuntime/lib/Runtime/Float128Math/cos.cpp
similarity index 87%
rename from flang/runtime/Float128Math/cos.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/cos.cpp
index b93c92f275f791..8ce47151e2914b 100644
--- a/flang/runtime/Float128Math/cos.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/cos.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/cos.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/cos.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/cosh.cpp b/FortranRuntime/lib/Runtime/Float128Math/cosh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/cosh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/cosh.cpp
index a3662a826dcb1c..f1ec45bcfb479d 100644
--- a/flang/runtime/Float128Math/cosh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/cosh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/cosh.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/cosh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/erf.cpp b/FortranRuntime/lib/Runtime/Float128Math/erf.cpp
similarity index 87%
rename from flang/runtime/Float128Math/erf.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/erf.cpp
index 631f71c76effe7..010088467794d1 100644
--- a/flang/runtime/Float128Math/erf.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/erf.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/erf.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/erf.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/erfc.cpp b/FortranRuntime/lib/Runtime/Float128Math/erfc.cpp
similarity index 87%
rename from flang/runtime/Float128Math/erfc.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/erfc.cpp
index ea3cd646d8c4ba..b226f8d2dc378b 100644
--- a/flang/runtime/Float128Math/erfc.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/erfc.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/erfc.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/erfc.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/exp.cpp b/FortranRuntime/lib/Runtime/Float128Math/exp.cpp
similarity index 87%
rename from flang/runtime/Float128Math/exp.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/exp.cpp
index b1161b0f29294c..e22f9df3579e96 100644
--- a/flang/runtime/Float128Math/exp.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/exp.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/exp.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/exp.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/exponent.cpp b/FortranRuntime/lib/Runtime/Float128Math/exponent.cpp
similarity index 90%
rename from flang/runtime/Float128Math/exponent.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/exponent.cpp
index 1be1dd0d0ac8b8..f07bf30bd1096f 100644
--- a/flang/runtime/Float128Math/exponent.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/exponent.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/exponent.cpp ---------------------------------===//
+//===-- lib/Runtime/Float128Math/exponent.cpp -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/floor.cpp b/FortranRuntime/lib/Runtime/Float128Math/floor.cpp
similarity index 87%
rename from flang/runtime/Float128Math/floor.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/floor.cpp
index 78a94984cac8a3..8744e6e2fec63c 100644
--- a/flang/runtime/Float128Math/floor.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/floor.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/floor.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/floor.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/fma.cpp b/FortranRuntime/lib/Runtime/Float128Math/fma.cpp
similarity index 89%
rename from flang/runtime/Float128Math/fma.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/fma.cpp
index ec67e8e6fba22b..198fec5d4bc356 100644
--- a/flang/runtime/Float128Math/fma.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/fma.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/fma.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/fma.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/fraction.cpp b/FortranRuntime/lib/Runtime/Float128Math/fraction.cpp
similarity index 87%
rename from flang/runtime/Float128Math/fraction.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/fraction.cpp
index 8c9889b7f6871e..d4749bf3eb7e0e 100644
--- a/flang/runtime/Float128Math/fraction.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/fraction.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/fraction.cpp ---------------------------------===//
+//===-- lib/Runtime/Float128Math/fraction.cpp -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/hypot.cpp b/FortranRuntime/lib/Runtime/Float128Math/hypot.cpp
similarity index 88%
rename from flang/runtime/Float128Math/hypot.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/hypot.cpp
index b4fa1d66bcfa6a..6542bf505060df 100644
--- a/flang/runtime/Float128Math/hypot.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/hypot.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/hypot.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/hypot.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/j0.cpp b/FortranRuntime/lib/Runtime/Float128Math/j0.cpp
similarity index 87%
rename from flang/runtime/Float128Math/j0.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/j0.cpp
index 9390a7eeb3c605..27e4338cdfc2b0 100644
--- a/flang/runtime/Float128Math/j0.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/j0.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/j0.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/j0.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/j1.cpp b/FortranRuntime/lib/Runtime/Float128Math/j1.cpp
similarity index 87%
rename from flang/runtime/Float128Math/j1.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/j1.cpp
index c54927123388c6..d3f897827f9f67 100644
--- a/flang/runtime/Float128Math/j1.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/j1.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/j1.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/j1.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/jn.cpp b/FortranRuntime/lib/Runtime/Float128Math/jn.cpp
similarity index 87%
rename from flang/runtime/Float128Math/jn.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/jn.cpp
index 15afd83400c320..681bb5b1ff3ad5 100644
--- a/flang/runtime/Float128Math/jn.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/jn.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/jn.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/jn.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/lgamma.cpp b/FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp
similarity index 87%
rename from flang/runtime/Float128Math/lgamma.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp
index ac31c89a912b32..0426db2e3b98d3 100644
--- a/flang/runtime/Float128Math/lgamma.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/lgamma.cpp -----------------------------------===//
+//===-- lib/Runtime/Float128Math/lgamma.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/llround.cpp b/FortranRuntime/lib/Runtime/Float128Math/llround.cpp
similarity index 88%
rename from flang/runtime/Float128Math/llround.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/llround.cpp
index b77281c507fe7c..4c9026cce00283 100644
--- a/flang/runtime/Float128Math/llround.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/llround.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/llround.cpp ----------------------------------===//
+//===-- lib/Runtime/Float128Math/llround.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/log.cpp b/FortranRuntime/lib/Runtime/Float128Math/log.cpp
similarity index 87%
rename from flang/runtime/Float128Math/log.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/log.cpp
index 38e6b581fd849c..a5a431ae5ffbbb 100644
--- a/flang/runtime/Float128Math/log.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/log.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/log.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/log.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/log10.cpp b/FortranRuntime/lib/Runtime/Float128Math/log10.cpp
similarity index 87%
rename from flang/runtime/Float128Math/log10.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/log10.cpp
index 3c89c0e707774f..9a83f57b6c736d 100644
--- a/flang/runtime/Float128Math/log10.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/log10.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/log10.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/log10.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/lround.cpp b/FortranRuntime/lib/Runtime/Float128Math/lround.cpp
similarity index 87%
rename from flang/runtime/Float128Math/lround.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/lround.cpp
index ce7a228038a1d3..65546881157948 100644
--- a/flang/runtime/Float128Math/lround.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/lround.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/lround.cpp -----------------------------------===//
+//===-- lib/Runtime/Float128Math/lround.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/math-entries.h b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
similarity index 99%
rename from flang/runtime/Float128Math/math-entries.h
rename to FortranRuntime/lib/Runtime/Float128Math/math-entries.h
index 13fdab26470038..798efdfb1e120c 100644
--- a/flang/runtime/Float128Math/math-entries.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/math-entries.h ---------------------*- C++ -*-===//
+//===-- lib/Runtime/Float128Math/math-entries.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/mod-real.cpp b/FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp
similarity index 89%
rename from flang/runtime/Float128Math/mod-real.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp
index 42e6ce76e2fa1b..e3b96d39e76ae6 100644
--- a/flang/runtime/Float128Math/mod-real.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/mod-real.cpp ---------------------------------===//
+//===-- lib/Runtime/Float128Math/mod-real.cpp -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/modulo-real.cpp b/FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp
similarity index 89%
rename from flang/runtime/Float128Math/modulo-real.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp
index 13000aba8c8323..8edf59e9f59dd4 100644
--- a/flang/runtime/Float128Math/modulo-real.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/modulo-real.cpp ------------------------------===//
+//===-- lib/Runtime/Float128Math/modulo-real.cpp ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/nearest.cpp b/FortranRuntime/lib/Runtime/Float128Math/nearest.cpp
similarity index 89%
rename from flang/runtime/Float128Math/nearest.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/nearest.cpp
index 148ac4ef839160..8b9f142d79ff93 100644
--- a/flang/runtime/Float128Math/nearest.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/nearest.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/nearest.cpp ----------------------------------===//
+//===-- lib/Runtime/Float128Math/nearest.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/norm2.cpp b/FortranRuntime/lib/Runtime/Float128Math/norm2.cpp
similarity index 93%
rename from flang/runtime/Float128Math/norm2.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/norm2.cpp
index 15c482f7f007ce..a0c26e40de0064 100644
--- a/flang/runtime/Float128Math/norm2.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/norm2.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/norm2.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/norm2.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/numeric-template-specs.h b/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
similarity index 96%
rename from flang/runtime/Float128Math/numeric-template-specs.h
rename to FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
index a0a77230c3e9eb..ca9696e18f6a92 100644
--- a/flang/runtime/Float128Math/numeric-template-specs.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/numeric-template-specs.h -----------*- C++ -*-===//
+//===-- lib/Runtime/Float128Math/numeric-template-specs.h -------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/pow.cpp b/FortranRuntime/lib/Runtime/Float128Math/pow.cpp
similarity index 88%
rename from flang/runtime/Float128Math/pow.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/pow.cpp
index 7a48828ee3e765..c11978ca068f23 100644
--- a/flang/runtime/Float128Math/pow.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/pow.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/pow.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/pow.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/random.cpp b/FortranRuntime/lib/Runtime/Float128Math/random.cpp
similarity index 89%
rename from flang/runtime/Float128Math/random.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/random.cpp
index cda962b416144e..a9dc3c7a82b673 100644
--- a/flang/runtime/Float128Math/random.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/random.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/random.cpp -----------------------------------===//
+//===-- lib/Runtime/Float128Math/random.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/round.cpp b/FortranRuntime/lib/Runtime/Float128Math/round.cpp
similarity index 89%
rename from flang/runtime/Float128Math/round.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/round.cpp
index 6420c1bc9cd25d..5a9366b3af4785 100644
--- a/flang/runtime/Float128Math/round.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/round.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/round.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/round.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/rrspacing.cpp b/FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp
similarity index 87%
rename from flang/runtime/Float128Math/rrspacing.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp
index feddac418eec39..2c501b3512c215 100644
--- a/flang/runtime/Float128Math/rrspacing.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/rrspacing.cpp --------------------------------===//
+//===-- lib/Runtime/Float128Math/rrspacing.cpp ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/scale.cpp b/FortranRuntime/lib/Runtime/Float128Math/scale.cpp
similarity index 90%
rename from flang/runtime/Float128Math/scale.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/scale.cpp
index 0be958bd9f2a72..859c955b8114e0 100644
--- a/flang/runtime/Float128Math/scale.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/scale.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/scale.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/scale.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/set-exponent.cpp b/FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp
similarity index 88%
rename from flang/runtime/Float128Math/set-exponent.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp
index 99c34af7962b9a..52258182871a14 100644
--- a/flang/runtime/Float128Math/set-exponent.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/set-exponent.cpp -----------------------------===//
+//===-- lib/Runtime/Float128Math/set-exponent.cpp ---------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/sin.cpp b/FortranRuntime/lib/Runtime/Float128Math/sin.cpp
similarity index 87%
rename from flang/runtime/Float128Math/sin.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/sin.cpp
index 8ebc3f9881586e..99aa4095c8cf1a 100644
--- a/flang/runtime/Float128Math/sin.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/sin.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/sin.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/sin.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/sinh.cpp b/FortranRuntime/lib/Runtime/Float128Math/sinh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/sinh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/sinh.cpp
index aa716a3e51ef5a..a7dfe36737de43 100644
--- a/flang/runtime/Float128Math/sinh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/sinh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/sinh.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/sinh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/spacing.cpp b/FortranRuntime/lib/Runtime/Float128Math/spacing.cpp
similarity index 87%
rename from flang/runtime/Float128Math/spacing.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/spacing.cpp
index a86c0b30e567ab..66a01851965840 100644
--- a/flang/runtime/Float128Math/spacing.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/spacing.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/spacing.cpp ----------------------------------===//
+//===-- lib/Runtime/Float128Math/spacing.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/sqrt.cpp b/FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp
similarity index 87%
rename from flang/runtime/Float128Math/sqrt.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp
index 83165a4c623191..cbc1e503d50fd9 100644
--- a/flang/runtime/Float128Math/sqrt.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/sqrt.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/sqrt.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/tan.cpp b/FortranRuntime/lib/Runtime/Float128Math/tan.cpp
similarity index 87%
rename from flang/runtime/Float128Math/tan.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/tan.cpp
index 8f4b723ca977bd..dbe4627f585f14 100644
--- a/flang/runtime/Float128Math/tan.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/tan.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/tan.cpp --------------------------------------===//
+//===-- lib/Runtime/Float128Math/tan.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/tanh.cpp b/FortranRuntime/lib/Runtime/Float128Math/tanh.cpp
similarity index 87%
rename from flang/runtime/Float128Math/tanh.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/tanh.cpp
index b43a89520b6797..37e40966ced722 100644
--- a/flang/runtime/Float128Math/tanh.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/tanh.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/tanh.cpp -------------------------------------===//
+//===-- lib/Runtime/Float128Math/tanh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/tgamma.cpp b/FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp
similarity index 87%
rename from flang/runtime/Float128Math/tgamma.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp
index 93f97800bdc966..07a019c6d9971f 100644
--- a/flang/runtime/Float128Math/tgamma.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/tgamma.cpp -----------------------------------===//
+//===-- lib/Runtime/Float128Math/tgamma.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/trunc.cpp b/FortranRuntime/lib/Runtime/Float128Math/trunc.cpp
similarity index 89%
rename from flang/runtime/Float128Math/trunc.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/trunc.cpp
index ca15a739c030e8..9f38bdc18e73c4 100644
--- a/flang/runtime/Float128Math/trunc.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/trunc.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/trunc.cpp ------------------------------------===//
+//===-- lib/Runtime/Float128Math/trunc.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/y0.cpp b/FortranRuntime/lib/Runtime/Float128Math/y0.cpp
similarity index 87%
rename from flang/runtime/Float128Math/y0.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/y0.cpp
index d6f39aac1053a8..6eaa3396e7ea07 100644
--- a/flang/runtime/Float128Math/y0.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/y0.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/y0.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/y0.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/y1.cpp b/FortranRuntime/lib/Runtime/Float128Math/y1.cpp
similarity index 87%
rename from flang/runtime/Float128Math/y1.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/y1.cpp
index 477d36a9ea3c66..c9f48ea0e26546 100644
--- a/flang/runtime/Float128Math/y1.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/y1.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/y1.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/y1.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/Float128Math/yn.cpp b/FortranRuntime/lib/Runtime/Float128Math/yn.cpp
similarity index 87%
rename from flang/runtime/Float128Math/yn.cpp
rename to FortranRuntime/lib/Runtime/Float128Math/yn.cpp
index 3a040cc8858970..6bc5f4996a88d5 100644
--- a/flang/runtime/Float128Math/yn.cpp
+++ b/FortranRuntime/lib/Runtime/Float128Math/yn.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/Float128Math/yn.cpp ---------------------------------------===//
+//===-- lib/Runtime/Float128Math/yn.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/ISO_Fortran_binding.cpp b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
similarity index 98%
rename from flang/runtime/ISO_Fortran_binding.cpp
rename to FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
index fe22026f31f55f..d2fab4bbc30b4d 100644
--- a/flang/runtime/ISO_Fortran_binding.cpp
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/ISO_Fortran_binding.cpp -----------------------------------===//
+//===-- lib/Runtime/ISO_Fortran_binding.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 
 #include "ISO_Fortran_util.h"
 #include "terminator.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/pointer.h"
 #include "flang/Runtime/type-code.h"
diff --git a/flang/runtime/ISO_Fortran_util.h b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
similarity index 96%
rename from flang/runtime/ISO_Fortran_util.h
rename to FortranRuntime/lib/Runtime/ISO_Fortran_util.h
index dd0eeef80bb896..c45e8fc7a8d253 100644
--- a/flang/runtime/ISO_Fortran_util.h
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
@@ -1,4 +1,4 @@
-//===-- runtime/ISO_Fortran_util.h ------------------------------*- C++ -*-===//
+//===-- lib/Runtime/ISO_Fortran_util.h --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
 // Internal utils for establishing CFI_cdesc_t descriptors.
 
 #include "terminator.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
 #include <cstdlib>
diff --git a/flang/runtime/allocatable.cpp b/FortranRuntime/lib/Runtime/allocatable.cpp
similarity index 98%
rename from flang/runtime/allocatable.cpp
rename to FortranRuntime/lib/Runtime/allocatable.cpp
index 5e065f47636a89..e3b43a5f813935 100644
--- a/flang/runtime/allocatable.cpp
+++ b/FortranRuntime/lib/Runtime/allocatable.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/allocatable.cpp -------------------------------------------===//
+//===-- lib/Runtime/allocatable.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
 #include "stat.h"
 #include "terminator.h"
 #include "type-info.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
 #include "flang/Runtime/descriptor.h"
 
diff --git a/flang/runtime/allocator-registry.cpp b/FortranRuntime/lib/Runtime/allocator-registry.cpp
similarity index 94%
rename from flang/runtime/allocator-registry.cpp
rename to FortranRuntime/lib/Runtime/allocator-registry.cpp
index f5670331d6dbe2..68fb8b80680558 100644
--- a/flang/runtime/allocator-registry.cpp
+++ b/FortranRuntime/lib/Runtime/allocator-registry.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/allocator-registry.cpp ------------------------------------===//
+//===-- lib/Runtime/allocator-registry.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/array-constructor.cpp b/FortranRuntime/lib/Runtime/array-constructor.cpp
similarity index 99%
rename from flang/runtime/array-constructor.cpp
rename to FortranRuntime/lib/Runtime/array-constructor.cpp
index 72e08feff7fd10..287d054887abf0 100644
--- a/flang/runtime/array-constructor.cpp
+++ b/FortranRuntime/lib/Runtime/array-constructor.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/array-constructor.cpp -------------------------------------===//
+//===-- lib/Runtime/array-constructor.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/assign-impl.h b/FortranRuntime/lib/Runtime/assign-impl.h
similarity index 93%
rename from flang/runtime/assign-impl.h
rename to FortranRuntime/lib/Runtime/assign-impl.h
index f07a501d1d1263..6bc8ef78c38a90 100644
--- a/flang/runtime/assign-impl.h
+++ b/FortranRuntime/lib/Runtime/assign-impl.h
@@ -1,4 +1,4 @@
-//===-- runtime/assign-impl.h -----------------------------------*- C++ -*-===//
+//===-- lib/Runtime/assign-impl.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/assign.cpp b/FortranRuntime/lib/Runtime/assign.cpp
similarity index 99%
rename from flang/runtime/assign.cpp
rename to FortranRuntime/lib/Runtime/assign.cpp
index d558ada51cd21a..7c5eb135d4cfdf 100644
--- a/flang/runtime/assign.cpp
+++ b/FortranRuntime/lib/Runtime/assign.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/assign.cpp ------------------------------------------------===//
+//===-- lib/Runtime/assign.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/buffer.cpp b/FortranRuntime/lib/Runtime/buffer.cpp
similarity index 92%
rename from flang/runtime/buffer.cpp
rename to FortranRuntime/lib/Runtime/buffer.cpp
index 7b4869d69c2e51..ce78fe34503c46 100644
--- a/flang/runtime/buffer.cpp
+++ b/FortranRuntime/lib/Runtime/buffer.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/buffer.cpp ------------------------------------------------===//
+//===-- lib/Runtime/buffer.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/buffer.h b/FortranRuntime/lib/Runtime/buffer.h
similarity index 99%
rename from flang/runtime/buffer.h
rename to FortranRuntime/lib/Runtime/buffer.h
index 41a1abb1b2d907..24e43734552e99 100644
--- a/flang/runtime/buffer.h
+++ b/FortranRuntime/lib/Runtime/buffer.h
@@ -1,4 +1,4 @@
-//===-- runtime/buffer.h ----------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/buffer.h ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/character.cpp b/FortranRuntime/lib/Runtime/character.cpp
similarity index 99%
rename from flang/runtime/character.cpp
rename to FortranRuntime/lib/Runtime/character.cpp
index 5049247397eb3c..73d3d93c5015f6 100644
--- a/flang/runtime/character.cpp
+++ b/FortranRuntime/lib/Runtime/character.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/character.cpp ---------------------------------------------===//
+//===-- lib/Runtime/character.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/command.cpp b/FortranRuntime/lib/Runtime/command.cpp
similarity index 98%
rename from flang/runtime/command.cpp
rename to FortranRuntime/lib/Runtime/command.cpp
index a555e26f96a66c..50a084714e69a4 100644
--- a/flang/runtime/command.cpp
+++ b/FortranRuntime/lib/Runtime/command.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/command.cpp -----------------------------------------------===//
+//===-- lib/Runtime/command.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/complex-powi.cpp b/FortranRuntime/lib/Runtime/complex-powi.cpp
similarity index 91%
rename from flang/runtime/complex-powi.cpp
rename to FortranRuntime/lib/Runtime/complex-powi.cpp
index 77031e40242791..2eacf56386b193 100644
--- a/flang/runtime/complex-powi.cpp
+++ b/FortranRuntime/lib/Runtime/complex-powi.cpp
@@ -1,11 +1,10 @@
-/*===-- flang/runtime/complex-powi.cpp ----------------------------*- C++ -*-===
- *
- * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- * See https://llvm.org/LICENSE.txt for license information.
- * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- *
- * ===-----------------------------------------------------------------------===
- */
+//===-- lib/Runtime/complex-powi.cpp ----------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
 #include "flang/Common/float128.h"
 #include "flang/Runtime/entry-names.h"
 #include <cstdint>
diff --git a/flang/runtime/complex-reduction.c b/FortranRuntime/lib/Runtime/complex-reduction.c
similarity index 97%
rename from flang/runtime/complex-reduction.c
rename to FortranRuntime/lib/Runtime/complex-reduction.c
index 37ce3fa410016b..138174e9122b1c 100644
--- a/flang/runtime/complex-reduction.c
+++ b/FortranRuntime/lib/Runtime/complex-reduction.c
@@ -1,11 +1,10 @@
-/*===-- flang/runtime/complex-reduction.c ---------------------------*- C -*-===
+/*===-- lib/Runtime/complex-reduction.c -----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 #include "complex-reduction.h"
 #include <float.h>
diff --git a/flang/runtime/complex-reduction.h b/FortranRuntime/lib/Runtime/complex-reduction.h
similarity index 97%
rename from flang/runtime/complex-reduction.h
rename to FortranRuntime/lib/Runtime/complex-reduction.h
index b0f19622fdb1a5..1ca5b9a33c4640 100644
--- a/flang/runtime/complex-reduction.h
+++ b/FortranRuntime/lib/Runtime/complex-reduction.h
@@ -1,11 +1,10 @@
-/*===-- flang/runtime/complex-reduction.h ---------------------------*- C -*-===
+/*===-- lib/Runtime/complex-reduction.h -----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 /* Wraps the C++-coded complex-valued SUM and PRODUCT reductions with
  * C-coded wrapper functions returning _Complex values, to avoid problems
diff --git a/flang/runtime/connection.cpp b/FortranRuntime/lib/Runtime/connection.cpp
similarity index 96%
rename from flang/runtime/connection.cpp
rename to FortranRuntime/lib/Runtime/connection.cpp
index f24f0e832eb484..f9e91f1f193ba0 100644
--- a/flang/runtime/connection.cpp
+++ b/FortranRuntime/lib/Runtime/connection.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/connection.cpp --------------------------------------------===//
+//===-- lib/Runtime/connection.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/connection.h b/FortranRuntime/lib/Runtime/connection.h
similarity index 98%
rename from flang/runtime/connection.h
rename to FortranRuntime/lib/Runtime/connection.h
index 6f1ea90a160e5e..f74e94ff6fb4a3 100644
--- a/flang/runtime/connection.h
+++ b/FortranRuntime/lib/Runtime/connection.h
@@ -1,4 +1,4 @@
-//===-- runtime/connection.h ------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/connection.h --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/copy.cpp b/FortranRuntime/lib/Runtime/copy.cpp
similarity index 99%
rename from flang/runtime/copy.cpp
rename to FortranRuntime/lib/Runtime/copy.cpp
index b20f68f019498b..72a86e3b80a7d5 100644
--- a/flang/runtime/copy.cpp
+++ b/FortranRuntime/lib/Runtime/copy.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/copy.cpp -------------------------------------------------===//
+//===-- lib/Runtime/copy.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/copy.h b/FortranRuntime/lib/Runtime/copy.h
similarity index 93%
rename from flang/runtime/copy.h
rename to FortranRuntime/lib/Runtime/copy.h
index 542660530bfb65..6d37b075e74504 100644
--- a/flang/runtime/copy.h
+++ b/FortranRuntime/lib/Runtime/copy.h
@@ -1,4 +1,4 @@
-//===-- runtime/copy.h ------------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/copy.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/derived-api.cpp b/FortranRuntime/lib/Runtime/derived-api.cpp
similarity index 98%
rename from flang/runtime/derived-api.cpp
rename to FortranRuntime/lib/Runtime/derived-api.cpp
index eca784be208d10..0bcdd45ddbbaec 100644
--- a/flang/runtime/derived-api.cpp
+++ b/FortranRuntime/lib/Runtime/derived-api.cpp
@@ -1,5 +1,4 @@
-//===-- runtime/derived-api.cpp
-//-----------------------------------------------===//
+//===-- lib/Runtime/derived-api.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/derived.cpp b/FortranRuntime/lib/Runtime/derived.cpp
similarity index 99%
rename from flang/runtime/derived.cpp
rename to FortranRuntime/lib/Runtime/derived.cpp
index 659f54fa344bb0..04d765211db63b 100644
--- a/flang/runtime/derived.cpp
+++ b/FortranRuntime/lib/Runtime/derived.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/derived.cpp -----------------------------------------------===//
+//===-- lib/Runtime/derived.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/derived.h b/FortranRuntime/lib/Runtime/derived.h
similarity index 94%
rename from flang/runtime/derived.h
rename to FortranRuntime/lib/Runtime/derived.h
index b4863df8db417c..27c04c7cc56969 100644
--- a/flang/runtime/derived.h
+++ b/FortranRuntime/lib/Runtime/derived.h
@@ -1,4 +1,4 @@
-//===-- runtime/derived.h -------------------------------------------------===//
+//===-- lib/Runtime/derived.h -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/descriptor-io.cpp b/FortranRuntime/lib/Runtime/descriptor-io.cpp
similarity index 98%
rename from flang/runtime/descriptor-io.cpp
rename to FortranRuntime/lib/Runtime/descriptor-io.cpp
index 380ad425d925f0..896fad16a67e8a 100644
--- a/flang/runtime/descriptor-io.cpp
+++ b/FortranRuntime/lib/Runtime/descriptor-io.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/descriptor-io.cpp -----------------------------------------===//
+//===-- lib/Runtime/descriptor-io.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/descriptor-io.h b/FortranRuntime/lib/Runtime/descriptor-io.h
similarity index 99%
rename from flang/runtime/descriptor-io.h
rename to FortranRuntime/lib/Runtime/descriptor-io.h
index ff5f683c6da52f..58cb091f852596 100644
--- a/flang/runtime/descriptor-io.h
+++ b/FortranRuntime/lib/Runtime/descriptor-io.h
@@ -1,4 +1,4 @@
-//===-- runtime/descriptor-io.h ---------------------------------*- C++ -*-===//
+//===-- lib/Runtime/descriptor-io.h -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/descriptor.cpp b/FortranRuntime/lib/Runtime/descriptor.cpp
similarity index 99%
rename from flang/runtime/descriptor.cpp
rename to FortranRuntime/lib/Runtime/descriptor.cpp
index 32f43e89dc7a36..f064fe3dcc32e9 100644
--- a/flang/runtime/descriptor.cpp
+++ b/FortranRuntime/lib/Runtime/descriptor.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/descriptor.cpp --------------------------------------------===//
+//===-- lib/Runtime/descriptor.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/dot-product.cpp b/FortranRuntime/lib/Runtime/dot-product.cpp
similarity index 99%
rename from flang/runtime/dot-product.cpp
rename to FortranRuntime/lib/Runtime/dot-product.cpp
index 977698269bcb46..9eb22790e38a69 100644
--- a/flang/runtime/dot-product.cpp
+++ b/FortranRuntime/lib/Runtime/dot-product.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/dot-product.cpp -------------------------------------------===//
+//===-- lib/Runtime/dot-product.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/edit-input.cpp b/FortranRuntime/lib/Runtime/edit-input.cpp
similarity index 99%
rename from flang/runtime/edit-input.cpp
rename to FortranRuntime/lib/Runtime/edit-input.cpp
index 2cee35e23f31a3..6ebb0e7aca4ade 100644
--- a/flang/runtime/edit-input.cpp
+++ b/FortranRuntime/lib/Runtime/edit-input.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/edit-input.cpp --------------------------------------------===//
+//===-- lib/Runtime/edit-input.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/edit-input.h b/FortranRuntime/lib/Runtime/edit-input.h
similarity index 95%
rename from flang/runtime/edit-input.h
rename to FortranRuntime/lib/Runtime/edit-input.h
index a90180b8ee2ebd..96dc3f561c22a7 100644
--- a/flang/runtime/edit-input.h
+++ b/FortranRuntime/lib/Runtime/edit-input.h
@@ -1,4 +1,4 @@
-//===-- runtime/edit-input.h ------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/edit-input.h --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 
 #include "format.h"
 #include "io-stmt.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 
 namespace Fortran::runtime::io {
 
diff --git a/flang/runtime/edit-output.cpp b/FortranRuntime/lib/Runtime/edit-output.cpp
similarity index 99%
rename from flang/runtime/edit-output.cpp
rename to FortranRuntime/lib/Runtime/edit-output.cpp
index 9d60732258bfbc..ccaf8085f016fd 100644
--- a/flang/runtime/edit-output.cpp
+++ b/FortranRuntime/lib/Runtime/edit-output.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/edit-output.cpp -------------------------------------------===//
+//===-- lib/Runtime/edit-output.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/edit-output.h b/FortranRuntime/lib/Runtime/edit-output.h
similarity index 98%
rename from flang/runtime/edit-output.h
rename to FortranRuntime/lib/Runtime/edit-output.h
index 365bc2e2a4d10b..7f303020a83a84 100644
--- a/flang/runtime/edit-output.h
+++ b/FortranRuntime/lib/Runtime/edit-output.h
@@ -1,4 +1,4 @@
-//===-- runtime/edit-output.h -----------------------------------*- C++ -*-===//
+//===-- lib/Runtime/edit-output.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -21,7 +21,7 @@
 #include "format.h"
 #include "io-stmt.h"
 #include "flang/Common/uint128.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 
 namespace Fortran::runtime::io {
 
diff --git a/flang/runtime/emit-encoded.h b/FortranRuntime/lib/Runtime/emit-encoded.h
similarity index 98%
rename from flang/runtime/emit-encoded.h
rename to FortranRuntime/lib/Runtime/emit-encoded.h
index 4b5e3900788357..f07fcced488435 100644
--- a/flang/runtime/emit-encoded.h
+++ b/FortranRuntime/lib/Runtime/emit-encoded.h
@@ -1,4 +1,4 @@
-//===-- runtime/emit-encoded.h ----------------------------------*- C++ -*-===//
+//===-- lib/Runtime/emit-encoded.h ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/environment-default-list.h b/FortranRuntime/lib/Runtime/environment-default-list.h
old mode 100755
new mode 100644
similarity index 85%
rename from flang/runtime/environment-default-list.h
rename to FortranRuntime/lib/Runtime/environment-default-list.h
index 4da261b10b9a84..6b7542516e7134
--- a/flang/runtime/environment-default-list.h
+++ b/FortranRuntime/lib/Runtime/environment-default-list.h
@@ -1,11 +1,10 @@
-/*===-- runtime/environment-default-list.h --------------------------*- C -*-===
+/*===-- lib/Runtime/environment-default-list.h ----------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- * ===-----------------------------------------------------------------------===
- */
+ *===----------------------------------------------------------------------===*/
 
 #ifndef FORTRAN_RUNTIME_ENVIRONMENT_DEFAULT_LIST_H_
 #define FORTRAN_RUNTIME_ENVIRONMENT_DEFAULT_LIST_H_
diff --git a/flang/runtime/environment.cpp b/FortranRuntime/lib/Runtime/environment.cpp
similarity index 98%
rename from flang/runtime/environment.cpp
rename to FortranRuntime/lib/Runtime/environment.cpp
index 52b1d99ba536ed..272914877988a5 100644
--- a/flang/runtime/environment.cpp
+++ b/FortranRuntime/lib/Runtime/environment.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/environment.cpp -------------------------------------------===//
+//===-- lib/Runtime/environment.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/environment.h b/FortranRuntime/lib/Runtime/environment.h
similarity index 95%
rename from flang/runtime/environment.h
rename to FortranRuntime/lib/Runtime/environment.h
index b8b9f10e4e57f5..71526d2b85d74c 100644
--- a/flang/runtime/environment.h
+++ b/FortranRuntime/lib/Runtime/environment.h
@@ -1,4 +1,4 @@
-//===-- runtime/environment.h -----------------------------------*- C++ -*-===//
+//===-- lib/Runtime/environment.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,7 +10,7 @@
 #define FORTRAN_RUNTIME_ENVIRONMENT_H_
 
 #include "flang/Common/optional.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 
 struct EnvironmentDefaultList;
 
diff --git a/flang/runtime/exceptions.cpp b/FortranRuntime/lib/Runtime/exceptions.cpp
similarity index 96%
rename from flang/runtime/exceptions.cpp
rename to FortranRuntime/lib/Runtime/exceptions.cpp
index 8239c556bcea97..7739130ae2346a 100644
--- a/flang/runtime/exceptions.cpp
+++ b/FortranRuntime/lib/Runtime/exceptions.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/exceptions.cpp --------------------------------------===//
+//===-- lib/Runtime/exceptions.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/execute.cpp b/FortranRuntime/lib/Runtime/execute.cpp
similarity index 99%
rename from flang/runtime/execute.cpp
rename to FortranRuntime/lib/Runtime/execute.cpp
index c7f8f386d81f4f..77aac164242612 100644
--- a/flang/runtime/execute.cpp
+++ b/FortranRuntime/lib/Runtime/execute.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/execute.cpp -----------------------------------------------===//
+//===-- lib/Runtime/execute.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/extensions.cpp b/FortranRuntime/lib/Runtime/extensions.cpp
similarity index 98%
rename from flang/runtime/extensions.cpp
rename to FortranRuntime/lib/Runtime/extensions.cpp
index be3833db88b07a..e75fa75893a82b 100644
--- a/flang/runtime/extensions.cpp
+++ b/FortranRuntime/lib/Runtime/extensions.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/extensions.cpp --------------------------------------------===//
+//===-- lib/Runtime/extensions.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/external-unit.cpp b/FortranRuntime/lib/Runtime/external-unit.cpp
similarity index 99%
rename from flang/runtime/external-unit.cpp
rename to FortranRuntime/lib/Runtime/external-unit.cpp
index d17a92622f8448..f5fa2c31dafc4e 100644
--- a/flang/runtime/external-unit.cpp
+++ b/FortranRuntime/lib/Runtime/external-unit.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/external-unit.cpp -----------------------------------------===//
+//===-- lib/Runtime/external-unit.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/extrema.cpp b/FortranRuntime/lib/Runtime/extrema.cpp
similarity index 99%
rename from flang/runtime/extrema.cpp
rename to FortranRuntime/lib/Runtime/extrema.cpp
index d6e9633372f524..be9da63d7bd6b8 100644
--- a/flang/runtime/extrema.cpp
+++ b/FortranRuntime/lib/Runtime/extrema.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/extrema.cpp -----------------------------------------------===//
+//===-- lib/Runtime/extrema.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/file.cpp b/FortranRuntime/lib/Runtime/file.cpp
similarity index 99%
rename from flang/runtime/file.cpp
rename to FortranRuntime/lib/Runtime/file.cpp
index ec772903242b80..44e3850cdfcb13 100644
--- a/flang/runtime/file.cpp
+++ b/FortranRuntime/lib/Runtime/file.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/file.cpp --------------------------------------------------===//
+//===-- lib/Runtime/file.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/file.h b/FortranRuntime/lib/Runtime/file.h
similarity index 98%
rename from flang/runtime/file.h
rename to FortranRuntime/lib/Runtime/file.h
index c06acbb9904cc1..6890cb62d66652 100644
--- a/flang/runtime/file.h
+++ b/FortranRuntime/lib/Runtime/file.h
@@ -1,4 +1,4 @@
-//===-- runtime/file.h ------------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/file.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/findloc.cpp b/FortranRuntime/lib/Runtime/findloc.cpp
similarity index 99%
rename from flang/runtime/findloc.cpp
rename to FortranRuntime/lib/Runtime/findloc.cpp
index 674a21ae50b853..da5fe0c0a0a467 100644
--- a/flang/runtime/findloc.cpp
+++ b/FortranRuntime/lib/Runtime/findloc.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/findloc.cpp -----------------------------------------------===//
+//===-- lib/Runtime/findloc.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/format-implementation.h b/FortranRuntime/lib/Runtime/format-implementation.h
similarity index 99%
rename from flang/runtime/format-implementation.h
rename to FortranRuntime/lib/Runtime/format-implementation.h
index 46204ca927c135..2ed6006c3b2fa0 100644
--- a/flang/runtime/format-implementation.h
+++ b/FortranRuntime/lib/Runtime/format-implementation.h
@@ -1,4 +1,4 @@
-//===-- runtime/format-implementation.h -------------------------*- C++ -*-===//
+//===-- lib/Runtime/format-implementation.h ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -16,7 +16,7 @@
 #include "io-stmt.h"
 #include "memory.h"
 #include "flang/Common/format.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 #include "flang/Runtime/main.h"
 #include <algorithm>
 #include <cstring>
diff --git a/flang/runtime/format.cpp b/FortranRuntime/lib/Runtime/format.cpp
similarity index 92%
rename from flang/runtime/format.cpp
rename to FortranRuntime/lib/Runtime/format.cpp
index 433acce4b73739..73a61f785c23b8 100644
--- a/flang/runtime/format.cpp
+++ b/FortranRuntime/lib/Runtime/format.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/format.cpp ------------------------------------------------===//
+//===-- lib/Runtime/format.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/format.h b/FortranRuntime/lib/Runtime/format.h
similarity index 98%
rename from flang/runtime/format.h
rename to FortranRuntime/lib/Runtime/format.h
index 5329f2482d3e46..b9c6979d1c2c98 100644
--- a/flang/runtime/format.h
+++ b/FortranRuntime/lib/Runtime/format.h
@@ -1,4 +1,4 @@
-//===-- runtime/format.h ----------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/format.h ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -13,9 +13,9 @@
 
 #include "environment.h"
 #include "io-error.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/optional.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include <cinttypes>
 
diff --git a/flang/runtime/inquiry.cpp b/FortranRuntime/lib/Runtime/inquiry.cpp
similarity index 97%
rename from flang/runtime/inquiry.cpp
rename to FortranRuntime/lib/Runtime/inquiry.cpp
index 9fbcaa96fa3c43..9a5ef0cea210db 100644
--- a/flang/runtime/inquiry.cpp
+++ b/FortranRuntime/lib/Runtime/inquiry.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/inquiry.cpp --------------------------------------===//
+//===-- lib/Runtime/inquiry.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/internal-unit.cpp b/FortranRuntime/lib/Runtime/internal-unit.cpp
similarity index 98%
rename from flang/runtime/internal-unit.cpp
rename to FortranRuntime/lib/Runtime/internal-unit.cpp
index f28700ee015815..95d371a49ac187 100644
--- a/flang/runtime/internal-unit.cpp
+++ b/FortranRuntime/lib/Runtime/internal-unit.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/internal-unit.cpp -----------------------------------------===//
+//===-- lib/Runtime/internal-unit.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/internal-unit.h b/FortranRuntime/lib/Runtime/internal-unit.h
similarity index 97%
rename from flang/runtime/internal-unit.h
rename to FortranRuntime/lib/Runtime/internal-unit.h
index a0ee6353eeda3b..444bc9ab515994 100644
--- a/flang/runtime/internal-unit.h
+++ b/FortranRuntime/lib/Runtime/internal-unit.h
@@ -1,4 +1,4 @@
-//===-- runtime/internal-unit.h ---------------------------------*- C++ -*-===//
+//===-- lib/Runtime/internal-unit.h -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-api-common.h b/FortranRuntime/lib/Runtime/io-api-common.h
similarity index 98%
rename from flang/runtime/io-api-common.h
rename to FortranRuntime/lib/Runtime/io-api-common.h
index c7b86cab73a525..9b4c3405b0991e 100644
--- a/flang/runtime/io-api-common.h
+++ b/FortranRuntime/lib/Runtime/io-api-common.h
@@ -1,4 +1,4 @@
-//===-- runtime/io-api-common.h ---------------------------------*- C++ -*-===//
+//===-- lib/Runtime/io-api-common.h -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-api-minimal.cpp b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
similarity index 98%
rename from flang/runtime/io-api-minimal.cpp
rename to FortranRuntime/lib/Runtime/io-api-minimal.cpp
index ad76fe3de0324c..6bc262cae78458 100644
--- a/flang/runtime/io-api-minimal.cpp
+++ b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/io-api-minimal.cpp ----------------------------------------===//
+//===-- lib/Runtime/io-api-minimal.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-api.cpp b/FortranRuntime/lib/Runtime/io-api.cpp
similarity index 99%
rename from flang/runtime/io-api.cpp
rename to FortranRuntime/lib/Runtime/io-api.cpp
index e3c6b9e5ca8959..f4a396d4c49a45 100644
--- a/flang/runtime/io-api.cpp
+++ b/FortranRuntime/lib/Runtime/io-api.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/io-api.cpp ------------------------------------------------===//
+//===-- lib/Runtime/io-api.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-error.cpp b/FortranRuntime/lib/Runtime/io-error.cpp
similarity index 98%
rename from flang/runtime/io-error.cpp
rename to FortranRuntime/lib/Runtime/io-error.cpp
index 7a90966f81047f..053667462058de 100644
--- a/flang/runtime/io-error.cpp
+++ b/FortranRuntime/lib/Runtime/io-error.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/io-error.cpp ----------------------------------------------===//
+//===-- lib/Runtime/io-error.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-error.h b/FortranRuntime/lib/Runtime/io-error.h
similarity index 97%
rename from flang/runtime/io-error.h
rename to FortranRuntime/lib/Runtime/io-error.h
index 426573e2faf00c..b03e07567a0607 100644
--- a/flang/runtime/io-error.h
+++ b/FortranRuntime/lib/Runtime/io-error.h
@@ -1,4 +1,4 @@
-//===-- runtime/io-error.h --------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/io-error.h ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-stmt.cpp b/FortranRuntime/lib/Runtime/io-stmt.cpp
similarity index 99%
rename from flang/runtime/io-stmt.cpp
rename to FortranRuntime/lib/Runtime/io-stmt.cpp
index 265bd0dc9d9499..80c96710eb49ca 100644
--- a/flang/runtime/io-stmt.cpp
+++ b/FortranRuntime/lib/Runtime/io-stmt.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/io-stmt.cpp -----------------------------------------------===//
+//===-- lib/Runtime/io-stmt.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/io-stmt.h b/FortranRuntime/lib/Runtime/io-stmt.h
similarity index 99%
rename from flang/runtime/io-stmt.h
rename to FortranRuntime/lib/Runtime/io-stmt.h
index 2e0ca46078ecdc..e90e64c8fd1ff3 100644
--- a/flang/runtime/io-stmt.h
+++ b/FortranRuntime/lib/Runtime/io-stmt.h
@@ -1,4 +1,4 @@
-//===-- runtime/io-stmt.h ---------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/io-stmt.h -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/iostat.cpp b/FortranRuntime/lib/Runtime/iostat.cpp
similarity index 98%
rename from flang/runtime/iostat.cpp
rename to FortranRuntime/lib/Runtime/iostat.cpp
index 39e224cb01286b..f23567be4910da 100644
--- a/flang/runtime/iostat.cpp
+++ b/FortranRuntime/lib/Runtime/iostat.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/iostat.cpp ------------------------------------------------===//
+//===-- lib/Runtime/iostat.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/module/iso_fortran_env_impl.f90 b/FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90
similarity index 98%
rename from flang/module/iso_fortran_env_impl.f90
rename to FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90
index 4de54dda7bab1c..1a4da69266c55b 100644
--- a/flang/module/iso_fortran_env_impl.f90
+++ b/FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90
@@ -1,4 +1,4 @@
-!===-- module/iso_fortran_env_impl.f90 --=--------------------------------===!
+!===-- lib/Runtime/iso_fortran_env_impl.f90 --------------------------------===!
 !
 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 ! See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/lock.h b/FortranRuntime/lib/Runtime/lock.h
similarity index 97%
rename from flang/runtime/lock.h
rename to FortranRuntime/lib/Runtime/lock.h
index 46ca28703a45b4..75c1adb12a8c62 100644
--- a/flang/runtime/lock.h
+++ b/FortranRuntime/lib/Runtime/lock.h
@@ -1,4 +1,4 @@
-//===-- runtime/lock.h ------------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/lock.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/main.cpp b/FortranRuntime/lib/Runtime/main.cpp
similarity index 94%
rename from flang/runtime/main.cpp
rename to FortranRuntime/lib/Runtime/main.cpp
index 96454989581b71..3fe985e524548d 100644
--- a/flang/runtime/main.cpp
+++ b/FortranRuntime/lib/Runtime/main.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/main.cpp --------------------------------------------------===//
+//===-- lib/Runtime/main.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/matmul-transpose.cpp b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
similarity index 99%
rename from flang/runtime/matmul-transpose.cpp
rename to FortranRuntime/lib/Runtime/matmul-transpose.cpp
index 283472650a1c69..d493333dfa9877 100644
--- a/flang/runtime/matmul-transpose.cpp
+++ b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/matmul-transpose.cpp --------------------------------------===//
+//===-- lib/Runtime/matmul-transpose.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/matmul.cpp b/FortranRuntime/lib/Runtime/matmul.cpp
similarity index 99%
rename from flang/runtime/matmul.cpp
rename to FortranRuntime/lib/Runtime/matmul.cpp
index 252557e2f9e7ad..124369e72886c5 100644
--- a/flang/runtime/matmul.cpp
+++ b/FortranRuntime/lib/Runtime/matmul.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/matmul.cpp ------------------------------------------------===//
+//===-- lib/Runtime/matmul.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/memory.cpp b/FortranRuntime/lib/Runtime/memory.cpp
similarity index 93%
rename from flang/runtime/memory.cpp
rename to FortranRuntime/lib/Runtime/memory.cpp
index c7068ad6479a12..4a811107ca220a 100644
--- a/flang/runtime/memory.cpp
+++ b/FortranRuntime/lib/Runtime/memory.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/memory.cpp ------------------------------------------------===//
+//===-- lib/Runtime/memory.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/misc-intrinsic.cpp b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
similarity index 98%
rename from flang/runtime/misc-intrinsic.cpp
rename to FortranRuntime/lib/Runtime/misc-intrinsic.cpp
index f7d893829fc0d3..b942d762e76ab3 100644
--- a/flang/runtime/misc-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/misc-intrinsic.cpp ----------------------------------------===//
+//===-- lib/Runtime/misc-intrinsic.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/namelist.cpp b/FortranRuntime/lib/Runtime/namelist.cpp
similarity index 99%
rename from flang/runtime/namelist.cpp
rename to FortranRuntime/lib/Runtime/namelist.cpp
index af092de70f7819..e6229d56577568 100644
--- a/flang/runtime/namelist.cpp
+++ b/FortranRuntime/lib/Runtime/namelist.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/namelist.cpp ----------------------------------------------===//
+//===-- lib/Runtime/namelist.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/namelist.h b/FortranRuntime/lib/Runtime/namelist.h
similarity index 96%
rename from flang/runtime/namelist.h
rename to FortranRuntime/lib/Runtime/namelist.h
index 25216a75e9367d..4694b3104a9c75 100644
--- a/flang/runtime/namelist.h
+++ b/FortranRuntime/lib/Runtime/namelist.h
@@ -1,4 +1,4 @@
-//===-- runtime/namelist.h --------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/namelist.h ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/non-tbp-dio.cpp b/FortranRuntime/lib/Runtime/non-tbp-dio.cpp
similarity index 93%
rename from flang/runtime/non-tbp-dio.cpp
rename to FortranRuntime/lib/Runtime/non-tbp-dio.cpp
index 9419adb7631cc9..9fa04397bc9610 100644
--- a/flang/runtime/non-tbp-dio.cpp
+++ b/FortranRuntime/lib/Runtime/non-tbp-dio.cpp
@@ -1,4 +1,4 @@
-//===-- flang/runtime/non-tbp-dio.cpp ---------------------------*- C++ -*-===//
+//===-- lib/Runtime/non-tbp-dio.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/non-tbp-dio.h b/FortranRuntime/lib/Runtime/non-tbp-dio.h
similarity index 93%
rename from flang/runtime/non-tbp-dio.h
rename to FortranRuntime/lib/Runtime/non-tbp-dio.h
index 05038a264ed992..0a45c96a3f2e25 100644
--- a/flang/runtime/non-tbp-dio.h
+++ b/FortranRuntime/lib/Runtime/non-tbp-dio.h
@@ -1,4 +1,4 @@
-//===-- flang/runtime/non-tbp-dio.h -----------------------------*- C++ -*-===//
+//===-- lib/Runtime/non-tbp-dio.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -22,7 +22,8 @@
 #ifndef FORTRAN_RUNTIME_NON_TBP_DIO_H_
 #define FORTRAN_RUNTIME_NON_TBP_DIO_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Common/api-attrs.h"
 #include <cstddef>
 
 namespace Fortran::runtime::typeInfo {
diff --git a/flang/runtime/numeric-templates.h b/FortranRuntime/lib/Runtime/numeric-templates.h
similarity index 99%
rename from flang/runtime/numeric-templates.h
rename to FortranRuntime/lib/Runtime/numeric-templates.h
index 1b43498a6bfd12..640c6d17c4b580 100644
--- a/flang/runtime/numeric-templates.h
+++ b/FortranRuntime/lib/Runtime/numeric-templates.h
@@ -1,4 +1,4 @@
-//===-- runtime/numeric-templates.h -----------------------------*- C++ -*-===//
+//===-- lib/Runtime/numeric-templates.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/numeric.cpp b/FortranRuntime/lib/Runtime/numeric.cpp
similarity index 99%
rename from flang/runtime/numeric.cpp
rename to FortranRuntime/lib/Runtime/numeric.cpp
index 9a8ddc6615564d..b0f68a7fc81d29 100644
--- a/flang/runtime/numeric.cpp
+++ b/FortranRuntime/lib/Runtime/numeric.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/numeric.cpp -----------------------------------------------===//
+//===-- lib/Runtime/numeric.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/pointer.cpp b/FortranRuntime/lib/Runtime/pointer.cpp
similarity index 99%
rename from flang/runtime/pointer.cpp
rename to FortranRuntime/lib/Runtime/pointer.cpp
index 2979181ddd61bd..fba9e639fa37a8 100644
--- a/flang/runtime/pointer.cpp
+++ b/FortranRuntime/lib/Runtime/pointer.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/pointer.cpp -----------------------------------------------===//
+//===-- lib/Runtime/pointer.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/product.cpp b/FortranRuntime/lib/Runtime/product.cpp
similarity index 98%
rename from flang/runtime/product.cpp
rename to FortranRuntime/lib/Runtime/product.cpp
index 7fc0fcd3b107de..e4a6e81bd0c508 100644
--- a/flang/runtime/product.cpp
+++ b/FortranRuntime/lib/Runtime/product.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/product.cpp -----------------------------------------------===//
+//===-- lib/Runtime/product.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/pseudo-unit.cpp b/FortranRuntime/lib/Runtime/pseudo-unit.cpp
similarity index 98%
rename from flang/runtime/pseudo-unit.cpp
rename to FortranRuntime/lib/Runtime/pseudo-unit.cpp
index 526afd11d916e9..62c6b1df5071c7 100644
--- a/flang/runtime/pseudo-unit.cpp
+++ b/FortranRuntime/lib/Runtime/pseudo-unit.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/pseudo-unit.cpp -------------------------------------------===//
+//===-- lib/Runtime/pseudo-unit.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/ragged.cpp b/FortranRuntime/lib/Runtime/ragged.cpp
similarity index 97%
rename from flang/runtime/ragged.cpp
rename to FortranRuntime/lib/Runtime/ragged.cpp
index a4d9e541ba5311..681a800e29dca7 100644
--- a/flang/runtime/ragged.cpp
+++ b/FortranRuntime/lib/Runtime/ragged.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/ragged.cpp ------------------------------------------------===//
+//===-- lib/Runtime/ragged.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/random-templates.h b/FortranRuntime/lib/Runtime/random-templates.h
similarity index 97%
rename from flang/runtime/random-templates.h
rename to FortranRuntime/lib/Runtime/random-templates.h
index f34422f6f5d9ac..4faca63ba34b9d 100644
--- a/flang/runtime/random-templates.h
+++ b/FortranRuntime/lib/Runtime/random-templates.h
@@ -1,4 +1,4 @@
-//===-- runtime/random-templates.h ------------------------------*- C++ -*-===//
+//===-- lib/Runtime/random-templates.h --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/random.cpp b/FortranRuntime/lib/Runtime/random.cpp
similarity index 98%
rename from flang/runtime/random.cpp
rename to FortranRuntime/lib/Runtime/random.cpp
index 69de9b8c96fb5d..343b0a389fcaf6 100644
--- a/flang/runtime/random.cpp
+++ b/FortranRuntime/lib/Runtime/random.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/random.cpp ------------------------------------------------===//
+//===-- lib/Runtime/random.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/reduce.cpp b/FortranRuntime/lib/Runtime/reduce.cpp
similarity index 99%
rename from flang/runtime/reduce.cpp
rename to FortranRuntime/lib/Runtime/reduce.cpp
index 2f4bb6ea159cf4..c3e7ef74363431 100644
--- a/flang/runtime/reduce.cpp
+++ b/FortranRuntime/lib/Runtime/reduce.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/reduce.cpp ------------------------------------------------===//
+//===-- lib/Runtime/reduce.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/reduction-templates.h b/FortranRuntime/lib/Runtime/reduction-templates.h
similarity index 99%
rename from flang/runtime/reduction-templates.h
rename to FortranRuntime/lib/Runtime/reduction-templates.h
index a51404c9637620..ba193a9f0e3b9d 100644
--- a/flang/runtime/reduction-templates.h
+++ b/FortranRuntime/lib/Runtime/reduction-templates.h
@@ -1,4 +1,4 @@
-//===-- runtime/reduction-templates.h ---------------------------*- C++ -*-===//
+//===-- lib/Runtime/reduction-templates.h -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/reduction.cpp b/FortranRuntime/lib/Runtime/reduction.cpp
similarity index 99%
rename from flang/runtime/reduction.cpp
rename to FortranRuntime/lib/Runtime/reduction.cpp
index 074a270cb50838..0de7dd07b17a5b 100644
--- a/flang/runtime/reduction.cpp
+++ b/FortranRuntime/lib/Runtime/reduction.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/reduction.cpp ---------------------------------------------===//
+//===-- lib/Runtime/reduction.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/stack.h b/FortranRuntime/lib/Runtime/stack.h
similarity index 98%
rename from flang/runtime/stack.h
rename to FortranRuntime/lib/Runtime/stack.h
index b6e6edb595e9ad..974ccb9d30b0eb 100644
--- a/flang/runtime/stack.h
+++ b/FortranRuntime/lib/Runtime/stack.h
@@ -1,4 +1,4 @@
-//===-- runtime/stack.h -----------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/stack.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/stat.cpp b/FortranRuntime/lib/Runtime/stat.cpp
similarity index 97%
rename from flang/runtime/stat.cpp
rename to FortranRuntime/lib/Runtime/stat.cpp
index 525a4e36cdc773..d483f75998a746 100644
--- a/flang/runtime/stat.cpp
+++ b/FortranRuntime/lib/Runtime/stat.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/stat.cpp --------------------------------------------------===//
+//===-- lib/Runtime/stat.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/stat.h b/FortranRuntime/lib/Runtime/stat.h
similarity index 95%
rename from flang/runtime/stat.h
rename to FortranRuntime/lib/Runtime/stat.h
index 71faeb027d9085..9f56d88f588a1e 100644
--- a/flang/runtime/stat.h
+++ b/FortranRuntime/lib/Runtime/stat.h
@@ -1,4 +1,4 @@
-//===-- runtime/stat.h ------------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/stat.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
 #ifndef FORTRAN_RUNTIME_STAT_H_
 #define FORTRAN_RUNTIME_STAT_H_
 #include "flang/Common/api-attrs.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/magic-numbers.h"
 namespace Fortran::runtime {
 
diff --git a/flang/runtime/stop.cpp b/FortranRuntime/lib/Runtime/stop.cpp
similarity index 98%
rename from flang/runtime/stop.cpp
rename to FortranRuntime/lib/Runtime/stop.cpp
index cfb36b40840200..8465a53168e551 100644
--- a/flang/runtime/stop.cpp
+++ b/FortranRuntime/lib/Runtime/stop.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/stop.cpp --------------------------------------------------===//
+//===-- lib/Runtime/stop.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/sum.cpp b/FortranRuntime/lib/Runtime/sum.cpp
similarity index 98%
rename from flang/runtime/sum.cpp
rename to FortranRuntime/lib/Runtime/sum.cpp
index 63d8c9029a0ef5..64982b9fd53690 100644
--- a/flang/runtime/sum.cpp
+++ b/FortranRuntime/lib/Runtime/sum.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/sum.cpp ---------------------------------------------------===//
+//===-- lib/Runtime/sum.cpp -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/support.cpp b/FortranRuntime/lib/Runtime/support.cpp
similarity index 94%
rename from flang/runtime/support.cpp
rename to FortranRuntime/lib/Runtime/support.cpp
index a607120256d9d9..1dffa99191bae1 100644
--- a/flang/runtime/support.cpp
+++ b/FortranRuntime/lib/Runtime/support.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/support.cpp -----------------------------------------------===//
+//===-- lib/Runtime/support.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/temporary-stack.cpp b/FortranRuntime/lib/Runtime/temporary-stack.cpp
similarity index 98%
rename from flang/runtime/temporary-stack.cpp
rename to FortranRuntime/lib/Runtime/temporary-stack.cpp
index 667b10e04dbd29..12fa18586b7421 100644
--- a/flang/runtime/temporary-stack.cpp
+++ b/FortranRuntime/lib/Runtime/temporary-stack.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/temporary-stack.cpp ---------------------------------------===//
+//===-- lib/Runtime/temporary-stack.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 
 #include "flang/Runtime/temporary-stack.h"
 #include "terminator.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/memory.h"
diff --git a/flang/runtime/terminator.cpp b/FortranRuntime/lib/Runtime/terminator.cpp
similarity index 97%
rename from flang/runtime/terminator.cpp
rename to FortranRuntime/lib/Runtime/terminator.cpp
index bab9edc64fa35b..4146e28235511f 100644
--- a/flang/runtime/terminator.cpp
+++ b/FortranRuntime/lib/Runtime/terminator.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/terminate.cpp ---------------------------------------------===//
+//===-- lib/Runtime/terminator.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/terminator.h b/FortranRuntime/lib/Runtime/terminator.h
similarity index 98%
rename from flang/runtime/terminator.h
rename to FortranRuntime/lib/Runtime/terminator.h
index 609f059d6e0921..02b3a4c4f066f8 100644
--- a/flang/runtime/terminator.h
+++ b/FortranRuntime/lib/Runtime/terminator.h
@@ -1,4 +1,4 @@
-//===-- runtime/terminator.h ------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/terminator.h --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/time-intrinsic.cpp b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
similarity index 99%
rename from flang/runtime/time-intrinsic.cpp
rename to FortranRuntime/lib/Runtime/time-intrinsic.cpp
index e6f6e81c7b50cc..05f7e4f80f18b6 100644
--- a/flang/runtime/time-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/time-intrinsic.cpp ----------------------------------------===//
+//===-- lib/Runtime/time-intrinsic.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/tools.cpp b/FortranRuntime/lib/Runtime/tools.cpp
similarity index 99%
rename from flang/runtime/tools.cpp
rename to FortranRuntime/lib/Runtime/tools.cpp
index 73d6c2cf7e1d2b..d5c113a31fc501 100644
--- a/flang/runtime/tools.cpp
+++ b/FortranRuntime/lib/Runtime/tools.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/tools.cpp -------------------------------------------------===//
+//===-- lib/Runtime/tools.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/tools.h b/FortranRuntime/lib/Runtime/tools.h
similarity index 99%
rename from flang/runtime/tools.h
rename to FortranRuntime/lib/Runtime/tools.h
index dc12e5c4533e2e..b57c7996135913 100644
--- a/flang/runtime/tools.h
+++ b/FortranRuntime/lib/Runtime/tools.h
@@ -1,4 +1,4 @@
-//===-- runtime/tools.h -----------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/tools.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/transformational.cpp b/FortranRuntime/lib/Runtime/transformational.cpp
similarity index 99%
rename from flang/runtime/transformational.cpp
rename to FortranRuntime/lib/Runtime/transformational.cpp
index b6b204be4418c9..8c244fc296f3b9 100644
--- a/flang/runtime/transformational.cpp
+++ b/FortranRuntime/lib/Runtime/transformational.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/transformational.cpp --------------------------------------===//
+//===-- lib/Runtime/transformational.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/type-code.cpp b/FortranRuntime/lib/Runtime/type-code.cpp
similarity index 98%
rename from flang/runtime/type-code.cpp
rename to FortranRuntime/lib/Runtime/type-code.cpp
index cb1b944433aae5..2709ca1be75a53 100644
--- a/flang/runtime/type-code.cpp
+++ b/FortranRuntime/lib/Runtime/type-code.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/type-code.cpp ---------------------------------------------===//
+//===-- lib/Runtime/type-code.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/type-code.h"
+#include <cstdint>
 
 namespace Fortran::runtime {
 
diff --git a/flang/runtime/type-info.cpp b/FortranRuntime/lib/Runtime/type-info.cpp
similarity index 99%
rename from flang/runtime/type-info.cpp
rename to FortranRuntime/lib/Runtime/type-info.cpp
index cb18c5669b5ffc..24fc9c33d92819 100644
--- a/flang/runtime/type-info.cpp
+++ b/FortranRuntime/lib/Runtime/type-info.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/type-info.cpp ---------------------------------------------===//
+//===-- lib/Runtime/type-info.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/type-info.h b/FortranRuntime/lib/Runtime/type-info.h
similarity index 99%
rename from flang/runtime/type-info.h
rename to FortranRuntime/lib/Runtime/type-info.h
index c3f3595e32ef28..28e7c4696613b3 100644
--- a/flang/runtime/type-info.h
+++ b/FortranRuntime/lib/Runtime/type-info.h
@@ -1,4 +1,4 @@
-//===-- runtime/type-info.h -------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/type-info.h ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -13,7 +13,7 @@
 // flang/module/__fortran_type_info.f90.
 
 #include "terminator.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/descriptor.h"
diff --git a/flang/runtime/unit-map.cpp b/FortranRuntime/lib/Runtime/unit-map.cpp
similarity index 97%
rename from flang/runtime/unit-map.cpp
rename to FortranRuntime/lib/Runtime/unit-map.cpp
index 684a9b9e20b97a..93958be8df7ea5 100644
--- a/flang/runtime/unit-map.cpp
+++ b/FortranRuntime/lib/Runtime/unit-map.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/unit-map.cpp ----------------------------------------------===//
+//===-- lib/Runtime/unit-map.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/unit-map.h b/FortranRuntime/lib/Runtime/unit-map.h
similarity index 97%
rename from flang/runtime/unit-map.h
rename to FortranRuntime/lib/Runtime/unit-map.h
index 6f1e01bb1e64ac..f9f0d34d4f0193 100644
--- a/flang/runtime/unit-map.h
+++ b/FortranRuntime/lib/Runtime/unit-map.h
@@ -1,4 +1,4 @@
-//===-- runtime/unit-map.h --------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/unit-map.h ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/unit.cpp b/FortranRuntime/lib/Runtime/unit.cpp
similarity index 99%
rename from flang/runtime/unit.cpp
rename to FortranRuntime/lib/Runtime/unit.cpp
index 4aee8397d477e7..496679ee8ce5f4 100644
--- a/flang/runtime/unit.cpp
+++ b/FortranRuntime/lib/Runtime/unit.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/unit.cpp --------------------------------------------------===//
+//===-- lib/Runtime/unit.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/unit.h b/FortranRuntime/lib/Runtime/unit.h
similarity index 99%
rename from flang/runtime/unit.h
rename to FortranRuntime/lib/Runtime/unit.h
index a3ea2686816803..608f3a28ef687d 100644
--- a/flang/runtime/unit.h
+++ b/FortranRuntime/lib/Runtime/unit.h
@@ -1,4 +1,4 @@
-//===-- runtime/unit.h ------------------------------------------*- C++ -*-===//
+//===-- lib/Runtime/unit.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/utf.cpp b/FortranRuntime/lib/Runtime/utf.cpp
similarity index 98%
rename from flang/runtime/utf.cpp
rename to FortranRuntime/lib/Runtime/utf.cpp
index b09819cb2f736b..635451153d39a6 100644
--- a/flang/runtime/utf.cpp
+++ b/FortranRuntime/lib/Runtime/utf.cpp
@@ -1,4 +1,4 @@
-//===-- runtime/utf.cpp ---------------------------------------------------===//
+//===-- lib/Runtime/utf.cpp -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/utf.h b/FortranRuntime/lib/Runtime/utf.h
similarity index 97%
rename from flang/runtime/utf.h
rename to FortranRuntime/lib/Runtime/utf.h
index 10c2d61484217a..5ba40437ea0c95 100644
--- a/flang/runtime/utf.h
+++ b/FortranRuntime/lib/Runtime/utf.h
@@ -1,4 +1,4 @@
-//===-- runtime/utf.h -----------------------------------------------------===//
+//===-- lib/Runtime/utf.h ---------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Testing/CMakeLists.txt b/FortranRuntime/lib/Testing/CMakeLists.txt
new file mode 100644
index 00000000000000..75b38662c2a0fa
--- /dev/null
+++ b/FortranRuntime/lib/Testing/CMakeLists.txt
@@ -0,0 +1,19 @@
+#===-- lib/Testing/CMakeLists.txt ------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+set(public_headers "")
+file(GLOB_RECURSE public_headers
+  "${FLANGRUNTIME_SOURCE_DIR}/lib/Testing/*.h"
+)
+
+add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
+  testing.cpp
+  fp-testing.cpp
+ ADDITIONAL_HEADERS
+   ${public_headers}
+)
diff --git a/flang/unittests/Evaluate/fp-testing.cpp b/FortranRuntime/lib/Testing/fp-testing.cpp
similarity index 86%
rename from flang/unittests/Evaluate/fp-testing.cpp
rename to FortranRuntime/lib/Testing/fp-testing.cpp
index 94d8d5086d000b..8541b1406334d3 100644
--- a/flang/unittests/Evaluate/fp-testing.cpp
+++ b/FortranRuntime/lib/Testing/fp-testing.cpp
@@ -1,4 +1,12 @@
-#include "fp-testing.h"
+//===-- lib/Testing/fp-testing.cpp ------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Testing/fp-testing.h"
 #include "llvm/Support/Errno.h"
 #include <cstdio>
 #include <cstdlib>
@@ -8,7 +16,7 @@
 #endif
 
 using Fortran::common::RoundingMode;
-using Fortran::evaluate::RealFlag;
+using Fortran::common::RealFlag;
 
 ScopedHostFloatingPointEnvironment::ScopedHostFloatingPointEnvironment(
 #if __x86_64__
diff --git a/flang/unittests/Evaluate/testing.cpp b/FortranRuntime/lib/Testing/testing.cpp
similarity index 88%
rename from flang/unittests/Evaluate/testing.cpp
rename to FortranRuntime/lib/Testing/testing.cpp
index b2f73bf1b265a7..37f9d88f4886b4 100644
--- a/flang/unittests/Evaluate/testing.cpp
+++ b/FortranRuntime/lib/Testing/testing.cpp
@@ -1,4 +1,12 @@
-#include "testing.h"
+//===-- lib/Testing/testing.cpp ---------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstdarg>
 #include <cstdio>
diff --git a/flang/module/.clang-format b/FortranRuntime/module/.clang-format
similarity index 100%
rename from flang/module/.clang-format
rename to FortranRuntime/module/.clang-format
diff --git a/FortranRuntime/module/CMakeLists.txt b/FortranRuntime/module/CMakeLists.txt
new file mode 100644
index 00000000000000..9841cbd586b2df
--- /dev/null
+++ b/FortranRuntime/module/CMakeLists.txt
@@ -0,0 +1,63 @@
+#===-- module/CMakeLists.txt -----------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+set(module_sources
+  "__cuda_builtins.f90"
+  "__fortran_builtins.f90"
+  "__fortran_ieee_exceptions.f90"
+  "__fortran_type_info.f90"
+  # "cudadevice.f90" # TODO: -fc1 -xcuda
+  "ieee_arithmetic.f90"
+  "ieee_exceptions.f90"
+  "ieee_features.f90"
+  "iso_c_binding.f90"
+  "iso_fortran_env.f90"
+)
+
+set_source_files_properties(
+ "iso_fortran_env.f90"
+ PROPERTIES
+   COMPILE_FLAGS "-mmlir -ignore-module-only-builtins"
+)
+
+set_source_files_properties(
+  "__fortran_builtins.f90"
+   PROPERTIES
+     COMPILE_FLAGS "-mmlir -ignore-missing-type-desc"
+)
+
+# Requires PowerPC vector instructions
+if (LLVM_TARGET_TRIPLE MATCHES "(ppc|powerpc)(32|64)?(le|be)?\-.*")
+  list(APPEND module_sources
+    "__ppc_types.f90"
+    "__ppc_intrinsics.f90"
+    "mma.f90"
+  )
+endif ()
+
+add_fortranruntime_library(module_files OBJECT
+  ${module_sources}
+)
+
+# Usually, CMake will ignore dependencies from Fortran intrinsic modules. Since this is building those intrinsic modules themselves, tell CMake to not prune such dependencies.
+set_target_properties(module_files
+  PROPERTIES
+    Fortran_BUILDING_INSTRINSIC_MODULES ON
+)
+
+# The usual technique to install files in CMake is
+#
+#   install(TARGET <targetname> <artifacttype> ...)
+#
+# However, there is no <artifacttype> for Fortran modules. We have to derive the module file path individually.
+set(module_files "")
+foreach (f90file IN LISTS module_sources)
+   get_filename_component(base "${f90file}" NAME_WE )
+   list(APPEND module_files "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/flang/${base}.mod")
+endforeach ()
+install(FILES ${module_files} DESTINATION "${FORTRANRUNTIME_INSTALL_INCLUDE_DIR}/flang")
diff --git a/flang/module/__cuda_builtins.f90 b/FortranRuntime/module/__cuda_builtins.f90
similarity index 100%
rename from flang/module/__cuda_builtins.f90
rename to FortranRuntime/module/__cuda_builtins.f90
diff --git a/flang/module/__fortran_builtins.f90 b/FortranRuntime/module/__fortran_builtins.f90
similarity index 100%
rename from flang/module/__fortran_builtins.f90
rename to FortranRuntime/module/__fortran_builtins.f90
diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/FortranRuntime/module/__fortran_ieee_exceptions.f90
similarity index 100%
rename from flang/module/__fortran_ieee_exceptions.f90
rename to FortranRuntime/module/__fortran_ieee_exceptions.f90
diff --git a/flang/module/__fortran_type_info.f90 b/FortranRuntime/module/__fortran_type_info.f90
similarity index 100%
rename from flang/module/__fortran_type_info.f90
rename to FortranRuntime/module/__fortran_type_info.f90
diff --git a/flang/module/__ppc_intrinsics.f90 b/FortranRuntime/module/__ppc_intrinsics.f90
similarity index 100%
rename from flang/module/__ppc_intrinsics.f90
rename to FortranRuntime/module/__ppc_intrinsics.f90
diff --git a/flang/module/__ppc_types.f90 b/FortranRuntime/module/__ppc_types.f90
similarity index 100%
rename from flang/module/__ppc_types.f90
rename to FortranRuntime/module/__ppc_types.f90
diff --git a/flang/module/cudadevice.f90 b/FortranRuntime/module/cudadevice.f90
similarity index 96%
rename from flang/module/cudadevice.f90
rename to FortranRuntime/module/cudadevice.f90
index 0224ecfdde7c60..dd487f6ed1ffee 100644
--- a/flang/module/cudadevice.f90
+++ b/FortranRuntime/module/cudadevice.f90
@@ -1,4 +1,4 @@
-!===-- module/cudedevice.f90 -----------------------------------------------===!
+!===-- module/cudadevice.f90 -----------------------------------------------===!
 !
 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 ! See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/module/ieee_arithmetic.f90 b/FortranRuntime/module/ieee_arithmetic.f90
similarity index 100%
rename from flang/module/ieee_arithmetic.f90
rename to FortranRuntime/module/ieee_arithmetic.f90
diff --git a/flang/module/ieee_exceptions.f90 b/FortranRuntime/module/ieee_exceptions.f90
similarity index 100%
rename from flang/module/ieee_exceptions.f90
rename to FortranRuntime/module/ieee_exceptions.f90
diff --git a/flang/module/ieee_features.f90 b/FortranRuntime/module/ieee_features.f90
similarity index 100%
rename from flang/module/ieee_features.f90
rename to FortranRuntime/module/ieee_features.f90
diff --git a/flang/module/iso_c_binding.f90 b/FortranRuntime/module/iso_c_binding.f90
similarity index 100%
rename from flang/module/iso_c_binding.f90
rename to FortranRuntime/module/iso_c_binding.f90
diff --git a/flang/module/iso_fortran_env.f90 b/FortranRuntime/module/iso_fortran_env.f90
similarity index 100%
rename from flang/module/iso_fortran_env.f90
rename to FortranRuntime/module/iso_fortran_env.f90
diff --git a/flang/module/mma.f90 b/FortranRuntime/module/mma.f90
similarity index 98%
rename from flang/module/mma.f90
rename to FortranRuntime/module/mma.f90
index 4c41822e000a3d..14aab69035a334 100644
--- a/flang/module/mma.f90
+++ b/FortranRuntime/module/mma.f90
@@ -55,9 +55,18 @@ pure __vector_pair function func_vpi0vp(arg1, arg2); \
     !dir$ ignore_tkr(r) arg2; \
   end function;
 
-  FUNC_VPI0VI(1) FUNC_VPI0VI(2) FUNC_VPI0VI(4) FUNC_VPI0VI(8)
-  FUNC_VPI0VU(1) FUNC_VPI0VU(2) FUNC_VPI0VU(4) FUNC_VPI0VU(8)
-  FUNC_VPI0VR(4) FUNC_VPI0VR(8)
+! FIXME: Potential Flang bug: combining multiple of those on a single line breaks after preprocessing as an explicit step as done by CMake
+! Line counting is also wrong
+  FUNC_VPI0VI(1)
+  FUNC_VPI0VI(2)
+  FUNC_VPI0VI(4)
+  FUNC_VPI0VI(8)
+  FUNC_VPI0VU(1)
+  FUNC_VPI0VU(2)
+  FUNC_VPI0VU(4)
+  FUNC_VPI0VU(8)
+  FUNC_VPI0VR(4)
+  FUNC_VPI0VR(8)
   FUNC_VPI0VP
 
 #undef FUNC_VPI0VP
@@ -144,14 +153,26 @@ elemental subroutine sub_vpvr##VKIND##vr##VKIND(pair, arg1, arg2); \
     vector(real(VKIND)), intent(in) :: arg1, arg2; \
   end subroutine ;
 
-  ELEM_SUB_VPVIVI(1) ELEM_SUB_VPVIVI(2)
-  ELEM_SUB_VPVIVI(4) ELEM_SUB_VPVIVI(8)
-  ELEM_SUB_VPVUVU(1) ELEM_SUB_VPVUVU(2)
-  ELEM_SUB_VPVUVU(4) ELEM_SUB_VPVUVU(8)
-  ELEM_SUB_VPVRVR(4) ELEM_SUB_VPVRVR(8)
-  SUB_VPI0VI(1) SUB_VPI0VI(2) SUB_VPI0VI(4) SUB_VPI0VI(8)
-  SUB_VPI0VU(1) SUB_VPI0VU(2) SUB_VPI0VU(4) SUB_VPI0VU(8)
-  SUB_VPI0VR(4) SUB_VPI0VR(8)
+  ELEM_SUB_VPVIVI(1)
+  ELEM_SUB_VPVIVI(2)
+  ELEM_SUB_VPVIVI(4)
+  ELEM_SUB_VPVIVI(8)
+  ELEM_SUB_VPVUVU(1)
+  ELEM_SUB_VPVUVU(2)
+  ELEM_SUB_VPVUVU(4)
+  ELEM_SUB_VPVUVU(8)
+  ELEM_SUB_VPVRVR(4)
+  ELEM_SUB_VPVRVR(8)
+  SUB_VPI0VI(1)
+  SUB_VPI0VI(2)
+  SUB_VPI0VI(4)
+  SUB_VPI0VI(8)
+  SUB_VPI0VU(1)
+  SUB_VPI0VU(2)
+  SUB_VPI0VU(4)
+  SUB_VPI0VU(8)
+  SUB_VPI0VR(4)
+  SUB_VPI0VR(8)
 
 #undef ELEM_SUB_VPVIVI
 #undef ELEM_SUB_VPVUVU
diff --git a/FortranRuntime/test/CMakeLists.txt b/FortranRuntime/test/CMakeLists.txt
new file mode 100644
index 00000000000000..1f822859089f3d
--- /dev/null
+++ b/FortranRuntime/test/CMakeLists.txt
@@ -0,0 +1,70 @@
+#===-- test/CMakeLists.txt -------------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+# Test runner infrastructure for Flang. This configures the Flang test trees
+# for use by Lit, and delegates to LLVM's lit test handlers.
+
+llvm_canonicalize_cmake_booleans(
+  FLANG_STANDALONE_BUILD
+  LLVM_BUILD_EXAMPLES
+  LLVM_BYE_LINK_INTO_TOOLS
+  LLVM_ENABLE_PLUGINS
+)
+
+set(FLANG_TOOLS_DIR ${FLANG_BINARY_DIR}/bin)
+
+configure_lit_site_cfg(
+  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
+  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py
+  MAIN_CONFIG
+  ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
+)
+
+if (TARGET FortranRuntimeUnitTests)
+  configure_lit_site_cfg(
+    ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in
+    ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py
+    MAIN_CONFIG
+    ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py
+  )
+
+  configure_lit_site_cfg(
+    ${CMAKE_CURRENT_SOURCE_DIR}/NonGtestUnit/lit.site.cfg.py.in
+    ${CMAKE_CURRENT_BINARY_DIR}/NonGtestUnit/lit.site.cfg.py
+    MAIN_CONFIG
+    ${CMAKE_CURRENT_SOURCE_DIR}/NonGtestUnit/lit.cfg.py
+  )
+endif ()
+
+set(FORTRANRUNTIME_TEST_DEPENDS "")
+if (FORTRANRUNTIME_INCLUDE_TESTS)
+  if (TARGET FortranRuntimeUnitTests)
+    list(APPEND FORTRANRUNTIME_TEST_DEPENDS FortranRuntimeUnitTests)
+  endif()
+endif()
+
+add_custom_target(FortranRuntime-test-depends)
+set_target_properties(FortranRuntime-test-depends PROPERTIES FOLDER "Fortran Runtime/Meta")
+
+add_lit_testsuite(check-FortranRuntime "Running the Flang regression tests"
+  ${CMAKE_CURRENT_BINARY_DIR}
+  DEPENDS ${FORTRANRUNTIME_TEST_DEPENDS}
+)
+set_target_properties(check-FortranRuntime PROPERTIES FOLDER "Fortran Runtime/Meta")
+
+
+add_lit_testsuites(FORTRANRUNTIME ${CMAKE_CURRENT_SOURCE_DIR}
+  DEPENDS ${FORTRANRUNTIME_TEST_DEPENDS})
+
+# To modify the default target triple for flang tests.
+if (DEFINED FLANG_TEST_TARGET_TRIPLE)
+  if (NOT DEFINED LLVM_TARGET_TRIPLE_ENV OR LLVM_TARGET_TRIPLE_ENV STREQUAL "")
+    message(FATAL_ERROR "LLVM_TARGET_TRIPLE_ENV must also be defined in order "
+                        "to use FLANG_TEST_TARGET_TRIPLE.")
+  endif()
+endif()
diff --git a/FortranRuntime/test/NonGtestUnit/lit.cfg.py b/FortranRuntime/test/NonGtestUnit/lit.cfg.py
new file mode 100644
index 00000000000000..cd78ca76de503f
--- /dev/null
+++ b/FortranRuntime/test/NonGtestUnit/lit.cfg.py
@@ -0,0 +1,21 @@
+# -*- Python -*-
+
+import os
+
+import lit.formats
+
+# name: The name of this test suite.
+config.name = "FortranRuntime-OldUnit"
+
+# suffixes: A list of file extensions to treat as test files.
+config.suffixes = [".test"]
+
+# test_source_root: The root path where unit test binaries are located.
+config.test_source_root = os.path.join(config.fortranruntime_binary_dir, "unittests")
+
+# test_exec_root: The root path where tests should be run.
+# lit writes a '.lit_test_times.txt' file into this directory.
+config.test_exec_root = config.fortranruntime_binary_test_dir
+
+# testFormat: The test format to use to interpret tests.
+config.test_format = lit.formats.ExecutableTest()
diff --git a/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in b/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..3d1780a5d600a9
--- /dev/null
+++ b/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
@@ -0,0 +1,13 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import os
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.fortranruntime_binary_dir = "@FORTRANRUNTIME_BINARY_DIR@"
+config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/NonGtestUnit/lit.cfg.py")
diff --git a/flang/test/Runtime/no-cpp-dep.c b/FortranRuntime/test/Runtime/no-cpp-dep.c
similarity index 75%
rename from flang/test/Runtime/no-cpp-dep.c
rename to FortranRuntime/test/Runtime/no-cpp-dep.c
index 606a5d189f7199..f6760b75a148ff 100644
--- a/flang/test/Runtime/no-cpp-dep.c
+++ b/FortranRuntime/test/Runtime/no-cpp-dep.c
@@ -3,16 +3,18 @@ This test makes sure that flang's runtime does not depend on the C++ runtime
 library. It tries to link this simple file against libFortranRuntime.a with
 a C compiler.
 
-REQUIRES: c-compiler
+UNSUPPORTED: system-windows
 
 RUN: %if system-aix %{ export OBJECT_MODE=64 %}
-RUN: %cc -std=c99 %s -I%include %libruntime %libdecimal -lm  \
+RUN: %cc -std=c99 %s -I%include %libruntime -lm \
 RUN: %if system-aix %{-lpthread %}
 RUN: rm a.out
 */
 
 #include "flang/Runtime/entry-names.h"
 #include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
 
 /*
 Manually add declarations for the runtime functions that we want to make sure
@@ -29,7 +31,9 @@ void RTNAME(ProgramStart)(
 int32_t RTNAME(ArgumentCount)();
 int32_t RTNAME(GetCommandArgument)(int32_t, const struct Descriptor *,
     const struct Descriptor *, const struct Descriptor *);
-int32_t RTNAME(GetEnvVariable)();
+int32_t RTNAME(GetEnvVariable)(const struct Descriptor *,
+    const struct Descriptor *, const struct Descriptor *, bool ,
+    const struct Descriptor *, const char *, int );
 int64_t RTNAME(SystemClockCount)(int kind);
 
 int main() {
@@ -37,7 +41,7 @@ int main() {
   RTNAME(ProgramStart)(0, 0, 0, 0);
   int32_t c = RTNAME(ArgumentCount)();
   int32_t v = RTNAME(GetCommandArgument)(0, 0, 0, 0);
-  int32_t e = RTNAME(GetEnvVariable)("FOO", 0, 0);
+  int32_t e = RTNAME(GetEnvVariable)(NULL, NULL, NULL, false, NULL, "FOO", 0);
   int64_t t = RTNAME(SystemClockCount)(8);
   return x + c + v + e;
 }
diff --git a/FortranRuntime/test/Unit/lit.cfg.py b/FortranRuntime/test/Unit/lit.cfg.py
new file mode 100644
index 00000000000000..888fb3981916c8
--- /dev/null
+++ b/FortranRuntime/test/Unit/lit.cfg.py
@@ -0,0 +1,21 @@
+# -*- Python -*-
+
+import os
+
+import lit.formats
+
+# name: The name of this test suite.
+config.name = "FortranRuntime-Unit"
+
+# suffixes: A list of file extensions to treat as test files.
+config.suffixes = []
+
+# test_source_root: The root path where unit test binaries are located.
+config.test_source_root = os.path.join(config.fortranruntime_binary_dir, "unittests")
+
+# test_exec_root: The root path where tests should be run.
+# lit writes a '.lit_test_times.txt' file into this directory.
+config.test_exec_root = config.fortranruntime_binary_test_dir
+
+# testFormat: The test format to use to interpret tests.
+config.test_format = lit.formats.GoogleTest(config.llvm_build_mode, "Tests")
diff --git a/FortranRuntime/test/Unit/lit.site.cfg.py.in b/FortranRuntime/test/Unit/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..fa993aa897faca
--- /dev/null
+++ b/FortranRuntime/test/Unit/lit.site.cfg.py.in
@@ -0,0 +1,14 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import os
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.llvm_build_mode = "@LLVM_BUILD_MODE@"
+config.fortranruntime_binary_dir = "@FORTRANRUNTIME_BINARY_DIR@"
+config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/Unit/lit.cfg.py")
diff --git a/FortranRuntime/test/lit.cfg.py b/FortranRuntime/test/lit.cfg.py
new file mode 100644
index 00000000000000..dd5124b8de4095
--- /dev/null
+++ b/FortranRuntime/test/lit.cfg.py
@@ -0,0 +1,78 @@
+# -*- Python -*-
+
+import lit.util
+
+from lit.llvm import llvm_config
+from lit.llvm.subst import ToolSubst
+
+# Configuration file for the 'lit' test runner.
+
+# name: The name of this test suite.
+config.name = "FortranRuntime"
+
+# testFormat: The test format to use to interpret tests.
+#
+# For now we require '&&' between commands, until they get globally killed and
+# the test runner updated.
+config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
+
+# suffixes: A list of file extensions to treat as test files.
+config.suffixes = [
+    ".c",
+    ".cpp",
+    ".f",
+    ".F",
+    ".ff",
+    ".FOR",
+    ".for",
+    ".f77",
+    ".f90",
+    ".F90",
+    ".ff90",
+    ".f95",
+    ".F95",
+    ".ff95",
+    ".fpp",
+    ".FPP",
+    ".cuf",
+    ".CUF",
+    ".f18",
+    ".F18",
+    ".f03",
+    ".F03",
+    ".f08",
+    ".F08",
+    ".ll",
+    ".fir",
+    ".mlir",
+]
+
+llvm_config.use_default_substitutions()
+
+# test_source_root: The root path where tests are located.
+config.test_source_root = os.path.dirname(__file__)
+
+# test_exec_root: The root path where tests should be run. 
+# lit writes a '.lit_test_times.txt' file into this directory.
+config.test_exec_root = config.fortranruntime_binary_test_dir
+
+# On MacOS, -isysroot is needed to build binaries.
+isysroot_flag = []
+if config.osx_sysroot:
+    isysroot_flag = ["-isysroot", config.osx_sysroot]
+
+# Define some variables to help us test that the flang runtime doesn't depend on
+# the C++ runtime libraries. For this we need a C compiler.
+libruntime = os.path.join(config.fortranruntime_build_lib_dir, "libFortranRuntime.a")
+include = os.path.join(config.fortranruntime_source_dir, "include")
+tools = []
+tools.append(
+            ToolSubst(
+                "%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"
+            )
+        )
+tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
+tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
+
+llvm_config.add_tool_substitutions(tools)
+
diff --git a/FortranRuntime/test/lit.site.cfg.py.in b/FortranRuntime/test/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..d860d297ebd7c3
--- /dev/null
+++ b/FortranRuntime/test/lit.site.cfg.py.in
@@ -0,0 +1,17 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import sys
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
+config.fortranruntime_source_dir = "@FORTRANRUNTIME_SOURCE_DIR@"
+config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
+config.fortranruntime_build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
+config.cc = "@CMAKE_C_COMPILER@"
+config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/lit.cfg.py")
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
new file mode 100644
index 00000000000000..d1aed058aad142
--- /dev/null
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -0,0 +1,62 @@
+#===-- unittests/CMakeLists.txt --------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+function (build_gtest)
+  include_directories("${LLVM_INCLUDE_DIR}" "${LLVM_MAIN_INCLUDE_DIR}")
+  set(LLVM_SUBPROJECT_TITLE "Third-Party/Google Test")
+  add_subdirectory(${LLVM_THIRD_PARTY_DIR}/unittest ${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest)
+endfunction ()
+
+# Add GTest if not already present
+if (NOT TARGET llvm_gtest)
+  build_gtest()
+endif ()
+
+# Target that depends on all unittests
+add_custom_target(FortranRuntimeUnitTests)
+set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Tests")
+
+function(add_fortranruntime_unittest test_dirname)
+  cmake_parse_arguments(ARG
+    ""
+    ""
+    "LINK_LIBS"
+    ${ARGN})
+
+  add_unittest(FortranRuntimeUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
+  target_include_directories(${test_dirname} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
+endfunction()
+
+function(add_fortranruntime_nongtest_unittest test_name)
+  cmake_parse_arguments(ARG
+    "SLOW_TEST"
+    ""
+    "LINK_LIBS"
+    ${ARGN})
+
+  if(ARG_SLOW_TEST)
+      set(suffix .slow)
+  else()
+      set(suffix .test)
+  endif()
+
+  add_executable(${test_name}${suffix} ${ARG_UNPARSED_ARGUMENTS})
+  target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
+  target_include_directories(${test_name}${suffix} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  set_target_properties(${test_name}${suffix} PROPERTIES FOLDER "Fortran Runtime/Tests/Unit")
+
+  if(NOT ARG_SLOW_TEST)
+    add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
+  endif()
+endfunction()
+
+add_subdirectory(Common)
+add_subdirectory(Decimal)
+add_subdirectory(Evaluate)
+add_subdirectory(Runtime)
diff --git a/FortranRuntime/unittests/Common/CMakeLists.txt b/FortranRuntime/unittests/Common/CMakeLists.txt
new file mode 100644
index 00000000000000..f107036f19ed8d
--- /dev/null
+++ b/FortranRuntime/unittests/Common/CMakeLists.txt
@@ -0,0 +1,13 @@
+#===-- unittests/Common/CMakeLists.txt -------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_fortranruntime_unittest(FlangCommonTests
+  FastIntSetTest.cpp
+  LINK_LIBS
+    FortranRuntime.static
+)
diff --git a/flang/unittests/Common/FastIntSetTest.cpp b/FortranRuntime/unittests/Common/FastIntSetTest.cpp
similarity index 97%
rename from flang/unittests/Common/FastIntSetTest.cpp
rename to FortranRuntime/unittests/Common/FastIntSetTest.cpp
index bd1b953fa16631..f19359f4097ab8 100644
--- a/flang/unittests/Common/FastIntSetTest.cpp
+++ b/FortranRuntime/unittests/Common/FastIntSetTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Common/FastIntSetTest.cpp ---------------*- C++ -*-===//
+//===-- unittests/Common/FastIntSetTest.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/unittests/Decimal/CMakeLists.txt b/FortranRuntime/unittests/Decimal/CMakeLists.txt
new file mode 100644
index 00000000000000..3d96da45c94148
--- /dev/null
+++ b/FortranRuntime/unittests/Decimal/CMakeLists.txt
@@ -0,0 +1,20 @@
+#===-- unittests/Decimal/CMakeLists.txt ------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_fortranruntime_nongtest_unittest(quick-sanity-test
+quick-sanity-test.cpp
+LINK_LIBS
+  FortranRuntime.static
+)
+
+# This test is not run by default as it takes a long time to execute.
+add_fortranruntime_nongtest_unittest(thorough-test SLOW_TEST
+thorough-test.cpp
+LINK_LIBS
+  FortranRuntime.static
+)
diff --git a/flang/unittests/Decimal/quick-sanity-test.cpp b/FortranRuntime/unittests/Decimal/quick-sanity-test.cpp
similarity index 91%
rename from flang/unittests/Decimal/quick-sanity-test.cpp
rename to FortranRuntime/unittests/Decimal/quick-sanity-test.cpp
index dafb075307ab6a..0e8ff0ce48b3c6 100644
--- a/flang/unittests/Decimal/quick-sanity-test.cpp
+++ b/FortranRuntime/unittests/Decimal/quick-sanity-test.cpp
@@ -1,4 +1,12 @@
-#include "flang/Decimal/decimal.h"
+//===-- unittests/Decimal/quick-sanity-test.cpp -----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Common/decimal.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
 #include <cstdio>
diff --git a/flang/unittests/Decimal/thorough-test.cpp b/FortranRuntime/unittests/Decimal/thorough-test.cpp
similarity index 85%
rename from flang/unittests/Decimal/thorough-test.cpp
rename to FortranRuntime/unittests/Decimal/thorough-test.cpp
index 46951f33eb8fee..0648b61d7c1cda 100644
--- a/flang/unittests/Decimal/thorough-test.cpp
+++ b/FortranRuntime/unittests/Decimal/thorough-test.cpp
@@ -1,4 +1,12 @@
-#include "flang/Decimal/decimal.h"
+//===-- unittests/Decimal/thorough-test.cpp ---------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Common/decimal.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
 #include <cstdio>
diff --git a/FortranRuntime/unittests/Evaluate/CMakeLists.txt b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
new file mode 100644
index 00000000000000..e6501f13a74e6b
--- /dev/null
+++ b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
@@ -0,0 +1,19 @@
+#===-- unittests/Evaluate/CMakeLists.txt -----------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_fortranruntime_nongtest_unittest(reshape
+reshape.cpp
+LINK_LIBS
+  FortranRuntime.static
+)
+
+add_fortranruntime_nongtest_unittest(ISO-Fortran-binding
+ISO-Fortran-binding.cpp
+LINK_LIBS
+  FortranRuntime.static
+)
diff --git a/flang/unittests/Evaluate/ISO-Fortran-binding.cpp b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
similarity index 98%
rename from flang/unittests/Evaluate/ISO-Fortran-binding.cpp
rename to FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
index 3c98363f900466..97d23ca90e5022 100644
--- a/flang/unittests/Evaluate/ISO-Fortran-binding.cpp
+++ b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
@@ -1,5 +1,13 @@
-#include "testing.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+//===-- unittests/Evaluate/ISO-Fortran-binding.cpp --------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Testing/testing.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "llvm/Support/raw_ostream.h"
 #include <type_traits>
diff --git a/flang/unittests/Evaluate/reshape.cpp b/FortranRuntime/unittests/Evaluate/reshape.cpp
similarity index 88%
rename from flang/unittests/Evaluate/reshape.cpp
rename to FortranRuntime/unittests/Evaluate/reshape.cpp
index 5d138cd3d88d98..82caebe081fcd2 100644
--- a/flang/unittests/Evaluate/reshape.cpp
+++ b/FortranRuntime/unittests/Evaluate/reshape.cpp
@@ -1,4 +1,12 @@
-#include "testing.h"
+//===-- unittests/Evaluate/reshape.cpp --------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Testing/testing.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/transformational.h"
 #include <cinttypes>
diff --git a/flang/unittests/Runtime/AccessTest.cpp b/FortranRuntime/unittests/Runtime/AccessTest.cpp
similarity index 99%
rename from flang/unittests/Runtime/AccessTest.cpp
rename to FortranRuntime/unittests/Runtime/AccessTest.cpp
index 66f19f78c7cfb6..e72386cc9ac247 100644
--- a/flang/unittests/Runtime/AccessTest.cpp
+++ b/FortranRuntime/unittests/Runtime/AccessTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/AccessTest.cpp ----------------------------===//
+//===-- unittests/Runtime/AccessTest.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Allocatable.cpp b/FortranRuntime/unittests/Runtime/Allocatable.cpp
similarity index 98%
rename from flang/unittests/Runtime/Allocatable.cpp
rename to FortranRuntime/unittests/Runtime/Allocatable.cpp
index f15f26bfd9c575..8e10dc408ceae8 100644
--- a/flang/unittests/Runtime/Allocatable.cpp
+++ b/FortranRuntime/unittests/Runtime/Allocatable.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Allocatable.cpp--------- ---------*- C++-*-===//
+//===-- unittests/Runtime/Allocatable.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/ArrayConstructor.cpp b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
similarity index 99%
rename from flang/unittests/Runtime/ArrayConstructor.cpp
rename to FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
index 9d78da79623613..8c7fce3e4fb5f7 100644
--- a/flang/unittests/Runtime/ArrayConstructor.cpp
+++ b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/ArrayConstructor.cpp-------------*- C++ -*-===//
+//===-- unittests/Runtime/ArrayConstructor.cpp ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/BufferTest.cpp b/FortranRuntime/unittests/Runtime/BufferTest.cpp
similarity index 97%
rename from flang/unittests/Runtime/BufferTest.cpp
rename to FortranRuntime/unittests/Runtime/BufferTest.cpp
index 0632324b25d22e..9a7dd86d0c1dc6 100644
--- a/flang/unittests/Runtime/BufferTest.cpp
+++ b/FortranRuntime/unittests/Runtime/BufferTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/BufferTest.cpp ------------------*- C++ -*-===//
+//===-- unittests/Runtime/BufferTest.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../runtime/buffer.h"
+#include "../../lib/Runtime/buffer.h"
 #include "CrashHandlerFixture.h"
 #include "gtest/gtest.h"
 #include <algorithm>
diff --git a/flang/unittests/Runtime/CMakeLists.txt b/FortranRuntime/unittests/Runtime/CMakeLists.txt
similarity index 54%
rename from flang/unittests/Runtime/CMakeLists.txt
rename to FortranRuntime/unittests/Runtime/CMakeLists.txt
index 2c3f8c1a9e9ac8..1e966987c272a0 100644
--- a/flang/unittests/Runtime/CMakeLists.txt
+++ b/FortranRuntime/unittests/Runtime/CMakeLists.txt
@@ -1,4 +1,12 @@
-add_flang_unittest(FlangRuntimeTests
+#===-- unittests/Runtime/CMakeLists.txt ------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_fortranruntime_unittest(FlangRuntimeTests
   AccessTest.cpp
   Allocatable.cpp
   ArrayConstructor.cpp
@@ -29,11 +37,6 @@ add_flang_unittest(FlangRuntimeTests
   Time.cpp
   TemporaryStack.cpp
   Transformational.cpp
+LINK_LIBS
+  FortranRuntime.static
 )
-
-target_link_libraries(FlangRuntimeTests
-  PRIVATE
-  FortranRuntime
-)
-
-add_subdirectory(CUDA)
diff --git a/flang/unittests/Runtime/CUDA/AllocatorCUF.cpp b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
similarity index 95%
rename from flang/unittests/Runtime/CUDA/AllocatorCUF.cpp
rename to FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
index b51ff0ac006cc6..5bafb484236340 100644
--- a/flang/unittests/Runtime/CUDA/AllocatorCUF.cpp
+++ b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/AllocatableCUF.cpp ---------------*- C++-*-===//
+//===-- unittests/Runtime/CUDA/AllocatorCUF.cpp -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,7 +8,7 @@
 
 #include "gtest/gtest.h"
 #include "../../../runtime/terminator.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Runtime/CUDA/allocator.h"
 #include "flang/Runtime/CUDA/descriptor.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/flang/unittests/Runtime/CharacterTest.cpp b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
similarity index 99%
rename from flang/unittests/Runtime/CharacterTest.cpp
rename to FortranRuntime/unittests/Runtime/CharacterTest.cpp
index e54fd8a5075f64..710c1ca0eee817 100644
--- a/flang/unittests/Runtime/CharacterTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/CharacterTest.cpp ---------------*- C++ -*-===//
+//===-- unittests/Runtime/CharacterTest.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/CommandTest.cpp b/FortranRuntime/unittests/Runtime/CommandTest.cpp
similarity index 99%
rename from flang/unittests/Runtime/CommandTest.cpp
rename to FortranRuntime/unittests/Runtime/CommandTest.cpp
index b0c43ba01d8f33..03a31ceab8030b 100644
--- a/flang/unittests/Runtime/CommandTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CommandTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/CommandTest.cpp ---------------------------===//
+//===-- unittests/Runtime/CommandTest.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Complex.cpp b/FortranRuntime/unittests/Runtime/Complex.cpp
similarity index 98%
rename from flang/unittests/Runtime/Complex.cpp
rename to FortranRuntime/unittests/Runtime/Complex.cpp
index 46f3ad2f2712b2..daa4b5c7960842 100644
--- a/flang/unittests/Runtime/Complex.cpp
+++ b/FortranRuntime/unittests/Runtime/Complex.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Complex.cpp ---------------------*- C++ -*-===//
+//===-- unittests/Runtime/Complex.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -13,7 +13,7 @@
 #pragma clang diagnostic ignored "-Wc99-extensions"
 #endif
 
-#include "flang/Common/Fortran.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/entry-names.h"
 
diff --git a/flang/unittests/Runtime/CrashHandlerFixture.cpp b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp
similarity index 92%
rename from flang/unittests/Runtime/CrashHandlerFixture.cpp
rename to FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp
index 811603337e6608..5e0b746c7e974a 100644
--- a/flang/unittests/Runtime/CrashHandlerFixture.cpp
+++ b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/CrashHandlerFixture.cpp ---------*- C++ -*-===//
+//===-- unittests/Runtime/CrashHandlerFixture.cpp ---------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 #include "CrashHandlerFixture.h"
-#include "../../runtime/terminator.h"
+#include "../../lib/Runtime/terminator.h"
 #include <cstdarg>
 #include <cstdlib>
 
diff --git a/flang/unittests/Runtime/CrashHandlerFixture.h b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
similarity index 91%
rename from flang/unittests/Runtime/CrashHandlerFixture.h
rename to FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
index fe0ee0da5204e4..af6d8e4cc7d525 100644
--- a/flang/unittests/Runtime/CrashHandlerFixture.h
+++ b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/CrashHandlerFixture.h -----------*- C++ -*-===//
+//===-- unittests/Runtime/CrashHandlerFixture.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Derived.cpp b/FortranRuntime/unittests/Runtime/Derived.cpp
similarity index 96%
rename from flang/unittests/Runtime/Derived.cpp
rename to FortranRuntime/unittests/Runtime/Derived.cpp
index 019d5e8309e4a0..8d5471e3e0bcf3 100644
--- a/flang/unittests/Runtime/Derived.cpp
+++ b/FortranRuntime/unittests/Runtime/Derived.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Pointer.cpp--------- -------------*- C++-*-===//
+//===-- unittests/Runtime/Derived.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/ExternalIOTest.cpp b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
similarity index 99%
rename from flang/unittests/Runtime/ExternalIOTest.cpp
rename to FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
index 13327964e12a48..23c1e9992c101e 100644
--- a/flang/unittests/Runtime/ExternalIOTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/RuntimeGTest/ExternalIOTest.cpp ---------*- C++ -*-===//
+//===-- unittests/Runtime/ExternalIOTest.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Format.cpp b/FortranRuntime/unittests/Runtime/Format.cpp
similarity index 96%
rename from flang/unittests/Runtime/Format.cpp
rename to FortranRuntime/unittests/Runtime/Format.cpp
index 01803c628de26a..f1447608917f2d 100644
--- a/flang/unittests/Runtime/Format.cpp
+++ b/FortranRuntime/unittests/Runtime/Format.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Format.cpp ----------------------*- C++ -*-===//
+//===-- unittests/Runtime/Format.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "../runtime/connection.h"
-#include "../runtime/format-implementation.h"
-#include "../runtime/io-error.h"
+#include "../../lib/Runtime/connection.h"
+#include "../../lib/Runtime/format-implementation.h"
+#include "../../lib/Runtime/io-error.h"
 #include <optional>
 #include <string>
 #include <tuple>
diff --git a/flang/unittests/Runtime/Inquiry.cpp b/FortranRuntime/unittests/Runtime/Inquiry.cpp
similarity index 98%
rename from flang/unittests/Runtime/Inquiry.cpp
rename to FortranRuntime/unittests/Runtime/Inquiry.cpp
index 3b523e992a3179..39303b7c809002 100644
--- a/flang/unittests/Runtime/Inquiry.cpp
+++ b/FortranRuntime/unittests/Runtime/Inquiry.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Inquiry.cpp -------------------------------===//
+//===-- unittests/Runtime/Inquiry.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/ListInputTest.cpp b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
similarity index 98%
rename from flang/unittests/Runtime/ListInputTest.cpp
rename to FortranRuntime/unittests/Runtime/ListInputTest.cpp
index a4eba5283add68..472838c25841c9 100644
--- a/flang/unittests/Runtime/ListInputTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/ListInputTest.cpp ---------------*- C++ -*-===//
+//===-- unittests/Runtime/ListInputTest.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "../../runtime/io-error.h"
+#include "../../lib/Runtime/io-error.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
 
diff --git a/flang/unittests/Runtime/LogicalFormatTest.cpp b/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
similarity index 96%
rename from flang/unittests/Runtime/LogicalFormatTest.cpp
rename to FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
index a2c19d1e1ca948..928fddec50c874 100644
--- a/flang/unittests/Runtime/LogicalFormatTest.cpp
+++ b/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/LogicalFormatTest.cpp -----------*- C++ -*-===//
+//===-- unittests/Runtime/LogicalFormatTest.cpp -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Matmul.cpp b/FortranRuntime/unittests/Runtime/Matmul.cpp
similarity index 99%
rename from flang/unittests/Runtime/Matmul.cpp
rename to FortranRuntime/unittests/Runtime/Matmul.cpp
index c3fed9b972df2a..a37b618d3ab11a 100644
--- a/flang/unittests/Runtime/Matmul.cpp
+++ b/FortranRuntime/unittests/Runtime/Matmul.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Matmul.cpp--------- -------------*- C++ -*-===//
+//===-- unittests/Runtime/Matmul.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/MatmulTranspose.cpp b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
similarity index 99%
rename from flang/unittests/Runtime/MatmulTranspose.cpp
rename to FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
index c582e945dc7c93..3483d1896e8bf6 100644
--- a/flang/unittests/Runtime/MatmulTranspose.cpp
+++ b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/MatmulTranspose.cpp -------------*- C++ -*-===//
+//===-- unittests/Runtime/MatmulTranspose.cpp -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/MiscIntrinsic.cpp b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
similarity index 98%
rename from flang/unittests/Runtime/MiscIntrinsic.cpp
rename to FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
index 7e19ed250bdc05..5672440c0e1b95 100644
--- a/flang/unittests/Runtime/MiscIntrinsic.cpp
+++ b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/MiscIntrinsic.cpp ---------------*- C++ -*-===//
+//===-- unittests/Runtime/MiscIntrinsic.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Namelist.cpp b/FortranRuntime/unittests/Runtime/Namelist.cpp
similarity index 99%
rename from flang/unittests/Runtime/Namelist.cpp
rename to FortranRuntime/unittests/Runtime/Namelist.cpp
index 9037fa15a97cb3..729f9ffa5c7c10 100644
--- a/flang/unittests/Runtime/Namelist.cpp
+++ b/FortranRuntime/unittests/Runtime/Namelist.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Namelist.cpp --------------------*- C++ -*-===//
+//===-- unittests/Runtime/Namelist.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../runtime/namelist.h"
+#include "../../lib/Runtime/namelist.h"
 #include "CrashHandlerFixture.h"
 #include "tools.h"
 #include "flang/Runtime/descriptor.h"
diff --git a/flang/unittests/Runtime/Numeric.cpp b/FortranRuntime/unittests/Runtime/Numeric.cpp
similarity index 99%
rename from flang/unittests/Runtime/Numeric.cpp
rename to FortranRuntime/unittests/Runtime/Numeric.cpp
index 799756aab3839a..d15919b972bca7 100644
--- a/flang/unittests/Runtime/Numeric.cpp
+++ b/FortranRuntime/unittests/Runtime/Numeric.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Numeric.cpp ---------------------*- C++ -*-===//
+//===-- unittests/Runtime/Numeric.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/NumericalFormatTest.cpp b/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
similarity index 99%
rename from flang/unittests/Runtime/NumericalFormatTest.cpp
rename to FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
index f0055153203508..8a1dd6de1449b9 100644
--- a/flang/unittests/Runtime/NumericalFormatTest.cpp
+++ b/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/NumericalFormatTest.cpp ---------*- C++ -*-===//
+//===-- unittests/Runtime/NumericalFormatTest.cpp ---------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Pointer.cpp b/FortranRuntime/unittests/Runtime/Pointer.cpp
similarity index 98%
rename from flang/unittests/Runtime/Pointer.cpp
rename to FortranRuntime/unittests/Runtime/Pointer.cpp
index 4ce13ebc50a565..aa8545cdf951d1 100644
--- a/flang/unittests/Runtime/Pointer.cpp
+++ b/FortranRuntime/unittests/Runtime/Pointer.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Pointer.cpp--------- -------------*- C++-*-===//
+//===-- unittests/Runtime/Pointer.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Ragged.cpp b/FortranRuntime/unittests/Runtime/Ragged.cpp
similarity index 94%
rename from flang/unittests/Runtime/Ragged.cpp
rename to FortranRuntime/unittests/Runtime/Ragged.cpp
index 5049bc83405f17..feadd032f59bd4 100644
--- a/flang/unittests/Runtime/Ragged.cpp
+++ b/FortranRuntime/unittests/Runtime/Ragged.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Ragged.cpp ----------------------*- C++ -*-===//
+//===-- unittests/Runtime/Ragged.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Random.cpp b/FortranRuntime/unittests/Runtime/Random.cpp
similarity index 97%
rename from flang/unittests/Runtime/Random.cpp
rename to FortranRuntime/unittests/Runtime/Random.cpp
index cb739b94514290..c2300a478832ab 100644
--- a/flang/unittests/Runtime/Random.cpp
+++ b/FortranRuntime/unittests/Runtime/Random.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Random.cpp ----------------------*- C++ -*-===//
+//===-- unittests/Runtime/Random.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Reduction.cpp b/FortranRuntime/unittests/Runtime/Reduction.cpp
similarity index 99%
rename from flang/unittests/Runtime/Reduction.cpp
rename to FortranRuntime/unittests/Runtime/Reduction.cpp
index 25eb5fd760eadb..e8b5ac878871fd 100644
--- a/flang/unittests/Runtime/Reduction.cpp
+++ b/FortranRuntime/unittests/Runtime/Reduction.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Reductions.cpp ----------------------------===//
+//===-- unittests/Runtime/Reduction.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/RuntimeCrashTest.cpp b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
similarity index 98%
rename from flang/unittests/Runtime/RuntimeCrashTest.cpp
rename to FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
index a649051fdca0c5..7ce1ee796d739b 100644
--- a/flang/unittests/Runtime/RuntimeCrashTest.cpp
+++ b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/CrashHandlerFixture.cpp ---------*- C++ -*-===//
+//===-- unittests/Runtime/RuntimeCrashTest.cpp ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 #include "CrashHandlerFixture.h"
 #include "tools.h"
-#include "../../runtime/terminator.h"
+#include "../../lib/Runtime/terminator.h"
 #include "flang/Runtime/io-api.h"
 #include "flang/Runtime/transformational.h"
 #include <gtest/gtest.h>
diff --git a/flang/unittests/Runtime/Stop.cpp b/FortranRuntime/unittests/Runtime/Stop.cpp
similarity index 96%
rename from flang/unittests/Runtime/Stop.cpp
rename to FortranRuntime/unittests/Runtime/Stop.cpp
index b13602eaee5ea6..c12ec097068438 100644
--- a/flang/unittests/Runtime/Stop.cpp
+++ b/FortranRuntime/unittests/Runtime/Stop.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Stop.cpp ----------------------------------===//
+//===-- unittests/Runtime/Stop.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 #include "flang/Runtime/stop.h"
 #include "CrashHandlerFixture.h"
-#include "../../runtime/environment.h"
+#include "../../lib/Runtime/environment.h"
 #include <cstdlib>
 #include <gtest/gtest.h>
 
diff --git a/flang/unittests/Runtime/Support.cpp b/FortranRuntime/unittests/Runtime/Support.cpp
similarity index 97%
rename from flang/unittests/Runtime/Support.cpp
rename to FortranRuntime/unittests/Runtime/Support.cpp
index 9d1a417fdbf426..b7aa39ef5523ba 100644
--- a/flang/unittests/Runtime/Support.cpp
+++ b/FortranRuntime/unittests/Runtime/Support.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Support.cpp ----------------------*- C++-*-===//
+//===-- unittests/Runtime/Support.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/TemporaryStack.cpp b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
similarity index 98%
rename from flang/unittests/Runtime/TemporaryStack.cpp
rename to FortranRuntime/unittests/Runtime/TemporaryStack.cpp
index 0a9344969ca6ba..495c693b0493ef 100644
--- a/flang/unittests/Runtime/TemporaryStack.cpp
+++ b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
@@ -1,4 +1,4 @@
-//===--- flang/unittests/Runtime/TemporaryStack.cpp -------------*- C++ -*-===//
+//===-- unittests/Runtime/TemporaryStack.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,7 +8,7 @@
 
 #include "gtest/gtest.h"
 #include "tools.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
diff --git a/flang/unittests/Runtime/Time.cpp b/FortranRuntime/unittests/Runtime/Time.cpp
similarity index 98%
rename from flang/unittests/Runtime/Time.cpp
rename to FortranRuntime/unittests/Runtime/Time.cpp
index 9309d7b1ceffa0..548c0834e34a36 100644
--- a/flang/unittests/Runtime/Time.cpp
+++ b/FortranRuntime/unittests/Runtime/Time.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Time.cpp ----------------------------===//
+//===-- unittests/Runtime/Time.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/Transformational.cpp b/FortranRuntime/unittests/Runtime/Transformational.cpp
similarity index 99%
rename from flang/unittests/Runtime/Transformational.cpp
rename to FortranRuntime/unittests/Runtime/Transformational.cpp
index 5836e70c740f9a..2dcab5a2aa8974 100644
--- a/flang/unittests/Runtime/Transformational.cpp
+++ b/FortranRuntime/unittests/Runtime/Transformational.cpp
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/Transformational.cpp ----------------------===//
+//===-- unittests/Runtime/Transformational.cpp ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/unittests/Runtime/tools.h b/FortranRuntime/unittests/Runtime/tools.h
similarity index 96%
rename from flang/unittests/Runtime/tools.h
rename to FortranRuntime/unittests/Runtime/tools.h
index 0347edace5c05c..a8e2096a90572e 100644
--- a/flang/unittests/Runtime/tools.h
+++ b/FortranRuntime/unittests/Runtime/tools.h
@@ -1,4 +1,4 @@
-//===-- flang/unittests/Runtime/tools.h -------------------------*- C++ -*-===//
+//===-- unittests/Runtime/tools.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index f58b816a9709dd..5e4057116a97cb 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1291,7 +1291,7 @@ void tools::addOpenMPHostOffloadingArgs(const Compilation &C,
 /// Add Fortran runtime libs
 void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
                                   llvm::opt::ArgStringList &CmdArgs) {
-  // Link FortranRuntime and FortranDecimal
+  // Link FortranRuntime
   // These are handled earlier on Windows by telling the frontend driver to
   // add the correct libraries to link against as dependents in the object
   // file.
@@ -1308,7 +1308,6 @@ void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
         addAsNeededOption(TC, Args, CmdArgs, /*as_needed=*/false);
     }
     CmdArgs.push_back("-lFortranRuntime");
-    CmdArgs.push_back("-lFortranDecimal");
   }
 }
 
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 6ce79d27e98c48..3619a8f4b81f08 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -309,21 +309,18 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("--dependent-lib=libcmt");
     CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
-    CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
     break;
   case options::OPT__SLASH_MTd:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("-D_DEBUG");
     CmdArgs.push_back("--dependent-lib=libcmtd");
     CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
-    CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
     break;
   case options::OPT__SLASH_MD:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("-D_DLL");
     CmdArgs.push_back("--dependent-lib=msvcrt");
     CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
-    CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
     break;
   case options::OPT__SLASH_MDd:
     CmdArgs.push_back("-D_MT");
@@ -331,7 +328,6 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
     CmdArgs.push_back("-D_DLL");
     CmdArgs.push_back("--dependent-lib=msvcrtd");
     CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
-    CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
     break;
   }
 }
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index 971e5d5c93f231..00e570798bb412 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -23,6 +23,7 @@ if (LLVM_ENABLE_EH)
 endif()
 
 set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(FORTRANRUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../FortranRuntime")
 
 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
   message(FATAL_ERROR "In-source builds are not allowed. \
@@ -34,17 +35,6 @@ endif()
 
 option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
 
-# The out of tree builds of the compiler and the Fortran runtime
-# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
-# to be composable. Failure to synchronize this setting may result
-# in linking errors or fatal failures in F128 runtime functions.
-set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
-  "Specifies the target library used for implementing IEEE-754 128-bit float \
-  math in F18 runtime, e.g. it might be libquadmath for targets where \
-  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
-  is mapped to long double, etc."
-  )
-
 # Check for a standalone build and configure as appropriate from
 # there.
 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
@@ -170,7 +160,6 @@ if (FLANG_STANDALONE_BUILD)
 
   link_directories("${LLVM_LIBRARY_DIR}")
 
-  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
     ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
   set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
@@ -249,7 +238,6 @@ include_directories(SYSTEM ${CLANG_INCLUDE_DIR})
 
 # tco tool and FIR lib output directories
 if(FLANG_STANDALONE_BUILD)
-  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
   set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
 endif()
 # Always build tco tool
@@ -257,7 +245,8 @@ set(LLVM_BUILD_TOOLS ON)
 
 include_directories(BEFORE
   ${FLANG_BINARY_DIR}/include
-  ${FLANG_SOURCE_DIR}/include)
+  ${FLANG_SOURCE_DIR}/include
+  ${FORTRANRUNTIME_SOURCE_DIR}/include)
 
 # Add Flang-centric modules to cmake path.
 list(INSERT CMAKE_MODULE_PATH 0
@@ -335,12 +324,6 @@ if (FLANG_REPOSITORY_STRING)
   add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
 endif()
 
-if (FLANG_RUNTIME_F128_MATH_LIB)
-  add_compile_definitions(
-    FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}"
-    )
-endif()
-
 include(TestBigEndian)
 test_big_endian(IS_BIGENDIAN)
 if (IS_BIGENDIAN)
@@ -462,14 +445,6 @@ if (FLANG_BUILD_TOOLS)
   add_subdirectory(tools)
 endif()
 
-option(FLANG_CUF_RUNTIME
-  "Compile CUDA Fortran runtime sources" OFF)
-if (FLANG_CUF_RUNTIME)
-  find_package(CUDAToolkit REQUIRED)
-endif()
-
-add_subdirectory(runtime)
-
 if (LLVM_INCLUDE_EXAMPLES)
   add_subdirectory(examples)
 endif()
@@ -532,17 +507,3 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
     )
 endif()
 
-# Put ISO_Fortran_binding.h into the include files of the build area now
-# so that we can run tests before installing
-include(GetClangResourceDir)
-get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
-configure_file(
-  ${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
-  ${HEADER_BINARY_DIR}/ISO_Fortran_binding.h)
-
-# And also install it into the install area
-get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)
-install(
-  FILES include/flang/ISO_Fortran_binding.h
-  DESTINATION ${HEADER_INSTALL_DIR} )
-
diff --git a/flang/docs/FlangDriver.md b/flang/docs/FlangDriver.md
index e1c11062125028..98611ee338e706 100644
--- a/flang/docs/FlangDriver.md
+++ b/flang/docs/FlangDriver.md
@@ -179,19 +179,18 @@ like this:
 
 ```
 $ flang -v -o example example.o
-"/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" "-lFortranDecimal" [...]
+"/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" [...]
 ```
 
 The automatically added libraries are:
 
 * `FortranRuntime`: Provides most of the Flang runtime library.
-* `FortranDecimal`: Provides operations for decimal numbers.
 
 If the code is C/C++ based and invokes Fortran routines, one can either use Clang
 or Flang as the linker driver.  If Clang is used, it will automatically all
 required runtime libraries needed by C++ (e.g., for STL) to the linker invocation.
 In this case, one has to explicitly provide the Fortran runtime libraries
-`FortranRuntime` and/or `FortranDecimal`.  An alternative is to use Flang to link.
+`FortranRuntime`.  An alternative is to use Flang to link.
 In this case, it may be required to explicitly supply C++ runtime libraries.
 
 On Darwin, the logical root where the system libraries are located (sysroot)
diff --git a/flang/include/flang/Evaluate/call.h b/flang/include/flang/Evaluate/call.h
index 7531d8a81e808d..8137185da61442 100644
--- a/flang/include/flang/Evaluate/call.h
+++ b/flang/include/flang/Evaluate/call.h
@@ -13,9 +13,9 @@
 #include "constant.h"
 #include "formatting.h"
 #include "type.h"
-#include "flang/Common/Fortran.h"
-#include "flang/Common/indirection.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
+#include "flang/Support/reference.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Semantics/attr.h"
 #include <optional>
diff --git a/flang/include/flang/Evaluate/characteristics.h b/flang/include/flang/Evaluate/characteristics.h
index 11533a7259b055..8f1e6876d88d58 100644
--- a/flang/include/flang/Evaluate/characteristics.h
+++ b/flang/include/flang/Evaluate/characteristics.h
@@ -18,11 +18,11 @@
 #include "shape.h"
 #include "tools.h"
 #include "type.h"
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Semantics/symbol.h"
 #include <optional>
diff --git a/flang/include/flang/Evaluate/common.h b/flang/include/flang/Evaluate/common.h
index d493e5fe044173..69f09a930dc604 100644
--- a/flang/include/flang/Evaluate/common.h
+++ b/flang/include/flang/Evaluate/common.h
@@ -9,15 +9,17 @@
 #ifndef FORTRAN_EVALUATE_COMMON_H_
 #define FORTRAN_EVALUATE_COMMON_H_
 
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/Fortran.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
+#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/restorer.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
+#include "flang/Common/target-rounding.h"
 #include <cinttypes>
 #include <map>
 #include <set>
@@ -33,6 +35,9 @@ class TargetCharacteristics;
 
 using common::ConstantSubscript;
 using common::RelationalOperator;
+using common::RoundingMode;
+using common::RealFlags;
+using common::RealFlag;
 
 // Integers are always ordered; reals may not be.
 ENUM_CLASS(Ordering, Less, Equal, Greater)
@@ -128,11 +133,6 @@ static constexpr bool Satisfies(RelationalOperator op, Relation relation) {
   return false; // silence g++ warning
 }
 
-// These are ordered like the bits in a common fenv.h header file.
-ENUM_CLASS(RealFlag, InvalidArgument, Denorm, DivideByZero, Overflow, Underflow,
-    Inexact)
-using RealFlags = common::EnumSet<RealFlag, RealFlag_enumSize>;
-
 template <typename A> struct ValueWithRealFlags {
   A AccumulateFlags(RealFlags &f) {
     f |= flags;
diff --git a/flang/include/flang/Evaluate/constant.h b/flang/include/flang/Evaluate/constant.h
index d9866a08889f35..a171b10026409c 100644
--- a/flang/include/flang/Evaluate/constant.h
+++ b/flang/include/flang/Evaluate/constant.h
@@ -11,8 +11,8 @@
 
 #include "formatting.h"
 #include "type.h"
-#include "flang/Common/default-kinds.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/reference.h"
 #include <map>
 #include <vector>
 
diff --git a/flang/include/flang/Evaluate/expression.h b/flang/include/flang/Evaluate/expression.h
index 2a40193e32306b..a582a2ea1a6989 100644
--- a/flang/include/flang/Evaluate/expression.h
+++ b/flang/include/flang/Evaluate/expression.h
@@ -21,10 +21,10 @@
 #include "formatting.h"
 #include "type.h"
 #include "variable.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
-#include "flang/Common/template.h"
+#include "flang/Support/indirection.h"
+#include "flang/Support/template.h"
 #include "flang/Parser/char-block.h"
 #include <algorithm>
 #include <list>
diff --git a/flang/include/flang/Evaluate/formatting.h b/flang/include/flang/Evaluate/formatting.h
index aa82f56107fdd3..ae9351139b1933 100644
--- a/flang/include/flang/Evaluate/formatting.h
+++ b/flang/include/flang/Evaluate/formatting.h
@@ -19,7 +19,7 @@
 // This header is meant to be included by the headers that define the several
 // representational class templates that need it, not by external clients.
 
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <optional>
 #include <type_traits>
diff --git a/flang/include/flang/Evaluate/intrinsics.h b/flang/include/flang/Evaluate/intrinsics.h
index 15afb772ae767b..17f555445f6f79 100644
--- a/flang/include/flang/Evaluate/intrinsics.h
+++ b/flang/include/flang/Evaluate/intrinsics.h
@@ -12,7 +12,7 @@
 #include "call.h"
 #include "characteristics.h"
 #include "type.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
 #include <memory>
diff --git a/flang/include/flang/Evaluate/shape.h b/flang/include/flang/Evaluate/shape.h
index e33044c0d34e56..f3eeea7984bba7 100644
--- a/flang/include/flang/Evaluate/shape.h
+++ b/flang/include/flang/Evaluate/shape.h
@@ -15,7 +15,7 @@
 #include "expression.h"
 #include "traverse.h"
 #include "variable.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Evaluate/type.h"
 #include <optional>
 #include <variant>
diff --git a/flang/include/flang/Evaluate/target.h b/flang/include/flang/Evaluate/target.h
index d076fcbf083078..8f52b29bec6654 100644
--- a/flang/include/flang/Evaluate/target.h
+++ b/flang/include/flang/Evaluate/target.h
@@ -12,27 +12,16 @@
 #ifndef FORTRAN_EVALUATE_TARGET_H_
 #define FORTRAN_EVALUATE_TARGET_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-class.h"
 #include "flang/Common/enum-set.h"
+#include "flang/Common/target-rounding.h"
 #include "flang/Evaluate/common.h"
 #include <cstdint>
 
 namespace Fortran::evaluate {
 
-// Floating-point rounding control
-struct Rounding {
-  common::RoundingMode mode{common::RoundingMode::TiesToEven};
-  // When set, emulate status flag behavior peculiar to x86
-  // (viz., fail to set the Underflow flag when an inexact product of a
-  // multiplication is rounded up to a normal number from a subnormal
-  // in some rounding modes)
-#if __x86_64__ || __riscv || __loongarch__
-  bool x86CompatibleBehavior{true};
-#else
-  bool x86CompatibleBehavior{false};
-#endif
-};
+using common::Rounding;
 
 ENUM_CLASS(IeeeFeature, Denormal, Divide, Flags, Halting, Inf, Io, NaN,
     Rounding, Sqrt, Standard, Subnormal, UnderflowControl)
diff --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h
index a0487e399d936c..29d19bff44c79c 100644
--- a/flang/include/flang/Evaluate/tools.h
+++ b/flang/include/flang/Evaluate/tools.h
@@ -11,8 +11,8 @@
 
 #include "traverse.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/template.h"
-#include "flang/Common/unwrap.h"
+#include "flang/Support/template.h"
+#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/constant.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/shape.h"
diff --git a/flang/include/flang/Evaluate/traverse.h b/flang/include/flang/Evaluate/traverse.h
index 7f4a67d97e64e7..e04888f395c013 100644
--- a/flang/include/flang/Evaluate/traverse.h
+++ b/flang/include/flang/Evaluate/traverse.h
@@ -38,7 +38,7 @@
 // expression of an ASSOCIATE (or related) construct entity.
 
 #include "expression.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/type.h"
 #include <set>
diff --git a/flang/include/flang/Evaluate/type.h b/flang/include/flang/Evaluate/type.h
index bd8887dbce4e82..b68a5790c810fd 100644
--- a/flang/include/flang/Evaluate/type.h
+++ b/flang/include/flang/Evaluate/type.h
@@ -22,11 +22,11 @@
 #include "integer.h"
 #include "logical.h"
 #include "real.h"
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Common/real.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include <cinttypes>
 #include <optional>
 #include <string>
diff --git a/flang/include/flang/Evaluate/variable.h b/flang/include/flang/Evaluate/variable.h
index 9565826dbfaea4..8d0da5b24277cd 100644
--- a/flang/include/flang/Evaluate/variable.h
+++ b/flang/include/flang/Evaluate/variable.h
@@ -21,8 +21,8 @@
 #include "static-data.h"
 #include "type.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/reference.h"
-#include "flang/Common/template.h"
+#include "flang/Support/reference.h"
+#include "flang/Support/template.h"
 #include "flang/Parser/char-block.h"
 #include <optional>
 #include <variant>
diff --git a/flang/include/flang/Frontend/FrontendOptions.h b/flang/include/flang/Frontend/FrontendOptions.h
index 82ca99672ec610..b69ffe83de1707 100644
--- a/flang/include/flang/Frontend/FrontendOptions.h
+++ b/flang/include/flang/Frontend/FrontendOptions.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_FRONTEND_FRONTENDOPTIONS_H
 #define FORTRAN_FRONTEND_FRONTENDOPTIONS_H
 
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Lower/EnvironmentDefault.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/unparse.h"
diff --git a/flang/include/flang/Lower/AbstractConverter.h b/flang/include/flang/Lower/AbstractConverter.h
index daded9091780e2..56646c196a7de5 100644
--- a/flang/include/flang/Lower/AbstractConverter.h
+++ b/flang/include/flang/Lower/AbstractConverter.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_LOWER_ABSTRACTCONVERTER_H
 #define FORTRAN_LOWER_ABSTRACTCONVERTER_H
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Lower/LoweringOptions.h"
 #include "flang/Lower/PFTDefs.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h
index 4379ed512cdf0a..0c2c7abc324952 100644
--- a/flang/include/flang/Lower/Bridge.h
+++ b/flang/include/flang/Lower/Bridge.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_LOWER_BRIDGE_H
 #define FORTRAN_LOWER_BRIDGE_H
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Lower/EnvironmentDefault.h"
 #include "flang/Lower/LoweringOptions.h"
diff --git a/flang/include/flang/Lower/CallInterface.h b/flang/include/flang/Lower/CallInterface.h
index 9a688330e8bd2d..df01eafe679d7d 100644
--- a/flang/include/flang/Lower/CallInterface.h
+++ b/flang/include/flang/Lower/CallInterface.h
@@ -27,7 +27,7 @@
 #ifndef FORTRAN_LOWER_CALLINTERFACE_H
 #define FORTRAN_LOWER_CALLINTERFACE_H
 
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Evaluate/characteristics.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/BuiltinOps.h"
diff --git a/flang/include/flang/Lower/ConvertType.h b/flang/include/flang/Lower/ConvertType.h
index 7a3f92649a4e4a..b889d2bb279de2 100644
--- a/flang/include/flang/Lower/ConvertType.h
+++ b/flang/include/flang/Lower/ConvertType.h
@@ -21,7 +21,7 @@
 #ifndef FORTRAN_LOWER_CONVERT_TYPE_H
 #define FORTRAN_LOWER_CONVERT_TYPE_H
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/type.h"
 #include "mlir/IR/BuiltinTypes.h"
 
diff --git a/flang/include/flang/Lower/LoweringOptions.h b/flang/include/flang/Lower/LoweringOptions.h
index 8105ccd7ef6b15..171510393b8168 100644
--- a/flang/include/flang/Lower/LoweringOptions.h
+++ b/flang/include/flang/Lower/LoweringOptions.h
@@ -15,7 +15,7 @@
 #ifndef FLANG_LOWER_LOWERINGOPTIONS_H
 #define FLANG_LOWER_LOWERINGOPTIONS_H
 
-#include "flang/Common/MathOptionsBase.h"
+#include "flang/Support/MathOptionsBase.h"
 
 namespace Fortran::lower {
 
diff --git a/flang/include/flang/Lower/PFTBuilder.h b/flang/include/flang/Lower/PFTBuilder.h
index 7f1b93c564b4c4..7ee61e630581fe 100644
--- a/flang/include/flang/Lower/PFTBuilder.h
+++ b/flang/include/flang/Lower/PFTBuilder.h
@@ -17,8 +17,8 @@
 #ifndef FORTRAN_LOWER_PFTBUILDER_H
 #define FORTRAN_LOWER_PFTBUILDER_H
 
-#include "flang/Common/reference.h"
-#include "flang/Common/template.h"
+#include "flang/Support/reference.h"
+#include "flang/Support/template.h"
 #include "flang/Lower/HostAssociations.h"
 #include "flang/Lower/PFTDefs.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/include/flang/Lower/Support/Utils.h b/flang/include/flang/Lower/Support/Utils.h
index 1cc74521e22d88..a09cfb16f7805a 100644
--- a/flang/include/flang/Lower/Support/Utils.h
+++ b/flang/include/flang/Lower/Support/Utils.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_LOWER_SUPPORT_UTILS_H
 #define FORTRAN_LOWER_SUPPORT_UTILS_H
 
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Semantics/tools.h"
 #include "mlir/Dialect/Arith/IR/Arith.h"
diff --git a/flang/include/flang/Lower/SymbolMap.h b/flang/include/flang/Lower/SymbolMap.h
index c03f9afd40801c..7bba02e41a3bdf 100644
--- a/flang/include/flang/Lower/SymbolMap.h
+++ b/flang/include/flang/Lower/SymbolMap.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_LOWER_SYMBOLMAP_H
 #define FORTRAN_LOWER_SYMBOLMAP_H
 
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Optimizer/Dialect/FortranVariableInterface.h"
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
index f7151f26f09cb3..90279417b5c939 100644
--- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
@@ -16,7 +16,7 @@
 #ifndef FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H
 #define FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H
 
-#include "flang/Common/MathOptionsBase.h"
+#include "flang/Support/MathOptionsBase.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Dialect/FIROpsSupport.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
index 78bb82b17d4050..3fc4201bd16c6c 100644
--- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
+++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
@@ -397,6 +397,7 @@ struct IntrinsicLibrary {
   fir::ExtendedValue genUbound(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genUnpack(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genVerify(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
+    fir::ExtendedValue genNumericStorageSize(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
 
   /// Implement all conversion functions like DBLE, the first argument is
   /// the value to convert. There may be an additional KIND arguments that
diff --git a/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h b/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
index a7c4c075d818ee..26cf34188eb568 100644
--- a/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
+++ b/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_LOWER_PPCINTRINSICCALL_H
 #define FORTRAN_LOWER_PPCINTRINSICCALL_H
 
-#include "flang/Common/static-multimap-view.h"
+#include "flang/Support/static-multimap-view.h"
 #include "flang/Optimizer/Builder/IntrinsicCall.h"
 #include "mlir/Dialect/Math/IR/Math.h"
 
diff --git a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
index a103861f1510b8..104e363e689857 100644
--- a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
@@ -17,7 +17,7 @@
 #ifndef FORTRAN_OPTIMIZER_BUILDER_RUNTIME_RTBUILDER_H
 #define FORTRAN_OPTIMIZER_BUILDER_RUNTIME_RTBUILDER_H
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/uint128.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
diff --git a/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h b/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
index ff0cf29e8073e6..31d1416846d0c9 100644
--- a/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
+++ b/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
@@ -22,7 +22,7 @@
 #ifndef OPTIMIZER_DESCRIPTOR_MODEL_H
 #define OPTIMIZER_DESCRIPTOR_MODEL_H
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
 #include "mlir/IR/BuiltinTypes.h"
diff --git a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
index f32e39b543e3f7..85615a4d69157d 100644
--- a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
+++ b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
 #define FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/BuiltinAttributes.h"
 
 namespace llvm {
diff --git a/flang/include/flang/Optimizer/Support/TypeCode.h b/flang/include/flang/Optimizer/Support/TypeCode.h
index 308c82118d5020..ec21d672287e62 100644
--- a/flang/include/flang/Optimizer/Support/TypeCode.h
+++ b/flang/include/flang/Optimizer/Support/TypeCode.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_OPTIMIZER_SUPPORT_TYPECODE_H
 #define FORTRAN_OPTIMIZER_SUPPORT_TYPECODE_H
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "llvm/Support/ErrorHandling.h"
 
 namespace fir {
diff --git a/flang/include/flang/Optimizer/Support/Utils.h b/flang/include/flang/Optimizer/Support/Utils.h
index 02bec4164fca08..631322b34c49e5 100644
--- a/flang/include/flang/Optimizer/Support/Utils.h
+++ b/flang/include/flang/Optimizer/Support/Utils.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_OPTIMIZER_SUPPORT_UTILS_H
 #define FORTRAN_OPTIMIZER_SUPPORT_UTILS_H
 
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h"
diff --git a/flang/include/flang/Parser/char-block.h b/flang/include/flang/Parser/char-block.h
index 38f4f7b82e1eae..4541b31e566f95 100644
--- a/flang/include/flang/Parser/char-block.h
+++ b/flang/include/flang/Parser/char-block.h
@@ -11,7 +11,7 @@
 
 // Describes a contiguous block of characters; does not own their storage.
 
-#include "flang/Common/interval.h"
+#include "flang/Support/interval.h"
 #include <algorithm>
 #include <cstddef>
 #include <cstring>
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 37c3370b48a085..f98ac17b6ecba7 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -14,9 +14,9 @@
 #include "parse-tree.h"
 #include "tools.h"
 #include "unparse.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <string>
 #include <type_traits>
diff --git a/flang/include/flang/Parser/message.h b/flang/include/flang/Parser/message.h
index 668559aeec9478..70746bf551f2d7 100644
--- a/flang/include/flang/Parser/message.h
+++ b/flang/include/flang/Parser/message.h
@@ -16,7 +16,7 @@
 #include "char-set.h"
 #include "provenance.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/reference-counted.h"
+#include "flang/Support/reference-counted.h"
 #include "flang/Common/restorer.h"
 #include <cstddef>
 #include <cstring>
diff --git a/flang/include/flang/Parser/parse-state.h b/flang/include/flang/Parser/parse-state.h
index 76cbb3470dc08d..20d339aeeccccf 100644
--- a/flang/include/flang/Parser/parse-state.h
+++ b/flang/include/flang/Parser/parse-state.h
@@ -16,7 +16,7 @@
 // and recovery during parsing!
 
 #include "user-state.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/message.h"
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 548fcc81984b2a..a6d19dd6435966 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -22,9 +22,9 @@
 #include "format-specification.h"
 #include "message.h"
 #include "provenance.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Frontend/OpenACC/ACC.h.inc"
 #include "llvm/Frontend/OpenMP/OMPConstants.h"
 #include <cinttypes>
diff --git a/flang/include/flang/Parser/parsing.h b/flang/include/flang/Parser/parsing.h
index 4d329c189cb80e..b0de98737f536e 100644
--- a/flang/include/flang/Parser/parsing.h
+++ b/flang/include/flang/Parser/parsing.h
@@ -14,7 +14,7 @@
 #include "message.h"
 #include "parse-tree.h"
 #include "provenance.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/preprocessor.h"
 #include "llvm/Support/raw_ostream.h"
 #include <optional>
diff --git a/flang/include/flang/Parser/provenance.h b/flang/include/flang/Parser/provenance.h
index a9224b727fd054..7f29fb272c9421 100644
--- a/flang/include/flang/Parser/provenance.h
+++ b/flang/include/flang/Parser/provenance.h
@@ -14,7 +14,7 @@
 #include "characters.h"
 #include "source.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/interval.h"
+#include "flang/Support/interval.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstddef>
 #include <list>
diff --git a/flang/include/flang/Parser/source.h b/flang/include/flang/Parser/source.h
index a6efdf9546c7f3..a67fd66045a3de 100644
--- a/flang/include/flang/Parser/source.h
+++ b/flang/include/flang/Parser/source.h
@@ -15,7 +15,7 @@
 //  - A Unicode byte order mark is recognized if present.
 
 #include "characters.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstddef>
diff --git a/flang/include/flang/Parser/user-state.h b/flang/include/flang/Parser/user-state.h
index 61745a833c715c..fff651208e0e52 100644
--- a/flang/include/flang/Parser/user-state.h
+++ b/flang/include/flang/Parser/user-state.h
@@ -14,7 +14,7 @@
 // parse tree construction so as to avoid any need for representing
 // state in static data.
 
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/include/flang/Semantics/expression.h b/flang/include/flang/Semantics/expression.h
index c90c8c4b3cc70f..77e26ffb834dd9 100644
--- a/flang/include/flang/Semantics/expression.h
+++ b/flang/include/flang/Semantics/expression.h
@@ -10,8 +10,8 @@
 #define FORTRAN_SEMANTICS_EXPRESSION_H_
 
 #include "semantics.h"
-#include "flang/Common/Fortran.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include "flang/Common/restorer.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/characteristics.h"
diff --git a/flang/include/flang/Semantics/runtime-type-info.h b/flang/include/flang/Semantics/runtime-type-info.h
index e90d3ae8baf1eb..3f9f776797d782 100644
--- a/flang/include/flang/Semantics/runtime-type-info.h
+++ b/flang/include/flang/Semantics/runtime-type-info.h
@@ -14,7 +14,7 @@
 #ifndef FORTRAN_SEMANTICS_RUNTIME_TYPE_INFO_H_
 #define FORTRAN_SEMANTICS_RUNTIME_TYPE_INFO_H_
 
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Semantics/symbol.h"
 #include <map>
 #include <set>
diff --git a/flang/include/flang/Semantics/scope.h b/flang/include/flang/Semantics/scope.h
index e73a507e9b3f5b..8b416dcffb5245 100644
--- a/flang/include/flang/Semantics/scope.h
+++ b/flang/include/flang/Semantics/scope.h
@@ -11,9 +11,9 @@
 
 #include "attr.h"
 #include "symbol.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/provenance.h"
 #include <list>
diff --git a/flang/include/flang/Semantics/semantics.h b/flang/include/flang/Semantics/semantics.h
index e73f9d2e85d589..899d4afa016bff 100644
--- a/flang/include/flang/Semantics/semantics.h
+++ b/flang/include/flang/Semantics/semantics.h
@@ -11,7 +11,7 @@
 
 #include "scope.h"
 #include "symbol.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/intrinsics.h"
 #include "flang/Evaluate/target.h"
diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index b4db6689a94271..29587be2c7d77d 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -10,9 +10,9 @@
 #define FORTRAN_SEMANTICS_SYMBOL_H_
 
 #include "type.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Common/visit.h"
 #include "flang/Semantics/module-dependences.h"
 #include "llvm/ADT/DenseMapInfo.h"
diff --git a/flang/include/flang/Semantics/tools.h b/flang/include/flang/Semantics/tools.h
index 15c02ecc0058cc..9be7ebff9b5bb6 100644
--- a/flang/include/flang/Semantics/tools.h
+++ b/flang/include/flang/Semantics/tools.h
@@ -12,7 +12,7 @@
 // Simple predicates and look-up functions that are best defined
 // canonically for use in semantic checking.
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/shape.h"
diff --git a/flang/include/flang/Semantics/type.h b/flang/include/flang/Semantics/type.h
index e2d47d38f927f7..fd31bc805e2de6 100644
--- a/flang/include/flang/Semantics/type.h
+++ b/flang/include/flang/Semantics/type.h
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_SEMANTICS_TYPE_H_
 #define FORTRAN_SEMANTICS_TYPE_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/char-block.h"
diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
similarity index 98%
rename from flang/include/flang/Common/Fortran-features.h
rename to flang/include/flang/Support/Fortran-features.h
index 86c6e02b0f2ffd..f0bfc9232ea9e9 100644
--- a/flang/include/flang/Common/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/Fortran-features.h -----------------*- C++ -*-===//
+//===-- include/flang/Support/Fortran-features.h ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_COMMON_FORTRAN_FEATURES_H_
 #define FORTRAN_COMMON_FORTRAN_FEATURES_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
 #include <vector>
diff --git a/flang/include/flang/Common/Fortran.h b/flang/include/flang/Support/Fortran.h
similarity index 73%
rename from flang/include/flang/Common/Fortran.h
rename to flang/include/flang/Support/Fortran.h
index 5b2ed43a8f99c0..6dbfb51f19dd8e 100644
--- a/flang/include/flang/Common/Fortran.h
+++ b/flang/include/flang/Support/Fortran.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/Fortran.h --------------------------*- C++ -*-===//
+//===-- include/flang/Support/Fortran.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,21 +9,20 @@
 #ifndef FORTRAN_COMMON_FORTRAN_H_
 #define FORTRAN_COMMON_FORTRAN_H_
 
-// Fortran language concepts that are used in many phases are defined
-// once here to avoid redundancy and needless translation.
 
-#include "enum-set.h"
-#include "idioms.h"
+
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Common/enum-set.h"
+#include "flang/Common/idioms.h"
 #include <cinttypes>
 #include <optional>
 #include <string>
 
+
 namespace Fortran::common {
-class LanguageFeatureControl;
+	class LanguageFeatureControl;
+
 
-// Fortran has five kinds of intrinsic data types, plus the derived types.
-ENUM_CLASS(TypeCategory, Integer, Real, Complex, Character, Logical, Derived)
-ENUM_CLASS(VectorElementCategory, Integer, Unsigned, Real)
 
 constexpr bool IsNumericTypeCategory(TypeCategory category) {
   return category == TypeCategory::Integer || category == TypeCategory::Real ||
@@ -47,8 +46,6 @@ const char *AsFortran(RelationalOperator);
 
 ENUM_CLASS(Intent, Default, In, Out, InOut)
 
-ENUM_CLASS(IoStmtKind, None, Backspace, Close, Endfile, Flush, Inquire, Open,
-    Print, Read, Rewind, Wait, Write)
 
 // Union of specifiers for all I/O statements.
 ENUM_CLASS(IoSpecKind, Access, Action, Advance, Asynchronous, Blank, Decimal,
@@ -61,28 +58,14 @@ ENUM_CLASS(IoSpecKind, Access, Action, Advance, Asynchronous, Blank, Decimal,
     Dispose, // nonstandard
 )
 
-// Defined I/O variants
-ENUM_CLASS(
-    DefinedIo, ReadFormatted, ReadUnformatted, WriteFormatted, WriteUnformatted)
+
 const char *AsFortran(DefinedIo);
 
-// Floating-point rounding modes; these are packed into a byte to save
-// room in the runtime's format processing context structure.  These
-// enumerators are defined with the corresponding values returned from
-// llvm.get.rounding.
-enum class RoundingMode : std::uint8_t {
-  ToZero, // ROUND=ZERO, RZ - truncation
-  TiesToEven, // ROUND=NEAREST, RN - default IEEE rounding
-  Up, // ROUND=UP, RU
-  Down, // ROUND=DOWN, RD
-  TiesAwayFromZero, // ROUND=COMPATIBLE, RC - ties round away from zero
-};
 
 // Fortran label. Must be in [1..99999].
 using Label = std::uint64_t;
 
-// Fortran arrays may have up to 15 dimensions (See Fortran 2018 section 5.4.6).
-static constexpr int maxRank{15};
+
 
 // CUDA subprogram attribute combinations
 ENUM_CLASS(CUDASubprogramAttrs, Host, Device, HostDevice, Global, Grid_Global)
@@ -129,6 +112,5 @@ inline std::string GetExternalAssemblyName(
     std::string symbolName, bool underscoring) {
   return underscoring ? std::move(symbolName) + "_" : std::move(symbolName);
 }
-
 } // namespace Fortran::common
 #endif // FORTRAN_COMMON_FORTRAN_H_
diff --git a/flang/include/flang/Common/MathOptionsBase.def b/flang/include/flang/Support/MathOptionsBase.def
similarity index 100%
rename from flang/include/flang/Common/MathOptionsBase.def
rename to flang/include/flang/Support/MathOptionsBase.def
diff --git a/flang/include/flang/Common/MathOptionsBase.h b/flang/include/flang/Support/MathOptionsBase.h
similarity index 86%
rename from flang/include/flang/Common/MathOptionsBase.h
rename to flang/include/flang/Support/MathOptionsBase.h
index 7f8ebdbee19878..a739ba3e066599 100644
--- a/flang/include/flang/Common/MathOptionsBase.h
+++ b/flang/include/flang/Support/MathOptionsBase.h
@@ -1,4 +1,4 @@
-//===- MathOptionsBase.h - Math options config ------------------*- C++ -*-===//
+//===-- include/flang/Support/MathOptionsBase.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -27,16 +27,16 @@ class MathOptionsBase {
     Name = static_cast<unsigned>(Value); \
     return *this; \
   }
-#include "flang/Common/MathOptionsBase.def"
+#include "flang/Support/MathOptionsBase.def"
 
   MathOptionsBase() {
 #define ENUM_MATHOPT(Name, Type, Bits, Default) set##Name(Default);
-#include "flang/Common/MathOptionsBase.def"
+#include "flang/Support/MathOptionsBase.def"
   }
 
 private:
 #define ENUM_MATHOPT(Name, Type, Bits, Default) unsigned Name : Bits;
-#include "flang/Common/MathOptionsBase.def"
+#include "flang/Support/MathOptionsBase.def"
 };
 
 } // namespace Fortran::common
diff --git a/flang/include/flang/Common/OpenMP-features.h b/flang/include/flang/Support/OpenMP-features.h
similarity index 94%
rename from flang/include/flang/Common/OpenMP-features.h
rename to flang/include/flang/Support/OpenMP-features.h
index 480c8b4c1013fe..fb73d4191d1c1a 100644
--- a/flang/include/flang/Common/OpenMP-features.h
+++ b/flang/include/flang/Support/OpenMP-features.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/OpenMP-features.h -----------------*- C++ -*-====//
+//===-- include/flang/Support/OpenMP-features.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/Version.h b/flang/include/flang/Support/Version.h
similarity index 95%
rename from flang/include/flang/Common/Version.h
rename to flang/include/flang/Support/Version.h
index 3257d4a4f64593..643ddd2e27f69a 100644
--- a/flang/include/flang/Common/Version.h
+++ b/flang/include/flang/Support/Version.h
@@ -1,4 +1,4 @@
-//===- Version.h - Flang Version Number ---------------------*- Fortran -*-===//
+//===-- include/flang/Support/Version.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/default-kinds.h b/flang/include/flang/Support/default-kinds.h
similarity index 96%
rename from flang/include/flang/Common/default-kinds.h
rename to flang/include/flang/Support/default-kinds.h
index 6c66b98e98a05b..e78a08dfae6cc3 100644
--- a/flang/include/flang/Common/default-kinds.h
+++ b/flang/include/flang/Support/default-kinds.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/default-kinds.h --------------------*- C++ -*-===//
+//===-- include/flang/Support/default-kinds.h -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_COMMON_DEFAULT_KINDS_H_
 #define FORTRAN_COMMON_DEFAULT_KINDS_H_
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include <cstdint>
 
 namespace Fortran::common {
diff --git a/flang/include/flang/Common/indirection.h b/flang/include/flang/Support/indirection.h
similarity index 98%
rename from flang/include/flang/Common/indirection.h
rename to flang/include/flang/Support/indirection.h
index 7348eb0473f072..1221a659323503 100644
--- a/flang/include/flang/Common/indirection.h
+++ b/flang/include/flang/Support/indirection.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/indirection.h ----------------------*- C++ -*-===//
+//===-- include/flang/Support/indirection.h ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -20,7 +20,7 @@
 //    template class Fortran::common::Indirection<FORWARD_TYPE>;
 // in one C++ source file later where a definition of the type is visible.
 
-#include "idioms.h"
+#include "flang/Common/idioms.h"
 #include <memory>
 #include <type_traits>
 #include <utility>
diff --git a/flang/include/flang/Common/interval.h b/flang/include/flang/Support/interval.h
similarity index 97%
rename from flang/include/flang/Common/interval.h
rename to flang/include/flang/Support/interval.h
index c4cab0ccf1130b..2918cc54de3926 100644
--- a/flang/include/flang/Common/interval.h
+++ b/flang/include/flang/Support/interval.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/interval.h -------------------------*- C++ -*-===//
+//===-- include/flang/Support/interval.h ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
 // Defines a generalized template class Interval<A> to represent
 // the half-open interval [x .. x+n).
 
-#include "idioms.h"
+#include "flang/Common/idioms.h"
 #include <algorithm>
 #include <cstddef>
 #include <utility>
diff --git a/flang/include/flang/Common/reference-counted.h b/flang/include/flang/Support/reference-counted.h
similarity index 96%
rename from flang/include/flang/Common/reference-counted.h
rename to flang/include/flang/Support/reference-counted.h
index de91d4fb6ee8b7..d7a065c59d5a0f 100644
--- a/flang/include/flang/Common/reference-counted.h
+++ b/flang/include/flang/Support/reference-counted.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/reference-counted.h ----------------*- C++ -*-===//
+//===-- include/flang/Support/reference-counted.h ---------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/reference.h b/flang/include/flang/Support/reference.h
similarity index 97%
rename from flang/include/flang/Common/reference.h
rename to flang/include/flang/Support/reference.h
index 0c579de44bd7fa..cb367ae231376d 100644
--- a/flang/include/flang/Common/reference.h
+++ b/flang/include/flang/Support/reference.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/reference.h ------------------------*- C++ -*-===//
+//===-- include/flang/Support/reference.h -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/static-multimap-view.h b/flang/include/flang/Support/static-multimap-view.h
similarity index 97%
rename from flang/include/flang/Common/static-multimap-view.h
rename to flang/include/flang/Support/static-multimap-view.h
index 27d2ba89c8009c..71da272a26de2f 100644
--- a/flang/include/flang/Common/static-multimap-view.h
+++ b/flang/include/flang/Support/static-multimap-view.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/static-multimap-view.h -------------*- C++ -*-===//
+//===-- include/flang/Support/static-multimap-view.h ------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/include/flang/Common/template.h b/flang/include/flang/Support/template.h
similarity index 99%
rename from flang/include/flang/Common/template.h
rename to flang/include/flang/Support/template.h
index 51d09fb42ce368..e15de9c2d0cea8 100644
--- a/flang/include/flang/Common/template.h
+++ b/flang/include/flang/Support/template.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/template.h -------------------------*- C++ -*-===//
+//===-- include/flang/Support/template.h ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_COMMON_TEMPLATE_H_
 #define FORTRAN_COMMON_TEMPLATE_H_
 
-#include "variant.h"
+#include "flang/Common/variant.h"
 #include "flang/Common/idioms.h"
 #include <functional>
 #include <optional>
diff --git a/flang/include/flang/Common/unwrap.h b/flang/include/flang/Support/unwrap.h
similarity index 97%
rename from flang/include/flang/Common/unwrap.h
rename to flang/include/flang/Support/unwrap.h
index 84582174e4b300..d8fa553dedda3f 100644
--- a/flang/include/flang/Common/unwrap.h
+++ b/flang/include/flang/Support/unwrap.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/unwrap.h ---------------------------*- C++ -*-===//
+//===-- include/flang/Support/unwrap.h --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,8 +12,8 @@
 #include "indirection.h"
 #include "reference-counted.h"
 #include "reference.h"
-#include "variant.h"
-#include "visit.h"
+#include "flang/Common/variant.h"
+#include "flang/Common/visit.h"
 #include <memory>
 #include <optional>
 #include <type_traits>
diff --git a/flang/include/flang/Tools/CrossToolHelpers.h b/flang/include/flang/Tools/CrossToolHelpers.h
index 75fd783af237d0..bc105f471aa003 100644
--- a/flang/include/flang/Tools/CrossToolHelpers.h
+++ b/flang/include/flang/Tools/CrossToolHelpers.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
 #define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
 
-#include "flang/Common/MathOptionsBase.h"
+#include "flang/Support/MathOptionsBase.h"
 #include "flang/Frontend/CodeGenOptions.h"
 #include "flang/Frontend/LangOptions.h"
 #include <cstdint>
diff --git a/flang/lib/CMakeLists.txt b/flang/lib/CMakeLists.txt
index f41d4df1f07e3c..d29da136ea3eda 100644
--- a/flang/lib/CMakeLists.txt
+++ b/flang/lib/CMakeLists.txt
@@ -1,6 +1,9 @@
+
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../FortranRuntime/include")
+
 add_subdirectory(Common)
+add_subdirectory(Support)
 add_subdirectory(Evaluate)
-add_subdirectory(Decimal)
 add_subdirectory(Lower)
 add_subdirectory(Parser)
 add_subdirectory(Semantics)
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index c6f818ad27cd19..b62aeb2c08b779 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -1,48 +1,12 @@
-find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc)
-find_first_existing_vc_file("${FLANG_SOURCE_DIR}" flang_vc)
-
-# The VC revision include that we want to generate.
-set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSVersion.inc")
-
-set(generate_vcs_version_script "${LLVM_CMAKE_DIR}/GenerateVersionFromVCS.cmake")
-
-if(llvm_vc AND LLVM_APPEND_VC_REV)
-  set(llvm_source_dir ${LLVM_MAIN_SRC_DIR})
-endif()
-if(flang_vc AND LLVM_APPEND_VC_REV)
-  set(flang_source_dir ${FLANG_SOURCE_DIR})
-endif()
- 
-# Create custom target to generate the VC revision include.
-add_custom_command(OUTPUT "${version_inc}"
-  DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}"
-  COMMAND ${CMAKE_COMMAND} "-DNAMES=\"LLVM;FLANG\""
-                           "-DLLVM_SOURCE_DIR=${llvm_source_dir}"
-                           "-DFLANG_SOURCE_DIR=${flang_source_dir}"
-                           "-DHEADER_FILE=${version_inc}"
-                           "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
-                           "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-                           -P "${generate_vcs_version_script}")
-
-# Mark the generated header as being generated.
-set_source_files_properties("${version_inc}"
-  PROPERTIES GENERATED TRUE
-             HEADER_FILE_ONLY TRUE)
-
-if(FLANG_VENDOR)
-  set_source_files_properties(Version.cpp
-    PROPERTIES COMPILE_DEFINITIONS "FLANG_VENDOR=\"${FLANG_VENDOR} \"")
-endif()
-
-
-add_flang_library(FortranCommon
-  Fortran.cpp
-  Fortran-features.cpp
-  default-kinds.cpp
-  idioms.cpp
-  Version.cpp
-  ${version_inc}
-
-  LINK_COMPONENTS
-  Support
-)
+#===-- FortranRuntime/lib/Common/CMakeLists.txt ---------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_flang_library(FortranCommon 
+  "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/binary-to-decimal.cpp"
+  "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/decimal-to-binary.cpp"
+)
diff --git a/flang/lib/Decimal/CMakeLists.txt b/flang/lib/Decimal/CMakeLists.txt
deleted file mode 100644
index 880b190f1c5815..00000000000000
--- a/flang/lib/Decimal/CMakeLists.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
-  cmake_minimum_required(VERSION 3.20.0)
-
-  project(FortranDecimal C CXX)
-
-  set(CMAKE_CXX_STANDARD 17)
-  set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
-  set(CMAKE_CXX_EXTENSIONS OFF)
-
-  set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
-
-  set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake")
-  set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake")
-  set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake")
-
-  # Add path for custom modules
-  list(INSERT CMAKE_MODULE_PATH 0
-    "${FLANG_SOURCE_DIR}/cmake"
-    "${FLANG_SOURCE_DIR}/cmake/modules"
-    "${LLVM_COMMON_CMAKE_UTILS}"
-    "${LLVM_COMMON_CMAKE_UTILS}/Modules"
-    "${LLVM_CMAKE_UTILS}"
-    "${LLVM_CMAKE_UTILS}/modules"
-    "${CLANG_CMAKE_UTILS}/modules"
-    )
-
-  include(AddClang)
-  include(AddLLVM)
-  include(AddFlang)
-  include(HandleLLVMOptions)
-
-  include(TestBigEndian)
-  test_big_endian(IS_BIGENDIAN)
-  if (IS_BIGENDIAN)
-    add_compile_definitions(FLANG_BIG_ENDIAN=1)
-  else ()
-    add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
-  endif ()
-  include_directories(BEFORE
-    ${FLANG_SOURCE_DIR}/include)
-endif()
-
-check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
-if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
-  append("-fno-lto" CMAKE_CXX_FLAGS)
-endif()
-
-# Disable libstdc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build, to
-# avoid an unwanted dependency on libstdc++.so.
-add_definitions(-U_GLIBCXX_ASSERTIONS)
-
-set(sources
-  binary-to-decimal.cpp
-  decimal-to-binary.cpp
-)
-
-include(AddFlangOffloadRuntime)
-enable_cuda_compilation(FortranDecimal "${sources}")
-enable_omp_offload_compilation("${sources}")
-
-add_flang_library(FortranDecimal INSTALL_WITH_TOOLCHAIN ${sources})
-
-if (DEFINED MSVC)
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
-  add_flang_library(FortranDecimal.static INSTALL_WITH_TOOLCHAIN
-          binary-to-decimal.cpp
-          decimal-to-binary.cpp
-  )
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
-  add_flang_library(FortranDecimal.dynamic INSTALL_WITH_TOOLCHAIN
-    binary-to-decimal.cpp
-    decimal-to-binary.cpp
-  )
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
-  add_flang_library(FortranDecimal.static_dbg INSTALL_WITH_TOOLCHAIN
-          binary-to-decimal.cpp
-          decimal-to-binary.cpp
-  )
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
-  add_flang_library(FortranDecimal.dynamic_dbg INSTALL_WITH_TOOLCHAIN
-    binary-to-decimal.cpp
-    decimal-to-binary.cpp
-  )
-  add_dependencies(FortranDecimal FortranDecimal.static FortranDecimal.dynamic
-    FortranDecimal.static_dbg FortranDecimal.dynamic_dbg)
-endif()
diff --git a/flang/lib/Evaluate/CMakeLists.txt b/flang/lib/Evaluate/CMakeLists.txt
index b38f450d746ea7..5f2e345b7bfb56 100644
--- a/flang/lib/Evaluate/CMakeLists.txt
+++ b/flang/lib/Evaluate/CMakeLists.txt
@@ -60,9 +60,8 @@ add_flang_library(FortranEvaluate
   variable.cpp
 
   LINK_LIBS
-  FortranCommon
-  FortranDecimal
   FortranParser
+  FortranSupport
   ${LIBPGMATH}
   ${QUADMATHLIB}
 
diff --git a/flang/lib/Evaluate/call.cpp b/flang/lib/Evaluate/call.cpp
index c5b50e806d2497..1cb8eb89f41687 100644
--- a/flang/lib/Evaluate/call.cpp
+++ b/flang/lib/Evaluate/call.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/call.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/check-expression.h"
diff --git a/flang/lib/Evaluate/characteristics.cpp b/flang/lib/Evaluate/characteristics.cpp
index 70e24d6e82eb8e..091f2e2b553e86 100644
--- a/flang/lib/Evaluate/characteristics.cpp
+++ b/flang/lib/Evaluate/characteristics.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/characteristics.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Evaluate/check-expression.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/intrinsics.h"
diff --git a/flang/lib/Evaluate/common.cpp b/flang/lib/Evaluate/common.cpp
index c633bff57b1ecd..7741bec650575d 100644
--- a/flang/lib/Evaluate/common.cpp
+++ b/flang/lib/Evaluate/common.cpp
@@ -9,10 +9,14 @@
 #include "flang/Evaluate/common.h"
 #include "flang/Common/idioms.h"
 
+
 using namespace Fortran::parser::literals;
 
+
+
 namespace Fortran::evaluate {
 
+
 void RealFlagWarnings(
     FoldingContext &context, const RealFlags &flags, const char *operation) {
   if (context.languageFeatures().ShouldWarn(
diff --git a/flang/lib/Evaluate/fold-implementation.h b/flang/lib/Evaluate/fold-implementation.h
index 1b14a305b87f4f..c8452cdd6a0caa 100644
--- a/flang/lib/Evaluate/fold-implementation.h
+++ b/flang/lib/Evaluate/fold-implementation.h
@@ -12,9 +12,9 @@
 #include "character.h"
 #include "host.h"
 #include "int-power.h"
-#include "flang/Common/indirection.h"
-#include "flang/Common/template.h"
-#include "flang/Common/unwrap.h"
+#include "flang/Support/indirection.h"
+#include "flang/Support/template.h"
+#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/constant.h"
diff --git a/flang/lib/Evaluate/formatting.cpp b/flang/lib/Evaluate/formatting.cpp
index 0870d56549f74d..db5d005d97c8c9 100644
--- a/flang/lib/Evaluate/formatting.cpp
+++ b/flang/lib/Evaluate/formatting.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/formatting.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/constant.h"
 #include "flang/Evaluate/expression.h"
diff --git a/flang/lib/Evaluate/intrinsics-library.cpp b/flang/lib/Evaluate/intrinsics-library.cpp
index ed28d8130808fa..440ddaaf9689c8 100644
--- a/flang/lib/Evaluate/intrinsics-library.cpp
+++ b/flang/lib/Evaluate/intrinsics-library.cpp
@@ -14,7 +14,7 @@
 #include "flang/Evaluate/intrinsics-library.h"
 #include "fold-implementation.h"
 #include "host.h"
-#include "flang/Common/static-multimap-view.h"
+#include "flang/Support/static-multimap-view.h"
 #include "flang/Evaluate/expression.h"
 #include <cfloat>
 #include <cmath>
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index 166dae93178c51..343bd2c9f22be2 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/intrinsics.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/check-expression.h"
diff --git a/flang/lib/Evaluate/real.cpp b/flang/lib/Evaluate/real.cpp
index 642490646dcaf3..9d465e5f35d6ae 100644
--- a/flang/lib/Evaluate/real.cpp
+++ b/flang/lib/Evaluate/real.cpp
@@ -9,7 +9,7 @@
 #include "flang/Evaluate/real.h"
 #include "int-power.h"
 #include "flang/Common/idioms.h"
-#include "flang/Decimal/decimal.h"
+#include "flang/Common/decimal.h"
 #include "flang/Parser/characters.h"
 #include "llvm/Support/raw_ostream.h"
 #include <limits>
diff --git a/flang/lib/Evaluate/shape.cpp b/flang/lib/Evaluate/shape.cpp
index c62d0cb0ff29dd..7b78d8c7b9734f 100644
--- a/flang/lib/Evaluate/shape.cpp
+++ b/flang/lib/Evaluate/shape.cpp
@@ -8,7 +8,7 @@
 
 #include "flang/Evaluate/shape.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/check-expression.h"
 #include "flang/Evaluate/fold.h"
diff --git a/flang/lib/Evaluate/target.cpp b/flang/lib/Evaluate/target.cpp
index 1e2cf6b0d298d4..d0722c31e3c3f7 100644
--- a/flang/lib/Evaluate/target.cpp
+++ b/flang/lib/Evaluate/target.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/target.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/type.h"
 
diff --git a/flang/lib/Frontend/CMakeLists.txt b/flang/lib/Frontend/CMakeLists.txt
index ecdcc73d61ec1f..9b20b6a92cca0f 100644
--- a/flang/lib/Frontend/CMakeLists.txt
+++ b/flang/lib/Frontend/CMakeLists.txt
@@ -28,7 +28,7 @@ add_flang_library(flangFrontend
   FortranParser
   FortranSemantics
   FortranEvaluate
-  FortranCommon
+  FortranSupport
   FortranLower
   FIRDialect
   FIRDialectSupport
diff --git a/flang/lib/Frontend/CompilerInstance.cpp b/flang/lib/Frontend/CompilerInstance.cpp
index d37430e0e5773e..a0653576852101 100644
--- a/flang/lib/Frontend/CompilerInstance.cpp
+++ b/flang/lib/Frontend/CompilerInstance.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/CompilerInstance.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Frontend/CompilerInvocation.h"
 #include "flang/Frontend/TextDiagnosticPrinter.h"
 #include "flang/Parser/parsing.h"
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 90c327546198b5..5fe6ccbc44a894 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -11,9 +11,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/CompilerInvocation.h"
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/OpenMP-features.h"
-#include "flang/Common/Version.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/OpenMP-features.h"
+#include "flang/Support/Version.h"
 #include "flang/Frontend/CodeGenOptions.h"
 #include "flang/Frontend/PreprocessorOptions.h"
 #include "flang/Frontend/TargetOptions.h"
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index cda82bcb7ecc71..7d51c20514387a 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/FrontendActions.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Frontend/CompilerInstance.h"
 #include "flang/Frontend/CompilerInvocation.h"
 #include "flang/Frontend/FrontendOptions.h"
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 79e5a04463e00b..6924717cb467ac 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -12,7 +12,7 @@
 
 #include "flang/Lower/Bridge.h"
 #include "DirectivesCommon.h"
-#include "flang/Common/Version.h"
+#include "flang/Support/Version.h"
 #include "flang/Lower/Allocatable.h"
 #include "flang/Lower/CallInterface.h"
 #include "flang/Lower/Coarray.h"
diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt
index ba6622d8504a4f..cb37857ab1de0b 100644
--- a/flang/lib/Lower/CMakeLists.txt
+++ b/flang/lib/Lower/CMakeLists.txt
@@ -56,7 +56,7 @@ add_flang_library(FortranLower
   HLFIRDialect
   ${dialect_libs}
   ${extension_libs}
-  FortranCommon
+  FortranSupport
   FortranParser
   FortranEvaluate
   FortranSemantics
diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp
index c0ef96adc20c3e..153845699dae3d 100644
--- a/flang/lib/Lower/CallInterface.cpp
+++ b/flang/lib/Lower/CallInterface.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/CallInterface.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Lower/Bridge.h"
 #include "flang/Lower/Mangler.h"
diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp
index 62a7615e1af13c..4d2ac95ea784b5 100644
--- a/flang/lib/Lower/ConvertExpr.cpp
+++ b/flang/lib/Lower/ConvertExpr.cpp
@@ -11,8 +11,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/ConvertExpr.h"
-#include "flang/Common/default-kinds.h"
-#include "flang/Common/unwrap.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/real.h"
 #include "flang/Evaluate/traverse.h"
diff --git a/flang/lib/Lower/Mangler.cpp b/flang/lib/Lower/Mangler.cpp
index a66dae8851a866..565f9c6cbc5892 100644
--- a/flang/lib/Lower/Mangler.cpp
+++ b/flang/lib/Lower/Mangler.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/Mangler.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Lower/Support/Utils.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index dc0dc47bda9a9d..5f1a25b1af23e9 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -14,7 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Optimizer/Builder/IntrinsicCall.h"
-#include "flang/Common/static-multimap-view.h"
+#include "flang/Support/static-multimap-view.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/Character.h"
 #include "flang/Optimizer/Builder/Complex.h"
@@ -68,6 +68,11 @@
 /// a call is generated for it. LLVM intrinsics are handled as a math
 /// runtime library here.
 
+static llvm::cl::opt<bool> ignoreModuleOnlyBuiltins(
+    "ignore-module-only-builtins",
+    llvm::cl::desc("ignore failures from __builtin_numeric_storage_size when compiling FortranRuntime"),
+    llvm::cl::init(false), llvm::cl::Hidden);
+
 namespace fir {
 
 fir::ExtendedValue getAbsentIntrinsicArgument() { return fir::UnboxedValue{}; }
@@ -502,6 +507,7 @@ static constexpr IntrinsicHandler handlers[]{
      /*isElemental=*/false},
     {"not", &I::genNot},
     {"null", &I::genNull, {{{"mold", asInquired}}}, /*isElemental=*/false},
+        {"numeric_storage_size", &I::genNumericStorageSize},
     {"pack",
      &I::genPack,
      {{{"array", asBox},
@@ -7218,6 +7224,19 @@ IntrinsicLibrary::genVerify(mlir::Type resultType,
   return readAndAddCleanUp(resultMutableBox, resultType, "VERIFY");
 }
 
+
+    fir::ExtendedValue IntrinsicLibrary:: genNumericStorageSize(mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args) {
+      assert(args.empty() );
+     
+      if (!ignoreModuleOnlyBuiltins) {
+   fir::emitFatalError(loc, "__builtin_numeric_storage_size is for internal use only. Use NUMERIC_STORAGE_SIZE from ISO_FORTRAN_ENV module instead.");
+  return {};
+      }
+
+      return builder.createIntegerConstant(loc, resultType  , 32 );
+    }
+
+
 /// Process calls to Minloc, Maxloc intrinsic functions
 template <typename FN, typename FD>
 fir::ExtendedValue
diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
index 1043494b6fb48a..c632e42ef72c29 100644
--- a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
+++ b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
@@ -13,7 +13,7 @@
 #define DEBUG_TYPE "flang-type-conversion"
 
 #include "flang/Optimizer/CodeGen/TypeConverter.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done
 #include "flang/Optimizer/CodeGen/DescriptorModel.h"
 #include "flang/Optimizer/CodeGen/TBAABuilder.h"
diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index c1debf28d00332..08d75c46faee4b 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Optimizer/Dialect/FIRType.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/Support/KindMapping.h"
diff --git a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
index 46e70d7ef9180a..f41633629bb3e2 100644
--- a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
+++ b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "DebugTypeGenerator.h"
-#include "flang/Common/Version.h"
+#include "flang/Support/Version.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/CodeGen/CGOps.h"
diff --git a/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp b/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
index 2c9c73e8a5394d..ca6eacfd0e7200 100644
--- a/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Lower/BuiltinModules.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/Support.h"
diff --git a/flang/lib/Optimizer/Transforms/CMakeLists.txt b/flang/lib/Optimizer/Transforms/CMakeLists.txt
index b32f2ef86fca44..35794300dbc6aa 100644
--- a/flang/lib/Optimizer/Transforms/CMakeLists.txt
+++ b/flang/lib/Optimizer/Transforms/CMakeLists.txt
@@ -44,6 +44,7 @@ add_flang_library(FIRTransforms
   FIRDialectSupport
   FIRSupport
   FortranCommon
+  FortranSupport
   HLFIRDialect
   MLIRAffineUtils
   MLIRFuncDialect
diff --git a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
index c22c74d3f78af7..d3c44a75e4cffb 100644
--- a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
 #include "flang/Optimizer/CodeGen/TypeConverter.h"
 #include "flang/Optimizer/Dialect/CUF/CUFOps.h"
diff --git a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
index 648628fd1c9af0..1915abe2f91e0e 100644
--- a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Dialect/FIROpsSupport.h"
diff --git a/flang/lib/Optimizer/Transforms/LoopVersioning.cpp b/flang/lib/Optimizer/Transforms/LoopVersioning.cpp
index 51dc48f0fcb129..f6bd2aeb17bc20 100644
--- a/flang/lib/Optimizer/Transforms/LoopVersioning.cpp
+++ b/flang/lib/Optimizer/Transforms/LoopVersioning.cpp
@@ -40,7 +40,7 @@
 ///       could be part of the cost analysis above.
 //===----------------------------------------------------------------------===//
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/Inquiry.h"
diff --git a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
index c61179a7460e32..c56dfa1cdfb524 100644
--- a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
+++ b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
@@ -22,7 +22,7 @@
 /// and small in size.
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/LowLevelIntrinsics.h"
diff --git a/flang/lib/Optimizer/Transforms/StackReclaim.cpp b/flang/lib/Optimizer/Transforms/StackReclaim.cpp
index 8a60a9e64f704b..629ba587adf3ca 100644
--- a/flang/lib/Optimizer/Transforms/StackReclaim.cpp
+++ b/flang/lib/Optimizer/Transforms/StackReclaim.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Transforms/Passes.h"
diff --git a/flang/lib/Optimizer/Transforms/VScaleAttr.cpp b/flang/lib/Optimizer/Transforms/VScaleAttr.cpp
index d311167c58b4d6..54a2456e77366c 100644
--- a/flang/lib/Optimizer/Transforms/VScaleAttr.cpp
+++ b/flang/lib/Optimizer/Transforms/VScaleAttr.cpp
@@ -14,7 +14,7 @@
 /// likely harmless to run it on something else, but it is also not valuable].
 //===----------------------------------------------------------------------===//
 
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/Inquiry.h"
diff --git a/flang/lib/Parser/CMakeLists.txt b/flang/lib/Parser/CMakeLists.txt
index 600a2f67df4431..b2cd3cbbe35ffc 100644
--- a/flang/lib/Parser/CMakeLists.txt
+++ b/flang/lib/Parser/CMakeLists.txt
@@ -25,7 +25,7 @@ add_flang_library(FortranParser
   user-state.cpp
 
   LINK_LIBS
-  FortranCommon
+  FortranSupport
 
   LINK_COMPONENTS
   Support
diff --git a/flang/lib/Parser/basic-parsers.h b/flang/lib/Parser/basic-parsers.h
index 515b5993d67376..6575c7d01de346 100644
--- a/flang/lib/Parser/basic-parsers.h
+++ b/flang/lib/Parser/basic-parsers.h
@@ -22,9 +22,9 @@
 // This header defines the fundamental parser class templates and helper
 // template functions.  See parser-combinators.txt for documentation.
 
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-state.h"
diff --git a/flang/lib/Parser/parse-tree.cpp b/flang/lib/Parser/parse-tree.cpp
index 7f0899aaa14294..3b90a57c602945 100644
--- a/flang/lib/Parser/parse-tree.cpp
+++ b/flang/lib/Parser/parse-tree.cpp
@@ -8,7 +8,7 @@
 
 #include "flang/Parser/parse-tree.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/tools.h"
 #include "flang/Parser/user-state.h"
 #include "llvm/Support/raw_ostream.h"
diff --git a/flang/lib/Parser/prescan.h b/flang/lib/Parser/prescan.h
index 9d4f7c0c302a1a..0ea614d1df3bd9 100644
--- a/flang/lib/Parser/prescan.h
+++ b/flang/lib/Parser/prescan.h
@@ -16,7 +16,7 @@
 // fixed form character literals on truncated card images, file
 // inclusion, and driving the Fortran source preprocessor.
 
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/provenance.h"
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 2511a5dda9d095..7b0385c63cd8a1 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -10,9 +10,9 @@
 // traversal templates in parse-tree-visitor.h.
 
 #include "flang/Parser/unparse.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/lib/Semantics/CMakeLists.txt b/flang/lib/Semantics/CMakeLists.txt
index 41406ecf50e004..4203648a50ef71 100644
--- a/flang/lib/Semantics/CMakeLists.txt
+++ b/flang/lib/Semantics/CMakeLists.txt
@@ -52,7 +52,7 @@ add_flang_library(FortranSemantics
   omp_gen
 
   LINK_LIBS
-  FortranCommon
+  FortranSupport
   FortranParser
   FortranEvaluate
 
diff --git a/flang/lib/Semantics/assignment.h b/flang/lib/Semantics/assignment.h
index 95d7b3cf91b17a..275625d3ed6522 100644
--- a/flang/lib/Semantics/assignment.h
+++ b/flang/lib/Semantics/assignment.h
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_SEMANTICS_ASSIGNMENT_H_
 #define FORTRAN_SEMANTICS_ASSIGNMENT_H_
 
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Semantics/semantics.h"
 
diff --git a/flang/lib/Semantics/check-case.cpp b/flang/lib/Semantics/check-case.cpp
index d296460127e12c..0e38b24f1b319d 100644
--- a/flang/lib/Semantics/check-case.cpp
+++ b/flang/lib/Semantics/check-case.cpp
@@ -8,8 +8,8 @@
 
 #include "check-case.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/reference.h"
-#include "flang/Common/template.h"
+#include "flang/Support/reference.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/type.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/lib/Semantics/check-coarray.cpp b/flang/lib/Semantics/check-coarray.cpp
index 6cf61a6b923db3..d34c70e60d966b 100644
--- a/flang/lib/Semantics/check-coarray.cpp
+++ b/flang/lib/Semantics/check-coarray.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-coarray.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index d8bd435bf09f38..738a471f4d01f5 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-cuda.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Evaluate/traverse.h"
diff --git a/flang/lib/Semantics/check-data.h b/flang/lib/Semantics/check-data.h
index 479d32568fa66a..5cdf46a5ffb1c9 100644
--- a/flang/lib/Semantics/check-data.h
+++ b/flang/lib/Semantics/check-data.h
@@ -10,7 +10,7 @@
 #define FORTRAN_SEMANTICS_CHECK_DATA_H_
 
 #include "data-to-inits.h"
-#include "flang/Common/interval.h"
+#include "flang/Support/interval.h"
 #include "flang/Evaluate/fold-designator.h"
 #include "flang/Evaluate/initial-image.h"
 #include "flang/Semantics/expression.h"
diff --git a/flang/lib/Semantics/check-do-forall.cpp b/flang/lib/Semantics/check-do-forall.cpp
index d798244ff1ef2d..42e1c07fc45c3e 100644
--- a/flang/lib/Semantics/check-do-forall.cpp
+++ b/flang/lib/Semantics/check-do-forall.cpp
@@ -8,7 +8,7 @@
 
 #include "check-do-forall.h"
 #include "definable.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/tools.h"
diff --git a/flang/lib/Semantics/check-return.cpp b/flang/lib/Semantics/check-return.cpp
index ec2600bac3c68e..6a03467a27a759 100644
--- a/flang/lib/Semantics/check-return.cpp
+++ b/flang/lib/Semantics/check-return.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-return.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
diff --git a/flang/lib/Semantics/check-select-rank.cpp b/flang/lib/Semantics/check-select-rank.cpp
index 2e602d307013c1..722226465b6642 100644
--- a/flang/lib/Semantics/check-select-rank.cpp
+++ b/flang/lib/Semantics/check-select-rank.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-select-rank.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/tools.h"
diff --git a/flang/lib/Semantics/check-select-type.cpp b/flang/lib/Semantics/check-select-type.cpp
index 94d16a719277af..da41410bd24612 100644
--- a/flang/lib/Semantics/check-select-type.cpp
+++ b/flang/lib/Semantics/check-select-type.cpp
@@ -8,7 +8,7 @@
 
 #include "check-select-type.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/reference.h"
+#include "flang/Support/reference.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/type.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/lib/Semantics/check-stop.cpp b/flang/lib/Semantics/check-stop.cpp
index 43535b07f029e9..dab076424bd8e6 100644
--- a/flang/lib/Semantics/check-stop.cpp
+++ b/flang/lib/Semantics/check-stop.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-stop.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
diff --git a/flang/lib/Semantics/data-to-inits.h b/flang/lib/Semantics/data-to-inits.h
index d8cc4601de26fa..df4d552760eda6 100644
--- a/flang/lib/Semantics/data-to-inits.h
+++ b/flang/lib/Semantics/data-to-inits.h
@@ -9,8 +9,8 @@
 #ifndef FORTRAN_SEMANTICS_DATA_TO_INITS_H_
 #define FORTRAN_SEMANTICS_DATA_TO_INITS_H_
 
-#include "flang/Common/default-kinds.h"
-#include "flang/Common/interval.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/interval.h"
 #include "flang/Evaluate/fold-designator.h"
 #include "flang/Evaluate/initial-image.h"
 #include <list>
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index 072ebe172f45a9..a4be06515e4c87 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -11,7 +11,7 @@
 #include "pointer-assignment.h"
 #include "resolve-names-utils.h"
 #include "resolve-names.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/fold.h"
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp
index 4948fce77a2502..abd3c5f461cb7e 100644
--- a/flang/lib/Semantics/pointer-assignment.cpp
+++ b/flang/lib/Semantics/pointer-assignment.cpp
@@ -10,7 +10,7 @@
 #include "definable.h"
 #include "flang/Common/idioms.h"
 #include "flang/Common/restorer.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/fold.h"
diff --git a/flang/lib/Semantics/resolve-labels.cpp b/flang/lib/Semantics/resolve-labels.cpp
index e5e96ec6327e2b..84d2e51d438bfe 100644
--- a/flang/lib/Semantics/resolve-labels.cpp
+++ b/flang/lib/Semantics/resolve-labels.cpp
@@ -8,7 +8,7 @@
 
 #include "resolve-labels.h"
 #include "flang/Common/enum-set.h"
-#include "flang/Common/template.h"
+#include "flang/Support/template.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Semantics/semantics.h"
 #include <cstdarg>
diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp
index 39392257938d66..bc5f458f403cf2 100644
--- a/flang/lib/Semantics/resolve-names-utils.cpp
+++ b/flang/lib/Semantics/resolve-names-utils.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "resolve-names-utils.h"
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Evaluate/traverse.h"
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index d8f601212d8d01..920cefa084e05c 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -14,9 +14,9 @@
 #include "resolve-directives.h"
 #include "resolve-names-utils.h"
 #include "rewrite-parse-tree.h"
-#include "flang/Common/Fortran.h"
-#include "flang/Common/default-kinds.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/indirection.h"
 #include "flang/Common/restorer.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/characteristics.h"
diff --git a/flang/lib/Semantics/rewrite-parse-tree.cpp b/flang/lib/Semantics/rewrite-parse-tree.cpp
index b4fb72ce213017..46641f5bd3c363 100644
--- a/flang/lib/Semantics/rewrite-parse-tree.cpp
+++ b/flang/lib/Semantics/rewrite-parse-tree.cpp
@@ -8,7 +8,7 @@
 
 #include "rewrite-parse-tree.h"
 #include "rewrite-directives.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Parser/tools.h"
diff --git a/flang/lib/Semantics/semantics.cpp b/flang/lib/Semantics/semantics.cpp
index 8592d1e5d6217e..c39c8ac5a7b111 100644
--- a/flang/lib/Semantics/semantics.cpp
+++ b/flang/lib/Semantics/semantics.cpp
@@ -37,7 +37,7 @@
 #include "resolve-labels.h"
 #include "resolve-names.h"
 #include "rewrite-parse-tree.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/tools.h"
 #include "flang/Semantics/expression.h"
diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 8d16ab71008766..2aa0476b8fa07a 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Parser/tools.h"
-#include "flang/Common/Fortran.h"
-#include "flang/Common/indirection.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include "flang/Parser/dump-parse-tree.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
diff --git a/flang/lib/Support/CMakeLists.txt b/flang/lib/Support/CMakeLists.txt
new file mode 100644
index 00000000000000..674ed0f196c89e
--- /dev/null
+++ b/flang/lib/Support/CMakeLists.txt
@@ -0,0 +1,56 @@
+#===-- lib/Support/CMakeLists.txt ------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc)
+find_first_existing_vc_file("${FLANG_SOURCE_DIR}" flang_vc)
+
+# The VC revision include that we want to generate.
+set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSVersion.inc")
+
+set(generate_vcs_version_script "${LLVM_CMAKE_DIR}/GenerateVersionFromVCS.cmake")
+
+if(llvm_vc AND LLVM_APPEND_VC_REV)
+  set(llvm_source_dir ${LLVM_MAIN_SRC_DIR})
+endif()
+if(flang_vc AND LLVM_APPEND_VC_REV)
+  set(flang_source_dir ${FLANG_SOURCE_DIR})
+endif()
+ 
+# Create custom target to generate the VC revision include.
+add_custom_command(OUTPUT "${version_inc}"
+  DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}"
+  COMMAND ${CMAKE_COMMAND} "-DNAMES=\"LLVM;FLANG\""
+                           "-DLLVM_SOURCE_DIR=${llvm_source_dir}"
+                           "-DFLANG_SOURCE_DIR=${flang_source_dir}"
+                           "-DHEADER_FILE=${version_inc}"
+                           "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+                           "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
+                           -P "${generate_vcs_version_script}")
+
+# Mark the generated header as being generated.
+set_source_files_properties("${version_inc}"
+  PROPERTIES GENERATED TRUE
+             HEADER_FILE_ONLY TRUE)
+
+if(FLANG_VENDOR)
+  set_source_files_properties(Version.cpp
+    PROPERTIES COMPILE_DEFINITIONS "FLANG_VENDOR=\"${FLANG_VENDOR} \"")
+endif()
+
+
+add_flang_library(FortranSupport
+  Fortran.cpp
+  Fortran-features.cpp
+  default-kinds.cpp
+  idioms.cpp
+  Version.cpp
+  ${version_inc}
+
+  LINK_COMPONENTS
+  Support
+)
diff --git a/flang/lib/Common/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp
similarity index 91%
rename from flang/lib/Common/Fortran-features.cpp
rename to flang/lib/Support/Fortran-features.cpp
index 25a948818e6560..e49735218ab967 100644
--- a/flang/lib/Common/Fortran-features.cpp
+++ b/flang/lib/Support/Fortran-features.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Common/Fortran-features.cpp -----------------------------------===//
+//===-- lib/Support/Fortran-features.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/Fortran.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 
 namespace Fortran::common {
diff --git a/flang/lib/Common/Fortran.cpp b/flang/lib/Support/Fortran.cpp
similarity index 96%
rename from flang/lib/Common/Fortran.cpp
rename to flang/lib/Support/Fortran.cpp
index c014b1263a67f0..21eafe385015b5 100644
--- a/flang/lib/Common/Fortran.cpp
+++ b/flang/lib/Support/Fortran.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Common/Fortran.cpp --------------------------------------------===//
+//===-- lib/Support/Fortran.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran.h"
-#include "flang/Common/Fortran-features.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/Fortran-features.h"
 
 namespace Fortran::common {
 
diff --git a/flang/lib/Common/Version.cpp b/flang/lib/Support/Version.cpp
similarity index 95%
rename from flang/lib/Common/Version.cpp
rename to flang/lib/Support/Version.cpp
index d67255f353dfd7..8ee4908f28f621 100644
--- a/flang/lib/Common/Version.cpp
+++ b/flang/lib/Support/Version.cpp
@@ -1,4 +1,4 @@
-//===- Version.cpp - Flang Version Number -------------------*- Fortran -*-===//
+//===-- lib/Support/Version.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Version.h"
+#include "flang/Support/Version.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstdlib>
 #include <cstring>
diff --git a/flang/lib/Support/big-radix-floating-point.h b/flang/lib/Support/big-radix-floating-point.h
new file mode 100644
index 00000000000000..4c3d8f8b30832a
--- /dev/null
+++ b/flang/lib/Support/big-radix-floating-point.h
@@ -0,0 +1,396 @@
+//===-- lib/Support/big-radix-floating-point.h ------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
+#define FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
+
+// This is a helper class for use in floating-point conversions between
+// binary and decimal representations.  It holds a multiple-precision
+// integer value using digits of a radix that is a large even power of ten
+// (10,000,000,000,000,000 by default, 10**16).  These digits are accompanied
+// by a signed exponent that denotes multiplication by a power of ten.
+// The effective radix point is to the right of the digits (i.e., they do
+// not represent a fraction).
+//
+// The operations supported by this class are limited to those required
+// for conversions between binary and decimal representations; it is not
+// a general-purpose facility.
+
+#include "flang/Common/bit-population-count.h"
+#include "flang/Common/leading-zero-bit-count.h"
+#include "flang/Common/uint128.h"
+#include "flang/Support/binary-floating-point.h"
+#include "flang/Common/decimal.h"
+#include <cinttypes>
+#include <limits>
+#include <type_traits>
+
+// Some environments, viz. glibc 2.17, allow the macro HUGE
+// to leak out of <math.h>.
+#undef HUGE
+
+namespace Fortran::decimal {
+
+static constexpr std::uint64_t TenToThe(int power) {
+  return power <= 0 ? 1 : 10 * TenToThe(power - 1);
+}
+
+// 10**(LOG10RADIX + 3) must be < 2**wordbits, and LOG10RADIX must be
+// even, so that pairs of decimal digits do not straddle Digits.
+// So LOG10RADIX must be 16 or 6.
+template <int PREC, int LOG10RADIX = 16> class BigRadixFloatingPointNumber {
+public:
+  using Real = BinaryFloatingPointNumber<PREC>;
+  static constexpr int log10Radix{LOG10RADIX};
+
+private:
+  static constexpr std::uint64_t uint64Radix{TenToThe(log10Radix)};
+  static constexpr int minDigitBits{
+      64 - common::LeadingZeroBitCount(uint64Radix)};
+  using Digit = common::HostUnsignedIntType<minDigitBits>;
+  static constexpr Digit radix{uint64Radix};
+  static_assert(radix < std::numeric_limits<Digit>::max() / 1000,
+      "radix is somehow too big");
+  static_assert(radix > std::numeric_limits<Digit>::max() / 10000,
+      "radix is somehow too small");
+
+  // The base-2 logarithm of the least significant bit that can arise
+  // in a subnormal IEEE floating-point number.
+  static constexpr int minLog2AnyBit{
+      -Real::exponentBias - Real::binaryPrecision};
+
+  // The number of Digits needed to represent the smallest subnormal.
+  static constexpr int maxDigits{3 - minLog2AnyBit / log10Radix};
+
+public:
+  explicit RT_API_ATTRS BigRadixFloatingPointNumber(
+      enum FortranRounding rounding = RoundNearest)
+      : rounding_{rounding} {}
+
+  // Converts a binary floating point value.
+  explicit RT_API_ATTRS BigRadixFloatingPointNumber(
+      Real, enum FortranRounding = RoundNearest);
+
+  RT_API_ATTRS BigRadixFloatingPointNumber &SetToZero() {
+    isNegative_ = false;
+    digits_ = 0;
+    exponent_ = 0;
+    return *this;
+  }
+
+  RT_API_ATTRS bool IsInteger() const { return exponent_ >= 0; }
+
+  // Converts decimal floating-point to binary.
+  RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary();
+
+  // Parses and converts to binary.  Handles leading spaces,
+  // "NaN", & optionally-signed "Inf".  Does not skip internal
+  // spaces.
+  // The argument is a reference to a pointer that is left
+  // pointing to the first character that wasn't parsed.
+  RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(
+      const char *&, const char *end = nullptr);
+
+  // Formats a decimal floating-point number to a user buffer.
+  // May emit "NaN" or "Inf", or an possibly-signed integer.
+  // No decimal point is written, but if it were, it would be
+  // after the last digit; the effective decimal exponent is
+  // returned as part of the result structure so that it can be
+  // formatted by the client.
+  RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(
+      char *, std::size_t, enum DecimalConversionFlags, int digits) const;
+
+  // Discard decimal digits not needed to distinguish this value
+  // from the decimal encodings of two others (viz., the nearest binary
+  // floating-point numbers immediately below and above this one).
+  // The last decimal digit may not be uniquely determined in all
+  // cases, and will be the mean value when that is so (e.g., if
+  // last decimal digit values 6-8 would all work, it'll be a 7).
+  // This minimization necessarily assumes that the value will be
+  // emitted and read back into the same (or less precise) format
+  // with default rounding to the nearest value.
+  RT_API_ATTRS void Minimize(
+      BigRadixFloatingPointNumber &&less, BigRadixFloatingPointNumber &&more);
+
+  template <typename STREAM> STREAM &Dump(STREAM &) const;
+
+private:
+  RT_API_ATTRS BigRadixFloatingPointNumber(
+      const BigRadixFloatingPointNumber &that)
+      : digits_{that.digits_}, exponent_{that.exponent_},
+        isNegative_{that.isNegative_}, rounding_{that.rounding_} {
+    for (int j{0}; j < digits_; ++j) {
+      digit_[j] = that.digit_[j];
+    }
+  }
+
+  RT_API_ATTRS bool IsZero() const {
+    // Don't assume normalization.
+    for (int j{0}; j < digits_; ++j) {
+      if (digit_[j] != 0) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Predicate: true when 10*value would cause a carry.
+  // (When this happens during decimal-to-binary conversion,
+  // there are more digits in the input string than can be
+  // represented precisely.)
+  RT_API_ATTRS bool IsFull() const {
+    return digits_ == digitLimit_ && digit_[digits_ - 1] >= radix / 10;
+  }
+
+  // Sets *this to an unsigned integer value.
+  // Returns any remainder.
+  template <typename UINT> RT_API_ATTRS UINT SetTo(UINT n) {
+    static_assert(
+        std::is_same_v<UINT, common::uint128_t> || std::is_unsigned_v<UINT>);
+    SetToZero();
+    while (n != 0) {
+      auto q{n / 10u};
+      if (n != q * 10) {
+        break;
+      }
+      ++exponent_;
+      n = q;
+    }
+    if constexpr (sizeof n < sizeof(Digit)) {
+      if (n != 0) {
+        digit_[digits_++] = n;
+      }
+      return 0;
+    } else {
+      while (n != 0 && digits_ < digitLimit_) {
+        auto q{n / radix};
+        digit_[digits_++] = static_cast<Digit>(n - q * radix);
+        n = q;
+      }
+      return n;
+    }
+  }
+
+  RT_API_ATTRS int RemoveLeastOrderZeroDigits() {
+    int remove{0};
+    if (digits_ > 0 && digit_[0] == 0) {
+      while (remove < digits_ && digit_[remove] == 0) {
+        ++remove;
+      }
+      if (remove >= digits_) {
+        digits_ = 0;
+      } else if (remove > 0) {
+#if defined __GNUC__ && __GNUC__ < 8
+        // (&& j + remove < maxDigits) was added to avoid GCC < 8 build failure
+        // on -Werror=array-bounds. This can be removed if -Werror is disable.
+        for (int j{0}; j + remove < digits_ && (j + remove < maxDigits); ++j) {
+#else
+        for (int j{0}; j + remove < digits_; ++j) {
+#endif
+          digit_[j] = digit_[j + remove];
+        }
+        digits_ -= remove;
+      }
+    }
+    return remove;
+  }
+
+  RT_API_ATTRS void RemoveLeadingZeroDigits() {
+    while (digits_ > 0 && digit_[digits_ - 1] == 0) {
+      --digits_;
+    }
+  }
+
+  RT_API_ATTRS void Normalize() {
+    RemoveLeadingZeroDigits();
+    exponent_ += RemoveLeastOrderZeroDigits() * log10Radix;
+  }
+
+  // This limited divisibility test only works for even divisors of the radix,
+  // which is fine since it's only ever used with 2 and 5.
+  template <int N> RT_API_ATTRS bool IsDivisibleBy() const {
+    static_assert(N > 1 && radix % N == 0, "bad modulus");
+    return digits_ == 0 || (digit_[0] % N) == 0;
+  }
+
+  template <unsigned DIVISOR> RT_API_ATTRS int DivideBy() {
+    Digit remainder{0};
+    for (int j{digits_ - 1}; j >= 0; --j) {
+      Digit q{digit_[j] / DIVISOR};
+      Digit nrem{digit_[j] - DIVISOR * q};
+      digit_[j] = q + (radix / DIVISOR) * remainder;
+      remainder = nrem;
+    }
+    return remainder;
+  }
+
+  RT_API_ATTRS void DivideByPowerOfTwo(int twoPow) { // twoPow <= log10Radix
+    Digit remainder{0};
+    auto mask{(Digit{1} << twoPow) - 1};
+    auto coeff{radix >> twoPow};
+    for (int j{digits_ - 1}; j >= 0; --j) {
+      auto nrem{digit_[j] & mask};
+      digit_[j] = (digit_[j] >> twoPow) + coeff * remainder;
+      remainder = nrem;
+    }
+  }
+
+  // Returns true on overflow
+  RT_API_ATTRS bool DivideByPowerOfTwoInPlace(int twoPow) {
+    if (digits_ > 0) {
+      while (twoPow > 0) {
+        int chunk{twoPow > log10Radix ? log10Radix : twoPow};
+        if ((digit_[0] & ((Digit{1} << chunk) - 1)) == 0) {
+          DivideByPowerOfTwo(chunk);
+          twoPow -= chunk;
+          continue;
+        }
+        twoPow -= chunk;
+        if (digit_[digits_ - 1] >> chunk != 0) {
+          if (digits_ == digitLimit_) {
+            return true; // overflow
+          }
+          digit_[digits_++] = 0;
+        }
+        auto remainder{digit_[digits_ - 1]};
+        exponent_ -= log10Radix;
+        auto coeff{radix >> chunk}; // precise; radix is (5*2)**log10Radix
+        auto mask{(Digit{1} << chunk) - 1};
+        for (int j{digits_ - 1}; j >= 1; --j) {
+          digit_[j] = (digit_[j - 1] >> chunk) + coeff * remainder;
+          remainder = digit_[j - 1] & mask;
+        }
+        digit_[0] = coeff * remainder;
+      }
+    }
+    return false; // no overflow
+  }
+
+  RT_API_ATTRS int AddCarry(int position = 0, int carry = 1) {
+    for (; position < digits_; ++position) {
+      Digit v{digit_[position] + carry};
+      if (v < radix) {
+        digit_[position] = v;
+        return 0;
+      }
+      digit_[position] = v - radix;
+      carry = 1;
+    }
+    if (digits_ < digitLimit_) {
+      digit_[digits_++] = carry;
+      return 0;
+    }
+    Normalize();
+    if (digits_ < digitLimit_) {
+      digit_[digits_++] = carry;
+      return 0;
+    }
+    return carry;
+  }
+
+  RT_API_ATTRS void Decrement() {
+    for (int j{0}; digit_[j]-- == 0; ++j) {
+      digit_[j] = radix - 1;
+    }
+  }
+
+  template <int N> RT_API_ATTRS int MultiplyByHelper(int carry = 0) {
+    for (int j{0}; j < digits_; ++j) {
+      auto v{N * digit_[j] + carry};
+      carry = v / radix;
+      digit_[j] = v - carry * radix; // i.e., v % radix
+    }
+    return carry;
+  }
+
+  template <int N> RT_API_ATTRS int MultiplyBy(int carry = 0) {
+    if (int newCarry{MultiplyByHelper<N>(carry)}) {
+      return AddCarry(digits_, newCarry);
+    } else {
+      return 0;
+    }
+  }
+
+  template <int N> RT_API_ATTRS int MultiplyWithoutNormalization() {
+    if (int carry{MultiplyByHelper<N>(0)}) {
+      if (digits_ < digitLimit_) {
+        digit_[digits_++] = carry;
+        return 0;
+      } else {
+        return carry;
+      }
+    } else {
+      return 0;
+    }
+  }
+
+  RT_API_ATTRS void LoseLeastSignificantDigit(); // with rounding
+
+  RT_API_ATTRS void PushCarry(int carry) {
+    if (digits_ == maxDigits && RemoveLeastOrderZeroDigits() == 0) {
+      LoseLeastSignificantDigit();
+      digit_[digits_ - 1] += carry;
+    } else {
+      digit_[digits_++] = carry;
+    }
+  }
+
+  // Adds another number and then divides by two.
+  // Assumes same exponent and sign.
+  // Returns true when the result has effectively been rounded down.
+  RT_API_ATTRS bool Mean(const BigRadixFloatingPointNumber &);
+
+  // Parses a floating-point number; leaves the pointer reference
+  // argument pointing at the next character after what was recognized.
+  // The "end" argument can be left null if the caller is sure that the
+  // string is properly terminated with an addressable character that
+  // can't be in a valid floating-point character.
+  RT_API_ATTRS bool ParseNumber(const char *&, bool &inexact, const char *end);
+
+  using Raw = typename Real::RawType;
+  constexpr RT_API_ATTRS Raw SignBit() const {
+    return Raw{isNegative_} << (Real::bits - 1);
+  }
+  constexpr RT_API_ATTRS Raw Infinity() const {
+    Raw result{static_cast<Raw>(Real::maxExponent)};
+    result <<= Real::significandBits;
+    result |= SignBit();
+    if constexpr (Real::bits == 80) { // x87
+      result |= Raw{1} << 63;
+    }
+    return result;
+  }
+  constexpr RT_API_ATTRS Raw NaN(bool isQuiet = true) {
+    Raw result{Real::maxExponent};
+    result <<= Real::significandBits;
+    result |= SignBit();
+    if constexpr (Real::bits == 80) { // x87
+      result |= Raw{isQuiet ? 3u : 2u} << 62;
+    } else {
+      Raw quiet{isQuiet ? Raw{2} : Raw{1}};
+      quiet <<= Real::significandBits - 2;
+      result |= quiet;
+    }
+    return result;
+  }
+  constexpr RT_API_ATTRS Raw HUGE() const {
+    Raw result{static_cast<Raw>(Real::maxExponent)};
+    result <<= Real::significandBits;
+    result |= SignBit();
+    return result - 1; // decrement exponent, set all significand bits
+  }
+
+  Digit digit_[maxDigits]; // in little-endian order: digit_[0] is LSD
+  int digits_{0}; // # of elements in digit_[] array; zero when zero
+  int digitLimit_{maxDigits}; // precision clamp
+  int exponent_{0}; // signed power of ten
+  bool isNegative_{false};
+  enum FortranRounding rounding_ { RoundNearest };
+};
+} // namespace Fortran::decimal
+#endif
diff --git a/flang/lib/Common/default-kinds.cpp b/flang/lib/Support/default-kinds.cpp
similarity index 94%
rename from flang/lib/Common/default-kinds.cpp
rename to flang/lib/Support/default-kinds.cpp
index 0c708fcd605094..612adceb9d996b 100644
--- a/flang/lib/Common/default-kinds.cpp
+++ b/flang/lib/Support/default-kinds.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Common/default-kinds.cpp --------------------------------------===//
+//===-- lib/Support/default-kinds.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Common/idioms.h"
 
 namespace Fortran::common {
diff --git a/flang/lib/Common/idioms.cpp b/flang/lib/Support/idioms.cpp
similarity index 89%
rename from flang/lib/Common/idioms.cpp
rename to flang/lib/Support/idioms.cpp
index 536a5c2e5479df..906a4c1bcd9b0a 100644
--- a/flang/lib/Common/idioms.cpp
+++ b/flang/lib/Support/idioms.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Common/idioms.cpp ---------------------------------------------===//
+//===-- lib/Support/idioms.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/runtime/CMakeLists.txt b/flang/runtime/CMakeLists.txt
deleted file mode 100644
index 4537b2d059d65b..00000000000000
--- a/flang/runtime/CMakeLists.txt
+++ /dev/null
@@ -1,314 +0,0 @@
-#===-- runtime/CMakeLists.txt ----------------------------------------------===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-
-if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
-  cmake_minimum_required(VERSION 3.20.0)
-
-  project(FlangRuntime C CXX)
-
-  set(CMAKE_CXX_STANDARD 17)
-  set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
-  set(CMAKE_CXX_EXTENSIONS OFF)
-
-  set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
-
-  set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake")
-  set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake")
-  set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake")
-
-  # Add path for custom modules
-  list(INSERT CMAKE_MODULE_PATH 0
-    "${FLANG_SOURCE_DIR}/cmake"
-    "${FLANG_SOURCE_DIR}/cmake/modules"
-    "${LLVM_COMMON_CMAKE_UTILS}"
-    "${LLVM_COMMON_CMAKE_UTILS}/Modules"
-    "${LLVM_CMAKE_UTILS}"
-    "${LLVM_CMAKE_UTILS}/modules"
-    "${CLANG_CMAKE_UTILS}/modules"
-    )
-
-  include(AddClang)
-  include(AddLLVM)
-  include(AddFlang)
-  include(HandleLLVMOptions)
-
-  include(TestBigEndian)
-  test_big_endian(IS_BIGENDIAN)
-  if (IS_BIGENDIAN)
-    add_compile_definitions(FLANG_BIG_ENDIAN=1)
-  else ()
-    add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
-  endif ()
-  include_directories(BEFORE
-    ${FLANG_SOURCE_DIR}/include)
-
-  # The out of tree builds of the compiler and the Fortran runtime
-  # must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
-  # to be composable. Failure to synchronize this setting may result
-  # in linking errors or fatal failures in F128 runtime functions.
-  set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
-    "Specifies the target library used for implementing IEEE-754 128-bit float \
-    math in F18 runtime, e.g. it might be libquadmath for targets where \
-    REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
-    is mapped to long double, etc."
-    )
-endif()
-
-include(CheckCXXSymbolExists)
-include(CheckCXXSourceCompiles)
-check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
-# Can't use symbol exists here as the function is overloaded in C++
-check_cxx_source_compiles(
-  "#include <string.h>
-   int main() {
-     char buf[4096];
-     return strerror_s(buf, 4096, 0);
-   }
-  "
-  HAVE_DECL_STRERROR_S)
-
-# Check if 128-bit float computations can be done via long double.
-check_cxx_source_compiles(
-  "#include <cfloat>
-   #if LDBL_MANT_DIG != 113
-   #error LDBL_MANT_DIG != 113
-   #endif
-   int main() { return 0; }
-  "
-  HAVE_LDBL_MANT_DIG_113)
-
-check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
-if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
-  set(NO_LTO_FLAGS "-fno-lto")
-else()
-  set(NO_LTO_FLAGS "")
-endif()
-
-configure_file(config.h.cmake config.h)
-# include_directories is used here instead of target_include_directories
-# because add_flang_library creates multiple objects (STATIC/SHARED, OBJECT)
-# with different names
-include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR})
-
-append(${NO_LTO_FLAGS} CMAKE_C_FLAGS)
-append(${NO_LTO_FLAGS} CMAKE_CXX_FLAGS)
-
-# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
-# to avoid an unwanted dependency on libstdc++/libc++.so.
-add_definitions(-U_GLIBCXX_ASSERTIONS)
-add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
-
-add_subdirectory(Float128Math)
-
-set(sources
-  ISO_Fortran_binding.cpp
-  allocator-registry.cpp
-  allocatable.cpp
-  array-constructor.cpp
-  assign.cpp
-  buffer.cpp
-  character.cpp
-  command.cpp
-  complex-powi.cpp
-  complex-reduction.c
-  connection.cpp
-  copy.cpp
-  derived-api.cpp
-  derived.cpp
-  descriptor-io.cpp
-  descriptor.cpp
-  dot-product.cpp
-  edit-input.cpp
-  edit-output.cpp
-  environment.cpp
-  exceptions.cpp
-  execute.cpp
-  extensions.cpp
-  external-unit.cpp
-  extrema.cpp
-  file.cpp
-  findloc.cpp
-  format.cpp
-  inquiry.cpp
-  internal-unit.cpp
-  io-api.cpp
-  io-api-minimal.cpp
-  io-error.cpp
-  io-stmt.cpp
-  iostat.cpp
-  main.cpp
-  matmul-transpose.cpp
-  matmul.cpp
-  memory.cpp
-  misc-intrinsic.cpp
-  namelist.cpp
-  non-tbp-dio.cpp
-  numeric.cpp
-  pointer.cpp
-  product.cpp
-  pseudo-unit.cpp
-  ragged.cpp
-  random.cpp
-  reduce.cpp
-  reduction.cpp
-  stat.cpp
-  stop.cpp
-  sum.cpp
-  support.cpp
-  temporary-stack.cpp
-  terminator.cpp
-  time-intrinsic.cpp
-  tools.cpp
-  transformational.cpp
-  type-code.cpp
-  type-info.cpp
-  unit-map.cpp
-  unit.cpp
-  utf.cpp
-  ${FORTRAN_MODULE_OBJECTS}
-)
-
-include(AddFlangOffloadRuntime)
-
-# List of files that are buildable for all devices.
-set(supported_files
-  ISO_Fortran_binding.cpp
-  allocatable.cpp
-  allocator-registry.cpp
-  array-constructor.cpp
-  assign.cpp
-  buffer.cpp
-  character.cpp
-  connection.cpp
-  copy.cpp
-  derived-api.cpp
-  derived.cpp
-  descriptor.cpp
-  descriptor-io.cpp
-  dot-product.cpp
-  edit-input.cpp
-  edit-output.cpp
-  environment.cpp
-  extrema.cpp
-  external-unit.cpp
-  file.cpp
-  findloc.cpp
-  format.cpp
-  inquiry.cpp
-  internal-unit.cpp
-  io-api.cpp
-  io-api-minimal.cpp
-  io-error.cpp
-  io-stmt.cpp
-  iostat.cpp
-  matmul-transpose.cpp
-  matmul.cpp
-  memory.cpp
-  misc-intrinsic.cpp
-  namelist.cpp
-  non-tbp-dio.cpp
-  numeric.cpp
-  pointer.cpp
-  product.cpp
-  pseudo-unit.cpp
-  ragged.cpp
-  stat.cpp
-  sum.cpp
-  support.cpp
-  terminator.cpp
-  tools.cpp
-  transformational.cpp
-  type-code.cpp
-  type-info.cpp
-  unit.cpp
-  utf.cpp
-  )
-
-enable_cuda_compilation(FortranRuntime "${supported_files}")
-enable_omp_offload_compilation("${supported_files}")
-
-if (NOT TARGET FortranFloat128Math)
-  # If FortranFloat128Math is not defined, then we are not building
-  # standalone FortranFloat128Math library. Instead, include
-  # the relevant sources into FortranRuntime itself.
-  # The information is provided via FortranFloat128MathILib
-  # interface library.
-  get_target_property(f128_sources
-    FortranFloat128MathILib INTERFACE_SOURCES
-    )
-  if (f128_sources)
-    # The interface may define special macros for Float128Math files,
-    # so we need to propagate them.
-    get_target_property(f128_defs
-      FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS
-      )
-    set_property(SOURCE ${f128_sources}
-      APPEND PROPERTY COMPILE_DEFINITIONS
-      ${f128_defs}
-      )
-    list(APPEND sources ${f128_sources})
-  endif()
-endif()
-
-if (NOT DEFINED MSVC)
-  add_flang_library(FortranRuntime
-    ${sources}
-    LINK_LIBS
-    FortranDecimal
-
-    INSTALL_WITH_TOOLCHAIN
-  )
-else()
-  add_flang_library(FortranRuntime
-    ${sources}
-    LINK_LIBS
-    FortranDecimal
-  )
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
-  add_flang_library(FortranRuntime.static ${sources}
-    LINK_LIBS
-    FortranDecimal.static
-    INSTALL_WITH_TOOLCHAIN)
-  set_target_properties(FortranRuntime.static PROPERTIES FOLDER "Flang/Runtime Libraries")
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
-  add_flang_library(FortranRuntime.dynamic ${sources}
-    LINK_LIBS
-    FortranDecimal.dynamic
-    INSTALL_WITH_TOOLCHAIN)
-  set_target_properties(FortranRuntime.dynamic PROPERTIES FOLDER "Flang/Runtime Libraries")
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
-  add_flang_library(FortranRuntime.static_dbg ${sources}
-    LINK_LIBS
-    FortranDecimal.static_dbg
-    INSTALL_WITH_TOOLCHAIN)
-  set_target_properties(FortranRuntime.static_dbg PROPERTIES FOLDER "Flang/Runtime Libraries")
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
-  add_flang_library(FortranRuntime.dynamic_dbg ${sources}
-    LINK_LIBS
-    FortranDecimal.dynamic_dbg
-    INSTALL_WITH_TOOLCHAIN)
-  set_target_properties(FortranRuntime.dynamic_dbg PROPERTIES FOLDER "Flang/Runtime Libraries")
-  add_dependencies(FortranRuntime FortranRuntime.static FortranRuntime.dynamic
-    FortranRuntime.static_dbg FortranRuntime.dynamic_dbg)
-endif()
-set_target_properties(FortranRuntime PROPERTIES FOLDER "Flang/Runtime Libraries")
-
-# If FortranRuntime is part of a Flang build (and not a separate build) then
-# add dependency to make sure that Fortran runtime library is being built after
-# we have the Flang compiler available.  This also includes the MODULE files
-# that compile when the 'flang-new' target is built.
-#
-# TODO: This is a workaround and should be updated when runtime build procedure
-# is changed to a regular runtime build.  See discussion in PR #95388.
-if (TARGET flang-new AND TARGET module_files)
-  add_dependencies(FortranRuntime flang-new module_files)
-endif()
-
-if (FLANG_CUF_RUNTIME)
-  add_subdirectory(CUDA)
-endif()
diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt
index a18a5c6519eda4..60261ea352780a 100644
--- a/flang/test/CMakeLists.txt
+++ b/flang/test/CMakeLists.txt
@@ -63,7 +63,7 @@ set(FLANG_TEST_DEPENDS
   FileCheck
   count
   not
-  module_files
+#  module_files
   fir-opt
   tco
   bbc
@@ -71,8 +71,6 @@ set(FLANG_TEST_DEPENDS
   llvm-objdump
   llvm-readobj
   split-file
-  FortranRuntime
-  FortranDecimal
 )
 if (LLVM_ENABLE_PLUGINS AND NOT WIN32)
   list(APPEND FLANG_TEST_DEPENDS Bye)
diff --git a/flang/test/Driver/linker-flags.f90 b/flang/test/Driver/linker-flags.f90
index ac9500d7c45cec..fdeb95e4dd97c6 100644
--- a/flang/test/Driver/linker-flags.f90
+++ b/flang/test/Driver/linker-flags.f90
@@ -33,7 +33,7 @@
 ! SOLARIS-F128NONE-NOT: FortranFloat128Math
 ! UNIX-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
 ! SOLARIS-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "-z" "ignore" "-lquadmath" "-z" "record"
-! UNIX-SAME: "-lFortranRuntime" "-lFortranDecimal" "-lm"
+! UNIX-SAME: "-lFortranRuntime" "-lm"
 ! COMPILER-RT: "{{.*}}{{\\|/}}libclang_rt.builtins.a"
 
 ! DARWIN-LABEL:  "{{.*}}ld{{(\.exe)?}}"
@@ -41,20 +41,18 @@
 ! DARWIN-F128NONE-NOT: FortranFloat128Math
 ! DARWIN-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
 ! DARWIN-SAME: -lFortranRuntime
-! DARWIN-SAME: -lFortranDecimal
 
 ! HAIKU-LABEL:  "{{.*}}ld{{(\.exe)?}}"
 ! HAIKU-SAME: "[[object_file]]"
 ! HAIKU-F128NONE-NOT: FortranFloat128Math
 ! HAIKU-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
-! HAIKU-SAME: "-lFortranRuntime" "-lFortranDecimal"
+! HAIKU-SAME: "-lFortranRuntime"
 
 ! MINGW-LABEL:  "{{.*}}ld{{(\.exe)?}}"
 ! MINGW-SAME: "[[object_file]]"
 ! MINGW-F128NONE-NOT: FortranFloat128Math
 ! MINGW-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
 ! MINGW-SAME: -lFortranRuntime
-! MINGW-SAME: -lFortranDecimal
 
 ! NOTE: This also matches lld-link (when CLANG_DEFAULT_LINKER=lld) and
 !       any .exe suffix that is added when resolving to the full path of
diff --git a/flang/test/Driver/msvc-dependent-lib-flags.f90 b/flang/test/Driver/msvc-dependent-lib-flags.f90
index 765917f07d8e72..befe61fdadcd14 100644
--- a/flang/test/Driver/msvc-dependent-lib-flags.f90
+++ b/flang/test/Driver/msvc-dependent-lib-flags.f90
@@ -8,7 +8,6 @@
 ! MSVC-SAME: -D_MT
 ! MSVC-SAME: --dependent-lib=libcmt
 ! MSVC-SAME: --dependent-lib=FortranRuntime.static.lib
-! MSVC-SAME: --dependent-lib=FortranDecimal.static.lib
 
 ! MSVC-DEBUG: -fc1
 ! MSVC-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
@@ -16,7 +15,6 @@
 ! MSVC-DEBUG-SAME: -D_DEBUG
 ! MSVC-DEBUG-SAME: --dependent-lib=libcmtd
 ! MSVC-DEBUG-SAME: --dependent-lib=FortranRuntime.static_dbg.lib
-! MSVC-DEBUG-SAME: --dependent-lib=FortranDecimal.static_dbg.lib
 
 ! MSVC-DLL: -fc1
 ! MSVC-DLL-SAME: --dependent-lib=clang_rt.builtins.lib
@@ -24,7 +22,6 @@
 ! MSVC-DLL-SAME: -D_DLL
 ! MSVC-DLL-SAME: --dependent-lib=msvcrt
 ! MSVC-DLL-SAME: --dependent-lib=FortranRuntime.dynamic.lib
-! MSVC-DLL-SAME: --dependent-lib=FortranDecimal.dynamic.lib
 
 ! MSVC-DLL-DEBUG: -fc1
 ! MSVC-DLL-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
@@ -33,4 +30,3 @@
 ! MSVC-DLL-DEBUG-SAME: -D_DLL
 ! MSVC-DLL-DEBUG-SAME: --dependent-lib=msvcrtd
 ! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranRuntime.dynamic_dbg.lib
-! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranDecimal.dynamic_dbg.lib
diff --git a/flang/test/lib/CMakeLists.txt b/flang/test/lib/CMakeLists.txt
index fc6ef10fab1f5a..687b107844c651 100644
--- a/flang/test/lib/CMakeLists.txt
+++ b/flang/test/lib/CMakeLists.txt
@@ -1 +1,2 @@
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_subdirectory(Analysis)
diff --git a/flang/test/lit.cfg.py b/flang/test/lit.cfg.py
index 4acbc0606d1977..48b03e34798792 100644
--- a/flang/test/lit.cfg.py
+++ b/flang/test/lit.cfg.py
@@ -163,29 +163,6 @@
         ToolSubst("%not_todo_abort_cmd", command=FindTool("not"), unresolved="fatal")
     )
 
-# Define some variables to help us test that the flang runtime doesn't depend on
-# the C++ runtime libraries. For this we need a C compiler. If for some reason
-# we don't have one, we can just disable the test.
-if config.cc:
-    libruntime = os.path.join(config.flang_lib_dir, "libFortranRuntime.a")
-    libdecimal = os.path.join(config.flang_lib_dir, "libFortranDecimal.a")
-    include = os.path.join(config.flang_src_dir, "include")
-
-    if (
-        os.path.isfile(libruntime)
-        and os.path.isfile(libdecimal)
-        and os.path.isdir(include)
-    ):
-        config.available_features.add("c-compiler")
-        tools.append(
-            ToolSubst(
-                "%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"
-            )
-        )
-        tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
-        tools.append(ToolSubst("%libdecimal", command=libdecimal, unresolved="fatal"))
-        tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
-
 # Add all the tools and their substitutions (if applicable). Use the search paths provided for
 # finding the tools.
 if config.flang_standalone_build:
diff --git a/flang/test/lit.site.cfg.py.in b/flang/test/lit.site.cfg.py.in
index d1a0ac763cf8a0..65864302fb7aec 100644
--- a/flang/test/lit.site.cfg.py.in
+++ b/flang/test/lit.site.cfg.py.in
@@ -21,7 +21,6 @@ config.python_executable = "@PYTHON_EXECUTABLE@"
 config.flang_standalone_build = @FLANG_STANDALONE_BUILD@
 config.has_plugins = @LLVM_ENABLE_PLUGINS@
 config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
-config.cc = "@CMAKE_C_COMPILER@"
 config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
 config.targets_to_build = "@TARGETS_TO_BUILD@"
 config.default_sysroot = "@DEFAULT_SYSROOT@"
diff --git a/flang/tools/CMakeLists.txt b/flang/tools/CMakeLists.txt
index 337545ae0d4d7a..c9f00c8cc6dbd6 100644
--- a/flang/tools/CMakeLists.txt
+++ b/flang/tools/CMakeLists.txt
@@ -7,7 +7,6 @@
 #===------------------------------------------------------------------------===#
 
 add_subdirectory(bbc)
-add_subdirectory(f18)
 add_subdirectory(flang-driver)
 add_subdirectory(tco)
 add_subdirectory(f18-parse-demo)
diff --git a/flang/tools/bbc/CMakeLists.txt b/flang/tools/bbc/CMakeLists.txt
index 69316d4dc61de3..68e4b59fd6eec5 100644
--- a/flang/tools/bbc/CMakeLists.txt
+++ b/flang/tools/bbc/CMakeLists.txt
@@ -6,6 +6,7 @@ AllTargetsInfos
 TargetParser
 )
 
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(bbc bbc.cpp
 DEPENDS
 FIROptCodeGenPassIncGen
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index dcff4503f16571..e9ec6b7116e0aa 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -14,10 +14,10 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/OpenMP-features.h"
-#include "flang/Common/Version.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/OpenMP-features.h"
+#include "flang/Support/Version.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Frontend/TargetOptions.h"
 #include "flang/Lower/Bridge.h"
 #include "flang/Lower/PFTBuilder.h"
diff --git a/flang/tools/f18-parse-demo/CMakeLists.txt b/flang/tools/f18-parse-demo/CMakeLists.txt
index df1f1d24a55e51..34f1bf048ad849 100644
--- a/flang/tools/f18-parse-demo/CMakeLists.txt
+++ b/flang/tools/f18-parse-demo/CMakeLists.txt
@@ -1,3 +1,5 @@
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
+
 set(LLVM_LINK_COMPONENTS
   FrontendOpenACC
   FrontendOpenMP
diff --git a/flang/tools/f18-parse-demo/f18-parse-demo.cpp b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
index 3025dbd4dca4ab..691b6cebec9b51 100644
--- a/flang/tools/f18-parse-demo/f18-parse-demo.cpp
+++ b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
@@ -21,8 +21,8 @@
 // scaffolding compiler driver that can test some semantic passes of the
 // F18 compiler under development.
 
-#include "flang/Common/Fortran-features.h"
-#include "flang/Common/default-kinds.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/dump-parse-tree.h"
 #include "flang/Parser/message.h"
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
deleted file mode 100644
index 9d7b8633958cb7..00000000000000
--- a/flang/tools/f18/CMakeLists.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-set(LLVM_LINK_COMPONENTS
-  FrontendOpenACC
-  FrontendOpenMP
-  Support
-  )
-
-# Define the list of Fortran module files that need to be compiled
-# to produce an object file for inclusion into the FortranRuntime
-# library.
-set(MODULES_WITH_IMPLEMENTATION
-  "iso_fortran_env_impl"
-)
-
-# Define the list of Fortran module files for which it is
-# sufficient to generate the module file via -fsyntax-only.
-set(MODULES_WITHOUT_IMPLEMENTATION
-  "__fortran_builtins"
-  "__fortran_ieee_exceptions"
-  "__fortran_type_info"
-  "__ppc_types"
-  "__ppc_intrinsics"
-  "mma"
-  "__cuda_builtins"
-  "cudadevice"
-  "ieee_arithmetic"
-  "ieee_exceptions"
-  "ieee_features"
-  "iso_c_binding"
-  "iso_fortran_env"
-)
-
-set(MODULES ${MODULES_WITH_IMPLEMENTATION} ${MODULES_WITHOUT_IMPLEMENTATION})
-
-# Check if 128-bit float computations can be done via long double.
-check_cxx_source_compiles(
-  "#include <cfloat>
-   #if LDBL_MANT_DIG != 113
-   #error LDBL_MANT_DIG != 113
-   #endif
-   int main() { return 0; }
-  "
-  HAVE_LDBL_MANT_DIG_113)
-
-# Figure out whether we can support REAL(KIND=16)
-if (FLANG_RUNTIME_F128_MATH_LIB)
-  set(FLANG_SUPPORT_R16 "1")
-elseif (HAVE_LDBL_MANT_DIG_113)
-  set(FLANG_SUPPORT_R16 "1")
-else()
-  set(FLANG_SUPPORT_R16 "0")
-endif()
-
-# Init variable to hold extra object files coming from the Fortran modules;
-# these module files will be contributed from the CMakeLists in flang/tools/f18.
-set(module_objects "")
-
-# Create module files directly from the top-level module source directory.
-# If CMAKE_CROSSCOMPILING, then the newly built flang-new executable was
-# cross compiled, and thus can't be executed on the build system and thus
-# can't be used for generating module files.
-if (NOT CMAKE_CROSSCOMPILING)
-  foreach(filename ${MODULES})
-    set(depends "")
-    set(opts "")
-    if(${filename} STREQUAL "__fortran_builtins" OR
-       ${filename} STREQUAL "__ppc_types")
-    elseif(${filename} STREQUAL "__ppc_intrinsics" OR
-           ${filename} STREQUAL "mma")
-      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__ppc_types.mod)
-    elseif(${filename} STREQUAL "cudadevice")
-      set(opts -fc1 -xcuda)
-      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__cuda_builtins.mod)
-    else()
-      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
-      if(${filename} STREQUAL "iso_fortran_env")
-        set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/iso_fortran_env_impl.mod)
-      endif()
-      if(${filename} STREQUAL "ieee_arithmetic" OR
-         ${filename} STREQUAL "ieee_exceptions")
-        set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_ieee_exceptions.mod)
-      endif()
-    endif()
-    if(NOT ${filename} STREQUAL "__fortran_type_info" AND NOT ${filename} STREQUAL "__fortran_builtins")
-      set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_type_info.mod)
-    endif()
-
-    # The module contains PPC vector types that needs the PPC target.
-    if(${filename} STREQUAL "__ppc_intrinsics" OR
-       ${filename} STREQUAL "mma")
-      if (PowerPC IN_LIST LLVM_TARGETS_TO_BUILD)
-        set(opts "--target=ppc64le")
-      else()
-        # Do not compile PPC module if the target is not available.
-        continue()
-      endif()
-    endif()
-
-    set(decls "")
-    if (FLANG_SUPPORT_R16)
-      set(decls "-DFLANG_SUPPORT_R16")
-    endif()
-
-    # Some modules have an implementation part that needs to be added to the
-    # FortranRuntime library.
-    set(compile_with "-fsyntax-only")
-    set(object_output "")
-    set(include_in_link FALSE)
-    if(${filename} IN_LIST MODULES_WITH_IMPLEMENTATION)
-      set(object_output "${CMAKE_CURRENT_BINARY_DIR}/${filename}${CMAKE_CXX_OUTPUT_EXTENSION}")
-      set(compile_with -c -o ${object_output})
-      set(include_in_link TRUE)
-    endif()
-
-    set(base ${FLANG_INTRINSIC_MODULES_DIR}/${filename})
-    # TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
-    add_custom_command(OUTPUT ${base}.mod ${object_output}
-      COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
-      COMMAND flang-new ${opts} ${decls} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
-        ${FLANG_SOURCE_DIR}/module/${filename}.f90
-      DEPENDS flang-new ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
-    )
-    list(APPEND MODULE_FILES ${base}.mod)
-    install(FILES ${base}.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
-
-    # If a module has been compiled into an object file, add the file to
-    # the link line for the FortranRuntime library.
-    if(include_in_link)
-      list(APPEND module_objects ${object_output})
-    endif()
-  endforeach()
-
-  # Set a CACHE variable that is visible to the CMakeLists.txt in runtime/, so that
-  # the compiled Fortran modules can be added to the link line of the FortranRuntime
-  # library.
-  set(FORTRAN_MODULE_OBJECTS ${module_objects} CACHE INTERNAL "" FORCE)
-
-  # Special case for omp_lib.mod, because its source comes from openmp/runtime/src/include.
-  # It also produces two module files: omp_lib.mod and omp_lib_kinds.mod.  Compile these
-  # files only if OpenMP support has been configured.
-  if (LLVM_TOOL_OPENMP_BUILD)
-    message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.mod")
-    set(base ${FLANG_INTRINSIC_MODULES_DIR}/omp_lib)
-    add_custom_command(OUTPUT ${base}.mod ${base}_kinds.mod
-      COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
-      COMMAND flang-new -cpp -fsyntax-only ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
-        ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90
-      DEPENDS flang-new ${FLANG_INTRINSIC_MODULES_DIR}/iso_c_binding.mod ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90 ${depends}
-    )
-    add_custom_command(OUTPUT ${base}.f18.mod
-      DEPENDS ${base}.mod
-      COMMAND ${CMAKE_COMMAND} -E copy ${base}.mod ${base}.f18.mod)
-      add_custom_command(OUTPUT ${base}_kinds.f18.mod
-        DEPENDS ${base}.mod
-        COMMAND ${CMAKE_COMMAND} -E copy ${base}_kinds.mod ${base}_kinds.f18.mod)
-    list(APPEND MODULE_FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod)
-    install(FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
-  else()
-    message(STATUS "Not building omp_lib.mod, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
-  endif()
-endif()
-
-add_custom_target(module_files ALL DEPENDS ${MODULE_FILES})
-set_target_properties(module_files PROPERTIES FOLDER "Flang/Resources")
-
-# TODO Move this to a more suitable location
-# Copy the generated omp_lib.h header file, if OpenMP support has been configured.
-if (LLVM_TOOL_OPENMP_BUILD)
-  message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.h")
-  file(COPY ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)
-  install(FILES ${CMAKE_BINARY_DIR}/include/flang/OpenMP/omp_lib.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang/OpenMP")
-else()
-  message(STATUS "Not copying omp_lib.h, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
-endif()
diff --git a/flang/tools/f18/dump.cpp b/flang/tools/f18/dump.cpp
deleted file mode 100644
index f11b5aedf4c6af..00000000000000
--- a/flang/tools/f18/dump.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-//===-- tools/f18/dump.cpp ------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// This file defines Dump routines available for calling from the debugger.
-// Each is based on operator<< for that type. There are overloadings for
-// reference and pointer, and for dumping to a provided raw_ostream or errs().
-
-#ifdef DEBUGF18
-
-#include "llvm/Support/raw_ostream.h"
-
-#define DEFINE_DUMP(ns, name) \
-  namespace ns { \
-  class name; \
-  llvm::raw_ostream &operator<<(llvm::raw_ostream &, const name &); \
-  } \
-  void Dump(llvm::raw_ostream &os, const ns::name &x) { os << x << '\n'; } \
-  void Dump(llvm::raw_ostream &os, const ns::name *x) { \
-    if (x == nullptr) \
-      os << "null\n"; \
-    else \
-      Dump(os, *x); \
-  } \
-  void Dump(const ns::name &x) { Dump(llvm::errs(), x); } \
-  void Dump(const ns::name *x) { Dump(llvm::errs(), *x); }
-
-namespace Fortran {
-DEFINE_DUMP(parser, Name)
-DEFINE_DUMP(parser, CharBlock)
-DEFINE_DUMP(semantics, Symbol)
-DEFINE_DUMP(semantics, Scope)
-DEFINE_DUMP(semantics, IntrinsicTypeSpec)
-DEFINE_DUMP(semantics, DerivedTypeSpec)
-DEFINE_DUMP(semantics, DeclTypeSpec)
-} // namespace Fortran
-
-#endif
diff --git a/flang/tools/fir-opt/CMakeLists.txt b/flang/tools/fir-opt/CMakeLists.txt
index 4c6dbf7d9c8c37..3723ac5d7b37d2 100644
--- a/flang/tools/fir-opt/CMakeLists.txt
+++ b/flang/tools/fir-opt/CMakeLists.txt
@@ -1,3 +1,4 @@
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(fir-opt fir-opt.cpp)
 llvm_update_compile_flags(fir-opt)
 get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
@@ -19,6 +20,7 @@ target_link_libraries(fir-opt PRIVATE
   FIRCodeGen
   HLFIRDialect
   HLFIRTransforms
+  FortranCommon # FIXME: Dependency of something else
   FlangOpenMPTransforms
   FIRAnalysis
   ${test_libs}
diff --git a/flang/tools/flang-driver/CMakeLists.txt b/flang/tools/flang-driver/CMakeLists.txt
index 9f33cdfe3fa90f..a2ad672b9d48c9 100644
--- a/flang/tools/flang-driver/CMakeLists.txt
+++ b/flang/tools/flang-driver/CMakeLists.txt
@@ -1,6 +1,9 @@
 # Infrastructure to build flang driver entry point. Flang driver depends on
 # LLVM libraries.
 
+message("include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include)")
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
+
 # Set your project compile flags.
 link_directories(${LLVM_LIBRARY_DIR})
 
diff --git a/flang/tools/tco/CMakeLists.txt b/flang/tools/tco/CMakeLists.txt
index 698a398547c773..f308fb6acbe98b 100644
--- a/flang/tools/tco/CMakeLists.txt
+++ b/flang/tools/tco/CMakeLists.txt
@@ -2,6 +2,7 @@ set(LLVM_LINK_COMPONENTS
   Passes
 )
 
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(tco tco.cpp)
 llvm_update_compile_flags(tco)
 get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
@@ -17,6 +18,7 @@ target_link_libraries(tco PRIVATE
   FIRBuilder
   HLFIRDialect
   HLFIRTransforms
+  FortranCommon
   FlangOpenMPTransforms
   ${dialect_libs}
   ${extension_libs}
diff --git a/flang/unittests/CMakeLists.txt b/flang/unittests/CMakeLists.txt
index 945067fed4f82d..f9953bd434d44e 100644
--- a/flang/unittests/CMakeLists.txt
+++ b/flang/unittests/CMakeLists.txt
@@ -1,40 +1,8 @@
-if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
-  # If Fortran runtime is built as CUDA library, the linking
-  # of targets that link FortranRuntime must be done
-  # with CUDA_RESOLVE_DEVICE_SYMBOLS.
-  # CUDA language must be enabled for CUDA_RESOLVE_DEVICE_SYMBOLS
-  # to take effect.
-  enable_language(CUDA)
-endif()
-
 add_custom_target(FlangUnitTests)
 set_target_properties(FlangUnitTests PROPERTIES FOLDER "Flang/Tests")
 
-function(add_flang_unittest_offload_properties target)
-  # Set CUDA_RESOLVE_DEVICE_SYMBOLS.
-  if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
-    set_target_properties(${target}
-      PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
-      )
-  endif()
-  # Enable OpenMP offload during linking. We may need to replace
-  # LINK_OPTIONS with COMPILE_OPTIONS when there are OpenMP offload
-  # unittests.
-  #
-  # FIXME: replace 'native' in --offload-arch option with the list
-  #        of targets that Fortran Runtime was built for.
-  #        Common code must be moved from flang/runtime/CMakeLists.txt.
-  if (NOT FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD STREQUAL "off")
-    set_target_properties(${target}
-      PROPERTIES LINK_OPTIONS
-      "-fopenmp;--offload-arch=native"
-      )
-  endif()
-endfunction()
-
 function(add_flang_unittest test_dirname)
   add_unittest(FlangUnitTests ${test_dirname} ${ARGN})
-  add_flang_unittest_offload_properties(${test_dirname})
 endfunction()
 
 if (CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG)
@@ -67,13 +35,8 @@ function(add_flang_nongtest_unittest test_name)
   if(NOT ARG_SLOW_TEST)
     add_dependencies(FlangUnitTests ${test_name}${suffix})
   endif()
-
-  add_flang_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
 add_subdirectory(Optimizer)
-add_subdirectory(Common)
-add_subdirectory(Decimal)
 add_subdirectory(Evaluate)
-add_subdirectory(Runtime)
 add_subdirectory(Frontend)
diff --git a/flang/unittests/Common/CMakeLists.txt b/flang/unittests/Common/CMakeLists.txt
deleted file mode 100644
index bda02ed29a5efa..00000000000000
--- a/flang/unittests/Common/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-add_flang_unittest(FlangCommonTests
-  FastIntSetTest.cpp
-)
diff --git a/flang/unittests/Decimal/CMakeLists.txt b/flang/unittests/Decimal/CMakeLists.txt
deleted file mode 100644
index d301a9d3628c56..00000000000000
--- a/flang/unittests/Decimal/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
-add_flang_nongtest_unittest(quick-sanity-test
-  FortranDecimal
-)
-
-# This test is not run by default as it takes a long time to execute.
-add_flang_nongtest_unittest(thorough-test
-  SLOW_TEST
-  FortranDecimal
-)
diff --git a/flang/unittests/Evaluate/CMakeLists.txt b/flang/unittests/Evaluate/CMakeLists.txt
index 52eb385f4763fb..a7f763d7b17d85 100644
--- a/flang/unittests/Evaluate/CMakeLists.txt
+++ b/flang/unittests/Evaluate/CMakeLists.txt
@@ -1,7 +1,7 @@
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 add_library(FortranEvaluateTesting
-  testing.cpp
-  fp-testing.cpp
+  ${FORTRANRUNTIME_SOURCE_DIR}/lib/Testing/testing.cpp
+  ${FORTRANRUNTIME_SOURCE_DIR}/lib/Testing/fp-testing.cpp
 )
 set_target_properties(FortranEvaluateTesting PROPERTIES FOLDER "Flang/Tests")
 if (LLVM_LINK_LLVM_DYLIB)
@@ -40,13 +40,12 @@ add_flang_nongtest_unittest(integer
 )
 
 add_flang_nongtest_unittest(intrinsics
+  FortranSupport
   FortranCommon
   FortranEvaluateTesting
   FortranEvaluate
-  FortranDecimal
   FortranSemantics
   FortranParser
-  FortranRuntime
 )
 
 add_flang_nongtest_unittest(logical
@@ -64,25 +63,12 @@ set(LLVM_REQUIRES_RTTI ON)
 add_flang_nongtest_unittest(real
   FortranEvaluateTesting
   FortranEvaluate
-  FortranDecimal
+  FortranCommon
+  FortranSupport
   FortranSemantics
 )
 llvm_update_compile_flags(real.test)
 
-add_flang_nongtest_unittest(reshape
-  FortranEvaluateTesting
-  FortranSemantics
-  FortranEvaluate
-  FortranRuntime
-)
-
-add_flang_nongtest_unittest(ISO-Fortran-binding
-  FortranEvaluateTesting
-  FortranEvaluate
-  FortranSemantics
-  FortranRuntime
-)
-
 add_flang_nongtest_unittest(folding
   FortranCommon
   FortranEvaluateTesting
diff --git a/flang/unittests/Evaluate/bit-population-count.cpp b/flang/unittests/Evaluate/bit-population-count.cpp
index 24e721c14f94a7..0c9529a92e5724 100644
--- a/flang/unittests/Evaluate/bit-population-count.cpp
+++ b/flang/unittests/Evaluate/bit-population-count.cpp
@@ -1,5 +1,5 @@
 #include "flang/Common/bit-population-count.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 
 using Fortran::common::BitPopulationCount;
 using Fortran::common::Parity;
diff --git a/flang/unittests/Evaluate/expression.cpp b/flang/unittests/Evaluate/expression.cpp
index f03a6bc2a4e23c..6349997bafee48 100644
--- a/flang/unittests/Evaluate/expression.cpp
+++ b/flang/unittests/Evaluate/expression.cpp
@@ -1,5 +1,5 @@
 #include "flang/Evaluate/expression.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/intrinsics.h"
 #include "flang/Evaluate/target.h"
diff --git a/flang/unittests/Evaluate/folding.cpp b/flang/unittests/Evaluate/folding.cpp
index 4e8ff9754e4ccb..35df702ff20ea6 100644
--- a/flang/unittests/Evaluate/folding.cpp
+++ b/flang/unittests/Evaluate/folding.cpp
@@ -1,4 +1,4 @@
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include "../../lib/Evaluate/host.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/expression.h"
diff --git a/flang/unittests/Evaluate/integer.cpp b/flang/unittests/Evaluate/integer.cpp
index 3eabb2434cce60..5ab22cc6443a7b 100644
--- a/flang/unittests/Evaluate/integer.cpp
+++ b/flang/unittests/Evaluate/integer.cpp
@@ -1,5 +1,5 @@
 #include "flang/Evaluate/integer.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include <cstdio>
 #include <string>
 
diff --git a/flang/unittests/Evaluate/intrinsics.cpp b/flang/unittests/Evaluate/intrinsics.cpp
index 86c471d2c62950..0baf01a4cb1b7e 100644
--- a/flang/unittests/Evaluate/intrinsics.cpp
+++ b/flang/unittests/Evaluate/intrinsics.cpp
@@ -1,5 +1,5 @@
 #include "flang/Evaluate/intrinsics.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/target.h"
diff --git a/flang/unittests/Evaluate/leading-zero-bit-count.cpp b/flang/unittests/Evaluate/leading-zero-bit-count.cpp
index 968946b69f27ea..25e2664e76df04 100644
--- a/flang/unittests/Evaluate/leading-zero-bit-count.cpp
+++ b/flang/unittests/Evaluate/leading-zero-bit-count.cpp
@@ -1,5 +1,5 @@
 #include "flang/Common/leading-zero-bit-count.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 
 using Fortran::common::LeadingZeroBitCount;
 
diff --git a/flang/unittests/Evaluate/logical.cpp b/flang/unittests/Evaluate/logical.cpp
index d79aff84487123..ee568371eab86c 100644
--- a/flang/unittests/Evaluate/logical.cpp
+++ b/flang/unittests/Evaluate/logical.cpp
@@ -1,4 +1,4 @@
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include "flang/Evaluate/type.h"
 #include <cstdio>
 
diff --git a/flang/unittests/Evaluate/real.cpp b/flang/unittests/Evaluate/real.cpp
index ccbaf81f054cb5..ab1a178df22312 100644
--- a/flang/unittests/Evaluate/real.cpp
+++ b/flang/unittests/Evaluate/real.cpp
@@ -1,5 +1,5 @@
-#include "fp-testing.h"
-#include "testing.h"
+#include "flang/Testing/fp-testing.h"
+#include "flang/Testing/testing.h"
 #include "flang/Evaluate/type.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cmath>
diff --git a/flang/unittests/Evaluate/uint128.cpp b/flang/unittests/Evaluate/uint128.cpp
index f05c1c96a7e8b0..0b749abe1c080a 100644
--- a/flang/unittests/Evaluate/uint128.cpp
+++ b/flang/unittests/Evaluate/uint128.cpp
@@ -1,6 +1,6 @@
 #define AVOID_NATIVE_UINT128_T 1
 #include "flang/Common/uint128.h"
-#include "testing.h"
+#include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
 
diff --git a/flang/unittests/Runtime/CUDA/CMakeLists.txt b/flang/unittests/Runtime/CUDA/CMakeLists.txt
deleted file mode 100644
index ed0caece3d15db..00000000000000
--- a/flang/unittests/Runtime/CUDA/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-if (FLANG_CUF_RUNTIME)
-
-add_flang_unittest(FlangCufRuntimeTests
-  AllocatorCUF.cpp
-)
-
-target_link_libraries(FlangCufRuntimeTests
-  PRIVATE
-  CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR}
-  FortranRuntime
-)
-
-target_include_directories(FlangCufRuntimeTests PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
-
-endif()
diff --git a/lld/COFF/MinGW.cpp b/lld/COFF/MinGW.cpp
index 29c01da9e28f6d..e4e6a3bb52410f 100644
--- a/lld/COFF/MinGW.cpp
+++ b/lld/COFF/MinGW.cpp
@@ -51,7 +51,11 @@ AutoExporter::AutoExporter(
       "libc++",
       "libc++abi",
       "libFortranRuntime",
-      "libFortranDecimal",
+      "libFortranFloat128Math",
+      "libFortranRuntime.static",
+      "libFortranRuntime.dynamic",
+      "libFortranRuntime.static_dbg",
+      "libFortranRuntime.dynamic_dbg",
       "libunwind",
       "libmsvcrt",
       "libucrtbase",
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index c637febce1c1fe..70f6f50ee5e11a 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -149,7 +149,7 @@ endif()
 # As we migrate runtimes to using the bootstrapping build, the set of default runtimes
 # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
 set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
-set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload")
+set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload;FortranRuntime")
 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
 if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
diff --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
index f7e1165bc4b947..f49ce19b3f845c 100644
--- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
+++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake
@@ -34,6 +34,8 @@ endfunction()
 
 
 # llvm_ExternalProject_Add(name source_dir ...
+#   ENABLE_FORTRAN
+#     External project requires the Flang compiler
 #   USE_TOOLCHAIN
 #     Use just-built tools (see TOOLCHAIN_TOOLS)
 #   EXCLUDE_FROM_ALL
@@ -61,7 +63,7 @@ endfunction()
 #   )
 function(llvm_ExternalProject_Add name source_dir)
   cmake_parse_arguments(ARG
-    "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
+    "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
     "SOURCE_DIR;FOLDER"
     "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"
     ${ARGN})
@@ -89,6 +91,9 @@ function(llvm_ExternalProject_Add name source_dir)
 
   if(NOT ARG_TOOLCHAIN_TOOLS)
     set(ARG_TOOLCHAIN_TOOLS clang)
+    if (ARG_ENABLE_FORTRAN)
+      list(APPEND ARG_TOOLCHAIN_TOOLS flang-new)
+    endif ()
     # AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
     if(NOT _cmake_system_name STREQUAL AIX)
       list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
@@ -139,6 +144,10 @@ function(llvm_ExternalProject_Add name source_dir)
     set(CLANG_IN_TOOLCHAIN On)
   endif()
 
+  if(flang-new IN_LIST TOOLCHAIN_TOOLS)
+    set(FLANG_IN_TOOLCHAIN On)
+  endif()
+
   if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)
     list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})
   endif()
@@ -221,6 +230,9 @@ function(llvm_ExternalProject_Add name source_dir)
                           -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX})
       endif()
     endif()
+    if(FLANG_IN_TOOLCHAIN)
+      list(APPEND compiler_args -DCMAKE_Fortran_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/flang-new${CMAKE_EXECUTABLE_SUFFIX})
+    endif()
     if(lld IN_LIST TOOLCHAIN_TOOLS)
       if(is_msvc_target)
         list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
@@ -304,6 +316,7 @@ function(llvm_ExternalProject_Add name source_dir)
     set(compiler_args -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER}
                       -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                       -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+                      -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER}
                       -DCMAKE_LINKER=${CMAKE_LINKER}
                       -DCMAKE_AR=${CMAKE_AR}
                       -DCMAKE_RANLIB=${CMAKE_RANLIB}
@@ -353,6 +366,7 @@ function(llvm_ExternalProject_Add name source_dir)
   if(ARG_TARGET_TRIPLE)
     list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
     list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
+    list(APPEND compiler_args -DCMAKE_Fortran_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
     list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
   endif()
 
diff --git a/llvm/projects/CMakeLists.txt b/llvm/projects/CMakeLists.txt
index 08f2fa522420b0..fab28c9df6d384 100644
--- a/llvm/projects/CMakeLists.txt
+++ b/llvm/projects/CMakeLists.txt
@@ -11,7 +11,8 @@ foreach(entry ${entries})
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/libunwind) AND
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/test-suite) AND
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/openmp) AND
-       (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/cross-project-tests))
+       (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/cross-project-tests) AND
+       (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/FortranRuntime))
       get_filename_component(entry_name "${entry}" NAME)
       add_llvm_external_project(${entry_name})
     endif()
@@ -37,6 +38,8 @@ if(${LLVM_BUILD_RUNTIME})
   if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
     add_llvm_external_project(compiler-rt)
   endif()
+
+  add_llvm_external_project(FortranRuntime)
 endif()
 
 add_llvm_external_project(dragonegg)
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 187c44fb9d04d2..e4389b120f49df 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -96,6 +96,7 @@ function(builtin_default_target compiler_rt_path)
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
                                       -DLLVM_CMAKE_DIR=${CMAKE_BINARY_DIR}
                                       -DCMAKE_C_COMPILER_WORKS=ON
+                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       ${COMMON_CMAKE_ARGS}
                                       ${BUILTINS_CMAKE_ARGS}
@@ -136,6 +137,7 @@ function(builtin_register_target compiler_rt_path name)
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
                                       -DLLVM_CMAKE_DIR=${CMAKE_BINARY_DIR}
                                       -DCMAKE_C_COMPILER_WORKS=ON
+                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
                                       ${COMMON_CMAKE_ARGS}
@@ -261,6 +263,7 @@ function(runtime_default_target)
   llvm_ExternalProject_Add(runtimes
                            ${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes
                            DEPENDS ${ARG_DEPENDS}
+                           ${enable_fortran}
                            # Builtins were built separately above
                            CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off
                                       -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
@@ -270,6 +273,7 @@ function(runtime_default_target)
                                       -DLLVM_BUILD_TOOLS=${LLVM_BUILD_TOOLS}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_CXX_COMPILER_WORKS=ON
+                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       ${COMMON_CMAKE_ARGS}
                                       ${RUNTIMES_CMAKE_ARGS}
@@ -396,6 +400,7 @@ function(runtime_register_target name)
   llvm_ExternalProject_Add(runtimes-${name}
                            ${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes
                            DEPENDS ${ARG_DEPENDS}
+                           ${enable_fortran}
                            # Builtins were built separately above
                            CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=OFF
                                       -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
@@ -403,6 +408,7 @@ function(runtime_register_target name)
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
                                       -DCMAKE_C_COMPILER_WORKS=ON
                                       -DCMAKE_CXX_COMPILER_WORKS=ON
+                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
                                       -DLLVM_RUNTIMES_TARGET=${name}
@@ -462,10 +468,12 @@ if(build_runtimes)
   # together in a single CMake invocation.
   set(extra_deps "")
   set(extra_cmake_args "")
+  set(enable_fortran "")
 
   if(LLVM_INCLUDE_TESTS)
     foreach(dep FileCheck
                 clang
+                flang-new
                 count
                 lld
                 lli
@@ -502,18 +510,17 @@ if(build_runtimes)
     list(APPEND extra_cmake_args "-DCMAKE_PROGRAM_PATH=${CMAKE_PROGRAM_PATH}")
   endif()
 
+  # FIXME: Go away
   if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
-    if (${LLVM_TOOL_FLANG_BUILD})
-      message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang-new")
-      set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang-new")
-      set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
-      # TODO: This is a workaround until flang becomes a first-class project
-      # in llvm/CMakeList.txt.  Until then, this line ensures that flang-new is
-      # built before "openmp" is built as a runtime project.  Besides "flang-new"
-      # to build the compiler, we also need to add "module_files" to make sure
-      # that all .mod files are also properly build.
-      list(APPEND extra_deps "flang-new" "module_files")
-    endif()
+    #if (LLVM_TOOL_FLANG_BUILD AND "FortranRuntime" IN_LIST LLVM_ENABLE_PROJECTS)
+    #  message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang-new")
+    #  set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang-new${CMAKE_EXECUTABLE_SUFFIX}")
+    #  #TODO: set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
+    #  list(APPEND extra_deps "flang-new")
+    #endif()
+    if (LLVM_TOOL_FLANG_BUILD AND "FortranRuntime" IN_LIST LLVM_ENABLE_PROJECTS)
+      set(enable_fortran ENABLE_FORTRAN)
+    endif ()
     foreach(dep opt llvm-link llvm-extract clang clang-offload-packager)
       if(TARGET ${dep})
         list(APPEND extra_deps ${dep})
@@ -563,6 +570,9 @@ if(build_runtimes)
   if(LLVM_LIBC_FULL_BUILD)
     list(APPEND extra_cmake_args "-DLLVM_LIBC_FULL_BUILD=ON")
   endif()
+  if("FortranRuntime" IN_LIST LLVM_ENABLE_RUNTIMES)
+    set(enable_fortran ENABLE_FORTRAN)
+  endif ()
 
   if(NOT LLVM_RUNTIME_TARGETS)
     runtime_default_target(
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 830165c799c2ab..d77b4da6e00e34 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -23,7 +23,7 @@ list(INSERT CMAKE_MODULE_PATH 0
 
 # We order libraries to mirror roughly how they are layered, except that compiler-rt can depend
 # on libc++, so we put it after.
-set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload")
+set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload;FortranRuntime")
 set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc")
 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
@@ -49,6 +49,7 @@ function(runtime_register_component name)
   set_property(GLOBAL APPEND PROPERTY SUB_COMPONENTS ${name})
 endfunction()
 
+message("LLVM_BINARY_DIR: ${LLVM_BINARY_DIR}")
 find_package(LLVM PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
 find_package(Clang PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
 

>From 7c697c49dc220449676a6f641a7624106d1df709 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 27 Sep 2024 18:58:16 +0200
Subject: [PATCH 02/32] Cleanup + reduce patch size

---
 .../include/flang/Common/Fortran-consts.h     |   8 +-
 .../flang/Common/ISO_Fortran_binding.h        |   8 +-
 .../Common/ISO_Fortran_binding_wrapper.h      |   8 +-
 .../include/flang/Common/api-attrs.h          |   6 +-
 .../flang/Common/binary-floating-point.h      |   6 +-
 .../flang/Common/bit-population-count.h       |   2 +-
 .../include/flang/Common/constexpr-bitset.h   |   2 +-
 FortranRuntime/include/flang/Common/decimal.h |   6 +-
 .../include/flang/Common/enum-class.h         |   2 +-
 .../include/flang/Common/enum-set.h           |   2 +-
 .../include/flang/Common/fast-int-set.h       |   2 +-
 FortranRuntime/include/flang/Common/format.h  |   2 +-
 FortranRuntime/include/flang/Common/idioms.h  |   2 +-
 .../flang/Common/leading-zero-bit-count.h     |   2 +-
 .../include/flang/Common/optional.h           |   6 +-
 FortranRuntime/include/flang/Common/real.h    |   2 +-
 .../include/flang/Common/reference-wrapper.h  |   6 +-
 .../include/flang/Common/restorer.h           |   4 +-
 .../include/flang/Common/target-rounding.h    |   7 +-
 FortranRuntime/include/flang/Common/uint128.h |   4 +-
 FortranRuntime/include/flang/Common/variant.h |   6 +-
 FortranRuntime/include/flang/Common/visit.h   |   4 +-
 .../include/flang/Common/windows-include.h    |   2 +-
 .../include/flang/Runtime/CUDA/allocator.h    |   2 +-
 .../include/flang/Runtime/CUDA/descriptor.h   |   2 +-
 .../include/flang/Runtime/allocatable.h       |   2 +-
 .../flang/Runtime/allocator-registry.h        |   6 +-
 .../include/flang/Runtime/array-constructor.h |   6 +-
 FortranRuntime/include/flang/Runtime/assign.h |   2 +-
 .../include/flang/Runtime/c-or-cpp.h          |   2 +-
 .../include/flang/Runtime/character.h         |   2 +-
 .../include/flang/Runtime/command.h           |   2 +-
 .../include/flang/Runtime/cpp-type.h          |   2 +-
 .../include/flang/Runtime/derived-api.h       |   2 +-
 .../include/flang/Runtime/descriptor.h        |   2 +-
 .../include/flang/Runtime/entry-names.h       |   6 +-
 .../include/flang/Runtime/exceptions.h        |   2 +-
 .../include/flang/Runtime/execute.h           |   2 +-
 .../include/flang/Runtime/extensions.h        |   2 +-
 .../flang/Runtime/freestanding-tools.h        |   2 +-
 .../include/flang/Runtime/inquiry.h           |   2 +-
 FortranRuntime/include/flang/Runtime/io-api.h |   2 +-
 FortranRuntime/include/flang/Runtime/iostat.h |   2 +-
 FortranRuntime/include/flang/Runtime/main.h   |   2 +-
 .../include/flang/Runtime/matmul-transpose.h  |   2 +-
 FortranRuntime/include/flang/Runtime/matmul.h |   2 +-
 FortranRuntime/include/flang/Runtime/memory.h |   2 +-
 .../include/flang/Runtime/misc-intrinsic.h    |   2 +-
 .../include/flang/Runtime/numeric.h           |   2 +-
 .../include/flang/Runtime/pointer.h           |   2 +-
 FortranRuntime/include/flang/Runtime/ragged.h |   2 +-
 FortranRuntime/include/flang/Runtime/random.h |   5 +
 FortranRuntime/include/flang/Runtime/reduce.h |   2 +-
 .../include/flang/Runtime/reduction.h         |   2 +-
 FortranRuntime/include/flang/Runtime/stop.h   |   2 +-
 .../include/flang/Runtime/support.h           |   2 +-
 .../include/flang/Runtime/temporary-stack.h   |   2 +-
 .../include/flang/Runtime/time-intrinsic.h    |   2 +-
 .../include/flang/Runtime/transformational.h  |   2 +-
 .../include/flang/Runtime/type-code.h         |   4 +-
 .../include/flang/Testing/fp-testing.h        |   8 +-
 .../include/flang/Testing/testing.h           |   6 +-
 .../lib/Common/big-radix-floating-point.h     |  10 +-
 .../lib/Common/decimal-to-binary.cpp          |   4 +-
 FortranRuntime/lib/Runtime/CMakeLists.txt     |  20 -
 .../lib/Runtime/CUDA/CMakeLists.txt           |   2 +-
 FortranRuntime/lib/Runtime/CUDA/allocator.cpp |   2 +-
 .../lib/Runtime/Float128Math/CMakeLists.txt   |   2 +-
 .../lib/Runtime/Float128Math/math-entries.h   |   6 +-
 .../Float128Math/numeric-template-specs.h     |   2 +-
 .../lib/Runtime/ISO_Fortran_binding.cpp       |   2 +-
 FortranRuntime/lib/Runtime/ISO_Fortran_util.h |   4 +-
 FortranRuntime/lib/Runtime/allocatable.cpp    |   6 +-
 .../lib/Runtime/array-constructor.cpp         |   6 +-
 FortranRuntime/lib/Runtime/assign-impl.h      |   2 +-
 FortranRuntime/lib/Runtime/assign.cpp         |   2 +-
 FortranRuntime/lib/Runtime/buffer.h           |   4 +-
 FortranRuntime/lib/Runtime/character.cpp      |   4 +-
 FortranRuntime/lib/Runtime/command.cpp        |   2 +-
 .../lib/Runtime/complex-reduction.h           |   2 +-
 FortranRuntime/lib/Runtime/connection.h       |   8 +-
 FortranRuntime/lib/Runtime/copy.cpp           |   4 +-
 FortranRuntime/lib/Runtime/copy.h             |   2 +-
 FortranRuntime/lib/Runtime/derived-api.cpp    |   2 +-
 FortranRuntime/lib/Runtime/derived.cpp        |   2 +-
 FortranRuntime/lib/Runtime/derived.h          |   2 +-
 FortranRuntime/lib/Runtime/descriptor-io.h    |  10 +-
 FortranRuntime/lib/Runtime/descriptor.cpp     |   2 +-
 FortranRuntime/lib/Runtime/dot-product.cpp    |   6 +-
 FortranRuntime/lib/Runtime/edit-input.cpp     |   4 +-
 FortranRuntime/lib/Runtime/edit-input.h       |   4 +-
 FortranRuntime/lib/Runtime/edit-output.cpp    |   2 +-
 FortranRuntime/lib/Runtime/edit-output.h      |   6 +-
 FortranRuntime/lib/Runtime/emit-encoded.h     |   2 +-
 FortranRuntime/lib/Runtime/environment.h      |   4 +-
 FortranRuntime/lib/Runtime/execute.cpp        |   2 +-
 FortranRuntime/lib/Runtime/extensions.cpp     |   4 +-
 FortranRuntime/lib/Runtime/extrema.cpp        |   2 +-
 FortranRuntime/lib/Runtime/file.cpp           |   2 +-
 FortranRuntime/lib/Runtime/file.h             |   4 +-
 FortranRuntime/lib/Runtime/findloc.cpp        |   2 +-
 .../lib/Runtime/format-implementation.h       |   8 +-
 FortranRuntime/lib/Runtime/format.h           |   6 +-
 FortranRuntime/lib/Runtime/inquiry.cpp        |   2 +-
 FortranRuntime/lib/Runtime/internal-unit.cpp  |   2 +-
 FortranRuntime/lib/Runtime/internal-unit.h    |   6 +-
 FortranRuntime/lib/Runtime/io-api-common.h    |  12 +-
 FortranRuntime/lib/Runtime/io-api-minimal.cpp |   2 +-
 FortranRuntime/lib/Runtime/io-api.cpp         |   6 +-
 FortranRuntime/lib/Runtime/io-error.cpp       |   2 +-
 FortranRuntime/lib/Runtime/io-error.h         |   4 +-
 FortranRuntime/lib/Runtime/io-stmt.cpp        |   2 +-
 FortranRuntime/lib/Runtime/io-stmt.h          |   8 +-
 FortranRuntime/lib/Runtime/lock.h             |   2 +-
 .../lib/Runtime/matmul-transpose.cpp          |   4 +-
 FortranRuntime/lib/Runtime/matmul.cpp         |   4 +-
 FortranRuntime/lib/Runtime/memory.cpp         |   2 +-
 FortranRuntime/lib/Runtime/misc-intrinsic.cpp |   4 +-
 FortranRuntime/lib/Runtime/namelist.cpp       |   2 +-
 FortranRuntime/lib/Runtime/namelist.h         |   4 +-
 FortranRuntime/lib/Runtime/non-tbp-dio.h      |   2 +-
 .../lib/Runtime/numeric-templates.h           |   6 +-
 FortranRuntime/lib/Runtime/numeric.cpp        |   2 +-
 FortranRuntime/lib/Runtime/product.cpp        |   2 +-
 FortranRuntime/lib/Runtime/random-templates.h |   6 +-
 FortranRuntime/lib/Runtime/random.cpp         |   6 +-
 FortranRuntime/lib/Runtime/reduce.cpp         |   2 +-
 .../lib/Runtime/reduction-templates.h         |   6 +-
 FortranRuntime/lib/Runtime/reduction.cpp      |   2 +-
 FortranRuntime/lib/Runtime/stack.h            |   8 +-
 FortranRuntime/lib/Runtime/stat.cpp           |   2 +-
 FortranRuntime/lib/Runtime/stat.h             |   4 +-
 FortranRuntime/lib/Runtime/sum.cpp            |   2 +-
 FortranRuntime/lib/Runtime/support.cpp        |   2 +-
 .../lib/Runtime/temporary-stack.cpp           |   2 +-
 FortranRuntime/lib/Runtime/terminator.h       |   2 +-
 FortranRuntime/lib/Runtime/time-intrinsic.cpp |   4 +-
 FortranRuntime/lib/Runtime/tools.h            |   6 +-
 .../lib/Runtime/transformational.cpp          |   4 +-
 FortranRuntime/lib/Runtime/type-info.h        |   4 +-
 FortranRuntime/lib/Runtime/unit-map.h         |   6 +-
 FortranRuntime/lib/Runtime/unit.h             |  12 +-
 FortranRuntime/lib/Runtime/utf.h              |   2 +-
 FortranRuntime/lib/Testing/fp-testing.cpp     |   8 -
 .../unittests/Common/FastIntSetTest.cpp       |   2 +-
 .../Evaluate/ISO-Fortran-binding.cpp          |   2 +-
 FortranRuntime/unittests/Evaluate/reshape.cpp |   2 +-
 .../unittests/Runtime/AccessTest.cpp          |   2 +-
 .../unittests/Runtime/Allocatable.cpp         |   2 +-
 .../unittests/Runtime/ArrayConstructor.cpp    |   4 +-
 .../unittests/Runtime/CUDA/AllocatorCUF.cpp   |   4 +-
 .../unittests/Runtime/CharacterTest.cpp       |   2 +-
 .../unittests/Runtime/CommandTest.cpp         |   4 +-
 FortranRuntime/unittests/Runtime/Complex.cpp  |   2 +-
 .../unittests/Runtime/CrashHandlerFixture.h   |   6 +-
 FortranRuntime/unittests/Runtime/Derived.cpp  |   4 +-
 .../unittests/Runtime/ExternalIOTest.cpp      |   2 +-
 FortranRuntime/unittests/Runtime/Inquiry.cpp  |   4 +-
 .../unittests/Runtime/ListInputTest.cpp       |   2 +-
 FortranRuntime/unittests/Runtime/Matmul.cpp   |   4 +-
 .../unittests/Runtime/MatmulTranspose.cpp     |   4 +-
 .../unittests/Runtime/MiscIntrinsic.cpp       |   4 +-
 FortranRuntime/unittests/Runtime/Namelist.cpp |   2 +-
 FortranRuntime/unittests/Runtime/Numeric.cpp  |   2 +-
 FortranRuntime/unittests/Runtime/Pointer.cpp  |   4 +-
 FortranRuntime/unittests/Runtime/Random.cpp   |   2 +-
 .../unittests/Runtime/Reduction.cpp           |   4 +-
 .../unittests/Runtime/RuntimeCrashTest.cpp    |   4 +-
 FortranRuntime/unittests/Runtime/Stop.cpp     |   2 +-
 FortranRuntime/unittests/Runtime/Support.cpp  |   4 +-
 .../unittests/Runtime/TemporaryStack.cpp      |   4 +-
 FortranRuntime/unittests/Runtime/Time.cpp     |   2 +-
 .../unittests/Runtime/Transformational.cpp    |   4 +-
 FortranRuntime/unittests/Runtime/tools.h      |   4 +-
 flang/CMakeLists.txt                          |   2 +
 flang/include/flang/Evaluate/call.h           |   4 +-
 .../include/flang/Evaluate/characteristics.h  |   6 +-
 flang/include/flang/Evaluate/common.h         |  16 +-
 flang/include/flang/Evaluate/expression.h     |   4 +-
 flang/include/flang/Evaluate/intrinsics.h     |   2 +-
 flang/include/flang/Evaluate/shape.h          |   2 +-
 flang/include/flang/Evaluate/target.h         |   2 +-
 flang/include/flang/Evaluate/tools.h          |   4 +-
 flang/include/flang/Evaluate/traverse.h       |   2 +-
 flang/include/flang/Evaluate/type.h           |   4 +-
 flang/include/flang/Evaluate/variable.h       |   2 +-
 .../include/flang/Frontend/FrontendOptions.h  |   2 +-
 flang/include/flang/Lower/AbstractConverter.h |   2 +-
 flang/include/flang/Lower/Bridge.h            |   2 +-
 flang/include/flang/Lower/CallInterface.h     |   2 +-
 flang/include/flang/Lower/ConvertType.h       |   2 +-
 flang/include/flang/Lower/PFTBuilder.h        |   4 +-
 flang/include/flang/Lower/Support/Utils.h     |   2 +-
 flang/include/flang/Lower/SymbolMap.h         |   2 +-
 .../flang/Optimizer/Builder/FIRBuilder.h      |   2 +-
 .../Optimizer/Builder/PPCIntrinsicCall.h      |   2 +-
 .../Optimizer/Builder/Runtime/RTBuilder.h     |   2 +-
 flang/include/flang/Optimizer/Support/Utils.h |   2 +-
 flang/include/flang/Parser/dump-parse-tree.h  |   2 +-
 flang/include/flang/Parser/message.h          |   2 +-
 flang/include/flang/Parser/parse-state.h      |   2 +-
 flang/include/flang/Parser/parse-tree.h       |   2 +-
 flang/include/flang/Parser/parsing.h          |   2 +-
 flang/include/flang/Parser/user-state.h       |   2 +-
 flang/include/flang/Semantics/expression.h    |   4 +-
 .../flang/Semantics/runtime-type-info.h       |   2 +-
 flang/include/flang/Semantics/scope.h         |   4 +-
 flang/include/flang/Semantics/semantics.h     |   2 +-
 flang/include/flang/Semantics/symbol.h        |   4 +-
 flang/include/flang/Semantics/tools.h         |   2 +-
 flang/include/flang/Semantics/type.h          |   2 +-
 .../include/flang/Support/Fortran-features.h  |   2 +-
 flang/include/flang/Support/Fortran.h         |  16 +-
 flang/include/flang/Support/template.h        |   2 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   2 +-
 flang/lib/Common/CMakeLists.txt               |   8 -
 flang/lib/Evaluate/call.cpp                   |   2 +-
 flang/lib/Evaluate/characteristics.cpp        |   2 +-
 flang/lib/Evaluate/common.cpp                 |   1 -
 flang/lib/Evaluate/fold-implementation.h      |   6 +-
 flang/lib/Evaluate/formatting.cpp             |   2 +-
 flang/lib/Evaluate/intrinsics-library.cpp     |   2 +-
 flang/lib/Evaluate/intrinsics.cpp             |   2 +-
 flang/lib/Evaluate/real.cpp                   |   2 +-
 flang/lib/Evaluate/shape.cpp                  |   2 +-
 flang/lib/Evaluate/target.cpp                 |   2 +-
 flang/lib/Frontend/CompilerInstance.cpp       |   2 +-
 flang/lib/Frontend/CompilerInvocation.cpp     |   6 +-
 flang/lib/Frontend/FrontendActions.cpp        |   2 +-
 flang/lib/Lower/Bridge.cpp                    |   2 +-
 flang/lib/Lower/CallInterface.cpp             |   2 +-
 flang/lib/Lower/ConvertExpr.cpp               |   4 +-
 flang/lib/Lower/Mangler.cpp                   |   2 +-
 flang/lib/Optimizer/Builder/IntrinsicCall.cpp |   8 +-
 flang/lib/Optimizer/CodeGen/TypeConverter.cpp |   2 +-
 .../lib/Optimizer/Transforms/AddDebugInfo.cpp |   2 +-
 .../Transforms/AssumedRankOpConversion.cpp    |   2 +-
 .../Optimizer/Transforms/CufOpConversion.cpp  |   2 +-
 .../Transforms/ExternalNameConversion.cpp     |   2 +-
 .../Transforms/SimplifyIntrinsics.cpp         |   2 +-
 .../lib/Optimizer/Transforms/StackReclaim.cpp |   2 +-
 flang/lib/Parser/basic-parsers.h              |   4 +-
 flang/lib/Parser/parse-tree.cpp               |   2 +-
 flang/lib/Parser/prescan.h                    |   2 +-
 flang/lib/Parser/unparse.cpp                  |   4 +-
 flang/lib/Semantics/assignment.h              |   2 +-
 flang/lib/Semantics/check-case.cpp            |   4 +-
 flang/lib/Semantics/check-coarray.cpp         |   2 +-
 flang/lib/Semantics/check-cuda.cpp            |   2 +-
 flang/lib/Semantics/check-data.h              |   2 +-
 flang/lib/Semantics/check-do-forall.cpp       |   2 +-
 flang/lib/Semantics/check-return.cpp          |   2 +-
 flang/lib/Semantics/check-select-rank.cpp     |   2 +-
 flang/lib/Semantics/check-select-type.cpp     |   2 +-
 flang/lib/Semantics/check-stop.cpp            |   2 +-
 flang/lib/Semantics/data-to-inits.h           |   4 +-
 flang/lib/Semantics/expression.cpp            |   2 +-
 flang/lib/Semantics/pointer-assignment.cpp    |   2 +-
 flang/lib/Semantics/resolve-labels.cpp        |   2 +-
 flang/lib/Semantics/resolve-names-utils.cpp   |   6 +-
 flang/lib/Semantics/resolve-names.cpp         |   6 +-
 flang/lib/Semantics/rewrite-parse-tree.cpp    |   2 +-
 flang/lib/Semantics/semantics.cpp             |   2 +-
 flang/lib/Semantics/tools.cpp                 |   4 +-
 flang/lib/Support/Fortran-features.cpp        |   2 +-
 flang/lib/Support/big-radix-floating-point.h  | 396 ------------------
 flang/test/CMakeLists.txt                     |   1 -
 flang/tools/bbc/bbc.cpp                       |   8 +-
 flang/tools/f18-parse-demo/f18-parse-demo.cpp |   4 +-
 flang/unittests/Evaluate/expression.cpp       |   2 +-
 flang/unittests/Evaluate/folding.cpp          |   2 +-
 flang/unittests/Evaluate/intrinsics.cpp       |   2 +-
 flang/unittests/Evaluate/logical.cpp          |   2 +-
 flang/unittests/Evaluate/real.cpp             |   2 +-
 lld/COFF/MinGW.cpp                            |   1 -
 llvm/projects/CMakeLists.txt                  |   1 -
 llvm/runtimes/CMakeLists.txt                  |   7 -
 runtimes/CMakeLists.txt                       |   1 -
 278 files changed, 441 insertions(+), 897 deletions(-)
 delete mode 100644 flang/lib/Support/big-radix-floating-point.h

diff --git a/FortranRuntime/include/flang/Common/Fortran-consts.h b/FortranRuntime/include/flang/Common/Fortran-consts.h
index 3156c6c50c3b9a..eedcdae335c400 100644
--- a/FortranRuntime/include/flang/Common/Fortran-consts.h
+++ b/FortranRuntime/include/flang/Common/Fortran-consts.h
@@ -9,9 +9,6 @@
 #ifndef FORTRAN_COMMON_FORTRAN_CONSTS_H_
 #define FORTRAN_COMMON_FORTRAN_CONSTS_H_
 
-// Fortran language concepts that are used in many phases are defined
-// once here to avoid redundancy and needless translation.
-
 #include "flang/Common/enum-class.h"
 #include <cstdint>
 
@@ -21,7 +18,6 @@ namespace Fortran::common {
 ENUM_CLASS(TypeCategory, Integer, Real, Complex, Character, Logical, Derived)
 ENUM_CLASS(VectorElementCategory, Integer, Unsigned, Real)
 
-
 ENUM_CLASS(IoStmtKind, None, Backspace, Close, Endfile, Flush, Inquire, Open,
     Print, Read, Rewind, Wait, Write)
 
@@ -32,7 +28,6 @@ ENUM_CLASS(
 // Fortran arrays may have up to 15 dimensions (See Fortran 2018 section 5.4.6).
 static constexpr int maxRank{15};
 
-
 // Floating-point rounding modes; these are packed into a byte to save
 // room in the runtime's format processing context structure.  These
 // enumerators are defined with the corresponding values returned from
@@ -45,6 +40,5 @@ enum class RoundingMode : std::uint8_t {
   TiesAwayFromZero, // ROUND=COMPATIBLE, RC - ties round away from zero
 };
 
-
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_FORTRAN_CONSTS_H_
+#endif /* FORTRAN_COMMON_FORTRAN_CONSTS_H_ */
diff --git a/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h b/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
index 21247103bcc552..516355c01ec7d0 100644
--- a/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
+++ b/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
@@ -6,14 +6,14 @@
  *
  *===----------------------------------------------------------------------===*/
 
-#ifndef CFI_ISO_FORTRAN_BINDING_H_
-#define CFI_ISO_FORTRAN_BINDING_H_
+#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_
+#define FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_
 
 /* When this header is included into the compiler and runtime implementations,
  * it does so by means of a wrapper header that establishes namespaces and
  * a macro for extra function attributes (RT_API_ATTRS).
  */
-#ifndef FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
+#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_
 #include <stddef.h>
 #define FORTRAN_ISO_NAMESPACE_
 #endif
@@ -206,4 +206,4 @@ RT_API_ATTRS int CFI_setpointer(
 } // extern "C"
 #endif
 
-#endif /* CFI_ISO_FORTRAN_BINDING_H_ */
+#endif /* FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_ */
diff --git a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
index ee02f6f129732e..d1bc9be34859a4 100644
--- a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
+++ b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
@@ -6,8 +6,8 @@
  *
  *===----------------------------------------------------------------------===*/
 
-#ifndef FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
-#define FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
+#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_
+#define FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_
 
 /* A thin wrapper around flang/include/ISO_Fortran_binding.h
  * This header file must be included when ISO_Fortran_binding.h
@@ -22,7 +22,7 @@
 
 /* clang-format off */
 #include <stddef.h>
-#include "flang/Common/api-attrs.h"
+#include "flang/Common/api-attrs.h" 
 #ifdef __cplusplus
 namespace Fortran {
 namespace ISO {
@@ -35,4 +35,4 @@ namespace ISO {
 #endif /* __cplusplus */
 /* clang-format on */
 
-#endif /* FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_ */
+#endif /* FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_ */
diff --git a/FortranRuntime/include/flang/Common/api-attrs.h b/FortranRuntime/include/flang/Common/api-attrs.h
index b56a3c8a047af6..9a3001fb255c11 100644
--- a/FortranRuntime/include/flang/Common/api-attrs.h
+++ b/FortranRuntime/include/flang/Common/api-attrs.h
@@ -12,8 +12,8 @@
  * declared/defined/used in Flang runtime library.
  */
 
-#ifndef FORTRAN_RUNTIME_API_ATTRS_H_
-#define FORTRAN_RUNTIME_API_ATTRS_H_
+#ifndef FORTRAN_COMMON_API_ATTRS_H_
+#define FORTRAN_COMMON_API_ATTRS_H_
 
 /*
  * RT_EXT_API_GROUP_BEGIN/END pair is placed around definitions
@@ -177,4 +177,4 @@
 #define RT_DEVICE_NOINLINE_HOST_INLINE inline
 #endif
 
-#endif /* !FORTRAN_RUNTIME_API_ATTRS_H_ */
+#endif /* FORTRAN_COMMON_API_ATTRS_H_ */
diff --git a/FortranRuntime/include/flang/Common/binary-floating-point.h b/FortranRuntime/include/flang/Common/binary-floating-point.h
index 1409b94192740c..705acc31bdfb21 100644
--- a/FortranRuntime/include/flang/Common/binary-floating-point.h
+++ b/FortranRuntime/include/flang/Common/binary-floating-point.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_DECIMAL_BINARY_FLOATING_POINT_H_
-#define FORTRAN_DECIMAL_BINARY_FLOATING_POINT_H_
+#ifndef FORTRAN_COMMON_BINARY_FLOATING_POINT_H_
+#define FORTRAN_COMMON_BINARY_FLOATING_POINT_H_
 
 // Access and manipulate the fields of an IEEE-754 binary
 // floating-point value via a generalized template.
@@ -208,4 +208,4 @@ template <int BINARY_PRECISION> class BinaryFloatingPointNumber {
   RawType raw_{0};
 };
 } // namespace Fortran::decimal
-#endif
+#endif /* FORTRAN_COMMON_BINARY_FLOATING_POINT_H_ */
diff --git a/FortranRuntime/include/flang/Common/bit-population-count.h b/FortranRuntime/include/flang/Common/bit-population-count.h
index e1aeb78f9a3765..59ade914d14d85 100644
--- a/FortranRuntime/include/flang/Common/bit-population-count.h
+++ b/FortranRuntime/include/flang/Common/bit-population-count.h
@@ -93,4 +93,4 @@ template <typename INT> inline constexpr int TrailingZeroBitCount(INT x) {
   }
 }
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_BIT_POPULATION_COUNT_H_
+#endif /* FORTRAN_COMMON_BIT_POPULATION_COUNT_H_ */
diff --git a/FortranRuntime/include/flang/Common/constexpr-bitset.h b/FortranRuntime/include/flang/Common/constexpr-bitset.h
index 1aafb6eff84c61..093b247b5f4eff 100644
--- a/FortranRuntime/include/flang/Common/constexpr-bitset.h
+++ b/FortranRuntime/include/flang/Common/constexpr-bitset.h
@@ -144,4 +144,4 @@ template <int BITS> class BitSet {
   Word bits_{0};
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_CONSTEXPR_BITSET_H_
+#endif /* FORTRAN_COMMON_CONSTEXPR_BITSET_H_ */
diff --git a/FortranRuntime/include/flang/Common/decimal.h b/FortranRuntime/include/flang/Common/decimal.h
index 2a75b98c112225..c086f97129f6a5 100644
--- a/FortranRuntime/include/flang/Common/decimal.h
+++ b/FortranRuntime/include/flang/Common/decimal.h
@@ -8,8 +8,8 @@
 
 /* C and C++ API for binary-to/from-decimal conversion package. */
 
-#ifndef FORTRAN_DECIMAL_DECIMAL_H_
-#define FORTRAN_DECIMAL_DECIMAL_H_
+#ifndef FORTRAN_COMMON_DECIMAL_H_
+#define FORTRAN_COMMON_DECIMAL_H_
 
 #include "flang/Common/api-attrs.h"
 #include <stddef.h>
@@ -136,4 +136,4 @@ RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToLongDouble(
 #ifdef __cplusplus
 } // extern "C"
 #endif
-#endif
+#endif /* FORTRAN_COMMON_DECIMAL_H_ */
diff --git a/FortranRuntime/include/flang/Common/enum-class.h b/FortranRuntime/include/flang/Common/enum-class.h
index 41575d45091a8d..787648ffec48e8 100644
--- a/FortranRuntime/include/flang/Common/enum-class.h
+++ b/FortranRuntime/include/flang/Common/enum-class.h
@@ -69,4 +69,4 @@ constexpr std::array<std::string_view, ITEMS> EnumNames(const char *p) {
   }
 
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_ENUM_CLASS_H_
+#endif /* FORTRAN_COMMON_ENUM_CLASS_H_ */
diff --git a/FortranRuntime/include/flang/Common/enum-set.h b/FortranRuntime/include/flang/Common/enum-set.h
index 5290b76debee88..6100fc5e2e31c5 100644
--- a/FortranRuntime/include/flang/Common/enum-set.h
+++ b/FortranRuntime/include/flang/Common/enum-set.h
@@ -228,4 +228,4 @@ struct std::hash<Fortran::common::EnumSet<ENUM, values>> {
     return std::hash(x.bitset());
   }
 };
-#endif // FORTRAN_COMMON_ENUM_SET_H_
+#endif /* FORTRAN_COMMON_ENUM_SET_H_ */
diff --git a/FortranRuntime/include/flang/Common/fast-int-set.h b/FortranRuntime/include/flang/Common/fast-int-set.h
index 48209a773c4cd1..323ee4dc7e94d9 100644
--- a/FortranRuntime/include/flang/Common/fast-int-set.h
+++ b/FortranRuntime/include/flang/Common/fast-int-set.h
@@ -103,4 +103,4 @@ template <int N> class FastIntSet {
   bool isFullyInitialized_{false}; // memory was cleared
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_FAST_INT_SET_H_
+#endif /* FORTRAN_COMMON_FAST_INT_SET_H_ */
diff --git a/FortranRuntime/include/flang/Common/format.h b/FortranRuntime/include/flang/Common/format.h
index 138e84b72b733d..6f4dfc8d2376b7 100644
--- a/FortranRuntime/include/flang/Common/format.h
+++ b/FortranRuntime/include/flang/Common/format.h
@@ -901,4 +901,4 @@ template <typename CHAR> bool FormatValidator<CHAR>::Check() {
 }
 
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_FORMAT_H_
+#endif /* FORTRAN_COMMON_FORMAT_H_ */
diff --git a/FortranRuntime/include/flang/Common/idioms.h b/FortranRuntime/include/flang/Common/idioms.h
index 99f383ec75b999..1ae0c0b35112e9 100644
--- a/FortranRuntime/include/flang/Common/idioms.h
+++ b/FortranRuntime/include/flang/Common/idioms.h
@@ -150,4 +150,4 @@ template <typename A, typename... B>
 using IfNoLvalue = std::enable_if_t<(... && !std::is_lvalue_reference_v<B>), A>;
 template <typename... RVREF> using NoLvalue = IfNoLvalue<void, RVREF...>;
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_IDIOMS_H_
+#endif /* FORTRAN_COMMON_IDIOMS_H_ */
diff --git a/FortranRuntime/include/flang/Common/leading-zero-bit-count.h b/FortranRuntime/include/flang/Common/leading-zero-bit-count.h
index a296e0b446917f..e788bfa9bcfd08 100644
--- a/FortranRuntime/include/flang/Common/leading-zero-bit-count.h
+++ b/FortranRuntime/include/flang/Common/leading-zero-bit-count.h
@@ -93,4 +93,4 @@ template <typename A> inline constexpr int BitsNeededFor(A x) {
   return 8 * sizeof x - LeadingZeroBitCount(x);
 }
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_
+#endif /* FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_ */
diff --git a/FortranRuntime/include/flang/Common/optional.h b/FortranRuntime/include/flang/Common/optional.h
index c0f4278009f40a..c3db3b1329a2fd 100644
--- a/FortranRuntime/include/flang/Common/optional.h
+++ b/FortranRuntime/include/flang/Common/optional.h
@@ -23,8 +23,8 @@
 //   * cuda:: namespace need to be forced for all std:: references.
 //
 //===----------------------------------------------------------------------===//
-#ifndef FORTRAN_COMMON_OPTIONAL_H
-#define FORTRAN_COMMON_OPTIONAL_H
+#ifndef FORTRAN_COMMON_OPTIONAL_H_
+#define FORTRAN_COMMON_OPTIONAL_H_
 
 #include "flang/Common/api-attrs.h"
 #include <optional>
@@ -240,4 +240,4 @@ using std::optional;
 
 } // namespace Fortran::common
 
-#endif // FORTRAN_COMMON_OPTIONAL_H
+#endif /* FORTRAN_COMMON_OPTIONAL_H_ */
diff --git a/FortranRuntime/include/flang/Common/real.h b/FortranRuntime/include/flang/Common/real.h
index b527deda0e3b4f..dc9a2404731e70 100644
--- a/FortranRuntime/include/flang/Common/real.h
+++ b/FortranRuntime/include/flang/Common/real.h
@@ -141,4 +141,4 @@ class RealCharacteristics {
 };
 
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_REAL_H_
+#endif /* FORTRAN_COMMON_REAL_H_ */
diff --git a/FortranRuntime/include/flang/Common/reference-wrapper.h b/FortranRuntime/include/flang/Common/reference-wrapper.h
index 2983754108f95a..6822fb335f398c 100644
--- a/FortranRuntime/include/flang/Common/reference-wrapper.h
+++ b/FortranRuntime/include/flang/Common/reference-wrapper.h
@@ -22,8 +22,8 @@
 //
 // clang-format on
 
-#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H
-#define FORTRAN_COMMON_REFERENCE_WRAPPER_H
+#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H_
+#define FORTRAN_COMMON_REFERENCE_WRAPPER_H_
 
 #include "flang/Common/api-attrs.h"
 #include <functional>
@@ -111,4 +111,4 @@ using std::reference_wrapper;
 
 } // namespace Fortran::common
 
-#endif // FORTRAN_COMMON_REFERENCE_WRAPPER_H
+#endif /* FORTRAN_COMMON_REFERENCE_WRAPPER_H_ */
diff --git a/FortranRuntime/include/flang/Common/restorer.h b/FortranRuntime/include/flang/Common/restorer.h
index 0f1bc48620d37e..a5c5ebe7344a1b 100644
--- a/FortranRuntime/include/flang/Common/restorer.h
+++ b/FortranRuntime/include/flang/Common/restorer.h
@@ -18,8 +18,8 @@
 
 #ifndef FORTRAN_COMMON_RESTORER_H_
 #define FORTRAN_COMMON_RESTORER_H_
-#include "idioms.h"
 #include "flang/Common/api-attrs.h"
+#include "idioms.h"
 namespace Fortran::common {
 template <typename A> class Restorer {
 public:
@@ -53,4 +53,4 @@ RT_API_ATTRS common::IfNoLvalue<Restorer<A>, B> ScopedSet(
   return Restorer<A>{to, std::move(original)};
 }
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_RESTORER_H_
+#endif /* FORTRAN_COMMON_RESTORER_H_ */
diff --git a/FortranRuntime/include/flang/Common/target-rounding.h b/FortranRuntime/include/flang/Common/target-rounding.h
index 970d8fb61fbd1b..c0c9f6c49b26a2 100644
--- a/FortranRuntime/include/flang/Common/target-rounding.h
+++ b/FortranRuntime/include/flang/Common/target-rounding.h
@@ -9,11 +9,9 @@
 #ifndef FORTRAN_COMMON_TARGET_ROUNDING_H_
 #define FORTRAN_COMMON_TARGET_ROUNDING_H_
 
-
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/enum-set.h"
 
-
 namespace Fortran::common {
 
 // Floating-point rounding control
@@ -30,11 +28,10 @@ struct Rounding {
 #endif
 };
 
-
 // These are ordered like the bits in a common fenv.h header file.
 ENUM_CLASS(RealFlag, InvalidArgument, Denorm, DivideByZero, Overflow, Underflow,
     Inexact)
 using RealFlags = common::EnumSet<RealFlag, RealFlag_enumSize>;
 
-}
-#endif // FORTRAN_COMMON_TARGET_ROUNDING_H_
+} // namespace Fortran::common
+#endif /* FORTRAN_COMMON_TARGET_ROUNDING_H_ */
diff --git a/FortranRuntime/include/flang/Common/uint128.h b/FortranRuntime/include/flang/Common/uint128.h
index 821c8c3b08a52f..1b2ee6a2c14b87 100644
--- a/FortranRuntime/include/flang/Common/uint128.h
+++ b/FortranRuntime/include/flang/Common/uint128.h
@@ -19,8 +19,8 @@
 #define AVOID_NATIVE_UINT128_T 0
 #endif
 
-#include "leading-zero-bit-count.h"
 #include "flang/Common/api-attrs.h"
+#include "leading-zero-bit-count.h"
 #include <cstdint>
 #include <type_traits>
 
@@ -303,4 +303,4 @@ template <int BITS>
 using HostSignedIntType = typename HostSignedIntTypeHelper<BITS>::type;
 
 } // namespace Fortran::common
-#endif
+#endif /* FORTRAN_COMMON_UINT128_H_ */
diff --git a/FortranRuntime/include/flang/Common/variant.h b/FortranRuntime/include/flang/Common/variant.h
index 1af85876afac00..ff9b1aed4eba91 100644
--- a/FortranRuntime/include/flang/Common/variant.h
+++ b/FortranRuntime/include/flang/Common/variant.h
@@ -11,8 +11,8 @@
 // and the related names become available, though, they may correspond
 // to alternative definitions (e.g. from cuda::std namespace).
 
-#ifndef FORTRAN_COMMON_VARIANT_H
-#define FORTRAN_COMMON_VARIANT_H
+#ifndef FORTRAN_COMMON_VARIANT_H_
+#define FORTRAN_COMMON_VARIANT_H_
 
 #if RT_USE_LIBCUDACXX
 #include <cuda/std/variant>
@@ -27,4 +27,4 @@ using cuda::std::visit;
 #include <variant>
 #endif // !RT_USE_LIBCUDACXX
 
-#endif // FORTRAN_COMMON_VARIANT_H
+#endif /* FORTRAN_COMMON_VARIANT_H_ */
diff --git a/FortranRuntime/include/flang/Common/visit.h b/FortranRuntime/include/flang/Common/visit.h
index ad66297650b093..8030ac9be173c3 100644
--- a/FortranRuntime/include/flang/Common/visit.h
+++ b/FortranRuntime/include/flang/Common/visit.h
@@ -21,8 +21,8 @@
 #ifndef FORTRAN_COMMON_VISIT_H_
 #define FORTRAN_COMMON_VISIT_H_
 
-#include "variant.h"
 #include "flang/Common/api-attrs.h"
+#include "variant.h"
 #include <type_traits>
 
 namespace Fortran::common {
@@ -100,4 +100,4 @@ using Fortran::common::log2visit::visit;
 #endif
 
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_VISIT_H_
+#endif /* FORTRAN_COMMON_VISIT_H_ */
diff --git a/FortranRuntime/include/flang/Common/windows-include.h b/FortranRuntime/include/flang/Common/windows-include.h
index 75ef4974251ff9..bee79d4fceb3ba 100644
--- a/FortranRuntime/include/flang/Common/windows-include.h
+++ b/FortranRuntime/include/flang/Common/windows-include.h
@@ -22,4 +22,4 @@
 
 #endif // _WIN32
 
-#endif // FORTRAN_COMMON_WINDOWS_INCLUDE_H_
+#endif /* FORTRAN_COMMON_WINDOWS_INCLUDE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/CUDA/allocator.h b/FortranRuntime/include/flang/Runtime/CUDA/allocator.h
index 4527c9f18fa054..48185e8f34eaf6 100644
--- a/FortranRuntime/include/flang/Runtime/CUDA/allocator.h
+++ b/FortranRuntime/include/flang/Runtime/CUDA/allocator.h
@@ -43,4 +43,4 @@ void *CUFAllocUnified(std::size_t);
 void CUFFreeUnified(void *);
 
 } // namespace Fortran::runtime::cuda
-#endif // FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
+#endif /* FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h b/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
index d593989420420f..68ad0987d9aecd 100644
--- a/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
+++ b/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
@@ -27,4 +27,4 @@ void RTDECL(CUFFreeDesciptor)(
 
 } // extern "C"
 } // namespace Fortran::runtime::cuda
-#endif // FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_
+#endif /* FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/allocatable.h b/FortranRuntime/include/flang/Runtime/allocatable.h
index 58061d9862095e..d7f3910074a760 100644
--- a/FortranRuntime/include/flang/Runtime/allocatable.h
+++ b/FortranRuntime/include/flang/Runtime/allocatable.h
@@ -129,4 +129,4 @@ void RTDECL(AllocatableDeallocateNoFinal)(
     Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_ALLOCATABLE_H_
+#endif /* FORTRAN_RUNTIME_ALLOCATABLE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/allocator-registry.h b/FortranRuntime/include/flang/Runtime/allocator-registry.h
index 411cc68f58ec33..4e7d9bcedfb375 100644
--- a/FortranRuntime/include/flang/Runtime/allocator-registry.h
+++ b/FortranRuntime/include/flang/Runtime/allocator-registry.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_ALLOCATOR_H_
-#define FORTRAN_RUNTIME_ALLOCATOR_H_
+#ifndef FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_
+#define FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_
 
 #include "flang/Common/api-attrs.h"
 #include <cstdlib>
@@ -62,4 +62,4 @@ RT_OFFLOAD_VAR_GROUP_END
 
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_ALLOCATOR_H_
+#endif /* FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/array-constructor.h b/FortranRuntime/include/flang/Runtime/array-constructor.h
index 46fc0418c7991e..82367756f5dc79 100644
--- a/FortranRuntime/include/flang/Runtime/array-constructor.h
+++ b/FortranRuntime/include/flang/Runtime/array-constructor.h
@@ -9,8 +9,8 @@
 // External APIs to create temporary storage for array constructors when their
 // final extents or length parameters cannot be pre-computed.
 
-#ifndef FORTRAN_RUNTIME_ARRAYCONSTRUCTOR_H_
-#define FORTRAN_RUNTIME_ARRAYCONSTRUCTOR_H_
+#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
+#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
 
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/entry-names.h"
@@ -115,4 +115,4 @@ void RTDECL(PushArrayConstructorSimpleScalar)(
     ArrayConstructorVector &vector, void *from);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_ARRAYCONSTRUCTOR_H_
+#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/assign.h b/FortranRuntime/include/flang/Runtime/assign.h
index a1cc9eaf4355f6..55d15a5c046868 100644
--- a/FortranRuntime/include/flang/Runtime/assign.h
+++ b/FortranRuntime/include/flang/Runtime/assign.h
@@ -58,4 +58,4 @@ void RTDECL(AssignPolymorphic)(Descriptor &to, const Descriptor &from,
     const char *sourceFile = nullptr, int sourceLine = 0);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_ASSIGN_H_
+#endif /* FORTRAN_RUNTIME_ASSIGN_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/c-or-cpp.h b/FortranRuntime/include/flang/Runtime/c-or-cpp.h
index 8bac523907750c..3c0c0be643cbc3 100644
--- a/FortranRuntime/include/flang/Runtime/c-or-cpp.h
+++ b/FortranRuntime/include/flang/Runtime/c-or-cpp.h
@@ -28,4 +28,4 @@
 #define NORETURN IF_CPLUSPLUS([[noreturn]])
 #define NO_ARGUMENTS IF_NOT_CPLUSPLUS(void)
 
-#endif // FORTRAN_RUNTIME_C_OR_CPP_H_
+#endif /* FORTRAN_RUNTIME_C_OR_CPP_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/character.h b/FortranRuntime/include/flang/Runtime/character.h
index dd47686fe858fd..a842c30cd8120c 100644
--- a/FortranRuntime/include/flang/Runtime/character.h
+++ b/FortranRuntime/include/flang/Runtime/character.h
@@ -129,4 +129,4 @@ void RTDECL(Verify)(Descriptor &result, const Descriptor &string,
     const char *sourceFile = nullptr, int sourceLine = 0);
 }
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_CHARACTER_H_
+#endif /* FORTRAN_RUNTIME_CHARACTER_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/command.h b/FortranRuntime/include/flang/Runtime/command.h
index 7ab3f6442dcf92..2bbdfca7631163 100644
--- a/FortranRuntime/include/flang/Runtime/command.h
+++ b/FortranRuntime/include/flang/Runtime/command.h
@@ -62,4 +62,4 @@ std::int32_t RTNAME(GetCwd)(
 }
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_COMMAND_H_
+#endif /* FORTRAN_RUNTIME_COMMAND_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/cpp-type.h b/FortranRuntime/include/flang/Runtime/cpp-type.h
index 27b43de7d0f0f6..7de1ea4f45f224 100644
--- a/FortranRuntime/include/flang/Runtime/cpp-type.h
+++ b/FortranRuntime/include/flang/Runtime/cpp-type.h
@@ -110,4 +110,4 @@ template <> struct CppTypeForHelper<TypeCategory::Logical, 1> {
 };
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_CPP_TYPE_H_
+#endif /* FORTRAN_RUNTIME_CPP_TYPE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/derived-api.h b/FortranRuntime/include/flang/Runtime/derived-api.h
index 79aa7d82de8819..ca1681e974051c 100644
--- a/FortranRuntime/include/flang/Runtime/derived-api.h
+++ b/FortranRuntime/include/flang/Runtime/derived-api.h
@@ -63,4 +63,4 @@ bool RTDECL(ExtendsTypeOf)(const Descriptor &, const Descriptor &);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_DERIVED_API_H_
+#endif /* FORTRAN_RUNTIME_DERIVED_API_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/descriptor.h b/FortranRuntime/include/flang/Runtime/descriptor.h
index 2fe5b11200cf6d..867f4d4ee29ac0 100644
--- a/FortranRuntime/include/flang/Runtime/descriptor.h
+++ b/FortranRuntime/include/flang/Runtime/descriptor.h
@@ -492,4 +492,4 @@ class alignas(Descriptor) StaticDescriptor {
 };
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_DESCRIPTOR_H_
+#endif /* FORTRAN_RUNTIME_DESCRIPTOR_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/entry-names.h b/FortranRuntime/include/flang/Runtime/entry-names.h
index 52de2496d9421d..25134771bf9185 100644
--- a/FortranRuntime/include/flang/Runtime/entry-names.h
+++ b/FortranRuntime/include/flang/Runtime/entry-names.h
@@ -15,8 +15,8 @@
  * The value of REVISION should not be changed until/unless the API to the
  * runtime library must change in some way that breaks backward compatibility.
  */
-#ifndef FORTRAN_RUNTIME_ENTRY_NAMES_H
-#define FORTRAN_RUNTIME_ENTRY_NAMES_H
+#ifndef FORTRAN_RUNTIME_ENTRY_NAMES_H_
+#define FORTRAN_RUNTIME_ENTRY_NAMES_H_
 
 #include "flang/Common/api-attrs.h"
 
@@ -40,4 +40,4 @@
 #define RTNAME_STRING(name) RTNAME_STRINGIFY(RTNAME(name))
 #endif
 
-#endif /* !FORTRAN_RUNTIME_ENTRY_NAMES_H */
+#endif /* FORTRAN_RUNTIME_ENTRY_NAMES_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/exceptions.h b/FortranRuntime/include/flang/Runtime/exceptions.h
index 1fb74e14e54d30..f2c67325b34d92 100644
--- a/FortranRuntime/include/flang/Runtime/exceptions.h
+++ b/FortranRuntime/include/flang/Runtime/exceptions.h
@@ -26,4 +26,4 @@ std::uint32_t RTNAME(MapException)(std::uint32_t excepts);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_EXCEPTIONS_H_
+#endif /* FORTRAN_RUNTIME_EXCEPTIONS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/execute.h b/FortranRuntime/include/flang/Runtime/execute.h
index ba3e950ca92941..d1958a82594ffd 100644
--- a/FortranRuntime/include/flang/Runtime/execute.h
+++ b/FortranRuntime/include/flang/Runtime/execute.h
@@ -26,4 +26,4 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait = true,
 }
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_EXECUTE_H_
+#endif /* FORTRAN_RUNTIME_EXECUTE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/extensions.h b/FortranRuntime/include/flang/Runtime/extensions.h
index fef651f3b2eedb..f46ccdd7d9528d 100644
--- a/FortranRuntime/include/flang/Runtime/extensions.h
+++ b/FortranRuntime/include/flang/Runtime/extensions.h
@@ -52,4 +52,4 @@ std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name,
 #endif
 
 } // extern "C"
-#endif // FORTRAN_RUNTIME_EXTENSIONS_H_
+#endif /* FORTRAN_RUNTIME_EXTENSIONS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/freestanding-tools.h b/FortranRuntime/include/flang/Runtime/freestanding-tools.h
index e94cb0a6c938cd..8aeef54ba0af3d 100644
--- a/FortranRuntime/include/flang/Runtime/freestanding-tools.h
+++ b/FortranRuntime/include/flang/Runtime/freestanding-tools.h
@@ -215,4 +215,4 @@ using std::toupper;
 #endif // !STD_TOUPPER_UNSUPPORTED
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_
+#endif /* FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/inquiry.h b/FortranRuntime/include/flang/Runtime/inquiry.h
index 36ef929ed5b2f1..83b07cf2f31a47 100644
--- a/FortranRuntime/include/flang/Runtime/inquiry.h
+++ b/FortranRuntime/include/flang/Runtime/inquiry.h
@@ -40,4 +40,4 @@ void RTDECL(Ubound)(void *result, const Descriptor &array, int kind,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_INQUIRY_H_
+#endif /* FORTRAN_RUNTIME_INQUIRY_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/io-api.h b/FortranRuntime/include/flang/Runtime/io-api.h
index 328afc715a3f1e..367146a4925c53 100644
--- a/FortranRuntime/include/flang/Runtime/io-api.h
+++ b/FortranRuntime/include/flang/Runtime/io-api.h
@@ -369,4 +369,4 @@ enum Iostat IODECL(EndIoStatement)(Cookie);
 
 } // extern "C"
 } // namespace Fortran::runtime::io
-#endif
+#endif /* FORTRAN_RUNTIME_IO_API_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/iostat.h b/FortranRuntime/include/flang/Runtime/iostat.h
index 6ce7c82b424eb7..a5a2a560f05f8d 100644
--- a/FortranRuntime/include/flang/Runtime/iostat.h
+++ b/FortranRuntime/include/flang/Runtime/iostat.h
@@ -92,4 +92,4 @@ enum Iostat {
 RT_API_ATTRS const char *IostatErrorString(int);
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IOSTAT_H_
+#endif /* FORTRAN_RUNTIME_IOSTAT_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/main.h b/FortranRuntime/include/flang/Runtime/main.h
index 88232ea64fa6ab..98fcf1250d0ad6 100644
--- a/FortranRuntime/include/flang/Runtime/main.h
+++ b/FortranRuntime/include/flang/Runtime/main.h
@@ -20,4 +20,4 @@ void RTNAME(ProgramStart)(
 void RTNAME(ByteswapOption)(void); // -byteswapio
 FORTRAN_EXTERN_C_END
 
-#endif // FORTRAN_RUNTIME_MAIN_H_
+#endif /* FORTRAN_RUNTIME_MAIN_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/matmul-transpose.h b/FortranRuntime/include/flang/Runtime/matmul-transpose.h
index 2d79ca10e08958..077277fae2da86 100644
--- a/FortranRuntime/include/flang/Runtime/matmul-transpose.h
+++ b/FortranRuntime/include/flang/Runtime/matmul-transpose.h
@@ -46,4 +46,4 @@ void RTDECL(MatmulTransposeDirect)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_
+#endif /* FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/matmul.h b/FortranRuntime/include/flang/Runtime/matmul.h
index a72d4a06ee4594..cd375ac43d77f2 100644
--- a/FortranRuntime/include/flang/Runtime/matmul.h
+++ b/FortranRuntime/include/flang/Runtime/matmul.h
@@ -45,4 +45,4 @@ void RTDECL(MatmulDirect)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_MATMUL_H_
+#endif /* FORTRAN_RUNTIME_MATMUL_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/memory.h b/FortranRuntime/include/flang/Runtime/memory.h
index 98412a989f890b..84af4d7189c074 100644
--- a/FortranRuntime/include/flang/Runtime/memory.h
+++ b/FortranRuntime/include/flang/Runtime/memory.h
@@ -170,4 +170,4 @@ template <typename A> struct Allocator {
 };
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_MEMORY_H_
+#endif /* FORTRAN_RUNTIME_MEMORY_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/misc-intrinsic.h b/FortranRuntime/include/flang/Runtime/misc-intrinsic.h
index 3fb3aaed49c0fb..1d4163c2e1e751 100644
--- a/FortranRuntime/include/flang/Runtime/misc-intrinsic.h
+++ b/FortranRuntime/include/flang/Runtime/misc-intrinsic.h
@@ -28,4 +28,4 @@ void RTDECL(TransferSize)(Descriptor &result, const Descriptor &source,
     std::int64_t size);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_MISC_INTRINSIC_H_
+#endif /* FORTRAN_RUNTIME_MISC_INTRINSIC_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/numeric.h b/FortranRuntime/include/flang/Runtime/numeric.h
index 84a5a7cd7a361c..5fbab2e069b739 100644
--- a/FortranRuntime/include/flang/Runtime/numeric.h
+++ b/FortranRuntime/include/flang/Runtime/numeric.h
@@ -455,4 +455,4 @@ CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16k)(
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_NUMERIC_H_
+#endif /* FORTRAN_RUNTIME_NUMERIC_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/pointer.h b/FortranRuntime/include/flang/Runtime/pointer.h
index 704144f08114f2..b7322ad92bd583 100644
--- a/FortranRuntime/include/flang/Runtime/pointer.h
+++ b/FortranRuntime/include/flang/Runtime/pointer.h
@@ -122,4 +122,4 @@ RT_API_ATTRS bool ValidatePointerPayload(const ISO::CFI_cdesc_t &);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_POINTER_H_
+#endif /* FORTRAN_RUNTIME_POINTER_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/ragged.h b/FortranRuntime/include/flang/Runtime/ragged.h
index ff157ea16f081e..8574bc1fa110c8 100644
--- a/FortranRuntime/include/flang/Runtime/ragged.h
+++ b/FortranRuntime/include/flang/Runtime/ragged.h
@@ -57,4 +57,4 @@ void RTDECL(RaggedArrayDeallocate)(void *raggedArrayHeader);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_RAGGED_H_
+#endif /* FORTRAN_RUNTIME_RAGGED_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/random.h b/FortranRuntime/include/flang/Runtime/random.h
index 269297dff47dba..bb6dcb3873f21d 100644
--- a/FortranRuntime/include/flang/Runtime/random.h
+++ b/FortranRuntime/include/flang/Runtime/random.h
@@ -8,6 +8,9 @@
 
 // Intrinsic subroutines RANDOM_INIT, RANDOM_NUMBER, and RANDOM_SEED.
 
+#ifndef FORTRAN_RUNTIME_RANDOM_H_
+#define FORTRAN_RUNTIME_RANDOM_H_
+
 #include "flang/Runtime/entry-names.h"
 #include <cstdint>
 
@@ -35,3 +38,5 @@ void RTNAME(RandomSeed)(const Descriptor *size, const Descriptor *put,
 
 } // extern "C"
 } // namespace Fortran::runtime
+
+#endif /* FORTRAN_RUNTIME_RANDOM_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/reduce.h b/FortranRuntime/include/flang/Runtime/reduce.h
index 60f54c393b4bbd..ae2828f04bf7c0 100644
--- a/FortranRuntime/include/flang/Runtime/reduce.h
+++ b/FortranRuntime/include/flang/Runtime/reduce.h
@@ -435,4 +435,4 @@ void RTDECL(ReduceDerivedTypeDim)(Descriptor &result, const Descriptor &array,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_REDUCE_H_
+#endif /* FORTRAN_RUNTIME_REDUCE_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/reduction.h b/FortranRuntime/include/flang/Runtime/reduction.h
index 97986c12e8a10e..e00593fbc9f75e 100644
--- a/FortranRuntime/include/flang/Runtime/reduction.h
+++ b/FortranRuntime/include/flang/Runtime/reduction.h
@@ -444,4 +444,4 @@ bool RTDECL(DotProductLogical)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_REDUCTION_H_
+#endif /* FORTRAN_RUNTIME_REDUCTION_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/stop.h b/FortranRuntime/include/flang/Runtime/stop.h
index f7c4ffe7403e8e..9ba41343c6f964 100644
--- a/FortranRuntime/include/flang/Runtime/stop.h
+++ b/FortranRuntime/include/flang/Runtime/stop.h
@@ -37,4 +37,4 @@ NORETURN void RTNAME(ReportFatalUserError)(
 
 FORTRAN_EXTERN_C_END
 
-#endif // FORTRAN_RUNTIME_STOP_H_
+#endif /* FORTRAN_RUNTIME_STOP_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/support.h b/FortranRuntime/include/flang/Runtime/support.h
index 4a6d4357e87103..9c9b067a18f2e4 100644
--- a/FortranRuntime/include/flang/Runtime/support.h
+++ b/FortranRuntime/include/flang/Runtime/support.h
@@ -47,4 +47,4 @@ void RTDECL(CopyAndUpdateDescriptor)(Descriptor &to, const Descriptor &from,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_SUPPORT_H_
+#endif /* FORTRAN_RUNTIME_SUPPORT_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/temporary-stack.h b/FortranRuntime/include/flang/Runtime/temporary-stack.h
index 3c1a4ea11a4352..f83fab7b0ac811 100644
--- a/FortranRuntime/include/flang/Runtime/temporary-stack.h
+++ b/FortranRuntime/include/flang/Runtime/temporary-stack.h
@@ -64,4 +64,4 @@ void RTNAME(DestroyDescriptorStack)(void *opaquePtr);
 } // extern "C"
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_TEMPORARY_STACK_H_
+#endif /* FORTRAN_RUNTIME_TEMPORARY_STACK_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/time-intrinsic.h b/FortranRuntime/include/flang/Runtime/time-intrinsic.h
index 80490a17e45597..0e63fc6a4647a4 100644
--- a/FortranRuntime/include/flang/Runtime/time-intrinsic.h
+++ b/FortranRuntime/include/flang/Runtime/time-intrinsic.h
@@ -48,4 +48,4 @@ void RTNAME(Etime)(const Descriptor *values, const Descriptor *time,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_TIME_INTRINSIC_H_
+#endif /* FORTRAN_RUNTIME_TIME_INTRINSIC_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/transformational.h b/FortranRuntime/include/flang/Runtime/transformational.h
index a39b872f376a69..266dd9d7aebc24 100644
--- a/FortranRuntime/include/flang/Runtime/transformational.h
+++ b/FortranRuntime/include/flang/Runtime/transformational.h
@@ -154,4 +154,4 @@ void RTDECL(Unpack)(Descriptor &result, const Descriptor &vector,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_TRANSFORMATIONAL_H_
+#endif /* FORTRAN_RUNTIME_TRANSFORMATIONAL_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/type-code.h b/FortranRuntime/include/flang/Runtime/type-code.h
index 3c1b03dfaa1140..ec359f25dbdd12 100644
--- a/FortranRuntime/include/flang/Runtime/type-code.h
+++ b/FortranRuntime/include/flang/Runtime/type-code.h
@@ -10,8 +10,8 @@
 #define FORTRAN_RUNTIME_TYPE_CODE_H_
 
 #include "flang/Common/Fortran-consts.h"
-#include "flang/Common/optional.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/optional.h"
 #include <utility>
 
 namespace Fortran::runtime {
@@ -75,4 +75,4 @@ class TypeCode {
   ISO::CFI_type_t raw_{CFI_type_other};
 };
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_TYPE_CODE_H_
+#endif /* FORTRAN_RUNTIME_TYPE_CODE_H_ */
diff --git a/FortranRuntime/include/flang/Testing/fp-testing.h b/FortranRuntime/include/flang/Testing/fp-testing.h
index 16c6017e8529d5..e223d2ef7d1b8b 100644
--- a/FortranRuntime/include/flang/Testing/fp-testing.h
+++ b/FortranRuntime/include/flang/Testing/fp-testing.h
@@ -6,15 +6,15 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_TEST_EVALUATE_FP_TESTING_H_
-#define FORTRAN_TEST_EVALUATE_FP_TESTING_H_
+#ifndef FORTRAN_TESTING_FP_TESTING_H_
+#define FORTRAN_TESTING_FP_TESTING_H_
 
 #include "flang/Common/target-rounding.h"
 #include <fenv.h>
 
-using Fortran::common::RoundingMode;
 using Fortran::common::RealFlags;
 using Fortran::common::Rounding;
+using Fortran::common::RoundingMode;
 
 class ScopedHostFloatingPointEnvironment {
 public:
@@ -32,4 +32,4 @@ class ScopedHostFloatingPointEnvironment {
 #endif
 };
 
-#endif // FORTRAN_TEST_EVALUATE_FP_TESTING_H_
+#endif /* FORTRAN_TESTING_FP_TESTING_H_ */
diff --git a/FortranRuntime/include/flang/Testing/testing.h b/FortranRuntime/include/flang/Testing/testing.h
index d763109d62d373..404650c9a89f2c 100644
--- a/FortranRuntime/include/flang/Testing/testing.h
+++ b/FortranRuntime/include/flang/Testing/testing.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_EVALUATE_TESTING_H_
-#define FORTRAN_EVALUATE_TESTING_H_
+#ifndef FORTRAN_TESTING_TESTING_H_
+#define FORTRAN_TESTING_TESTING_H_
 
 #include <cinttypes>
 #include <string>
@@ -41,4 +41,4 @@ FailureDetailPrinter Match(const char *file, int line, const std::string &want,
 FailureDetailPrinter Compare(const char *file, int line, const char *xs,
     const char *rel, const char *ys, std::uint64_t x, std::uint64_t y);
 } // namespace testing
-#endif // FORTRAN_EVALUATE_TESTING_H_
+#endif /* FORTRAN_TESTING_TESTING_H_ */
diff --git a/FortranRuntime/lib/Common/big-radix-floating-point.h b/FortranRuntime/lib/Common/big-radix-floating-point.h
index 7b8fb03710a3d4..6d247f3796eea5 100644
--- a/FortranRuntime/lib/Common/big-radix-floating-point.h
+++ b/FortranRuntime/lib/Common/big-radix-floating-point.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
-#define FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
+#ifndef FORTRAN_COMMON_BIG_RADIX_FLOATING_POINT_H_
+#define FORTRAN_COMMON_BIG_RADIX_FLOATING_POINT_H_
 
 // This is a helper class for use in floating-point conversions between
 // binary and decimal representations.  It holds a multiple-precision
@@ -21,11 +21,11 @@
 // for conversions between binary and decimal representations; it is not
 // a general-purpose facility.
 
+#include "flang/Common/binary-floating-point.h"
 #include "flang/Common/bit-population-count.h"
+#include "flang/Common/decimal.h"
 #include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Common/uint128.h"
-#include "flang/Common/binary-floating-point.h"
-#include "flang/Common/decimal.h"
 #include <cinttypes>
 #include <limits>
 #include <type_traits>
@@ -393,4 +393,4 @@ template <int PREC, int LOG10RADIX = 16> class BigRadixFloatingPointNumber {
   enum FortranRounding rounding_ { RoundNearest };
 };
 } // namespace Fortran::decimal
-#endif
+#endif /* FORTRAN_COMMON_BIG_RADIX_FLOATING_POINT_H_ */
diff --git a/FortranRuntime/lib/Common/decimal-to-binary.cpp b/FortranRuntime/lib/Common/decimal-to-binary.cpp
index 0ef24d3bcfecfc..cbf1664e9c240d 100644
--- a/FortranRuntime/lib/Common/decimal-to-binary.cpp
+++ b/FortranRuntime/lib/Common/decimal-to-binary.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "big-radix-floating-point.h"
-#include "flang/Common/bit-population-count.h"
-#include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Common/binary-floating-point.h"
+#include "flang/Common/bit-population-count.h"
 #include "flang/Common/decimal.h"
+#include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include <cinttypes>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 3402dd5fe6af8f..9ccbc9ea78b0fc 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -139,21 +139,12 @@ set(supported_files
     "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h" 
     )
 
-
   set(private_headers "")
   file(GLOB_RECURSE private_headers 
     "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h" 
     "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h" 
     )
 
-
-
-
-
-
-
-
-
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
   )
@@ -170,17 +161,6 @@ if (f128_sources)
   list(APPEND sources ${f128_sources})
 endif()
 
-
-
-
-
-
-
-
-
-
-
-
 if (NOT DEFINED WIN32)
   add_fortranruntime_library(FortranRuntime STATIC
     ${sources}
diff --git a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
index f75b854d1eb3ba..81055b2737c0f1 100644
--- a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- lib/Runtime/CUDA/CMakeLists.txt -------------------------------------===#
+#===-- runtime/CUDA/CMakeLists.txt -----------------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
index 379f52b45057a0..2efd6bf0a95249 100644
--- a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
@@ -11,9 +11,9 @@
 #include "../stat.h"
 #include "../terminator.h"
 #include "../type-info.h"
-#include "flang/Support/Fortran.h"
 #include "flang/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocator-registry.h"
+#include "flang/Support/Fortran.h"
 
 #include "cuda_runtime.h"
 
diff --git a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
index 1ff158c401855f..a5f5bec1e7e4b8 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- lib/Runtime/Float128Math/CMakeLists.txt -----------------------------===#
+#===-- runtime/Float128Math/CMakeLists.txt ---------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
index 798efdfb1e120c..cb1e0130602260 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
@@ -8,10 +8,10 @@
 
 #ifndef FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
 #define FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/entry-names.h"
+#include "terminator.h"
+#include "tools.h"
 #include <cfloat>
 #include <cmath>
 #include <type_traits>
@@ -222,4 +222,4 @@ DEFINE_SIMPLE_ALIAS(Yn, ynl)
 
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
+#endif /* FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_ */
diff --git a/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h b/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
index ca9696e18f6a92..2a843df2d1d861 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
@@ -52,4 +52,4 @@ template <> struct SQRTTy<F128Type> {
 };
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
+#endif /* FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_ */
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
index d2fab4bbc30b4d..9711b2bcf49757 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
@@ -10,11 +10,11 @@
 // as specified in section 18.5.5 of Fortran 2018.
 
 #include "ISO_Fortran_util.h"
-#include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/pointer.h"
 #include "flang/Runtime/type-code.h"
+#include "terminator.h"
 #include <cstdlib>
 
 namespace Fortran::ISO {
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
index c45e8fc7a8d253..7ab280733028af 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
@@ -11,10 +11,10 @@
 
 // Internal utils for establishing CFI_cdesc_t descriptors.
 
-#include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
+#include "terminator.h"
 #include <cstdlib>
 
 namespace Fortran::ISO {
@@ -99,4 +99,4 @@ static inline RT_API_ATTRS void EstablishDescriptor(CFI_cdesc_t *descriptor,
   }
 }
 } // namespace Fortran::ISO
-#endif // FORTRAN_RUNTIME_ISO_FORTRAN_UTIL_H_
+#endif /* FORTRAN_RUNTIME_ISO_FORTRAN_UTIL_H_ */
diff --git a/FortranRuntime/lib/Runtime/allocatable.cpp b/FortranRuntime/lib/Runtime/allocatable.cpp
index e3b43a5f813935..8b6c1a4c1477eb 100644
--- a/FortranRuntime/lib/Runtime/allocatable.cpp
+++ b/FortranRuntime/lib/Runtime/allocatable.cpp
@@ -9,12 +9,12 @@
 #include "flang/Runtime/allocatable.h"
 #include "assign-impl.h"
 #include "derived.h"
-#include "stat.h"
-#include "terminator.h"
-#include "type-info.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
 #include "flang/Runtime/descriptor.h"
+#include "stat.h"
+#include "terminator.h"
+#include "type-info.h"
 
 namespace Fortran::runtime {
 extern "C" {
diff --git a/FortranRuntime/lib/Runtime/array-constructor.cpp b/FortranRuntime/lib/Runtime/array-constructor.cpp
index 287d054887abf0..db57d4fc4c3f68 100644
--- a/FortranRuntime/lib/Runtime/array-constructor.cpp
+++ b/FortranRuntime/lib/Runtime/array-constructor.cpp
@@ -8,12 +8,12 @@
 
 #include "flang/Runtime/array-constructor.h"
 #include "derived.h"
-#include "terminator.h"
-#include "tools.h"
-#include "type-info.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/assign.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
+#include "type-info.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/assign-impl.h b/FortranRuntime/lib/Runtime/assign-impl.h
index 6bc8ef78c38a90..d5538fab18b6b5 100644
--- a/FortranRuntime/lib/Runtime/assign-impl.h
+++ b/FortranRuntime/lib/Runtime/assign-impl.h
@@ -21,4 +21,4 @@ RT_API_ATTRS void DoFromSourceAssign(
     Descriptor &, const Descriptor &, Terminator &);
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_ASSIGN_IMPL_H_
+#endif /* FORTRAN_RUNTIME_ASSIGN_IMPL_H_ */
diff --git a/FortranRuntime/lib/Runtime/assign.cpp b/FortranRuntime/lib/Runtime/assign.cpp
index 7c5eb135d4cfdf..cc38e55e3a9e1e 100644
--- a/FortranRuntime/lib/Runtime/assign.cpp
+++ b/FortranRuntime/lib/Runtime/assign.cpp
@@ -9,11 +9,11 @@
 #include "flang/Runtime/assign.h"
 #include "assign-impl.h"
 #include "derived.h"
+#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/buffer.h b/FortranRuntime/lib/Runtime/buffer.h
index 24e43734552e99..dd3c19fa14392f 100644
--- a/FortranRuntime/lib/Runtime/buffer.h
+++ b/FortranRuntime/lib/Runtime/buffer.h
@@ -11,9 +11,9 @@
 #ifndef FORTRAN_RUNTIME_BUFFER_H_
 #define FORTRAN_RUNTIME_BUFFER_H_
 
-#include "io-error.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include "flang/Runtime/memory.h"
+#include "io-error.h"
 #include <algorithm>
 #include <cinttypes>
 #include <cstring>
@@ -221,4 +221,4 @@ template <typename STORE, std::size_t minBuffer = 65536> class FileFrame {
   bool dirty_{false};
 };
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_BUFFER_H_
+#endif /* FORTRAN_RUNTIME_BUFFER_H_ */
diff --git a/FortranRuntime/lib/Runtime/character.cpp b/FortranRuntime/lib/Runtime/character.cpp
index 73d3d93c5015f6..32fc010c6c04dd 100644
--- a/FortranRuntime/lib/Runtime/character.cpp
+++ b/FortranRuntime/lib/Runtime/character.cpp
@@ -7,13 +7,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/character.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include <algorithm>
 #include <cstring>
 
diff --git a/FortranRuntime/lib/Runtime/command.cpp b/FortranRuntime/lib/Runtime/command.cpp
index 50a084714e69a4..dc57758d4f7955 100644
--- a/FortranRuntime/lib/Runtime/command.cpp
+++ b/FortranRuntime/lib/Runtime/command.cpp
@@ -8,10 +8,10 @@
 
 #include "flang/Runtime/command.h"
 #include "environment.h"
+#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/descriptor.h"
 #include <cstdlib>
 #include <limits>
 
diff --git a/FortranRuntime/lib/Runtime/complex-reduction.h b/FortranRuntime/lib/Runtime/complex-reduction.h
index 1ca5b9a33c4640..e8e287215b7d97 100644
--- a/FortranRuntime/lib/Runtime/complex-reduction.h
+++ b/FortranRuntime/lib/Runtime/complex-reduction.h
@@ -155,4 +155,4 @@ void RTNAME(ReduceComplex16DimValue)(
     REDUCE_DIM_ARGS(CFloat128ComplexType, CFloat128ComplexType_value_op));
 #endif
 
-#endif // FORTRAN_RUNTIME_COMPLEX_REDUCTION_H_
+#endif /* FORTRAN_RUNTIME_COMPLEX_REDUCTION_H_ */
diff --git a/FortranRuntime/lib/Runtime/connection.h b/FortranRuntime/lib/Runtime/connection.h
index f74e94ff6fb4a3..92a3a9c3860a3e 100644
--- a/FortranRuntime/lib/Runtime/connection.h
+++ b/FortranRuntime/lib/Runtime/connection.h
@@ -8,11 +8,11 @@
 
 // Fortran I/O connection state (abstracted over internal & external units)
 
-#ifndef FORTRAN_RUNTIME_IO_CONNECTION_H_
-#define FORTRAN_RUNTIME_IO_CONNECTION_H_
+#ifndef FORTRAN_RUNTIME_CONNECTION_H_
+#define FORTRAN_RUNTIME_CONNECTION_H_
 
-#include "format.h"
 #include "flang/Common/optional.h"
+#include "format.h"
 #include <cinttypes>
 
 namespace Fortran::runtime::io {
@@ -124,4 +124,4 @@ class SavedPosition {
 };
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IO_CONNECTION_H_
+#endif /* FORTRAN_RUNTIME_CONNECTION_H_ */
diff --git a/FortranRuntime/lib/Runtime/copy.cpp b/FortranRuntime/lib/Runtime/copy.cpp
index 72a86e3b80a7d5..39c7da45172a43 100644
--- a/FortranRuntime/lib/Runtime/copy.cpp
+++ b/FortranRuntime/lib/Runtime/copy.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "copy.h"
+#include "flang/Runtime/allocatable.h"
+#include "flang/Runtime/descriptor.h"
 #include "stack.h"
 #include "terminator.h"
 #include "type-info.h"
-#include "flang/Runtime/allocatable.h"
-#include "flang/Runtime/descriptor.h"
 #include <cstring>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/copy.h b/FortranRuntime/lib/Runtime/copy.h
index 6d37b075e74504..f2c5b41718b71c 100644
--- a/FortranRuntime/lib/Runtime/copy.h
+++ b/FortranRuntime/lib/Runtime/copy.h
@@ -22,4 +22,4 @@ RT_API_ATTRS void CopyElement(const Descriptor &to, const SubscriptValue toAt[],
     const Descriptor &from, const SubscriptValue fromAt[], Terminator &);
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_COPY_H_
+#endif /* FORTRAN_RUNTIME_COPY_H_ */
diff --git a/FortranRuntime/lib/Runtime/derived-api.cpp b/FortranRuntime/lib/Runtime/derived-api.cpp
index 0bcdd45ddbbaec..4b68cdbbed7b2c 100644
--- a/FortranRuntime/lib/Runtime/derived-api.cpp
+++ b/FortranRuntime/lib/Runtime/derived-api.cpp
@@ -8,10 +8,10 @@
 
 #include "flang/Runtime/derived-api.h"
 #include "derived.h"
+#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/derived.cpp b/FortranRuntime/lib/Runtime/derived.cpp
index 04d765211db63b..52bf54d62c8599 100644
--- a/FortranRuntime/lib/Runtime/derived.cpp
+++ b/FortranRuntime/lib/Runtime/derived.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "derived.h"
+#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/derived.h b/FortranRuntime/lib/Runtime/derived.h
index 27c04c7cc56969..e03e657f01cee9 100644
--- a/FortranRuntime/lib/Runtime/derived.h
+++ b/FortranRuntime/lib/Runtime/derived.h
@@ -40,4 +40,4 @@ RT_API_ATTRS void Destroy(const Descriptor &, bool finalize,
 RT_API_ATTRS bool HasDynamicComponent(const Descriptor &);
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_DERIVED_H_
+#endif /* FORTRAN_RUNTIME_DERIVED_H_ */
diff --git a/FortranRuntime/lib/Runtime/descriptor-io.h b/FortranRuntime/lib/Runtime/descriptor-io.h
index 58cb091f852596..2ccad0cea70a29 100644
--- a/FortranRuntime/lib/Runtime/descriptor-io.h
+++ b/FortranRuntime/lib/Runtime/descriptor-io.h
@@ -16,15 +16,15 @@
 
 #include "edit-input.h"
 #include "edit-output.h"
+#include "flang/Common/optional.h"
+#include "flang/Common/uint128.h"
+#include "flang/Runtime/cpp-type.h"
+#include "flang/Runtime/descriptor.h"
 #include "io-stmt.h"
 #include "namelist.h"
 #include "terminator.h"
 #include "type-info.h"
 #include "unit.h"
-#include "flang/Common/optional.h"
-#include "flang/Common/uint128.h"
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime::io::descr {
 template <typename A>
@@ -608,4 +608,4 @@ static RT_API_ATTRS bool DescriptorIO(IoStatementState &io,
   return false;
 }
 } // namespace Fortran::runtime::io::descr
-#endif // FORTRAN_RUNTIME_DESCRIPTOR_IO_H_
+#endif /* FORTRAN_RUNTIME_DESCRIPTOR_IO_H_ */
diff --git a/FortranRuntime/lib/Runtime/descriptor.cpp b/FortranRuntime/lib/Runtime/descriptor.cpp
index f064fe3dcc32e9..6756134b06e7b1 100644
--- a/FortranRuntime/lib/Runtime/descriptor.cpp
+++ b/FortranRuntime/lib/Runtime/descriptor.cpp
@@ -9,12 +9,12 @@
 #include "flang/Runtime/descriptor.h"
 #include "ISO_Fortran_util.h"
 #include "derived.h"
+#include "flang/Runtime/allocator-registry.h"
 #include "memory.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
-#include "flang/Runtime/allocator-registry.h"
 #include <cassert>
 #include <cstdlib>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/dot-product.cpp b/FortranRuntime/lib/Runtime/dot-product.cpp
index 9eb22790e38a69..ab1cfa58ef3d02 100644
--- a/FortranRuntime/lib/Runtime/dot-product.cpp
+++ b/FortranRuntime/lib/Runtime/dot-product.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "float.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/reduction.h"
+#include "float.h"
+#include "terminator.h"
+#include "tools.h"
 #include <cfloat>
 #include <cinttypes>
 
diff --git a/FortranRuntime/lib/Runtime/edit-input.cpp b/FortranRuntime/lib/Runtime/edit-input.cpp
index 6ebb0e7aca4ade..eaa9d0d7e641e7 100644
--- a/FortranRuntime/lib/Runtime/edit-input.cpp
+++ b/FortranRuntime/lib/Runtime/edit-input.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "edit-input.h"
-#include "namelist.h"
-#include "utf.h"
 #include "flang/Common/optional.h"
 #include "flang/Common/real.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/freestanding-tools.h"
+#include "namelist.h"
+#include "utf.h"
 #include <algorithm>
 #include <cfenv>
 
diff --git a/FortranRuntime/lib/Runtime/edit-input.h b/FortranRuntime/lib/Runtime/edit-input.h
index 96dc3f561c22a7..2eda81a6d4e11d 100644
--- a/FortranRuntime/lib/Runtime/edit-input.h
+++ b/FortranRuntime/lib/Runtime/edit-input.h
@@ -9,9 +9,9 @@
 #ifndef FORTRAN_RUNTIME_EDIT_INPUT_H_
 #define FORTRAN_RUNTIME_EDIT_INPUT_H_
 
+#include "flang/Common/decimal.h"
 #include "format.h"
 #include "io-stmt.h"
-#include "flang/Common/decimal.h"
 
 namespace Fortran::runtime::io {
 
@@ -50,4 +50,4 @@ extern template RT_API_ATTRS bool EditCharacterInput(
     IoStatementState &, const DataEdit &, char32_t *, std::size_t);
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_EDIT_INPUT_H_
+#endif /* FORTRAN_RUNTIME_EDIT_INPUT_H_ */
diff --git a/FortranRuntime/lib/Runtime/edit-output.cpp b/FortranRuntime/lib/Runtime/edit-output.cpp
index ccaf8085f016fd..1fab7db6d3b187 100644
--- a/FortranRuntime/lib/Runtime/edit-output.cpp
+++ b/FortranRuntime/lib/Runtime/edit-output.cpp
@@ -8,9 +8,9 @@
 
 #include "edit-output.h"
 #include "emit-encoded.h"
-#include "utf.h"
 #include "flang/Common/real.h"
 #include "flang/Common/uint128.h"
+#include "utf.h"
 #include <algorithm>
 
 namespace Fortran::runtime::io {
diff --git a/FortranRuntime/lib/Runtime/edit-output.h b/FortranRuntime/lib/Runtime/edit-output.h
index 7f303020a83a84..cb25b68a35f05b 100644
--- a/FortranRuntime/lib/Runtime/edit-output.h
+++ b/FortranRuntime/lib/Runtime/edit-output.h
@@ -18,10 +18,10 @@
 // Drives the same fast binary-to-decimal formatting templates used
 // in the f18 front-end.
 
+#include "flang/Common/decimal.h"
+#include "flang/Common/uint128.h"
 #include "format.h"
 #include "io-stmt.h"
-#include "flang/Common/uint128.h"
-#include "flang/Common/decimal.h"
 
 namespace Fortran::runtime::io {
 
@@ -138,4 +138,4 @@ extern template class RealOutputEditing<10>;
 extern template class RealOutputEditing<16>;
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_EDIT_OUTPUT_H_
+#endif /* FORTRAN_RUNTIME_EDIT_OUTPUT_H_ */
diff --git a/FortranRuntime/lib/Runtime/emit-encoded.h b/FortranRuntime/lib/Runtime/emit-encoded.h
index f07fcced488435..11163a41720795 100644
--- a/FortranRuntime/lib/Runtime/emit-encoded.h
+++ b/FortranRuntime/lib/Runtime/emit-encoded.h
@@ -114,4 +114,4 @@ RT_API_ATTRS bool EmitRepeated(CONTEXT &to, char ch, std::size_t n) {
 }
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_EMIT_ENCODED_H_
+#endif /* FORTRAN_RUNTIME_EMIT_ENCODED_H_ */
diff --git a/FortranRuntime/lib/Runtime/environment.h b/FortranRuntime/lib/Runtime/environment.h
index 71526d2b85d74c..7d10b3a2b934bf 100644
--- a/FortranRuntime/lib/Runtime/environment.h
+++ b/FortranRuntime/lib/Runtime/environment.h
@@ -9,8 +9,8 @@
 #ifndef FORTRAN_RUNTIME_ENVIRONMENT_H_
 #define FORTRAN_RUNTIME_ENVIRONMENT_H_
 
-#include "flang/Common/optional.h"
 #include "flang/Common/decimal.h"
+#include "flang/Common/optional.h"
 
 struct EnvironmentDefaultList;
 
@@ -64,4 +64,4 @@ RT_OFFLOAD_VAR_GROUP_END
 
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_ENVIRONMENT_H_
+#endif /* FORTRAN_RUNTIME_ENVIRONMENT_H_ */
diff --git a/FortranRuntime/lib/Runtime/execute.cpp b/FortranRuntime/lib/Runtime/execute.cpp
index 77aac164242612..54f28d052873b4 100644
--- a/FortranRuntime/lib/Runtime/execute.cpp
+++ b/FortranRuntime/lib/Runtime/execute.cpp
@@ -8,10 +8,10 @@
 
 #include "flang/Runtime/execute.h"
 #include "environment.h"
+#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/descriptor.h"
 #include <cstdlib>
 #include <errno.h>
 #include <future>
diff --git a/FortranRuntime/lib/Runtime/extensions.cpp b/FortranRuntime/lib/Runtime/extensions.cpp
index e75fa75893a82b..94bfa3059e6b45 100644
--- a/FortranRuntime/lib/Runtime/extensions.cpp
+++ b/FortranRuntime/lib/Runtime/extensions.cpp
@@ -10,12 +10,12 @@
 // extensions that will eventually be implemented in Fortran.
 
 #include "flang/Runtime/extensions.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Runtime/command.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/entry-names.h"
 #include "flang/Runtime/io-api.h"
+#include "terminator.h"
+#include "tools.h"
 #include <chrono>
 #include <cstring>
 #include <ctime>
diff --git a/FortranRuntime/lib/Runtime/extrema.cpp b/FortranRuntime/lib/Runtime/extrema.cpp
index be9da63d7bd6b8..0809cb1d5f2ae2 100644
--- a/FortranRuntime/lib/Runtime/extrema.cpp
+++ b/FortranRuntime/lib/Runtime/extrema.cpp
@@ -10,10 +10,10 @@
 // and shapes and (for MAXLOC & MINLOC) result integer kinds.  Also implements
 // NORM2 using common infrastructure.
 
-#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/reduction.h"
+#include "reduction-templates.h"
 #include <algorithm>
 #include <cfloat>
 #include <cinttypes>
diff --git a/FortranRuntime/lib/Runtime/file.cpp b/FortranRuntime/lib/Runtime/file.cpp
index 44e3850cdfcb13..b82f1c63e397f9 100644
--- a/FortranRuntime/lib/Runtime/file.cpp
+++ b/FortranRuntime/lib/Runtime/file.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "file.h"
-#include "tools.h"
 #include "flang/Runtime/magic-numbers.h"
 #include "flang/Runtime/memory.h"
+#include "tools.h"
 #include <algorithm>
 #include <cerrno>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/file.h b/FortranRuntime/lib/Runtime/file.h
index 6890cb62d66652..66d62756634b24 100644
--- a/FortranRuntime/lib/Runtime/file.h
+++ b/FortranRuntime/lib/Runtime/file.h
@@ -11,9 +11,9 @@
 #ifndef FORTRAN_RUNTIME_FILE_H_
 #define FORTRAN_RUNTIME_FILE_H_
 
-#include "io-error.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/memory.h"
+#include "io-error.h"
 #include <cinttypes>
 
 namespace Fortran::runtime::io {
@@ -113,4 +113,4 @@ RT_API_ATTRS bool MayWrite(const char *path);
 RT_API_ATTRS bool MayReadAndWrite(const char *path);
 RT_API_ATTRS std::int64_t SizeInBytes(const char *path);
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_FILE_H_
+#endif /* FORTRAN_RUNTIME_FILE_H_ */
diff --git a/FortranRuntime/lib/Runtime/findloc.cpp b/FortranRuntime/lib/Runtime/findloc.cpp
index da5fe0c0a0a467..47c51fbcef4939 100644
--- a/FortranRuntime/lib/Runtime/findloc.cpp
+++ b/FortranRuntime/lib/Runtime/findloc.cpp
@@ -9,9 +9,9 @@
 // Implements FINDLOC for all required operand types and shapes and result
 // integer kinds.
 
-#include "reduction-templates.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/reduction.h"
+#include "reduction-templates.h"
 #include <cinttypes>
 #include <complex>
 
diff --git a/FortranRuntime/lib/Runtime/format-implementation.h b/FortranRuntime/lib/Runtime/format-implementation.h
index 2ed6006c3b2fa0..8d0d0f3376eafc 100644
--- a/FortranRuntime/lib/Runtime/format-implementation.h
+++ b/FortranRuntime/lib/Runtime/format-implementation.h
@@ -12,12 +12,12 @@
 #define FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_
 
 #include "emit-encoded.h"
+#include "flang/Common/decimal.h"
+#include "flang/Common/format.h"
+#include "flang/Runtime/main.h"
 #include "format.h"
 #include "io-stmt.h"
 #include "memory.h"
-#include "flang/Common/format.h"
-#include "flang/Common/decimal.h"
-#include "flang/Runtime/main.h"
 #include <algorithm>
 #include <cstring>
 #include <limits>
@@ -601,4 +601,4 @@ RT_API_ATTRS void FormatControl<CONTEXT>::Finish(Context &context) {
   }
 }
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_
+#endif /* FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_ */
diff --git a/FortranRuntime/lib/Runtime/format.h b/FortranRuntime/lib/Runtime/format.h
index b9c6979d1c2c98..3e0807ee452a7e 100644
--- a/FortranRuntime/lib/Runtime/format.h
+++ b/FortranRuntime/lib/Runtime/format.h
@@ -12,11 +12,11 @@
 #define FORTRAN_RUNTIME_FORMAT_H_
 
 #include "environment.h"
-#include "io-error.h"
 #include "flang/Common/Fortran-consts.h"
-#include "flang/Common/optional.h"
 #include "flang/Common/decimal.h"
+#include "flang/Common/optional.h"
 #include "flang/Runtime/freestanding-tools.h"
+#include "io-error.h"
 #include <cinttypes>
 
 namespace Fortran::runtime {
@@ -201,4 +201,4 @@ template <typename CONTEXT> class FormatControl {
   Iteration stack_[maxMaxHeight];
 };
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_FORMAT_H_
+#endif /* FORTRAN_RUNTIME_FORMAT_H_ */
diff --git a/FortranRuntime/lib/Runtime/inquiry.cpp b/FortranRuntime/lib/Runtime/inquiry.cpp
index 9a5ef0cea210db..172b46037d6c4b 100644
--- a/FortranRuntime/lib/Runtime/inquiry.cpp
+++ b/FortranRuntime/lib/Runtime/inquiry.cpp
@@ -11,9 +11,9 @@
 
 #include "flang/Runtime/inquiry.h"
 #include "copy.h"
+#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/descriptor.h"
 #include <algorithm>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/internal-unit.cpp b/FortranRuntime/lib/Runtime/internal-unit.cpp
index 95d371a49ac187..81b937ba63d4b8 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.cpp
+++ b/FortranRuntime/lib/Runtime/internal-unit.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "internal-unit.h"
-#include "io-error.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/freestanding-tools.h"
+#include "io-error.h"
 #include <algorithm>
 #include <type_traits>
 
diff --git a/FortranRuntime/lib/Runtime/internal-unit.h b/FortranRuntime/lib/Runtime/internal-unit.h
index 444bc9ab515994..c4107696810f2b 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.h
+++ b/FortranRuntime/lib/Runtime/internal-unit.h
@@ -8,8 +8,8 @@
 
 // Fortran internal I/O "units"
 
-#ifndef FORTRAN_RUNTIME_IO_INTERNAL_UNIT_H_
-#define FORTRAN_RUNTIME_IO_INTERNAL_UNIT_H_
+#ifndef FORTRAN_RUNTIME_INTERNAL_UNIT_H_
+#define FORTRAN_RUNTIME_INTERNAL_UNIT_H_
 
 #include "connection.h"
 #include "flang/Runtime/descriptor.h"
@@ -56,4 +56,4 @@ template <Direction DIR> class InternalDescriptorUnit : public ConnectionState {
 extern template class InternalDescriptorUnit<Direction::Output>;
 extern template class InternalDescriptorUnit<Direction::Input>;
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IO_INTERNAL_UNIT_H_
+#endif /* FORTRAN_RUNTIME_INTERNAL_UNIT_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-api-common.h b/FortranRuntime/lib/Runtime/io-api-common.h
index 9b4c3405b0991e..427666723501a2 100644
--- a/FortranRuntime/lib/Runtime/io-api-common.h
+++ b/FortranRuntime/lib/Runtime/io-api-common.h
@@ -6,15 +6,15 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANG_RUNTIME_IO_API_COMMON_H_
-#define FLANG_RUNTIME_IO_API_COMMON_H_
+#ifndef FORTRAN_RUNTIME_IO_API_COMMON_H_
+#define FORTRAN_RUNTIME_IO_API_COMMON_H_
 
-#include "io-stmt.h"
-#include "terminator.h"
-#include "unit.h"
 #include "flang/Common/api-attrs.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/io-api.h"
+#include "io-stmt.h"
+#include "terminator.h"
+#include "unit.h"
 
 namespace Fortran::runtime::io {
 
@@ -94,4 +94,4 @@ RT_API_ATTRS Cookie BeginExternalListIO(
 }
 
 } // namespace Fortran::runtime::io
-#endif // FLANG_RUNTIME_IO_API_COMMON_H_
+#endif /* FORTRAN_RUNTIME_IO_API_COMMON_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-api-minimal.cpp b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
index 6bc262cae78458..683694bd63c068 100644
--- a/FortranRuntime/lib/Runtime/io-api-minimal.cpp
+++ b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
@@ -10,13 +10,13 @@
 // list-directed output (PRINT *) of intrinsic types.
 
 #include "edit-output.h"
+#include "flang/Runtime/io-api.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
 #include "terminator.h"
 #include "tools.h"
 #include "unit.h"
-#include "flang/Runtime/io-api.h"
 
 namespace Fortran::runtime::io {
 RT_EXT_API_GROUP_BEGIN
diff --git a/FortranRuntime/lib/Runtime/io-api.cpp b/FortranRuntime/lib/Runtime/io-api.cpp
index f4a396d4c49a45..102ea26b359111 100644
--- a/FortranRuntime/lib/Runtime/io-api.cpp
+++ b/FortranRuntime/lib/Runtime/io-api.cpp
@@ -18,15 +18,15 @@
 #include "edit-input.h"
 #include "edit-output.h"
 #include "environment.h"
+#include "flang/Common/optional.h"
+#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
 #include "terminator.h"
 #include "tools.h"
 #include "unit.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/memory.h"
 #include <cstdlib>
 #include <memory>
 
diff --git a/FortranRuntime/lib/Runtime/io-error.cpp b/FortranRuntime/lib/Runtime/io-error.cpp
index 053667462058de..b14a30354d2347 100644
--- a/FortranRuntime/lib/Runtime/io-error.cpp
+++ b/FortranRuntime/lib/Runtime/io-error.cpp
@@ -8,8 +8,8 @@
 
 #include "io-error.h"
 #include "config.h"
-#include "tools.h"
 #include "flang/Runtime/magic-numbers.h"
+#include "tools.h"
 #include <cerrno>
 #include <cstdarg>
 #include <cstdio>
diff --git a/FortranRuntime/lib/Runtime/io-error.h b/FortranRuntime/lib/Runtime/io-error.h
index b03e07567a0607..7388a2134ed0d3 100644
--- a/FortranRuntime/lib/Runtime/io-error.h
+++ b/FortranRuntime/lib/Runtime/io-error.h
@@ -15,9 +15,9 @@
 #ifndef FORTRAN_RUNTIME_IO_ERROR_H_
 #define FORTRAN_RUNTIME_IO_ERROR_H_
 
-#include "terminator.h"
 #include "flang/Runtime/iostat.h"
 #include "flang/Runtime/memory.h"
+#include "terminator.h"
 #include <cinttypes>
 
 namespace Fortran::runtime::io {
@@ -78,4 +78,4 @@ class IoErrorHandler : public Terminator {
 };
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IO_ERROR_H_
+#endif /* FORTRAN_RUNTIME_IO_ERROR_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-stmt.cpp b/FortranRuntime/lib/Runtime/io-stmt.cpp
index 80c96710eb49ca..5be5d98ace0d8a 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.cpp
+++ b/FortranRuntime/lib/Runtime/io-stmt.cpp
@@ -9,11 +9,11 @@
 #include "io-stmt.h"
 #include "connection.h"
 #include "emit-encoded.h"
+#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "tools.h"
 #include "unit.h"
 #include "utf.h"
-#include "flang/Runtime/memory.h"
 #include <algorithm>
 #include <cstdio>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/io-stmt.h b/FortranRuntime/lib/Runtime/io-stmt.h
index e90e64c8fd1ff3..79a8b28c8aa19f 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.h
+++ b/FortranRuntime/lib/Runtime/io-stmt.h
@@ -13,14 +13,14 @@
 
 #include "connection.h"
 #include "file.h"
-#include "format.h"
-#include "internal-unit.h"
-#include "io-error.h"
 #include "flang/Common/optional.h"
 #include "flang/Common/reference-wrapper.h"
 #include "flang/Common/visit.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
+#include "format.h"
+#include "internal-unit.h"
+#include "io-error.h"
 #include <flang/Common/variant.h>
 #include <functional>
 #include <type_traits>
@@ -789,4 +789,4 @@ class ErroneousIoStatementState : public IoStatementBase {
 };
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IO_STMT_H_
+#endif /* FORTRAN_RUNTIME_IO_STMT_H_ */
diff --git a/FortranRuntime/lib/Runtime/lock.h b/FortranRuntime/lib/Runtime/lock.h
index 75c1adb12a8c62..69ff6403736dae 100644
--- a/FortranRuntime/lib/Runtime/lock.h
+++ b/FortranRuntime/lib/Runtime/lock.h
@@ -113,4 +113,4 @@ class CriticalSection {
 };
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_LOCK_H_
+#endif /* FORTRAN_RUNTIME_LOCK_H_ */
diff --git a/FortranRuntime/lib/Runtime/matmul-transpose.cpp b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
index d493333dfa9877..3b4b487daa335e 100644
--- a/FortranRuntime/lib/Runtime/matmul-transpose.cpp
+++ b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
@@ -21,12 +21,12 @@
 // to use the faster BLAS routines.
 
 #include "flang/Runtime/matmul-transpose.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/c-or-cpp.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include <cstring>
 
 namespace {
diff --git a/FortranRuntime/lib/Runtime/matmul.cpp b/FortranRuntime/lib/Runtime/matmul.cpp
index 124369e72886c5..62674316bc6a57 100644
--- a/FortranRuntime/lib/Runtime/matmul.cpp
+++ b/FortranRuntime/lib/Runtime/matmul.cpp
@@ -20,12 +20,12 @@
 // Places where BLAS routines could be called are marked as TODO items.
 
 #include "flang/Runtime/matmul.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/c-or-cpp.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include <cstring>
 
 namespace {
diff --git a/FortranRuntime/lib/Runtime/memory.cpp b/FortranRuntime/lib/Runtime/memory.cpp
index 4a811107ca220a..bf2c4cd4a35470 100644
--- a/FortranRuntime/lib/Runtime/memory.cpp
+++ b/FortranRuntime/lib/Runtime/memory.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/memory.h"
+#include "flang/Runtime/freestanding-tools.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/freestanding-tools.h"
 #include <cstdlib>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
index b942d762e76ab3..a0f41e4e3f156c 100644
--- a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/misc-intrinsic.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include <algorithm>
 #include <cstdio>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/namelist.cpp b/FortranRuntime/lib/Runtime/namelist.cpp
index e6229d56577568..1c8942fc375c43 100644
--- a/FortranRuntime/lib/Runtime/namelist.cpp
+++ b/FortranRuntime/lib/Runtime/namelist.cpp
@@ -9,8 +9,8 @@
 #include "namelist.h"
 #include "descriptor-io.h"
 #include "emit-encoded.h"
-#include "io-stmt.h"
 #include "flang/Runtime/io-api.h"
+#include "io-stmt.h"
 #include <algorithm>
 #include <cstring>
 #include <limits>
diff --git a/FortranRuntime/lib/Runtime/namelist.h b/FortranRuntime/lib/Runtime/namelist.h
index 4694b3104a9c75..2c4d331ae05e85 100644
--- a/FortranRuntime/lib/Runtime/namelist.h
+++ b/FortranRuntime/lib/Runtime/namelist.h
@@ -11,8 +11,8 @@
 #ifndef FORTRAN_RUNTIME_NAMELIST_H_
 #define FORTRAN_RUNTIME_NAMELIST_H_
 
-#include "non-tbp-dio.h"
 #include "flang/Common/api-attrs.h"
+#include "non-tbp-dio.h"
 
 #include <cstddef>
 
@@ -51,4 +51,4 @@ class NamelistGroup {
 RT_API_ATTRS bool IsNamelistNameOrSlash(IoStatementState &);
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_NAMELIST_H_
+#endif /* FORTRAN_RUNTIME_NAMELIST_H_ */
diff --git a/FortranRuntime/lib/Runtime/non-tbp-dio.h b/FortranRuntime/lib/Runtime/non-tbp-dio.h
index 0a45c96a3f2e25..426d5a92fd37d4 100644
--- a/FortranRuntime/lib/Runtime/non-tbp-dio.h
+++ b/FortranRuntime/lib/Runtime/non-tbp-dio.h
@@ -53,4 +53,4 @@ struct NonTbpDefinedIoTable {
 };
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_NON_TBP_DIO_H_
+#endif /* FORTRAN_RUNTIME_NON_TBP_DIO_H_ */
diff --git a/FortranRuntime/lib/Runtime/numeric-templates.h b/FortranRuntime/lib/Runtime/numeric-templates.h
index 640c6d17c4b580..f0045e8ee36e20 100644
--- a/FortranRuntime/lib/Runtime/numeric-templates.h
+++ b/FortranRuntime/lib/Runtime/numeric-templates.h
@@ -18,10 +18,10 @@
 #ifndef FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
 #define FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
 
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/api-attrs.h"
 #include "flang/Common/float128.h"
+#include "terminator.h"
+#include "tools.h"
 #include <cstdint>
 #include <limits>
 
@@ -465,4 +465,4 @@ template <typename T> inline RT_API_ATTRS T ErfcScaled(T arg) {
 
 } // namespace Fortran::runtime
 
-#endif // FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
+#endif /* FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/numeric.cpp b/FortranRuntime/lib/Runtime/numeric.cpp
index b0f68a7fc81d29..a3fcfeaa9ee266 100644
--- a/FortranRuntime/lib/Runtime/numeric.cpp
+++ b/FortranRuntime/lib/Runtime/numeric.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/numeric.h"
+#include "flang/Common/float128.h"
 #include "numeric-templates.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Common/float128.h"
 #include <cfloat>
 #include <climits>
 #include <cmath>
diff --git a/FortranRuntime/lib/Runtime/product.cpp b/FortranRuntime/lib/Runtime/product.cpp
index e4a6e81bd0c508..8c11bf4144919e 100644
--- a/FortranRuntime/lib/Runtime/product.cpp
+++ b/FortranRuntime/lib/Runtime/product.cpp
@@ -8,9 +8,9 @@
 
 // Implements PRODUCT for all required operand types and shapes.
 
-#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/reduction.h"
+#include "reduction-templates.h"
 #include <cfloat>
 #include <cinttypes>
 #include <complex>
diff --git a/FortranRuntime/lib/Runtime/random-templates.h b/FortranRuntime/lib/Runtime/random-templates.h
index 4faca63ba34b9d..801484225bc211 100644
--- a/FortranRuntime/lib/Runtime/random-templates.h
+++ b/FortranRuntime/lib/Runtime/random-templates.h
@@ -9,10 +9,10 @@
 #ifndef FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
 #define FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
 
-#include "lock.h"
-#include "numeric-templates.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/descriptor.h"
+#include "lock.h"
+#include "numeric-templates.h"
 #include <algorithm>
 #include <random>
 
@@ -85,4 +85,4 @@ inline void Generate(const Descriptor &harvest) {
 
 } // namespace Fortran::runtime::random
 
-#endif // FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
+#endif /* FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/random.cpp b/FortranRuntime/lib/Runtime/random.cpp
index 343b0a389fcaf6..8e1561960d48be 100644
--- a/FortranRuntime/lib/Runtime/random.cpp
+++ b/FortranRuntime/lib/Runtime/random.cpp
@@ -10,14 +10,14 @@
 // RANDOM_SEED.
 
 #include "flang/Runtime/random.h"
-#include "lock.h"
-#include "random-templates.h"
-#include "terminator.h"
 #include "flang/Common/float128.h"
 #include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "lock.h"
+#include "random-templates.h"
+#include "terminator.h"
 #include <cmath>
 #include <cstdint>
 #include <limits>
diff --git a/FortranRuntime/lib/Runtime/reduce.cpp b/FortranRuntime/lib/Runtime/reduce.cpp
index c3e7ef74363431..4d33c2a714e5af 100644
--- a/FortranRuntime/lib/Runtime/reduce.cpp
+++ b/FortranRuntime/lib/Runtime/reduce.cpp
@@ -9,10 +9,10 @@
 // REDUCE() implementation
 
 #include "flang/Runtime/reduce.h"
+#include "flang/Runtime/descriptor.h"
 #include "reduction-templates.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/reduction-templates.h b/FortranRuntime/lib/Runtime/reduction-templates.h
index ba193a9f0e3b9d..30ae641ba7b3ac 100644
--- a/FortranRuntime/lib/Runtime/reduction-templates.h
+++ b/FortranRuntime/lib/Runtime/reduction-templates.h
@@ -21,11 +21,11 @@
 #ifndef FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
 #define FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
 
+#include "flang/Runtime/cpp-type.h"
+#include "flang/Runtime/descriptor.h"
 #include "numeric-templates.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include <algorithm>
 
 namespace Fortran::runtime {
@@ -412,4 +412,4 @@ template <int KIND> struct Norm2Helper {
 };
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
+#endif /* FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/reduction.cpp b/FortranRuntime/lib/Runtime/reduction.cpp
index 0de7dd07b17a5b..f4e1f2aa6818d5 100644
--- a/FortranRuntime/lib/Runtime/reduction.cpp
+++ b/FortranRuntime/lib/Runtime/reduction.cpp
@@ -14,8 +14,8 @@
 // NORM2, MAXLOC, MINLOC, MAXVAL, and MINVAL are in extrema.cpp.
 
 #include "flang/Runtime/reduction.h"
-#include "reduction-templates.h"
 #include "flang/Runtime/descriptor.h"
+#include "reduction-templates.h"
 #include <cinttypes>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/stack.h b/FortranRuntime/lib/Runtime/stack.h
index 974ccb9d30b0eb..dc5b6101d3da0f 100644
--- a/FortranRuntime/lib/Runtime/stack.h
+++ b/FortranRuntime/lib/Runtime/stack.h
@@ -10,11 +10,11 @@
 // It is a list based stack with dynamic allocation/deallocation
 // of the list nodes.
 
-#ifndef FORTRAN_RUNTIME_STACK_H
-#define FORTRAN_RUNTIME_STACK_H
+#ifndef FORTRAN_RUNTIME_STACK_H_
+#define FORTRAN_RUNTIME_STACK_H_
 
-#include "terminator.h"
 #include "flang/Runtime/memory.h"
+#include "terminator.h"
 
 namespace Fortran::runtime {
 // Storage for the Stack elements of type T.
@@ -133,4 +133,4 @@ template <typename T, unsigned N = 0> class Stack : public StackStorage<T, N> {
   Terminator &terminator_;
 };
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_STACK_H
+#endif /* FORTRAN_RUNTIME_STACK_H_ */
diff --git a/FortranRuntime/lib/Runtime/stat.cpp b/FortranRuntime/lib/Runtime/stat.cpp
index d483f75998a746..01ae922e080865 100644
--- a/FortranRuntime/lib/Runtime/stat.cpp
+++ b/FortranRuntime/lib/Runtime/stat.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "stat.h"
+#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
-#include "flang/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 RT_OFFLOAD_API_GROUP_BEGIN
diff --git a/FortranRuntime/lib/Runtime/stat.h b/FortranRuntime/lib/Runtime/stat.h
index 9f56d88f588a1e..eccd69024d726b 100644
--- a/FortranRuntime/lib/Runtime/stat.h
+++ b/FortranRuntime/lib/Runtime/stat.h
@@ -11,8 +11,8 @@
 
 #ifndef FORTRAN_RUNTIME_STAT_H_
 #define FORTRAN_RUNTIME_STAT_H_
-#include "flang/Common/api-attrs.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/api-attrs.h"
 #include "flang/Runtime/magic-numbers.h"
 namespace Fortran::runtime {
 
@@ -60,4 +60,4 @@ RT_API_ATTRS int ToErrmsg(const Descriptor *errmsg, int stat); // returns stat
 RT_API_ATTRS int ReturnError(Terminator &, int stat,
     const Descriptor *errmsg = nullptr, bool hasStat = false);
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_STAT_H
+#endif /* FORTRAN_RUNTIME_STAT_H_ */
diff --git a/FortranRuntime/lib/Runtime/sum.cpp b/FortranRuntime/lib/Runtime/sum.cpp
index 64982b9fd53690..e33b77e20f0f11 100644
--- a/FortranRuntime/lib/Runtime/sum.cpp
+++ b/FortranRuntime/lib/Runtime/sum.cpp
@@ -12,9 +12,9 @@
 // cancellation on intermediate results by using "Kahan summation"
 // (basically the same as manual "double-double").
 
-#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/reduction.h"
+#include "reduction-templates.h"
 #include <cfloat>
 #include <cinttypes>
 #include <complex>
diff --git a/FortranRuntime/lib/Runtime/support.cpp b/FortranRuntime/lib/Runtime/support.cpp
index 1dffa99191bae1..0a39ff24b0cafc 100644
--- a/FortranRuntime/lib/Runtime/support.cpp
+++ b/FortranRuntime/lib/Runtime/support.cpp
@@ -8,8 +8,8 @@
 
 #include "flang/Runtime/support.h"
 #include "ISO_Fortran_util.h"
-#include "type-info.h"
 #include "flang/Runtime/descriptor.h"
+#include "type-info.h"
 
 namespace Fortran::runtime {
 extern "C" {
diff --git a/FortranRuntime/lib/Runtime/temporary-stack.cpp b/FortranRuntime/lib/Runtime/temporary-stack.cpp
index 12fa18586b7421..f944dfb7aa1471 100644
--- a/FortranRuntime/lib/Runtime/temporary-stack.cpp
+++ b/FortranRuntime/lib/Runtime/temporary-stack.cpp
@@ -10,11 +10,11 @@
 // temporaries. For use in HLFIR lowering.
 
 #include "flang/Runtime/temporary-stack.h"
-#include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/memory.h"
+#include "terminator.h"
 
 namespace {
 
diff --git a/FortranRuntime/lib/Runtime/terminator.h b/FortranRuntime/lib/Runtime/terminator.h
index 02b3a4c4f066f8..f475658b0eab3d 100644
--- a/FortranRuntime/lib/Runtime/terminator.h
+++ b/FortranRuntime/lib/Runtime/terminator.h
@@ -121,4 +121,4 @@ namespace Fortran::runtime::io {
 RT_API_ATTRS void FlushOutputOnCrash(const Terminator &);
 }
 
-#endif // FORTRAN_RUNTIME_TERMINATOR_H_
+#endif /* FORTRAN_RUNTIME_TERMINATOR_H_ */
diff --git a/FortranRuntime/lib/Runtime/time-intrinsic.cpp b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
index 05f7e4f80f18b6..4b362c90c52f25 100644
--- a/FortranRuntime/lib/Runtime/time-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
@@ -9,10 +9,10 @@
 // Implements time-related intrinsic subroutines.
 
 #include "flang/Runtime/time-intrinsic.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include <algorithm>
 #include <cstdint>
 #include <cstdio>
diff --git a/FortranRuntime/lib/Runtime/tools.h b/FortranRuntime/lib/Runtime/tools.h
index b57c7996135913..4058767ca283a9 100644
--- a/FortranRuntime/lib/Runtime/tools.h
+++ b/FortranRuntime/lib/Runtime/tools.h
@@ -9,13 +9,13 @@
 #ifndef FORTRAN_RUNTIME_TOOLS_H_
 #define FORTRAN_RUNTIME_TOOLS_H_
 
-#include "stat.h"
-#include "terminator.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include "flang/Runtime/memory.h"
+#include "stat.h"
+#include "terminator.h"
 #include <cstring>
 #include <functional>
 #include <map>
@@ -535,4 +535,4 @@ RT_API_ATTRS void CreatePartialReductionResult(Descriptor &result,
     const char *intrinsic, TypeCode);
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_TOOLS_H_
+#endif /* FORTRAN_RUNTIME_TOOLS_H_ */
diff --git a/FortranRuntime/lib/Runtime/transformational.cpp b/FortranRuntime/lib/Runtime/transformational.cpp
index 8c244fc296f3b9..66dc5bd4939bae 100644
--- a/FortranRuntime/lib/Runtime/transformational.cpp
+++ b/FortranRuntime/lib/Runtime/transformational.cpp
@@ -18,10 +18,10 @@
 
 #include "flang/Runtime/transformational.h"
 #include "copy.h"
-#include "terminator.h"
-#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/type-info.h b/FortranRuntime/lib/Runtime/type-info.h
index 28e7c4696613b3..ff3523bcb2b8eb 100644
--- a/FortranRuntime/lib/Runtime/type-info.h
+++ b/FortranRuntime/lib/Runtime/type-info.h
@@ -12,11 +12,11 @@
 // A C++ perspective of the derived type description schemata in
 // flang/module/__fortran_type_info.f90.
 
-#include "terminator.h"
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/descriptor.h"
+#include "terminator.h"
 #include <cinttypes>
 #include <memory>
 
@@ -321,4 +321,4 @@ class DerivedType {
 };
 
 } // namespace Fortran::runtime::typeInfo
-#endif // FORTRAN_RUNTIME_TYPE_INFO_H_
+#endif /* FORTRAN_RUNTIME_TYPE_INFO_H_ */
diff --git a/FortranRuntime/lib/Runtime/unit-map.h b/FortranRuntime/lib/Runtime/unit-map.h
index f9f0d34d4f0193..4e61246f9a2d86 100644
--- a/FortranRuntime/lib/Runtime/unit-map.h
+++ b/FortranRuntime/lib/Runtime/unit-map.h
@@ -12,10 +12,10 @@
 #ifndef FORTRAN_RUNTIME_UNIT_MAP_H_
 #define FORTRAN_RUNTIME_UNIT_MAP_H_
 
-#include "lock.h"
-#include "unit.h"
 #include "flang/Common/fast-int-set.h"
 #include "flang/Runtime/memory.h"
+#include "lock.h"
+#include "unit.h"
 #include <cstdint>
 #include <cstdlib>
 
@@ -100,4 +100,4 @@ class UnitMap {
   int emergencyNewUnit_{maxNewUnits_}; // not recycled
 };
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_UNIT_MAP_H_
+#endif /* FORTRAN_RUNTIME_UNIT_MAP_H_ */
diff --git a/FortranRuntime/lib/Runtime/unit.h b/FortranRuntime/lib/Runtime/unit.h
index 608f3a28ef687d..993fbf2977cebf 100644
--- a/FortranRuntime/lib/Runtime/unit.h
+++ b/FortranRuntime/lib/Runtime/unit.h
@@ -8,21 +8,21 @@
 
 // Fortran external I/O units
 
-#ifndef FORTRAN_RUNTIME_IO_UNIT_H_
-#define FORTRAN_RUNTIME_IO_UNIT_H_
+#ifndef FORTRAN_RUNTIME_UNIT_H_
+#define FORTRAN_RUNTIME_UNIT_H_
 
 #include "buffer.h"
 #include "connection.h"
 #include "environment.h"
 #include "file.h"
+#include "flang/Common/constexpr-bitset.h"
+#include "flang/Common/optional.h"
+#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "io-error.h"
 #include "io-stmt.h"
 #include "lock.h"
 #include "terminator.h"
-#include "flang/Common/constexpr-bitset.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/memory.h"
 #include <cstdlib>
 #include <cstring>
 #include <flang/Common/variant.h>
@@ -291,4 +291,4 @@ class ChildIo {
 };
 
 } // namespace Fortran::runtime::io
-#endif // FORTRAN_RUNTIME_IO_UNIT_H_
+#endif /* FORTRAN_RUNTIME_UNIT_H_ */
diff --git a/FortranRuntime/lib/Runtime/utf.h b/FortranRuntime/lib/Runtime/utf.h
index 5ba40437ea0c95..35c03fd4cdded5 100644
--- a/FortranRuntime/lib/Runtime/utf.h
+++ b/FortranRuntime/lib/Runtime/utf.h
@@ -70,4 +70,4 @@ RT_API_ATTRS Fortran::common::optional<char32_t> DecodeUTF8(const char *);
 RT_API_ATTRS std::size_t EncodeUTF8(char *, char32_t);
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_RUNTIME_UTF_H_
+#endif /* FORTRAN_RUNTIME_UTF_H_ */
diff --git a/FortranRuntime/lib/Testing/fp-testing.cpp b/FortranRuntime/lib/Testing/fp-testing.cpp
index 8541b1406334d3..3301d2d8efb15f 100644
--- a/FortranRuntime/lib/Testing/fp-testing.cpp
+++ b/FortranRuntime/lib/Testing/fp-testing.cpp
@@ -1,11 +1,3 @@
-//===-- lib/Testing/fp-testing.cpp ------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
 #include "flang/Testing/fp-testing.h"
 #include "llvm/Support/Errno.h"
 #include <cstdio>
diff --git a/FortranRuntime/unittests/Common/FastIntSetTest.cpp b/FortranRuntime/unittests/Common/FastIntSetTest.cpp
index f19359f4097ab8..a36a334e370eb9 100644
--- a/FortranRuntime/unittests/Common/FastIntSetTest.cpp
+++ b/FortranRuntime/unittests/Common/FastIntSetTest.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
 #include "flang/Common/fast-int-set.h"
+#include "gtest/gtest.h"
 #include <optional>
 
 TEST(FastIntSetTests, Sanity) {
diff --git a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
index 97d23ca90e5022..d2546e0c22d2d6 100644
--- a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
+++ b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Testing/testing.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor.h"
+#include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
 #include <type_traits>
 
diff --git a/FortranRuntime/unittests/Evaluate/reshape.cpp b/FortranRuntime/unittests/Evaluate/reshape.cpp
index 82caebe081fcd2..a93afd2a3c90cd 100644
--- a/FortranRuntime/unittests/Evaluate/reshape.cpp
+++ b/FortranRuntime/unittests/Evaluate/reshape.cpp
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Testing/testing.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/transformational.h"
+#include "flang/Testing/testing.h"
 #include <cinttypes>
 
 using namespace Fortran::common;
diff --git a/FortranRuntime/unittests/Runtime/AccessTest.cpp b/FortranRuntime/unittests/Runtime/AccessTest.cpp
index e72386cc9ac247..3e9feaf945b66d 100644
--- a/FortranRuntime/unittests/Runtime/AccessTest.cpp
+++ b/FortranRuntime/unittests/Runtime/AccessTest.cpp
@@ -10,9 +10,9 @@
 #ifndef _WIN32
 
 #include "CrashHandlerFixture.h"
-#include "gtest/gtest.h"
 #include "flang/Runtime/extensions.h"
 #include "llvm/ADT/Twine.h"
+#include "gtest/gtest.h"
 
 #include <fcntl.h>
 #include <sys/stat.h>
diff --git a/FortranRuntime/unittests/Runtime/Allocatable.cpp b/FortranRuntime/unittests/Runtime/Allocatable.cpp
index 8e10dc408ceae8..c01f85598d21ed 100644
--- a/FortranRuntime/unittests/Runtime/Allocatable.cpp
+++ b/FortranRuntime/unittests/Runtime/Allocatable.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/allocatable.h"
-#include "gtest/gtest.h"
 #include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
index 8c7fce3e4fb5f7..9011da304b6bc3 100644
--- a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
+++ b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/array-constructor.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 #include <memory>
 
diff --git a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
index 5bafb484236340..d2c1600af8c631 100644
--- a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
+++ b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
 #include "../../../runtime/terminator.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Runtime/CUDA/allocator.h"
 #include "flang/Runtime/CUDA/descriptor.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/allocator-registry.h"
+#include "flang/Support/Fortran.h"
+#include "gtest/gtest.h"
 
 #include "cuda_runtime.h"
 
diff --git a/FortranRuntime/unittests/Runtime/CharacterTest.cpp b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
index 710c1ca0eee817..8829f5e43265b0 100644
--- a/FortranRuntime/unittests/Runtime/CharacterTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
@@ -10,8 +10,8 @@
 // in Fortran.
 
 #include "flang/Runtime/character.h"
-#include "gtest/gtest.h"
 #include "flang/Runtime/descriptor.h"
+#include "gtest/gtest.h"
 #include <cstring>
 #include <functional>
 #include <tuple>
diff --git a/FortranRuntime/unittests/Runtime/CommandTest.cpp b/FortranRuntime/unittests/Runtime/CommandTest.cpp
index 03a31ceab8030b..aa79ce381ba8d0 100644
--- a/FortranRuntime/unittests/Runtime/CommandTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CommandTest.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/command.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/execute.h"
 #include "flang/Runtime/extensions.h"
 #include "flang/Runtime/main.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include <cstddef>
 #include <cstdlib>
 
diff --git a/FortranRuntime/unittests/Runtime/Complex.cpp b/FortranRuntime/unittests/Runtime/Complex.cpp
index daa4b5c7960842..d714da24dc4e58 100644
--- a/FortranRuntime/unittests/Runtime/Complex.cpp
+++ b/FortranRuntime/unittests/Runtime/Complex.cpp
@@ -1,4 +1,4 @@
-//===-- unittests/Runtime/Complex.cpp ---------------------------*- C++ -*-===//
+//===-- flang/unittests/Runtime/Complex.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
index af6d8e4cc7d525..46805775af0b39 100644
--- a/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
+++ b/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
@@ -10,12 +10,12 @@
 /// with expected message.
 //
 //===----------------------------------------------------------------------===//
-#ifndef LLVM_FLANG_UNITTESTS_RUNTIMEGTEST_CRASHHANDLERFIXTURE_H
-#define LLVM_FLANG_UNITTESTS_RUNTIMEGTEST_CRASHHANDLERFIXTURE_H
+#ifndef FORTRAN_UNITTESTS_RUNTIME_CRASHHANDLERFIXTURE_H_
+#define FORTRAN_UNITTESTS_RUNTIME_CRASHHANDLERFIXTURE_H_
 #include <gtest/gtest.h>
 
 struct CrashHandlerFixture : testing::Test {
   void SetUp();
 };
 
-#endif
+#endif /* FORTRAN_UNITTESTS_RUNTIME_CRASHHANDLERFIXTURE_H_ */
diff --git a/FortranRuntime/unittests/Runtime/Derived.cpp b/FortranRuntime/unittests/Runtime/Derived.cpp
index 8d5471e3e0bcf3..11b732fe10b790 100644
--- a/FortranRuntime/unittests/Runtime/Derived.cpp
+++ b/FortranRuntime/unittests/Runtime/Derived.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/derived-api.h"
 #include "flang/Runtime/descriptor.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
index 23c1e9992c101e..00c2fd76ce0c04 100644
--- a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
@@ -11,12 +11,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "gtest/gtest.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
 #include "flang/Runtime/main.h"
 #include "flang/Runtime/stop.h"
 #include "llvm/Support/raw_ostream.h"
+#include "gtest/gtest.h"
 #include <cstring>
 #include <string_view>
 
diff --git a/FortranRuntime/unittests/Runtime/Inquiry.cpp b/FortranRuntime/unittests/Runtime/Inquiry.cpp
index 39303b7c809002..204a97a1088ac0 100644
--- a/FortranRuntime/unittests/Runtime/Inquiry.cpp
+++ b/FortranRuntime/unittests/Runtime/Inquiry.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/inquiry.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/ListInputTest.cpp b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
index 472838c25841c9..4c30d6ed750141 100644
--- a/FortranRuntime/unittests/Runtime/ListInputTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "CrashHandlerFixture.h"
 #include "../../lib/Runtime/io-error.h"
+#include "CrashHandlerFixture.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
 
diff --git a/FortranRuntime/unittests/Runtime/Matmul.cpp b/FortranRuntime/unittests/Runtime/Matmul.cpp
index a37b618d3ab11a..cfa5d18cc36d33 100644
--- a/FortranRuntime/unittests/Runtime/Matmul.cpp
+++ b/FortranRuntime/unittests/Runtime/Matmul.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/matmul.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
index 3483d1896e8bf6..146c2283fb1aca 100644
--- a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
+++ b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/matmul-transpose.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
index 5672440c0e1b95..08229b5e48f0dd 100644
--- a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
+++ b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
@@ -6,12 +6,12 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime//misc-intrinsic.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/Namelist.cpp b/FortranRuntime/unittests/Runtime/Namelist.cpp
index 729f9ffa5c7c10..7b834dec49c3c4 100644
--- a/FortranRuntime/unittests/Runtime/Namelist.cpp
+++ b/FortranRuntime/unittests/Runtime/Namelist.cpp
@@ -8,9 +8,9 @@
 
 #include "../../lib/Runtime/namelist.h"
 #include "CrashHandlerFixture.h"
-#include "tools.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
+#include "tools.h"
 #include <algorithm>
 #include <cinttypes>
 #include <complex>
diff --git a/FortranRuntime/unittests/Runtime/Numeric.cpp b/FortranRuntime/unittests/Runtime/Numeric.cpp
index d15919b972bca7..fb595ae262c324 100644
--- a/FortranRuntime/unittests/Runtime/Numeric.cpp
+++ b/FortranRuntime/unittests/Runtime/Numeric.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/numeric.h"
-#include "gtest/gtest.h"
 #include "flang/Common/float128.h"
+#include "gtest/gtest.h"
 #include <cmath>
 #include <limits>
 
diff --git a/FortranRuntime/unittests/Runtime/Pointer.cpp b/FortranRuntime/unittests/Runtime/Pointer.cpp
index aa8545cdf951d1..a05bd70a64bb9f 100644
--- a/FortranRuntime/unittests/Runtime/Pointer.cpp
+++ b/FortranRuntime/unittests/Runtime/Pointer.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/pointer.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/descriptor.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/Random.cpp b/FortranRuntime/unittests/Runtime/Random.cpp
index c2300a478832ab..4e4b59cbcf40e7 100644
--- a/FortranRuntime/unittests/Runtime/Random.cpp
+++ b/FortranRuntime/unittests/Runtime/Random.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime//random.h"
-#include "gtest/gtest.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
+#include "gtest/gtest.h"
 #include <cmath>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/Reduction.cpp b/FortranRuntime/unittests/Runtime/Reduction.cpp
index e8b5ac878871fd..c35f6e2fa6a41b 100644
--- a/FortranRuntime/unittests/Runtime/Reduction.cpp
+++ b/FortranRuntime/unittests/Runtime/Reduction.cpp
@@ -7,14 +7,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/reduction.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/reduce.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 #include <cstdint>
 #include <cstring>
 #include <string>
diff --git a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
index 7ce1ee796d739b..61580a8d46792f 100644
--- a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
+++ b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
@@ -10,11 +10,11 @@
 /// runtime components and ensure the test fixture handles crashes as we expect.
 //
 //===----------------------------------------------------------------------===//
-#include "CrashHandlerFixture.h"
-#include "tools.h"
 #include "../../lib/Runtime/terminator.h"
+#include "CrashHandlerFixture.h"
 #include "flang/Runtime/io-api.h"
 #include "flang/Runtime/transformational.h"
+#include "tools.h"
 #include <gtest/gtest.h>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/Stop.cpp b/FortranRuntime/unittests/Runtime/Stop.cpp
index c12ec097068438..5fd8deaad21d6b 100644
--- a/FortranRuntime/unittests/Runtime/Stop.cpp
+++ b/FortranRuntime/unittests/Runtime/Stop.cpp
@@ -10,8 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 #include "flang/Runtime/stop.h"
-#include "CrashHandlerFixture.h"
 #include "../../lib/Runtime/environment.h"
+#include "CrashHandlerFixture.h"
 #include <cstdlib>
 #include <gtest/gtest.h>
 
diff --git a/FortranRuntime/unittests/Runtime/Support.cpp b/FortranRuntime/unittests/Runtime/Support.cpp
index b7aa39ef5523ba..38c0d6efaf9db7 100644
--- a/FortranRuntime/unittests/Runtime/Support.cpp
+++ b/FortranRuntime/unittests/Runtime/Support.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/support.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Runtime/descriptor.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
index 495c693b0493ef..63d99416ea64cb 100644
--- a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
+++ b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
@@ -6,14 +6,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/temporary-stack.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 #include <vector>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/Time.cpp b/FortranRuntime/unittests/Runtime/Time.cpp
index 548c0834e34a36..6fd00d669a9575 100644
--- a/FortranRuntime/unittests/Runtime/Time.cpp
+++ b/FortranRuntime/unittests/Runtime/Time.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "gtest/gtest.h"
 #include "flang/Runtime/time-intrinsic.h"
+#include "gtest/gtest.h"
 #include <algorithm>
 #include <cctype>
 #include <cerrno>
diff --git a/FortranRuntime/unittests/Runtime/Transformational.cpp b/FortranRuntime/unittests/Runtime/Transformational.cpp
index 2dcab5a2aa8974..b5a4e0e8e9588b 100644
--- a/FortranRuntime/unittests/Runtime/Transformational.cpp
+++ b/FortranRuntime/unittests/Runtime/Transformational.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/transformational.h"
-#include "gtest/gtest.h"
-#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/type-code.h"
+#include "tools.h"
+#include "gtest/gtest.h"
 #include <vector>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/tools.h b/FortranRuntime/unittests/Runtime/tools.h
index a8e2096a90572e..702103d225ab72 100644
--- a/FortranRuntime/unittests/Runtime/tools.h
+++ b/FortranRuntime/unittests/Runtime/tools.h
@@ -9,11 +9,11 @@
 #ifndef FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 #define FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 
-#include "gtest/gtest.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/type-code.h"
+#include "gtest/gtest.h"
 #include <cstdint>
 #include <cstring>
 #include <vector>
@@ -54,4 +54,4 @@ static OwningPtr<Descriptor> MakeArray(const std::vector<int> &shape,
 }
 
 } // namespace Fortran::runtime
-#endif // FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
+#endif /* FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_ */
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index 00e570798bb412..47517c5e7ab82f 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -160,6 +160,7 @@ if (FLANG_STANDALONE_BUILD)
 
   link_directories("${LLVM_LIBRARY_DIR}")
 
+  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
     ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
   set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
@@ -238,6 +239,7 @@ include_directories(SYSTEM ${CLANG_INCLUDE_DIR})
 
 # tco tool and FIR lib output directories
 if(FLANG_STANDALONE_BUILD)
+  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
   set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
 endif()
 # Always build tco tool
diff --git a/flang/include/flang/Evaluate/call.h b/flang/include/flang/Evaluate/call.h
index 8137185da61442..080f78c4e80fc0 100644
--- a/flang/include/flang/Evaluate/call.h
+++ b/flang/include/flang/Evaluate/call.h
@@ -13,11 +13,11 @@
 #include "constant.h"
 #include "formatting.h"
 #include "type.h"
+#include "flang/Parser/char-block.h"
+#include "flang/Semantics/attr.h"
 #include "flang/Support/Fortran.h"
 #include "flang/Support/indirection.h"
 #include "flang/Support/reference.h"
-#include "flang/Parser/char-block.h"
-#include "flang/Semantics/attr.h"
 #include <optional>
 #include <vector>
 
diff --git a/flang/include/flang/Evaluate/characteristics.h b/flang/include/flang/Evaluate/characteristics.h
index 8f1e6876d88d58..e40155fb287b62 100644
--- a/flang/include/flang/Evaluate/characteristics.h
+++ b/flang/include/flang/Evaluate/characteristics.h
@@ -18,13 +18,13 @@
 #include "shape.h"
 #include "tools.h"
 #include "type.h"
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include <optional>
 #include <string>
 #include <variant>
diff --git a/flang/include/flang/Evaluate/common.h b/flang/include/flang/Evaluate/common.h
index 69f09a930dc604..91d38748f5a575 100644
--- a/flang/include/flang/Evaluate/common.h
+++ b/flang/include/flang/Evaluate/common.h
@@ -9,17 +9,16 @@
 #ifndef FORTRAN_EVALUATE_COMMON_H_
 #define FORTRAN_EVALUATE_COMMON_H_
 
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/Fortran.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
-#include "flang/Common/Fortran-consts.h"
 #include "flang/Common/restorer.h"
+#include "flang/Common/target-rounding.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
-#include "flang/Common/target-rounding.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/indirection.h"
 #include <cinttypes>
 #include <map>
 #include <set>
@@ -34,10 +33,9 @@ class IntrinsicProcTable;
 class TargetCharacteristics;
 
 using common::ConstantSubscript;
-using common::RelationalOperator;
-using common::RoundingMode;
-using common::RealFlags;
 using common::RealFlag;
+using common::RealFlags;
+using common::RelationalOperator;
 
 // Integers are always ordered; reals may not be.
 ENUM_CLASS(Ordering, Less, Equal, Greater)
diff --git a/flang/include/flang/Evaluate/expression.h b/flang/include/flang/Evaluate/expression.h
index a582a2ea1a6989..20e8725f91d5e5 100644
--- a/flang/include/flang/Evaluate/expression.h
+++ b/flang/include/flang/Evaluate/expression.h
@@ -21,11 +21,11 @@
 #include "formatting.h"
 #include "type.h"
 #include "variable.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
+#include "flang/Parser/char-block.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Support/indirection.h"
 #include "flang/Support/template.h"
-#include "flang/Parser/char-block.h"
 #include <algorithm>
 #include <list>
 #include <tuple>
diff --git a/flang/include/flang/Evaluate/intrinsics.h b/flang/include/flang/Evaluate/intrinsics.h
index 17f555445f6f79..dbe1ba7fe7ec1b 100644
--- a/flang/include/flang/Evaluate/intrinsics.h
+++ b/flang/include/flang/Evaluate/intrinsics.h
@@ -12,9 +12,9 @@
 #include "call.h"
 #include "characteristics.h"
 #include "type.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
+#include "flang/Support/default-kinds.h"
 #include <memory>
 #include <optional>
 #include <string>
diff --git a/flang/include/flang/Evaluate/shape.h b/flang/include/flang/Evaluate/shape.h
index f3eeea7984bba7..8e8d89ffd8d108 100644
--- a/flang/include/flang/Evaluate/shape.h
+++ b/flang/include/flang/Evaluate/shape.h
@@ -15,8 +15,8 @@
 #include "expression.h"
 #include "traverse.h"
 #include "variable.h"
-#include "flang/Support/indirection.h"
 #include "flang/Evaluate/type.h"
+#include "flang/Support/indirection.h"
 #include <optional>
 #include <variant>
 
diff --git a/flang/include/flang/Evaluate/target.h b/flang/include/flang/Evaluate/target.h
index 8f52b29bec6654..11ac41a5deb69f 100644
--- a/flang/include/flang/Evaluate/target.h
+++ b/flang/include/flang/Evaluate/target.h
@@ -12,11 +12,11 @@
 #ifndef FORTRAN_EVALUATE_TARGET_H_
 #define FORTRAN_EVALUATE_TARGET_H_
 
-#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-class.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/target-rounding.h"
 #include "flang/Evaluate/common.h"
+#include "flang/Support/Fortran.h"
 #include <cstdint>
 
 namespace Fortran::evaluate {
diff --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h
index 29d19bff44c79c..9e1c25a3529380 100644
--- a/flang/include/flang/Evaluate/tools.h
+++ b/flang/include/flang/Evaluate/tools.h
@@ -11,8 +11,6 @@
 
 #include "traverse.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/template.h"
-#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/constant.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/shape.h"
@@ -21,6 +19,8 @@
 #include "flang/Semantics/attr.h"
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/template.h"
+#include "flang/Support/unwrap.h"
 #include <array>
 #include <optional>
 #include <set>
diff --git a/flang/include/flang/Evaluate/traverse.h b/flang/include/flang/Evaluate/traverse.h
index e04888f395c013..508d4ca76b30f6 100644
--- a/flang/include/flang/Evaluate/traverse.h
+++ b/flang/include/flang/Evaluate/traverse.h
@@ -38,9 +38,9 @@
 // expression of an ASSOCIATE (or related) construct entity.
 
 #include "expression.h"
-#include "flang/Support/indirection.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/type.h"
+#include "flang/Support/indirection.h"
 #include <set>
 #include <type_traits>
 
diff --git a/flang/include/flang/Evaluate/type.h b/flang/include/flang/Evaluate/type.h
index b68a5790c810fd..93311e3d2e5ae0 100644
--- a/flang/include/flang/Evaluate/type.h
+++ b/flang/include/flang/Evaluate/type.h
@@ -22,10 +22,10 @@
 #include "integer.h"
 #include "logical.h"
 #include "real.h"
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Common/real.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Support/template.h"
 #include <cinttypes>
 #include <optional>
diff --git a/flang/include/flang/Evaluate/variable.h b/flang/include/flang/Evaluate/variable.h
index 8d0da5b24277cd..161625b6887189 100644
--- a/flang/include/flang/Evaluate/variable.h
+++ b/flang/include/flang/Evaluate/variable.h
@@ -21,9 +21,9 @@
 #include "static-data.h"
 #include "type.h"
 #include "flang/Common/idioms.h"
+#include "flang/Parser/char-block.h"
 #include "flang/Support/reference.h"
 #include "flang/Support/template.h"
-#include "flang/Parser/char-block.h"
 #include <optional>
 #include <variant>
 #include <vector>
diff --git a/flang/include/flang/Frontend/FrontendOptions.h b/flang/include/flang/Frontend/FrontendOptions.h
index b69ffe83de1707..c436eb4cbac6f3 100644
--- a/flang/include/flang/Frontend/FrontendOptions.h
+++ b/flang/include/flang/Frontend/FrontendOptions.h
@@ -13,10 +13,10 @@
 #ifndef FORTRAN_FRONTEND_FRONTENDOPTIONS_H
 #define FORTRAN_FRONTEND_FRONTENDOPTIONS_H
 
-#include "flang/Support/Fortran-features.h"
 #include "flang/Lower/EnvironmentDefault.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/unparse.h"
+#include "flang/Support/Fortran-features.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include <cstdint>
diff --git a/flang/include/flang/Lower/AbstractConverter.h b/flang/include/flang/Lower/AbstractConverter.h
index 56646c196a7de5..6c8d77db2202b5 100644
--- a/flang/include/flang/Lower/AbstractConverter.h
+++ b/flang/include/flang/Lower/AbstractConverter.h
@@ -13,12 +13,12 @@
 #ifndef FORTRAN_LOWER_ABSTRACTCONVERTER_H
 #define FORTRAN_LOWER_ABSTRACTCONVERTER_H
 
-#include "flang/Support/Fortran.h"
 #include "flang/Lower/LoweringOptions.h"
 #include "flang/Lower/PFTDefs.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Dialect/FIRAttr.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/Builders.h"
 #include "mlir/IR/BuiltinOps.h"
 #include "mlir/IR/Operation.h"
diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h
index 0c2c7abc324952..f07207c5026ebd 100644
--- a/flang/include/flang/Lower/Bridge.h
+++ b/flang/include/flang/Lower/Bridge.h
@@ -13,13 +13,13 @@
 #ifndef FORTRAN_LOWER_BRIDGE_H
 #define FORTRAN_LOWER_BRIDGE_H
 
-#include "flang/Support/Fortran.h"
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Lower/EnvironmentDefault.h"
 #include "flang/Lower/LoweringOptions.h"
 #include "flang/Lower/StatementContext.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Dialect/Support/KindMapping.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/BuiltinOps.h"
 #include <set>
 
diff --git a/flang/include/flang/Lower/CallInterface.h b/flang/include/flang/Lower/CallInterface.h
index df01eafe679d7d..b16ad7a91afd0a 100644
--- a/flang/include/flang/Lower/CallInterface.h
+++ b/flang/include/flang/Lower/CallInterface.h
@@ -27,8 +27,8 @@
 #ifndef FORTRAN_LOWER_CALLINTERFACE_H
 #define FORTRAN_LOWER_CALLINTERFACE_H
 
-#include "flang/Support/reference.h"
 #include "flang/Evaluate/characteristics.h"
+#include "flang/Support/reference.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/BuiltinOps.h"
 #include <memory>
diff --git a/flang/include/flang/Lower/ConvertType.h b/flang/include/flang/Lower/ConvertType.h
index b889d2bb279de2..179a6825840464 100644
--- a/flang/include/flang/Lower/ConvertType.h
+++ b/flang/include/flang/Lower/ConvertType.h
@@ -21,8 +21,8 @@
 #ifndef FORTRAN_LOWER_CONVERT_TYPE_H
 #define FORTRAN_LOWER_CONVERT_TYPE_H
 
-#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/type.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/BuiltinTypes.h"
 
 namespace mlir {
diff --git a/flang/include/flang/Lower/PFTBuilder.h b/flang/include/flang/Lower/PFTBuilder.h
index 7ee61e630581fe..b2e0d776a228b1 100644
--- a/flang/include/flang/Lower/PFTBuilder.h
+++ b/flang/include/flang/Lower/PFTBuilder.h
@@ -17,8 +17,6 @@
 #ifndef FORTRAN_LOWER_PFTBUILDER_H
 #define FORTRAN_LOWER_PFTBUILDER_H
 
-#include "flang/Support/reference.h"
-#include "flang/Support/template.h"
 #include "flang/Lower/HostAssociations.h"
 #include "flang/Lower/PFTDefs.h"
 #include "flang/Parser/parse-tree.h"
@@ -26,6 +24,8 @@
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/reference.h"
+#include "flang/Support/template.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
 
diff --git a/flang/include/flang/Lower/Support/Utils.h b/flang/include/flang/Lower/Support/Utils.h
index a09cfb16f7805a..08a872b228691d 100644
--- a/flang/include/flang/Lower/Support/Utils.h
+++ b/flang/include/flang/Lower/Support/Utils.h
@@ -13,9 +13,9 @@
 #ifndef FORTRAN_LOWER_SUPPORT_UTILS_H
 #define FORTRAN_LOWER_SUPPORT_UTILS_H
 
-#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/indirection.h"
 #include "mlir/Dialect/Arith/IR/Arith.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/BuiltinAttributes.h"
diff --git a/flang/include/flang/Lower/SymbolMap.h b/flang/include/flang/Lower/SymbolMap.h
index 7bba02e41a3bdf..fb64db407708ad 100644
--- a/flang/include/flang/Lower/SymbolMap.h
+++ b/flang/include/flang/Lower/SymbolMap.h
@@ -13,12 +13,12 @@
 #ifndef FORTRAN_LOWER_SYMBOLMAP_H
 #define FORTRAN_LOWER_SYMBOLMAP_H
 
-#include "flang/Support/reference.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Optimizer/Dialect/FortranVariableInterface.h"
 #include "flang/Optimizer/Support/Matcher.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/reference.h"
 #include "mlir/IR/Value.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
index 90279417b5c939..14c1d5033fab40 100644
--- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
@@ -16,12 +16,12 @@
 #ifndef FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H
 #define FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H
 
-#include "flang/Support/MathOptionsBase.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Dialect/FIROpsSupport.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Optimizer/Dialect/Support/FIRContext.h"
 #include "flang/Optimizer/Dialect/Support/KindMapping.h"
+#include "flang/Support/MathOptionsBase.h"
 #include "mlir/IR/Builders.h"
 #include "mlir/IR/BuiltinOps.h"
 #include "llvm/ADT/DenseMap.h"
diff --git a/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h b/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
index 26cf34188eb568..2a3e85988184b4 100644
--- a/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
+++ b/flang/include/flang/Optimizer/Builder/PPCIntrinsicCall.h
@@ -9,8 +9,8 @@
 #ifndef FORTRAN_LOWER_PPCINTRINSICCALL_H
 #define FORTRAN_LOWER_PPCINTRINSICCALL_H
 
-#include "flang/Support/static-multimap-view.h"
 #include "flang/Optimizer/Builder/IntrinsicCall.h"
+#include "flang/Support/static-multimap-view.h"
 #include "mlir/Dialect/Math/IR/Math.h"
 
 namespace fir {
diff --git a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
index 104e363e689857..e9fb177d311c01 100644
--- a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
@@ -17,12 +17,12 @@
 #ifndef FORTRAN_OPTIMIZER_BUILDER_RUNTIME_RTBUILDER_H
 #define FORTRAN_OPTIMIZER_BUILDER_RUNTIME_RTBUILDER_H
 
-#include "flang/Support/Fortran.h"
 #include "flang/Common/uint128.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Runtime/reduce.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/BuiltinTypes.h"
 #include "mlir/IR/MLIRContext.h"
 #include "llvm/ADT/SmallVector.h"
diff --git a/flang/include/flang/Optimizer/Support/Utils.h b/flang/include/flang/Optimizer/Support/Utils.h
index 631322b34c49e5..88d38cb7574813 100644
--- a/flang/include/flang/Optimizer/Support/Utils.h
+++ b/flang/include/flang/Optimizer/Support/Utils.h
@@ -13,13 +13,13 @@
 #ifndef FORTRAN_OPTIMIZER_SUPPORT_UTILS_H
 #define FORTRAN_OPTIMIZER_SUPPORT_UTILS_H
 
-#include "flang/Support/default-kinds.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Optimizer/Support/FatalError.h"
+#include "flang/Support/default-kinds.h"
 #include "mlir/Dialect/Arith/IR/Arith.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/BuiltinAttributes.h"
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index f98ac17b6ecba7..30ea08806430a9 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -14,8 +14,8 @@
 #include "parse-tree.h"
 #include "tools.h"
 #include "unparse.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <string>
diff --git a/flang/include/flang/Parser/message.h b/flang/include/flang/Parser/message.h
index 70746bf551f2d7..c3d4a78c2c0023 100644
--- a/flang/include/flang/Parser/message.h
+++ b/flang/include/flang/Parser/message.h
@@ -16,8 +16,8 @@
 #include "char-set.h"
 #include "provenance.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/reference-counted.h"
 #include "flang/Common/restorer.h"
+#include "flang/Support/reference-counted.h"
 #include <cstddef>
 #include <cstring>
 #include <forward_list>
diff --git a/flang/include/flang/Parser/parse-state.h b/flang/include/flang/Parser/parse-state.h
index 20d339aeeccccf..36d70b81b79236 100644
--- a/flang/include/flang/Parser/parse-state.h
+++ b/flang/include/flang/Parser/parse-state.h
@@ -16,11 +16,11 @@
 // and recovery during parsing!
 
 #include "user-state.h"
-#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/provenance.h"
+#include "flang/Support/Fortran-features.h"
 #include <cstddef>
 #include <cstring>
 #include <list>
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index a6d19dd6435966..de869f8200a261 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -22,8 +22,8 @@
 #include "format-specification.h"
 #include "message.h"
 #include "provenance.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
+#include "flang/Support/Fortran.h"
 #include "flang/Support/indirection.h"
 #include "llvm/Frontend/OpenACC/ACC.h.inc"
 #include "llvm/Frontend/OpenMP/OMPConstants.h"
diff --git a/flang/include/flang/Parser/parsing.h b/flang/include/flang/Parser/parsing.h
index b0de98737f536e..0e608cb220d2c5 100644
--- a/flang/include/flang/Parser/parsing.h
+++ b/flang/include/flang/Parser/parsing.h
@@ -14,8 +14,8 @@
 #include "message.h"
 #include "parse-tree.h"
 #include "provenance.h"
-#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/preprocessor.h"
+#include "flang/Support/Fortran-features.h"
 #include "llvm/Support/raw_ostream.h"
 #include <optional>
 #include <string>
diff --git a/flang/include/flang/Parser/user-state.h b/flang/include/flang/Parser/user-state.h
index fff651208e0e52..129f9fb8fee058 100644
--- a/flang/include/flang/Parser/user-state.h
+++ b/flang/include/flang/Parser/user-state.h
@@ -14,10 +14,10 @@
 // parse tree construction so as to avoid any need for representing
 // state in static data.
 
-#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/parse-tree.h"
+#include "flang/Support/Fortran-features.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
 #include <optional>
diff --git a/flang/include/flang/Semantics/expression.h b/flang/include/flang/Semantics/expression.h
index 77e26ffb834dd9..194cb746ff8a84 100644
--- a/flang/include/flang/Semantics/expression.h
+++ b/flang/include/flang/Semantics/expression.h
@@ -10,8 +10,6 @@
 #define FORTRAN_SEMANTICS_EXPRESSION_H_
 
 #include "semantics.h"
-#include "flang/Support/Fortran.h"
-#include "flang/Support/indirection.h"
 #include "flang/Common/restorer.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/characteristics.h"
@@ -24,6 +22,8 @@
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Parser/tools.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include <map>
 #include <optional>
 #include <type_traits>
diff --git a/flang/include/flang/Semantics/runtime-type-info.h b/flang/include/flang/Semantics/runtime-type-info.h
index 3f9f776797d782..94c50aab696816 100644
--- a/flang/include/flang/Semantics/runtime-type-info.h
+++ b/flang/include/flang/Semantics/runtime-type-info.h
@@ -14,8 +14,8 @@
 #ifndef FORTRAN_SEMANTICS_RUNTIME_TYPE_INFO_H_
 #define FORTRAN_SEMANTICS_RUNTIME_TYPE_INFO_H_
 
-#include "flang/Support/reference.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/reference.h"
 #include <map>
 #include <set>
 #include <string>
diff --git a/flang/include/flang/Semantics/scope.h b/flang/include/flang/Semantics/scope.h
index 8b416dcffb5245..72e8bab71b6c70 100644
--- a/flang/include/flang/Semantics/scope.h
+++ b/flang/include/flang/Semantics/scope.h
@@ -11,11 +11,11 @@
 
 #include "attr.h"
 #include "symbol.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/reference.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/provenance.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/reference.h"
 #include <list>
 #include <map>
 #include <optional>
diff --git a/flang/include/flang/Semantics/semantics.h b/flang/include/flang/Semantics/semantics.h
index 899d4afa016bff..abce30f725d972 100644
--- a/flang/include/flang/Semantics/semantics.h
+++ b/flang/include/flang/Semantics/semantics.h
@@ -11,12 +11,12 @@
 
 #include "scope.h"
 #include "symbol.h"
-#include "flang/Support/Fortran-features.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/intrinsics.h"
 #include "flang/Evaluate/target.h"
 #include "flang/Parser/message.h"
 #include "flang/Semantics/module-dependences.h"
+#include "flang/Support/Fortran-features.h"
 #include <iosfwd>
 #include <set>
 #include <string>
diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index 29587be2c7d77d..d207cfe7d7421a 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -10,11 +10,11 @@
 #define FORTRAN_SEMANTICS_SYMBOL_H_
 
 #include "type.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
-#include "flang/Support/reference.h"
 #include "flang/Common/visit.h"
 #include "flang/Semantics/module-dependences.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/reference.h"
 #include "llvm/ADT/DenseMapInfo.h"
 
 #include <array>
diff --git a/flang/include/flang/Semantics/tools.h b/flang/include/flang/Semantics/tools.h
index 9be7ebff9b5bb6..e31de6e958a8c4 100644
--- a/flang/include/flang/Semantics/tools.h
+++ b/flang/include/flang/Semantics/tools.h
@@ -12,7 +12,6 @@
 // Simple predicates and look-up functions that are best defined
 // canonically for use in semantic checking.
 
-#include "flang/Support/Fortran.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/shape.h"
@@ -23,6 +22,7 @@
 #include "flang/Semantics/attr.h"
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/Fortran.h"
 #include <functional>
 
 namespace Fortran::semantics {
diff --git a/flang/include/flang/Semantics/type.h b/flang/include/flang/Semantics/type.h
index fd31bc805e2de6..210ea7a129376d 100644
--- a/flang/include/flang/Semantics/type.h
+++ b/flang/include/flang/Semantics/type.h
@@ -9,10 +9,10 @@
 #ifndef FORTRAN_SEMANTICS_TYPE_H_
 #define FORTRAN_SEMANTICS_TYPE_H_
 
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/char-block.h"
+#include "flang/Support/Fortran.h"
 #include <algorithm>
 #include <iosfwd>
 #include <map>
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index f0bfc9232ea9e9..718ce680afeeab 100644
--- a/flang/include/flang/Support/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -9,9 +9,9 @@
 #ifndef FORTRAN_COMMON_FORTRAN_FEATURES_H_
 #define FORTRAN_COMMON_FORTRAN_FEATURES_H_
 
-#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
+#include "flang/Support/Fortran.h"
 #include <vector>
 
 namespace Fortran::common {
diff --git a/flang/include/flang/Support/Fortran.h b/flang/include/flang/Support/Fortran.h
index 6dbfb51f19dd8e..343a0b30d2ba9c 100644
--- a/flang/include/flang/Support/Fortran.h
+++ b/flang/include/flang/Support/Fortran.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Support/Fortran.h -------------------------*- C++ -*-===//
+//===-- include/flang/Common/Fortran.h --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,8 @@
 #ifndef FORTRAN_COMMON_FORTRAN_H_
 #define FORTRAN_COMMON_FORTRAN_H_
 
-
+// Fortran language concepts that are used in many phases are defined
+// once here to avoid redundancy and needless translation.
 
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/enum-set.h"
@@ -18,11 +19,8 @@
 #include <optional>
 #include <string>
 
-
 namespace Fortran::common {
-	class LanguageFeatureControl;
-
-
+class LanguageFeatureControl;
 
 constexpr bool IsNumericTypeCategory(TypeCategory category) {
   return category == TypeCategory::Integer || category == TypeCategory::Real ||
@@ -46,7 +44,6 @@ const char *AsFortran(RelationalOperator);
 
 ENUM_CLASS(Intent, Default, In, Out, InOut)
 
-
 // Union of specifiers for all I/O statements.
 ENUM_CLASS(IoSpecKind, Access, Action, Advance, Asynchronous, Blank, Decimal,
     Delim, Direct, Encoding, End, Eor, Err, Exist, File, Fmt, Form, Formatted,
@@ -58,15 +55,11 @@ ENUM_CLASS(IoSpecKind, Access, Action, Advance, Asynchronous, Blank, Decimal,
     Dispose, // nonstandard
 )
 
-
 const char *AsFortran(DefinedIo);
 
-
 // Fortran label. Must be in [1..99999].
 using Label = std::uint64_t;
 
-
-
 // CUDA subprogram attribute combinations
 ENUM_CLASS(CUDASubprogramAttrs, Host, Device, HostDevice, Global, Grid_Global)
 
@@ -112,5 +105,6 @@ inline std::string GetExternalAssemblyName(
     std::string symbolName, bool underscoring) {
   return underscoring ? std::move(symbolName) + "_" : std::move(symbolName);
 }
+
 } // namespace Fortran::common
 #endif // FORTRAN_COMMON_FORTRAN_H_
diff --git a/flang/include/flang/Support/template.h b/flang/include/flang/Support/template.h
index e15de9c2d0cea8..58c9b0a5628e8a 100644
--- a/flang/include/flang/Support/template.h
+++ b/flang/include/flang/Support/template.h
@@ -9,8 +9,8 @@
 #ifndef FORTRAN_COMMON_TEMPLATE_H_
 #define FORTRAN_COMMON_TEMPLATE_H_
 
-#include "flang/Common/variant.h"
 #include "flang/Common/idioms.h"
+#include "flang/Common/variant.h"
 #include <functional>
 #include <optional>
 #include <tuple>
diff --git a/flang/include/flang/Tools/CrossToolHelpers.h b/flang/include/flang/Tools/CrossToolHelpers.h
index bc105f471aa003..168c3aefe0cd41 100644
--- a/flang/include/flang/Tools/CrossToolHelpers.h
+++ b/flang/include/flang/Tools/CrossToolHelpers.h
@@ -13,9 +13,9 @@
 #ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
 #define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
 
-#include "flang/Support/MathOptionsBase.h"
 #include "flang/Frontend/CodeGenOptions.h"
 #include "flang/Frontend/LangOptions.h"
+#include "flang/Support/MathOptionsBase.h"
 #include <cstdint>
 
 #include "mlir/Dialect/OpenMP/OpenMPDialect.h"
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index b62aeb2c08b779..73af3bdd589162 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -1,11 +1,3 @@
-#===-- FortranRuntime/lib/Common/CMakeLists.txt ---------------------------===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-
 add_flang_library(FortranCommon 
   "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/binary-to-decimal.cpp"
   "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/decimal-to-binary.cpp"
diff --git a/flang/lib/Evaluate/call.cpp b/flang/lib/Evaluate/call.cpp
index 1cb8eb89f41687..f77df92a7597ab 100644
--- a/flang/lib/Evaluate/call.cpp
+++ b/flang/lib/Evaluate/call.cpp
@@ -7,13 +7,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/call.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/check-expression.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/Fortran.h"
 
 namespace Fortran::evaluate {
 
diff --git a/flang/lib/Evaluate/characteristics.cpp b/flang/lib/Evaluate/characteristics.cpp
index 091f2e2b553e86..ffa3ec721cbd63 100644
--- a/flang/lib/Evaluate/characteristics.cpp
+++ b/flang/lib/Evaluate/characteristics.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/characteristics.h"
-#include "flang/Support/indirection.h"
 #include "flang/Evaluate/check-expression.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/intrinsics.h"
@@ -17,6 +16,7 @@
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <initializer_list>
 
diff --git a/flang/lib/Evaluate/common.cpp b/flang/lib/Evaluate/common.cpp
index 7741bec650575d..ed040b0728c4db 100644
--- a/flang/lib/Evaluate/common.cpp
+++ b/flang/lib/Evaluate/common.cpp
@@ -9,7 +9,6 @@
 #include "flang/Evaluate/common.h"
 #include "flang/Common/idioms.h"
 
-
 using namespace Fortran::parser::literals;
 
 
diff --git a/flang/lib/Evaluate/fold-implementation.h b/flang/lib/Evaluate/fold-implementation.h
index c8452cdd6a0caa..86cbd971aebcb5 100644
--- a/flang/lib/Evaluate/fold-implementation.h
+++ b/flang/lib/Evaluate/fold-implementation.h
@@ -12,9 +12,6 @@
 #include "character.h"
 #include "host.h"
 #include "int-power.h"
-#include "flang/Support/indirection.h"
-#include "flang/Support/template.h"
-#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/constant.h"
@@ -31,6 +28,9 @@
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/indirection.h"
+#include "flang/Support/template.h"
+#include "flang/Support/unwrap.h"
 #include <algorithm>
 #include <cmath>
 #include <complex>
diff --git a/flang/lib/Evaluate/formatting.cpp b/flang/lib/Evaluate/formatting.cpp
index db5d005d97c8c9..a53fa019984b43 100644
--- a/flang/lib/Evaluate/formatting.cpp
+++ b/flang/lib/Evaluate/formatting.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/formatting.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/constant.h"
 #include "flang/Evaluate/expression.h"
@@ -16,6 +15,7 @@
 #include "flang/Parser/characters.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/Fortran.h"
 #include "llvm/Support/raw_ostream.h"
 
 namespace Fortran::evaluate {
diff --git a/flang/lib/Evaluate/intrinsics-library.cpp b/flang/lib/Evaluate/intrinsics-library.cpp
index 440ddaaf9689c8..4f1eff492afae5 100644
--- a/flang/lib/Evaluate/intrinsics-library.cpp
+++ b/flang/lib/Evaluate/intrinsics-library.cpp
@@ -14,8 +14,8 @@
 #include "flang/Evaluate/intrinsics-library.h"
 #include "fold-implementation.h"
 #include "host.h"
-#include "flang/Support/static-multimap-view.h"
 #include "flang/Evaluate/expression.h"
+#include "flang/Support/static-multimap-view.h"
 #include <cfloat>
 #include <cmath>
 #include <complex>
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index 343bd2c9f22be2..bcad2d831cb784 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/intrinsics.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/check-expression.h"
@@ -19,6 +18,7 @@
 #include "flang/Evaluate/type.h"
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <cmath>
diff --git a/flang/lib/Evaluate/real.cpp b/flang/lib/Evaluate/real.cpp
index 9d465e5f35d6ae..01d2e14cbf933e 100644
--- a/flang/lib/Evaluate/real.cpp
+++ b/flang/lib/Evaluate/real.cpp
@@ -8,8 +8,8 @@
 
 #include "flang/Evaluate/real.h"
 #include "int-power.h"
-#include "flang/Common/idioms.h"
 #include "flang/Common/decimal.h"
+#include "flang/Common/idioms.h"
 #include "flang/Parser/characters.h"
 #include "llvm/Support/raw_ostream.h"
 #include <limits>
diff --git a/flang/lib/Evaluate/shape.cpp b/flang/lib/Evaluate/shape.cpp
index 7b78d8c7b9734f..d77dd312eba97a 100644
--- a/flang/lib/Evaluate/shape.cpp
+++ b/flang/lib/Evaluate/shape.cpp
@@ -8,7 +8,6 @@
 
 #include "flang/Evaluate/shape.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/check-expression.h"
 #include "flang/Evaluate/fold.h"
@@ -17,6 +16,7 @@
 #include "flang/Evaluate/type.h"
 #include "flang/Parser/message.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/template.h"
 #include <functional>
 
 using namespace std::placeholders; // _1, _2, &c. for std::bind()
diff --git a/flang/lib/Evaluate/target.cpp b/flang/lib/Evaluate/target.cpp
index d0722c31e3c3f7..79d260af6d50b9 100644
--- a/flang/lib/Evaluate/target.cpp
+++ b/flang/lib/Evaluate/target.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Evaluate/target.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/type.h"
+#include "flang/Support/template.h"
 
 namespace Fortran::evaluate {
 
diff --git a/flang/lib/Frontend/CompilerInstance.cpp b/flang/lib/Frontend/CompilerInstance.cpp
index a0653576852101..d86d6e678a4ed9 100644
--- a/flang/lib/Frontend/CompilerInstance.cpp
+++ b/flang/lib/Frontend/CompilerInstance.cpp
@@ -11,12 +11,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/CompilerInstance.h"
-#include "flang/Support/Fortran-features.h"
 #include "flang/Frontend/CompilerInvocation.h"
 #include "flang/Frontend/TextDiagnosticPrinter.h"
 #include "flang/Parser/parsing.h"
 #include "flang/Parser/provenance.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/Fortran-features.h"
 #include "clang/Basic/DiagnosticFrontend.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/MC/TargetRegistry.h"
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 5fe6ccbc44a894..5416234ca3e9e6 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -11,13 +11,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/CompilerInvocation.h"
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/OpenMP-features.h"
-#include "flang/Support/Version.h"
 #include "flang/Frontend/CodeGenOptions.h"
 #include "flang/Frontend/PreprocessorOptions.h"
 #include "flang/Frontend/TargetOptions.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/OpenMP-features.h"
+#include "flang/Support/Version.h"
 #include "flang/Tools/TargetSetup.h"
 #include "flang/Version.inc"
 #include "clang/Basic/AllDiagnostics.h"
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index 7d51c20514387a..dced7f296e7904 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -11,7 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Frontend/FrontendActions.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Frontend/CompilerInstance.h"
 #include "flang/Frontend/CompilerInvocation.h"
 #include "flang/Frontend/FrontendOptions.h"
@@ -33,6 +32,7 @@
 #include "flang/Semantics/runtime-type-info.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/unparse-with-symbols.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Tools/CrossToolHelpers.h"
 
 #include "mlir/IR/Dialect.h"
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 6924717cb467ac..c903c2169e4dcd 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -12,7 +12,6 @@
 
 #include "flang/Lower/Bridge.h"
 #include "DirectivesCommon.h"
-#include "flang/Support/Version.h"
 #include "flang/Lower/Allocatable.h"
 #include "flang/Lower/CallInterface.h"
 #include "flang/Lower/Coarray.h"
@@ -59,6 +58,7 @@
 #include "flang/Semantics/runtime-type-info.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Version.h"
 #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
 #include "mlir/IR/Matchers.h"
 #include "mlir/IR/PatternMatch.h"
diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp
index 153845699dae3d..9334ce009eae5e 100644
--- a/flang/lib/Lower/CallInterface.cpp
+++ b/flang/lib/Lower/CallInterface.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/CallInterface.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Lower/Bridge.h"
 #include "flang/Lower/Mangler.h"
@@ -23,6 +22,7 @@
 #include "flang/Optimizer/Support/Utils.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran.h"
 #include <optional>
 
 static mlir::FunctionType
diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp
index 4d2ac95ea784b5..b85043f78884f0 100644
--- a/flang/lib/Lower/ConvertExpr.cpp
+++ b/flang/lib/Lower/ConvertExpr.cpp
@@ -11,8 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/ConvertExpr.h"
-#include "flang/Support/default-kinds.h"
-#include "flang/Support/unwrap.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/real.h"
 #include "flang/Evaluate/traverse.h"
@@ -52,6 +50,8 @@
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
 #include "flang/Semantics/type.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/unwrap.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "llvm/ADT/TypeSwitch.h"
 #include "llvm/Support/CommandLine.h"
diff --git a/flang/lib/Lower/Mangler.cpp b/flang/lib/Lower/Mangler.cpp
index 565f9c6cbc5892..4ff170c19d922a 100644
--- a/flang/lib/Lower/Mangler.cpp
+++ b/flang/lib/Lower/Mangler.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/Mangler.h"
-#include "flang/Support/reference.h"
 #include "flang/Lower/Support/Utils.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "flang/Optimizer/Support/InternalNames.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/reference.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index 5f1a25b1af23e9..460923bbccc27a 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -14,7 +14,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Optimizer/Builder/IntrinsicCall.h"
-#include "flang/Support/static-multimap-view.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/Character.h"
 #include "flang/Optimizer/Builder/Complex.h"
@@ -42,6 +41,7 @@
 #include "flang/Optimizer/Support/Utils.h"
 #include "flang/Runtime/entry-names.h"
 #include "flang/Runtime/iostat.h"
+#include "flang/Support/static-multimap-view.h"
 #include "mlir/Dialect/Complex/IR/Complex.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/Dialect/Math/IR/Math.h"
@@ -507,7 +507,7 @@ static constexpr IntrinsicHandler handlers[]{
      /*isElemental=*/false},
     {"not", &I::genNot},
     {"null", &I::genNull, {{{"mold", asInquired}}}, /*isElemental=*/false},
-        {"numeric_storage_size", &I::genNumericStorageSize},
+    {"numeric_storage_size", &I::genNumericStorageSize},
     {"pack",
      &I::genPack,
      {{{"array", asBox},
@@ -7224,8 +7224,7 @@ IntrinsicLibrary::genVerify(mlir::Type resultType,
   return readAndAddCleanUp(resultMutableBox, resultType, "VERIFY");
 }
 
-
-    fir::ExtendedValue IntrinsicLibrary:: genNumericStorageSize(mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args) {
+fir::ExtendedValue IntrinsicLibrary:: genNumericStorageSize(mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args) {
       assert(args.empty() );
      
       if (!ignoreModuleOnlyBuiltins) {
@@ -7236,7 +7235,6 @@ IntrinsicLibrary::genVerify(mlir::Type resultType,
       return builder.createIntegerConstant(loc, resultType  , 32 );
     }
 
-
 /// Process calls to Minloc, Maxloc intrinsic functions
 template <typename FN, typename FD>
 fir::ExtendedValue
diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
index c632e42ef72c29..45354e0fe79666 100644
--- a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
+++ b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp
@@ -13,7 +13,6 @@
 #define DEBUG_TYPE "flang-type-conversion"
 
 #include "flang/Optimizer/CodeGen/TypeConverter.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done
 #include "flang/Optimizer/CodeGen/DescriptorModel.h"
 #include "flang/Optimizer/CodeGen/TBAABuilder.h"
@@ -22,6 +21,7 @@
 #include "flang/Optimizer/Dialect/Support/FIRContext.h"
 #include "flang/Optimizer/Dialect/Support/KindMapping.h"
 #include "flang/Optimizer/Support/InternalNames.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/Conversion/LLVMCommon/TypeConverter.h"
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/Support/Debug.h"
diff --git a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
index f41633629bb3e2..f84dd6bf6c06c5 100644
--- a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
+++ b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
@@ -12,7 +12,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "DebugTypeGenerator.h"
-#include "flang/Support/Version.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/CodeGen/CGOps.h"
@@ -22,6 +21,7 @@
 #include "flang/Optimizer/Dialect/Support/FIRContext.h"
 #include "flang/Optimizer/Support/InternalNames.h"
 #include "flang/Optimizer/Transforms/Passes.h"
+#include "flang/Support/Version.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/IR/Matchers.h"
diff --git a/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp b/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
index ca6eacfd0e7200..9fccbd24a74982 100644
--- a/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/AssumedRankOpConversion.cpp
@@ -6,7 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran.h"
 #include "flang/Lower/BuiltinModules.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/Support.h"
@@ -17,6 +16,7 @@
 #include "flang/Optimizer/Support/Utils.h"
 #include "flang/Optimizer/Transforms/Passes.h"
 #include "flang/Runtime/support.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Pass/Pass.h"
 #include "mlir/Transforms/DialectConversion.h"
diff --git a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
index d3c44a75e4cffb..d7d321c6b9af3f 100644
--- a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
@@ -6,7 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
 #include "flang/Optimizer/CodeGen/TypeConverter.h"
 #include "flang/Optimizer/Dialect/CUF/CUFOps.h"
@@ -16,6 +15,7 @@
 #include "flang/Optimizer/Support/DataLayout.h"
 #include "flang/Runtime/CUDA/descriptor.h"
 #include "flang/Runtime/allocatable.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/Pass/Pass.h"
 #include "mlir/Transforms/DialectConversion.h"
 #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
diff --git a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
index 1915abe2f91e0e..3e4f46297357f9 100644
--- a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp
@@ -6,12 +6,12 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Dialect/FIROpsSupport.h"
 #include "flang/Optimizer/Support/InternalNames.h"
 #include "flang/Optimizer/Transforms/Passes.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/IR/Attributes.h"
 #include "mlir/IR/SymbolTable.h"
 #include "mlir/Pass/Pass.h"
diff --git a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
index c56dfa1cdfb524..3f5178710689cb 100644
--- a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
+++ b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
@@ -22,7 +22,6 @@
 /// and small in size.
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/LowLevelIntrinsics.h"
@@ -34,6 +33,7 @@
 #include "flang/Optimizer/Transforms/Passes.h"
 #include "flang/Optimizer/Transforms/Utils.h"
 #include "flang/Runtime/entry-names.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/IR/Matchers.h"
 #include "mlir/IR/Operation.h"
diff --git a/flang/lib/Optimizer/Transforms/StackReclaim.cpp b/flang/lib/Optimizer/Transforms/StackReclaim.cpp
index 629ba587adf3ca..eb088c30e94f20 100644
--- a/flang/lib/Optimizer/Transforms/StackReclaim.cpp
+++ b/flang/lib/Optimizer/Transforms/StackReclaim.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran.h"
 #include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIROps.h"
 #include "flang/Optimizer/Transforms/Passes.h"
+#include "flang/Support/Fortran.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/IR/Matchers.h"
 #include "mlir/Pass/Pass.h"
diff --git a/flang/lib/Parser/basic-parsers.h b/flang/lib/Parser/basic-parsers.h
index 6575c7d01de346..be0f4fc44374ca 100644
--- a/flang/lib/Parser/basic-parsers.h
+++ b/flang/lib/Parser/basic-parsers.h
@@ -22,14 +22,14 @@
 // This header defines the fundamental parser class templates and helper
 // template functions.  See parser-combinators.txt for documentation.
 
-#include "flang/Support/Fortran-features.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/char-block.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-state.h"
 #include "flang/Parser/provenance.h"
 #include "flang/Parser/user-state.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/indirection.h"
 #include <cstring>
 #include <functional>
 #include <list>
diff --git a/flang/lib/Parser/parse-tree.cpp b/flang/lib/Parser/parse-tree.cpp
index 3b90a57c602945..0793383efefb5f 100644
--- a/flang/lib/Parser/parse-tree.cpp
+++ b/flang/lib/Parser/parse-tree.cpp
@@ -8,9 +8,9 @@
 
 #include "flang/Parser/parse-tree.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/tools.h"
 #include "flang/Parser/user-state.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 
diff --git a/flang/lib/Parser/prescan.h b/flang/lib/Parser/prescan.h
index 0ea614d1df3bd9..f9d920a6621aa5 100644
--- a/flang/lib/Parser/prescan.h
+++ b/flang/lib/Parser/prescan.h
@@ -16,11 +16,11 @@
 // fixed form character literals on truncated card images, file
 // inclusion, and driving the Fortran source preprocessor.
 
-#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/provenance.h"
 #include "flang/Parser/token-sequence.h"
+#include "flang/Support/Fortran-features.h"
 #include <bitset>
 #include <optional>
 #include <string>
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 7b0385c63cd8a1..4a044514916030 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -10,13 +10,13 @@
 // traversal templates in parse-tree-visitor.h.
 
 #include "flang/Parser/unparse.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Parser/tools.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <cinttypes>
diff --git a/flang/lib/Semantics/assignment.h b/flang/lib/Semantics/assignment.h
index 275625d3ed6522..ba0c70f7d224cb 100644
--- a/flang/lib/Semantics/assignment.h
+++ b/flang/lib/Semantics/assignment.h
@@ -9,9 +9,9 @@
 #ifndef FORTRAN_SEMANTICS_ASSIGNMENT_H_
 #define FORTRAN_SEMANTICS_ASSIGNMENT_H_
 
-#include "flang/Support/indirection.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/indirection.h"
 
 namespace Fortran::parser {
 class ContextualMessages;
diff --git a/flang/lib/Semantics/check-case.cpp b/flang/lib/Semantics/check-case.cpp
index 0e38b24f1b319d..6d38bbee1eb2cb 100644
--- a/flang/lib/Semantics/check-case.cpp
+++ b/flang/lib/Semantics/check-case.cpp
@@ -8,13 +8,13 @@
 
 #include "check-case.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/reference.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/type.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/reference.h"
+#include "flang/Support/template.h"
 #include <tuple>
 
 namespace Fortran::semantics {
diff --git a/flang/lib/Semantics/check-coarray.cpp b/flang/lib/Semantics/check-coarray.cpp
index d34c70e60d966b..ac1f38801cee72 100644
--- a/flang/lib/Semantics/check-coarray.cpp
+++ b/flang/lib/Semantics/check-coarray.cpp
@@ -7,13 +7,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-coarray.h"
-#include "flang/Support/indirection.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Parser/tools.h"
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/indirection.h"
 
 namespace Fortran::semantics {
 
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index 738a471f4d01f5..b89b46868d2e58 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-cuda.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Evaluate/traverse.h"
@@ -17,6 +16,7 @@
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/template.h"
 
 // Once labeled DO constructs have been canonicalized and their parse subtrees
 // transformed into parser::DoConstructs, scan the parser::Blocks of the program
diff --git a/flang/lib/Semantics/check-data.h b/flang/lib/Semantics/check-data.h
index 5cdf46a5ffb1c9..6da316cccc4a7b 100644
--- a/flang/lib/Semantics/check-data.h
+++ b/flang/lib/Semantics/check-data.h
@@ -10,11 +10,11 @@
 #define FORTRAN_SEMANTICS_CHECK_DATA_H_
 
 #include "data-to-inits.h"
-#include "flang/Support/interval.h"
 #include "flang/Evaluate/fold-designator.h"
 #include "flang/Evaluate/initial-image.h"
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/interval.h"
 #include <list>
 #include <map>
 #include <vector>
diff --git a/flang/lib/Semantics/check-do-forall.cpp b/flang/lib/Semantics/check-do-forall.cpp
index 42e1c07fc45c3e..26530e798c9f4c 100644
--- a/flang/lib/Semantics/check-do-forall.cpp
+++ b/flang/lib/Semantics/check-do-forall.cpp
@@ -8,7 +8,6 @@
 
 #include "check-do-forall.h"
 #include "definable.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/tools.h"
@@ -22,6 +21,7 @@
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
 #include "flang/Semantics/type.h"
+#include "flang/Support/template.h"
 
 namespace Fortran::evaluate {
 using ActualArgumentRef = common::Reference<const ActualArgument>;
diff --git a/flang/lib/Semantics/check-return.cpp b/flang/lib/Semantics/check-return.cpp
index 6a03467a27a759..c7b91a2725c942 100644
--- a/flang/lib/Semantics/check-return.cpp
+++ b/flang/lib/Semantics/check-return.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-return.h"
-#include "flang/Support/Fortran-features.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran-features.h"
 
 namespace Fortran::semantics {
 
diff --git a/flang/lib/Semantics/check-select-rank.cpp b/flang/lib/Semantics/check-select-rank.cpp
index 722226465b6642..b227bbaaef4ba4 100644
--- a/flang/lib/Semantics/check-select-rank.cpp
+++ b/flang/lib/Semantics/check-select-rank.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-select-rank.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/tools.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran.h"
 #include <list>
 #include <optional>
 #include <set>
diff --git a/flang/lib/Semantics/check-select-type.cpp b/flang/lib/Semantics/check-select-type.cpp
index da41410bd24612..b86a95492b21c1 100644
--- a/flang/lib/Semantics/check-select-type.cpp
+++ b/flang/lib/Semantics/check-select-type.cpp
@@ -8,12 +8,12 @@
 
 #include "check-select-type.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/reference.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/type.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/reference.h"
 #include <optional>
 
 namespace Fortran::semantics {
diff --git a/flang/lib/Semantics/check-stop.cpp b/flang/lib/Semantics/check-stop.cpp
index dab076424bd8e6..aabd52098e63bb 100644
--- a/flang/lib/Semantics/check-stop.cpp
+++ b/flang/lib/Semantics/check-stop.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-stop.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran.h"
 #include <optional>
 
 namespace Fortran::semantics {
diff --git a/flang/lib/Semantics/data-to-inits.h b/flang/lib/Semantics/data-to-inits.h
index df4d552760eda6..e99a02cc79db15 100644
--- a/flang/lib/Semantics/data-to-inits.h
+++ b/flang/lib/Semantics/data-to-inits.h
@@ -9,10 +9,10 @@
 #ifndef FORTRAN_SEMANTICS_DATA_TO_INITS_H_
 #define FORTRAN_SEMANTICS_DATA_TO_INITS_H_
 
-#include "flang/Support/default-kinds.h"
-#include "flang/Support/interval.h"
 #include "flang/Evaluate/fold-designator.h"
 #include "flang/Evaluate/initial-image.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/interval.h"
 #include <list>
 #include <map>
 
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index a4be06515e4c87..2a8ed892c800eb 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -11,7 +11,6 @@
 #include "pointer-assignment.h"
 #include "resolve-names-utils.h"
 #include "resolve-names.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/fold.h"
@@ -24,6 +23,7 @@
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <functional>
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp
index abd3c5f461cb7e..d8fcedf24bdb9e 100644
--- a/flang/lib/Semantics/pointer-assignment.cpp
+++ b/flang/lib/Semantics/pointer-assignment.cpp
@@ -10,7 +10,6 @@
 #include "definable.h"
 #include "flang/Common/idioms.h"
 #include "flang/Common/restorer.h"
-#include "flang/Support/template.h"
 #include "flang/Evaluate/characteristics.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/fold.h"
@@ -21,6 +20,7 @@
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/template.h"
 #include "llvm/Support/raw_ostream.h"
 #include <optional>
 #include <set>
diff --git a/flang/lib/Semantics/resolve-labels.cpp b/flang/lib/Semantics/resolve-labels.cpp
index 84d2e51d438bfe..e988ba8e331963 100644
--- a/flang/lib/Semantics/resolve-labels.cpp
+++ b/flang/lib/Semantics/resolve-labels.cpp
@@ -8,9 +8,9 @@
 
 #include "resolve-labels.h"
 #include "flang/Common/enum-set.h"
-#include "flang/Support/template.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Semantics/semantics.h"
+#include "flang/Support/template.h"
 #include <cstdarg>
 #include <type_traits>
 
diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp
index bc5f458f403cf2..3aa48e92d423db 100644
--- a/flang/lib/Semantics/resolve-names-utils.cpp
+++ b/flang/lib/Semantics/resolve-names-utils.cpp
@@ -7,10 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "resolve-names-utils.h"
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
-#include "flang/Support/indirection.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Evaluate/traverse.h"
@@ -20,6 +17,9 @@
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include <initializer_list>
 #include <variant>
 
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 920cefa084e05c..ebcb864549e48e 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -14,9 +14,6 @@
 #include "resolve-directives.h"
 #include "resolve-names-utils.h"
 #include "rewrite-parse-tree.h"
-#include "flang/Support/Fortran.h"
-#include "flang/Support/default-kinds.h"
-#include "flang/Support/indirection.h"
 #include "flang/Common/restorer.h"
 #include "flang/Common/visit.h"
 #include "flang/Evaluate/characteristics.h"
@@ -37,6 +34,9 @@
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
 #include "flang/Semantics/type.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/default-kinds.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <list>
 #include <map>
diff --git a/flang/lib/Semantics/rewrite-parse-tree.cpp b/flang/lib/Semantics/rewrite-parse-tree.cpp
index 46641f5bd3c363..7f4efe67d7ec9f 100644
--- a/flang/lib/Semantics/rewrite-parse-tree.cpp
+++ b/flang/lib/Semantics/rewrite-parse-tree.cpp
@@ -8,7 +8,6 @@
 
 #include "rewrite-parse-tree.h"
 #include "rewrite-directives.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Parser/tools.h"
@@ -16,6 +15,7 @@
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
+#include "flang/Support/indirection.h"
 #include <list>
 
 namespace Fortran::semantics {
diff --git a/flang/lib/Semantics/semantics.cpp b/flang/lib/Semantics/semantics.cpp
index c39c8ac5a7b111..aa897f3011f51d 100644
--- a/flang/lib/Semantics/semantics.cpp
+++ b/flang/lib/Semantics/semantics.cpp
@@ -37,12 +37,12 @@
 #include "resolve-labels.h"
 #include "resolve-names.h"
 #include "rewrite-parse-tree.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Parser/parse-tree-visitor.h"
 #include "flang/Parser/tools.h"
 #include "flang/Semantics/expression.h"
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/symbol.h"
+#include "flang/Support/default-kinds.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/TargetParser/Host.h"
 #include "llvm/TargetParser/Triple.h"
diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 2aa0476b8fa07a..3f5cf3cebbea9b 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -7,8 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Parser/tools.h"
-#include "flang/Support/Fortran.h"
-#include "flang/Support/indirection.h"
 #include "flang/Parser/dump-parse-tree.h"
 #include "flang/Parser/message.h"
 #include "flang/Parser/parse-tree.h"
@@ -17,6 +15,8 @@
 #include "flang/Semantics/symbol.h"
 #include "flang/Semantics/tools.h"
 #include "flang/Semantics/type.h"
+#include "flang/Support/Fortran.h"
+#include "flang/Support/indirection.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <set>
diff --git a/flang/lib/Support/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp
index e49735218ab967..868d18caa13c64 100644
--- a/flang/lib/Support/Fortran-features.cpp
+++ b/flang/lib/Support/Fortran-features.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Support/Fortran-features.h"
-#include "flang/Support/Fortran.h"
 #include "flang/Common/idioms.h"
+#include "flang/Support/Fortran.h"
 
 namespace Fortran::common {
 
diff --git a/flang/lib/Support/big-radix-floating-point.h b/flang/lib/Support/big-radix-floating-point.h
deleted file mode 100644
index 4c3d8f8b30832a..00000000000000
--- a/flang/lib/Support/big-radix-floating-point.h
+++ /dev/null
@@ -1,396 +0,0 @@
-//===-- lib/Support/big-radix-floating-point.h ------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
-#define FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_
-
-// This is a helper class for use in floating-point conversions between
-// binary and decimal representations.  It holds a multiple-precision
-// integer value using digits of a radix that is a large even power of ten
-// (10,000,000,000,000,000 by default, 10**16).  These digits are accompanied
-// by a signed exponent that denotes multiplication by a power of ten.
-// The effective radix point is to the right of the digits (i.e., they do
-// not represent a fraction).
-//
-// The operations supported by this class are limited to those required
-// for conversions between binary and decimal representations; it is not
-// a general-purpose facility.
-
-#include "flang/Common/bit-population-count.h"
-#include "flang/Common/leading-zero-bit-count.h"
-#include "flang/Common/uint128.h"
-#include "flang/Support/binary-floating-point.h"
-#include "flang/Common/decimal.h"
-#include <cinttypes>
-#include <limits>
-#include <type_traits>
-
-// Some environments, viz. glibc 2.17, allow the macro HUGE
-// to leak out of <math.h>.
-#undef HUGE
-
-namespace Fortran::decimal {
-
-static constexpr std::uint64_t TenToThe(int power) {
-  return power <= 0 ? 1 : 10 * TenToThe(power - 1);
-}
-
-// 10**(LOG10RADIX + 3) must be < 2**wordbits, and LOG10RADIX must be
-// even, so that pairs of decimal digits do not straddle Digits.
-// So LOG10RADIX must be 16 or 6.
-template <int PREC, int LOG10RADIX = 16> class BigRadixFloatingPointNumber {
-public:
-  using Real = BinaryFloatingPointNumber<PREC>;
-  static constexpr int log10Radix{LOG10RADIX};
-
-private:
-  static constexpr std::uint64_t uint64Radix{TenToThe(log10Radix)};
-  static constexpr int minDigitBits{
-      64 - common::LeadingZeroBitCount(uint64Radix)};
-  using Digit = common::HostUnsignedIntType<minDigitBits>;
-  static constexpr Digit radix{uint64Radix};
-  static_assert(radix < std::numeric_limits<Digit>::max() / 1000,
-      "radix is somehow too big");
-  static_assert(radix > std::numeric_limits<Digit>::max() / 10000,
-      "radix is somehow too small");
-
-  // The base-2 logarithm of the least significant bit that can arise
-  // in a subnormal IEEE floating-point number.
-  static constexpr int minLog2AnyBit{
-      -Real::exponentBias - Real::binaryPrecision};
-
-  // The number of Digits needed to represent the smallest subnormal.
-  static constexpr int maxDigits{3 - minLog2AnyBit / log10Radix};
-
-public:
-  explicit RT_API_ATTRS BigRadixFloatingPointNumber(
-      enum FortranRounding rounding = RoundNearest)
-      : rounding_{rounding} {}
-
-  // Converts a binary floating point value.
-  explicit RT_API_ATTRS BigRadixFloatingPointNumber(
-      Real, enum FortranRounding = RoundNearest);
-
-  RT_API_ATTRS BigRadixFloatingPointNumber &SetToZero() {
-    isNegative_ = false;
-    digits_ = 0;
-    exponent_ = 0;
-    return *this;
-  }
-
-  RT_API_ATTRS bool IsInteger() const { return exponent_ >= 0; }
-
-  // Converts decimal floating-point to binary.
-  RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary();
-
-  // Parses and converts to binary.  Handles leading spaces,
-  // "NaN", & optionally-signed "Inf".  Does not skip internal
-  // spaces.
-  // The argument is a reference to a pointer that is left
-  // pointing to the first character that wasn't parsed.
-  RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(
-      const char *&, const char *end = nullptr);
-
-  // Formats a decimal floating-point number to a user buffer.
-  // May emit "NaN" or "Inf", or an possibly-signed integer.
-  // No decimal point is written, but if it were, it would be
-  // after the last digit; the effective decimal exponent is
-  // returned as part of the result structure so that it can be
-  // formatted by the client.
-  RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(
-      char *, std::size_t, enum DecimalConversionFlags, int digits) const;
-
-  // Discard decimal digits not needed to distinguish this value
-  // from the decimal encodings of two others (viz., the nearest binary
-  // floating-point numbers immediately below and above this one).
-  // The last decimal digit may not be uniquely determined in all
-  // cases, and will be the mean value when that is so (e.g., if
-  // last decimal digit values 6-8 would all work, it'll be a 7).
-  // This minimization necessarily assumes that the value will be
-  // emitted and read back into the same (or less precise) format
-  // with default rounding to the nearest value.
-  RT_API_ATTRS void Minimize(
-      BigRadixFloatingPointNumber &&less, BigRadixFloatingPointNumber &&more);
-
-  template <typename STREAM> STREAM &Dump(STREAM &) const;
-
-private:
-  RT_API_ATTRS BigRadixFloatingPointNumber(
-      const BigRadixFloatingPointNumber &that)
-      : digits_{that.digits_}, exponent_{that.exponent_},
-        isNegative_{that.isNegative_}, rounding_{that.rounding_} {
-    for (int j{0}; j < digits_; ++j) {
-      digit_[j] = that.digit_[j];
-    }
-  }
-
-  RT_API_ATTRS bool IsZero() const {
-    // Don't assume normalization.
-    for (int j{0}; j < digits_; ++j) {
-      if (digit_[j] != 0) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  // Predicate: true when 10*value would cause a carry.
-  // (When this happens during decimal-to-binary conversion,
-  // there are more digits in the input string than can be
-  // represented precisely.)
-  RT_API_ATTRS bool IsFull() const {
-    return digits_ == digitLimit_ && digit_[digits_ - 1] >= radix / 10;
-  }
-
-  // Sets *this to an unsigned integer value.
-  // Returns any remainder.
-  template <typename UINT> RT_API_ATTRS UINT SetTo(UINT n) {
-    static_assert(
-        std::is_same_v<UINT, common::uint128_t> || std::is_unsigned_v<UINT>);
-    SetToZero();
-    while (n != 0) {
-      auto q{n / 10u};
-      if (n != q * 10) {
-        break;
-      }
-      ++exponent_;
-      n = q;
-    }
-    if constexpr (sizeof n < sizeof(Digit)) {
-      if (n != 0) {
-        digit_[digits_++] = n;
-      }
-      return 0;
-    } else {
-      while (n != 0 && digits_ < digitLimit_) {
-        auto q{n / radix};
-        digit_[digits_++] = static_cast<Digit>(n - q * radix);
-        n = q;
-      }
-      return n;
-    }
-  }
-
-  RT_API_ATTRS int RemoveLeastOrderZeroDigits() {
-    int remove{0};
-    if (digits_ > 0 && digit_[0] == 0) {
-      while (remove < digits_ && digit_[remove] == 0) {
-        ++remove;
-      }
-      if (remove >= digits_) {
-        digits_ = 0;
-      } else if (remove > 0) {
-#if defined __GNUC__ && __GNUC__ < 8
-        // (&& j + remove < maxDigits) was added to avoid GCC < 8 build failure
-        // on -Werror=array-bounds. This can be removed if -Werror is disable.
-        for (int j{0}; j + remove < digits_ && (j + remove < maxDigits); ++j) {
-#else
-        for (int j{0}; j + remove < digits_; ++j) {
-#endif
-          digit_[j] = digit_[j + remove];
-        }
-        digits_ -= remove;
-      }
-    }
-    return remove;
-  }
-
-  RT_API_ATTRS void RemoveLeadingZeroDigits() {
-    while (digits_ > 0 && digit_[digits_ - 1] == 0) {
-      --digits_;
-    }
-  }
-
-  RT_API_ATTRS void Normalize() {
-    RemoveLeadingZeroDigits();
-    exponent_ += RemoveLeastOrderZeroDigits() * log10Radix;
-  }
-
-  // This limited divisibility test only works for even divisors of the radix,
-  // which is fine since it's only ever used with 2 and 5.
-  template <int N> RT_API_ATTRS bool IsDivisibleBy() const {
-    static_assert(N > 1 && radix % N == 0, "bad modulus");
-    return digits_ == 0 || (digit_[0] % N) == 0;
-  }
-
-  template <unsigned DIVISOR> RT_API_ATTRS int DivideBy() {
-    Digit remainder{0};
-    for (int j{digits_ - 1}; j >= 0; --j) {
-      Digit q{digit_[j] / DIVISOR};
-      Digit nrem{digit_[j] - DIVISOR * q};
-      digit_[j] = q + (radix / DIVISOR) * remainder;
-      remainder = nrem;
-    }
-    return remainder;
-  }
-
-  RT_API_ATTRS void DivideByPowerOfTwo(int twoPow) { // twoPow <= log10Radix
-    Digit remainder{0};
-    auto mask{(Digit{1} << twoPow) - 1};
-    auto coeff{radix >> twoPow};
-    for (int j{digits_ - 1}; j >= 0; --j) {
-      auto nrem{digit_[j] & mask};
-      digit_[j] = (digit_[j] >> twoPow) + coeff * remainder;
-      remainder = nrem;
-    }
-  }
-
-  // Returns true on overflow
-  RT_API_ATTRS bool DivideByPowerOfTwoInPlace(int twoPow) {
-    if (digits_ > 0) {
-      while (twoPow > 0) {
-        int chunk{twoPow > log10Radix ? log10Radix : twoPow};
-        if ((digit_[0] & ((Digit{1} << chunk) - 1)) == 0) {
-          DivideByPowerOfTwo(chunk);
-          twoPow -= chunk;
-          continue;
-        }
-        twoPow -= chunk;
-        if (digit_[digits_ - 1] >> chunk != 0) {
-          if (digits_ == digitLimit_) {
-            return true; // overflow
-          }
-          digit_[digits_++] = 0;
-        }
-        auto remainder{digit_[digits_ - 1]};
-        exponent_ -= log10Radix;
-        auto coeff{radix >> chunk}; // precise; radix is (5*2)**log10Radix
-        auto mask{(Digit{1} << chunk) - 1};
-        for (int j{digits_ - 1}; j >= 1; --j) {
-          digit_[j] = (digit_[j - 1] >> chunk) + coeff * remainder;
-          remainder = digit_[j - 1] & mask;
-        }
-        digit_[0] = coeff * remainder;
-      }
-    }
-    return false; // no overflow
-  }
-
-  RT_API_ATTRS int AddCarry(int position = 0, int carry = 1) {
-    for (; position < digits_; ++position) {
-      Digit v{digit_[position] + carry};
-      if (v < radix) {
-        digit_[position] = v;
-        return 0;
-      }
-      digit_[position] = v - radix;
-      carry = 1;
-    }
-    if (digits_ < digitLimit_) {
-      digit_[digits_++] = carry;
-      return 0;
-    }
-    Normalize();
-    if (digits_ < digitLimit_) {
-      digit_[digits_++] = carry;
-      return 0;
-    }
-    return carry;
-  }
-
-  RT_API_ATTRS void Decrement() {
-    for (int j{0}; digit_[j]-- == 0; ++j) {
-      digit_[j] = radix - 1;
-    }
-  }
-
-  template <int N> RT_API_ATTRS int MultiplyByHelper(int carry = 0) {
-    for (int j{0}; j < digits_; ++j) {
-      auto v{N * digit_[j] + carry};
-      carry = v / radix;
-      digit_[j] = v - carry * radix; // i.e., v % radix
-    }
-    return carry;
-  }
-
-  template <int N> RT_API_ATTRS int MultiplyBy(int carry = 0) {
-    if (int newCarry{MultiplyByHelper<N>(carry)}) {
-      return AddCarry(digits_, newCarry);
-    } else {
-      return 0;
-    }
-  }
-
-  template <int N> RT_API_ATTRS int MultiplyWithoutNormalization() {
-    if (int carry{MultiplyByHelper<N>(0)}) {
-      if (digits_ < digitLimit_) {
-        digit_[digits_++] = carry;
-        return 0;
-      } else {
-        return carry;
-      }
-    } else {
-      return 0;
-    }
-  }
-
-  RT_API_ATTRS void LoseLeastSignificantDigit(); // with rounding
-
-  RT_API_ATTRS void PushCarry(int carry) {
-    if (digits_ == maxDigits && RemoveLeastOrderZeroDigits() == 0) {
-      LoseLeastSignificantDigit();
-      digit_[digits_ - 1] += carry;
-    } else {
-      digit_[digits_++] = carry;
-    }
-  }
-
-  // Adds another number and then divides by two.
-  // Assumes same exponent and sign.
-  // Returns true when the result has effectively been rounded down.
-  RT_API_ATTRS bool Mean(const BigRadixFloatingPointNumber &);
-
-  // Parses a floating-point number; leaves the pointer reference
-  // argument pointing at the next character after what was recognized.
-  // The "end" argument can be left null if the caller is sure that the
-  // string is properly terminated with an addressable character that
-  // can't be in a valid floating-point character.
-  RT_API_ATTRS bool ParseNumber(const char *&, bool &inexact, const char *end);
-
-  using Raw = typename Real::RawType;
-  constexpr RT_API_ATTRS Raw SignBit() const {
-    return Raw{isNegative_} << (Real::bits - 1);
-  }
-  constexpr RT_API_ATTRS Raw Infinity() const {
-    Raw result{static_cast<Raw>(Real::maxExponent)};
-    result <<= Real::significandBits;
-    result |= SignBit();
-    if constexpr (Real::bits == 80) { // x87
-      result |= Raw{1} << 63;
-    }
-    return result;
-  }
-  constexpr RT_API_ATTRS Raw NaN(bool isQuiet = true) {
-    Raw result{Real::maxExponent};
-    result <<= Real::significandBits;
-    result |= SignBit();
-    if constexpr (Real::bits == 80) { // x87
-      result |= Raw{isQuiet ? 3u : 2u} << 62;
-    } else {
-      Raw quiet{isQuiet ? Raw{2} : Raw{1}};
-      quiet <<= Real::significandBits - 2;
-      result |= quiet;
-    }
-    return result;
-  }
-  constexpr RT_API_ATTRS Raw HUGE() const {
-    Raw result{static_cast<Raw>(Real::maxExponent)};
-    result <<= Real::significandBits;
-    result |= SignBit();
-    return result - 1; // decrement exponent, set all significand bits
-  }
-
-  Digit digit_[maxDigits]; // in little-endian order: digit_[0] is LSD
-  int digits_{0}; // # of elements in digit_[] array; zero when zero
-  int digitLimit_{maxDigits}; // precision clamp
-  int exponent_{0}; // signed power of ten
-  bool isNegative_{false};
-  enum FortranRounding rounding_ { RoundNearest };
-};
-} // namespace Fortran::decimal
-#endif
diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt
index 60261ea352780a..03fa79979470ee 100644
--- a/flang/test/CMakeLists.txt
+++ b/flang/test/CMakeLists.txt
@@ -63,7 +63,6 @@ set(FLANG_TEST_DEPENDS
   FileCheck
   count
   not
-#  module_files
   fir-opt
   tco
   bbc
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index e9ec6b7116e0aa..917e052ef35fa1 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -14,10 +14,6 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/OpenMP-features.h"
-#include "flang/Support/Version.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Frontend/TargetOptions.h"
 #include "flang/Lower/Bridge.h"
 #include "flang/Lower/PFTBuilder.h"
@@ -40,6 +36,10 @@
 #include "flang/Semantics/runtime-type-info.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/unparse-with-symbols.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/OpenMP-features.h"
+#include "flang/Support/Version.h"
+#include "flang/Support/default-kinds.h"
 #include "flang/Tools/CrossToolHelpers.h"
 #include "flang/Tools/TargetSetup.h"
 #include "flang/Version.inc"
diff --git a/flang/tools/f18-parse-demo/f18-parse-demo.cpp b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
index 691b6cebec9b51..a50c88dc840643 100644
--- a/flang/tools/f18-parse-demo/f18-parse-demo.cpp
+++ b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
@@ -21,8 +21,6 @@
 // scaffolding compiler driver that can test some semantic passes of the
 // F18 compiler under development.
 
-#include "flang/Support/Fortran-features.h"
-#include "flang/Support/default-kinds.h"
 #include "flang/Parser/characters.h"
 #include "flang/Parser/dump-parse-tree.h"
 #include "flang/Parser/message.h"
@@ -31,6 +29,8 @@
 #include "flang/Parser/parsing.h"
 #include "flang/Parser/provenance.h"
 #include "flang/Parser/unparse.h"
+#include "flang/Support/Fortran-features.h"
+#include "flang/Support/default-kinds.h"
 #include "llvm/Support/Errno.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Program.h"
diff --git a/flang/unittests/Evaluate/expression.cpp b/flang/unittests/Evaluate/expression.cpp
index 6349997bafee48..d575f36def287e 100644
--- a/flang/unittests/Evaluate/expression.cpp
+++ b/flang/unittests/Evaluate/expression.cpp
@@ -1,10 +1,10 @@
 #include "flang/Evaluate/expression.h"
-#include "flang/Testing/testing.h"
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/intrinsics.h"
 #include "flang/Evaluate/target.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Parser/message.h"
+#include "flang/Testing/testing.h"
 #include <cstdio>
 #include <cstdlib>
 #include <string>
diff --git a/flang/unittests/Evaluate/folding.cpp b/flang/unittests/Evaluate/folding.cpp
index 35df702ff20ea6..832e55d44316da 100644
--- a/flang/unittests/Evaluate/folding.cpp
+++ b/flang/unittests/Evaluate/folding.cpp
@@ -1,4 +1,3 @@
-#include "flang/Testing/testing.h"
 #include "../../lib/Evaluate/host.h"
 #include "flang/Evaluate/call.h"
 #include "flang/Evaluate/expression.h"
@@ -7,6 +6,7 @@
 #include "flang/Evaluate/intrinsics.h"
 #include "flang/Evaluate/target.h"
 #include "flang/Evaluate/tools.h"
+#include "flang/Testing/testing.h"
 #include <tuple>
 
 using namespace Fortran::evaluate;
diff --git a/flang/unittests/Evaluate/intrinsics.cpp b/flang/unittests/Evaluate/intrinsics.cpp
index 0baf01a4cb1b7e..cca2f8c30247e0 100644
--- a/flang/unittests/Evaluate/intrinsics.cpp
+++ b/flang/unittests/Evaluate/intrinsics.cpp
@@ -1,10 +1,10 @@
 #include "flang/Evaluate/intrinsics.h"
-#include "flang/Testing/testing.h"
 #include "flang/Evaluate/common.h"
 #include "flang/Evaluate/expression.h"
 #include "flang/Evaluate/target.h"
 #include "flang/Evaluate/tools.h"
 #include "flang/Parser/provenance.h"
+#include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
 #include <initializer_list>
 #include <map>
diff --git a/flang/unittests/Evaluate/logical.cpp b/flang/unittests/Evaluate/logical.cpp
index ee568371eab86c..ba7d0d8d0c0e3a 100644
--- a/flang/unittests/Evaluate/logical.cpp
+++ b/flang/unittests/Evaluate/logical.cpp
@@ -1,5 +1,5 @@
-#include "flang/Testing/testing.h"
 #include "flang/Evaluate/type.h"
+#include "flang/Testing/testing.h"
 #include <cstdio>
 
 template <int KIND> void testKind() {
diff --git a/flang/unittests/Evaluate/real.cpp b/flang/unittests/Evaluate/real.cpp
index ab1a178df22312..23406fc6909aea 100644
--- a/flang/unittests/Evaluate/real.cpp
+++ b/flang/unittests/Evaluate/real.cpp
@@ -1,6 +1,6 @@
+#include "flang/Evaluate/type.h"
 #include "flang/Testing/fp-testing.h"
 #include "flang/Testing/testing.h"
-#include "flang/Evaluate/type.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cmath>
 #include <cstdio>
diff --git a/lld/COFF/MinGW.cpp b/lld/COFF/MinGW.cpp
index e4e6a3bb52410f..74d1ae0615fa6a 100644
--- a/lld/COFF/MinGW.cpp
+++ b/lld/COFF/MinGW.cpp
@@ -51,7 +51,6 @@ AutoExporter::AutoExporter(
       "libc++",
       "libc++abi",
       "libFortranRuntime",
-      "libFortranFloat128Math",
       "libFortranRuntime.static",
       "libFortranRuntime.dynamic",
       "libFortranRuntime.static_dbg",
diff --git a/llvm/projects/CMakeLists.txt b/llvm/projects/CMakeLists.txt
index fab28c9df6d384..d8808bc79f0129 100644
--- a/llvm/projects/CMakeLists.txt
+++ b/llvm/projects/CMakeLists.txt
@@ -38,7 +38,6 @@ if(${LLVM_BUILD_RUNTIME})
   if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
     add_llvm_external_project(compiler-rt)
   endif()
-
   add_llvm_external_project(FortranRuntime)
 endif()
 
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index e4389b120f49df..5da91169058724 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -510,14 +510,7 @@ if(build_runtimes)
     list(APPEND extra_cmake_args "-DCMAKE_PROGRAM_PATH=${CMAKE_PROGRAM_PATH}")
   endif()
 
-  # FIXME: Go away
   if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
-    #if (LLVM_TOOL_FLANG_BUILD AND "FortranRuntime" IN_LIST LLVM_ENABLE_PROJECTS)
-    #  message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang-new")
-    #  set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang-new${CMAKE_EXECUTABLE_SUFFIX}")
-    #  #TODO: set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
-    #  list(APPEND extra_deps "flang-new")
-    #endif()
     if (LLVM_TOOL_FLANG_BUILD AND "FortranRuntime" IN_LIST LLVM_ENABLE_PROJECTS)
       set(enable_fortran ENABLE_FORTRAN)
     endif ()
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index d77b4da6e00e34..2a7798fd60af42 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -49,7 +49,6 @@ function(runtime_register_component name)
   set_property(GLOBAL APPEND PROPERTY SUB_COMPONENTS ${name})
 endfunction()
 
-message("LLVM_BINARY_DIR: ${LLVM_BINARY_DIR}")
 find_package(LLVM PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
 find_package(Clang PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
 

>From c7bc5e9785751bba5784b2ec93702b8e5005974d Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 30 Sep 2024 15:06:18 +0200
Subject: [PATCH 03/32] Move target-independent modules back to Flang

Move modules back to flang

Fix check-flang

Build fixes and cleanup

Test fix

Solve mscrt lib choice

clang_rt.builtins workaround via CMAake

clang_rt.builtins workaround via Clang

Revert "clang_rt.builtins workaround via Clang"

This reverts commit 2678d0c9a0ca86cfada9351d3328119388a35609.

Fix search for libclang_rt.builtins

move magic-numbers.h to common files
---
 FortranRuntime/CMakeLists.txt                 |  52 +++---
 .../cmake/modules/AddFortranRuntime.cmake     |  43 +++--
 .../Common/ISO_Fortran_binding_wrapper.h      |   2 +-
 .../flang/{Runtime => Common}/magic-numbers.h |   0
 FortranRuntime/include/flang/Runtime/io-api.h |   2 +-
 FortranRuntime/include/flang/Runtime/iostat.h |   2 +-
 FortranRuntime/lib/Runtime/CMakeLists.txt     | 153 ++++++-----------
 FortranRuntime/lib/Runtime/file.cpp           |   2 +-
 FortranRuntime/lib/Runtime/io-error.cpp       |   2 +-
 FortranRuntime/lib/Runtime/stat.h             |   2 +-
 FortranRuntime/module/CMakeLists.txt          |  63 -------
 FortranRuntime/test/CMakeLists.txt            |  13 +-
 .../test/Driver/ctofortran.f90                |   3 +-
 .../test/Driver/exec.f90                      |   2 +-
 FortranRuntime/test/NonGtestUnit/lit.cfg.py   |   3 +-
 FortranRuntime/test/lit.cfg.py                |  16 +-
 FortranRuntime/unittests/CMakeLists.txt       |  11 +-
 .../unittests/Common/CMakeLists.txt           |   2 +-
 .../unittests/Decimal/CMakeLists.txt          |   4 +-
 .../unittests/Evaluate/CMakeLists.txt         |   4 +-
 .../unittests/Runtime/CMakeLists.txt          |   2 +-
 clang/lib/Driver/ToolChains/Flang.cpp         |   6 +-
 flang/CMakeLists.txt                          |  14 ++
 .../include/flang}/ISO_Fortran_binding.h      |  11 +-
 flang/lib/CMakeLists.txt                      |   3 -
 flang/lib/Evaluate/fold-logical.cpp           |   2 +-
 flang/lib/Optimizer/Builder/IntrinsicCall.cpp |  17 --
 .../module/.clang-format                      |   0
 .../module/__cuda_builtins.f90                |   0
 .../module/__fortran_builtins.f90             |   2 +-
 .../module/__fortran_ieee_exceptions.f90      |   2 +-
 .../module/__fortran_type_info.f90            |   0
 .../module/__ppc_intrinsics.f90               |   0
 .../module/__ppc_types.f90                    |   0
 .../module/cudadevice.f90                     |   2 +-
 .../module/ieee_arithmetic.f90                |   2 +-
 .../module/ieee_exceptions.f90                |   0
 .../module/ieee_features.f90                  |   0
 .../module/iso_c_binding.f90                  |   0
 .../module/iso_fortran_env.f90                |   2 +-
 {FortranRuntime => flang}/module/mma.f90      |  43 ++---
 flang/test/CMakeLists.txt                     |   1 +
 .../test/Driver/msvc-dependent-lib-flags.f90  |   4 -
 flang/tools/CMakeLists.txt                    |   1 +
 flang/tools/bbc/CMakeLists.txt                |   1 -
 flang/tools/f18-parse-demo/CMakeLists.txt     |   2 -
 flang/tools/f18/CMakeLists.txt                | 161 ++++++++++++++++++
 flang/tools/f18/dump.cpp                      |  42 +++++
 flang/tools/fir-opt/CMakeLists.txt            |   2 -
 flang/tools/flang-driver/CMakeLists.txt       |   3 -
 flang/tools/tco/CMakeLists.txt                |   2 -
 51 files changed, 387 insertions(+), 321 deletions(-)
 rename FortranRuntime/include/flang/{Runtime => Common}/magic-numbers.h (100%)
 delete mode 100644 FortranRuntime/module/CMakeLists.txt
 rename {flang => FortranRuntime}/test/Driver/ctofortran.f90 (99%)
 rename {flang => FortranRuntime}/test/Driver/exec.f90 (89%)
 rename {FortranRuntime/include/flang/Common => flang/include/flang}/ISO_Fortran_binding.h (95%)
 rename {FortranRuntime => flang}/module/.clang-format (100%)
 rename {FortranRuntime => flang}/module/__cuda_builtins.f90 (100%)
 rename {FortranRuntime => flang}/module/__fortran_builtins.f90 (99%)
 rename {FortranRuntime => flang}/module/__fortran_ieee_exceptions.f90 (98%)
 rename {FortranRuntime => flang}/module/__fortran_type_info.f90 (100%)
 rename {FortranRuntime => flang}/module/__ppc_intrinsics.f90 (100%)
 rename {FortranRuntime => flang}/module/__ppc_types.f90 (100%)
 rename {FortranRuntime => flang}/module/cudadevice.f90 (96%)
 rename {FortranRuntime => flang}/module/ieee_arithmetic.f90 (99%)
 rename {FortranRuntime => flang}/module/ieee_exceptions.f90 (100%)
 rename {FortranRuntime => flang}/module/ieee_features.f90 (100%)
 rename {FortranRuntime => flang}/module/iso_c_binding.f90 (100%)
 rename {FortranRuntime => flang}/module/iso_fortran_env.f90 (98%)
 rename {FortranRuntime => flang}/module/mma.f90 (98%)
 create mode 100644 flang/tools/f18/CMakeLists.txt
 create mode 100644 flang/tools/f18/dump.cpp

diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
index 765e1445fc1a18..5c20b496dea821 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/FortranRuntime/CMakeLists.txt
@@ -15,6 +15,9 @@
 set(LLVM_SUBPROJECT_TITLE "Fortran Runtime")
 set(FORTRANRUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 set(FORTRANRUNTIME_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang")
+
+enable_language(Fortran)
 
 list(APPEND CMAKE_MODULE_PATH
   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
@@ -22,7 +25,6 @@ list(APPEND CMAKE_MODULE_PATH
 include(AddFortranRuntime)
 
 
-
 ############################
 # Build Mode Introspection #
 ############################
@@ -38,28 +40,21 @@ endif()
 if (LLVM_TREE_AVAILABLE)
   # Despite Clang in the name, get_clang_resource_dir does not depend on Clang being added to the build
   # flang-new uses the same resource dir as clang.
-  include(GetClangResourceDir) 
+  include(GetClangResourceDir)
   get_clang_resource_dir(FORTRANRUNTIME_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
   get_clang_resource_dir(FORTRANRUNTIME_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command find the install prefix itself
-
-  # FIXME: If compiling multiple triples, include dirs overwrite each other
-  get_clang_resource_dir(FORTRANRUNTIME_BUILD_INCLUDE_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "include")
-  get_clang_resource_dir(FORTRANRUNTIME_INSTALL_INCLUDE_DIR SUBDIR "include") 
 else ()
   set(FORTRANRUNTIME_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
   set(FORTRANRUNTIME_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
-
-  set(FORTRANRUNTIME_BUILD_INCLUDE_DIR "${LLVM_INCLUDE_DIR}")
-  set(FORTRANRUNTIME_INSTALL_INCLUDE_DIR "include")
 endif ()
 
-
-if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
+if (DEFINED WIN32)
+  set(FORTRANRUNTIME_BUILD_LIB_DIR "${FORTRANRUNTIME_BUILD_LIB_DIR}/windows")
+  set(FORTRANRUNTIME_INSTALL_LIB_DIR "${FORTRANRUNTIME_INSTALL_LIB_DIR}/windows")
+elseif (LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
   set(FORTRANRUNTIME_BUILD_LIB_DIR "${FORTRANRUNTIME_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
   set(FORTRANRUNTIME_INSTALL_LIB_DIR "${FORTRANRUNTIME_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
-endif()
-
-
+endif ()
 
 
 #################
@@ -139,16 +134,26 @@ check_cxx_source_compiles(
   "
   HAVE_LDBL_MANT_DIG_113)
 
+# Search for clang_rt.builtins
+execute_process(
+    COMMAND "${CMAKE_CXX_COMPILER}" "-print-libgcc-file-name" "-rtlib=compiler-rt"
+    RESULT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE
+    OUTPUT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT
+  )
+if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
+  string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FORTRANRUNTIME_LIBCALL)
+else ()
+  set(FORTRANRUNTIME_LIBCALL "")
+endif ()
+
 
 #####################
 # Build Preparation #
 #####################
 
-enable_language(Fortran)
-
 # C++17 required for FortranRuntime, user or other runtimes may override this.
 # GTest included later also requires C++17.
-set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") 
+set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
 set(CMAKE_CXX_STANDARD_REQUIRED YES)
 
 # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
@@ -156,29 +161,16 @@ set(CMAKE_CXX_STANDARD_REQUIRED YES)
 add_definitions(-U_GLIBCXX_ASSERTIONS)
 add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
 
-
 configure_file(cmake/config.h.cmake.in config.h)
 
-configure_file(
-  "${FORTRANRUNTIME_SOURCE_DIR}/include/flang/Common/ISO_Fortran_binding.h"
-  "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/ISO_Fortran_binding.h"
-)
-install(
-  FILES   "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/ISO_Fortran_binding.h"
-  DESTINATION "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}"
-)
-
-
 
 ###################
 # Build Artifacts #
 ###################
 
 add_subdirectory(lib)
-add_subdirectory(module)
 
 if (FORTRANRUNTIME_INCLUDE_TESTS)
   add_subdirectory(unittests)
   add_subdirectory(test)
 endif()
-
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
index a4fc95495610cc..e4dff982e6deea 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -53,7 +53,8 @@ function (add_fortranruntime_library name)
     list(APPEND extra_args EXCLUDE_FROM_ALL)
   endif ()
 
-  add_library(${name} ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS}   )
+  add_library(${name} ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+
   if (ARG_INSTALL_WITH_TOOLCHAIN)
     set_target_properties(${name} PROPERTIES FOLDER "Fortran Runtime/Toolchain Libraries")
   elseif (ARG_OBJECT)
@@ -63,20 +64,28 @@ function (add_fortranruntime_library name)
   endif ()
 
   target_compile_features(${name} PRIVATE cxx_std_17)
-     if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
-       target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
-    elseif(MSVC)
-      target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
-    endif()
+  if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
+    target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
+  elseif (MSVC)
+    target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
+  endif ()
 
-  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")   # For configured config.h for be found
+  # FortranRuntime's public headers
   target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
 
-set_target_properties(${name}
-  PROPERTIES
-    Fortran_MODULE_DIRECTORY "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/flang"
-)
+  # For ISO_Fortran_binding.h to be found (Accessed as #include "flang/ISO_Fortran_binding.h")
+  target_include_directories(${name} PRIVATE "${FLANG_SOURCE_DIR}/include")
+
+  # For configured config.h for be found
+  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")
 
+  # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc does not support.
+  # We are injecting a dependency to Compiler-RT where these are implemented.
+  if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FORTRANRUNTIME_LIBCALL)
+    target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FORTRANRUNTIME_LIBCALL}")
+  endif ()
+
+  # Non-GTest unittests depend on LLVMSupport
   if (ARG_LINK_TO_LLVM)
     if (LLVM_LINK_LLVM_DYLIB)
       set(llvm_libs LLVM)
@@ -84,26 +93,24 @@ set_target_properties(${name}
       llvm_map_components_to_libnames(llvm_libs Support)
     endif()
     target_link_libraries(${name} PUBLIC  ${llvm_libs})
-     target_include_directories(${name} PRIVATE  ${LLVM_INCLUDE_DIRS})
+    target_include_directories(${name} PRIVATE  ${LLVM_INCLUDE_DIRS})
   endif ()
 
   # If this is part of the toolchain, put it into the compiler's resource directory.
   # Otherwise it is part of testing and is not installed at all.
   # TODO: Consider multi-configuration builds
-  if (INSTALL_WITH_TOOLCHAIN)
+  if (ARG_INSTALL_WITH_TOOLCHAIN)
     set_target_properties(${name}
-      PROPERTIES 
+      PROPERTIES
         LIBRARY_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
         ARCHIVE_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
         RUNTIME_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
-    )
+      )
 
-    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
-      install(TARGETS ${name}
+    install(TARGETS ${name}
         LIBRARY DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
         ARCHIVE DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
         RUNTIME DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
       )
-    endif ()
   endif ()
 endfunction (add_fortranruntime_library)
diff --git a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
index d1bc9be34859a4..2c0fdc123c8759 100644
--- a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
+++ b/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
@@ -28,7 +28,7 @@ namespace Fortran {
 namespace ISO {
 #define FORTRAN_ISO_NAMESPACE_ ::Fortran::ISO
 #endif /* __cplusplus */
-#include "ISO_Fortran_binding.h"
+#include "flang/ISO_Fortran_binding.h"
 #ifdef __cplusplus
 } // namespace ISO
 } // namespace Fortran
diff --git a/FortranRuntime/include/flang/Runtime/magic-numbers.h b/FortranRuntime/include/flang/Common/magic-numbers.h
similarity index 100%
rename from FortranRuntime/include/flang/Runtime/magic-numbers.h
rename to FortranRuntime/include/flang/Common/magic-numbers.h
diff --git a/FortranRuntime/include/flang/Runtime/io-api.h b/FortranRuntime/include/flang/Runtime/io-api.h
index 367146a4925c53..93971a2282cd00 100644
--- a/FortranRuntime/include/flang/Runtime/io-api.h
+++ b/FortranRuntime/include/flang/Runtime/io-api.h
@@ -14,7 +14,7 @@
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/entry-names.h"
 #include "flang/Runtime/iostat.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 #include <cinttypes>
 #include <cstddef>
 
diff --git a/FortranRuntime/include/flang/Runtime/iostat.h b/FortranRuntime/include/flang/Runtime/iostat.h
index a5a2a560f05f8d..9a52990045ee13 100644
--- a/FortranRuntime/include/flang/Runtime/iostat.h
+++ b/FortranRuntime/include/flang/Runtime/iostat.h
@@ -12,7 +12,7 @@
 #ifndef FORTRAN_RUNTIME_IOSTAT_H_
 #define FORTRAN_RUNTIME_IOSTAT_H_
 #include "flang/Common/api-attrs.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 namespace Fortran::runtime::io {
 
 // The value of IOSTAT= is zero when no error, end-of-record,
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 9ccbc9ea78b0fc..5a0cc2ff14383a 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -9,6 +9,8 @@
 add_subdirectory(Float128Math)
 
 set(sources
+  ../Common/binary-to-decimal.cpp
+  ../Common/decimal-to-binary.cpp
   ISO_Fortran_binding.cpp
   allocator-registry.cpp
   allocatable.cpp
@@ -74,76 +76,19 @@ set(sources
   unit-map.cpp
   unit.cpp
   utf.cpp
-  ../Common/binary-to-decimal.cpp
-  ../Common/decimal-to-binary.cpp
 )
 
-# List of files that are buildable for all devices.
-set(supported_files
-  ISO_Fortran_binding.cpp
-  allocatable.cpp
-  allocator-registry.cpp
-  array-constructor.cpp
-  assign.cpp
-  buffer.cpp
-  character.cpp
-  connection.cpp
-  copy.cpp
-  derived-api.cpp
-  derived.cpp
-  descriptor.cpp
-  descriptor-io.cpp
-  dot-product.cpp
-  edit-input.cpp
-  edit-output.cpp
-  environment.cpp
-  extrema.cpp
-  external-unit.cpp
-  file.cpp
-  findloc.cpp
-  format.cpp
-  inquiry.cpp
-  internal-unit.cpp
-  io-api.cpp
-  io-api-minimal.cpp
-  io-error.cpp
-  io-stmt.cpp
-  iostat.cpp
-  matmul-transpose.cpp
-  matmul.cpp
-  memory.cpp
-  misc-intrinsic.cpp
-  namelist.cpp
-  non-tbp-dio.cpp
-  numeric.cpp
-  pointer.cpp
-  product.cpp
-  pseudo-unit.cpp
-  ragged.cpp
-  stat.cpp
-  sum.cpp
-  support.cpp
-  terminator.cpp
-  tools.cpp
-  transformational.cpp
-  type-code.cpp
-  type-info.cpp
-  unit.cpp
-  utf.cpp
+set(public_headers "")
+file(GLOB_RECURSE public_headers
+  "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Runtime/*.h"
+  "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h"
   )
 
-
-  set(public_headers "")
-  file(GLOB_RECURSE public_headers 
-    "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Runtime/*.h" 
-    "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h" 
-    )
-
-  set(private_headers "")
-  file(GLOB_RECURSE private_headers 
-    "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h" 
-    "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h" 
-    )
+set(private_headers "")
+file(GLOB_RECURSE private_headers
+  "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h"
+  "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
+  )
 
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
@@ -170,53 +115,59 @@ if (NOT DEFINED WIN32)
 
   # For unittests that link to FortranRuntime. Should link to the static version of the library.
   add_library(FortranRuntime.static ALIAS FortranRuntime)
+  add_library(FortranRuntime.unittest ALIAS FortranRuntime)
 else()
-  # ${sources} also contains Fortran files. CMake write the generated Fortran files into the same directory (lib/Runtime/iso_fortran_env_impl.mod), so we need to compile it only once and add the object files to different runtime version.
-  add_fortranruntime_library(FortranRuntime.obj OBJECT
-      ${sources}
- 
-      ADDITIONAL_HEADERS ${public_headers} ${private_headers}
-    )
+  function (add_win_fortranruntime_library libtype suffix msvc_lib)
+    set(name "FortranRuntime.${suffix}")
+    add_fortranruntime_library(${name} ${libtype}
+        ${sources}
+        ${ARGN}
+        INSTALL_WITH_TOOLCHAIN
+        ADDITIONAL_HEADERS ${public_headers} ${private_headers}
+      )
 
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
-  add_fortranruntime_library(FortranRuntime.static STATIC $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN  #${sources}
-    )
+    # Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to write a different .mod file.
+    set_target_properties(${name}
+        PROPERTIES
+          MSVC_RUNTIME_LIBRARY ${msvc_lib}
+          Fortran_MODULE_DIRECTORY "module.${suffix}"
+      )
+  endfunction ()
 
-  
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
-  add_fortranruntime_library(FortranRuntime.dynamic SHARED $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources} 
-    )
+  add_win_fortranruntime_library(STATIC static     MultiThreaded)
+  add_win_fortranruntime_library(STATIC static_dbg MultiThreadedDebug)
 
-  
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
-  add_fortranruntime_library(FortranRuntime.static_dbg STATIC $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources}
-    )
+  # unittests link against LLVMSupport which is compiled with /MD
+  add_win_fortranruntime_library(STATIC unittest   MultiThreadedDLL EXCLUDE_FROM_ALL)
 
-  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
-  add_fortranruntime_library(FortranRuntime.dynamic_dbg SHARED $<TARGET_OBJECTS:FortranRuntime.obj> INSTALL_WITH_TOOLCHAIN #${sources}
-    )
-  target_link_libraries(FortranRuntime.dynamic_dbg PRIVATE FortranRuntime.obj)
+  # FIXME: Before DLL versions of the runtime can be used, exported definitions must be annotated with __declspec(dllexport).
+  add_win_fortranruntime_library(SHARED dynamic     MultiThreadedDLL)
+  add_win_fortranruntime_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
 
   # Target for building all versions of the runtime
   add_custom_target(FortranRuntime)
   set_target_properties(FortranRuntime PROPERTIES FOLDER "Fortran Runtime/Meta")
-  add_dependencies(FortranRuntime FortranRuntime.static FortranRuntime.dynamic
-    FortranRuntime.static_dbg FortranRuntime.dynamic_dbg)
+  add_dependencies(FortranRuntime
+      FortranRuntime.static
+      FortranRuntime.static_dbg
+      FortranRuntime.dynamic
+      FortranRuntime.dynamic_dbg
+    )
 
   if (MSVC)
-    # The Fortran files compiled with flang-new assumes libcall functions such as `__udivti3`
+    # The Fortran files compiled with flang-new generate libcall functions such as `__udivti3`
     # Add LLVM_ENABLE_RUNTIMES=compiler-rt for it to be available during the runtimes build
     # FIXME: Can embed linker command --dependent-lib into object files as already done with FortranRuntime.<mode>.lib
-    if (NOT TARGET clang_rt.builtins-x86_64)
-      message(WARNING
-        "compiler-rt needed when compiling with msvc\n"
-        "Flang/LLVM will emit code that calls into libgcc/compiler-rt, but using the MSVC linker will only link Microsoft's CRT automatically\n"
-        "Add compiler-rt to LLVM_ENABLE_RUNTIMES to fix"
-      )
-    endif ()
-    target_link_libraries(FortranRuntime.static PUBLIC clang_rt.builtins-x86_64)
-    target_link_libraries(FortranRuntime.dynamic PUBLIC clang_rt.builtins-x86_64)
-    target_link_libraries(FortranRuntime.static_dbg PUBLIC clang_rt.builtins-x86_64)
-    target_link_libraries(FortranRuntime.dynamic_dbg PUBLIC clang_rt.builtins-x86_64)
+    #if (NOT TARGET clang_rt.builtins-x86_64)
+    #  message(WARNING
+    #    "compiler-rt needed when compiling with msvc\n"
+    #    "Flang/LLVM will emit code that calls into libgcc/compiler-rt, but using the MSVC linker will only link Microsoft's CRT automatically\n"
+    #    "Add compiler-rt to LLVM_ENABLE_RUNTIMES to fix"
+    #  )
+    #endif ()
+    #target_link_libraries(FortranRuntime.static PUBLIC clang_rt.builtins-x86_64)
+    #target_link_libraries(FortranRuntime.static_dbg PUBLIC clang_rt.builtins-x86_64)
+    #target_link_libraries(FortranRuntime.dynamic PUBLIC clang_rt.builtins-x86_64)
+    #target_link_libraries(FortranRuntime.dynamic_dbg PUBLIC clang_rt.builtins-x86_64)
   endif ()
 endif()
diff --git a/FortranRuntime/lib/Runtime/file.cpp b/FortranRuntime/lib/Runtime/file.cpp
index b82f1c63e397f9..9988ced2b5c18c 100644
--- a/FortranRuntime/lib/Runtime/file.cpp
+++ b/FortranRuntime/lib/Runtime/file.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "file.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 #include "flang/Runtime/memory.h"
 #include "tools.h"
 #include <algorithm>
diff --git a/FortranRuntime/lib/Runtime/io-error.cpp b/FortranRuntime/lib/Runtime/io-error.cpp
index b14a30354d2347..30fabe5ba077fe 100644
--- a/FortranRuntime/lib/Runtime/io-error.cpp
+++ b/FortranRuntime/lib/Runtime/io-error.cpp
@@ -8,7 +8,7 @@
 
 #include "io-error.h"
 #include "config.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 #include "tools.h"
 #include <cerrno>
 #include <cstdarg>
diff --git a/FortranRuntime/lib/Runtime/stat.h b/FortranRuntime/lib/Runtime/stat.h
index eccd69024d726b..a679f9da16dd46 100644
--- a/FortranRuntime/lib/Runtime/stat.h
+++ b/FortranRuntime/lib/Runtime/stat.h
@@ -13,7 +13,7 @@
 #define FORTRAN_RUNTIME_STAT_H_
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Common/api-attrs.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 namespace Fortran::runtime {
 
 class Descriptor;
diff --git a/FortranRuntime/module/CMakeLists.txt b/FortranRuntime/module/CMakeLists.txt
deleted file mode 100644
index 9841cbd586b2df..00000000000000
--- a/FortranRuntime/module/CMakeLists.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-#===-- module/CMakeLists.txt -----------------------------------------------===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-
-set(module_sources
-  "__cuda_builtins.f90"
-  "__fortran_builtins.f90"
-  "__fortran_ieee_exceptions.f90"
-  "__fortran_type_info.f90"
-  # "cudadevice.f90" # TODO: -fc1 -xcuda
-  "ieee_arithmetic.f90"
-  "ieee_exceptions.f90"
-  "ieee_features.f90"
-  "iso_c_binding.f90"
-  "iso_fortran_env.f90"
-)
-
-set_source_files_properties(
- "iso_fortran_env.f90"
- PROPERTIES
-   COMPILE_FLAGS "-mmlir -ignore-module-only-builtins"
-)
-
-set_source_files_properties(
-  "__fortran_builtins.f90"
-   PROPERTIES
-     COMPILE_FLAGS "-mmlir -ignore-missing-type-desc"
-)
-
-# Requires PowerPC vector instructions
-if (LLVM_TARGET_TRIPLE MATCHES "(ppc|powerpc)(32|64)?(le|be)?\-.*")
-  list(APPEND module_sources
-    "__ppc_types.f90"
-    "__ppc_intrinsics.f90"
-    "mma.f90"
-  )
-endif ()
-
-add_fortranruntime_library(module_files OBJECT
-  ${module_sources}
-)
-
-# Usually, CMake will ignore dependencies from Fortran intrinsic modules. Since this is building those intrinsic modules themselves, tell CMake to not prune such dependencies.
-set_target_properties(module_files
-  PROPERTIES
-    Fortran_BUILDING_INSTRINSIC_MODULES ON
-)
-
-# The usual technique to install files in CMake is
-#
-#   install(TARGET <targetname> <artifacttype> ...)
-#
-# However, there is no <artifacttype> for Fortran modules. We have to derive the module file path individually.
-set(module_files "")
-foreach (f90file IN LISTS module_sources)
-   get_filename_component(base "${f90file}" NAME_WE )
-   list(APPEND module_files "${FORTRANRUNTIME_BUILD_INCLUDE_DIR}/flang/${base}.mod")
-endforeach ()
-install(FILES ${module_files} DESTINATION "${FORTRANRUNTIME_INSTALL_INCLUDE_DIR}/flang")
diff --git a/FortranRuntime/test/CMakeLists.txt b/FortranRuntime/test/CMakeLists.txt
index 1f822859089f3d..c10c487d48c410 100644
--- a/FortranRuntime/test/CMakeLists.txt
+++ b/FortranRuntime/test/CMakeLists.txt
@@ -41,17 +41,16 @@ if (TARGET FortranRuntimeUnitTests)
   )
 endif ()
 
-set(FORTRANRUNTIME_TEST_DEPENDS "")
-if (FORTRANRUNTIME_INCLUDE_TESTS)
-  if (TARGET FortranRuntimeUnitTests)
-    list(APPEND FORTRANRUNTIME_TEST_DEPENDS FortranRuntimeUnitTests)
-  endif()
-endif()
+set(FORTRANRUNTIME_TEST_DEPENDS
+    FortranRuntimeUnitTests
+    FortranRuntime.static
+  )
 
 add_custom_target(FortranRuntime-test-depends)
 set_target_properties(FortranRuntime-test-depends PROPERTIES FOLDER "Fortran Runtime/Meta")
+add_dependencies(FortranRuntime-test-depends ${FORTRANRUNTIME_TEST_DEPENDS})
 
-add_lit_testsuite(check-FortranRuntime "Running the Flang regression tests"
+add_lit_testsuite(check-FortranRuntime "Running the FortranRuntime regression tests"
   ${CMAKE_CURRENT_BINARY_DIR}
   DEPENDS ${FORTRANRUNTIME_TEST_DEPENDS}
 )
diff --git a/flang/test/Driver/ctofortran.f90 b/FortranRuntime/test/Driver/ctofortran.f90
similarity index 99%
rename from flang/test/Driver/ctofortran.f90
rename to FortranRuntime/test/Driver/ctofortran.f90
index 78eac32133b18e..a9cbf166bfe46c 100644
--- a/flang/test/Driver/ctofortran.f90
+++ b/FortranRuntime/test/Driver/ctofortran.f90
@@ -1,8 +1,9 @@
-! UNSUPPORTED: system-windows
 ! RUN: split-file %s %t
 ! RUN: chmod +x %t/runtest.sh
 ! RUN: %t/runtest.sh %t %t/ffile.f90 %t/cfile.c %flang | FileCheck %s
 
+! UNSUPPORTED: system-windows
+
 !--- ffile.f90
 program fmain
   interface
diff --git a/flang/test/Driver/exec.f90 b/FortranRuntime/test/Driver/exec.f90
similarity index 89%
rename from flang/test/Driver/exec.f90
rename to FortranRuntime/test/Driver/exec.f90
index fd174005ddf62a..07b42492b34d30 100644
--- a/flang/test/Driver/exec.f90
+++ b/FortranRuntime/test/Driver/exec.f90
@@ -1,4 +1,4 @@
-! UNSUPPORTED: system-windows
+! UNSUPPORTED? system-windows
 ! Verify that flang can correctly build executables.
 
 ! RUN: %flang %s -o %t
diff --git a/FortranRuntime/test/NonGtestUnit/lit.cfg.py b/FortranRuntime/test/NonGtestUnit/lit.cfg.py
index cd78ca76de503f..f807f2825a1bc7 100644
--- a/FortranRuntime/test/NonGtestUnit/lit.cfg.py
+++ b/FortranRuntime/test/NonGtestUnit/lit.cfg.py
@@ -8,7 +8,8 @@
 config.name = "FortranRuntime-OldUnit"
 
 # suffixes: A list of file extensions to treat as test files.
-config.suffixes = [".test"]
+# On Windows, ".exe" also matches the GTests and will execited redundantly.
+config.suffixes = [".test", ".exe"]
 
 # test_source_root: The root path where unit test binaries are located.
 config.test_source_root = os.path.join(config.fortranruntime_binary_dir, "unittests")
diff --git a/FortranRuntime/test/lit.cfg.py b/FortranRuntime/test/lit.cfg.py
index dd5124b8de4095..8aa1c6ab20e6ea 100644
--- a/FortranRuntime/test/lit.cfg.py
+++ b/FortranRuntime/test/lit.cfg.py
@@ -3,7 +3,7 @@
 import lit.util
 
 from lit.llvm import llvm_config
-from lit.llvm.subst import ToolSubst
+from lit.llvm.subst import ToolSubst, FindTool
 
 # Configuration file for the 'lit' test runner.
 
@@ -61,11 +61,19 @@
 if config.osx_sysroot:
     isysroot_flag = ["-isysroot", config.osx_sysroot]
 
+tools = [
+      ToolSubst(
+        "%flang",
+        command=FindTool("flang-new"),
+        extra_args=isysroot_flag,
+        unresolved="fatal",
+      )
+    ]
+
 # Define some variables to help us test that the flang runtime doesn't depend on
 # the C++ runtime libraries. For this we need a C compiler.
 libruntime = os.path.join(config.fortranruntime_build_lib_dir, "libFortranRuntime.a")
 include = os.path.join(config.fortranruntime_source_dir, "include")
-tools = []
 tools.append(
             ToolSubst(
                 "%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"
@@ -74,5 +82,7 @@
 tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
 tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
 
-llvm_config.add_tool_substitutions(tools)
+# Lwt tests find LLVM's standard tools (FileCheck, split-file, not, ...)
+llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True)
 
+llvm_config.add_tool_substitutions(tools)
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index d1aed058aad142..89e1c909d0f98e 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -21,6 +21,9 @@ endif ()
 add_custom_target(FortranRuntimeUnitTests)
 set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Tests")
 
+# Required because LLVMSupport is compiled with this option (by default).
+set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
+
 function(add_fortranruntime_unittest test_dirname)
   cmake_parse_arguments(ARG
     ""
@@ -29,7 +32,9 @@ function(add_fortranruntime_unittest test_dirname)
     ${ARGN})
 
   add_unittest(FortranRuntimeUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
+
   target_include_directories(${test_dirname} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  target_include_directories(${test_dirname} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
 endfunction()
 
@@ -47,10 +52,12 @@ function(add_fortranruntime_nongtest_unittest test_name)
   endif()
 
   add_executable(${test_name}${suffix} ${ARG_UNPARSED_ARGUMENTS})
-  target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
-  target_include_directories(${test_name}${suffix} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
   set_target_properties(${test_name}${suffix} PROPERTIES FOLDER "Fortran Runtime/Tests/Unit")
 
+  target_include_directories(${test_name}${suffix} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  target_include_directories(${test_name}${suffix} PRIVATE "${FLANG_SOURCE_DIR}/include")
+  target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
+
   if(NOT ARG_SLOW_TEST)
     add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
   endif()
diff --git a/FortranRuntime/unittests/Common/CMakeLists.txt b/FortranRuntime/unittests/Common/CMakeLists.txt
index f107036f19ed8d..5b3aebaf5f654a 100644
--- a/FortranRuntime/unittests/Common/CMakeLists.txt
+++ b/FortranRuntime/unittests/Common/CMakeLists.txt
@@ -9,5 +9,5 @@
 add_fortranruntime_unittest(FlangCommonTests
   FastIntSetTest.cpp
   LINK_LIBS
-    FortranRuntime.static
+    FortranRuntime.unittest
 )
diff --git a/FortranRuntime/unittests/Decimal/CMakeLists.txt b/FortranRuntime/unittests/Decimal/CMakeLists.txt
index 3d96da45c94148..033773049680f6 100644
--- a/FortranRuntime/unittests/Decimal/CMakeLists.txt
+++ b/FortranRuntime/unittests/Decimal/CMakeLists.txt
@@ -9,12 +9,12 @@
 add_fortranruntime_nongtest_unittest(quick-sanity-test
 quick-sanity-test.cpp
 LINK_LIBS
-  FortranRuntime.static
+  FortranRuntime.unittest
 )
 
 # This test is not run by default as it takes a long time to execute.
 add_fortranruntime_nongtest_unittest(thorough-test SLOW_TEST
 thorough-test.cpp
 LINK_LIBS
-  FortranRuntime.static
+  FortranRuntime.unittest
 )
diff --git a/FortranRuntime/unittests/Evaluate/CMakeLists.txt b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
index e6501f13a74e6b..567832a2f15bcb 100644
--- a/FortranRuntime/unittests/Evaluate/CMakeLists.txt
+++ b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
@@ -9,11 +9,11 @@
 add_fortranruntime_nongtest_unittest(reshape
 reshape.cpp
 LINK_LIBS
-  FortranRuntime.static
+  FortranRuntime.unittest
 )
 
 add_fortranruntime_nongtest_unittest(ISO-Fortran-binding
 ISO-Fortran-binding.cpp
 LINK_LIBS
-  FortranRuntime.static
+  FortranRuntime.unittest
 )
diff --git a/FortranRuntime/unittests/Runtime/CMakeLists.txt b/FortranRuntime/unittests/Runtime/CMakeLists.txt
index 1e966987c272a0..b4c0d7f86c1878 100644
--- a/FortranRuntime/unittests/Runtime/CMakeLists.txt
+++ b/FortranRuntime/unittests/Runtime/CMakeLists.txt
@@ -38,5 +38,5 @@ add_fortranruntime_unittest(FlangRuntimeTests
   TemporaryStack.cpp
   Transformational.cpp
 LINK_LIBS
-  FortranRuntime.static
+  FortranRuntime.unittest
 )
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 3619a8f4b81f08..aff656d74daa2f 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -290,11 +290,7 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
                                     ArgStringList &CmdArgs) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
          "can only add VS runtime library on Windows!");
-  // if -fno-fortran-main has been passed, skip linking Fortran_main.a
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-    CmdArgs.push_back(Args.MakeArgString(
-        "--dependent-lib=" + TC.getCompilerRTBasename(Args, "builtins")));
-  }
+
   unsigned RTOptionID = options::OPT__SLASH_MT;
   if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
     RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index 47517c5e7ab82f..827ed11e55001c 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -509,3 +509,17 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
     )
 endif()
 
+# Put ISO_Fortran_binding.h into the include files of the build area now
+# so that we can run tests before installing
+include(GetClangResourceDir)
+get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
+configure_file(
+  ${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
+  ${HEADER_BINARY_DIR}/ISO_Fortran_binding.h)
+
+# And also install it into the install area
+get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)
+install(
+  FILES include/flang/ISO_Fortran_binding.h
+  DESTINATION ${HEADER_INSTALL_DIR} )
+
diff --git a/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h b/flang/include/flang/ISO_Fortran_binding.h
similarity index 95%
rename from FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
rename to flang/include/flang/ISO_Fortran_binding.h
index 516355c01ec7d0..3361db27aa4517 100644
--- a/FortranRuntime/include/flang/Common/ISO_Fortran_binding.h
+++ b/flang/include/flang/ISO_Fortran_binding.h
@@ -1,13 +1,14 @@
-/*===-- include/flang/Common/ISO_Fortran_binding.h ------------------*- C -*-===
+/*===-- include/flang/ISO_Fortran_binding.h -----------------------*- C++ -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===----------------------------------------------------------------------===*/
+ * ===-----------------------------------------------------------------------===
+ */
 
-#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_
-#define FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_
+#ifndef CFI_ISO_FORTRAN_BINDING_H_
+#define CFI_ISO_FORTRAN_BINDING_H_
 
 /* When this header is included into the compiler and runtime implementations,
  * it does so by means of a wrapper header that establishes namespaces and
@@ -206,4 +207,4 @@ RT_API_ATTRS int CFI_setpointer(
 } // extern "C"
 #endif
 
-#endif /* FORTRAN_COMMON_ISO_FORTRAN_BINDING_H_ */
+#endif /* CFI_ISO_FORTRAN_BINDING_H_ */
diff --git a/flang/lib/CMakeLists.txt b/flang/lib/CMakeLists.txt
index d29da136ea3eda..0ab7d1c888df96 100644
--- a/flang/lib/CMakeLists.txt
+++ b/flang/lib/CMakeLists.txt
@@ -1,6 +1,3 @@
-
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../FortranRuntime/include")
-
 add_subdirectory(Common)
 add_subdirectory(Support)
 add_subdirectory(Evaluate)
diff --git a/flang/lib/Evaluate/fold-logical.cpp b/flang/lib/Evaluate/fold-logical.cpp
index ee6655f8387177..3c0b85cc3480b2 100644
--- a/flang/lib/Evaluate/fold-logical.cpp
+++ b/flang/lib/Evaluate/fold-logical.cpp
@@ -10,7 +10,7 @@
 #include "fold-matmul.h"
 #include "fold-reduction.h"
 #include "flang/Evaluate/check-expression.h"
-#include "flang/Runtime/magic-numbers.h"
+#include "flang/Common/magic-numbers.h"
 
 namespace Fortran::evaluate {
 
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index 460923bbccc27a..b98ab3e6999655 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -68,11 +68,6 @@
 /// a call is generated for it. LLVM intrinsics are handled as a math
 /// runtime library here.
 
-static llvm::cl::opt<bool> ignoreModuleOnlyBuiltins(
-    "ignore-module-only-builtins",
-    llvm::cl::desc("ignore failures from __builtin_numeric_storage_size when compiling FortranRuntime"),
-    llvm::cl::init(false), llvm::cl::Hidden);
-
 namespace fir {
 
 fir::ExtendedValue getAbsentIntrinsicArgument() { return fir::UnboxedValue{}; }
@@ -507,7 +502,6 @@ static constexpr IntrinsicHandler handlers[]{
      /*isElemental=*/false},
     {"not", &I::genNot},
     {"null", &I::genNull, {{{"mold", asInquired}}}, /*isElemental=*/false},
-    {"numeric_storage_size", &I::genNumericStorageSize},
     {"pack",
      &I::genPack,
      {{{"array", asBox},
@@ -7224,17 +7218,6 @@ IntrinsicLibrary::genVerify(mlir::Type resultType,
   return readAndAddCleanUp(resultMutableBox, resultType, "VERIFY");
 }
 
-fir::ExtendedValue IntrinsicLibrary:: genNumericStorageSize(mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args) {
-      assert(args.empty() );
-     
-      if (!ignoreModuleOnlyBuiltins) {
-   fir::emitFatalError(loc, "__builtin_numeric_storage_size is for internal use only. Use NUMERIC_STORAGE_SIZE from ISO_FORTRAN_ENV module instead.");
-  return {};
-      }
-
-      return builder.createIntegerConstant(loc, resultType  , 32 );
-    }
-
 /// Process calls to Minloc, Maxloc intrinsic functions
 template <typename FN, typename FD>
 fir::ExtendedValue
diff --git a/FortranRuntime/module/.clang-format b/flang/module/.clang-format
similarity index 100%
rename from FortranRuntime/module/.clang-format
rename to flang/module/.clang-format
diff --git a/FortranRuntime/module/__cuda_builtins.f90 b/flang/module/__cuda_builtins.f90
similarity index 100%
rename from FortranRuntime/module/__cuda_builtins.f90
rename to flang/module/__cuda_builtins.f90
diff --git a/FortranRuntime/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90
similarity index 99%
rename from FortranRuntime/module/__fortran_builtins.f90
rename to flang/module/__fortran_builtins.f90
index d1d4a639e70d72..fe91305c836ff4 100644
--- a/FortranRuntime/module/__fortran_builtins.f90
+++ b/flang/module/__fortran_builtins.f90
@@ -6,7 +6,7 @@
 !
 !===------------------------------------------------------------------------===!
 
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
 
 ! These naming shenanigans prevent names from Fortran intrinsic modules
 ! from being usable on INTRINSIC statements, and force the program
diff --git a/FortranRuntime/module/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90
similarity index 98%
rename from FortranRuntime/module/__fortran_ieee_exceptions.f90
rename to flang/module/__fortran_ieee_exceptions.f90
index 6691012eda238a..56f79a473b556a 100644
--- a/FortranRuntime/module/__fortran_ieee_exceptions.f90
+++ b/flang/module/__fortran_ieee_exceptions.f90
@@ -11,7 +11,7 @@
 ! here under another name so that IEEE_ARITHMETIC can USE it and export its
 ! declarations without clashing with a non-intrinsic module in a program.
 
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
 
 module __fortran_ieee_exceptions
   use __fortran_builtins, only: &
diff --git a/FortranRuntime/module/__fortran_type_info.f90 b/flang/module/__fortran_type_info.f90
similarity index 100%
rename from FortranRuntime/module/__fortran_type_info.f90
rename to flang/module/__fortran_type_info.f90
diff --git a/FortranRuntime/module/__ppc_intrinsics.f90 b/flang/module/__ppc_intrinsics.f90
similarity index 100%
rename from FortranRuntime/module/__ppc_intrinsics.f90
rename to flang/module/__ppc_intrinsics.f90
diff --git a/FortranRuntime/module/__ppc_types.f90 b/flang/module/__ppc_types.f90
similarity index 100%
rename from FortranRuntime/module/__ppc_types.f90
rename to flang/module/__ppc_types.f90
diff --git a/FortranRuntime/module/cudadevice.f90 b/flang/module/cudadevice.f90
similarity index 96%
rename from FortranRuntime/module/cudadevice.f90
rename to flang/module/cudadevice.f90
index dd487f6ed1ffee..0224ecfdde7c60 100644
--- a/FortranRuntime/module/cudadevice.f90
+++ b/flang/module/cudadevice.f90
@@ -1,4 +1,4 @@
-!===-- module/cudadevice.f90 -----------------------------------------------===!
+!===-- module/cudedevice.f90 -----------------------------------------------===!
 !
 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 ! See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90
similarity index 99%
rename from FortranRuntime/module/ieee_arithmetic.f90
rename to flang/module/ieee_arithmetic.f90
index 7eaa7db55af9f8..667374d0660806 100644
--- a/FortranRuntime/module/ieee_arithmetic.f90
+++ b/flang/module/ieee_arithmetic.f90
@@ -8,7 +8,7 @@
 
 ! Fortran 2018 Clause 17
 
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
 
 module ieee_arithmetic
   ! F18 Clause 17.1p1:
diff --git a/FortranRuntime/module/ieee_exceptions.f90 b/flang/module/ieee_exceptions.f90
similarity index 100%
rename from FortranRuntime/module/ieee_exceptions.f90
rename to flang/module/ieee_exceptions.f90
diff --git a/FortranRuntime/module/ieee_features.f90 b/flang/module/ieee_features.f90
similarity index 100%
rename from FortranRuntime/module/ieee_features.f90
rename to flang/module/ieee_features.f90
diff --git a/FortranRuntime/module/iso_c_binding.f90 b/flang/module/iso_c_binding.f90
similarity index 100%
rename from FortranRuntime/module/iso_c_binding.f90
rename to flang/module/iso_c_binding.f90
diff --git a/FortranRuntime/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90
similarity index 98%
rename from FortranRuntime/module/iso_fortran_env.f90
rename to flang/module/iso_fortran_env.f90
index 4e575b422c2a04..d1f956b6b86408 100644
--- a/FortranRuntime/module/iso_fortran_env.f90
+++ b/flang/module/iso_fortran_env.f90
@@ -8,7 +8,7 @@
 
 ! See Fortran 2023, subclause 16.10.2
 
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
 
 module iso_fortran_env
 
diff --git a/FortranRuntime/module/mma.f90 b/flang/module/mma.f90
similarity index 98%
rename from FortranRuntime/module/mma.f90
rename to flang/module/mma.f90
index 14aab69035a334..4c41822e000a3d 100644
--- a/FortranRuntime/module/mma.f90
+++ b/flang/module/mma.f90
@@ -55,18 +55,9 @@ pure __vector_pair function func_vpi0vp(arg1, arg2); \
     !dir$ ignore_tkr(r) arg2; \
   end function;
 
-! FIXME: Potential Flang bug: combining multiple of those on a single line breaks after preprocessing as an explicit step as done by CMake
-! Line counting is also wrong
-  FUNC_VPI0VI(1)
-  FUNC_VPI0VI(2)
-  FUNC_VPI0VI(4)
-  FUNC_VPI0VI(8)
-  FUNC_VPI0VU(1)
-  FUNC_VPI0VU(2)
-  FUNC_VPI0VU(4)
-  FUNC_VPI0VU(8)
-  FUNC_VPI0VR(4)
-  FUNC_VPI0VR(8)
+  FUNC_VPI0VI(1) FUNC_VPI0VI(2) FUNC_VPI0VI(4) FUNC_VPI0VI(8)
+  FUNC_VPI0VU(1) FUNC_VPI0VU(2) FUNC_VPI0VU(4) FUNC_VPI0VU(8)
+  FUNC_VPI0VR(4) FUNC_VPI0VR(8)
   FUNC_VPI0VP
 
 #undef FUNC_VPI0VP
@@ -153,26 +144,14 @@ elemental subroutine sub_vpvr##VKIND##vr##VKIND(pair, arg1, arg2); \
     vector(real(VKIND)), intent(in) :: arg1, arg2; \
   end subroutine ;
 
-  ELEM_SUB_VPVIVI(1)
-  ELEM_SUB_VPVIVI(2)
-  ELEM_SUB_VPVIVI(4)
-  ELEM_SUB_VPVIVI(8)
-  ELEM_SUB_VPVUVU(1)
-  ELEM_SUB_VPVUVU(2)
-  ELEM_SUB_VPVUVU(4)
-  ELEM_SUB_VPVUVU(8)
-  ELEM_SUB_VPVRVR(4)
-  ELEM_SUB_VPVRVR(8)
-  SUB_VPI0VI(1)
-  SUB_VPI0VI(2)
-  SUB_VPI0VI(4)
-  SUB_VPI0VI(8)
-  SUB_VPI0VU(1)
-  SUB_VPI0VU(2)
-  SUB_VPI0VU(4)
-  SUB_VPI0VU(8)
-  SUB_VPI0VR(4)
-  SUB_VPI0VR(8)
+  ELEM_SUB_VPVIVI(1) ELEM_SUB_VPVIVI(2)
+  ELEM_SUB_VPVIVI(4) ELEM_SUB_VPVIVI(8)
+  ELEM_SUB_VPVUVU(1) ELEM_SUB_VPVUVU(2)
+  ELEM_SUB_VPVUVU(4) ELEM_SUB_VPVUVU(8)
+  ELEM_SUB_VPVRVR(4) ELEM_SUB_VPVRVR(8)
+  SUB_VPI0VI(1) SUB_VPI0VI(2) SUB_VPI0VI(4) SUB_VPI0VI(8)
+  SUB_VPI0VU(1) SUB_VPI0VU(2) SUB_VPI0VU(4) SUB_VPI0VU(8)
+  SUB_VPI0VR(4) SUB_VPI0VR(8)
 
 #undef ELEM_SUB_VPVIVI
 #undef ELEM_SUB_VPVUVU
diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt
index 03fa79979470ee..c121fda70d16f0 100644
--- a/flang/test/CMakeLists.txt
+++ b/flang/test/CMakeLists.txt
@@ -63,6 +63,7 @@ set(FLANG_TEST_DEPENDS
   FileCheck
   count
   not
+  module_files
   fir-opt
   tco
   bbc
diff --git a/flang/test/Driver/msvc-dependent-lib-flags.f90 b/flang/test/Driver/msvc-dependent-lib-flags.f90
index befe61fdadcd14..e7fa63548fa840 100644
--- a/flang/test/Driver/msvc-dependent-lib-flags.f90
+++ b/flang/test/Driver/msvc-dependent-lib-flags.f90
@@ -4,27 +4,23 @@
 ! RUN: %flang -### --target=aarch64-windows-msvc -resource-dir=%S/Inputs/resource_dir -fms-runtime-lib=dll_dbg %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC-DLL-DEBUG
 
 ! MSVC: -fc1
-! MSVC-SAME: --dependent-lib=clang_rt.builtins.lib
 ! MSVC-SAME: -D_MT
 ! MSVC-SAME: --dependent-lib=libcmt
 ! MSVC-SAME: --dependent-lib=FortranRuntime.static.lib
 
 ! MSVC-DEBUG: -fc1
-! MSVC-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
 ! MSVC-DEBUG-SAME: -D_MT
 ! MSVC-DEBUG-SAME: -D_DEBUG
 ! MSVC-DEBUG-SAME: --dependent-lib=libcmtd
 ! MSVC-DEBUG-SAME: --dependent-lib=FortranRuntime.static_dbg.lib
 
 ! MSVC-DLL: -fc1
-! MSVC-DLL-SAME: --dependent-lib=clang_rt.builtins.lib
 ! MSVC-DLL-SAME: -D_MT
 ! MSVC-DLL-SAME: -D_DLL
 ! MSVC-DLL-SAME: --dependent-lib=msvcrt
 ! MSVC-DLL-SAME: --dependent-lib=FortranRuntime.dynamic.lib
 
 ! MSVC-DLL-DEBUG: -fc1
-! MSVC-DLL-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
 ! MSVC-DLL-DEBUG-SAME: -D_MT
 ! MSVC-DLL-DEBUG-SAME: -D_DEBUG
 ! MSVC-DLL-DEBUG-SAME: -D_DLL
diff --git a/flang/tools/CMakeLists.txt b/flang/tools/CMakeLists.txt
index c9f00c8cc6dbd6..337545ae0d4d7a 100644
--- a/flang/tools/CMakeLists.txt
+++ b/flang/tools/CMakeLists.txt
@@ -7,6 +7,7 @@
 #===------------------------------------------------------------------------===#
 
 add_subdirectory(bbc)
+add_subdirectory(f18)
 add_subdirectory(flang-driver)
 add_subdirectory(tco)
 add_subdirectory(f18-parse-demo)
diff --git a/flang/tools/bbc/CMakeLists.txt b/flang/tools/bbc/CMakeLists.txt
index 68e4b59fd6eec5..69316d4dc61de3 100644
--- a/flang/tools/bbc/CMakeLists.txt
+++ b/flang/tools/bbc/CMakeLists.txt
@@ -6,7 +6,6 @@ AllTargetsInfos
 TargetParser
 )
 
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(bbc bbc.cpp
 DEPENDS
 FIROptCodeGenPassIncGen
diff --git a/flang/tools/f18-parse-demo/CMakeLists.txt b/flang/tools/f18-parse-demo/CMakeLists.txt
index 34f1bf048ad849..df1f1d24a55e51 100644
--- a/flang/tools/f18-parse-demo/CMakeLists.txt
+++ b/flang/tools/f18-parse-demo/CMakeLists.txt
@@ -1,5 +1,3 @@
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
-
 set(LLVM_LINK_COMPONENTS
   FrontendOpenACC
   FrontendOpenMP
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
new file mode 100644
index 00000000000000..5f749a433f05cd
--- /dev/null
+++ b/flang/tools/f18/CMakeLists.txt
@@ -0,0 +1,161 @@
+set(LLVM_LINK_COMPONENTS
+  FrontendOpenACC
+  FrontendOpenMP
+  Support
+  )
+
+# Define the list of Fortran module files for which it is
+# sufficient to generate the module file via -fsyntax-only.
+set(MODULES_WITHOUT_IMPLEMENTATION
+  "__fortran_builtins"
+  "__fortran_ieee_exceptions"
+  "__fortran_type_info"
+  "__ppc_types"
+  "__ppc_intrinsics"
+  "mma"
+  "__cuda_builtins"
+  "cudadevice"
+  "ieee_arithmetic"
+  "ieee_exceptions"
+  "ieee_features"
+  "iso_c_binding"
+  "iso_fortran_env"
+  "iso_fortran_env_impl"
+)
+
+set(MODULES ${MODULES_WITHOUT_IMPLEMENTATION})
+
+# Check if 128-bit float computations can be done via long double.
+check_cxx_source_compiles(
+  "#include <cfloat>
+   #if LDBL_MANT_DIG != 113
+   #error LDBL_MANT_DIG != 113
+   #endif
+   int main() { return 0; }
+  "
+  HAVE_LDBL_MANT_DIG_113)
+
+# Figure out whether we can support REAL(KIND=16)
+if (FLANG_RUNTIME_F128_MATH_LIB)
+  set(FLANG_SUPPORT_R16 "1")
+elseif (HAVE_LDBL_MANT_DIG_113)
+  set(FLANG_SUPPORT_R16 "1")
+else()
+  set(FLANG_SUPPORT_R16 "0")
+endif()
+
+# Init variable to hold extra object files coming from the Fortran modules;
+# these module files will be contributed from the CMakeLists in flang/tools/f18.
+set(module_objects "")
+
+# Create module files directly from the top-level module source directory.
+# If CMAKE_CROSSCOMPILING, then the newly built flang-new executable was
+# cross compiled, and thus can't be executed on the build system and thus
+# can't be used for generating module files.
+if (NOT CMAKE_CROSSCOMPILING)
+  foreach(filename ${MODULES})
+    set(depends "")
+    set(opts "")
+    set(sourcepath "${FLANG_SOURCE_DIR}/module/${filename}.f90")
+    set(modpath "${FLANG_INTRINSIC_MODULES_DIR}/${filename}.mod")
+    if(${filename} STREQUAL "__fortran_builtins" OR
+       ${filename} STREQUAL "__ppc_types")
+    elseif(${filename} STREQUAL "__ppc_intrinsics" OR
+           ${filename} STREQUAL "mma")
+      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__ppc_types.mod)
+    elseif(${filename} STREQUAL "cudadevice")
+      set(opts -fc1 -xcuda)
+      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__cuda_builtins.mod)
+    else()
+      set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
+      if(${filename} STREQUAL "iso_fortran_env_impl")
+        set(sourcepath "${FLANG_SOURCE_DIR}/../FortranRuntime/lib/Runtime/${filename}.f90")
+      endif()
+      if(${filename} STREQUAL "iso_fortran_env")
+        set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/iso_fortran_env_impl.mod)
+      endif()
+      if(${filename} STREQUAL "ieee_arithmetic" OR
+         ${filename} STREQUAL "ieee_exceptions")
+        set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_ieee_exceptions.mod)
+      endif()
+    endif()
+    if(NOT ${filename} STREQUAL "__fortran_type_info" AND NOT ${filename} STREQUAL "__fortran_builtins")
+      set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_type_info.mod)
+    endif()
+
+    # The module contains PPC vector types that needs the PPC target.
+    if(${filename} STREQUAL "__ppc_intrinsics" OR
+       ${filename} STREQUAL "mma")
+      if (PowerPC IN_LIST LLVM_TARGETS_TO_BUILD)
+        set(opts "--target=ppc64le")
+      else()
+        # Do not compile PPC module if the target is not available.
+        continue()
+      endif()
+    endif()
+
+    set(decls "")
+    if (FLANG_SUPPORT_R16)
+      set(decls "-DFLANG_SUPPORT_R16")
+    endif()
+
+    # Some modules have an implementation part that needs to be added to the
+    # FortranRuntime library.
+    set(compile_with "-fsyntax-only")
+    set(object_output "")
+    set(include_in_link FALSE)
+
+    # TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
+    add_custom_command(OUTPUT ${modpath} ${object_output}
+      COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
+      COMMAND flang-new ${opts} ${decls} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
+        ${sourcepath}
+      DEPENDS flang-new ${sourcepath} ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
+    )
+    list(APPEND MODULE_FILES "${modpath}")
+    install(FILES "${modpath}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
+
+    # If a module has been compiled into an object file, add the file to
+    # the link line for the FortranRuntime library.
+    if(include_in_link)
+      list(APPEND module_objects ${object_output})
+    endif()
+  endforeach()
+
+  # Special case for omp_lib.mod, because its source comes from openmp/runtime/src/include.
+  # It also produces two module files: omp_lib.mod and omp_lib_kinds.mod.  Compile these
+  # files only if OpenMP support has been configured.
+  if (LLVM_TOOL_OPENMP_BUILD)
+    message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.mod")
+    set(base ${FLANG_INTRINSIC_MODULES_DIR}/omp_lib)
+    add_custom_command(OUTPUT ${base}.mod ${base}_kinds.mod
+      COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
+      COMMAND flang-new -cpp -fsyntax-only ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
+        ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90
+      DEPENDS flang-new ${FLANG_INTRINSIC_MODULES_DIR}/iso_c_binding.mod ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90 ${depends}
+    )
+    add_custom_command(OUTPUT ${base}.f18.mod
+      DEPENDS ${base}.mod
+      COMMAND ${CMAKE_COMMAND} -E copy ${base}.mod ${base}.f18.mod)
+      add_custom_command(OUTPUT ${base}_kinds.f18.mod
+        DEPENDS ${base}.mod
+        COMMAND ${CMAKE_COMMAND} -E copy ${base}_kinds.mod ${base}_kinds.f18.mod)
+    list(APPEND MODULE_FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod)
+    install(FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
+  else()
+    message(STATUS "Not building omp_lib.mod, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
+  endif()
+endif()
+
+add_custom_target(module_files ALL DEPENDS ${MODULE_FILES})
+set_target_properties(module_files PROPERTIES FOLDER "Flang/Resources")
+
+# TODO Move this to a more suitable location
+# Copy the generated omp_lib.h header file, if OpenMP support has been configured.
+if (LLVM_TOOL_OPENMP_BUILD)
+  message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.h")
+  file(COPY ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)
+  install(FILES ${CMAKE_BINARY_DIR}/include/flang/OpenMP/omp_lib.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang/OpenMP")
+else()
+  message(STATUS "Not copying omp_lib.h, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
+endif()
diff --git a/flang/tools/f18/dump.cpp b/flang/tools/f18/dump.cpp
new file mode 100644
index 00000000000000..f11b5aedf4c6af
--- /dev/null
+++ b/flang/tools/f18/dump.cpp
@@ -0,0 +1,42 @@
+//===-- tools/f18/dump.cpp ------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// This file defines Dump routines available for calling from the debugger.
+// Each is based on operator<< for that type. There are overloadings for
+// reference and pointer, and for dumping to a provided raw_ostream or errs().
+
+#ifdef DEBUGF18
+
+#include "llvm/Support/raw_ostream.h"
+
+#define DEFINE_DUMP(ns, name) \
+  namespace ns { \
+  class name; \
+  llvm::raw_ostream &operator<<(llvm::raw_ostream &, const name &); \
+  } \
+  void Dump(llvm::raw_ostream &os, const ns::name &x) { os << x << '\n'; } \
+  void Dump(llvm::raw_ostream &os, const ns::name *x) { \
+    if (x == nullptr) \
+      os << "null\n"; \
+    else \
+      Dump(os, *x); \
+  } \
+  void Dump(const ns::name &x) { Dump(llvm::errs(), x); } \
+  void Dump(const ns::name *x) { Dump(llvm::errs(), *x); }
+
+namespace Fortran {
+DEFINE_DUMP(parser, Name)
+DEFINE_DUMP(parser, CharBlock)
+DEFINE_DUMP(semantics, Symbol)
+DEFINE_DUMP(semantics, Scope)
+DEFINE_DUMP(semantics, IntrinsicTypeSpec)
+DEFINE_DUMP(semantics, DerivedTypeSpec)
+DEFINE_DUMP(semantics, DeclTypeSpec)
+} // namespace Fortran
+
+#endif
diff --git a/flang/tools/fir-opt/CMakeLists.txt b/flang/tools/fir-opt/CMakeLists.txt
index 3723ac5d7b37d2..4c6dbf7d9c8c37 100644
--- a/flang/tools/fir-opt/CMakeLists.txt
+++ b/flang/tools/fir-opt/CMakeLists.txt
@@ -1,4 +1,3 @@
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(fir-opt fir-opt.cpp)
 llvm_update_compile_flags(fir-opt)
 get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
@@ -20,7 +19,6 @@ target_link_libraries(fir-opt PRIVATE
   FIRCodeGen
   HLFIRDialect
   HLFIRTransforms
-  FortranCommon # FIXME: Dependency of something else
   FlangOpenMPTransforms
   FIRAnalysis
   ${test_libs}
diff --git a/flang/tools/flang-driver/CMakeLists.txt b/flang/tools/flang-driver/CMakeLists.txt
index a2ad672b9d48c9..9f33cdfe3fa90f 100644
--- a/flang/tools/flang-driver/CMakeLists.txt
+++ b/flang/tools/flang-driver/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Infrastructure to build flang driver entry point. Flang driver depends on
 # LLVM libraries.
 
-message("include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include)")
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
-
 # Set your project compile flags.
 link_directories(${LLVM_LIBRARY_DIR})
 
diff --git a/flang/tools/tco/CMakeLists.txt b/flang/tools/tco/CMakeLists.txt
index f308fb6acbe98b..698a398547c773 100644
--- a/flang/tools/tco/CMakeLists.txt
+++ b/flang/tools/tco/CMakeLists.txt
@@ -2,7 +2,6 @@ set(LLVM_LINK_COMPONENTS
   Passes
 )
 
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_flang_tool(tco tco.cpp)
 llvm_update_compile_flags(tco)
 get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
@@ -18,7 +17,6 @@ target_link_libraries(tco PRIVATE
   FIRBuilder
   HLFIRDialect
   HLFIRTransforms
-  FortranCommon
   FlangOpenMPTransforms
   ${dialect_libs}
   ${extension_libs}

>From 6307e77e75a4081fee75ff295d0fae70a255df6e Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 1 Oct 2024 17:26:34 +0200
Subject: [PATCH 04/32] python-format

---
 FortranRuntime/test/lit.cfg.py | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/FortranRuntime/test/lit.cfg.py b/FortranRuntime/test/lit.cfg.py
index 8aa1c6ab20e6ea..a9f47f142bb884 100644
--- a/FortranRuntime/test/lit.cfg.py
+++ b/FortranRuntime/test/lit.cfg.py
@@ -52,7 +52,7 @@
 # test_source_root: The root path where tests are located.
 config.test_source_root = os.path.dirname(__file__)
 
-# test_exec_root: The root path where tests should be run. 
+# test_exec_root: The root path where tests should be run.
 # lit writes a '.lit_test_times.txt' file into this directory.
 config.test_exec_root = config.fortranruntime_binary_test_dir
 
@@ -62,23 +62,21 @@
     isysroot_flag = ["-isysroot", config.osx_sysroot]
 
 tools = [
-      ToolSubst(
+    ToolSubst(
         "%flang",
         command=FindTool("flang-new"),
         extra_args=isysroot_flag,
         unresolved="fatal",
-      )
-    ]
+    )
+]
 
 # Define some variables to help us test that the flang runtime doesn't depend on
 # the C++ runtime libraries. For this we need a C compiler.
 libruntime = os.path.join(config.fortranruntime_build_lib_dir, "libFortranRuntime.a")
 include = os.path.join(config.fortranruntime_source_dir, "include")
 tools.append(
-            ToolSubst(
-                "%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"
-            )
-        )
+    ToolSubst("%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal")
+)
 tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
 tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
 

>From 20fc7c5798c825580c485921dc037b75d22a9270 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 1 Oct 2024 23:00:29 +0200
Subject: [PATCH 05/32] Add .clang-tidy

---
 FortranRuntime/.clang-tidy | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 FortranRuntime/.clang-tidy

diff --git a/FortranRuntime/.clang-tidy b/FortranRuntime/.clang-tidy
new file mode 100644
index 00000000000000..ee3a0ab2201bf3
--- /dev/null
+++ b/FortranRuntime/.clang-tidy
@@ -0,0 +1,2 @@
+Checks: '-llvm-include-order,readability-braces-around-statements,-readability-identifier-naming,-clang-diagnostic-*'
+InheritParentConfig: true

>From 871c6900569bb92a652a447b1b481b7627cc50d4 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 2 Oct 2024 12:24:01 +0200
Subject: [PATCH 06/32] Common CMake code

---
 FortranRuntime/CMakeLists.txt                 | 52 +------------------
 .../cmake/modules/AddFortranRuntime.cmake     |  9 +++-
 .../cmake/modules/FlangCommon.cmake           | 31 +++++++++++
 FortranRuntime/lib/Runtime/CMakeLists.txt     | 17 ------
 flang/CMakeLists.txt                          | 10 +---
 5 files changed, 41 insertions(+), 78 deletions(-)
 create mode 100644 FortranRuntime/cmake/modules/FlangCommon.cmake

diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
index 5c20b496dea821..bda76dd87c0d7a 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/FortranRuntime/CMakeLists.txt
@@ -23,6 +23,7 @@ list(APPEND CMAKE_MODULE_PATH
   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
   )
 include(AddFortranRuntime)
+include(FlangCommon)
 
 
 ############################
@@ -65,42 +66,16 @@ option(FORTRANRUNTIME_INCLUDE_TESTS
          "Generate build targets for the FortranRuntime unit tests."
          ${LLVM_INCLUDE_TESTS})
 
-# The out of tree builds of the compiler and the Fortran runtime
-# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
-# to be composable. Failure to synchronize this setting may result
-# in linking errors or fatal failures in F128 runtime functions.
-set(FORTRARUNTIME_F128_MATH_LIB "" CACHE STRING
-  "Specifies the target library used for implementing IEEE-754 128-bit float \
-  math in F18 runtime, e.g. it might be libquadmath for targets where \
-  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
-  is mapped to long double, etc."
-  )
-if (FLANG_RUNTIME_F128_MATH_LIB)
-  add_compile_definitions(
-    FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}"
-    )
-endif()
-
 option(FLANG_EXPERIMENTAL_CUDA_RUNTIME "Compile Fortran runtime as CUDA sources (experimental)" OFF)
 if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
   message(FATAL_ERROOR "FLANG_EXPERIMENTAL_CUDA_RUNTIME currently not supported")
 endif()
 
 
-
-
 ########################
 # System Introspection #
 ########################
 
-include(TestBigEndian)
-test_big_endian(IS_BIGENDIAN)
-if (IS_BIGENDIAN)
-  add_compile_definitions(FLANG_BIG_ENDIAN=1)
-else ()
-  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
-endif ()
-
 include(CheckCXXSymbolExists)
 include(CheckCXXSourceCompiles)
 check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
@@ -114,26 +89,6 @@ check_cxx_source_compiles(
   "
   HAVE_DECL_STRERROR_S)
 
-# Check if 128-bit float computations can be done via long double
-check_cxx_source_compiles(
-  "#include <cfloat>
-   #if LDBL_MANT_DIG != 113
-   #error LDBL_MANT_DIG != 113
-   #endif
-   int main() { return 0; }
-  "
-  HAVE_LDBL_MANT_DIG_113)
-
-# Check if 128-bit float computations can be done via long double
-check_cxx_source_compiles(
-  "#include <cfloat>
-   #if LDBL_MANT_DIG != 113
-   #error LDBL_MANT_DIG != 113
-   #endif
-   int main() { return 0; }
-  "
-  HAVE_LDBL_MANT_DIG_113)
-
 # Search for clang_rt.builtins
 execute_process(
     COMMAND "${CMAKE_CXX_COMPILER}" "-print-libgcc-file-name" "-rtlib=compiler-rt"
@@ -156,11 +111,6 @@ endif ()
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
 set(CMAKE_CXX_STANDARD_REQUIRED YES)
 
-# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
-# to avoid an unwanted dependency on libstdc++/libc++.so.
-add_definitions(-U_GLIBCXX_ASSERTIONS)
-add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
-
 configure_file(cmake/config.h.cmake.in config.h)
 
 
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
index e4dff982e6deea..5410cb769754b5 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -65,9 +65,9 @@ function (add_fortranruntime_library name)
 
   target_compile_features(${name} PRIVATE cxx_std_17)
   if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
-    target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
+    target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
   elseif (MSVC)
-    target_compile_options (${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
+    target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
   endif ()
 
   # FortranRuntime's public headers
@@ -79,6 +79,11 @@ function (add_fortranruntime_library name)
   # For configured config.h for be found
   target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")
 
+  # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
+  # to avoid an unwanted dependency on libstdc++/libc++.so.
+  target_compile_definitions(${name} PRIVATE -U_GLIBCXX_ASSERTIONS)
+  target_compile_definitions(${name} PRIVATE -U_LIBCPP_ENABLE_ASSERTIONS)
+
   # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc does not support.
   # We are injecting a dependency to Compiler-RT where these are implemented.
   if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FORTRANRUNTIME_LIBCALL)
diff --git a/FortranRuntime/cmake/modules/FlangCommon.cmake b/FortranRuntime/cmake/modules/FlangCommon.cmake
new file mode 100644
index 00000000000000..34c91048f47887
--- /dev/null
+++ b/FortranRuntime/cmake/modules/FlangCommon.cmake
@@ -0,0 +1,31 @@
+# The out of tree builds of the compiler and the Fortran runtime
+# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
+# to be composable. Failure to synchronize this setting may result
+# in linking errors or fatal failures in F128 runtime functions.
+set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
+  "Specifies the target library used for implementing IEEE-754 128-bit float \
+  math in F18 runtime, e.g. it might be libquadmath for targets where \
+  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
+  is mapped to long double, etc."
+  )
+if (FLANG_RUNTIME_F128_MATH_LIB)
+  add_compile_definitions(FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}")
+endif()
+
+# Check if 128-bit float computations can be done via long double
+check_cxx_source_compiles(
+  "#include <cfloat>
+   #if LDBL_MANT_DIG != 113
+   #error LDBL_MANT_DIG != 113
+   #endif
+   int main() { return 0; }
+  "
+  HAVE_LDBL_MANT_DIG_113)
+
+include(TestBigEndian)
+test_big_endian(IS_BIGENDIAN)
+if (IS_BIGENDIAN)
+  add_compile_definitions(FLANG_BIG_ENDIAN=1)
+else ()
+  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
+endif ()
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 5a0cc2ff14383a..1938ed6e21f54a 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -153,21 +153,4 @@ else()
       FortranRuntime.dynamic
       FortranRuntime.dynamic_dbg
     )
-
-  if (MSVC)
-    # The Fortran files compiled with flang-new generate libcall functions such as `__udivti3`
-    # Add LLVM_ENABLE_RUNTIMES=compiler-rt for it to be available during the runtimes build
-    # FIXME: Can embed linker command --dependent-lib into object files as already done with FortranRuntime.<mode>.lib
-    #if (NOT TARGET clang_rt.builtins-x86_64)
-    #  message(WARNING
-    #    "compiler-rt needed when compiling with msvc\n"
-    #    "Flang/LLVM will emit code that calls into libgcc/compiler-rt, but using the MSVC linker will only link Microsoft's CRT automatically\n"
-    #    "Add compiler-rt to LLVM_ENABLE_RUNTIMES to fix"
-    #  )
-    #endif ()
-    #target_link_libraries(FortranRuntime.static PUBLIC clang_rt.builtins-x86_64)
-    #target_link_libraries(FortranRuntime.static_dbg PUBLIC clang_rt.builtins-x86_64)
-    #target_link_libraries(FortranRuntime.dynamic PUBLIC clang_rt.builtins-x86_64)
-    #target_link_libraries(FortranRuntime.dynamic_dbg PUBLIC clang_rt.builtins-x86_64)
-  endif ()
 endif()
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index 827ed11e55001c..ac189de2386b16 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -253,6 +253,7 @@ include_directories(BEFORE
 # Add Flang-centric modules to cmake path.
 list(INSERT CMAKE_MODULE_PATH 0
   "${FLANG_SOURCE_DIR}/cmake/modules"
+  "${FORTRANRUNTIME_SOURCE_DIR}/cmake/modules"
   "${LLVM_COMMON_CMAKE_UTILS}/Modules"
   )
 include(AddFlang)
@@ -326,14 +327,6 @@ if (FLANG_REPOSITORY_STRING)
   add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
 endif()
 
-include(TestBigEndian)
-test_big_endian(IS_BIGENDIAN)
-if (IS_BIGENDIAN)
-  add_compile_definitions(FLANG_BIG_ENDIAN=1)
-else ()
-  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
-endif ()
-
 # Configure Flang's Version.inc file.
 configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
@@ -432,6 +425,7 @@ endif()
 
 include(CMakeParseArguments)
 include(AddFlang)
+include(FlangCommon)
 
 if (FLANG_INCLUDE_TESTS)
   add_compile_definitions(FLANG_INCLUDE_TESTS=1)

>From c42127f2eb26ee4a7cff9cf02628834b3cb2ebae Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 3 Oct 2024 20:11:32 +0200
Subject: [PATCH 07/32] Float128Math support

---
 FortranRuntime/CMakeLists.txt                 |  7 +++++
 .../cmake/modules/AddFortranRuntime.cmake     |  5 ----
 FortranRuntime/lib/Runtime/CMakeLists.txt     |  5 ++++
 .../lib/Runtime/Float128Math/CMakeLists.txt   | 29 +++++++------------
 4 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
index bda76dd87c0d7a..a68bd5bd00b758 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/FortranRuntime/CMakeLists.txt
@@ -89,11 +89,13 @@ check_cxx_source_compiles(
   "
   HAVE_DECL_STRERROR_S)
 
+
 # Search for clang_rt.builtins
 execute_process(
     COMMAND "${CMAKE_CXX_COMPILER}" "-print-libgcc-file-name" "-rtlib=compiler-rt"
     RESULT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE
     OUTPUT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT
+    ERROR_QUIET
   )
 if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
   string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FORTRANRUNTIME_LIBCALL)
@@ -111,6 +113,11 @@ endif ()
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
 set(CMAKE_CXX_STANDARD_REQUIRED YES)
 
+# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
+# to avoid an unwanted dependency on libstdc++/libc++.so.
+add_definitions(-U_GLIBCXX_ASSERTIONS)
+add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
+
 configure_file(cmake/config.h.cmake.in config.h)
 
 
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
index 5410cb769754b5..316923ca632c20 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -79,11 +79,6 @@ function (add_fortranruntime_library name)
   # For configured config.h for be found
   target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")
 
-  # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
-  # to avoid an unwanted dependency on libstdc++/libc++.so.
-  target_compile_definitions(${name} PRIVATE -U_GLIBCXX_ASSERTIONS)
-  target_compile_definitions(${name} PRIVATE -U_LIBCPP_ENABLE_ASSERTIONS)
-
   # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc does not support.
   # We are injecting a dependency to Compiler-RT where these are implemented.
   if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FORTRANRUNTIME_LIBCALL)
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 1938ed6e21f54a..87d34054172201 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -90,6 +90,9 @@ file(GLOB_RECURSE private_headers
   "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
   )
 
+
+
+
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
   )
@@ -106,6 +109,8 @@ if (f128_sources)
   list(APPEND sources ${f128_sources})
 endif()
 
+
+
 if (NOT DEFINED WIN32)
   add_fortranruntime_library(FortranRuntime STATIC
     ${sources}
diff --git a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
index 1ff158c401855f..a55d39e88cd404 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- lib/Runtime/Float128Math/CMakeLists.txt -----------------------------===#
+#===-- runtime/Float128Math/CMakeLists.txt ---------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -15,6 +15,7 @@
 # used for building this FortranFloat128Math library.
 
 include(CheckLibraryExists)
+include(CheckIncludeFile)
 
 set(sources
   acos.cpp
@@ -87,23 +88,15 @@ if (FLANG_RUNTIME_F128_MATH_LIB)
       "${FLANG_RUNTIME_F128_MATH_LIB}"
       )
   endif()
-
-  add_flang_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
-    ${sources})
-
-  if (DEFINED MSVC)
-    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
-    add_flang_library(FortranFloat128Math.static STATIC INSTALL_WITH_TOOLCHAIN
-      ${sources}
-      )
-    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
-    add_flang_library(FortranFloat128Math.static_dbg STATIC INSTALL_WITH_TOOLCHAIN
-      ${sources}
-      )
-    add_dependencies(FortranFloat128Math FortranFloat128Math.static
-      FortranFloat128Math.static_dbg
-      )
-  endif()
+   
+  if (WIN32)
+     # Do not create a FortranFloat128Math library under Windows, the Flang driver never links it. Instead, add the sources to the main FortranRuntime.lib.
+    target_sources(FortranFloat128MathILib INTERFACE ${sources})
+    target_compile_definitions(FortranFloat128MathILib INTERFACE HAS_QUADMATHLIB)
+  else ()
+    add_fortranruntime_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
+      ${sources})
+   endif ()
 elseif (HAVE_LDBL_MANT_DIG_113)
   # We can use 'long double' versions from libc.
   check_library_exists(m sinl "" FOUND_LIBM)

>From 0867eb3b9447b9b8139be293eb15436a4b60c064 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 4 Oct 2024 13:52:28 +0200
Subject: [PATCH 08/32] Update test for windows

---
 FortranRuntime/test/Driver/exec.f90 | 1 -
 1 file changed, 1 deletion(-)

diff --git a/FortranRuntime/test/Driver/exec.f90 b/FortranRuntime/test/Driver/exec.f90
index 07b42492b34d30..372f6d8a8d7bfd 100644
--- a/FortranRuntime/test/Driver/exec.f90
+++ b/FortranRuntime/test/Driver/exec.f90
@@ -1,4 +1,3 @@
-! UNSUPPORTED? system-windows
 ! Verify that flang can correctly build executables.
 
 ! RUN: %flang %s -o %t

>From 5c2ae6b26b6f4751c9532f68ea64cff4b60b5228 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 7 Oct 2024 12:57:03 +0200
Subject: [PATCH 09/32] Re-add offloading support

---
 FortranRuntime/CMakeLists.txt                 | 60 +++++++++++++------
 .../modules/AddFlangOffloadRuntime.cmake      | 55 ++++++-----------
 FortranRuntime/lib/Runtime/CMakeLists.txt     |  6 +-
 .../lib/Runtime/CUDA/CMakeLists.txt           |  5 +-
 FortranRuntime/lib/Runtime/CUDA/allocator.cpp |  2 +-
 FortranRuntime/unittests/CMakeLists.txt       | 45 ++++++++++++--
 flang/docs/GettingStarted.md                  | 12 ++--
 7 files changed, 113 insertions(+), 72 deletions(-)
 rename {flang => FortranRuntime}/cmake/modules/AddFlangOffloadRuntime.cmake (61%)

diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
index a68bd5bd00b758..fe5610f0c20816 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/FortranRuntime/CMakeLists.txt
@@ -62,13 +62,27 @@ endif ()
 # Build Options #
 #################
 
-option(FORTRANRUNTIME_INCLUDE_TESTS
-         "Generate build targets for the FortranRuntime unit tests."
-         ${LLVM_INCLUDE_TESTS})
+option(FORTRANRUNTIME_INCLUDE_TESTS "Generate build targets for the FortranRuntime unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
+
+set(FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile FortranRuntime with GPU support (CUDA or OpenMP)")
+set_property(CACHE FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
+  ""
+  CUDA
+  OpenMP)
+if (NOT FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT)
+elseif (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+  set(FORTRANRUNTIME_LIBCUDACXX_PATH "" CACHE PATH "Path to libcu++ package installation")
+  option(FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS "Do not compile global variables' definitions when producing PTX library" OFF)
+elseif (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+set(FORTRANRUNTIME_DEVICE_ARCHITECTURES "all" CACHE STRING
+  "List of OpenMP device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')")
+else ()
+  message(FATAL_ERROR "Invalid value '${FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
+endif ()
 
-option(FLANG_EXPERIMENTAL_CUDA_RUNTIME "Compile Fortran runtime as CUDA sources (experimental)" OFF)
-if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
-  message(FATAL_ERROOR "FLANG_EXPERIMENTAL_CUDA_RUNTIME currently not supported")
+option(FORTRANRUNTIME_ENABLE_CUF "Compile CUDA Fortran runtime sources" OFF)
+if (FORTRANRUNTIME_ENABLE_CUF)
+  find_package(CUDAToolkit REQUIRED)
 endif()
 
 
@@ -90,17 +104,19 @@ check_cxx_source_compiles(
   HAVE_DECL_STRERROR_S)
 
 
-# Search for clang_rt.builtins
-execute_process(
-    COMMAND "${CMAKE_CXX_COMPILER}" "-print-libgcc-file-name" "-rtlib=compiler-rt"
-    RESULT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE
-    OUTPUT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT
-    ERROR_QUIET
-  )
-if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
-  string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FORTRANRUNTIME_LIBCALL)
-else ()
-  set(FORTRANRUNTIME_LIBCALL "")
+# Search for clang_rt.builtins library.
+if (WIN32)
+  execute_process(
+      COMMAND "${CMAKE_CXX_COMPILER}" "-print-libgcc-file-name" "-rtlib=compiler-rt"
+      RESULT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE
+      OUTPUT_VARIABLE CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT
+      ERROR_QUIET
+    )
+  if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
+    string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FORTRANRUNTIME_LIBCALL)
+  else ()
+    set(FORTRANRUNTIME_LIBCALL "")
+  endif ()
 endif ()
 
 
@@ -108,6 +124,16 @@ endif ()
 # Build Preparation #
 #####################
 
+if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT AND FORTRANRUNTIME_INCLUDE_TESTS)
+  # If Fortran runtime is built as CUDA library, the linking
+  # of targets that link FortranRuntime must be done
+  # with CUDA_RESOLVE_DEVICE_SYMBOLS.
+  # CUDA language must be enabled for CUDA_RESOLVE_DEVICE_SYMBOLS
+  # to take effect.
+  enable_language(CUDA)
+endif()
+
+
 # C++17 required for FortranRuntime, user or other runtimes may override this.
 # GTest included later also requires C++17.
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
diff --git a/flang/cmake/modules/AddFlangOffloadRuntime.cmake b/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
similarity index 61%
rename from flang/cmake/modules/AddFlangOffloadRuntime.cmake
rename to FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
index 6407be5d038b81..ae6fcabbed9b92 100644
--- a/flang/cmake/modules/AddFlangOffloadRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
@@ -1,21 +1,15 @@
-option(FLANG_EXPERIMENTAL_CUDA_RUNTIME
-  "Compile Fortran runtime as CUDA sources (experimental)" OFF
-  )
 
-option(FLANG_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS
-  "Do not compile global variables' definitions when producing PTX library" OFF
-  )
 
-set(FLANG_LIBCUDACXX_PATH "" CACHE PATH "Path to libcu++ package installation")
 
-set(FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD "off" CACHE STRING
-  "Compile Fortran runtime as OpenMP target offload sources (experimental). Valid options are 'off', 'host_device', 'nohost'")
 
-set(FLANG_OMP_DEVICE_ARCHITECTURES "all" CACHE STRING
-  "List of OpenMP device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')")
+
+
+
+
+
 
 macro(enable_cuda_compilation name files)
-  if (FLANG_EXPERIMENTAL_CUDA_RUNTIME)
+  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
     if (BUILD_SHARED_LIBS)
       message(FATAL_ERROR
         "BUILD_SHARED_LIBS is not supported for CUDA build of Fortran runtime"
@@ -50,17 +44,17 @@ macro(enable_cuda_compilation name files)
       "${CUDA_COMPILE_OPTIONS}"
       )
 
-    if (EXISTS "${FLANG_LIBCUDACXX_PATH}/include")
+    if (EXISTS "${FORTRANRUNTIME_LIBCUDACXX_PATH}/include")
       # When using libcudacxx headers files, we have to use them
       # for all files of F18 runtime.
-      include_directories(AFTER ${FLANG_LIBCUDACXX_PATH}/include)
+      include_directories(AFTER ${FORTRANRUNTIME_LIBCUDACXX_PATH}/include)
       add_compile_definitions(RT_USE_LIBCUDACXX=1)
     endif()
 
     # Add an OBJECT library consisting of CUDA PTX.
     llvm_add_library(${name}PTX OBJECT PARTIAL_SOURCES_INTENDED ${files})
     set_property(TARGET obj.${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
-    if (FLANG_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
+    if (FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
       target_compile_definitions(obj.${name}PTX
         PRIVATE FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
         )
@@ -69,24 +63,9 @@ macro(enable_cuda_compilation name files)
 endmacro()
 
 macro(enable_omp_offload_compilation files)
-  if (NOT FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD STREQUAL "off")
-    # 'host_device' build only works with Clang compiler currently.
-    # The build is done with the CMAKE_C/CXX_COMPILER, i.e. it does not use
-    # the in-tree built Clang. We may have a mode that would use the in-tree
-    # built Clang.
-    #
-    # 'nohost' is supposed to produce an LLVM Bitcode library,
-    # and it has to be done with a C/C++ compiler producing LLVM Bitcode
-    # compatible with the LLVM toolchain version distributed with the Flang
-    # compiler.
-    # In general, the in-tree built Clang should be used for 'nohost' build.
-    # Note that 'nohost' build does not produce the host version of Flang
-    # runtime library, so there will be two separate distributable objects.
-    # 'nohost' build is a TODO.
-
-    if (NOT FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD STREQUAL "host_device")
-      message(FATAL_ERROR "Unsupported OpenMP offload build of Flang runtime")
-    endif()
+  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+    # OpenMP offload build only works with Clang compiler currently.
+
     if (BUILD_SHARED_LIBS)
       message(FATAL_ERROR
         "BUILD_SHARED_LIBS is not supported for OpenMP offload build of Fortran runtime"
@@ -111,13 +90,13 @@ macro(enable_omp_offload_compilation files)
         "${all_amdgpu_architectures};${all_nvptx_architectures}"
         )
       # TODO: support auto detection on the build system.
-      if (FLANG_OMP_DEVICE_ARCHITECTURES STREQUAL "all")
-        set(FLANG_OMP_DEVICE_ARCHITECTURES ${all_gpu_architectures})
+      if (FORTRANRUNTIME_DEVICE_ARCHITECTURES STREQUAL "all")
+        set(FORTRANRUNTIME_DEVICE_ARCHITECTURES ${all_gpu_architectures})
       endif()
-      list(REMOVE_DUPLICATES FLANG_OMP_DEVICE_ARCHITECTURES)
+      list(REMOVE_DUPLICATES FORTRANRUNTIME_DEVICE_ARCHITECTURES)
 
       string(REPLACE ";" "," compile_for_architectures
-        "${FLANG_OMP_DEVICE_ARCHITECTURES}"
+        "${FORTRANRUNTIME_DEVICE_ARCHITECTURES}"
         )
 
       set(OMP_COMPILE_OPTIONS
@@ -138,7 +117,7 @@ macro(enable_omp_offload_compilation files)
         )
     else()
       message(FATAL_ERROR
-        "Flang runtime build is not supported for these compilers:\n"
+        "FortranRuntime build with OpenMP offload is not supported for these compilers:\n"
         "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}\n"
         "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
     endif()
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 87d34054172201..cc0161c05c57fa 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -111,7 +111,7 @@ endif()
 
 
 
-if (NOT DEFINED WIN32)
+if (NOT WIN32)
   add_fortranruntime_library(FortranRuntime STATIC
     ${sources}
     INSTALL_WITH_TOOLCHAIN
@@ -159,3 +159,7 @@ else()
       FortranRuntime.dynamic_dbg
     )
 endif()
+
+if (FORTRANRUNTIME_ENABLE_CUF)
+  add_subdirectory(CUDA)
+endif()
diff --git a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
index f75b854d1eb3ba..78b98652d60813 100644
--- a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
@@ -6,17 +6,16 @@
 #
 #===------------------------------------------------------------------------===#
 
-include_directories(${CUDAToolkit_INCLUDE_DIRS})
-
 # libCufRuntime depends on a certain version of CUDA. To be able to have
 # multiple build of this library with different CUDA version, the version is
 # added to the library name.
 set(CUFRT_LIBNAME CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR})
 
-add_flang_library(${CUFRT_LIBNAME}
+add_fortranruntime_library(${CUFRT_LIBNAME}
   allocator.cpp
   descriptor.cpp
 )
+target_include_directories(${CUFRT_LIBNAME} PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
 
 if (BUILD_SHARED_LIBS)
   set(CUDA_RT_TARGET CUDA::cudart)
diff --git a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
index 2efd6bf0a95249..6401faede9fdf5 100644
--- a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
@@ -11,7 +11,7 @@
 #include "../stat.h"
 #include "../terminator.h"
 #include "../type-info.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocator-registry.h"
 #include "flang/Support/Fortran.h"
 
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index 89e1c909d0f98e..d9533d853df6d7 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -6,24 +6,55 @@
 #
 #===------------------------------------------------------------------------===#
 
+# Add GTest if not already present.
+# Using a function so include_directories/LLVM_SUBPROJECT_TITLE does not propagate
 function (build_gtest)
   include_directories("${LLVM_INCLUDE_DIR}" "${LLVM_MAIN_INCLUDE_DIR}")
   set(LLVM_SUBPROJECT_TITLE "Third-Party/Google Test")
-  add_subdirectory(${LLVM_THIRD_PARTY_DIR}/unittest ${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest)
+  add_subdirectory("${LLVM_THIRD_PARTY_DIR}/unittest" "${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest")
 endfunction ()
-
-# Add GTest if not already present
 if (NOT TARGET llvm_gtest)
   build_gtest()
 endif ()
 
-# Target that depends on all unittests
-add_custom_target(FortranRuntimeUnitTests)
-set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Tests")
+
 
 # Required because LLVMSupport is compiled with this option (by default).
 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
 
+if (CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG)
+  add_compile_options("-Wno-suggest-override")
+endif()
+
+
+# Target that depends on all unittests
+add_custom_target(FortranRuntimeUnitTests)
+set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Meta")
+
+
+function(add_flang_unittest_offload_properties target)
+  # Set CUDA_RESOLVE_DEVICE_SYMBOLS.
+  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+    set_target_properties(${target}
+      PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
+      )
+  endif()
+
+  # Enable OpenMP offload during linking. We may need to replace
+  # LINK_OPTIONS with COMPILE_OPTIONS when there are OpenMP offload
+  # unittests.
+  #
+  # FIXME: replace 'native' in --offload-arch option with the list
+  #        of targets that Fortran Runtime was built for.
+  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+    set_target_properties(${target}
+      PROPERTIES LINK_OPTIONS
+      "-fopenmp;--offload-arch=native"
+      )
+  endif()
+endfunction()
+
+
 function(add_fortranruntime_unittest test_dirname)
   cmake_parse_arguments(ARG
     ""
@@ -36,6 +67,7 @@ function(add_fortranruntime_unittest test_dirname)
   target_include_directories(${test_dirname} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
   target_include_directories(${test_dirname} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
+  add_flang_unittest_offload_properties(${test_dirname})
 endfunction()
 
 function(add_fortranruntime_nongtest_unittest test_name)
@@ -61,6 +93,7 @@ function(add_fortranruntime_nongtest_unittest test_name)
   if(NOT ARG_SLOW_TEST)
     add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
   endif()
+  add_flang_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
 add_subdirectory(Common)
diff --git a/flang/docs/GettingStarted.md b/flang/docs/GettingStarted.md
index 1c85a6754b155b..e93f051c88d33e 100644
--- a/flang/docs/GettingStarted.md
+++ b/flang/docs/GettingStarted.md
@@ -209,7 +209,7 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
+  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
@@ -231,7 +231,7 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
+  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
@@ -258,7 +258,7 @@ build config:
 
 For example:
 ```bash
-  -DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
+  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
@@ -268,7 +268,7 @@ For example:
 
 Or:
 ```bash
-  -DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
+  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=gcc \
   -DCMAKE_CXX_COMPILER=g++ \
@@ -288,10 +288,10 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DFLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD="host_device" \
+  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
-  -DFLANG_OMP_DEVICE_ARCHITECTURES="all" \
+  -DFORTRANRUNTIME_DEVICE_ARCHITECTURES="all" \
   ../runtime/
 
 make -j FortranRuntime

>From f6d9f371a968eefb5152ca47bceb51649dca92a9 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 7 Oct 2024 15:55:34 +0200
Subject: [PATCH 10/32] Add documentation

---
 FortranRuntime/README.md     | 134 +++++++++++++++++++++++++++++++++--
 flang/docs/GettingStarted.md |  21 +++---
 llvm/runtimes/CMakeLists.txt |   1 +
 3 files changed, 142 insertions(+), 14 deletions(-)

diff --git a/FortranRuntime/README.md b/FortranRuntime/README.md
index 6fd4b3359f7888..6018276f6d4c5a 100644
--- a/FortranRuntime/README.md
+++ b/FortranRuntime/README.md
@@ -1,20 +1,142 @@
+<!--===- README.md
+
+   Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+   See https://llvm.org/LICENSE.txt for license information.
+   SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+-->
+
 # Fortran Runtime
 
 Fortran Runtime is the runtime library for code emitted by the Flang
 compiler (https://flang.llvm.org).
 
+
 ## Getting Started
 
-### Bootstrap Build
+There are two build modes for the FortranRuntime. The bootstrap build, also called the in-tree build, and the runtime-only build, also called the out-of-tree build.
+Not to be confused with the terms [in-source and out-of-source](https://cmake.org/cmake/help/latest/manual/cmake.1.html#introduction-to-cmake-buildsystems) builds as defined by CMake. In an in-source build, the source directory and the build directory are identical, whereas with an out-of-source build the build artifacts are stored somewhere else, possibly in a subdirectory of the source directory. LLVM does not support in-source builds.
+
+
+### Requirements
 
-```sh
-cmake -S <path-to-llvm-project>/llvm -DLLVM_ENABLE_PROJECTS=flang -DLLVM_ENABLE_RUNTIMES=FortranRuntime
+Requirements:
+  * [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements).
+  * While for LLVM C++14 suffices, Flang and FortranRuntime require a C++17-capable C++ compiler.
+
+
+### Bootstrap/In-Tree Build
+
+The bootstrap build will first build Clang and Flang, then use these compilers to compile the FortranRuntime.
+CMake will create a secondary build tree in configured with these just-built compilers. The secondary build will reuse the same build options (Flags, Debug/Release, ...) as the primary build. It will also ensure that once built, the FortranRuntime is found by Flang from either the build- or install-prefix. To enable, add `FortranRuntime` to `LLVM_ENABLE_RUNTIMES`:
+
+```bash
+cmake -S <path-to-llvm-project>/llvm    \
+  -DNinja                               \
+  -DLLVM_ENABLE_PROJECTS=flang          \
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
+  ...
 ```
 
-### Runtime-only build
+It is recommended to enable building OpenMP alongside Flang and FortranRuntime as well. This will build `omp_lib.mod` required to use OpenMP from Fortran. Building Compiler-RT may also be required, particularly on platforms that do not provide all C-ABI functionality (such as Windows).
 
-```sh
-cmake -S <path-to-llvm-project>/runtimes -DLLVM_ENABLE_RUNTIMES=FortranRuntime -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir-or-installprefix>/bin/flang-new
+```bash
+cmake -S <path-to-llvm-project>/llvm                  \
+  -DNinja                                             \
+  -DCMAKE_BUILD_TYPE=Release                          \
+  -DLLVM_ENABLE_PROJECTS="flang;openmp"               \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime" \
+  ...
 ```
 
+By default, the enabled runtimes will only be built for the host platform (`-DLLVM_RUNTIME_TARGETS=default`). To add additional targets to support cross-compilation via `flang-new --target=<target-triple>`, add more triples to `LLVM_RUNTIME_TARGETS`, such as `-DLLVM_RUNTIME_TARGETS="default;aarch64-linux-gnu"`.
+
+After configuration, build, test, and install the runtime via
+
+```shell
+$ ninja FortranRuntime
+$ ninja check-FortranRuntime
+$ ninja install-FortranRuntime
+```
+
+
+### Runtime-only/Out-of-Tree Build
+
+Instead of building Clang and Flang from scratch, the Runtime-only build uses CMake's environment introspection to find a C, C++, and Fortran compiler. The compiler to be used can be controlled using CMake's standard mechanisms such as `CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`. `CMAKE_Fortran_COMPILER` must be `flang-new` built from the same Git commit as FortranRuntime to ensure they are using the same ABI. The C and C++ compiler can be any compiler supporting the same ABI.
+
+In addition to the compiler, the build be able to find LLVM development tools such as `lit` and `FileCheck` that are not found in an LLVM's install directory. Use `CMAKE_BINARY_DIR` to point to directory where LLVM has been built.
+A simple build configuration maight look like the following:
+
+```bash
+cmake -S <path-to-llvm-project>/runtimes                         \
+  -GNinja                                                        \
+  -DLLVM_BINARY_DIR=<path-to-llvm-builddir>                      \
+  -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir>/bin/flang-new \
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime                          \
+  ...
+```
+
+uilding the FortranRuntime for cross-compilation triple, the target triple can be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`. Of course, FortranRuntime can be built multiple times with different build configurations, but have to be located manually when using with the Flang driver using the `-L` option.
+
+A more complete build configuration could be the following:
+
+```bash
+cmake -S <path-to-llvm-project>/runtimes                                          \
+  -GNinja                                                                         \
+  -DCMAKE_BUILD_TYPE=Release                                                      \
+  -DCMAKE_INSTALL_PREFIX="${HOME}/local"                                          \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime"                             \
+  -DCMAKE_C_COMPILER=gcc                                                          \
+  -DCMAKE_CXX_COMPILER=g++                                                        \
+  -DLLVM_BINARY_DIR=<path-to-llvm-builddir>                                       \
+  -DLLVM_DIR=<path-to-llvm-builddir>/lib/cmake/llvm                               \
+  -DClang_DIR=<path-to-llvm-builddir>/lib/cmake/clang                             \
+  -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir-or-installprefix>/bin/flang-new \
+  -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-linux-gnu                                   \
+  -DLLVM_RUNTIMES_TARGET=x86_64-linux-gnu                                         \
+  ...
+```
+
+## Configuration Option Reference
+
+The FortranRuntime has the followign configuration options. This is in addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and CMake itself provide.
+
+ * `FORTRANRUNTIME_INCLUDE_TESTS` (boolean; default: `ON`)
+
+   When `OFF`, does not add any tests, unittests, and omits the `check-FortranRuntime` build target.
+
+ * `FLANG_RUNTIME_F128_MATH_LIB` (default: `""`)
+
+   Determines the implementation of `REAL(16)` math functions. If set to `libquadmath`, uses `quadmath.h` and `-lquadmath` typically distributed with gcc. If empty, disables `REAL(16)` support. For any other value, introspects the compiler for `__float128` or 128-bit `long double` support. [More details](Real16MathSupport.md).
+
+ * `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`)
+
+   When set to `CUDA`, builds a FortranRuntime with support for GPU accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not automatically detected by CMake. `nvcc` as well as `clang` are supported.
+
+   When set to `OpenMP`, builds a FortranRuntime with support for GPU accelerators using OpenMP offloading. Only Clang is supported for `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`.
+
+ * `FORTRANRUNTIME_ENABLE_CUF` (bool, default: `OFF`)
+
+   Compiles the `libCufRuntime_cuda_<CUDA-version>.a/.so` library. This is independent of `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only requires a [CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html) found (not `CMAKE_CUDA_COMPILER`).
+
+
+### CUDA Support
+
+With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following additional configuration options become available.
+
+ * `FORTRANRUNTIME_LIBCUDACXX_PATH` (path, default: `""`)
+
+   Path to libcu++ package installation.
+
+ * `FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`)
+
+   Do not compile global variables' definitions when producing PTX library. Default is `OFF`, meaning global variable definitions are compiled by default.
+
+
+### OpenMP Offload Support
+
+With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following additional configuration options become available.
+
+ * `FORTRANRUNTIME_DEVICE_ARCHITECTURES` (default: `"all"`)
 
+   A list of device architectures that the FortranRuntime is supporting. If `"all"` uses a pre-defined list of architectures. Same purpose as `LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload.
diff --git a/flang/docs/GettingStarted.md b/flang/docs/GettingStarted.md
index e93f051c88d33e..4a6275a3b57730 100644
--- a/flang/docs/GettingStarted.md
+++ b/flang/docs/GettingStarted.md
@@ -30,10 +30,10 @@ https://llvm.org/docs/GettingStarted.html.
 All of the examples below use GCC as the C/C++ compilers and ninja as the build
 tool.
 
-### Building flang in tree
+### Building flang in tree (bootstrap build)
 Building flang in tree means building flang along with all of the projects on
-which it depends.  These projects include mlir, clang, flang, openmp, and
-compiler-rt.  Note that compiler-rt is only needed to access libraries that
+which it depends.  These projects include mlir, clang, flang, openmp,
+compiler-rt, and FortranRuntime.  Note that compiler-rt is only needed to access libraries that
 support 16 bit floating point numbers.  It's not needed to run the automated
 tests.  You can use several different C++ compilers for most of the build,
 includig GNU and clang.  But building compiler-rt requres using the clang
@@ -82,7 +82,7 @@ cmake \
   -DLLVM_TARGETS_TO_BUILD=host \
   -DLLVM_LIT_ARGS=-v \
   -DLLVM_ENABLE_PROJECTS="clang;mlir;flang;openmp" \
-  -DLLVM_ENABLE_RUNTIMES="compiler-rt" \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime" \
   ../llvm-project/llvm
 
 ninja
@@ -209,13 +209,14 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
   -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
   -DCMAKE_CUDA_COMPILER=clang \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
-  ../runtime/
+  ../runtimes/
 make -j FortranRuntime
 ```
 
@@ -231,13 +232,14 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
   -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
   -DCMAKE_CUDA_COMPILER=nvcc \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
-  ../runtime/
+  ../runtimes/
 
 make -j FortranRuntime
 ```
@@ -251,13 +253,14 @@ code.  Note that the packaging of the libraries is different
 between [Clang](https://clang.llvm.org/docs/OffloadingDesign.html#linking-target-device-code) and NVCC, so the library must be linked using
 compatible compiler drivers.
 
-#### Building in-tree
+#### Building in-tree (bootstrap build)
 One may build Flang runtime library along with building Flang itself
 by providing these additional CMake variables on top of the Flang in-tree
 build config:
 
 For example:
 ```bash
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
   -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
@@ -268,6 +271,7 @@ For example:
 
 Or:
 ```bash
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
   -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=gcc \
@@ -288,11 +292,12 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
+  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
   -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
   -DFORTRANRUNTIME_DEVICE_ARCHITECTURES="all" \
-  ../runtime/
+  ../runtimes/
 
 make -j FortranRuntime
 ```
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 5da91169058724..4ee7c390f8ecd3 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -281,6 +281,7 @@ function(runtime_default_target)
                            PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES
                                                 LLVM_USE_LINKER
                                                 CUDA # For runtimes that may look for the CUDA SDK (libc, offload)
+                                                FLANG_RUNTIME # Shared between Flang and FortranRuntime
                                                 ${ARG_PREFIXES}
                            EXTRA_TARGETS ${extra_targets}
                                          ${test_targets}

>From 2e23147c9cc8a5e7d832d164663ef2bb8e2eb88e Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 7 Oct 2024 16:13:15 +0200
Subject: [PATCH 11/32] clang-format

---
 FortranRuntime/test/Runtime/no-cpp-dep.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/FortranRuntime/test/Runtime/no-cpp-dep.c b/FortranRuntime/test/Runtime/no-cpp-dep.c
index f6760b75a148ff..971e7141678893 100644
--- a/FortranRuntime/test/Runtime/no-cpp-dep.c
+++ b/FortranRuntime/test/Runtime/no-cpp-dep.c
@@ -12,9 +12,9 @@ RUN: rm a.out
 */
 
 #include "flang/Runtime/entry-names.h"
-#include <stdint.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <stdint.h>
 
 /*
 Manually add declarations for the runtime functions that we want to make sure
@@ -32,8 +32,8 @@ int32_t RTNAME(ArgumentCount)();
 int32_t RTNAME(GetCommandArgument)(int32_t, const struct Descriptor *,
     const struct Descriptor *, const struct Descriptor *);
 int32_t RTNAME(GetEnvVariable)(const struct Descriptor *,
-    const struct Descriptor *, const struct Descriptor *, bool ,
-    const struct Descriptor *, const char *, int );
+    const struct Descriptor *, const struct Descriptor *, bool,
+    const struct Descriptor *, const char *, int);
 int64_t RTNAME(SystemClockCount)(int kind);
 
 int main() {

>From b293bdfaf632b8cde85739e9313a7eb7338c346e Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 7 Oct 2024 16:13:44 +0200
Subject: [PATCH 12/32] Undo avoiding C23-incompatibility warning

---
 FortranRuntime/test/Runtime/no-cpp-dep.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/FortranRuntime/test/Runtime/no-cpp-dep.c b/FortranRuntime/test/Runtime/no-cpp-dep.c
index 971e7141678893..f68f2b2cf3b475 100644
--- a/FortranRuntime/test/Runtime/no-cpp-dep.c
+++ b/FortranRuntime/test/Runtime/no-cpp-dep.c
@@ -31,9 +31,7 @@ void RTNAME(ProgramStart)(
 int32_t RTNAME(ArgumentCount)();
 int32_t RTNAME(GetCommandArgument)(int32_t, const struct Descriptor *,
     const struct Descriptor *, const struct Descriptor *);
-int32_t RTNAME(GetEnvVariable)(const struct Descriptor *,
-    const struct Descriptor *, const struct Descriptor *, bool,
-    const struct Descriptor *, const char *, int);
+int32_t RTNAME(GetEnvVariable)();
 int64_t RTNAME(SystemClockCount)(int kind);
 
 int main() {
@@ -41,7 +39,7 @@ int main() {
   RTNAME(ProgramStart)(0, 0, 0, 0);
   int32_t c = RTNAME(ArgumentCount)();
   int32_t v = RTNAME(GetCommandArgument)(0, 0, 0, 0);
-  int32_t e = RTNAME(GetEnvVariable)(NULL, NULL, NULL, false, NULL, "FOO", 0);
+  int32_t e = RTNAME(GetEnvVariable)("FOO", 0, 0);
   int64_t t = RTNAME(SystemClockCount)(8);
   return x + c + v + e;
 }

>From 981dbcc0b57a62299e488b0516245aa24ef4b35d Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 7 Oct 2024 22:45:54 +0200
Subject: [PATCH 13/32] Formatting and release notes update

---
 FortranRuntime/CMakeLists.txt                 |   2 +
 FortranRuntime/README.md                      | 103 +++++++++++++-----
 FortranRuntime/cmake/config.h.cmake.in        |   8 ++
 .../modules/AddFlangOffloadRuntime.cmake      |  16 ++-
 .../cmake/modules/AddFortranRuntime.cmake     |  36 +++---
 .../cmake/modules/FlangCommon.cmake           |  12 ++
 FortranRuntime/lib/CMakeLists.txt             |   1 +
 FortranRuntime/lib/Runtime/CMakeLists.txt     |  14 +--
 .../lib/Runtime/Float128Math/CMakeLists.txt   |   6 +-
 FortranRuntime/lib/Testing/CMakeLists.txt     |   1 +
 FortranRuntime/test/Driver/ctofortran.f90     |   3 +-
 FortranRuntime/unittests/CMakeLists.txt       |   1 -
 flang/docs/GettingStarted.md                  |  19 ++--
 flang/docs/ReleaseNotes.md                    |   7 ++
 flang/lib/CMakeLists.txt                      |   2 +-
 flang/lib/Common/CMakeLists.txt               |  12 +-
 flang/lib/Evaluate/CMakeLists.txt             |   2 +-
 flang/lib/Optimizer/Transforms/CMakeLists.txt |   1 -
 flang/test/lib/CMakeLists.txt                 |   1 -
 flang/tools/f18/CMakeLists.txt                |   6 +-
 flang/unittests/Evaluate/CMakeLists.txt       |   3 +-
 21 files changed, 176 insertions(+), 80 deletions(-)

diff --git a/FortranRuntime/CMakeLists.txt b/FortranRuntime/CMakeLists.txt
index fe5610f0c20816..e65cab7060cb02 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/FortranRuntime/CMakeLists.txt
@@ -156,4 +156,6 @@ add_subdirectory(lib)
 if (FORTRANRUNTIME_INCLUDE_TESTS)
   add_subdirectory(unittests)
   add_subdirectory(test)
+else ()
+  add_custom_target(check-FortranRuntime)
 endif()
diff --git a/FortranRuntime/README.md b/FortranRuntime/README.md
index 6018276f6d4c5a..cb578507f8c96e 100644
--- a/FortranRuntime/README.md
+++ b/FortranRuntime/README.md
@@ -8,27 +8,40 @@
 
 # Fortran Runtime
 
-Fortran Runtime is the runtime library for code emitted by the Flang
-compiler (https://flang.llvm.org).
+Fortran Runtime is the runtime library for code emitted by the Flang compiler
+(https://flang.llvm.org).
 
 
 ## Getting Started
 
-There are two build modes for the FortranRuntime. The bootstrap build, also called the in-tree build, and the runtime-only build, also called the out-of-tree build.
-Not to be confused with the terms [in-source and out-of-source](https://cmake.org/cmake/help/latest/manual/cmake.1.html#introduction-to-cmake-buildsystems) builds as defined by CMake. In an in-source build, the source directory and the build directory are identical, whereas with an out-of-source build the build artifacts are stored somewhere else, possibly in a subdirectory of the source directory. LLVM does not support in-source builds.
+There are two build modes for the FortranRuntime. The bootstrap build, also
+called the in-tree build, and the runtime-only build, also called the
+out-of-tree build.
+Not to be confused with the terms
+[in-source and out-of-source](https://cmake.org/cmake/help/latest/manual/cmake.1.html#introduction-to-cmake-buildsystems)
+builds as defined by CMake. In an in-source build, the source directory and the
+build directory are identical, whereas with an out-of-source build the
+build artifacts are stored somewhere else, possibly in a subdirectory of the
+source directory. LLVM does not support in-source builds.
 
 
 ### Requirements
 
 Requirements:
   * [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements).
-  * While for LLVM C++14 suffices, Flang and FortranRuntime require a C++17-capable C++ compiler.
+  * While for LLVM C++14 suffices, Flang and FortranRuntime require a
+    C++17-capable C++ compiler.
 
 
 ### Bootstrap/In-Tree Build
 
-The bootstrap build will first build Clang and Flang, then use these compilers to compile the FortranRuntime.
-CMake will create a secondary build tree in configured with these just-built compilers. The secondary build will reuse the same build options (Flags, Debug/Release, ...) as the primary build. It will also ensure that once built, the FortranRuntime is found by Flang from either the build- or install-prefix. To enable, add `FortranRuntime` to `LLVM_ENABLE_RUNTIMES`:
+The bootstrap build will first build Clang and Flang, then use these compilers
+to compile the FortranRuntime. CMake will create a secondary build tree in
+configured with these just-built compilers. The secondary build will reuse the
+same build options (Flags, Debug/Release, ...) as the primary build. It will
+also ensure that once built, the FortranRuntime is found by Flang from either
+the build- or install-prefix. To enable, add `FortranRuntime` to
+`LLVM_ENABLE_RUNTIMES`:
 
 ```bash
 cmake -S <path-to-llvm-project>/llvm    \
@@ -38,7 +51,10 @@ cmake -S <path-to-llvm-project>/llvm    \
   ...
 ```
 
-It is recommended to enable building OpenMP alongside Flang and FortranRuntime as well. This will build `omp_lib.mod` required to use OpenMP from Fortran. Building Compiler-RT may also be required, particularly on platforms that do not provide all C-ABI functionality (such as Windows).
+It is recommended to enable building OpenMP alongside Flang and FortranRuntime
+as well. This will build `omp_lib.mod` required to use OpenMP from Fortran.
+Building Compiler-RT may also be required, particularly on platforms that do
+not provide all C-ABI functionality (such as Windows).
 
 ```bash
 cmake -S <path-to-llvm-project>/llvm                  \
@@ -49,23 +65,35 @@ cmake -S <path-to-llvm-project>/llvm                  \
   ...
 ```
 
-By default, the enabled runtimes will only be built for the host platform (`-DLLVM_RUNTIME_TARGETS=default`). To add additional targets to support cross-compilation via `flang-new --target=<target-triple>`, add more triples to `LLVM_RUNTIME_TARGETS`, such as `-DLLVM_RUNTIME_TARGETS="default;aarch64-linux-gnu"`.
+By default, the enabled runtimes will only be built for the host platform
+(`-DLLVM_RUNTIME_TARGETS=default`). To add additional targets to support
+cross-compilation via `flang-new --target=<target-triple>`, add more triples to
+`LLVM_RUNTIME_TARGETS`, such as
+`-DLLVM_RUNTIME_TARGETS="default;aarch64-linux-gnu"`.
 
-After configuration, build, test, and install the runtime via
+After configuration, build, test, and install the runtime(s) via
 
 ```shell
 $ ninja FortranRuntime
 $ ninja check-FortranRuntime
-$ ninja install-FortranRuntime
+$ ninja install
 ```
 
 
 ### Runtime-only/Out-of-Tree Build
 
-Instead of building Clang and Flang from scratch, the Runtime-only build uses CMake's environment introspection to find a C, C++, and Fortran compiler. The compiler to be used can be controlled using CMake's standard mechanisms such as `CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`. `CMAKE_Fortran_COMPILER` must be `flang-new` built from the same Git commit as FortranRuntime to ensure they are using the same ABI. The C and C++ compiler can be any compiler supporting the same ABI.
+Instead of building Clang and Flang from scratch, the Runtime-only build uses
+CMake's environment introspection to find a C, C++, and Fortran compiler. The
+compiler to be used can be controlled using CMake's standard mechanisms such as
+`CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`.
+`CMAKE_Fortran_COMPILER` must be `flang-new` built from the same Git commit as
+FortranRuntime to ensure they are using the same ABI. The C and C++ compiler
+can be any compiler supporting the same ABI.
 
-In addition to the compiler, the build be able to find LLVM development tools such as `lit` and `FileCheck` that are not found in an LLVM's install directory. Use `CMAKE_BINARY_DIR` to point to directory where LLVM has been built.
-A simple build configuration maight look like the following:
+In addition to the compiler, the build be able to find LLVM development tools
+such as `lit` and `FileCheck` that are not found in an LLVM's install directory.
+Use `CMAKE_BINARY_DIR` to point to directory where LLVM has been built.
+A simple build configuration might look like the following:
 
 ```bash
 cmake -S <path-to-llvm-project>/runtimes                         \
@@ -76,7 +104,11 @@ cmake -S <path-to-llvm-project>/runtimes                         \
   ...
 ```
 
-uilding the FortranRuntime for cross-compilation triple, the target triple can be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`. Of course, FortranRuntime can be built multiple times with different build configurations, but have to be located manually when using with the Flang driver using the `-L` option.
+Building the FortranRuntime for cross-compilation triple, the target triple can
+be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`.
+Of course, FortranRuntime can be built multiple times with different build
+configurations, but have to be located manually when using with the Flang
+driver using the `-L` option.
 
 A more complete build configuration could be the following:
 
@@ -99,30 +131,46 @@ cmake -S <path-to-llvm-project>/runtimes
 
 ## Configuration Option Reference
 
-The FortranRuntime has the followign configuration options. This is in addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and CMake itself provide.
+The FortranRuntime has the followign configuration options. This is in
+addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and
+CMake itself provide.
 
  * `FORTRANRUNTIME_INCLUDE_TESTS` (boolean; default: `ON`)
 
-   When `OFF`, does not add any tests, unittests, and omits the `check-FortranRuntime` build target.
+   When `OFF`, does not add any tests and unittests. The `check-FortranRuntime`
+   build target will do nothing.
 
  * `FLANG_RUNTIME_F128_MATH_LIB` (default: `""`)
 
-   Determines the implementation of `REAL(16)` math functions. If set to `libquadmath`, uses `quadmath.h` and `-lquadmath` typically distributed with gcc. If empty, disables `REAL(16)` support. For any other value, introspects the compiler for `__float128` or 128-bit `long double` support. [More details](Real16MathSupport.md).
+   Determines the implementation of `REAL(16)` math functions. If set to
+   `libquadmath`, uses `quadmath.h` and `-lquadmath` typically distributed with
+   gcc. If empty, disables `REAL(16)` support. For any other value, introspects
+   the compiler for `__float128` or 128-bit `long double` support.
+   [More details](docs/Real16MathSupport.md).
 
  * `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`)
 
-   When set to `CUDA`, builds a FortranRuntime with support for GPU accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not automatically detected by CMake. `nvcc` as well as `clang` are supported.
+   When set to `CUDA`, builds a FortranRuntime with experimental support for GPU
+   accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not
+   automatically detected by CMake. `nvcc` as well as `clang` are supported.
 
-   When set to `OpenMP`, builds a FortranRuntime with support for GPU accelerators using OpenMP offloading. Only Clang is supported for `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`.
+   When set to `OpenMP`, builds a FortranRuntime with experimental support for
+   GPU accelerators using OpenMP offloading. Only Clang is supported for
+   `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`.
 
  * `FORTRANRUNTIME_ENABLE_CUF` (bool, default: `OFF`)
 
-   Compiles the `libCufRuntime_cuda_<CUDA-version>.a/.so` library. This is independent of `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only requires a [CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html) found (not `CMAKE_CUDA_COMPILER`).
+   Compiles the `libCufRuntime_cuda_<CUDA-version>.a/.so` library. This is
+   independent of `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only
+   requires a
+   [CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html)
+   (no `CMAKE_CUDA_COMPILER`).
 
 
 ### CUDA Support
 
-With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following additional configuration options become available.
+With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following
+additional configuration options become available.
 
  * `FORTRANRUNTIME_LIBCUDACXX_PATH` (path, default: `""`)
 
@@ -130,13 +178,18 @@ With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following additio
 
  * `FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`)
 
-   Do not compile global variables' definitions when producing PTX library. Default is `OFF`, meaning global variable definitions are compiled by default.
+   Do not compile global variables' definitions when producing PTX library.
+   Default is `OFF`, meaning global variable definitions are compiled by
+   default.
 
 
 ### OpenMP Offload Support
 
-With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following additional configuration options become available.
+With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following
+additional configuration options become available.
 
  * `FORTRANRUNTIME_DEVICE_ARCHITECTURES` (default: `"all"`)
 
-   A list of device architectures that the FortranRuntime is supporting. If `"all"` uses a pre-defined list of architectures. Same purpose as `LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload.
+   A list of device architectures that the FortranRuntime is supporting.
+   If `"all"` uses a pre-defined list of architectures. Same purpose as
+   `LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload.
diff --git a/FortranRuntime/cmake/config.h.cmake.in b/FortranRuntime/cmake/config.h.cmake.in
index 0a1d1394b9bc49..4fa31c7e89ad7b 100644
--- a/FortranRuntime/cmake/config.h.cmake.in
+++ b/FortranRuntime/cmake/config.h.cmake.in
@@ -1,3 +1,11 @@
+//===-- cmake/config.h.cmake.in ---------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef FORTRAN_RUNTIME_CONFIG_H
 #define FORTRAN_RUNTIME_CONFIG_H
 
diff --git a/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake b/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
index ae6fcabbed9b92..8cfd02267dfdca 100644
--- a/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
@@ -1,12 +1,10 @@
-
-
-
-
-
-
-
-
-
+#===-- cmake/modules/AddFlangOffloadRuntime.txt ----------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
 
 macro(enable_cuda_compilation name files)
   if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
index 316923ca632c20..841459e4dbd105 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -6,7 +6,7 @@
 #
 #===------------------------------------------------------------------------===#
 
-# Builds a library with common option for FortranRuntime.
+# Builds a library with common options for FortranRuntime.
 #
 # Usage:
 #
@@ -16,11 +16,13 @@
 #   STATIC
 #     Build a static (.a/.lib) library
 #   OBJECT
-#     Create only object- and Fortran module files without static/dynamic library
+#     Create only object files without static/dynamic library
 #   INSTALL_WITH_TOOLCHAIN
-#     Install library into Clang's resource directory so it can be found by the Flang driver during compilation, including tests
+#     Install library into Clang's resource directory so it can be found by the
+#     Flang driver during compilation, including tests
 #   EXCLUDE_FROM_ALL
-#     Do not build library by default; typically used for libraries needed for testing only, no install
+#     Do not build library by default; typically used for libraries needed for
+#     testing only, no install
 #   LINK_TO_LLVM
 #     Library requires include path and linking to LLVM's Support component
 #   ADDITIONAL_HEADERS
@@ -65,22 +67,30 @@ function (add_fortranruntime_library name)
 
   target_compile_features(${name} PRIVATE cxx_std_17)
   if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
-    target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>)
+    target_compile_options(${name} PRIVATE
+        $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables
+      )
   elseif (MSVC)
-    target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->)
+    target_compile_options(${name} PRIVATE
+        $<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->
+      )
   endif ()
 
   # FortranRuntime's public headers
   target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
 
-  # For ISO_Fortran_binding.h to be found (Accessed as #include "flang/ISO_Fortran_binding.h")
+  # For ISO_Fortran_binding.h to be found by the runtime itself (Accessed as #include "flang/ISO_Fortran_binding.h")
+  # User applications can use #include <ISO_Fortran_binding.h>
   target_include_directories(${name} PRIVATE "${FLANG_SOURCE_DIR}/include")
 
-  # For configured config.h for be found
+  # For FortranRuntime's configured config.h to be found
   target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")
 
-  # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc does not support.
-  # We are injecting a dependency to Compiler-RT where these are implemented.
+  # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends
+  # on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit
+  # integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc
+  # does not support. We are injecting a dependency to Compiler-RT where these
+  # are implemented.
   if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FORTRANRUNTIME_LIBCALL)
     target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FORTRANRUNTIME_LIBCALL}")
   endif ()
@@ -96,9 +106,9 @@ function (add_fortranruntime_library name)
     target_include_directories(${name} PRIVATE  ${LLVM_INCLUDE_DIRS})
   endif ()
 
-  # If this is part of the toolchain, put it into the compiler's resource directory.
-  # Otherwise it is part of testing and is not installed at all.
-  # TODO: Consider multi-configuration builds
+  # If this is part of the toolchain, put it into the compiler's resource
+  # directory. Otherwise it is part of testing and is not installed at all.
+  # TODO: Consider multi-configuration builds (MSVC_IDE, "Ninja Multi-Config")
   if (ARG_INSTALL_WITH_TOOLCHAIN)
     set_target_properties(${name}
       PROPERTIES
diff --git a/FortranRuntime/cmake/modules/FlangCommon.cmake b/FortranRuntime/cmake/modules/FlangCommon.cmake
index 34c91048f47887..d7194ad4d7ef56 100644
--- a/FortranRuntime/cmake/modules/FlangCommon.cmake
+++ b/FortranRuntime/cmake/modules/FlangCommon.cmake
@@ -1,3 +1,15 @@
+#===-- cmake/modules/FlangCommon.txt ----------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+#
+# CMake definitions shared betwween Flang and FortranRuntime
+#
+#===------------------------------------------------------------------------===#
+
 # The out of tree builds of the compiler and the Fortran runtime
 # must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
 # to be composable. Failure to synchronize this setting may result
diff --git a/FortranRuntime/lib/CMakeLists.txt b/FortranRuntime/lib/CMakeLists.txt
index 8c4382078a8e70..74c78b3fa3a493 100644
--- a/FortranRuntime/lib/CMakeLists.txt
+++ b/FortranRuntime/lib/CMakeLists.txt
@@ -10,3 +10,4 @@ add_subdirectory(Runtime)
 if (FORTRANRUNTIME_INCLUDE_TESTS)
   add_subdirectory(Testing)
 endif ()
+
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index cc0161c05c57fa..b62556ff4b4e66 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -90,9 +90,6 @@ file(GLOB_RECURSE private_headers
   "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
   )
 
-
-
-
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
   )
@@ -109,8 +106,6 @@ if (f128_sources)
   list(APPEND sources ${f128_sources})
 endif()
 
-
-
 if (NOT WIN32)
   add_fortranruntime_library(FortranRuntime STATIC
     ${sources}
@@ -118,7 +113,8 @@ if (NOT WIN32)
     ADDITIONAL_HEADERS ${public_headers} ${private_headers}
   )
 
-  # For unittests that link to FortranRuntime. Should link to the static version of the library.
+  # For unittests that link to FortranRuntime. Should link to the static version
+  # of the library.
   add_library(FortranRuntime.static ALIAS FortranRuntime)
   add_library(FortranRuntime.unittest ALIAS FortranRuntime)
 else()
@@ -131,7 +127,8 @@ else()
         ADDITIONAL_HEADERS ${public_headers} ${private_headers}
       )
 
-    # Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to write a different .mod file.
+    # Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to
+    # write a different .mod file.
     set_target_properties(${name}
         PROPERTIES
           MSVC_RUNTIME_LIBRARY ${msvc_lib}
@@ -145,7 +142,8 @@ else()
   # unittests link against LLVMSupport which is compiled with /MD
   add_win_fortranruntime_library(STATIC unittest   MultiThreadedDLL EXCLUDE_FROM_ALL)
 
-  # FIXME: Before DLL versions of the runtime can be used, exported definitions must be annotated with __declspec(dllexport).
+  # FIXME: Before DLL versions of the runtime can be used, exported definitions
+  # must be annotated with __declspec(dllexport).
   add_win_fortranruntime_library(SHARED dynamic     MultiThreadedDLL)
   add_win_fortranruntime_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
 
diff --git a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
index a55d39e88cd404..ed65da0a5ac71c 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
@@ -88,9 +88,11 @@ if (FLANG_RUNTIME_F128_MATH_LIB)
       "${FLANG_RUNTIME_F128_MATH_LIB}"
       )
   endif()
-   
+
   if (WIN32)
-     # Do not create a FortranFloat128Math library under Windows, the Flang driver never links it. Instead, add the sources to the main FortranRuntime.lib.
+    # Do not create a FortranFloat128Math library under Windows, the Flang
+    # driver never links it. Instead, add the sources to the main
+    # FortranRuntime.lib.
     target_sources(FortranFloat128MathILib INTERFACE ${sources})
     target_compile_definitions(FortranFloat128MathILib INTERFACE HAS_QUADMATHLIB)
   else ()
diff --git a/FortranRuntime/lib/Testing/CMakeLists.txt b/FortranRuntime/lib/Testing/CMakeLists.txt
index 75b38662c2a0fa..d5caada3fb68e8 100644
--- a/FortranRuntime/lib/Testing/CMakeLists.txt
+++ b/FortranRuntime/lib/Testing/CMakeLists.txt
@@ -17,3 +17,4 @@ add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
  ADDITIONAL_HEADERS
    ${public_headers}
 )
+
diff --git a/FortranRuntime/test/Driver/ctofortran.f90 b/FortranRuntime/test/Driver/ctofortran.f90
index a9cbf166bfe46c..78eac32133b18e 100644
--- a/FortranRuntime/test/Driver/ctofortran.f90
+++ b/FortranRuntime/test/Driver/ctofortran.f90
@@ -1,9 +1,8 @@
+! UNSUPPORTED: system-windows
 ! RUN: split-file %s %t
 ! RUN: chmod +x %t/runtest.sh
 ! RUN: %t/runtest.sh %t %t/ffile.f90 %t/cfile.c %flang | FileCheck %s
 
-! UNSUPPORTED: system-windows
-
 !--- ffile.f90
 program fmain
   interface
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index d9533d853df6d7..3733588b82624f 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -39,7 +39,6 @@ function(add_flang_unittest_offload_properties target)
       PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
       )
   endif()
-
   # Enable OpenMP offload during linking. We may need to replace
   # LINK_OPTIONS with COMPILE_OPTIONS when there are OpenMP offload
   # unittests.
diff --git a/flang/docs/GettingStarted.md b/flang/docs/GettingStarted.md
index 4a6275a3b57730..eb9049ad607570 100644
--- a/flang/docs/GettingStarted.md
+++ b/flang/docs/GettingStarted.md
@@ -197,13 +197,13 @@ Flang runtime can be built for accelerators in experimental mode, i.e.
 complete enabling is WIP.  CUDA and OpenMP target offload builds
 are currently supported.
 
-#### Building out-of-tree
+#### Building out-of-tree (Runtime-only build)
 
 ##### CUDA build
 Clang with NVPTX backend and NVCC compilers are supported.
 
 ```bash
-cd llvm-project/flang
+cd llvm-project
 rm -rf build_flang_runtime
 mkdir build_flang_runtime
 cd build_flang_runtime
@@ -217,7 +217,7 @@ cmake \
   -DCMAKE_CUDA_COMPILER=clang \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
   ../runtimes/
-make -j FortranRuntime
+make -j`nprocs` FortranRuntime
 ```
 
 Note that the used version of `clang` must [support](https://releases.llvm.org/16.0.0/tools/clang/docs/ReleaseNotes.html#cuda-support)
@@ -226,7 +226,7 @@ CUDA toolkit installations, please use `-DCUDAToolkit_ROOT=/some/path`
 to specify the compatible version.
 
 ```bash
-cd llvm-project/flang
+cd llvm-project
 rm -rf build_flang_runtime
 mkdir build_flang_runtime
 cd build_flang_runtime
@@ -241,7 +241,7 @@ cmake \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
   ../runtimes/
 
-make -j FortranRuntime
+make -j`nprocs` FortranRuntime
 ```
 
 Note that `nvcc` might limit support to certain
@@ -267,6 +267,7 @@ For example:
   -DCMAKE_CXX_COMPILER=clang++ \
   -DCMAKE_CUDA_COMPILER=clang \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
+  ../llvm
 ```
 
 Or:
@@ -278,15 +279,17 @@ Or:
   -DCMAKE_CXX_COMPILER=g++ \
   -DCMAKE_CUDA_COMPILER=nvcc \
   -DCMAKE_CUDA_HOST_COMPILER=g++ \
+  ../llvm
 ```
 
-Normal `make -j check-flang` will work with such CMake configuration.
+Normal `make -j`nprocs` check-flang` will work with such CMake configuration.
+Consider a lower value instead of `nprocs` appropriate to the available RAM.
 
 ##### OpenMP target offload build
 Only Clang compiler is currently supported.
 
 ```bash
-cd llvm-project/flang
+cd llvm-project
 rm -rf build_flang_runtime
 mkdir build_flang_runtime
 cd build_flang_runtime
@@ -299,7 +302,7 @@ cmake \
   -DFORTRANRUNTIME_DEVICE_ARCHITECTURES="all" \
   ../runtimes/
 
-make -j FortranRuntime
+make -j`nprocs` FortranRuntime
 ```
 
 The result of the build is a "device-only" library, i.e. the host
diff --git a/flang/docs/ReleaseNotes.md b/flang/docs/ReleaseNotes.md
index f0c956281915f4..80ebbb5481ba50 100644
--- a/flang/docs/ReleaseNotes.md
+++ b/flang/docs/ReleaseNotes.md
@@ -36,6 +36,13 @@ page](https://llvm.org/releases/).
 
 ## Build System Changes
 
+ * The Fortran Runtime library (libFortranRuntime) has been move to a new
+   top-level directory named "FortranRuntime". It now supports the
+   LLVM_ENABLE_RUNTIMES mechanism to build libFortranRuntime for multiple target
+   triples. libFortranRuntime.a will now be emitted into Clang's per-target
+   resource directory (next to libclang_rt) where it is also found by Flang's
+   driver.
+
 ## New Issues Found
 
 
diff --git a/flang/lib/CMakeLists.txt b/flang/lib/CMakeLists.txt
index 0ab7d1c888df96..a7cdb4819d7252 100644
--- a/flang/lib/CMakeLists.txt
+++ b/flang/lib/CMakeLists.txt
@@ -1,9 +1,9 @@
 add_subdirectory(Common)
-add_subdirectory(Support)
 add_subdirectory(Evaluate)
 add_subdirectory(Lower)
 add_subdirectory(Parser)
 add_subdirectory(Semantics)
+add_subdirectory(Support)
 add_subdirectory(Frontend)
 add_subdirectory(FrontendTool)
 
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index 73af3bdd589162..f7fdc74a32ec8c 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -1,4 +1,12 @@
+#===-- lib/Common/CMakeLists.txt ------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
 add_flang_library(FortranCommon 
-  "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/binary-to-decimal.cpp"
-  "${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/lib/Common/decimal-to-binary.cpp"
+  "${FORTRANRUNTIME_SOURCE_DIR}/lib/Common/binary-to-decimal.cpp"
+  "${FORTRANRUNTIME_SOURCE_DIR}/lib/Common/decimal-to-binary.cpp"
 )
diff --git a/flang/lib/Evaluate/CMakeLists.txt b/flang/lib/Evaluate/CMakeLists.txt
index 5f2e345b7bfb56..2847020adcc3ec 100644
--- a/flang/lib/Evaluate/CMakeLists.txt
+++ b/flang/lib/Evaluate/CMakeLists.txt
@@ -60,8 +60,8 @@ add_flang_library(FortranEvaluate
   variable.cpp
 
   LINK_LIBS
-  FortranParser
   FortranSupport
+  FortranParser
   ${LIBPGMATH}
   ${QUADMATHLIB}
 
diff --git a/flang/lib/Optimizer/Transforms/CMakeLists.txt b/flang/lib/Optimizer/Transforms/CMakeLists.txt
index 35794300dbc6aa..49baf063efe8a3 100644
--- a/flang/lib/Optimizer/Transforms/CMakeLists.txt
+++ b/flang/lib/Optimizer/Transforms/CMakeLists.txt
@@ -43,7 +43,6 @@ add_flang_library(FIRTransforms
   FIRDialect
   FIRDialectSupport
   FIRSupport
-  FortranCommon
   FortranSupport
   HLFIRDialect
   MLIRAffineUtils
diff --git a/flang/test/lib/CMakeLists.txt b/flang/test/lib/CMakeLists.txt
index 687b107844c651..fc6ef10fab1f5a 100644
--- a/flang/test/lib/CMakeLists.txt
+++ b/flang/test/lib/CMakeLists.txt
@@ -1,2 +1 @@
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../FortranRuntime/include")
 add_subdirectory(Analysis)
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
index 5f749a433f05cd..401c7cc2bdef79 100644
--- a/flang/tools/f18/CMakeLists.txt
+++ b/flang/tools/f18/CMakeLists.txt
@@ -6,7 +6,7 @@ set(LLVM_LINK_COMPONENTS
 
 # Define the list of Fortran module files for which it is
 # sufficient to generate the module file via -fsyntax-only.
-set(MODULES_WITHOUT_IMPLEMENTATION
+set(MODULES
   "__fortran_builtins"
   "__fortran_ieee_exceptions"
   "__fortran_type_info"
@@ -23,8 +23,6 @@ set(MODULES_WITHOUT_IMPLEMENTATION
   "iso_fortran_env_impl"
 )
 
-set(MODULES ${MODULES_WITHOUT_IMPLEMENTATION})
-
 # Check if 128-bit float computations can be done via long double.
 check_cxx_source_compiles(
   "#include <cfloat>
@@ -69,7 +67,7 @@ if (NOT CMAKE_CROSSCOMPILING)
     else()
       set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
       if(${filename} STREQUAL "iso_fortran_env_impl")
-        set(sourcepath "${FLANG_SOURCE_DIR}/../FortranRuntime/lib/Runtime/${filename}.f90")
+        set(sourcepath "${FORTRANRUNTIME_SOURCE_DIR}/lib/Runtime/${filename}.f90")
       endif()
       if(${filename} STREQUAL "iso_fortran_env")
         set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/iso_fortran_env_impl.mod)
diff --git a/flang/unittests/Evaluate/CMakeLists.txt b/flang/unittests/Evaluate/CMakeLists.txt
index a7f763d7b17d85..324195348d045b 100644
--- a/flang/unittests/Evaluate/CMakeLists.txt
+++ b/flang/unittests/Evaluate/CMakeLists.txt
@@ -40,11 +40,11 @@ add_flang_nongtest_unittest(integer
 )
 
 add_flang_nongtest_unittest(intrinsics
-  FortranSupport
   FortranCommon
   FortranEvaluateTesting
   FortranEvaluate
   FortranSemantics
+  FortranSupport
   FortranParser
 )
 
@@ -63,7 +63,6 @@ set(LLVM_REQUIRES_RTTI ON)
 add_flang_nongtest_unittest(real
   FortranEvaluateTesting
   FortranEvaluate
-  FortranCommon
   FortranSupport
   FortranSemantics
 )

>From 8ba5c8b182bec2b66b82c9a745f07ddc2c1bec59 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 8 Oct 2024 23:08:07 +0200
Subject: [PATCH 14/32] Compile fix after too aggressive cleanup

---
 FortranRuntime/cmake/modules/AddFortranRuntime.cmake | 2 +-
 FortranRuntime/lib/Runtime/CMakeLists.txt            | 5 +++++
 FortranRuntime/unittests/CMakeLists.txt              | 3 +--
 flang/lib/Evaluate/CMakeLists.txt                    | 1 +
 4 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
index 841459e4dbd105..e9563c6e3a60b9 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
@@ -68,7 +68,7 @@ function (add_fortranruntime_library name)
   target_compile_features(${name} PRIVATE cxx_std_17)
   if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
     target_compile_options(${name} PRIVATE
-        $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables
+        $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>
       )
   elseif (MSVC)
     target_compile_options(${name} PRIVATE
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index b62556ff4b4e66..2465c9a9ed9bb8 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -90,6 +90,11 @@ file(GLOB_RECURSE private_headers
   "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
   )
 
+include(AddFlangOffloadRuntime)
+
+enable_cuda_compilation(FortranRuntime "${supported_files}")
+enable_omp_offload_compilation("${supported_files}")
+
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
   )
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index 3733588b82624f..b57a0e1292590b 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -17,8 +17,6 @@ if (NOT TARGET llvm_gtest)
   build_gtest()
 endif ()
 
-
-
 # Required because LLVMSupport is compiled with this option (by default).
 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
 
@@ -92,6 +90,7 @@ function(add_fortranruntime_nongtest_unittest test_name)
   if(NOT ARG_SLOW_TEST)
     add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
   endif()
+
   add_flang_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
diff --git a/flang/lib/Evaluate/CMakeLists.txt b/flang/lib/Evaluate/CMakeLists.txt
index 2847020adcc3ec..1408f382255a8b 100644
--- a/flang/lib/Evaluate/CMakeLists.txt
+++ b/flang/lib/Evaluate/CMakeLists.txt
@@ -60,6 +60,7 @@ add_flang_library(FortranEvaluate
   variable.cpp
 
   LINK_LIBS
+  FortranCommon
   FortranSupport
   FortranParser
   ${LIBPGMATH}

>From 54b516786bd725e5b409d7ee6a4f55fe09a1baa9 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 9 Oct 2024 09:48:46 +0200
Subject: [PATCH 15/32] CUDA/OpenMP build fix

---
 ...e.cmake => AddFortranOffloadRuntime.cmake} | 10 ++--
 .../include/flang/Common/fast-int-set.h       |  6 +-
 FortranRuntime/lib/Runtime/CMakeLists.txt     | 59 +++++++++++--------
 .../lib/Runtime/allocator-registry.cpp        |  4 +-
 FortranRuntime/lib/Runtime/environment.cpp    |  4 +-
 FortranRuntime/lib/Runtime/unit.cpp           |  4 +-
 FortranRuntime/lib/Runtime/utf.cpp            |  4 +-
 FortranRuntime/test/Runtime/no-cpp-dep.c      |  3 +
 FortranRuntime/unittests/CMakeLists.txt       |  6 +-
 .../unittests/Runtime/CMakeLists.txt          |  4 ++
 .../unittests/Runtime/CUDA/AllocatorCUF.cpp   |  2 +-
 .../unittests/Runtime/CUDA/CMakeLists.txt     | 19 ++++++
 llvm/runtimes/CMakeLists.txt                  |  1 +
 13 files changed, 82 insertions(+), 44 deletions(-)
 rename FortranRuntime/cmake/modules/{AddFlangOffloadRuntime.cmake => AddFortranOffloadRuntime.cmake} (93%)
 create mode 100644 FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt

diff --git a/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake b/FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake
similarity index 93%
rename from FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
rename to FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake
index 8cfd02267dfdca..d60a26ce0f8a86 100644
--- a/FortranRuntime/cmake/modules/AddFlangOffloadRuntime.cmake
+++ b/FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake
@@ -1,4 +1,4 @@
-#===-- cmake/modules/AddFlangOffloadRuntime.txt ----------------------------===#
+#===-- cmake/modules/AddFortranOffloadRuntime.txt --------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -50,11 +50,11 @@ macro(enable_cuda_compilation name files)
     endif()
 
     # Add an OBJECT library consisting of CUDA PTX.
-    llvm_add_library(${name}PTX OBJECT PARTIAL_SOURCES_INTENDED ${files})
-    set_property(TARGET obj.${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
+    add_fortranruntime_library(${name}PTX OBJECT ${files})
+    set_property(TARGET ${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
     if (FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
-      target_compile_definitions(obj.${name}PTX
-        PRIVATE FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+      target_compile_definitions(${name}PTX
+        PRIVATE FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
         )
     endif()
   endif()
diff --git a/FortranRuntime/include/flang/Common/fast-int-set.h b/FortranRuntime/include/flang/Common/fast-int-set.h
index 323ee4dc7e94d9..fe3f1632060b50 100644
--- a/FortranRuntime/include/flang/Common/fast-int-set.h
+++ b/FortranRuntime/include/flang/Common/fast-int-set.h
@@ -24,7 +24,7 @@
 #ifndef FORTRAN_COMMON_FAST_INT_SET_H_
 #define FORTRAN_COMMON_FAST_INT_SET_H_
 
-#include <optional>
+#include "flang/Common/optional.h"
 
 namespace Fortran::common {
 
@@ -83,9 +83,9 @@ template <int N> class FastIntSet {
     }
   }
 
-  std::optional<int> PopValue() {
+  optional<int> PopValue() {
     if (IsEmpty()) {
-      return std::nullopt;
+      return nullopt;
     } else {
       return value_[--size_];
     }
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 2465c9a9ed9bb8..678edde7947eb6 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -6,9 +6,10 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_subdirectory(Float128Math)
+include(AddFortranOffloadRuntime)
 
-set(sources
+# List of files that are buildable for all devices.
+set(supported_sources
   ../Common/binary-to-decimal.cpp
   ../Common/decimal-to-binary.cpp
   ISO_Fortran_binding.cpp
@@ -18,9 +19,6 @@ set(sources
   assign.cpp
   buffer.cpp
   character.cpp
-  command.cpp
-  complex-powi.cpp
-  complex-reduction.c
   connection.cpp
   copy.cpp
   derived-api.cpp
@@ -31,9 +29,6 @@ set(sources
   edit-input.cpp
   edit-output.cpp
   environment.cpp
-  exceptions.cpp
-  execute.cpp
-  extensions.cpp
   external-unit.cpp
   extrema.cpp
   file.cpp
@@ -45,9 +40,7 @@ set(sources
   io-api-minimal.cpp
   io-error.cpp
   io-stmt.cpp
-  iso_fortran_env_impl.f90
   iostat.cpp
-  main.cpp
   matmul-transpose.cpp
   matmul.cpp
   memory.cpp
@@ -59,41 +52,49 @@ set(sources
   product.cpp
   pseudo-unit.cpp
   ragged.cpp
-  random.cpp
-  reduce.cpp
-  reduction.cpp
   stat.cpp
-  stop.cpp
   sum.cpp
   support.cpp
-  temporary-stack.cpp
   terminator.cpp
-  time-intrinsic.cpp
   tools.cpp
   transformational.cpp
   type-code.cpp
   type-info.cpp
-  unit-map.cpp
   unit.cpp
+  unit-map.cpp
   utf.cpp
 )
 
-set(public_headers "")
+# List of source not used for GPU offloading.
+set(host_sources
+  command.cpp
+  complex-powi.cpp
+  complex-reduction.c
+  exceptions.cpp
+  execute.cpp
+  extensions.cpp
+  iso_fortran_env_impl.f90
+  main.cpp
+  random.cpp
+  reduce.cpp
+  reduction.cpp
+  stop.cpp
+  temporary-stack.cpp
+  time-intrinsic.cpp
+)
+
 file(GLOB_RECURSE public_headers
   "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Runtime/*.h"
   "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h"
   )
 
-set(private_headers "")
 file(GLOB_RECURSE private_headers
   "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h"
   "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
   )
 
-include(AddFlangOffloadRuntime)
 
-enable_cuda_compilation(FortranRuntime "${supported_files}")
-enable_omp_offload_compilation("${supported_files}")
+add_subdirectory(Float128Math)
 
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
@@ -108,8 +109,12 @@ if (f128_sources)
     APPEND PROPERTY COMPILE_DEFINITIONS
     ${f128_defs}
     )
-  list(APPEND sources ${f128_sources})
-endif()
+else ()
+  set(f128_sources "")
+endif ()
+
+
+set(sources ${supported_sources} ${host_sources} ${f128_sources})
 
 if (NOT WIN32)
   add_fortranruntime_library(FortranRuntime STATIC
@@ -118,6 +123,9 @@ if (NOT WIN32)
     ADDITIONAL_HEADERS ${public_headers} ${private_headers}
   )
 
+  enable_cuda_compilation(FortranRuntime "${supported_sources}")
+  enable_omp_offload_compilation("${supported_sources}")
+
   # For unittests that link to FortranRuntime. Should link to the static version
   # of the library.
   add_library(FortranRuntime.static ALIAS FortranRuntime)
@@ -139,6 +147,9 @@ else()
           MSVC_RUNTIME_LIBRARY ${msvc_lib}
           Fortran_MODULE_DIRECTORY "module.${suffix}"
       )
+
+    enable_cuda_compilation(FortranRuntime "${supported_sources}")
+    enable_omp_offload_compilation("${supported_sources}")
   endfunction ()
 
   add_win_fortranruntime_library(STATIC static     MultiThreaded)
diff --git a/FortranRuntime/lib/Runtime/allocator-registry.cpp b/FortranRuntime/lib/Runtime/allocator-registry.cpp
index 68fb8b80680558..edd3685e83a820 100644
--- a/FortranRuntime/lib/Runtime/allocator-registry.cpp
+++ b/FortranRuntime/lib/Runtime/allocator-registry.cpp
@@ -11,11 +11,11 @@
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS AllocatorRegistry allocatorRegistry;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 RT_API_ATTRS void AllocatorRegistry::Register(int pos, Allocator_t allocator) {
diff --git a/FortranRuntime/lib/Runtime/environment.cpp b/FortranRuntime/lib/Runtime/environment.cpp
index 272914877988a5..9cbb198dd9141c 100644
--- a/FortranRuntime/lib/Runtime/environment.cpp
+++ b/FortranRuntime/lib/Runtime/environment.cpp
@@ -23,11 +23,11 @@ extern char **environ;
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExecutionEnvironment executionEnvironment;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 
 static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) {
   if (!envDefaults) {
diff --git a/FortranRuntime/lib/Runtime/unit.cpp b/FortranRuntime/lib/Runtime/unit.cpp
index 496679ee8ce5f4..f6e4dc2a7befd4 100644
--- a/FortranRuntime/lib/Runtime/unit.cpp
+++ b/FortranRuntime/lib/Runtime/unit.cpp
@@ -19,13 +19,13 @@
 
 namespace Fortran::runtime::io {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExternalFileUnit *defaultInput{nullptr}; // unit 5
 RT_VAR_ATTRS ExternalFileUnit *defaultOutput{nullptr}; // unit 6
 RT_VAR_ATTRS ExternalFileUnit *errorOutput{nullptr}; // unit 0 extension
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/lib/Runtime/utf.cpp b/FortranRuntime/lib/Runtime/utf.cpp
index 635451153d39a6..d2839f9cf3793a 100644
--- a/FortranRuntime/lib/Runtime/utf.cpp
+++ b/FortranRuntime/lib/Runtime/utf.cpp
@@ -10,7 +10,7 @@
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 // clang-format off
 RT_OFFLOAD_VAR_GROUP_BEGIN
 const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
@@ -41,7 +41,7 @@ const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
 };
 RT_OFFLOAD_VAR_GROUP_END
 // clang-format on
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/test/Runtime/no-cpp-dep.c b/FortranRuntime/test/Runtime/no-cpp-dep.c
index f68f2b2cf3b475..2cc5669a60d3a2 100644
--- a/FortranRuntime/test/Runtime/no-cpp-dep.c
+++ b/FortranRuntime/test/Runtime/no-cpp-dep.c
@@ -5,6 +5,9 @@ a C compiler.
 
 UNSUPPORTED: system-windows
 
+FIXME: This currently fails with CUDA-enabled FortranRuntime because it needs
+       to link libcuda_rt.
+
 RUN: %if system-aix %{ export OBJECT_MODE=64 %}
 RUN: %cc -std=c99 %s -I%include %libruntime -lm \
 RUN: %if system-aix %{-lpthread %}
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index b57a0e1292590b..1bb788651a8d33 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -30,7 +30,7 @@ add_custom_target(FortranRuntimeUnitTests)
 set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Meta")
 
 
-function(add_flang_unittest_offload_properties target)
+function(add_fortranruntime_unittest_offload_properties target)
   # Set CUDA_RESOLVE_DEVICE_SYMBOLS.
   if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
     set_target_properties(${target}
@@ -64,7 +64,7 @@ function(add_fortranruntime_unittest test_dirname)
   target_include_directories(${test_dirname} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
   target_include_directories(${test_dirname} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
-  add_flang_unittest_offload_properties(${test_dirname})
+  add_fortranruntime_unittest_offload_properties(${test_dirname})
 endfunction()
 
 function(add_fortranruntime_nongtest_unittest test_name)
@@ -91,7 +91,7 @@ function(add_fortranruntime_nongtest_unittest test_name)
     add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
   endif()
 
-  add_flang_unittest_offload_properties(${test_name}${suffix})
+  add_fortranruntime_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
 add_subdirectory(Common)
diff --git a/FortranRuntime/unittests/Runtime/CMakeLists.txt b/FortranRuntime/unittests/Runtime/CMakeLists.txt
index b4c0d7f86c1878..e4439dcc8b3c7e 100644
--- a/FortranRuntime/unittests/Runtime/CMakeLists.txt
+++ b/FortranRuntime/unittests/Runtime/CMakeLists.txt
@@ -40,3 +40,7 @@ add_fortranruntime_unittest(FlangRuntimeTests
 LINK_LIBS
   FortranRuntime.unittest
 )
+
+if (FORTRANRUNTIME_ENABLE_CUF)
+  add_subdirectory(CUDA)
+endif ()
diff --git a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
index d2c1600af8c631..bb1ea411cb7760 100644
--- a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
+++ b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../../runtime/terminator.h"
+#include "../../../lib/Runtime/terminator.h"
 #include "flang/Runtime/CUDA/allocator.h"
 #include "flang/Runtime/CUDA/descriptor.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt b/FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt
new file mode 100644
index 00000000000000..04321e65d733ad
--- /dev/null
+++ b/FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt
@@ -0,0 +1,19 @@
+#===-- unittests/Runtime/CUDA/CMakeLists.txt -------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+add_fortranruntime_unittest(FlangCufRuntimeTests
+  AllocatorCUF.cpp
+)
+
+target_link_libraries(FlangCufRuntimeTests
+  PRIVATE
+  CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR}
+  FortranRuntime
+)
+
+target_include_directories(FlangCufRuntimeTests PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 4ee7c390f8ecd3..d589a809578035 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -474,6 +474,7 @@ if(build_runtimes)
   if(LLVM_INCLUDE_TESTS)
     foreach(dep FileCheck
                 clang
+                clang-offload-packager
                 flang-new
                 count
                 lld

>From 9f37b91f7843f2808e9e53df02d2cfa15a6355c4 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 9 Oct 2024 11:12:53 +0200
Subject: [PATCH 16/32] Do not compile former libDecimal for devices

---
 FortranRuntime/lib/Runtime/CMakeLists.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 678edde7947eb6..1b8944d7641fab 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -10,8 +10,6 @@ include(AddFortranOffloadRuntime)
 
 # List of files that are buildable for all devices.
 set(supported_sources
-  ../Common/binary-to-decimal.cpp
-  ../Common/decimal-to-binary.cpp
   ISO_Fortran_binding.cpp
   allocator-registry.cpp
   allocatable.cpp
@@ -67,6 +65,8 @@ set(supported_sources
 
 # List of source not used for GPU offloading.
 set(host_sources
+  ../Common/binary-to-decimal.cpp
+  ../Common/decimal-to-binary.cpp
   command.cpp
   complex-powi.cpp
   complex-reduction.c

>From 7123f2cc4d0d70e8e90871323b7901ad7380cc8c Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 11 Oct 2024 00:29:35 +0200
Subject: [PATCH 17/32] Undo leftover change of moving module_files to
 FortranRuntime

---
 llvm/runtimes/CMakeLists.txt | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index d589a809578035..80f1cf5d6b6ea6 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -513,9 +513,17 @@ if(build_runtimes)
   endif()
 
   if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
-    if (LLVM_TOOL_FLANG_BUILD AND "FortranRuntime" IN_LIST LLVM_ENABLE_PROJECTS)
-      set(enable_fortran ENABLE_FORTRAN)
-    endif ()
+    if (${LLVM_TOOL_FLANG_BUILD})
+      message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang-new")
+      set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang-new")
+      set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
+      # TODO: This is a workaround until flang becomes a first-class project
+      # in llvm/CMakeList.txt.  Until then, this line ensures that flang-new is
+      # built before "openmp" is built as a runtime project.  Besides "flang-new"
+      # to build the compiler, we also need to add "module_files" to make sure
+      # that all .mod files are also properly build.
+      list(APPEND extra_deps "flang-new" "module_files")
+    endif()
     foreach(dep opt llvm-link llvm-extract clang clang-offload-packager)
       if(TARGET ${dep})
         list(APPEND extra_deps ${dep})

>From cc21ca919551164acb87553f35ec76a00b095605 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 15 Oct 2024 14:24:49 +0200
Subject: [PATCH 18/32] Merge 'keep common files in flang/'

---
 FortranRuntime/cmake/config.h.cmake.in        |  14 +--
 .../Runtime/allocator-registry.h              |  11 +-
 .../Runtime/array-constructor.h               |  48 +++++++
 .../Runtime/descriptor.h                      |  22 +---
 .../FortranRuntime/Runtime/io-api-funcs.h     |  39 ++++++
 .../FortranRuntime/Runtime/iostat-funcs.h     |  23 ++++
 .../Runtime/memory.h                          |   2 +-
 .../Runtime/type-code.h                       |   2 +-
 .../include/flang/Runtime/array-constructor.h | 118 ------------------
 FortranRuntime/lib/Runtime/CMakeLists.txt     |   4 +-
 FortranRuntime/lib/Runtime/CUDA/allocator.cpp |   6 +-
 .../lib/Runtime/CUDA/descriptor.cpp           |   4 +-
 .../lib/Runtime/Float128Math/math-entries.h   |   4 +-
 .../lib/Runtime/ISO_Fortran_binding.cpp       |   6 +-
 FortranRuntime/lib/Runtime/ISO_Fortran_util.h |   6 +-
 FortranRuntime/lib/Runtime/allocatable.cpp    |  10 +-
 .../lib/Runtime/allocator-registry.cpp        |   6 +-
 .../lib/Runtime/array-constructor.cpp         |   8 +-
 FortranRuntime/lib/Runtime/assign.cpp         |   2 +-
 FortranRuntime/lib/Runtime/buffer.h           |   4 +-
 FortranRuntime/lib/Runtime/character.cpp      |   6 +-
 FortranRuntime/lib/Runtime/command.cpp        |   2 +-
 FortranRuntime/lib/Runtime/connection.h       |   2 +-
 FortranRuntime/lib/Runtime/copy.cpp           |   4 +-
 FortranRuntime/lib/Runtime/copy.h             |   2 +-
 FortranRuntime/lib/Runtime/derived-api.cpp    |   2 +-
 FortranRuntime/lib/Runtime/derived.cpp        |   2 +-
 FortranRuntime/lib/Runtime/descriptor-io.h    |   8 +-
 FortranRuntime/lib/Runtime/descriptor.cpp     |  10 +-
 FortranRuntime/lib/Runtime/dot-product.cpp    |   8 +-
 FortranRuntime/lib/Runtime/edit-input.cpp     |   4 +-
 FortranRuntime/lib/Runtime/edit-input.h       |   2 +-
 FortranRuntime/lib/Runtime/edit-output.cpp    |   2 +-
 FortranRuntime/lib/Runtime/edit-output.h      |   4 +-
 FortranRuntime/lib/Runtime/environment.cpp    |   4 +-
 FortranRuntime/lib/Runtime/execute.cpp        |   2 +-
 FortranRuntime/lib/Runtime/extensions.cpp     |   8 +-
 FortranRuntime/lib/Runtime/extrema.cpp        |   2 +-
 FortranRuntime/lib/Runtime/file.cpp           |   4 +-
 FortranRuntime/lib/Runtime/file.h             |   4 +-
 FortranRuntime/lib/Runtime/findloc.cpp        |   2 +-
 .../lib/Runtime/format-implementation.h       |   6 +-
 FortranRuntime/lib/Runtime/format.h           |   2 +-
 FortranRuntime/lib/Runtime/inquiry.cpp        |   2 +-
 FortranRuntime/lib/Runtime/internal-unit.cpp  |   6 +-
 FortranRuntime/lib/Runtime/internal-unit.h    |   2 +-
 FortranRuntime/lib/Runtime/io-api-common.h    |   6 +-
 FortranRuntime/lib/Runtime/io-api-minimal.cpp |   2 +-
 FortranRuntime/lib/Runtime/io-api.cpp         |   8 +-
 FortranRuntime/lib/Runtime/io-error.cpp       |   2 +-
 FortranRuntime/lib/Runtime/io-error.h         |   4 +-
 FortranRuntime/lib/Runtime/io-stmt.cpp        |   2 +-
 FortranRuntime/lib/Runtime/io-stmt.h          |  10 +-
 FortranRuntime/lib/Runtime/iostat.cpp         |   2 +-
 .../lib/Runtime/matmul-transpose.cpp          |   6 +-
 FortranRuntime/lib/Runtime/matmul.cpp         |   6 +-
 FortranRuntime/lib/Runtime/memory.cpp         |   4 +-
 FortranRuntime/lib/Runtime/misc-intrinsic.cpp |   4 +-
 FortranRuntime/lib/Runtime/namelist.cpp       |   2 +-
 FortranRuntime/lib/Runtime/namelist.h         |   2 +-
 .../lib/Runtime/numeric-templates.h           |   4 +-
 FortranRuntime/lib/Runtime/numeric.cpp        |   2 +-
 FortranRuntime/lib/Runtime/product.cpp        |   2 +-
 FortranRuntime/lib/Runtime/random-templates.h |   4 +-
 FortranRuntime/lib/Runtime/random.cpp         |   8 +-
 FortranRuntime/lib/Runtime/reduce.cpp         |   2 +-
 .../lib/Runtime/reduction-templates.h         |   4 +-
 FortranRuntime/lib/Runtime/reduction.cpp      |   2 +-
 FortranRuntime/lib/Runtime/stack.h            |   2 +-
 FortranRuntime/lib/Runtime/stat.cpp           |   2 +-
 FortranRuntime/lib/Runtime/stat.h             |   2 +-
 FortranRuntime/lib/Runtime/sum.cpp            |   2 +-
 FortranRuntime/lib/Runtime/support.cpp        |   2 +-
 .../lib/Runtime/temporary-stack.cpp           |   6 +-
 FortranRuntime/lib/Runtime/time-intrinsic.cpp |   4 +-
 FortranRuntime/lib/Runtime/tools.h            |   8 +-
 .../lib/Runtime/transformational.cpp          |   4 +-
 FortranRuntime/lib/Runtime/type-code.cpp      |   2 +-
 FortranRuntime/lib/Runtime/type-info.cpp      |  10 +-
 FortranRuntime/lib/Runtime/type-info.h        |   4 +-
 FortranRuntime/lib/Runtime/unit-map.h         |   4 +-
 FortranRuntime/lib/Runtime/unit.cpp           |   4 +-
 FortranRuntime/lib/Runtime/unit.h             |   6 +-
 FortranRuntime/lib/Runtime/utf.cpp            |   4 +-
 FortranRuntime/lib/Testing/CMakeLists.txt     |   7 +-
 FortranRuntime/test/lit.cfg.py                |   2 +-
 FortranRuntime/test/lit.site.cfg.py.in        |   1 +
 FortranRuntime/unittests/CMakeLists.txt       |   2 -
 .../unittests/Evaluate/CMakeLists.txt         |   4 +-
 .../Evaluate/ISO-Fortran-binding.cpp          |   5 +-
 FortranRuntime/unittests/Evaluate/reshape.cpp |   2 +-
 .../unittests/Runtime/AccessTest.cpp          |   2 +-
 .../unittests/Runtime/Allocatable.cpp         |   2 +-
 .../unittests/Runtime/ArrayConstructor.cpp    |  10 +-
 .../unittests/Runtime/CUDA/AllocatorCUF.cpp   |  12 +-
 .../unittests/Runtime/CharacterTest.cpp       |   2 +-
 .../unittests/Runtime/CommandTest.cpp         |   6 +-
 FortranRuntime/unittests/Runtime/Derived.cpp  |   6 +-
 .../unittests/Runtime/ExternalIOTest.cpp      |   6 +-
 FortranRuntime/unittests/Runtime/Inquiry.cpp  |   4 +-
 .../unittests/Runtime/ListInputTest.cpp       |   6 +-
 .../unittests/Runtime/LogicalFormatTest.cpp   |   4 +-
 FortranRuntime/unittests/Runtime/Matmul.cpp   |   8 +-
 .../unittests/Runtime/MatmulTranspose.cpp     |   8 +-
 .../unittests/Runtime/MiscIntrinsic.cpp       |   8 +-
 FortranRuntime/unittests/Runtime/Namelist.cpp |   4 +-
 FortranRuntime/unittests/Runtime/Numeric.cpp  |   2 +-
 .../unittests/Runtime/NumericalFormatTest.cpp |   4 +-
 FortranRuntime/unittests/Runtime/Pointer.cpp  |   4 +-
 FortranRuntime/unittests/Runtime/Random.cpp   |   6 +-
 .../unittests/Runtime/Reduction.cpp           |   8 +-
 .../unittests/Runtime/RuntimeCrashTest.cpp    |   4 +-
 FortranRuntime/unittests/Runtime/Stop.cpp     |   2 +-
 FortranRuntime/unittests/Runtime/Support.cpp  |   4 +-
 .../unittests/Runtime/TemporaryStack.cpp      |   8 +-
 FortranRuntime/unittests/Runtime/Time.cpp     |   2 +-
 .../unittests/Runtime/Transformational.cpp    |   6 +-
 FortranRuntime/unittests/Runtime/tools.h      |   6 +-
 .../include/flang/Common/Fortran-consts.h     |   0
 .../Common/ISO_Fortran_binding_wrapper.h      |   2 +-
 flang/include/flang/Common/README.md          |  25 ++++
 .../include/flang/Common/api-attrs.h          |  11 +-
 .../flang/Common/binary-floating-point.h      |   0
 .../flang/Common/bit-population-count.h       |   2 +-
 .../include/flang/Common/constexpr-bitset.h   |   2 +-
 .../include/flang/Common/decimal.h            |   0
 .../include/flang/Common/enum-class.h         |   2 +-
 .../include/flang/Common/enum-set.h           |   2 +-
 .../include/flang/Common/fast-int-set.h       |  10 +-
 .../include/flang/Common/float128.h           |   2 +-
 .../include/flang/Common/format.h             |   2 +-
 .../include/flang/Common/idioms.h             |   2 +-
 .../flang/Common/leading-zero-bit-count.h     |   2 +-
 .../include/flang/Common/optional.h           |   6 +-
 .../include/flang/Common/real.h               |   2 +-
 .../include/flang/Common/reference-wrapper.h  |   6 +-
 .../include/flang/Common/restorer.h           |   4 +-
 .../include/flang/Common/target-rounding.h    |   0
 .../include/flang/Common/uint128.h            |   4 +-
 .../include/flang/Common/variant.h            |   6 +-
 .../include/flang/Common/visit.h              |   4 +-
 .../include/flang/Common/windows-include.h    |   2 +-
 flang/include/flang/ISO_Fortran_binding.h     |   2 +-
 flang/include/flang/Lower/Allocatable.h       |   2 +-
 .../flang/Optimizer/Builder/IntrinsicCall.h   |   1 -
 .../flang/Optimizer/Builder/MutableBox.h      |   2 +-
 .../flang/Optimizer/CodeGen/DescriptorModel.h |   2 +-
 .../include/flang/Runtime/CUDA/allocator.h    |   4 +-
 .../include/flang/Runtime/CUDA/descriptor.h   |   4 +-
 flang/include/flang/Runtime/README.md         |  27 ++++
 .../include/flang/Runtime/allocatable.h       |   7 +-
 .../flang/Runtime/allocator-registry-consts.h |  20 +++
 .../flang/Runtime/array-constructor-consts.h  |  54 ++++++++
 .../include/flang/Runtime/assign.h            |   2 +-
 .../include/flang/Runtime/c-or-cpp.h          |   2 +-
 .../include/flang/Runtime/character.h         |   2 +-
 .../include/flang/Runtime/command.h           |   2 +-
 .../include/flang/Runtime/cpp-type.h          |   2 +-
 .../include/flang/Runtime/derived-api.h       |   2 +-
 .../include/flang/Runtime/descriptor-consts.h |  73 +++++++++++
 .../include/flang/Runtime/entry-names.h       |  11 +-
 .../include/flang/Runtime/exceptions.h        |   4 +-
 .../include/flang/Runtime/execute.h           |   4 +-
 .../include/flang/Runtime/extensions.h        |   2 +-
 .../flang/Runtime/freestanding-tools.h        |   2 +-
 .../include/flang/Runtime/inquiry.h           |   4 +-
 .../include/flang/Runtime/io-api.h            |   7 +-
 .../include/flang/Runtime/iostat.h            |   6 +-
 .../include/flang/Runtime}/magic-numbers.h    |   6 +-
 .../include/flang/Runtime/main.h              |   2 +-
 .../flang/Runtime/matmul-instances.inc        |   0
 .../include/flang/Runtime/matmul-transpose.h  |   2 +-
 .../include/flang/Runtime/matmul.h            |   2 +-
 .../include/flang/Runtime/misc-intrinsic.h    |   2 +-
 .../include/flang/Runtime/numeric.h           |   2 +-
 .../include/flang/Runtime/pointer.h           |   6 +-
 .../include/flang/Runtime/ragged.h            |   4 +-
 .../include/flang/Runtime/random.h            |   0
 .../include/flang/Runtime/reduce.h            |   2 +-
 .../include/flang/Runtime/reduction.h         |   2 +-
 .../include/flang/Runtime/stop.h              |   2 +-
 .../include/flang/Runtime/support.h           |   2 +-
 .../include/flang/Runtime/temporary-stack.h   |   2 +-
 .../include/flang/Runtime/time-intrinsic.h    |   2 +-
 .../include/flang/Runtime/transformational.h  |   2 +-
 .../include/flang/Support/Fortran-features.h  |   6 +-
 flang/include/flang/Support/Fortran.h         |   8 +-
 flang/include/flang/Support/MathOptionsBase.h |   6 +-
 flang/include/flang/Support/Version.h         |   6 +-
 flang/include/flang/Support/default-kinds.h   |   6 +-
 flang/include/flang/Support/indirection.h     |   6 +-
 flang/include/flang/Support/interval.h        |   6 +-
 flang/include/flang/Support/template.h        |   6 +-
 flang/include/flang/Support/unwrap.h          |   6 +-
 flang/include/flang/Testing/README.md         |  25 ++++
 .../include/flang/Testing/fp-testing.h        |   0
 .../include/flang/Testing/testing.h           |   0
 flang/lib/Common/CMakeLists.txt               |   6 +-
 flang/lib/Common/README.md                    |  25 ++++
 .../lib/Common/big-radix-floating-point.h     |   0
 .../lib/Common/binary-to-decimal.cpp          |   0
 .../lib/Common/decimal-to-binary.cpp          |   0
 flang/lib/Evaluate/fold-logical.cpp           |   2 +-
 flang/lib/Lower/ConvertVariable.cpp           |   2 +-
 .../Builder/Runtime/ArrayConstructor.cpp      |   6 +-
 flang/lib/Optimizer/CodeGen/CodeGen.cpp       |  18 ++-
 flang/lib/Semantics/compute-offsets.cpp       |   8 +-
 flang/lib/Testing/CMakeLists.txt              |  20 +++
 flang/lib/Testing/README.md                   |  25 ++++
 .../lib/Testing/fp-testing.cpp                |   0
 .../lib/Testing/testing.cpp                   |   0
 flang/module/__fortran_builtins.f90           |   2 +-
 flang/module/__fortran_ieee_exceptions.f90    |   2 +-
 flang/module/ieee_arithmetic.f90              |   2 +-
 flang/module/iso_fortran_env.f90              |   2 +-
 .../unittests/Common/CMakeLists.txt           |   0
 .../unittests/Common/FastIntSetTest.cpp       |   4 +-
 .../unittests/Decimal/CMakeLists.txt          |   0
 .../unittests/Decimal/quick-sanity-test.cpp   |   8 --
 .../unittests/Decimal/thorough-test.cpp       |   8 --
 flang/unittests/Evaluate/CMakeLists.txt       |   4 +-
 .../Builder/Runtime/AllocatableTest.cpp       |   2 +-
 222 files changed, 823 insertions(+), 554 deletions(-)
 rename FortranRuntime/include/{flang => FortranRuntime}/Runtime/allocator-registry.h (82%)
 create mode 100644 FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h
 rename FortranRuntime/include/{flang => FortranRuntime}/Runtime/descriptor.h (96%)
 create mode 100644 FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h
 create mode 100644 FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h
 rename FortranRuntime/include/{flang => FortranRuntime}/Runtime/memory.h (98%)
 rename FortranRuntime/include/{flang => FortranRuntime}/Runtime/type-code.h (97%)
 delete mode 100644 FortranRuntime/include/flang/Runtime/array-constructor.h
 rename {FortranRuntime => flang}/include/flang/Common/Fortran-consts.h (100%)
 rename {FortranRuntime => flang}/include/flang/Common/ISO_Fortran_binding_wrapper.h (97%)
 create mode 100644 flang/include/flang/Common/README.md
 rename {FortranRuntime => flang}/include/flang/Common/api-attrs.h (97%)
 rename {FortranRuntime => flang}/include/flang/Common/binary-floating-point.h (100%)
 rename {FortranRuntime => flang}/include/flang/Common/bit-population-count.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/constexpr-bitset.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/decimal.h (100%)
 rename {FortranRuntime => flang}/include/flang/Common/enum-class.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/enum-set.h (99%)
 rename {FortranRuntime => flang}/include/flang/Common/fast-int-set.h (95%)
 rename {FortranRuntime => flang}/include/flang/Common/float128.h (96%)
 rename {FortranRuntime => flang}/include/flang/Common/format.h (99%)
 rename {FortranRuntime => flang}/include/flang/Common/idioms.h (99%)
 rename {FortranRuntime => flang}/include/flang/Common/leading-zero-bit-count.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/optional.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/real.h (99%)
 rename {FortranRuntime => flang}/include/flang/Common/reference-wrapper.h (96%)
 rename {FortranRuntime => flang}/include/flang/Common/restorer.h (97%)
 rename {FortranRuntime => flang}/include/flang/Common/target-rounding.h (100%)
 rename {FortranRuntime => flang}/include/flang/Common/uint128.h (99%)
 rename {FortranRuntime => flang}/include/flang/Common/variant.h (89%)
 rename {FortranRuntime => flang}/include/flang/Common/visit.h (98%)
 rename {FortranRuntime => flang}/include/flang/Common/windows-include.h (93%)
 rename {FortranRuntime => flang}/include/flang/Runtime/CUDA/allocator.h (93%)
 rename {FortranRuntime => flang}/include/flang/Runtime/CUDA/descriptor.h (91%)
 create mode 100644 flang/include/flang/Runtime/README.md
 rename {FortranRuntime => flang}/include/flang/Runtime/allocatable.h (97%)
 create mode 100644 flang/include/flang/Runtime/allocator-registry-consts.h
 create mode 100644 flang/include/flang/Runtime/array-constructor-consts.h
 rename {FortranRuntime => flang}/include/flang/Runtime/assign.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/c-or-cpp.h (95%)
 rename {FortranRuntime => flang}/include/flang/Runtime/character.h (99%)
 rename {FortranRuntime => flang}/include/flang/Runtime/command.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/cpp-type.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/derived-api.h (98%)
 create mode 100644 flang/include/flang/Runtime/descriptor-consts.h
 rename {FortranRuntime => flang}/include/flang/Runtime/entry-names.h (89%)
 rename {FortranRuntime => flang}/include/flang/Runtime/exceptions.h (86%)
 rename {FortranRuntime => flang}/include/flang/Runtime/execute.h (89%)
 rename {FortranRuntime => flang}/include/flang/Runtime/extensions.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/freestanding-tools.h (99%)
 rename {FortranRuntime => flang}/include/flang/Runtime/inquiry.h (91%)
 rename {FortranRuntime => flang}/include/flang/Runtime/io-api.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/iostat.h (96%)
 rename {FortranRuntime/include/flang/Common => flang/include/flang/Runtime}/magic-numbers.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/main.h (95%)
 rename {FortranRuntime => flang}/include/flang/Runtime/matmul-instances.inc (100%)
 rename {FortranRuntime => flang}/include/flang/Runtime/matmul-transpose.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/matmul.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/misc-intrinsic.h (95%)
 rename {FortranRuntime => flang}/include/flang/Runtime/numeric.h (99%)
 rename {FortranRuntime => flang}/include/flang/Runtime/pointer.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/ragged.h (96%)
 rename {FortranRuntime => flang}/include/flang/Runtime/random.h (100%)
 rename {FortranRuntime => flang}/include/flang/Runtime/reduce.h (99%)
 rename {FortranRuntime => flang}/include/flang/Runtime/reduction.h (99%)
 rename {FortranRuntime => flang}/include/flang/Runtime/stop.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/support.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/temporary-stack.h (98%)
 rename {FortranRuntime => flang}/include/flang/Runtime/time-intrinsic.h (97%)
 rename {FortranRuntime => flang}/include/flang/Runtime/transformational.h (99%)
 create mode 100644 flang/include/flang/Testing/README.md
 rename {FortranRuntime => flang}/include/flang/Testing/fp-testing.h (100%)
 rename {FortranRuntime => flang}/include/flang/Testing/testing.h (100%)
 create mode 100644 flang/lib/Common/README.md
 rename {FortranRuntime => flang}/lib/Common/big-radix-floating-point.h (100%)
 rename {FortranRuntime => flang}/lib/Common/binary-to-decimal.cpp (100%)
 rename {FortranRuntime => flang}/lib/Common/decimal-to-binary.cpp (100%)
 create mode 100644 flang/lib/Testing/CMakeLists.txt
 create mode 100644 flang/lib/Testing/README.md
 rename {FortranRuntime => flang}/lib/Testing/fp-testing.cpp (100%)
 rename {FortranRuntime => flang}/lib/Testing/testing.cpp (100%)
 rename {FortranRuntime => flang}/unittests/Common/CMakeLists.txt (100%)
 rename {FortranRuntime => flang}/unittests/Common/FastIntSetTest.cpp (97%)
 rename {FortranRuntime => flang}/unittests/Decimal/CMakeLists.txt (100%)
 rename {FortranRuntime => flang}/unittests/Decimal/quick-sanity-test.cpp (92%)
 rename {FortranRuntime => flang}/unittests/Decimal/thorough-test.cpp (86%)

diff --git a/FortranRuntime/cmake/config.h.cmake.in b/FortranRuntime/cmake/config.h.cmake.in
index 4fa31c7e89ad7b..8a4668b90addda 100644
--- a/FortranRuntime/cmake/config.h.cmake.in
+++ b/FortranRuntime/cmake/config.h.cmake.in
@@ -1,10 +1,10 @@
-//===-- cmake/config.h.cmake.in ---------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
+/*===-- cmake/config.cmake.in ---------------------------------------*- C -*-===
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===----------------------------------------------------------------------===*/
 
 #ifndef FORTRAN_RUNTIME_CONFIG_H
 #define FORTRAN_RUNTIME_CONFIG_H
diff --git a/FortranRuntime/include/flang/Runtime/allocator-registry.h b/FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h
similarity index 82%
rename from FortranRuntime/include/flang/Runtime/allocator-registry.h
rename to FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h
index 4e7d9bcedfb375..30a583b88c083e 100644
--- a/FortranRuntime/include/flang/Runtime/allocator-registry.h
+++ b/FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/allocator-registry.h --------------*- C++ -*-===//
+//===-- include/FortranRuntime/Runtime/allocator-registry.h -----*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,17 +10,10 @@
 #define FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_
 
 #include "flang/Common/api-attrs.h"
+#include "flang/Runtime/allocator-registry-consts.h"
 #include <cstdlib>
 #include <vector>
 
-static constexpr unsigned kDefaultAllocator = 0;
-
-// Allocator used for CUF
-static constexpr unsigned kPinnedAllocatorPos = 1;
-static constexpr unsigned kDeviceAllocatorPos = 2;
-static constexpr unsigned kManagedAllocatorPos = 3;
-static constexpr unsigned kUnifiedAllocatorPos = 4;
-
 #define MAX_ALLOCATOR 7 // 3 bits are reserved in the descriptor.
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h b/FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h
new file mode 100644
index 00000000000000..314d5e56599cd3
--- /dev/null
+++ b/FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h
@@ -0,0 +1,48 @@
+//===-- include/FortranRuntime/Runtime/array-constructor.h ------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// External APIs to create temporary storage for array constructors when their
+// final extents or length parameters cannot be pre-computed.
+
+#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
+#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
+
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang/Runtime/array-constructor-consts.h"
+#include "flang/Runtime/entry-names.h"
+#include <cstdint>
+
+namespace Fortran::runtime {
+
+// Runtime data structure to hold information about the storage of
+// an array constructor being constructed.
+struct ArrayConstructorVector {
+  RT_API_ATTRS ArrayConstructorVector(class Descriptor &to,
+      SubscriptValue nextValuePosition, SubscriptValue actualAllocationSize,
+      const char *sourceFile, int sourceLine, bool useValueLengthParameters)
+      : to{to}, nextValuePosition{nextValuePosition},
+        actualAllocationSize{actualAllocationSize}, sourceFile{sourceFile},
+        sourceLine{sourceLine},
+        useValueLengthParameters_{useValueLengthParameters} {}
+
+  RT_API_ATTRS bool useValueLengthParameters() const {
+    return useValueLengthParameters_;
+  }
+
+  class Descriptor &to;
+  SubscriptValue nextValuePosition;
+  SubscriptValue actualAllocationSize;
+  const char *sourceFile;
+  int sourceLine;
+
+private:
+  unsigned char useValueLengthParameters_ : 1;
+};
+
+} // namespace Fortran::runtime
+#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/descriptor.h b/FortranRuntime/include/FortranRuntime/Runtime/descriptor.h
similarity index 96%
rename from FortranRuntime/include/flang/Runtime/descriptor.h
rename to FortranRuntime/include/FortranRuntime/Runtime/descriptor.h
index 867f4d4ee29ac0..f79ad6b9637a4a 100644
--- a/FortranRuntime/include/flang/Runtime/descriptor.h
+++ b/FortranRuntime/include/FortranRuntime/Runtime/descriptor.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/descriptor.h ----------------------*- C++ -*-===//
+//===-- include/FortranRuntime/Runtime/descriptor.h -------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -18,9 +18,10 @@
 // User C code is welcome to depend on that ISO_Fortran_binding.h file,
 // but should never reference this internal header.
 
+#include "FortranRuntime/Runtime/memory.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/memory.h"
-#include "flang/Runtime/type-code.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include <algorithm>
 #include <cassert>
 #include <cinttypes>
@@ -28,14 +29,8 @@
 #include <cstdio>
 #include <cstring>
 
-namespace Fortran::runtime::typeInfo {
-using TypeParameterValue = std::int64_t;
-class DerivedType;
-} // namespace Fortran::runtime::typeInfo
-
 namespace Fortran::runtime {
 
-using SubscriptValue = ISO::CFI_index_t;
 class Terminator;
 
 RT_VAR_GROUP_BEGIN
@@ -420,13 +415,6 @@ class Descriptor {
 
   void Dump(FILE * = stdout) const;
 
-// Value of the addendum presence flag.
-#define _CFI_ADDENDUM_FLAG 1
-// Number of bits needed to be shifted when manipulating the allocator index.
-#define _CFI_ALLOCATOR_IDX_SHIFT 1
-// Allocator index mask.
-#define _CFI_ALLOCATOR_IDX_MASK 0b00001110
-
   RT_API_ATTRS inline bool HasAddendum() const {
     return raw_.extra & _CFI_ADDENDUM_FLAG;
   }
@@ -464,6 +452,8 @@ class alignas(Descriptor) StaticDescriptor {
   static constexpr bool hasAddendum{ADDENDUM || MAX_LEN_PARMS > 0};
   static constexpr std::size_t byteSize{
       Descriptor::SizeInBytes(maxRank, hasAddendum, maxLengthTypeParameters)};
+  static_assert(byteSize <=
+      MaxDescriptorSizeInBytes(maxRank, hasAddendum, maxLengthTypeParameters));
   RT_OFFLOAD_VAR_GROUP_END
 
   RT_API_ATTRS Descriptor &descriptor() {
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h b/FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h
new file mode 100644
index 00000000000000..516fe25784656c
--- /dev/null
+++ b/FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h
@@ -0,0 +1,39 @@
+//===-- include/FortranRuntime/Runtime/io-api-funcs.h -----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Defines API between compiled code and I/O runtime library.
+
+#ifndef FORTRAN_RUNTIME_IO_API_FUNCS_H_
+#define FORTRAN_RUNTIME_IO_API_FUNCS_H_
+
+#include "flang/Common/uint128.h"
+#include "flang/Runtime/entry-names.h"
+#include "flang/Runtime/io-api.h"
+#include "flang/Runtime/iostat.h"
+#include "flang/Runtime/magic-numbers.h"
+#include <cinttypes>
+#include <cstddef>
+
+namespace Fortran::runtime {
+class Descriptor;
+} // namespace Fortran::runtime
+
+namespace Fortran::runtime::io {
+
+struct NonTbpDefinedIoTable;
+class NamelistGroup;
+class IoStatementState;
+using Cookie = IoStatementState *;
+using ExternalUnit = int;
+using AsynchronousId = int;
+
+RT_API_ATTRS const char *InquiryKeywordHashDecode(
+    char *buffer, std::size_t, InquiryKeywordHash);
+
+} // namespace Fortran::runtime::io
+#endif /* FORTRAN_RUNTIME_IO_API_FUNCS_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h b/FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h
new file mode 100644
index 00000000000000..10906afb01673c
--- /dev/null
+++ b/FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h
@@ -0,0 +1,23 @@
+//===-- include/FortranRuntime/Runtime/iostat-funcs.h -----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Defines the values returned by the runtime for IOSTAT= specifiers
+// on I/O statements.
+
+#ifndef FORTRAN_RUNTIME_IOSTAT_FUNCS_H_
+#define FORTRAN_RUNTIME_IOSTAT_FUNCS_H_
+
+#include "flang/Common/api-attrs.h"
+#include "flang/Runtime/iostat.h"
+
+namespace Fortran::runtime::io {
+
+RT_API_ATTRS const char *IostatErrorString(int);
+
+} // namespace Fortran::runtime::io
+#endif /* FORTRAN_RUNTIME_IOSTAT_FUNCS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/memory.h b/FortranRuntime/include/FortranRuntime/Runtime/memory.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/memory.h
rename to FortranRuntime/include/FortranRuntime/Runtime/memory.h
index 84af4d7189c074..3e7fd2d9ea3e3b 100644
--- a/FortranRuntime/include/flang/Runtime/memory.h
+++ b/FortranRuntime/include/FortranRuntime/Runtime/memory.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/memory.h --------------------------*- C++ -*-===//
+//===-- include/FortranRuntime/Runtime/memory.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/include/flang/Runtime/type-code.h b/FortranRuntime/include/FortranRuntime/Runtime/type-code.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/type-code.h
rename to FortranRuntime/include/FortranRuntime/Runtime/type-code.h
index ec359f25dbdd12..92ff593410c12c 100644
--- a/FortranRuntime/include/flang/Runtime/type-code.h
+++ b/FortranRuntime/include/FortranRuntime/Runtime/type-code.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/type-code.h -----------------------*- C++ -*-===//
+//===-- include/FortranRuntime/Runtime/type-code.h --------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/include/flang/Runtime/array-constructor.h b/FortranRuntime/include/flang/Runtime/array-constructor.h
deleted file mode 100644
index 82367756f5dc79..00000000000000
--- a/FortranRuntime/include/flang/Runtime/array-constructor.h
+++ /dev/null
@@ -1,118 +0,0 @@
-//===-- include/flang/Runtime/array-constructor.h ---------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// External APIs to create temporary storage for array constructors when their
-// final extents or length parameters cannot be pre-computed.
-
-#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
-#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
-
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/entry-names.h"
-#include <cstdint>
-
-namespace Fortran::runtime {
-
-// Runtime data structure to hold information about the storage of
-// an array constructor being constructed.
-struct ArrayConstructorVector {
-  RT_API_ATTRS ArrayConstructorVector(class Descriptor &to,
-      SubscriptValue nextValuePosition, SubscriptValue actualAllocationSize,
-      const char *sourceFile, int sourceLine, bool useValueLengthParameters)
-      : to{to}, nextValuePosition{nextValuePosition},
-        actualAllocationSize{actualAllocationSize}, sourceFile{sourceFile},
-        sourceLine{sourceLine},
-        useValueLengthParameters_{useValueLengthParameters} {}
-
-  RT_API_ATTRS bool useValueLengthParameters() const {
-    return useValueLengthParameters_;
-  }
-
-  class Descriptor &to;
-  SubscriptValue nextValuePosition;
-  SubscriptValue actualAllocationSize;
-  const char *sourceFile;
-  int sourceLine;
-
-private:
-  unsigned char useValueLengthParameters_ : 1;
-};
-
-// This file defines an API to "push" an evaluated array constructor value
-// "from" into some storage "to" of an array constructor. It can be seen as a
-// form of std::vector::push_back() implementation for Fortran array
-// constructors. In the APIs and ArrayConstructorVector struct above:
-//
-// - "to" is a ranked-1 descriptor whose declared type is already set to the
-// array constructor derived type. It may be already allocated, even before the
-// first call to this API, or it may be unallocated. "to" extent is increased
-// every time a "from" is pushed past its current extent. At this end of the
-// API calls, its extent is the extent of the array constructor. If "to" is
-// unallocated and its extent is not null, it is assumed this is the final array
-// constructor extent value, and the first allocation already "reserves" storage
-// space accordingly to avoid reallocations.
-//  - "from" is a scalar or array descriptor for the evaluated array
-//  constructor value that must be copied into the storage of "to" at
-//  "nextValuePosition".
-//  - "useValueLengthParameters" must be set to true if the array constructor
-//  has length parameters and no type spec. If it is true and "to" is
-//  unallocated, "to" will take the length parameters of "from". If it is true
-//  and "to" is an allocated character array constructor, it will be checked
-//  that "from" length matches the one from "to". When it is false, the
-//  character length must already be set in "to" before the first call to this
-//  API and "from" character lengths are allowed to mismatch from "to".
-// - "nextValuePosition" is the zero based sequence position of "from" in the
-// array constructor. It is updated after this call by the number of "from"
-// elements. It should be set to zero by the caller of this API before the first
-// call.
-// - "actualAllocationSize" is the current allocation size of "to" storage. It
-// may be bigger than "to" extent for reallocation optimization purposes, but
-// should never be smaller, unless this is the first call and "to" is
-// unallocated. It is updated by the runtime after each successful allocation or
-// reallocation. It should be set to "to" extent if "to" is allocated before the
-// first call of this API, and can be left undefined otherwise.
-//
-// Note that this API can be used with "to" being a variable (that can be
-// discontiguous). This can be done when the variable is the left hand side of
-// an assignment from an array constructor as long as:
-//  - none of the ac-value overlaps with the variable,
-//  - this is an intrinsic assignment that is not a whole allocatable
-//  assignment, *and* for a type that has no components requiring user defined
-//  assignments,
-//  - the variable is properly finalized before using this API if its need to,
-//  - "useValueLengthParameters" should be set to false in this case, even if
-//  the array constructor has no type-spec, since the variable may have a
-//  different character length than the array constructor values.
-
-extern "C" {
-// API to initialize an ArrayConstructorVector before any values are pushed to
-// it. Inlined code is only expected to allocate the "ArrayConstructorVector"
-// class instance storage with sufficient size (using
-// "2*sizeof(ArrayConstructorVector)" on the host should be safe regardless of
-// the target the runtime is compiled for). This avoids the need for the runtime
-// to maintain a state, or to use dynamic allocation for it. "vectorClassSize"
-// is used to validate that lowering allocated enough space for it.
-void RTDECL(InitArrayConstructorVector)(ArrayConstructorVector &vector,
-    Descriptor &to, bool useValueLengthParameters, int vectorClassSize,
-    const char *sourceFile = nullptr, int sourceLine = 0);
-
-// Generic API to push any kind of entity into the array constructor (any
-// Fortran type and any rank).
-void RTDECL(PushArrayConstructorValue)(
-    ArrayConstructorVector &vector, const Descriptor &from);
-
-// API to push scalar array constructor value of:
-//   - a numerical or logical type,
-//   - or a derived type that has no length parameters, and no allocatable
-//   component (that would require deep copies).
-// It requires no descriptor for the value that is passed via its base address.
-void RTDECL(PushArrayConstructorSimpleScalar)(
-    ArrayConstructorVector &vector, void *from);
-} // extern "C"
-} // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_ */
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/FortranRuntime/lib/Runtime/CMakeLists.txt
index 1b8944d7641fab..1db5520d5eaedf 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/FortranRuntime/lib/Runtime/CMakeLists.txt
@@ -65,8 +65,8 @@ set(supported_sources
 
 # List of source not used for GPU offloading.
 set(host_sources
-  ../Common/binary-to-decimal.cpp
-  ../Common/decimal-to-binary.cpp
+  ${FLANG_SOURCE_DIR}/lib/Common/binary-to-decimal.cpp
+  ${FLANG_SOURCE_DIR}/lib/Common/decimal-to-binary.cpp
   command.cpp
   complex-powi.cpp
   complex-reduction.c
diff --git a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
index 6401faede9fdf5..c9d62f6ea8f3bf 100644
--- a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/CUDA/allocator.h"
+#include "FortranRuntime/Runtime/CUDA/allocator.h"
+#include "FortranRuntime/Runtime/allocator-registry.h"
 #include "../derived.h"
 #include "../stat.h"
 #include "../terminator.h"
 #include "../type-info.h"
-#include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/allocator-registry.h"
+#include "flang/ISO_Fortran_binding_wrapper.h"
 #include "flang/Support/Fortran.h"
 
 #include "cuda_runtime.h"
diff --git a/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp b/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
index 9664fea4ebc78a..94b5feca4ce4dc 100644
--- a/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
+++ b/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/CUDA/descriptor.h"
-#include "flang/Runtime/CUDA/allocator.h"
+#include "FortranRuntime/Runtime/CUDA/descriptor.h"
+#include "FortranRuntime/Runtime/CUDA/allocator.h"
 
 namespace Fortran::runtime::cuda {
 extern "C" {
diff --git a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
index cb1e0130602260..1449000820f00e 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
+++ b/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
@@ -8,10 +8,10 @@
 
 #ifndef FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
 #define FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
-#include "flang/Common/float128.h"
-#include "flang/Runtime/entry-names.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/float128.h"
+#include "flang/Runtime/entry-names.h"
 #include <cfloat>
 #include <cmath>
 #include <type_traits>
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
index 9711b2bcf49757..997226b08e96a6 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
@@ -9,12 +9,12 @@
 // Implements the required interoperability API from ISO_Fortran_binding.h
 // as specified in section 18.5.5 of Fortran 2018.
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "ISO_Fortran_util.h"
+#include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/pointer.h"
-#include "flang/Runtime/type-code.h"
-#include "terminator.h"
 #include <cstdlib>
 
 namespace Fortran::ISO {
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
index 7ab280733028af..e418266dddccc7 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
+++ b/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
@@ -11,10 +11,10 @@
 
 // Internal utils for establishing CFI_cdesc_t descriptors.
 
-#include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/type-code.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "terminator.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include <cstdlib>
 
 namespace Fortran::ISO {
diff --git a/FortranRuntime/lib/Runtime/allocatable.cpp b/FortranRuntime/lib/Runtime/allocatable.cpp
index 8b6c1a4c1477eb..4a3b89f4879c12 100644
--- a/FortranRuntime/lib/Runtime/allocatable.cpp
+++ b/FortranRuntime/lib/Runtime/allocatable.cpp
@@ -7,14 +7,18 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/allocatable.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "assign-impl.h"
 #include "derived.h"
-#include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/assign.h"
-#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "type-info.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
+#include "flang/Runtime/assign.h"
+
+using Fortran::common::TypeCategory;
+
+
 
 namespace Fortran::runtime {
 extern "C" {
diff --git a/FortranRuntime/lib/Runtime/allocator-registry.cpp b/FortranRuntime/lib/Runtime/allocator-registry.cpp
index edd3685e83a820..17883e5c54870d 100644
--- a/FortranRuntime/lib/Runtime/allocator-registry.cpp
+++ b/FortranRuntime/lib/Runtime/allocator-registry.cpp
@@ -6,16 +6,16 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/allocator-registry.h"
+#include "FortranRuntime/Runtime/allocator-registry.h"
 #include "terminator.h"
 
 namespace Fortran::runtime {
 
-#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS AllocatorRegistry allocatorRegistry;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 RT_API_ATTRS void AllocatorRegistry::Register(int pos, Allocator_t allocator) {
diff --git a/FortranRuntime/lib/Runtime/array-constructor.cpp b/FortranRuntime/lib/Runtime/array-constructor.cpp
index db57d4fc4c3f68..002dfba2c066f5 100644
--- a/FortranRuntime/lib/Runtime/array-constructor.cpp
+++ b/FortranRuntime/lib/Runtime/array-constructor.cpp
@@ -6,14 +6,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/array-constructor.h"
+#include "FortranRuntime/Runtime/array-constructor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "derived.h"
-#include "flang/Runtime/allocatable.h"
-#include "flang/Runtime/assign.h"
-#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
+#include "flang/Runtime/allocatable.h"
+#include "flang/Runtime/assign.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/assign.cpp b/FortranRuntime/lib/Runtime/assign.cpp
index cc38e55e3a9e1e..3a1486ace928a2 100644
--- a/FortranRuntime/lib/Runtime/assign.cpp
+++ b/FortranRuntime/lib/Runtime/assign.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/assign.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "assign-impl.h"
 #include "derived.h"
-#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/buffer.h b/FortranRuntime/lib/Runtime/buffer.h
index dd3c19fa14392f..52df0f10813c25 100644
--- a/FortranRuntime/lib/Runtime/buffer.h
+++ b/FortranRuntime/lib/Runtime/buffer.h
@@ -11,9 +11,9 @@
 #ifndef FORTRAN_RUNTIME_BUFFER_H_
 #define FORTRAN_RUNTIME_BUFFER_H_
 
-#include "flang/Runtime/freestanding-tools.h"
-#include "flang/Runtime/memory.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "io-error.h"
+#include "flang/Runtime/freestanding-tools.h"
 #include <algorithm>
 #include <cinttypes>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/character.cpp b/FortranRuntime/lib/Runtime/character.cpp
index 32fc010c6c04dd..1f3edd6e80392e 100644
--- a/FortranRuntime/lib/Runtime/character.cpp
+++ b/FortranRuntime/lib/Runtime/character.cpp
@@ -7,13 +7,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/character.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "terminator.h"
-#include "tools.h"
 #include <algorithm>
 #include <cstring>
 
diff --git a/FortranRuntime/lib/Runtime/command.cpp b/FortranRuntime/lib/Runtime/command.cpp
index dc57758d4f7955..64b2e62461dd58 100644
--- a/FortranRuntime/lib/Runtime/command.cpp
+++ b/FortranRuntime/lib/Runtime/command.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/command.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "environment.h"
-#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/connection.h b/FortranRuntime/lib/Runtime/connection.h
index 92a3a9c3860a3e..e078bfb9f0f7e7 100644
--- a/FortranRuntime/lib/Runtime/connection.h
+++ b/FortranRuntime/lib/Runtime/connection.h
@@ -11,8 +11,8 @@
 #ifndef FORTRAN_RUNTIME_CONNECTION_H_
 #define FORTRAN_RUNTIME_CONNECTION_H_
 
-#include "flang/Common/optional.h"
 #include "format.h"
+#include "flang/Common/optional.h"
 #include <cinttypes>
 
 namespace Fortran::runtime::io {
diff --git a/FortranRuntime/lib/Runtime/copy.cpp b/FortranRuntime/lib/Runtime/copy.cpp
index 39c7da45172a43..1049b925f68e5c 100644
--- a/FortranRuntime/lib/Runtime/copy.cpp
+++ b/FortranRuntime/lib/Runtime/copy.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "copy.h"
-#include "flang/Runtime/allocatable.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "stack.h"
 #include "terminator.h"
 #include "type-info.h"
+#include "flang/Runtime/allocatable.h"
 #include <cstring>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/copy.h b/FortranRuntime/lib/Runtime/copy.h
index f2c5b41718b71c..3d179d0bec91a7 100644
--- a/FortranRuntime/lib/Runtime/copy.h
+++ b/FortranRuntime/lib/Runtime/copy.h
@@ -12,7 +12,7 @@
 #ifndef FORTRAN_RUNTIME_COPY_H_
 #define FORTRAN_RUNTIME_COPY_H_
 
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/derived-api.cpp b/FortranRuntime/lib/Runtime/derived-api.cpp
index 4b68cdbbed7b2c..176fc0849f25cf 100644
--- a/FortranRuntime/lib/Runtime/derived-api.cpp
+++ b/FortranRuntime/lib/Runtime/derived-api.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/derived-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "derived.h"
-#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
diff --git a/FortranRuntime/lib/Runtime/derived.cpp b/FortranRuntime/lib/Runtime/derived.cpp
index 52bf54d62c8599..cb2dca24bb4758 100644
--- a/FortranRuntime/lib/Runtime/derived.cpp
+++ b/FortranRuntime/lib/Runtime/derived.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "derived.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/descriptor-io.h b/FortranRuntime/lib/Runtime/descriptor-io.h
index 2ccad0cea70a29..30d1bd48457728 100644
--- a/FortranRuntime/lib/Runtime/descriptor-io.h
+++ b/FortranRuntime/lib/Runtime/descriptor-io.h
@@ -14,17 +14,17 @@
 // some scalar I/O data transfer APIs could be changed to bypass their use
 // of descriptors in the future for better efficiency.)
 
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "edit-input.h"
 #include "edit-output.h"
-#include "flang/Common/optional.h"
-#include "flang/Common/uint128.h"
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include "io-stmt.h"
 #include "namelist.h"
 #include "terminator.h"
 #include "type-info.h"
 #include "unit.h"
+#include "flang/Common/optional.h"
+#include "flang/Common/uint128.h"
+#include "flang/Runtime/cpp-type.h"
 
 namespace Fortran::runtime::io::descr {
 template <typename A>
diff --git a/FortranRuntime/lib/Runtime/descriptor.cpp b/FortranRuntime/lib/Runtime/descriptor.cpp
index 6756134b06e7b1..96fd48eb6687a9 100644
--- a/FortranRuntime/lib/Runtime/descriptor.cpp
+++ b/FortranRuntime/lib/Runtime/descriptor.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/allocator-registry.h"
 #include "ISO_Fortran_util.h"
 #include "derived.h"
-#include "flang/Runtime/allocator-registry.h"
 #include "memory.h"
 #include "stat.h"
 #include "terminator.h"
@@ -141,8 +141,10 @@ RT_API_ATTRS OwningPtr<Descriptor> Descriptor::Create(
 
 RT_API_ATTRS std::size_t Descriptor::SizeInBytes() const {
   const DescriptorAddendum *addendum{Addendum()};
-  return sizeof *this - sizeof(Dimension) + raw_.rank * sizeof(Dimension) +
-      (addendum ? addendum->SizeInBytes() : 0);
+  std::size_t bytes{ sizeof *this - sizeof(Dimension) + raw_.rank * sizeof(Dimension) +
+      (addendum ? addendum->SizeInBytes() : 0)};
+  assert (bytes <= MaxDescriptorSizeInBytes(raw_.rank,addendum) && "Descriptor must fit compiler-allocated space");
+  return bytes;
 }
 
 RT_API_ATTRS std::size_t Descriptor::Elements() const {
diff --git a/FortranRuntime/lib/Runtime/dot-product.cpp b/FortranRuntime/lib/Runtime/dot-product.cpp
index ab1cfa58ef3d02..2992cbb1f39ad6 100644
--- a/FortranRuntime/lib/Runtime/dot-product.cpp
+++ b/FortranRuntime/lib/Runtime/dot-product.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/float128.h"
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/reduction.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "float.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/float128.h"
+#include "flang/Runtime/cpp-type.h"
+#include "flang/Runtime/reduction.h"
 #include <cfloat>
 #include <cinttypes>
 
diff --git a/FortranRuntime/lib/Runtime/edit-input.cpp b/FortranRuntime/lib/Runtime/edit-input.cpp
index eaa9d0d7e641e7..6ebb0e7aca4ade 100644
--- a/FortranRuntime/lib/Runtime/edit-input.cpp
+++ b/FortranRuntime/lib/Runtime/edit-input.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "edit-input.h"
+#include "namelist.h"
+#include "utf.h"
 #include "flang/Common/optional.h"
 #include "flang/Common/real.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/freestanding-tools.h"
-#include "namelist.h"
-#include "utf.h"
 #include <algorithm>
 #include <cfenv>
 
diff --git a/FortranRuntime/lib/Runtime/edit-input.h b/FortranRuntime/lib/Runtime/edit-input.h
index 2eda81a6d4e11d..f88f6daa47be79 100644
--- a/FortranRuntime/lib/Runtime/edit-input.h
+++ b/FortranRuntime/lib/Runtime/edit-input.h
@@ -9,9 +9,9 @@
 #ifndef FORTRAN_RUNTIME_EDIT_INPUT_H_
 #define FORTRAN_RUNTIME_EDIT_INPUT_H_
 
-#include "flang/Common/decimal.h"
 #include "format.h"
 #include "io-stmt.h"
+#include "flang/Common/decimal.h"
 
 namespace Fortran::runtime::io {
 
diff --git a/FortranRuntime/lib/Runtime/edit-output.cpp b/FortranRuntime/lib/Runtime/edit-output.cpp
index 1fab7db6d3b187..ccaf8085f016fd 100644
--- a/FortranRuntime/lib/Runtime/edit-output.cpp
+++ b/FortranRuntime/lib/Runtime/edit-output.cpp
@@ -8,9 +8,9 @@
 
 #include "edit-output.h"
 #include "emit-encoded.h"
+#include "utf.h"
 #include "flang/Common/real.h"
 #include "flang/Common/uint128.h"
-#include "utf.h"
 #include <algorithm>
 
 namespace Fortran::runtime::io {
diff --git a/FortranRuntime/lib/Runtime/edit-output.h b/FortranRuntime/lib/Runtime/edit-output.h
index cb25b68a35f05b..7e6c6cdedde3ac 100644
--- a/FortranRuntime/lib/Runtime/edit-output.h
+++ b/FortranRuntime/lib/Runtime/edit-output.h
@@ -18,10 +18,10 @@
 // Drives the same fast binary-to-decimal formatting templates used
 // in the f18 front-end.
 
-#include "flang/Common/decimal.h"
-#include "flang/Common/uint128.h"
 #include "format.h"
 #include "io-stmt.h"
+#include "flang/Common/decimal.h"
+#include "flang/Common/uint128.h"
 
 namespace Fortran::runtime::io {
 
diff --git a/FortranRuntime/lib/Runtime/environment.cpp b/FortranRuntime/lib/Runtime/environment.cpp
index 9cbb198dd9141c..272914877988a5 100644
--- a/FortranRuntime/lib/Runtime/environment.cpp
+++ b/FortranRuntime/lib/Runtime/environment.cpp
@@ -23,11 +23,11 @@ extern char **environ;
 
 namespace Fortran::runtime {
 
-#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExecutionEnvironment executionEnvironment;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 
 static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) {
   if (!envDefaults) {
diff --git a/FortranRuntime/lib/Runtime/execute.cpp b/FortranRuntime/lib/Runtime/execute.cpp
index 54f28d052873b4..b333c61c8a59f4 100644
--- a/FortranRuntime/lib/Runtime/execute.cpp
+++ b/FortranRuntime/lib/Runtime/execute.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/execute.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "environment.h"
-#include "flang/Runtime/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/extensions.cpp b/FortranRuntime/lib/Runtime/extensions.cpp
index 94bfa3059e6b45..bb25fe6ee9d886 100644
--- a/FortranRuntime/lib/Runtime/extensions.cpp
+++ b/FortranRuntime/lib/Runtime/extensions.cpp
@@ -10,12 +10,12 @@
 // extensions that will eventually be implemented in Fortran.
 
 #include "flang/Runtime/extensions.h"
-#include "flang/Runtime/command.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/entry-names.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Runtime/command.h"
+#include "flang/Runtime/entry-names.h"
 #include <chrono>
 #include <cstring>
 #include <ctime>
diff --git a/FortranRuntime/lib/Runtime/extrema.cpp b/FortranRuntime/lib/Runtime/extrema.cpp
index 0809cb1d5f2ae2..be9da63d7bd6b8 100644
--- a/FortranRuntime/lib/Runtime/extrema.cpp
+++ b/FortranRuntime/lib/Runtime/extrema.cpp
@@ -10,10 +10,10 @@
 // and shapes and (for MAXLOC & MINLOC) result integer kinds.  Also implements
 // NORM2 using common infrastructure.
 
+#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/reduction.h"
-#include "reduction-templates.h"
 #include <algorithm>
 #include <cfloat>
 #include <cinttypes>
diff --git a/FortranRuntime/lib/Runtime/file.cpp b/FortranRuntime/lib/Runtime/file.cpp
index 80829d844881e8..de52dafd12df9a 100644
--- a/FortranRuntime/lib/Runtime/file.cpp
+++ b/FortranRuntime/lib/Runtime/file.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "file.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "tools.h"
-#include "flang/Common/magic-numbers.h"
-#include "flang/Runtime/memory.h"
+#include "flang/Runtime/magic-numbers.h"
 #include <algorithm>
 #include <cerrno>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/file.h b/FortranRuntime/lib/Runtime/file.h
index 66d62756634b24..60ddf2a2741610 100644
--- a/FortranRuntime/lib/Runtime/file.h
+++ b/FortranRuntime/lib/Runtime/file.h
@@ -11,9 +11,9 @@
 #ifndef FORTRAN_RUNTIME_FILE_H_
 #define FORTRAN_RUNTIME_FILE_H_
 
-#include "flang/Common/optional.h"
-#include "flang/Runtime/memory.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "io-error.h"
+#include "flang/Common/optional.h"
 #include <cinttypes>
 
 namespace Fortran::runtime::io {
diff --git a/FortranRuntime/lib/Runtime/findloc.cpp b/FortranRuntime/lib/Runtime/findloc.cpp
index 47c51fbcef4939..da5fe0c0a0a467 100644
--- a/FortranRuntime/lib/Runtime/findloc.cpp
+++ b/FortranRuntime/lib/Runtime/findloc.cpp
@@ -9,9 +9,9 @@
 // Implements FINDLOC for all required operand types and shapes and result
 // integer kinds.
 
+#include "reduction-templates.h"
 #include "flang/Runtime/character.h"
 #include "flang/Runtime/reduction.h"
-#include "reduction-templates.h"
 #include <cinttypes>
 #include <complex>
 
diff --git a/FortranRuntime/lib/Runtime/format-implementation.h b/FortranRuntime/lib/Runtime/format-implementation.h
index 8d0d0f3376eafc..f17f0a2cb4bfd9 100644
--- a/FortranRuntime/lib/Runtime/format-implementation.h
+++ b/FortranRuntime/lib/Runtime/format-implementation.h
@@ -12,12 +12,12 @@
 #define FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_
 
 #include "emit-encoded.h"
-#include "flang/Common/decimal.h"
-#include "flang/Common/format.h"
-#include "flang/Runtime/main.h"
 #include "format.h"
 #include "io-stmt.h"
 #include "memory.h"
+#include "flang/Common/decimal.h"
+#include "flang/Common/format.h"
+#include "flang/Runtime/main.h"
 #include <algorithm>
 #include <cstring>
 #include <limits>
diff --git a/FortranRuntime/lib/Runtime/format.h b/FortranRuntime/lib/Runtime/format.h
index 3e0807ee452a7e..098a251a04d568 100644
--- a/FortranRuntime/lib/Runtime/format.h
+++ b/FortranRuntime/lib/Runtime/format.h
@@ -12,11 +12,11 @@
 #define FORTRAN_RUNTIME_FORMAT_H_
 
 #include "environment.h"
+#include "io-error.h"
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/decimal.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/freestanding-tools.h"
-#include "io-error.h"
 #include <cinttypes>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/inquiry.cpp b/FortranRuntime/lib/Runtime/inquiry.cpp
index 172b46037d6c4b..c24492754b4f43 100644
--- a/FortranRuntime/lib/Runtime/inquiry.cpp
+++ b/FortranRuntime/lib/Runtime/inquiry.cpp
@@ -10,8 +10,8 @@
 // inquire about shape information of arrays -- LBOUND and SIZE.
 
 #include "flang/Runtime/inquiry.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "copy.h"
-#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include <algorithm>
diff --git a/FortranRuntime/lib/Runtime/internal-unit.cpp b/FortranRuntime/lib/Runtime/internal-unit.cpp
index 81b937ba63d4b8..4494de9dddc1a1 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.cpp
+++ b/FortranRuntime/lib/Runtime/internal-unit.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "internal-unit.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/freestanding-tools.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "io-error.h"
+#include "flang/Runtime/freestanding-tools.h"
 #include <algorithm>
 #include <type_traits>
 
@@ -36,6 +36,8 @@ RT_API_ATTRS InternalDescriptorUnit<DIR>::InternalDescriptorUnit(
   Descriptor &d{descriptor()};
   RUNTIME_CHECK(
       terminator, that.SizeInBytes() <= d.SizeInBytes(maxRank, true, 0));
+  RUNTIME_CHECK(terminator,
+      that.SizeInBytes() <= MaxDescriptorSizeInBytes(maxRank, true, 0));
   new (&d) Descriptor{that};
   d.Check();
   internalIoCharKind = thatType->second;
diff --git a/FortranRuntime/lib/Runtime/internal-unit.h b/FortranRuntime/lib/Runtime/internal-unit.h
index c4107696810f2b..7579016f14646d 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.h
+++ b/FortranRuntime/lib/Runtime/internal-unit.h
@@ -11,8 +11,8 @@
 #ifndef FORTRAN_RUNTIME_INTERNAL_UNIT_H_
 #define FORTRAN_RUNTIME_INTERNAL_UNIT_H_
 
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "connection.h"
-#include "flang/Runtime/descriptor.h"
 #include <cinttypes>
 #include <type_traits>
 
diff --git a/FortranRuntime/lib/Runtime/io-api-common.h b/FortranRuntime/lib/Runtime/io-api-common.h
index 427666723501a2..fed1d11d6ce6a6 100644
--- a/FortranRuntime/lib/Runtime/io-api-common.h
+++ b/FortranRuntime/lib/Runtime/io-api-common.h
@@ -9,12 +9,12 @@
 #ifndef FORTRAN_RUNTIME_IO_API_COMMON_H_
 #define FORTRAN_RUNTIME_IO_API_COMMON_H_
 
-#include "flang/Common/api-attrs.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "io-stmt.h"
 #include "terminator.h"
 #include "unit.h"
+#include "flang/Common/api-attrs.h"
+#include "flang/Common/optional.h"
 
 namespace Fortran::runtime::io {
 
diff --git a/FortranRuntime/lib/Runtime/io-api-minimal.cpp b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
index 683694bd63c068..8cde2333804572 100644
--- a/FortranRuntime/lib/Runtime/io-api-minimal.cpp
+++ b/FortranRuntime/lib/Runtime/io-api-minimal.cpp
@@ -9,8 +9,8 @@
 // Implements the subset of the I/O statement API needed for basic
 // list-directed output (PRINT *) of intrinsic types.
 
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "edit-output.h"
-#include "flang/Runtime/io-api.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
diff --git a/FortranRuntime/lib/Runtime/io-api.cpp b/FortranRuntime/lib/Runtime/io-api.cpp
index 102ea26b359111..fa95d68a004b51 100644
--- a/FortranRuntime/lib/Runtime/io-api.cpp
+++ b/FortranRuntime/lib/Runtime/io-api.cpp
@@ -13,20 +13,20 @@
 // OutputReal{32,64}, OutputComplex{32,64}, OutputAscii, & EndIoStatement()
 // are in runtime/io-api-minimal.cpp.
 
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "descriptor-io.h"
 #include "edit-input.h"
 #include "edit-output.h"
 #include "environment.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
 #include "terminator.h"
 #include "tools.h"
 #include "unit.h"
+#include "flang/Common/optional.h"
 #include <cstdlib>
 #include <memory>
 
diff --git a/FortranRuntime/lib/Runtime/io-error.cpp b/FortranRuntime/lib/Runtime/io-error.cpp
index 400b211c1c418e..053667462058de 100644
--- a/FortranRuntime/lib/Runtime/io-error.cpp
+++ b/FortranRuntime/lib/Runtime/io-error.cpp
@@ -9,7 +9,7 @@
 #include "io-error.h"
 #include "config.h"
 #include "tools.h"
-#include "flang/Common/magic-numbers.h"
+#include "flang/Runtime/magic-numbers.h"
 #include <cerrno>
 #include <cstdarg>
 #include <cstdio>
diff --git a/FortranRuntime/lib/Runtime/io-error.h b/FortranRuntime/lib/Runtime/io-error.h
index 7388a2134ed0d3..e2018cc2ea0ab1 100644
--- a/FortranRuntime/lib/Runtime/io-error.h
+++ b/FortranRuntime/lib/Runtime/io-error.h
@@ -15,8 +15,8 @@
 #ifndef FORTRAN_RUNTIME_IO_ERROR_H_
 #define FORTRAN_RUNTIME_IO_ERROR_H_
 
-#include "flang/Runtime/iostat.h"
-#include "flang/Runtime/memory.h"
+#include "FortranRuntime/Runtime/iostat-funcs.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "terminator.h"
 #include <cinttypes>
 
diff --git a/FortranRuntime/lib/Runtime/io-stmt.cpp b/FortranRuntime/lib/Runtime/io-stmt.cpp
index 5be5d98ace0d8a..fe02e221671665 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.cpp
+++ b/FortranRuntime/lib/Runtime/io-stmt.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "io-stmt.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "connection.h"
 #include "emit-encoded.h"
-#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "tools.h"
 #include "unit.h"
diff --git a/FortranRuntime/lib/Runtime/io-stmt.h b/FortranRuntime/lib/Runtime/io-stmt.h
index 79a8b28c8aa19f..21746ff1966218 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.h
+++ b/FortranRuntime/lib/Runtime/io-stmt.h
@@ -11,16 +11,16 @@
 #ifndef FORTRAN_RUNTIME_IO_STMT_H_
 #define FORTRAN_RUNTIME_IO_STMT_H_
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "connection.h"
 #include "file.h"
-#include "flang/Common/optional.h"
-#include "flang/Common/reference-wrapper.h"
-#include "flang/Common/visit.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
 #include "format.h"
 #include "internal-unit.h"
 #include "io-error.h"
+#include "flang/Common/optional.h"
+#include "flang/Common/reference-wrapper.h"
+#include "flang/Common/visit.h"
 #include <flang/Common/variant.h>
 #include <functional>
 #include <type_traits>
diff --git a/FortranRuntime/lib/Runtime/iostat.cpp b/FortranRuntime/lib/Runtime/iostat.cpp
index f23567be4910da..8d769a09252fd6 100644
--- a/FortranRuntime/lib/Runtime/iostat.cpp
+++ b/FortranRuntime/lib/Runtime/iostat.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/iostat.h"
+#include "FortranRuntime/Runtime/iostat-funcs.h"
 
 namespace Fortran::runtime::io {
 RT_OFFLOAD_API_GROUP_BEGIN
diff --git a/FortranRuntime/lib/Runtime/matmul-transpose.cpp b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
index 3b4b487daa335e..ec5388e3fca793 100644
--- a/FortranRuntime/lib/Runtime/matmul-transpose.cpp
+++ b/FortranRuntime/lib/Runtime/matmul-transpose.cpp
@@ -21,12 +21,12 @@
 // to use the faster BLAS routines.
 
 #include "flang/Runtime/matmul-transpose.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/c-or-cpp.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "terminator.h"
-#include "tools.h"
 #include <cstring>
 
 namespace {
diff --git a/FortranRuntime/lib/Runtime/matmul.cpp b/FortranRuntime/lib/Runtime/matmul.cpp
index 62674316bc6a57..01be7f7c75bc45 100644
--- a/FortranRuntime/lib/Runtime/matmul.cpp
+++ b/FortranRuntime/lib/Runtime/matmul.cpp
@@ -20,12 +20,12 @@
 // Places where BLAS routines could be called are marked as TODO items.
 
 #include "flang/Runtime/matmul.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "terminator.h"
+#include "tools.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/c-or-cpp.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "terminator.h"
-#include "tools.h"
 #include <cstring>
 
 namespace {
diff --git a/FortranRuntime/lib/Runtime/memory.cpp b/FortranRuntime/lib/Runtime/memory.cpp
index bf2c4cd4a35470..a4cebf7edc6c64 100644
--- a/FortranRuntime/lib/Runtime/memory.cpp
+++ b/FortranRuntime/lib/Runtime/memory.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/memory.h"
-#include "flang/Runtime/freestanding-tools.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Runtime/freestanding-tools.h"
 #include <cstdlib>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
index a0f41e4e3f156c..91a3b136e009a5 100644
--- a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/misc-intrinsic.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/optional.h"
 #include <algorithm>
 #include <cstdio>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/namelist.cpp b/FortranRuntime/lib/Runtime/namelist.cpp
index 1c8942fc375c43..46036549bcd316 100644
--- a/FortranRuntime/lib/Runtime/namelist.cpp
+++ b/FortranRuntime/lib/Runtime/namelist.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "namelist.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "descriptor-io.h"
 #include "emit-encoded.h"
-#include "flang/Runtime/io-api.h"
 #include "io-stmt.h"
 #include <algorithm>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/namelist.h b/FortranRuntime/lib/Runtime/namelist.h
index 2c4d331ae05e85..04432f8a08cb97 100644
--- a/FortranRuntime/lib/Runtime/namelist.h
+++ b/FortranRuntime/lib/Runtime/namelist.h
@@ -11,8 +11,8 @@
 #ifndef FORTRAN_RUNTIME_NAMELIST_H_
 #define FORTRAN_RUNTIME_NAMELIST_H_
 
-#include "flang/Common/api-attrs.h"
 #include "non-tbp-dio.h"
+#include "flang/Common/api-attrs.h"
 
 #include <cstddef>
 
diff --git a/FortranRuntime/lib/Runtime/numeric-templates.h b/FortranRuntime/lib/Runtime/numeric-templates.h
index f0045e8ee36e20..159b8b0b9579ad 100644
--- a/FortranRuntime/lib/Runtime/numeric-templates.h
+++ b/FortranRuntime/lib/Runtime/numeric-templates.h
@@ -18,10 +18,10 @@
 #ifndef FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
 #define FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
 
-#include "flang/Common/api-attrs.h"
-#include "flang/Common/float128.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/api-attrs.h"
+#include "flang/Common/float128.h"
 #include <cstdint>
 #include <limits>
 
diff --git a/FortranRuntime/lib/Runtime/numeric.cpp b/FortranRuntime/lib/Runtime/numeric.cpp
index a3fcfeaa9ee266..b0f68a7fc81d29 100644
--- a/FortranRuntime/lib/Runtime/numeric.cpp
+++ b/FortranRuntime/lib/Runtime/numeric.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/numeric.h"
-#include "flang/Common/float128.h"
 #include "numeric-templates.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/float128.h"
 #include <cfloat>
 #include <climits>
 #include <cmath>
diff --git a/FortranRuntime/lib/Runtime/product.cpp b/FortranRuntime/lib/Runtime/product.cpp
index 8c11bf4144919e..e4a6e81bd0c508 100644
--- a/FortranRuntime/lib/Runtime/product.cpp
+++ b/FortranRuntime/lib/Runtime/product.cpp
@@ -8,9 +8,9 @@
 
 // Implements PRODUCT for all required operand types and shapes.
 
+#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/reduction.h"
-#include "reduction-templates.h"
 #include <cfloat>
 #include <cinttypes>
 #include <complex>
diff --git a/FortranRuntime/lib/Runtime/random-templates.h b/FortranRuntime/lib/Runtime/random-templates.h
index 801484225bc211..9faa9c7cfa7002 100644
--- a/FortranRuntime/lib/Runtime/random-templates.h
+++ b/FortranRuntime/lib/Runtime/random-templates.h
@@ -9,10 +9,10 @@
 #ifndef FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
 #define FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
 
-#include "flang/Common/optional.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "lock.h"
 #include "numeric-templates.h"
+#include "flang/Common/optional.h"
 #include <algorithm>
 #include <random>
 
diff --git a/FortranRuntime/lib/Runtime/random.cpp b/FortranRuntime/lib/Runtime/random.cpp
index 8e1561960d48be..911b59b508eb4f 100644
--- a/FortranRuntime/lib/Runtime/random.cpp
+++ b/FortranRuntime/lib/Runtime/random.cpp
@@ -10,14 +10,14 @@
 // RANDOM_SEED.
 
 #include "flang/Runtime/random.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "lock.h"
+#include "random-templates.h"
+#include "terminator.h"
 #include "flang/Common/float128.h"
 #include "flang/Common/leading-zero-bit-count.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "lock.h"
-#include "random-templates.h"
-#include "terminator.h"
 #include <cmath>
 #include <cstdint>
 #include <limits>
diff --git a/FortranRuntime/lib/Runtime/reduce.cpp b/FortranRuntime/lib/Runtime/reduce.cpp
index 4d33c2a714e5af..a020ffef6fe6a5 100644
--- a/FortranRuntime/lib/Runtime/reduce.cpp
+++ b/FortranRuntime/lib/Runtime/reduce.cpp
@@ -9,7 +9,7 @@
 // REDUCE() implementation
 
 #include "flang/Runtime/reduce.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "reduction-templates.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/reduction-templates.h b/FortranRuntime/lib/Runtime/reduction-templates.h
index 30ae641ba7b3ac..714584ec613ba3 100644
--- a/FortranRuntime/lib/Runtime/reduction-templates.h
+++ b/FortranRuntime/lib/Runtime/reduction-templates.h
@@ -21,11 +21,11 @@
 #ifndef FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
 #define FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
 
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "numeric-templates.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Runtime/cpp-type.h"
 #include <algorithm>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/reduction.cpp b/FortranRuntime/lib/Runtime/reduction.cpp
index f4e1f2aa6818d5..21930fee07ead7 100644
--- a/FortranRuntime/lib/Runtime/reduction.cpp
+++ b/FortranRuntime/lib/Runtime/reduction.cpp
@@ -14,7 +14,7 @@
 // NORM2, MAXLOC, MINLOC, MAXVAL, and MINVAL are in extrema.cpp.
 
 #include "flang/Runtime/reduction.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "reduction-templates.h"
 #include <cinttypes>
 
diff --git a/FortranRuntime/lib/Runtime/stack.h b/FortranRuntime/lib/Runtime/stack.h
index dc5b6101d3da0f..36e2d0a103a887 100644
--- a/FortranRuntime/lib/Runtime/stack.h
+++ b/FortranRuntime/lib/Runtime/stack.h
@@ -13,7 +13,7 @@
 #ifndef FORTRAN_RUNTIME_STACK_H_
 #define FORTRAN_RUNTIME_STACK_H_
 
-#include "flang/Runtime/memory.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "terminator.h"
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/stat.cpp b/FortranRuntime/lib/Runtime/stat.cpp
index 01ae922e080865..1af6c43102518b 100644
--- a/FortranRuntime/lib/Runtime/stat.cpp
+++ b/FortranRuntime/lib/Runtime/stat.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "stat.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 
diff --git a/FortranRuntime/lib/Runtime/stat.h b/FortranRuntime/lib/Runtime/stat.h
index a679f9da16dd46..eccd69024d726b 100644
--- a/FortranRuntime/lib/Runtime/stat.h
+++ b/FortranRuntime/lib/Runtime/stat.h
@@ -13,7 +13,7 @@
 #define FORTRAN_RUNTIME_STAT_H_
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Common/api-attrs.h"
-#include "flang/Common/magic-numbers.h"
+#include "flang/Runtime/magic-numbers.h"
 namespace Fortran::runtime {
 
 class Descriptor;
diff --git a/FortranRuntime/lib/Runtime/sum.cpp b/FortranRuntime/lib/Runtime/sum.cpp
index e33b77e20f0f11..64982b9fd53690 100644
--- a/FortranRuntime/lib/Runtime/sum.cpp
+++ b/FortranRuntime/lib/Runtime/sum.cpp
@@ -12,9 +12,9 @@
 // cancellation on intermediate results by using "Kahan summation"
 // (basically the same as manual "double-double").
 
+#include "reduction-templates.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/reduction.h"
-#include "reduction-templates.h"
 #include <cfloat>
 #include <cinttypes>
 #include <complex>
diff --git a/FortranRuntime/lib/Runtime/support.cpp b/FortranRuntime/lib/Runtime/support.cpp
index 0a39ff24b0cafc..798d502ba248e2 100644
--- a/FortranRuntime/lib/Runtime/support.cpp
+++ b/FortranRuntime/lib/Runtime/support.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/support.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "ISO_Fortran_util.h"
-#include "flang/Runtime/descriptor.h"
 #include "type-info.h"
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/temporary-stack.cpp b/FortranRuntime/lib/Runtime/temporary-stack.cpp
index f944dfb7aa1471..d8ff08e51cc211 100644
--- a/FortranRuntime/lib/Runtime/temporary-stack.cpp
+++ b/FortranRuntime/lib/Runtime/temporary-stack.cpp
@@ -10,11 +10,11 @@
 // temporaries. For use in HLFIR lowering.
 
 #include "flang/Runtime/temporary-stack.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/memory.h"
+#include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/memory.h"
-#include "terminator.h"
 
 namespace {
 
diff --git a/FortranRuntime/lib/Runtime/time-intrinsic.cpp b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
index 4b362c90c52f25..15c42077c0afd5 100644
--- a/FortranRuntime/lib/Runtime/time-intrinsic.cpp
+++ b/FortranRuntime/lib/Runtime/time-intrinsic.cpp
@@ -9,10 +9,10 @@
 // Implements time-related intrinsic subroutines.
 
 #include "flang/Runtime/time-intrinsic.h"
-#include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Runtime/cpp-type.h"
 #include <algorithm>
 #include <cstdint>
 #include <cstdio>
diff --git a/FortranRuntime/lib/Runtime/tools.h b/FortranRuntime/lib/Runtime/tools.h
index 4058767ca283a9..332ffac77f2595 100644
--- a/FortranRuntime/lib/Runtime/tools.h
+++ b/FortranRuntime/lib/Runtime/tools.h
@@ -9,13 +9,13 @@
 #ifndef FORTRAN_RUNTIME_TOOLS_H_
 #define FORTRAN_RUNTIME_TOOLS_H_
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/memory.h"
+#include "stat.h"
+#include "terminator.h"
 #include "flang/Common/optional.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/freestanding-tools.h"
-#include "flang/Runtime/memory.h"
-#include "stat.h"
-#include "terminator.h"
 #include <cstring>
 #include <functional>
 #include <map>
diff --git a/FortranRuntime/lib/Runtime/transformational.cpp b/FortranRuntime/lib/Runtime/transformational.cpp
index 66dc5bd4939bae..28dd02a28036de 100644
--- a/FortranRuntime/lib/Runtime/transformational.cpp
+++ b/FortranRuntime/lib/Runtime/transformational.cpp
@@ -17,11 +17,11 @@
 // of the standard but it more likely to conform with its intent.
 
 #include "flang/Runtime/transformational.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "copy.h"
-#include "flang/Common/float128.h"
-#include "flang/Runtime/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
+#include "flang/Common/float128.h"
 
 namespace Fortran::runtime {
 
diff --git a/FortranRuntime/lib/Runtime/type-code.cpp b/FortranRuntime/lib/Runtime/type-code.cpp
index 2709ca1be75a53..16f5497bc7a709 100644
--- a/FortranRuntime/lib/Runtime/type-code.cpp
+++ b/FortranRuntime/lib/Runtime/type-code.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/type-code.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include <cstdint>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/type-info.cpp b/FortranRuntime/lib/Runtime/type-info.cpp
index 24fc9c33d92819..19e9211fc063f4 100644
--- a/FortranRuntime/lib/Runtime/type-info.cpp
+++ b/FortranRuntime/lib/Runtime/type-info.cpp
@@ -84,10 +84,14 @@ RT_API_ATTRS std::size_t Component::SizeInBytes(
     return GetElementByteSize(instance) * GetElements(instance);
   } else if (category() == TypeCategory::Derived) {
     const DerivedType *type{derivedType()};
-    return Descriptor::SizeInBytes(
-        rank_, true, type ? type->LenParameters() : 0);
+    auto bytes {Descriptor::SizeInBytes(
+        rank_, true, type ? type->LenParameters() : 0)};
+    assert(bytes <=  MaxDescriptorSizeInBytes(  rank_, true, type ? type->LenParameters() : 0));
+    return bytes;
   } else {
-    return Descriptor::SizeInBytes(rank_);
+    auto bytes{ Descriptor::SizeInBytes(rank_)};
+        assert(bytes <=  MaxDescriptorSizeInBytes(  rank_));
+        return bytes;
   }
 }
 
diff --git a/FortranRuntime/lib/Runtime/type-info.h b/FortranRuntime/lib/Runtime/type-info.h
index ff3523bcb2b8eb..150942547c2ee8 100644
--- a/FortranRuntime/lib/Runtime/type-info.h
+++ b/FortranRuntime/lib/Runtime/type-info.h
@@ -12,11 +12,11 @@
 // A C++ perspective of the derived type description schemata in
 // flang/module/__fortran_type_info.f90.
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "terminator.h"
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/bit-population-count.h"
 #include "flang/Common/optional.h"
-#include "flang/Runtime/descriptor.h"
-#include "terminator.h"
 #include <cinttypes>
 #include <memory>
 
diff --git a/FortranRuntime/lib/Runtime/unit-map.h b/FortranRuntime/lib/Runtime/unit-map.h
index 4e61246f9a2d86..f37e2df7f3b15a 100644
--- a/FortranRuntime/lib/Runtime/unit-map.h
+++ b/FortranRuntime/lib/Runtime/unit-map.h
@@ -12,10 +12,10 @@
 #ifndef FORTRAN_RUNTIME_UNIT_MAP_H_
 #define FORTRAN_RUNTIME_UNIT_MAP_H_
 
-#include "flang/Common/fast-int-set.h"
-#include "flang/Runtime/memory.h"
+#include "FortranRuntime/Runtime/memory.h"
 #include "lock.h"
 #include "unit.h"
+#include "flang/Common/fast-int-set.h"
 #include <cstdint>
 #include <cstdlib>
 
diff --git a/FortranRuntime/lib/Runtime/unit.cpp b/FortranRuntime/lib/Runtime/unit.cpp
index f6e4dc2a7befd4..496679ee8ce5f4 100644
--- a/FortranRuntime/lib/Runtime/unit.cpp
+++ b/FortranRuntime/lib/Runtime/unit.cpp
@@ -19,13 +19,13 @@
 
 namespace Fortran::runtime::io {
 
-#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExternalFileUnit *defaultInput{nullptr}; // unit 5
 RT_VAR_ATTRS ExternalFileUnit *defaultOutput{nullptr}; // unit 6
 RT_VAR_ATTRS ExternalFileUnit *errorOutput{nullptr}; // unit 0 extension
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/lib/Runtime/unit.h b/FortranRuntime/lib/Runtime/unit.h
index 993fbf2977cebf..4a7444aedbe5b6 100644
--- a/FortranRuntime/lib/Runtime/unit.h
+++ b/FortranRuntime/lib/Runtime/unit.h
@@ -11,18 +11,18 @@
 #ifndef FORTRAN_RUNTIME_UNIT_H_
 #define FORTRAN_RUNTIME_UNIT_H_
 
+#include "FortranRuntime/Runtime/memory.h"
 #include "buffer.h"
 #include "connection.h"
 #include "environment.h"
 #include "file.h"
-#include "flang/Common/constexpr-bitset.h"
-#include "flang/Common/optional.h"
-#include "flang/Runtime/memory.h"
 #include "format.h"
 #include "io-error.h"
 #include "io-stmt.h"
 #include "lock.h"
 #include "terminator.h"
+#include "flang/Common/constexpr-bitset.h"
+#include "flang/Common/optional.h"
 #include <cstdlib>
 #include <cstring>
 #include <flang/Common/variant.h>
diff --git a/FortranRuntime/lib/Runtime/utf.cpp b/FortranRuntime/lib/Runtime/utf.cpp
index d2839f9cf3793a..635451153d39a6 100644
--- a/FortranRuntime/lib/Runtime/utf.cpp
+++ b/FortranRuntime/lib/Runtime/utf.cpp
@@ -10,7 +10,7 @@
 
 namespace Fortran::runtime {
 
-#ifndef FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 // clang-format off
 RT_OFFLOAD_VAR_GROUP_BEGIN
 const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
@@ -41,7 +41,7 @@ const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
 };
 RT_OFFLOAD_VAR_GROUP_END
 // clang-format on
-#endif // FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/lib/Testing/CMakeLists.txt b/FortranRuntime/lib/Testing/CMakeLists.txt
index d5caada3fb68e8..41ad0d7314dd37 100644
--- a/FortranRuntime/lib/Testing/CMakeLists.txt
+++ b/FortranRuntime/lib/Testing/CMakeLists.txt
@@ -8,13 +8,12 @@
 
 set(public_headers "")
 file(GLOB_RECURSE public_headers
-  "${FLANGRUNTIME_SOURCE_DIR}/lib/Testing/*.h"
+  "${FLANG_SOURCE_DIR}/lib/Testing/*.h"
 )
 
 add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
-  testing.cpp
-  fp-testing.cpp
+  ${FLANG_SOURCE_DIR}/lib/Testing/testing.cpp
+  ${FLANG_SOURCE_DIR}/lib/Testing/fp-testing.cpp
  ADDITIONAL_HEADERS
    ${public_headers}
 )
-
diff --git a/FortranRuntime/test/lit.cfg.py b/FortranRuntime/test/lit.cfg.py
index a9f47f142bb884..1b9041111b72e8 100644
--- a/FortranRuntime/test/lit.cfg.py
+++ b/FortranRuntime/test/lit.cfg.py
@@ -73,7 +73,7 @@
 # Define some variables to help us test that the flang runtime doesn't depend on
 # the C++ runtime libraries. For this we need a C compiler.
 libruntime = os.path.join(config.fortranruntime_build_lib_dir, "libFortranRuntime.a")
-include = os.path.join(config.fortranruntime_source_dir, "include")
+include = os.path.join(config.flang_source_dir, "include")
 tools.append(
     ToolSubst("%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal")
 )
diff --git a/FortranRuntime/test/lit.site.cfg.py.in b/FortranRuntime/test/lit.site.cfg.py.in
index d860d297ebd7c3..a21fc128086eae 100644
--- a/FortranRuntime/test/lit.site.cfg.py.in
+++ b/FortranRuntime/test/lit.site.cfg.py.in
@@ -4,6 +4,7 @@ import sys
 
 config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
 config.build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
+config.flang_source_dir = "@FLANG_SOURCE_DIR@"
 config.fortranruntime_source_dir = "@FORTRANRUNTIME_SOURCE_DIR@"
 config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
 config.fortranruntime_build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/FortranRuntime/unittests/CMakeLists.txt
index 1bb788651a8d33..592f2ef7ce42ab 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/FortranRuntime/unittests/CMakeLists.txt
@@ -94,7 +94,5 @@ function(add_fortranruntime_nongtest_unittest test_name)
   add_fortranruntime_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
-add_subdirectory(Common)
-add_subdirectory(Decimal)
 add_subdirectory(Evaluate)
 add_subdirectory(Runtime)
diff --git a/FortranRuntime/unittests/Evaluate/CMakeLists.txt b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
index 567832a2f15bcb..fd3a5755dd1227 100644
--- a/FortranRuntime/unittests/Evaluate/CMakeLists.txt
+++ b/FortranRuntime/unittests/Evaluate/CMakeLists.txt
@@ -7,13 +7,13 @@
 #===------------------------------------------------------------------------===#
 
 add_fortranruntime_nongtest_unittest(reshape
-reshape.cpp
+  reshape.cpp
 LINK_LIBS
   FortranRuntime.unittest
 )
 
 add_fortranruntime_nongtest_unittest(ISO-Fortran-binding
-ISO-Fortran-binding.cpp
+  ISO-Fortran-binding.cpp
 LINK_LIBS
   FortranRuntime.unittest
 )
diff --git a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
index d2546e0c22d2d6..b68dfbcbd5b335 100644
--- a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
+++ b/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
 #include <type_traits>
@@ -28,6 +28,9 @@ template <int rank> class Test_CFI_CDESC_T {
     MATCH(false, std::is_const<type>::value);
     MATCH(false, std::is_volatile<type>::value);
     // suitable in size
+    MATCH(true,
+        Descriptor::SizeInBytes(rank_, false) <=
+            MaxDescriptorSizeInBytes(rank_, false));
     if (rank > 0) {
       MATCH(sizeof(dvStorage_), Descriptor::SizeInBytes(rank_, false));
     } else { // C++ implementation over-allocates for rank=0 by 24bytes.
diff --git a/FortranRuntime/unittests/Evaluate/reshape.cpp b/FortranRuntime/unittests/Evaluate/reshape.cpp
index a93afd2a3c90cd..0233ab37e25c6e 100644
--- a/FortranRuntime/unittests/Evaluate/reshape.cpp
+++ b/FortranRuntime/unittests/Evaluate/reshape.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "flang/Runtime/transformational.h"
 #include "flang/Testing/testing.h"
 #include <cinttypes>
diff --git a/FortranRuntime/unittests/Runtime/AccessTest.cpp b/FortranRuntime/unittests/Runtime/AccessTest.cpp
index 3e9feaf945b66d..e72386cc9ac247 100644
--- a/FortranRuntime/unittests/Runtime/AccessTest.cpp
+++ b/FortranRuntime/unittests/Runtime/AccessTest.cpp
@@ -10,9 +10,9 @@
 #ifndef _WIN32
 
 #include "CrashHandlerFixture.h"
+#include "gtest/gtest.h"
 #include "flang/Runtime/extensions.h"
 #include "llvm/ADT/Twine.h"
-#include "gtest/gtest.h"
 
 #include <fcntl.h>
 #include <sys/stat.h>
diff --git a/FortranRuntime/unittests/Runtime/Allocatable.cpp b/FortranRuntime/unittests/Runtime/Allocatable.cpp
index c01f85598d21ed..8e10dc408ceae8 100644
--- a/FortranRuntime/unittests/Runtime/Allocatable.cpp
+++ b/FortranRuntime/unittests/Runtime/Allocatable.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/allocatable.h"
-#include "tools.h"
 #include "gtest/gtest.h"
+#include "tools.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
index 9011da304b6bc3..9d9a4ddae8689f 100644
--- a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
+++ b/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "FortranRuntime/Runtime/array-constructor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Runtime/allocatable.h"
-#include "flang/Runtime/array-constructor.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
-#include "gtest/gtest.h"
 
 #include <memory>
 
diff --git a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
index bb1ea411cb7760..d2a2e5a11abf80 100644
--- a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
+++ b/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../../lib/Runtime/terminator.h"
-#include "flang/Runtime/CUDA/allocator.h"
-#include "flang/Runtime/CUDA/descriptor.h"
-#include "flang/Runtime/allocatable.h"
-#include "flang/Runtime/allocator-registry.h"
-#include "flang/Support/Fortran.h"
+#include "FortranRuntime/Runtime/CUDA/allocator.h"
+#include "FortranRuntime/Runtime/CUDA/descriptor.h"
+#include "FortranRuntime/Runtime/allocatable.h"
+#include "FortranRuntime/Runtime/allocator-registry.h"
 #include "gtest/gtest.h"
+#include "../../../runtime/terminator.h"
+#include "flang/Support/Fortran.h"
 
 #include "cuda_runtime.h"
 
diff --git a/FortranRuntime/unittests/Runtime/CharacterTest.cpp b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
index 8829f5e43265b0..610061e2122cd5 100644
--- a/FortranRuntime/unittests/Runtime/CharacterTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CharacterTest.cpp
@@ -10,7 +10,7 @@
 // in Fortran.
 
 #include "flang/Runtime/character.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "gtest/gtest.h"
 #include <cstring>
 #include <functional>
diff --git a/FortranRuntime/unittests/Runtime/CommandTest.cpp b/FortranRuntime/unittests/Runtime/CommandTest.cpp
index aa79ce381ba8d0..a7d68508c5abca 100644
--- a/FortranRuntime/unittests/Runtime/CommandTest.cpp
+++ b/FortranRuntime/unittests/Runtime/CommandTest.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/command.h"
-#include "flang/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "flang/Runtime/execute.h"
 #include "flang/Runtime/extensions.h"
 #include "flang/Runtime/main.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
 #include <cstddef>
 #include <cstdlib>
 
diff --git a/FortranRuntime/unittests/Runtime/Derived.cpp b/FortranRuntime/unittests/Runtime/Derived.cpp
index 11b732fe10b790..22361352fdf5d9 100644
--- a/FortranRuntime/unittests/Runtime/Derived.cpp
+++ b/FortranRuntime/unittests/Runtime/Derived.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/derived-api.h"
-#include "flang/Runtime/descriptor.h"
-#include "tools.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "gtest/gtest.h"
+#include "tools.h"
+#include "flang/Runtime/derived-api.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
index 00c2fd76ce0c04..7ff4aa3c14bdc5 100644
--- a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
@@ -11,12 +11,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "gtest/gtest.h"
 #include "flang/Runtime/main.h"
 #include "flang/Runtime/stop.h"
 #include "llvm/Support/raw_ostream.h"
-#include "gtest/gtest.h"
 #include <cstring>
 #include <string_view>
 
diff --git a/FortranRuntime/unittests/Runtime/Inquiry.cpp b/FortranRuntime/unittests/Runtime/Inquiry.cpp
index 204a97a1088ac0..3e5f0037177f1c 100644
--- a/FortranRuntime/unittests/Runtime/Inquiry.cpp
+++ b/FortranRuntime/unittests/Runtime/Inquiry.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/inquiry.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "gtest/gtest.h"
+#include "tools.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/ListInputTest.cpp b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
index 4c30d6ed750141..e0fe4dfeac3949 100644
--- a/FortranRuntime/unittests/Runtime/ListInputTest.cpp
+++ b/FortranRuntime/unittests/Runtime/ListInputTest.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../lib/Runtime/io-error.h"
 #include "CrashHandlerFixture.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "../../lib/Runtime/io-error.h"
 
 using namespace Fortran::runtime;
 using namespace Fortran::runtime::io;
diff --git a/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp b/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
index 928fddec50c874..9fa0c2f4260edb 100644
--- a/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
+++ b/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include <algorithm>
 #include <array>
 #include <cstring>
diff --git a/FortranRuntime/unittests/Runtime/Matmul.cpp b/FortranRuntime/unittests/Runtime/Matmul.cpp
index cfa5d18cc36d33..6eb4012e785ff1 100644
--- a/FortranRuntime/unittests/Runtime/Matmul.cpp
+++ b/FortranRuntime/unittests/Runtime/Matmul.cpp
@@ -7,12 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/matmul.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
-#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
index 146c2283fb1aca..199062f820c303 100644
--- a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
+++ b/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/matmul-transpose.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
-#include "gtest/gtest.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
index 08229b5e48f0dd..1033dda9d636f7 100644
--- a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
+++ b/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
@@ -6,12 +6,12 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime//misc-intrinsic.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "tools.h"
-#include "gtest/gtest.h"
+#include "flang/Runtime/misc-intrinsic.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/Namelist.cpp b/FortranRuntime/unittests/Runtime/Namelist.cpp
index 7b834dec49c3c4..544ab85234fd65 100644
--- a/FortranRuntime/unittests/Runtime/Namelist.cpp
+++ b/FortranRuntime/unittests/Runtime/Namelist.cpp
@@ -8,8 +8,8 @@
 
 #include "../../lib/Runtime/namelist.h"
 #include "CrashHandlerFixture.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "tools.h"
 #include <algorithm>
 #include <cinttypes>
diff --git a/FortranRuntime/unittests/Runtime/Numeric.cpp b/FortranRuntime/unittests/Runtime/Numeric.cpp
index fb595ae262c324..d15919b972bca7 100644
--- a/FortranRuntime/unittests/Runtime/Numeric.cpp
+++ b/FortranRuntime/unittests/Runtime/Numeric.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/numeric.h"
-#include "flang/Common/float128.h"
 #include "gtest/gtest.h"
+#include "flang/Common/float128.h"
 #include <cmath>
 #include <limits>
 
diff --git a/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp b/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
index 8a1dd6de1449b9..c588c739686bed 100644
--- a/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
+++ b/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/io-api.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include <algorithm>
 #include <array>
 #include <cstring>
diff --git a/FortranRuntime/unittests/Runtime/Pointer.cpp b/FortranRuntime/unittests/Runtime/Pointer.cpp
index a05bd70a64bb9f..733cd42232875f 100644
--- a/FortranRuntime/unittests/Runtime/Pointer.cpp
+++ b/FortranRuntime/unittests/Runtime/Pointer.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/pointer.h"
-#include "flang/Runtime/descriptor.h"
-#include "tools.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "gtest/gtest.h"
+#include "tools.h"
 
 using namespace Fortran::runtime;
 
diff --git a/FortranRuntime/unittests/Runtime/Random.cpp b/FortranRuntime/unittests/Runtime/Random.cpp
index 4e4b59cbcf40e7..81497a682660a8 100644
--- a/FortranRuntime/unittests/Runtime/Random.cpp
+++ b/FortranRuntime/unittests/Runtime/Random.cpp
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime//random.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/type-code.h"
+#include "flang/Runtime/random.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "gtest/gtest.h"
 #include <cmath>
 
diff --git a/FortranRuntime/unittests/Runtime/Reduction.cpp b/FortranRuntime/unittests/Runtime/Reduction.cpp
index c35f6e2fa6a41b..a382f4b7a71770 100644
--- a/FortranRuntime/unittests/Runtime/Reduction.cpp
+++ b/FortranRuntime/unittests/Runtime/Reduction.cpp
@@ -7,14 +7,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/reduction.h"
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Common/float128.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/reduce.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
-#include "gtest/gtest.h"
 #include <cstdint>
 #include <cstring>
 #include <string>
diff --git a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
index 61580a8d46792f..7ce1ee796d739b 100644
--- a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
+++ b/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
@@ -10,11 +10,11 @@
 /// runtime components and ensure the test fixture handles crashes as we expect.
 //
 //===----------------------------------------------------------------------===//
-#include "../../lib/Runtime/terminator.h"
 #include "CrashHandlerFixture.h"
+#include "tools.h"
+#include "../../lib/Runtime/terminator.h"
 #include "flang/Runtime/io-api.h"
 #include "flang/Runtime/transformational.h"
-#include "tools.h"
 #include <gtest/gtest.h>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/Stop.cpp b/FortranRuntime/unittests/Runtime/Stop.cpp
index 5fd8deaad21d6b..c12ec097068438 100644
--- a/FortranRuntime/unittests/Runtime/Stop.cpp
+++ b/FortranRuntime/unittests/Runtime/Stop.cpp
@@ -10,8 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 #include "flang/Runtime/stop.h"
-#include "../../lib/Runtime/environment.h"
 #include "CrashHandlerFixture.h"
+#include "../../lib/Runtime/environment.h"
 #include <cstdlib>
 #include <gtest/gtest.h>
 
diff --git a/FortranRuntime/unittests/Runtime/Support.cpp b/FortranRuntime/unittests/Runtime/Support.cpp
index 38c0d6efaf9db7..05328e6baa411c 100644
--- a/FortranRuntime/unittests/Runtime/Support.cpp
+++ b/FortranRuntime/unittests/Runtime/Support.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/support.h"
-#include "flang/Runtime/descriptor.h"
-#include "tools.h"
+#include "FortranRuntime/Runtime/descriptor.h"
 #include "gtest/gtest.h"
+#include "tools.h"
 
 using namespace Fortran::runtime;
 using Fortran::common::TypeCategory;
diff --git a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
index 63d99416ea64cb..b0b1041f0f09e7 100644
--- a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
+++ b/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
@@ -6,14 +6,14 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
+#include "tools.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/temporary-stack.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
-#include "gtest/gtest.h"
 #include <vector>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/Time.cpp b/FortranRuntime/unittests/Runtime/Time.cpp
index 6fd00d669a9575..548c0834e34a36 100644
--- a/FortranRuntime/unittests/Runtime/Time.cpp
+++ b/FortranRuntime/unittests/Runtime/Time.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Runtime/time-intrinsic.h"
 #include "gtest/gtest.h"
+#include "flang/Runtime/time-intrinsic.h"
 #include <algorithm>
 #include <cctype>
 #include <cerrno>
diff --git a/FortranRuntime/unittests/Runtime/Transformational.cpp b/FortranRuntime/unittests/Runtime/Transformational.cpp
index b5a4e0e8e9588b..6b8903750d0aec 100644
--- a/FortranRuntime/unittests/Runtime/Transformational.cpp
+++ b/FortranRuntime/unittests/Runtime/Transformational.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/transformational.h"
-#include "flang/Common/float128.h"
-#include "flang/Runtime/type-code.h"
-#include "tools.h"
+#include "FortranRuntime/Runtime/type-code.h"
 #include "gtest/gtest.h"
+#include "tools.h"
+#include "flang/Common/float128.h"
 #include <vector>
 
 using namespace Fortran::runtime;
diff --git a/FortranRuntime/unittests/Runtime/tools.h b/FortranRuntime/unittests/Runtime/tools.h
index 702103d225ab72..8000d83fc0c394 100644
--- a/FortranRuntime/unittests/Runtime/tools.h
+++ b/FortranRuntime/unittests/Runtime/tools.h
@@ -9,11 +9,11 @@
 #ifndef FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 #define FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 
+#include "FortranRuntime/Runtime/descriptor.h"
+#include "FortranRuntime/Runtime/type-code.h"
+#include "gtest/gtest.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
-#include "flang/Runtime/descriptor.h"
-#include "flang/Runtime/type-code.h"
-#include "gtest/gtest.h"
 #include <cstdint>
 #include <cstring>
 #include <vector>
diff --git a/FortranRuntime/include/flang/Common/Fortran-consts.h b/flang/include/flang/Common/Fortran-consts.h
similarity index 100%
rename from FortranRuntime/include/flang/Common/Fortran-consts.h
rename to flang/include/flang/Common/Fortran-consts.h
diff --git a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h b/flang/include/flang/Common/ISO_Fortran_binding_wrapper.h
similarity index 97%
rename from FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
rename to flang/include/flang/Common/ISO_Fortran_binding_wrapper.h
index 2c0fdc123c8759..ccfc360dfc820c 100644
--- a/FortranRuntime/include/flang/Common/ISO_Fortran_binding_wrapper.h
+++ b/flang/include/flang/Common/ISO_Fortran_binding_wrapper.h
@@ -22,7 +22,7 @@
 
 /* clang-format off */
 #include <stddef.h>
-#include "flang/Common/api-attrs.h" 
+#include "flang/Common/api-attrs.h"  
 #ifdef __cplusplus
 namespace Fortran {
 namespace ISO {
diff --git a/flang/include/flang/Common/README.md b/flang/include/flang/Common/README.md
new file mode 100644
index 00000000000000..a722732fb76407
--- /dev/null
+++ b/flang/include/flang/Common/README.md
@@ -0,0 +1,25 @@
+Files in this directory are used by Flang (the compiler) and FortranRuntime
+(the runtime library for Flang-compiled programs). They must be compatible by
+both. For definitions used only by Flang, consider
+`flang/{lib,include/flang}/Support` instead. For definitions used only by
+FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+
+The requirements for common code include:
+
+ * No dependence to LLVM, including LLVMSupport.
+
+ * No link-dependence to the C++ runtime. This means that e.g. `std::string`
+   cannot be used.
+
+ * No use of `std::optional<T>`; `fortran::common::optional<T>` can be used
+   instead.
+
+ * Preprocessor macros from `config.h` and CMake
+   `(target/add)_compile_definitions` must be defined by both build scripts.
+   See `flang/cmake/modules/FlangCommon.cmake`.
+
+ * Some header files are included from `.c` files.
+   `#include <flang/Common/c-or-cpp.h>` can help to support C++ and C.
+
+ * Global declarations may need to be annotated using definitions from
+   `api-attrs.h`.
diff --git a/FortranRuntime/include/flang/Common/api-attrs.h b/flang/include/flang/Common/api-attrs.h
similarity index 97%
rename from FortranRuntime/include/flang/Common/api-attrs.h
rename to flang/include/flang/Common/api-attrs.h
index 9a3001fb255c11..d73e60996bc81f 100644
--- a/FortranRuntime/include/flang/Common/api-attrs.h
+++ b/flang/include/flang/Common/api-attrs.h
@@ -1,10 +1,11 @@
-/*===-- include/flang/Common/api-attrs.h ----------------------------*- C -*-===
+/*===-- include/flang/Common/api-attrs.h ---------------------------*- C -*-=//
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===----------------------------------------------------------------------===*/
+ *===------------------------------------------------------------------------===
+ */
 
 /*
  * The file defines a set macros that can be used to apply
@@ -12,8 +13,8 @@
  * declared/defined/used in Flang runtime library.
  */
 
-#ifndef FORTRAN_COMMON_API_ATTRS_H_
-#define FORTRAN_COMMON_API_ATTRS_H_
+#ifndef FORTRAN_RUNTIME_API_ATTRS_H_
+#define FORTRAN_RUNTIME_API_ATTRS_H_
 
 /*
  * RT_EXT_API_GROUP_BEGIN/END pair is placed around definitions
@@ -177,4 +178,4 @@
 #define RT_DEVICE_NOINLINE_HOST_INLINE inline
 #endif
 
-#endif /* FORTRAN_COMMON_API_ATTRS_H_ */
+#endif /* !FORTRAN_RUNTIME_API_ATTRS_H_ */
diff --git a/FortranRuntime/include/flang/Common/binary-floating-point.h b/flang/include/flang/Common/binary-floating-point.h
similarity index 100%
rename from FortranRuntime/include/flang/Common/binary-floating-point.h
rename to flang/include/flang/Common/binary-floating-point.h
diff --git a/FortranRuntime/include/flang/Common/bit-population-count.h b/flang/include/flang/Common/bit-population-count.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/bit-population-count.h
rename to flang/include/flang/Common/bit-population-count.h
index 59ade914d14d85..e1aeb78f9a3765 100644
--- a/FortranRuntime/include/flang/Common/bit-population-count.h
+++ b/flang/include/flang/Common/bit-population-count.h
@@ -93,4 +93,4 @@ template <typename INT> inline constexpr int TrailingZeroBitCount(INT x) {
   }
 }
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_BIT_POPULATION_COUNT_H_ */
+#endif // FORTRAN_COMMON_BIT_POPULATION_COUNT_H_
diff --git a/FortranRuntime/include/flang/Common/constexpr-bitset.h b/flang/include/flang/Common/constexpr-bitset.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/constexpr-bitset.h
rename to flang/include/flang/Common/constexpr-bitset.h
index 093b247b5f4eff..1aafb6eff84c61 100644
--- a/FortranRuntime/include/flang/Common/constexpr-bitset.h
+++ b/flang/include/flang/Common/constexpr-bitset.h
@@ -144,4 +144,4 @@ template <int BITS> class BitSet {
   Word bits_{0};
 };
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_CONSTEXPR_BITSET_H_ */
+#endif // FORTRAN_COMMON_CONSTEXPR_BITSET_H_
diff --git a/FortranRuntime/include/flang/Common/decimal.h b/flang/include/flang/Common/decimal.h
similarity index 100%
rename from FortranRuntime/include/flang/Common/decimal.h
rename to flang/include/flang/Common/decimal.h
diff --git a/FortranRuntime/include/flang/Common/enum-class.h b/flang/include/flang/Common/enum-class.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/enum-class.h
rename to flang/include/flang/Common/enum-class.h
index 787648ffec48e8..41575d45091a8d 100644
--- a/FortranRuntime/include/flang/Common/enum-class.h
+++ b/flang/include/flang/Common/enum-class.h
@@ -69,4 +69,4 @@ constexpr std::array<std::string_view, ITEMS> EnumNames(const char *p) {
   }
 
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_ENUM_CLASS_H_ */
+#endif // FORTRAN_COMMON_ENUM_CLASS_H_
diff --git a/FortranRuntime/include/flang/Common/enum-set.h b/flang/include/flang/Common/enum-set.h
similarity index 99%
rename from FortranRuntime/include/flang/Common/enum-set.h
rename to flang/include/flang/Common/enum-set.h
index 6100fc5e2e31c5..5290b76debee88 100644
--- a/FortranRuntime/include/flang/Common/enum-set.h
+++ b/flang/include/flang/Common/enum-set.h
@@ -228,4 +228,4 @@ struct std::hash<Fortran::common::EnumSet<ENUM, values>> {
     return std::hash(x.bitset());
   }
 };
-#endif /* FORTRAN_COMMON_ENUM_SET_H_ */
+#endif // FORTRAN_COMMON_ENUM_SET_H_
diff --git a/FortranRuntime/include/flang/Common/fast-int-set.h b/flang/include/flang/Common/fast-int-set.h
similarity index 95%
rename from FortranRuntime/include/flang/Common/fast-int-set.h
rename to flang/include/flang/Common/fast-int-set.h
index fe3f1632060b50..d1c9c756a44a65 100644
--- a/FortranRuntime/include/flang/Common/fast-int-set.h
+++ b/flang/include/flang/Common/fast-int-set.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/fast-int-set.h ---------------------*- C++ -*-===//
+//===-- include/flang/Common/fast-int-set.h --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -24,7 +24,7 @@
 #ifndef FORTRAN_COMMON_FAST_INT_SET_H_
 #define FORTRAN_COMMON_FAST_INT_SET_H_
 
-#include "flang/Common/optional.h"
+#include <optional>
 
 namespace Fortran::common {
 
@@ -83,9 +83,9 @@ template <int N> class FastIntSet {
     }
   }
 
-  optional<int> PopValue() {
+  std::optional<int> PopValue() {
     if (IsEmpty()) {
-      return nullopt;
+      return std::nullopt;
     } else {
       return value_[--size_];
     }
@@ -103,4 +103,4 @@ template <int N> class FastIntSet {
   bool isFullyInitialized_{false}; // memory was cleared
 };
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_FAST_INT_SET_H_ */
+#endif // FORTRAN_COMMON_FAST_INT_SET_H_
diff --git a/FortranRuntime/include/flang/Common/float128.h b/flang/include/flang/Common/float128.h
similarity index 96%
rename from FortranRuntime/include/flang/Common/float128.h
rename to flang/include/flang/Common/float128.h
index a7036bf679e5ae..2e76bc0a162e61 100644
--- a/FortranRuntime/include/flang/Common/float128.h
+++ b/flang/include/flang/Common/float128.h
@@ -1,4 +1,4 @@
-/*===-- include/flang/Common/float128.h -----------------------------*- C -*-===
+/*===-- flang/Common/float128.h ----------------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/include/flang/Common/format.h b/flang/include/flang/Common/format.h
similarity index 99%
rename from FortranRuntime/include/flang/Common/format.h
rename to flang/include/flang/Common/format.h
index 6f4dfc8d2376b7..138e84b72b733d 100644
--- a/FortranRuntime/include/flang/Common/format.h
+++ b/flang/include/flang/Common/format.h
@@ -901,4 +901,4 @@ template <typename CHAR> bool FormatValidator<CHAR>::Check() {
 }
 
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_FORMAT_H_ */
+#endif // FORTRAN_COMMON_FORMAT_H_
diff --git a/FortranRuntime/include/flang/Common/idioms.h b/flang/include/flang/Common/idioms.h
similarity index 99%
rename from FortranRuntime/include/flang/Common/idioms.h
rename to flang/include/flang/Common/idioms.h
index 1ae0c0b35112e9..99f383ec75b999 100644
--- a/FortranRuntime/include/flang/Common/idioms.h
+++ b/flang/include/flang/Common/idioms.h
@@ -150,4 +150,4 @@ template <typename A, typename... B>
 using IfNoLvalue = std::enable_if_t<(... && !std::is_lvalue_reference_v<B>), A>;
 template <typename... RVREF> using NoLvalue = IfNoLvalue<void, RVREF...>;
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_IDIOMS_H_ */
+#endif // FORTRAN_COMMON_IDIOMS_H_
diff --git a/FortranRuntime/include/flang/Common/leading-zero-bit-count.h b/flang/include/flang/Common/leading-zero-bit-count.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/leading-zero-bit-count.h
rename to flang/include/flang/Common/leading-zero-bit-count.h
index e788bfa9bcfd08..a296e0b446917f 100644
--- a/FortranRuntime/include/flang/Common/leading-zero-bit-count.h
+++ b/flang/include/flang/Common/leading-zero-bit-count.h
@@ -93,4 +93,4 @@ template <typename A> inline constexpr int BitsNeededFor(A x) {
   return 8 * sizeof x - LeadingZeroBitCount(x);
 }
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_ */
+#endif // FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_
diff --git a/FortranRuntime/include/flang/Common/optional.h b/flang/include/flang/Common/optional.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/optional.h
rename to flang/include/flang/Common/optional.h
index c3db3b1329a2fd..c0f4278009f40a 100644
--- a/FortranRuntime/include/flang/Common/optional.h
+++ b/flang/include/flang/Common/optional.h
@@ -23,8 +23,8 @@
 //   * cuda:: namespace need to be forced for all std:: references.
 //
 //===----------------------------------------------------------------------===//
-#ifndef FORTRAN_COMMON_OPTIONAL_H_
-#define FORTRAN_COMMON_OPTIONAL_H_
+#ifndef FORTRAN_COMMON_OPTIONAL_H
+#define FORTRAN_COMMON_OPTIONAL_H
 
 #include "flang/Common/api-attrs.h"
 #include <optional>
@@ -240,4 +240,4 @@ using std::optional;
 
 } // namespace Fortran::common
 
-#endif /* FORTRAN_COMMON_OPTIONAL_H_ */
+#endif // FORTRAN_COMMON_OPTIONAL_H
diff --git a/FortranRuntime/include/flang/Common/real.h b/flang/include/flang/Common/real.h
similarity index 99%
rename from FortranRuntime/include/flang/Common/real.h
rename to flang/include/flang/Common/real.h
index dc9a2404731e70..b527deda0e3b4f 100644
--- a/FortranRuntime/include/flang/Common/real.h
+++ b/flang/include/flang/Common/real.h
@@ -141,4 +141,4 @@ class RealCharacteristics {
 };
 
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_REAL_H_ */
+#endif // FORTRAN_COMMON_REAL_H_
diff --git a/FortranRuntime/include/flang/Common/reference-wrapper.h b/flang/include/flang/Common/reference-wrapper.h
similarity index 96%
rename from FortranRuntime/include/flang/Common/reference-wrapper.h
rename to flang/include/flang/Common/reference-wrapper.h
index 6822fb335f398c..2983754108f95a 100644
--- a/FortranRuntime/include/flang/Common/reference-wrapper.h
+++ b/flang/include/flang/Common/reference-wrapper.h
@@ -22,8 +22,8 @@
 //
 // clang-format on
 
-#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H_
-#define FORTRAN_COMMON_REFERENCE_WRAPPER_H_
+#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H
+#define FORTRAN_COMMON_REFERENCE_WRAPPER_H
 
 #include "flang/Common/api-attrs.h"
 #include <functional>
@@ -111,4 +111,4 @@ using std::reference_wrapper;
 
 } // namespace Fortran::common
 
-#endif /* FORTRAN_COMMON_REFERENCE_WRAPPER_H_ */
+#endif // FORTRAN_COMMON_REFERENCE_WRAPPER_H
diff --git a/FortranRuntime/include/flang/Common/restorer.h b/flang/include/flang/Common/restorer.h
similarity index 97%
rename from FortranRuntime/include/flang/Common/restorer.h
rename to flang/include/flang/Common/restorer.h
index a5c5ebe7344a1b..0f1bc48620d37e 100644
--- a/FortranRuntime/include/flang/Common/restorer.h
+++ b/flang/include/flang/Common/restorer.h
@@ -18,8 +18,8 @@
 
 #ifndef FORTRAN_COMMON_RESTORER_H_
 #define FORTRAN_COMMON_RESTORER_H_
-#include "flang/Common/api-attrs.h"
 #include "idioms.h"
+#include "flang/Common/api-attrs.h"
 namespace Fortran::common {
 template <typename A> class Restorer {
 public:
@@ -53,4 +53,4 @@ RT_API_ATTRS common::IfNoLvalue<Restorer<A>, B> ScopedSet(
   return Restorer<A>{to, std::move(original)};
 }
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_RESTORER_H_ */
+#endif // FORTRAN_COMMON_RESTORER_H_
diff --git a/FortranRuntime/include/flang/Common/target-rounding.h b/flang/include/flang/Common/target-rounding.h
similarity index 100%
rename from FortranRuntime/include/flang/Common/target-rounding.h
rename to flang/include/flang/Common/target-rounding.h
diff --git a/FortranRuntime/include/flang/Common/uint128.h b/flang/include/flang/Common/uint128.h
similarity index 99%
rename from FortranRuntime/include/flang/Common/uint128.h
rename to flang/include/flang/Common/uint128.h
index 1b2ee6a2c14b87..821c8c3b08a52f 100644
--- a/FortranRuntime/include/flang/Common/uint128.h
+++ b/flang/include/flang/Common/uint128.h
@@ -19,8 +19,8 @@
 #define AVOID_NATIVE_UINT128_T 0
 #endif
 
-#include "flang/Common/api-attrs.h"
 #include "leading-zero-bit-count.h"
+#include "flang/Common/api-attrs.h"
 #include <cstdint>
 #include <type_traits>
 
@@ -303,4 +303,4 @@ template <int BITS>
 using HostSignedIntType = typename HostSignedIntTypeHelper<BITS>::type;
 
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_UINT128_H_ */
+#endif
diff --git a/FortranRuntime/include/flang/Common/variant.h b/flang/include/flang/Common/variant.h
similarity index 89%
rename from FortranRuntime/include/flang/Common/variant.h
rename to flang/include/flang/Common/variant.h
index ff9b1aed4eba91..1af85876afac00 100644
--- a/FortranRuntime/include/flang/Common/variant.h
+++ b/flang/include/flang/Common/variant.h
@@ -11,8 +11,8 @@
 // and the related names become available, though, they may correspond
 // to alternative definitions (e.g. from cuda::std namespace).
 
-#ifndef FORTRAN_COMMON_VARIANT_H_
-#define FORTRAN_COMMON_VARIANT_H_
+#ifndef FORTRAN_COMMON_VARIANT_H
+#define FORTRAN_COMMON_VARIANT_H
 
 #if RT_USE_LIBCUDACXX
 #include <cuda/std/variant>
@@ -27,4 +27,4 @@ using cuda::std::visit;
 #include <variant>
 #endif // !RT_USE_LIBCUDACXX
 
-#endif /* FORTRAN_COMMON_VARIANT_H_ */
+#endif // FORTRAN_COMMON_VARIANT_H
diff --git a/FortranRuntime/include/flang/Common/visit.h b/flang/include/flang/Common/visit.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/visit.h
rename to flang/include/flang/Common/visit.h
index 8030ac9be173c3..ad66297650b093 100644
--- a/FortranRuntime/include/flang/Common/visit.h
+++ b/flang/include/flang/Common/visit.h
@@ -21,8 +21,8 @@
 #ifndef FORTRAN_COMMON_VISIT_H_
 #define FORTRAN_COMMON_VISIT_H_
 
-#include "flang/Common/api-attrs.h"
 #include "variant.h"
+#include "flang/Common/api-attrs.h"
 #include <type_traits>
 
 namespace Fortran::common {
@@ -100,4 +100,4 @@ using Fortran::common::log2visit::visit;
 #endif
 
 } // namespace Fortran::common
-#endif /* FORTRAN_COMMON_VISIT_H_ */
+#endif // FORTRAN_COMMON_VISIT_H_
diff --git a/FortranRuntime/include/flang/Common/windows-include.h b/flang/include/flang/Common/windows-include.h
similarity index 93%
rename from FortranRuntime/include/flang/Common/windows-include.h
rename to flang/include/flang/Common/windows-include.h
index bee79d4fceb3ba..75ef4974251ff9 100644
--- a/FortranRuntime/include/flang/Common/windows-include.h
+++ b/flang/include/flang/Common/windows-include.h
@@ -22,4 +22,4 @@
 
 #endif // _WIN32
 
-#endif /* FORTRAN_COMMON_WINDOWS_INCLUDE_H_ */
+#endif // FORTRAN_COMMON_WINDOWS_INCLUDE_H_
diff --git a/flang/include/flang/ISO_Fortran_binding.h b/flang/include/flang/ISO_Fortran_binding.h
index 3361db27aa4517..89a10ce69a2ba2 100644
--- a/flang/include/flang/ISO_Fortran_binding.h
+++ b/flang/include/flang/ISO_Fortran_binding.h
@@ -14,7 +14,7 @@
  * it does so by means of a wrapper header that establishes namespaces and
  * a macro for extra function attributes (RT_API_ATTRS).
  */
-#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_
+#ifndef FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
 #include <stddef.h>
 #define FORTRAN_ISO_NAMESPACE_
 #endif
diff --git a/flang/include/flang/Lower/Allocatable.h b/flang/include/flang/Lower/Allocatable.h
index 1209b157ed1f41..0e89af94af40f6 100644
--- a/flang/include/flang/Lower/Allocatable.h
+++ b/flang/include/flang/Lower/Allocatable.h
@@ -15,7 +15,7 @@
 
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Optimizer/Builder/MutableBox.h"
-#include "flang/Runtime/allocator-registry.h"
+#include "flang/Runtime/allocator-registry-consts.h"
 #include "llvm/ADT/StringRef.h"
 
 namespace mlir {
diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
index 3fc4201bd16c6c..78bb82b17d4050 100644
--- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
+++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h
@@ -397,7 +397,6 @@ struct IntrinsicLibrary {
   fir::ExtendedValue genUbound(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genUnpack(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genVerify(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
-    fir::ExtendedValue genNumericStorageSize(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
 
   /// Implement all conversion functions like DBLE, the first argument is
   /// the value to convert. There may be an additional KIND arguments that
diff --git a/flang/include/flang/Optimizer/Builder/MutableBox.h b/flang/include/flang/Optimizer/Builder/MutableBox.h
index fea7c7204837b4..39657ddaf6e03a 100644
--- a/flang/include/flang/Optimizer/Builder/MutableBox.h
+++ b/flang/include/flang/Optimizer/Builder/MutableBox.h
@@ -14,7 +14,7 @@
 #define FORTRAN_OPTIMIZER_BUILDER_MUTABLEBOX_H
 
 #include "flang/Optimizer/Builder/BoxValue.h"
-#include "flang/Runtime/allocator-registry.h"
+#include "flang/Runtime/allocator-registry-consts.h"
 #include "llvm/ADT/StringRef.h"
 
 namespace mlir {
diff --git a/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h b/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
index 31d1416846d0c9..b9a8a670d07938 100644
--- a/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
+++ b/flang/include/flang/Optimizer/CodeGen/DescriptorModel.h
@@ -23,7 +23,7 @@
 #define OPTIMIZER_DESCRIPTOR_MODEL_H
 
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
 #include "mlir/IR/BuiltinTypes.h"
 #include "llvm/Support/ErrorHandling.h"
diff --git a/FortranRuntime/include/flang/Runtime/CUDA/allocator.h b/flang/include/flang/Runtime/CUDA/allocator.h
similarity index 93%
rename from FortranRuntime/include/flang/Runtime/CUDA/allocator.h
rename to flang/include/flang/Runtime/CUDA/allocator.h
index 48185e8f34eaf6..cc88896b1f0bd6 100644
--- a/FortranRuntime/include/flang/Runtime/CUDA/allocator.h
+++ b/flang/include/flang/Runtime/CUDA/allocator.h
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
 #define FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
 
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
 
 #define CUDA_REPORT_IF_ERROR(expr) \
@@ -43,4 +43,4 @@ void *CUFAllocUnified(std::size_t);
 void CUFFreeUnified(void *);
 
 } // namespace Fortran::runtime::cuda
-#endif /* FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_ */
+#endif // FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
diff --git a/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h b/flang/include/flang/Runtime/CUDA/descriptor.h
similarity index 91%
rename from FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
rename to flang/include/flang/Runtime/CUDA/descriptor.h
index 68ad0987d9aecd..501a834f43bd42 100644
--- a/FortranRuntime/include/flang/Runtime/CUDA/descriptor.h
+++ b/flang/include/flang/Runtime/CUDA/descriptor.h
@@ -9,7 +9,7 @@
 #ifndef FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_
 #define FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_
 
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
 #include <cstddef>
 
@@ -27,4 +27,4 @@ void RTDECL(CUFFreeDesciptor)(
 
 } // extern "C"
 } // namespace Fortran::runtime::cuda
-#endif /* FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_ */
+#endif // FORTRAN_RUNTIME_CUDA_DESCRIPTOR_H_
diff --git a/flang/include/flang/Runtime/README.md b/flang/include/flang/Runtime/README.md
new file mode 100644
index 00000000000000..a13a7e23162e98
--- /dev/null
+++ b/flang/include/flang/Runtime/README.md
@@ -0,0 +1,27 @@
+Files in this directory are used by Flang (the compiler) and FortranRuntime
+(the runtime library for Flang-compiled programs). They must be compatible by
+both. For definitions used only by Flang, consider
+`flang/{lib,include/flang}/Support` instead. For definitions used only by
+FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+
+The requirements for common code include:
+
+ * No dependence to LLVM, including LLVMSupport.
+
+ * No link-dependence to the C++ runtime. This means that e.g. `std::string`
+   cannot be used.
+
+ * No use of `std::optional<T>`; `fortran::common::optional<T>` can be used
+   instead.
+
+ * Preprocessor macros from `config.h` and CMake
+   `(target/add)_compile_definitions` must be defined by both build scripts.
+   See `flang/cmake/modules/FlangCommon.cmake`.
+
+ * Some header files are included from `.c` files.
+   `#include <flang/Common/c-or-cpp.h>` can help to support C++ and C.
+
+ * Global declarations may need to be annotated using definitions from
+   `api-attrs.h`.
+
+ * The `Runtime` component is header-only.
diff --git a/FortranRuntime/include/flang/Runtime/allocatable.h b/flang/include/flang/Runtime/allocatable.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/allocatable.h
rename to flang/include/flang/Runtime/allocatable.h
index d7f3910074a760..480e987ed5ec6b 100644
--- a/FortranRuntime/include/flang/Runtime/allocatable.h
+++ b/flang/include/flang/Runtime/allocatable.h
@@ -11,10 +11,13 @@
 #ifndef FORTRAN_RUNTIME_ALLOCATABLE_H_
 #define FORTRAN_RUNTIME_ALLOCATABLE_H_
 
-#include "flang/Runtime/descriptor.h"
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
 
 namespace Fortran::runtime {
+using SubscriptValue = ISO::CFI_index_t;
+using common::TypeCategory;
 
 extern "C" {
 
@@ -129,4 +132,4 @@ void RTDECL(AllocatableDeallocateNoFinal)(
     Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_ALLOCATABLE_H_ */
+#endif // FORTRAN_RUNTIME_ALLOCATABLE_H_
diff --git a/flang/include/flang/Runtime/allocator-registry-consts.h b/flang/include/flang/Runtime/allocator-registry-consts.h
new file mode 100644
index 00000000000000..70735c2fc7a71c
--- /dev/null
+++ b/flang/include/flang/Runtime/allocator-registry-consts.h
@@ -0,0 +1,20 @@
+//===-- include/flang/Runtime/allocator-registry-consts.h -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_
+#define FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_
+
+static constexpr unsigned kDefaultAllocator = 0;
+
+// Allocator used for CUF
+static constexpr unsigned kPinnedAllocatorPos = 1;
+static constexpr unsigned kDeviceAllocatorPos = 2;
+static constexpr unsigned kManagedAllocatorPos = 3;
+static constexpr unsigned kUnifiedAllocatorPos = 4;
+
+#endif /* FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_ */
diff --git a/flang/include/flang/Runtime/array-constructor-consts.h b/flang/include/flang/Runtime/array-constructor-consts.h
new file mode 100644
index 00000000000000..da058874e50487
--- /dev/null
+++ b/flang/include/flang/Runtime/array-constructor-consts.h
@@ -0,0 +1,54 @@
+//===-- include/flang/Runtime/array-constructor-consts.h --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// External APIs to create temporary storage for array constructors when their
+// final extents or length parameters cannot be pre-computed.
+
+#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_
+#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_
+
+#include "flang/Runtime/descriptor-consts.h"
+#include "flang/Runtime/entry-names.h"
+#include <cstdint>
+
+namespace Fortran::runtime {
+struct ArrayConstructorVector;
+
+// Max sizeof(ArrayConstructorVector) and sizeof(ArrayConstructorVector) for any
+// target.
+// TODO: Use target-specific size/alignment instead of overapproximation.
+constexpr std::size_t MaxArrayConstructorVectorSizeInBytes = 2 * 40;
+constexpr std::size_t MaxArrayConstructorVectorAlignInBytes = 8;
+
+extern "C" {
+// API to initialize an ArrayConstructorVector before any values are pushed to
+// it. Inlined code is only expected to allocate the "ArrayConstructorVector"
+// class instance storage with sufficient size (using
+// "2*sizeof(ArrayConstructorVector)" on the host should be safe regardless of
+// the target the runtime is compiled for). This avoids the need for the runtime
+// to maintain a state, or to use dynamic allocation for it. "vectorClassSize"
+// is used to validate that lowering allocated enough space for it.
+void RTDECL(InitArrayConstructorVector)(ArrayConstructorVector &vector,
+    Descriptor &to, bool useValueLengthParameters, int vectorClassSize,
+    const char *sourceFile = nullptr, int sourceLine = 0);
+
+// Generic API to push any kind of entity into the array constructor (any
+// Fortran type and any rank).
+void RTDECL(PushArrayConstructorValue)(
+    ArrayConstructorVector &vector, const Descriptor &from);
+
+// API to push scalar array constructor value of:
+//   - a numerical or logical type,
+//   - or a derived type that has no length parameters, and no allocatable
+//   component (that would require deep copies).
+// It requires no descriptor for the value that is passed via its base address.
+void RTDECL(PushArrayConstructorSimpleScalar)(
+    ArrayConstructorVector &vector, void *from);
+} // extern "C"
+} // namespace Fortran::runtime
+#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/assign.h b/flang/include/flang/Runtime/assign.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/assign.h
rename to flang/include/flang/Runtime/assign.h
index 55d15a5c046868..a1cc9eaf4355f6 100644
--- a/FortranRuntime/include/flang/Runtime/assign.h
+++ b/flang/include/flang/Runtime/assign.h
@@ -58,4 +58,4 @@ void RTDECL(AssignPolymorphic)(Descriptor &to, const Descriptor &from,
     const char *sourceFile = nullptr, int sourceLine = 0);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_ASSIGN_H_ */
+#endif // FORTRAN_RUNTIME_ASSIGN_H_
diff --git a/FortranRuntime/include/flang/Runtime/c-or-cpp.h b/flang/include/flang/Runtime/c-or-cpp.h
similarity index 95%
rename from FortranRuntime/include/flang/Runtime/c-or-cpp.h
rename to flang/include/flang/Runtime/c-or-cpp.h
index 3c0c0be643cbc3..8bac523907750c 100644
--- a/FortranRuntime/include/flang/Runtime/c-or-cpp.h
+++ b/flang/include/flang/Runtime/c-or-cpp.h
@@ -28,4 +28,4 @@
 #define NORETURN IF_CPLUSPLUS([[noreturn]])
 #define NO_ARGUMENTS IF_NOT_CPLUSPLUS(void)
 
-#endif /* FORTRAN_RUNTIME_C_OR_CPP_H_ */
+#endif // FORTRAN_RUNTIME_C_OR_CPP_H_
diff --git a/FortranRuntime/include/flang/Runtime/character.h b/flang/include/flang/Runtime/character.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/character.h
rename to flang/include/flang/Runtime/character.h
index a842c30cd8120c..dd47686fe858fd 100644
--- a/FortranRuntime/include/flang/Runtime/character.h
+++ b/flang/include/flang/Runtime/character.h
@@ -129,4 +129,4 @@ void RTDECL(Verify)(Descriptor &result, const Descriptor &string,
     const char *sourceFile = nullptr, int sourceLine = 0);
 }
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_CHARACTER_H_ */
+#endif // FORTRAN_RUNTIME_CHARACTER_H_
diff --git a/FortranRuntime/include/flang/Runtime/command.h b/flang/include/flang/Runtime/command.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/command.h
rename to flang/include/flang/Runtime/command.h
index 2bbdfca7631163..7ab3f6442dcf92 100644
--- a/FortranRuntime/include/flang/Runtime/command.h
+++ b/flang/include/flang/Runtime/command.h
@@ -62,4 +62,4 @@ std::int32_t RTNAME(GetCwd)(
 }
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_COMMAND_H_ */
+#endif // FORTRAN_RUNTIME_COMMAND_H_
diff --git a/FortranRuntime/include/flang/Runtime/cpp-type.h b/flang/include/flang/Runtime/cpp-type.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/cpp-type.h
rename to flang/include/flang/Runtime/cpp-type.h
index 7de1ea4f45f224..27b43de7d0f0f6 100644
--- a/FortranRuntime/include/flang/Runtime/cpp-type.h
+++ b/flang/include/flang/Runtime/cpp-type.h
@@ -110,4 +110,4 @@ template <> struct CppTypeForHelper<TypeCategory::Logical, 1> {
 };
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_CPP_TYPE_H_ */
+#endif // FORTRAN_RUNTIME_CPP_TYPE_H_
diff --git a/FortranRuntime/include/flang/Runtime/derived-api.h b/flang/include/flang/Runtime/derived-api.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/derived-api.h
rename to flang/include/flang/Runtime/derived-api.h
index ca1681e974051c..79aa7d82de8819 100644
--- a/FortranRuntime/include/flang/Runtime/derived-api.h
+++ b/flang/include/flang/Runtime/derived-api.h
@@ -63,4 +63,4 @@ bool RTDECL(ExtendsTypeOf)(const Descriptor &, const Descriptor &);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_DERIVED_API_H_ */
+#endif // FORTRAN_RUNTIME_DERIVED_API_H_
diff --git a/flang/include/flang/Runtime/descriptor-consts.h b/flang/include/flang/Runtime/descriptor-consts.h
new file mode 100644
index 00000000000000..aa5e2e4ee8b45f
--- /dev/null
+++ b/flang/include/flang/Runtime/descriptor-consts.h
@@ -0,0 +1,73 @@
+//===-- include/flang/Runtime/descriptor-consts.h ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_
+#define FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_
+
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
+#include "flang/Common/api-attrs.h"
+#include <cstddef>
+#include <cstdint>
+
+// Value of the addendum presence flag.
+#define _CFI_ADDENDUM_FLAG 1
+// Number of bits needed to be shifted when manipulating the allocator index.
+#define _CFI_ALLOCATOR_IDX_SHIFT 1
+// Allocator index mask.
+#define _CFI_ALLOCATOR_IDX_MASK 0b00001110
+
+namespace Fortran::runtime::typeInfo {
+using TypeParameterValue = std::int64_t;
+class DerivedType;
+} // namespace Fortran::runtime::typeInfo
+
+namespace Fortran::runtime {
+class Descriptor;
+using SubscriptValue = ISO::CFI_index_t;
+
+/// Returns size in bytes of the descriptor (not the data)
+/// This must be at least as large as the largest descriptor of any target
+/// triple.
+static constexpr RT_API_ATTRS std::size_t MaxDescriptorSizeInBytes(
+    int rank, bool addendum = false, int lengthTypeParameters = 0) {
+  // Layout:
+  //
+  // fortran::runtime::Descriptor {
+  //   ISO::CFI_cdesc_t {
+  //     void *base_addr;           (pointer -> up to 8 bytes)
+  //     size_t elem_len;           (up to 8 bytes)
+  //     int version;               (up to 4 bytes)
+  //     CFI_rank_t rank;           (unsigned char -> 1 byte)
+  //     CFI_type_t type;           (signed char -> 1 byte)
+  //     CFI_attribute_t attribute; (unsigned char -> 1 byte)
+  //     unsigned char extra;       (1 byte)
+  //   }
+  // }
+  // fortran::runtime::Dimension[rank] {
+  //   ISO::CFI_dim_t {
+  //     CFI_index_t lower_bound; (ptrdiff_t -> up to 8 bytes)
+  //     CFI_index_t extent;      (ptrdiff_t -> up to 8 bytes)
+  //     CFI_index_t sm;          (ptrdiff_t -> up to 8 bytes)
+  //   }
+  // }
+  // fortran::runtime::DescriptorAddendum {
+  //   const typeInfo::DerivedType *derivedType_;        (pointer -> up to 8
+  //   bytes) typeInfo::TypeParameterValue len_[lenParameters]; (int64_t -> 8
+  //   bytes)
+  // }
+  std::size_t bytes{24u + rank * 24u};
+  if (addendum || lengthTypeParameters > 0) {
+    if (lengthTypeParameters < 1)
+      lengthTypeParameters = 1;
+    bytes += 8u + static_cast<std::size_t>(lengthTypeParameters) * 8u;
+  }
+  return bytes;
+}
+
+} // namespace Fortran::runtime
+#endif /* FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_ */
diff --git a/FortranRuntime/include/flang/Runtime/entry-names.h b/flang/include/flang/Runtime/entry-names.h
similarity index 89%
rename from FortranRuntime/include/flang/Runtime/entry-names.h
rename to flang/include/flang/Runtime/entry-names.h
index 25134771bf9185..68582b92b54941 100644
--- a/FortranRuntime/include/flang/Runtime/entry-names.h
+++ b/flang/include/flang/Runtime/entry-names.h
@@ -1,10 +1,11 @@
-/*===-- include/flang/Runtime/entry-names.h -------------------------*- C -*-===
+/*===-- include/flang/Runtime/entry-names.h -------------------------*- C -*-=//
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
- *===----------------------------------------------------------------------===*/
+ *===------------------------------------------------------------------------===
+ */
 
 /* Defines the macro RTNAME(n) which decorates the external name of a runtime
  * library function or object with extra characters so that it
@@ -15,8 +16,8 @@
  * The value of REVISION should not be changed until/unless the API to the
  * runtime library must change in some way that breaks backward compatibility.
  */
-#ifndef FORTRAN_RUNTIME_ENTRY_NAMES_H_
-#define FORTRAN_RUNTIME_ENTRY_NAMES_H_
+#ifndef FORTRAN_RUNTIME_ENTRY_NAMES_H
+#define FORTRAN_RUNTIME_ENTRY_NAMES_H
 
 #include "flang/Common/api-attrs.h"
 
@@ -40,4 +41,4 @@
 #define RTNAME_STRING(name) RTNAME_STRINGIFY(RTNAME(name))
 #endif
 
-#endif /* FORTRAN_RUNTIME_ENTRY_NAMES_H_ */
+#endif /* !FORTRAN_RUNTIME_ENTRY_NAMES_H */
diff --git a/FortranRuntime/include/flang/Runtime/exceptions.h b/flang/include/flang/Runtime/exceptions.h
similarity index 86%
rename from FortranRuntime/include/flang/Runtime/exceptions.h
rename to flang/include/flang/Runtime/exceptions.h
index f2c67325b34d92..1ab22da103a50f 100644
--- a/FortranRuntime/include/flang/Runtime/exceptions.h
+++ b/flang/include/flang/Runtime/exceptions.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/exceptions.h ----------------------*- C++ -*-===//
+//===-- include/flang/Runtime/exceptions.h ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -26,4 +26,4 @@ std::uint32_t RTNAME(MapException)(std::uint32_t excepts);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_EXCEPTIONS_H_ */
+#endif // FORTRAN_RUNTIME_EXCEPTIONS_H_
diff --git a/FortranRuntime/include/flang/Runtime/execute.h b/flang/include/flang/Runtime/execute.h
similarity index 89%
rename from FortranRuntime/include/flang/Runtime/execute.h
rename to flang/include/flang/Runtime/execute.h
index d1958a82594ffd..ca137b9d1823c4 100644
--- a/FortranRuntime/include/flang/Runtime/execute.h
+++ b/flang/include/flang/Runtime/execute.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/execute.h -------------------------*- C++ -*-===//
+//===-- include/flang/Runtime/command.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -26,4 +26,4 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait = true,
 }
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_EXECUTE_H_ */
+#endif // FORTRAN_RUNTIME_EXECUTE_H_
diff --git a/FortranRuntime/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/extensions.h
rename to flang/include/flang/Runtime/extensions.h
index f46ccdd7d9528d..fef651f3b2eedb 100644
--- a/FortranRuntime/include/flang/Runtime/extensions.h
+++ b/flang/include/flang/Runtime/extensions.h
@@ -52,4 +52,4 @@ std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name,
 #endif
 
 } // extern "C"
-#endif /* FORTRAN_RUNTIME_EXTENSIONS_H_ */
+#endif // FORTRAN_RUNTIME_EXTENSIONS_H_
diff --git a/FortranRuntime/include/flang/Runtime/freestanding-tools.h b/flang/include/flang/Runtime/freestanding-tools.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/freestanding-tools.h
rename to flang/include/flang/Runtime/freestanding-tools.h
index 8aeef54ba0af3d..e94cb0a6c938cd 100644
--- a/FortranRuntime/include/flang/Runtime/freestanding-tools.h
+++ b/flang/include/flang/Runtime/freestanding-tools.h
@@ -215,4 +215,4 @@ using std::toupper;
 #endif // !STD_TOUPPER_UNSUPPORTED
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_ */
+#endif // FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_
diff --git a/FortranRuntime/include/flang/Runtime/inquiry.h b/flang/include/flang/Runtime/inquiry.h
similarity index 91%
rename from FortranRuntime/include/flang/Runtime/inquiry.h
rename to flang/include/flang/Runtime/inquiry.h
index 83b07cf2f31a47..c7a7487f1a1b18 100644
--- a/FortranRuntime/include/flang/Runtime/inquiry.h
+++ b/flang/include/flang/Runtime/inquiry.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/inquiry.h -------------------------*- C++ -*-===//
+//===-- include/flang/Runtime/inquiry.h ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -40,4 +40,4 @@ void RTDECL(Ubound)(void *result, const Descriptor &array, int kind,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_INQUIRY_H_ */
+#endif // FORTRAN_RUNTIME_INQUIRY_H_
diff --git a/FortranRuntime/include/flang/Runtime/io-api.h b/flang/include/flang/Runtime/io-api.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/io-api.h
rename to flang/include/flang/Runtime/io-api.h
index be948061c241a0..e588b46dc4b3a1 100644
--- a/FortranRuntime/include/flang/Runtime/io-api.h
+++ b/flang/include/flang/Runtime/io-api.h
@@ -11,10 +11,10 @@
 #ifndef FORTRAN_RUNTIME_IO_API_H_
 #define FORTRAN_RUNTIME_IO_API_H_
 
-#include "flang/Common/magic-numbers.h"
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/entry-names.h"
 #include "flang/Runtime/iostat.h"
+#include "flang/Runtime/magic-numbers.h"
 #include <cinttypes>
 #include <cstddef>
 
@@ -51,9 +51,6 @@ constexpr InquiryKeywordHash HashInquiryKeyword(const char *p) {
   return hash;
 }
 
-RT_API_ATTRS const char *InquiryKeywordHashDecode(
-    char *buffer, std::size_t, InquiryKeywordHash);
-
 extern "C" {
 
 #define IONAME(name) RTNAME(io##name)
@@ -369,4 +366,4 @@ enum Iostat IODECL(EndIoStatement)(Cookie);
 
 } // extern "C"
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IO_API_H_ */
+#endif
diff --git a/FortranRuntime/include/flang/Runtime/iostat.h b/flang/include/flang/Runtime/iostat.h
similarity index 96%
rename from FortranRuntime/include/flang/Runtime/iostat.h
rename to flang/include/flang/Runtime/iostat.h
index 9a52990045ee13..0565718f6c103d 100644
--- a/FortranRuntime/include/flang/Runtime/iostat.h
+++ b/flang/include/flang/Runtime/iostat.h
@@ -12,7 +12,7 @@
 #ifndef FORTRAN_RUNTIME_IOSTAT_H_
 #define FORTRAN_RUNTIME_IOSTAT_H_
 #include "flang/Common/api-attrs.h"
-#include "flang/Common/magic-numbers.h"
+#include "flang/Runtime/magic-numbers.h"
 namespace Fortran::runtime::io {
 
 // The value of IOSTAT= is zero when no error, end-of-record,
@@ -89,7 +89,5 @@ enum Iostat {
   IostatNonExternalDefinedUnformattedIo,
 };
 
-RT_API_ATTRS const char *IostatErrorString(int);
-
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IOSTAT_H_ */
+#endif // FORTRAN_RUNTIME_IOSTAT_H_
diff --git a/FortranRuntime/include/flang/Common/magic-numbers.h b/flang/include/flang/Runtime/magic-numbers.h
similarity index 98%
rename from FortranRuntime/include/flang/Common/magic-numbers.h
rename to flang/include/flang/Runtime/magic-numbers.h
index 931df690766219..bab0e9ae05299a 100644
--- a/FortranRuntime/include/flang/Common/magic-numbers.h
+++ b/flang/include/flang/Runtime/magic-numbers.h
@@ -1,10 +1,10 @@
-#if 0 /*===-- include/flang/Runtime/magic-numbers.h ---------------*- C -*-===*/
- *
+#if 0 /*===-- include/flang/Runtime/magic-numbers.h -----------------------===*/
+/*
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
-/*===----------------------------------------------------------------------===*/
+ *===----------------------------------------------------------------------===*/
 #endif
 #if 0
 This header can be included into both Fortran and C.
diff --git a/FortranRuntime/include/flang/Runtime/main.h b/flang/include/flang/Runtime/main.h
similarity index 95%
rename from FortranRuntime/include/flang/Runtime/main.h
rename to flang/include/flang/Runtime/main.h
index 98fcf1250d0ad6..88232ea64fa6ab 100644
--- a/FortranRuntime/include/flang/Runtime/main.h
+++ b/flang/include/flang/Runtime/main.h
@@ -20,4 +20,4 @@ void RTNAME(ProgramStart)(
 void RTNAME(ByteswapOption)(void); // -byteswapio
 FORTRAN_EXTERN_C_END
 
-#endif /* FORTRAN_RUNTIME_MAIN_H_ */
+#endif // FORTRAN_RUNTIME_MAIN_H_
diff --git a/FortranRuntime/include/flang/Runtime/matmul-instances.inc b/flang/include/flang/Runtime/matmul-instances.inc
similarity index 100%
rename from FortranRuntime/include/flang/Runtime/matmul-instances.inc
rename to flang/include/flang/Runtime/matmul-instances.inc
diff --git a/FortranRuntime/include/flang/Runtime/matmul-transpose.h b/flang/include/flang/Runtime/matmul-transpose.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/matmul-transpose.h
rename to flang/include/flang/Runtime/matmul-transpose.h
index 077277fae2da86..2d79ca10e08958 100644
--- a/FortranRuntime/include/flang/Runtime/matmul-transpose.h
+++ b/flang/include/flang/Runtime/matmul-transpose.h
@@ -46,4 +46,4 @@ void RTDECL(MatmulTransposeDirect)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_ */
+#endif // FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_
diff --git a/FortranRuntime/include/flang/Runtime/matmul.h b/flang/include/flang/Runtime/matmul.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/matmul.h
rename to flang/include/flang/Runtime/matmul.h
index cd375ac43d77f2..a72d4a06ee4594 100644
--- a/FortranRuntime/include/flang/Runtime/matmul.h
+++ b/flang/include/flang/Runtime/matmul.h
@@ -45,4 +45,4 @@ void RTDECL(MatmulDirect)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_MATMUL_H_ */
+#endif // FORTRAN_RUNTIME_MATMUL_H_
diff --git a/FortranRuntime/include/flang/Runtime/misc-intrinsic.h b/flang/include/flang/Runtime/misc-intrinsic.h
similarity index 95%
rename from FortranRuntime/include/flang/Runtime/misc-intrinsic.h
rename to flang/include/flang/Runtime/misc-intrinsic.h
index 1d4163c2e1e751..3fb3aaed49c0fb 100644
--- a/FortranRuntime/include/flang/Runtime/misc-intrinsic.h
+++ b/flang/include/flang/Runtime/misc-intrinsic.h
@@ -28,4 +28,4 @@ void RTDECL(TransferSize)(Descriptor &result, const Descriptor &source,
     std::int64_t size);
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_MISC_INTRINSIC_H_ */
+#endif // FORTRAN_RUNTIME_MISC_INTRINSIC_H_
diff --git a/FortranRuntime/include/flang/Runtime/numeric.h b/flang/include/flang/Runtime/numeric.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/numeric.h
rename to flang/include/flang/Runtime/numeric.h
index 5fbab2e069b739..84a5a7cd7a361c 100644
--- a/FortranRuntime/include/flang/Runtime/numeric.h
+++ b/flang/include/flang/Runtime/numeric.h
@@ -455,4 +455,4 @@ CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16k)(
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_NUMERIC_H_ */
+#endif // FORTRAN_RUNTIME_NUMERIC_H_
diff --git a/FortranRuntime/include/flang/Runtime/pointer.h b/flang/include/flang/Runtime/pointer.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/pointer.h
rename to flang/include/flang/Runtime/pointer.h
index b7322ad92bd583..c6d29db7218376 100644
--- a/FortranRuntime/include/flang/Runtime/pointer.h
+++ b/flang/include/flang/Runtime/pointer.h
@@ -12,10 +12,14 @@
 #ifndef FORTRAN_RUNTIME_POINTER_H_
 #define FORTRAN_RUNTIME_POINTER_H_
 
-#include "flang/Runtime/descriptor.h"
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
 
 namespace Fortran::runtime {
+using SubscriptValue = ISO::CFI_index_t;
+using common::TypeCategory;
+
 extern "C" {
 
 // Data pointer initialization for NULLIFY(), "p=>NULL()`, & for ALLOCATE().
diff --git a/FortranRuntime/include/flang/Runtime/ragged.h b/flang/include/flang/Runtime/ragged.h
similarity index 96%
rename from FortranRuntime/include/flang/Runtime/ragged.h
rename to flang/include/flang/Runtime/ragged.h
index 8574bc1fa110c8..f52a619c55b43e 100644
--- a/FortranRuntime/include/flang/Runtime/ragged.h
+++ b/flang/include/flang/Runtime/ragged.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/ragged.h --------------------------*- C++ -*-===//
+//===-- Runtime/ragged.h ----------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -57,4 +57,4 @@ void RTDECL(RaggedArrayDeallocate)(void *raggedArrayHeader);
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_RAGGED_H_ */
+#endif // FORTRAN_RUNTIME_RAGGED_H_
diff --git a/FortranRuntime/include/flang/Runtime/random.h b/flang/include/flang/Runtime/random.h
similarity index 100%
rename from FortranRuntime/include/flang/Runtime/random.h
rename to flang/include/flang/Runtime/random.h
diff --git a/FortranRuntime/include/flang/Runtime/reduce.h b/flang/include/flang/Runtime/reduce.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/reduce.h
rename to flang/include/flang/Runtime/reduce.h
index ae2828f04bf7c0..60f54c393b4bbd 100644
--- a/FortranRuntime/include/flang/Runtime/reduce.h
+++ b/flang/include/flang/Runtime/reduce.h
@@ -435,4 +435,4 @@ void RTDECL(ReduceDerivedTypeDim)(Descriptor &result, const Descriptor &array,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_REDUCE_H_ */
+#endif // FORTRAN_RUNTIME_REDUCE_H_
diff --git a/FortranRuntime/include/flang/Runtime/reduction.h b/flang/include/flang/Runtime/reduction.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/reduction.h
rename to flang/include/flang/Runtime/reduction.h
index e00593fbc9f75e..97986c12e8a10e 100644
--- a/FortranRuntime/include/flang/Runtime/reduction.h
+++ b/flang/include/flang/Runtime/reduction.h
@@ -444,4 +444,4 @@ bool RTDECL(DotProductLogical)(const Descriptor &, const Descriptor &,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_REDUCTION_H_ */
+#endif // FORTRAN_RUNTIME_REDUCTION_H_
diff --git a/FortranRuntime/include/flang/Runtime/stop.h b/flang/include/flang/Runtime/stop.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/stop.h
rename to flang/include/flang/Runtime/stop.h
index 9ba41343c6f964..f7c4ffe7403e8e 100644
--- a/FortranRuntime/include/flang/Runtime/stop.h
+++ b/flang/include/flang/Runtime/stop.h
@@ -37,4 +37,4 @@ NORETURN void RTNAME(ReportFatalUserError)(
 
 FORTRAN_EXTERN_C_END
 
-#endif /* FORTRAN_RUNTIME_STOP_H_ */
+#endif // FORTRAN_RUNTIME_STOP_H_
diff --git a/FortranRuntime/include/flang/Runtime/support.h b/flang/include/flang/Runtime/support.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/support.h
rename to flang/include/flang/Runtime/support.h
index 9c9b067a18f2e4..4a6d4357e87103 100644
--- a/FortranRuntime/include/flang/Runtime/support.h
+++ b/flang/include/flang/Runtime/support.h
@@ -47,4 +47,4 @@ void RTDECL(CopyAndUpdateDescriptor)(Descriptor &to, const Descriptor &from,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_SUPPORT_H_ */
+#endif // FORTRAN_RUNTIME_SUPPORT_H_
diff --git a/FortranRuntime/include/flang/Runtime/temporary-stack.h b/flang/include/flang/Runtime/temporary-stack.h
similarity index 98%
rename from FortranRuntime/include/flang/Runtime/temporary-stack.h
rename to flang/include/flang/Runtime/temporary-stack.h
index f83fab7b0ac811..3c1a4ea11a4352 100644
--- a/FortranRuntime/include/flang/Runtime/temporary-stack.h
+++ b/flang/include/flang/Runtime/temporary-stack.h
@@ -64,4 +64,4 @@ void RTNAME(DestroyDescriptorStack)(void *opaquePtr);
 } // extern "C"
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_TEMPORARY_STACK_H_ */
+#endif // FORTRAN_RUNTIME_TEMPORARY_STACK_H_
diff --git a/FortranRuntime/include/flang/Runtime/time-intrinsic.h b/flang/include/flang/Runtime/time-intrinsic.h
similarity index 97%
rename from FortranRuntime/include/flang/Runtime/time-intrinsic.h
rename to flang/include/flang/Runtime/time-intrinsic.h
index 0e63fc6a4647a4..80490a17e45597 100644
--- a/FortranRuntime/include/flang/Runtime/time-intrinsic.h
+++ b/flang/include/flang/Runtime/time-intrinsic.h
@@ -48,4 +48,4 @@ void RTNAME(Etime)(const Descriptor *values, const Descriptor *time,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_TIME_INTRINSIC_H_ */
+#endif // FORTRAN_RUNTIME_TIME_INTRINSIC_H_
diff --git a/FortranRuntime/include/flang/Runtime/transformational.h b/flang/include/flang/Runtime/transformational.h
similarity index 99%
rename from FortranRuntime/include/flang/Runtime/transformational.h
rename to flang/include/flang/Runtime/transformational.h
index 266dd9d7aebc24..a39b872f376a69 100644
--- a/FortranRuntime/include/flang/Runtime/transformational.h
+++ b/flang/include/flang/Runtime/transformational.h
@@ -154,4 +154,4 @@ void RTDECL(Unpack)(Descriptor &result, const Descriptor &vector,
 
 } // extern "C"
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_TRANSFORMATIONAL_H_ */
+#endif // FORTRAN_RUNTIME_TRANSFORMATIONAL_H_
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index 718ce680afeeab..1423d2c83d22cc 100644
--- a/flang/include/flang/Support/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_FORTRAN_FEATURES_H_
-#define FORTRAN_COMMON_FORTRAN_FEATURES_H_
+#ifndef FORTRAN_SUPPORT_FORTRAN_FEATURES_H_
+#define FORTRAN_SUPPORT_FORTRAN_FEATURES_H_
 
 #include "flang/Common/enum-set.h"
 #include "flang/Common/idioms.h"
@@ -191,4 +191,4 @@ class LanguageFeatureControl {
   bool warnAllUsage_{false};
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_FORTRAN_FEATURES_H_
+#endif /* FORTRAN_SUPPORT_FORTRAN_FEATURES_H_ */
diff --git a/flang/include/flang/Support/Fortran.h b/flang/include/flang/Support/Fortran.h
index 343a0b30d2ba9c..7a9b0d56d6b2ac 100644
--- a/flang/include/flang/Support/Fortran.h
+++ b/flang/include/flang/Support/Fortran.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Common/Fortran.h --------------------------*- C++ -*-===//
+//===-- include/flang/Support/Fortran.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_FORTRAN_H_
-#define FORTRAN_COMMON_FORTRAN_H_
+#ifndef FORTRAN_SUPPORT_FORTRAN_H_
+#define FORTRAN_SUPPORT_FORTRAN_H_
 
 // Fortran language concepts that are used in many phases are defined
 // once here to avoid redundancy and needless translation.
@@ -107,4 +107,4 @@ inline std::string GetExternalAssemblyName(
 }
 
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_FORTRAN_H_
+#endif /* FORTRAN_SUPPORT_FORTRAN_H_ */
diff --git a/flang/include/flang/Support/MathOptionsBase.h b/flang/include/flang/Support/MathOptionsBase.h
index a739ba3e066599..072aed20da4708 100644
--- a/flang/include/flang/Support/MathOptionsBase.h
+++ b/flang/include/flang/Support/MathOptionsBase.h
@@ -14,8 +14,8 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_MATHOPTIONSBASE_H
-#define FORTRAN_COMMON_MATHOPTIONSBASE_H
+#ifndef FORTRAN_SUPPORT_MATHOPTIONSBASE_H_
+#define FORTRAN_SUPPORT_MATHOPTIONSBASE_H_
 
 namespace Fortran::common {
 
@@ -41,4 +41,4 @@ class MathOptionsBase {
 
 } // namespace Fortran::common
 
-#endif // FORTRAN_COMMON_MATHOPTIONSBASE_H
+#endif /* FORTRAN_SUPPORT_MATHOPTIONSBASE_H_ */
diff --git a/flang/include/flang/Support/Version.h b/flang/include/flang/Support/Version.h
index 643ddd2e27f69a..4ceb19e7f4d714 100644
--- a/flang/include/flang/Support/Version.h
+++ b/flang/include/flang/Support/Version.h
@@ -12,8 +12,8 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_VERSION_H
-#define FORTRAN_COMMON_VERSION_H
+#ifndef FORTRAN_SUPPORT_VERSION_H_
+#define FORTRAN_SUPPORT_VERSION_H_
 
 #include "flang/Version.inc"
 #include "llvm/ADT/StringRef.h"
@@ -53,4 +53,4 @@ std::string getFlangFullVersion();
 std::string getFlangToolFullVersion(llvm::StringRef ToolName);
 } // namespace Fortran::common
 
-#endif // FORTRAN_COMMON_VERSION_H
+#endif /* FORTRAN_SUPPORT_VERSION_H_ */
diff --git a/flang/include/flang/Support/default-kinds.h b/flang/include/flang/Support/default-kinds.h
index e78a08dfae6cc3..92f06e6fe2d272 100644
--- a/flang/include/flang/Support/default-kinds.h
+++ b/flang/include/flang/Support/default-kinds.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_DEFAULT_KINDS_H_
-#define FORTRAN_COMMON_DEFAULT_KINDS_H_
+#ifndef FORTRAN_SUPPORT_DEFAULT_KINDS_H_
+#define FORTRAN_SUPPORT_DEFAULT_KINDS_H_
 
 #include "flang/Support/Fortran.h"
 #include <cstdint>
@@ -58,4 +58,4 @@ class IntrinsicTypeDefaultKinds {
   int defaultLogicalKind_{defaultIntegerKind_};
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_DEFAULT_KINDS_H_
+#endif /* FORTRAN_SUPPORT_DEFAULT_KINDS_H_ */
diff --git a/flang/include/flang/Support/indirection.h b/flang/include/flang/Support/indirection.h
index 1221a659323503..aeb1698516bae9 100644
--- a/flang/include/flang/Support/indirection.h
+++ b/flang/include/flang/Support/indirection.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_INDIRECTION_H_
-#define FORTRAN_COMMON_INDIRECTION_H_
+#ifndef FORTRAN_SUPPORT_INDIRECTION_H_
+#define FORTRAN_SUPPORT_INDIRECTION_H_
 
 // Define a smart pointer class template that is rather like
 // non-nullable std::unique_ptr<>.  Indirection<> is, like a C++ reference
@@ -171,4 +171,4 @@ template <typename A> class ForwardOwningPointer {
   void (*deleter_)(A *){nullptr};
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_INDIRECTION_H_
+#endif /* FORTRAN_SUPPORT_INDIRECTION_H_ */
diff --git a/flang/include/flang/Support/interval.h b/flang/include/flang/Support/interval.h
index 2918cc54de3926..99c0784f006a80 100644
--- a/flang/include/flang/Support/interval.h
+++ b/flang/include/flang/Support/interval.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_INTERVAL_H_
-#define FORTRAN_COMMON_INTERVAL_H_
+#ifndef FORTRAN_SUPPORT_INTERVAL_H_
+#define FORTRAN_SUPPORT_INTERVAL_H_
 
 // Defines a generalized template class Interval<A> to represent
 // the half-open interval [x .. x+n).
@@ -126,4 +126,4 @@ template <typename A> class Interval {
   std::size_t size_{0};
 };
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_INTERVAL_H_
+#endif /* FORTRAN_SUPPORT_INTERVAL_H_ */
diff --git a/flang/include/flang/Support/template.h b/flang/include/flang/Support/template.h
index 58c9b0a5628e8a..36fa6f7072b40c 100644
--- a/flang/include/flang/Support/template.h
+++ b/flang/include/flang/Support/template.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_TEMPLATE_H_
-#define FORTRAN_COMMON_TEMPLATE_H_
+#ifndef FORTRAN_SUPPORT_TEMPLATE_H_
+#define FORTRAN_SUPPORT_TEMPLATE_H_
 
 #include "flang/Common/idioms.h"
 #include "flang/Common/variant.h"
@@ -322,4 +322,4 @@ common::IfNoLvalue<typename VISITOR::Result, VISITOR> SearchTypes(
       std::move(visitor), std::move(defaultResult));
 }
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_TEMPLATE_H_
+#endif /* FORTRAN_SUPPORT_TEMPLATE_H_ */
diff --git a/flang/include/flang/Support/unwrap.h b/flang/include/flang/Support/unwrap.h
index d8fa553dedda3f..e890753499d1a1 100644
--- a/flang/include/flang/Support/unwrap.h
+++ b/flang/include/flang/Support/unwrap.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_COMMON_UNWRAP_H_
-#define FORTRAN_COMMON_UNWRAP_H_
+#ifndef FORTRAN_SUPPORT_UNWRAP_H_
+#define FORTRAN_SUPPORT_UNWRAP_H_
 
 #include "indirection.h"
 #include "reference-counted.h"
@@ -155,4 +155,4 @@ template <typename A, typename B> std::optional<A> UnwrapCopy(const B &x) {
   }
 }
 } // namespace Fortran::common
-#endif // FORTRAN_COMMON_UNWRAP_H_
+#endif /* FORTRAN_SUPPORT_UNWRAP_H_ */
diff --git a/flang/include/flang/Testing/README.md b/flang/include/flang/Testing/README.md
new file mode 100644
index 00000000000000..a722732fb76407
--- /dev/null
+++ b/flang/include/flang/Testing/README.md
@@ -0,0 +1,25 @@
+Files in this directory are used by Flang (the compiler) and FortranRuntime
+(the runtime library for Flang-compiled programs). They must be compatible by
+both. For definitions used only by Flang, consider
+`flang/{lib,include/flang}/Support` instead. For definitions used only by
+FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+
+The requirements for common code include:
+
+ * No dependence to LLVM, including LLVMSupport.
+
+ * No link-dependence to the C++ runtime. This means that e.g. `std::string`
+   cannot be used.
+
+ * No use of `std::optional<T>`; `fortran::common::optional<T>` can be used
+   instead.
+
+ * Preprocessor macros from `config.h` and CMake
+   `(target/add)_compile_definitions` must be defined by both build scripts.
+   See `flang/cmake/modules/FlangCommon.cmake`.
+
+ * Some header files are included from `.c` files.
+   `#include <flang/Common/c-or-cpp.h>` can help to support C++ and C.
+
+ * Global declarations may need to be annotated using definitions from
+   `api-attrs.h`.
diff --git a/FortranRuntime/include/flang/Testing/fp-testing.h b/flang/include/flang/Testing/fp-testing.h
similarity index 100%
rename from FortranRuntime/include/flang/Testing/fp-testing.h
rename to flang/include/flang/Testing/fp-testing.h
diff --git a/FortranRuntime/include/flang/Testing/testing.h b/flang/include/flang/Testing/testing.h
similarity index 100%
rename from FortranRuntime/include/flang/Testing/testing.h
rename to flang/include/flang/Testing/testing.h
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index f7fdc74a32ec8c..8039bd8a51ee82 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -6,7 +6,7 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_flang_library(FortranCommon 
-  "${FORTRANRUNTIME_SOURCE_DIR}/lib/Common/binary-to-decimal.cpp"
-  "${FORTRANRUNTIME_SOURCE_DIR}/lib/Common/decimal-to-binary.cpp"
+add_flang_library(FortranCommon
+  binary-to-decimal.cpp
+  decimal-to-binary.cpp
 )
diff --git a/flang/lib/Common/README.md b/flang/lib/Common/README.md
new file mode 100644
index 00000000000000..a722732fb76407
--- /dev/null
+++ b/flang/lib/Common/README.md
@@ -0,0 +1,25 @@
+Files in this directory are used by Flang (the compiler) and FortranRuntime
+(the runtime library for Flang-compiled programs). They must be compatible by
+both. For definitions used only by Flang, consider
+`flang/{lib,include/flang}/Support` instead. For definitions used only by
+FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+
+The requirements for common code include:
+
+ * No dependence to LLVM, including LLVMSupport.
+
+ * No link-dependence to the C++ runtime. This means that e.g. `std::string`
+   cannot be used.
+
+ * No use of `std::optional<T>`; `fortran::common::optional<T>` can be used
+   instead.
+
+ * Preprocessor macros from `config.h` and CMake
+   `(target/add)_compile_definitions` must be defined by both build scripts.
+   See `flang/cmake/modules/FlangCommon.cmake`.
+
+ * Some header files are included from `.c` files.
+   `#include <flang/Common/c-or-cpp.h>` can help to support C++ and C.
+
+ * Global declarations may need to be annotated using definitions from
+   `api-attrs.h`.
diff --git a/FortranRuntime/lib/Common/big-radix-floating-point.h b/flang/lib/Common/big-radix-floating-point.h
similarity index 100%
rename from FortranRuntime/lib/Common/big-radix-floating-point.h
rename to flang/lib/Common/big-radix-floating-point.h
diff --git a/FortranRuntime/lib/Common/binary-to-decimal.cpp b/flang/lib/Common/binary-to-decimal.cpp
similarity index 100%
rename from FortranRuntime/lib/Common/binary-to-decimal.cpp
rename to flang/lib/Common/binary-to-decimal.cpp
diff --git a/FortranRuntime/lib/Common/decimal-to-binary.cpp b/flang/lib/Common/decimal-to-binary.cpp
similarity index 100%
rename from FortranRuntime/lib/Common/decimal-to-binary.cpp
rename to flang/lib/Common/decimal-to-binary.cpp
diff --git a/flang/lib/Evaluate/fold-logical.cpp b/flang/lib/Evaluate/fold-logical.cpp
index a7e1aad38f3586..ee6655f8387177 100644
--- a/flang/lib/Evaluate/fold-logical.cpp
+++ b/flang/lib/Evaluate/fold-logical.cpp
@@ -9,8 +9,8 @@
 #include "fold-implementation.h"
 #include "fold-matmul.h"
 #include "fold-reduction.h"
-#include "flang/Common/magic-numbers.h"
 #include "flang/Evaluate/check-expression.h"
+#include "flang/Runtime/magic-numbers.h"
 
 namespace Fortran::evaluate {
 
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index f76d44f5479d32..82bedca7bd41dd 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -39,7 +39,7 @@
 #include "flang/Optimizer/Support/FatalError.h"
 #include "flang/Optimizer/Support/InternalNames.h"
 #include "flang/Optimizer/Support/Utils.h"
-#include "flang/Runtime/allocator-registry.h"
+#include "flang/Runtime/allocator-registry-consts.h"
 #include "flang/Semantics/runtime-type-info.h"
 #include "flang/Semantics/tools.h"
 #include "llvm/Support/CommandLine.h"
diff --git a/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp b/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp
index c786bef5cb1c4c..b7c6dc5fb2bf6c 100644
--- a/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp
+++ b/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp
@@ -9,7 +9,7 @@
 #include "flang/Optimizer/Builder/Runtime/ArrayConstructor.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
-#include "flang/Runtime/array-constructor.h"
+#include "flang/Runtime/array-constructor-consts.h"
 
 using namespace Fortran::runtime;
 
@@ -29,8 +29,8 @@ mlir::Value fir::runtime::genInitArrayConstructorVector(
   // the target. The "cookieSize" argument is used to validate this wild
   // assumption until runtime interfaces are improved.
   std::size_t arrayVectorStructBitSize =
-      2 * sizeof(Fortran::runtime::ArrayConstructorVector) * 8;
-  std::size_t alignLike = alignof(Fortran::runtime::ArrayConstructorVector) * 8;
+      MaxArrayConstructorVectorSizeInBytes * 8;
+  std::size_t alignLike = MaxArrayConstructorVectorAlignInBytes * 8;
   fir::SequenceType::Extent numElem =
       (arrayVectorStructBitSize + alignLike - 1) / alignLike;
   mlir::Type intType = builder.getIntegerType(alignLike);
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 88293bcf36a780..eed389380f7cca 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -23,8 +23,8 @@
 #include "flang/Optimizer/Support/InternalNames.h"
 #include "flang/Optimizer/Support/TypeCode.h"
 #include "flang/Optimizer/Support/Utils.h"
-#include "flang/Runtime/allocator-registry.h"
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/allocator-registry-consts.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Semantics/runtime-type-info.h"
 #include "mlir/Conversion/ArithCommon/AttrToLLVMConverter.h"
 #include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
@@ -1273,16 +1273,12 @@ struct EmboxCommonConversion : public fir::FIROpConversion<OP> {
           insertField(rewriter, loc, descriptor, {kExtraPosInBox}, extraField);
     } else {
       // Compute the value of the extra field based on allocator_idx and
-      // addendum present using a Descriptor object.
-      Fortran::runtime::StaticDescriptor staticDescriptor;
-      Fortran::runtime::Descriptor &desc{staticDescriptor.descriptor()};
-      desc.raw().extra = 0;
-      desc.SetAllocIdx(allocatorIdx);
+      // addendum present.
+      unsigned extra = allocatorIdx << _CFI_ALLOCATOR_IDX_SHIFT;
       if (hasAddendum)
-        desc.SetHasAddendum();
-      descriptor =
-          insertField(rewriter, loc, descriptor, {kExtraPosInBox},
-                      this->genI32Constant(loc, rewriter, desc.raw().extra));
+        extra |= _CFI_ADDENDUM_FLAG;
+      descriptor = insertField(rewriter, loc, descriptor, {kExtraPosInBox},
+                               this->genI32Constant(loc, rewriter, extra));
     }
 
     if (hasAddendum) {
diff --git a/flang/lib/Semantics/compute-offsets.cpp b/flang/lib/Semantics/compute-offsets.cpp
index b5a58ddca0ecdd..c5774ed30de748 100644
--- a/flang/lib/Semantics/compute-offsets.cpp
+++ b/flang/lib/Semantics/compute-offsets.cpp
@@ -11,7 +11,7 @@
 #include "flang/Evaluate/fold.h"
 #include "flang/Evaluate/shape.h"
 #include "flang/Evaluate/type.h"
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/descriptor-consts.h"
 #include "flang/Semantics/scope.h"
 #include "flang/Semantics/semantics.h"
 #include "flang/Semantics/symbol.h"
@@ -341,8 +341,12 @@ auto ComputeOffsetsHelper::GetSizeAndAlignment(
     const auto *derived{evaluate::GetDerivedTypeSpec(dyType)};
     int lenParams{derived ? CountLenParameters(*derived) : 0};
     bool needAddendum{derived || (dyType && dyType->IsUnlimitedPolymorphic())};
-    std::size_t size{runtime::Descriptor::SizeInBytes(
+
+    // FIXME: Get descriptor size from targetCharacteristics instead
+    // overapproximation
+    std::size_t size{runtime::MaxDescriptorSizeInBytes(
         symbol.Rank(), needAddendum, lenParams)};
+
     return {size, targetCharacteristics.descriptorAlignment()};
   }
   if (IsProcedurePointer(symbol)) {
diff --git a/flang/lib/Testing/CMakeLists.txt b/flang/lib/Testing/CMakeLists.txt
new file mode 100644
index 00000000000000..d5caada3fb68e8
--- /dev/null
+++ b/flang/lib/Testing/CMakeLists.txt
@@ -0,0 +1,20 @@
+#===-- lib/Testing/CMakeLists.txt ------------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+set(public_headers "")
+file(GLOB_RECURSE public_headers
+  "${FLANGRUNTIME_SOURCE_DIR}/lib/Testing/*.h"
+)
+
+add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
+  testing.cpp
+  fp-testing.cpp
+ ADDITIONAL_HEADERS
+   ${public_headers}
+)
+
diff --git a/flang/lib/Testing/README.md b/flang/lib/Testing/README.md
new file mode 100644
index 00000000000000..a722732fb76407
--- /dev/null
+++ b/flang/lib/Testing/README.md
@@ -0,0 +1,25 @@
+Files in this directory are used by Flang (the compiler) and FortranRuntime
+(the runtime library for Flang-compiled programs). They must be compatible by
+both. For definitions used only by Flang, consider
+`flang/{lib,include/flang}/Support` instead. For definitions used only by
+FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+
+The requirements for common code include:
+
+ * No dependence to LLVM, including LLVMSupport.
+
+ * No link-dependence to the C++ runtime. This means that e.g. `std::string`
+   cannot be used.
+
+ * No use of `std::optional<T>`; `fortran::common::optional<T>` can be used
+   instead.
+
+ * Preprocessor macros from `config.h` and CMake
+   `(target/add)_compile_definitions` must be defined by both build scripts.
+   See `flang/cmake/modules/FlangCommon.cmake`.
+
+ * Some header files are included from `.c` files.
+   `#include <flang/Common/c-or-cpp.h>` can help to support C++ and C.
+
+ * Global declarations may need to be annotated using definitions from
+   `api-attrs.h`.
diff --git a/FortranRuntime/lib/Testing/fp-testing.cpp b/flang/lib/Testing/fp-testing.cpp
similarity index 100%
rename from FortranRuntime/lib/Testing/fp-testing.cpp
rename to flang/lib/Testing/fp-testing.cpp
diff --git a/FortranRuntime/lib/Testing/testing.cpp b/flang/lib/Testing/testing.cpp
similarity index 100%
rename from FortranRuntime/lib/Testing/testing.cpp
rename to flang/lib/Testing/testing.cpp
diff --git a/flang/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90
index fe91305c836ff4..d1d4a639e70d72 100644
--- a/flang/module/__fortran_builtins.f90
+++ b/flang/module/__fortran_builtins.f90
@@ -6,7 +6,7 @@
 !
 !===------------------------------------------------------------------------===!
 
-#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
+#include '../include/flang/Runtime/magic-numbers.h'
 
 ! These naming shenanigans prevent names from Fortran intrinsic modules
 ! from being usable on INTRINSIC statements, and force the program
diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90
index 56f79a473b556a..6691012eda238a 100644
--- a/flang/module/__fortran_ieee_exceptions.f90
+++ b/flang/module/__fortran_ieee_exceptions.f90
@@ -11,7 +11,7 @@
 ! here under another name so that IEEE_ARITHMETIC can USE it and export its
 ! declarations without clashing with a non-intrinsic module in a program.
 
-#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
+#include '../include/flang/Runtime/magic-numbers.h'
 
 module __fortran_ieee_exceptions
   use __fortran_builtins, only: &
diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90
index 667374d0660806..7eaa7db55af9f8 100644
--- a/flang/module/ieee_arithmetic.f90
+++ b/flang/module/ieee_arithmetic.f90
@@ -8,7 +8,7 @@
 
 ! Fortran 2018 Clause 17
 
-#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
+#include '../include/flang/Runtime/magic-numbers.h'
 
 module ieee_arithmetic
   ! F18 Clause 17.1p1:
diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90
index d1f956b6b86408..4e575b422c2a04 100644
--- a/flang/module/iso_fortran_env.f90
+++ b/flang/module/iso_fortran_env.f90
@@ -8,7 +8,7 @@
 
 ! See Fortran 2023, subclause 16.10.2
 
-#include '../../FortranRuntime/include/flang/Common/magic-numbers.h'
+#include '../include/flang/Runtime/magic-numbers.h'
 
 module iso_fortran_env
 
diff --git a/FortranRuntime/unittests/Common/CMakeLists.txt b/flang/unittests/Common/CMakeLists.txt
similarity index 100%
rename from FortranRuntime/unittests/Common/CMakeLists.txt
rename to flang/unittests/Common/CMakeLists.txt
diff --git a/FortranRuntime/unittests/Common/FastIntSetTest.cpp b/flang/unittests/Common/FastIntSetTest.cpp
similarity index 97%
rename from FortranRuntime/unittests/Common/FastIntSetTest.cpp
rename to flang/unittests/Common/FastIntSetTest.cpp
index a36a334e370eb9..bd1b953fa16631 100644
--- a/FortranRuntime/unittests/Common/FastIntSetTest.cpp
+++ b/flang/unittests/Common/FastIntSetTest.cpp
@@ -1,4 +1,4 @@
-//===-- unittests/Common/FastIntSetTest.cpp ---------------------*- C++ -*-===//
+//===-- flang/unittests/Common/FastIntSetTest.cpp ---------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "flang/Common/fast-int-set.h"
 #include "gtest/gtest.h"
+#include "flang/Common/fast-int-set.h"
 #include <optional>
 
 TEST(FastIntSetTests, Sanity) {
diff --git a/FortranRuntime/unittests/Decimal/CMakeLists.txt b/flang/unittests/Decimal/CMakeLists.txt
similarity index 100%
rename from FortranRuntime/unittests/Decimal/CMakeLists.txt
rename to flang/unittests/Decimal/CMakeLists.txt
diff --git a/FortranRuntime/unittests/Decimal/quick-sanity-test.cpp b/flang/unittests/Decimal/quick-sanity-test.cpp
similarity index 92%
rename from FortranRuntime/unittests/Decimal/quick-sanity-test.cpp
rename to flang/unittests/Decimal/quick-sanity-test.cpp
index 0e8ff0ce48b3c6..c36c73b817e1f9 100644
--- a/FortranRuntime/unittests/Decimal/quick-sanity-test.cpp
+++ b/flang/unittests/Decimal/quick-sanity-test.cpp
@@ -1,11 +1,3 @@
-//===-- unittests/Decimal/quick-sanity-test.cpp -----------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
 #include "flang/Common/decimal.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
diff --git a/FortranRuntime/unittests/Decimal/thorough-test.cpp b/flang/unittests/Decimal/thorough-test.cpp
similarity index 86%
rename from FortranRuntime/unittests/Decimal/thorough-test.cpp
rename to flang/unittests/Decimal/thorough-test.cpp
index 0648b61d7c1cda..0f7a2d4b33e764 100644
--- a/FortranRuntime/unittests/Decimal/thorough-test.cpp
+++ b/flang/unittests/Decimal/thorough-test.cpp
@@ -1,11 +1,3 @@
-//===-- unittests/Decimal/thorough-test.cpp ---------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
 #include "flang/Common/decimal.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cinttypes>
diff --git a/flang/unittests/Evaluate/CMakeLists.txt b/flang/unittests/Evaluate/CMakeLists.txt
index 324195348d045b..0cb0fc4dd52531 100644
--- a/flang/unittests/Evaluate/CMakeLists.txt
+++ b/flang/unittests/Evaluate/CMakeLists.txt
@@ -1,7 +1,7 @@
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 add_library(FortranEvaluateTesting
-  ${FORTRANRUNTIME_SOURCE_DIR}/lib/Testing/testing.cpp
-  ${FORTRANRUNTIME_SOURCE_DIR}/lib/Testing/fp-testing.cpp
+  ${FLANG_SOURCE_DIR}/lib/Testing/testing.cpp
+  ${FLANG_SOURCE_DIR}/lib/Testing/fp-testing.cpp
 )
 set_target_properties(FortranEvaluateTesting PROPERTIES FOLDER "Flang/Tests")
 if (LLVM_LINK_LLVM_DYLIB)
diff --git a/flang/unittests/Optimizer/Builder/Runtime/AllocatableTest.cpp b/flang/unittests/Optimizer/Builder/Runtime/AllocatableTest.cpp
index 1db43cacc90f07..f618e72d7b7f3c 100644
--- a/flang/unittests/Optimizer/Builder/Runtime/AllocatableTest.cpp
+++ b/flang/unittests/Optimizer/Builder/Runtime/AllocatableTest.cpp
@@ -9,7 +9,7 @@
 #include "flang/Optimizer/Builder/Runtime/Allocatable.h"
 #include "RuntimeCallTestBase.h"
 #include "gtest/gtest.h"
-#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/descriptor-consts.h"
 
 using namespace Fortran::runtime;
 

>From 83910a4f7e9035152a3a8ed5cf3cc72a7335df36 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 16 Oct 2024 12:08:47 +0200
Subject: [PATCH 19/32] FortranRuntime -> flang-rt

---
 .../test/NonGtestUnit/lit.site.cfg.py.in      | 13 ---
 FortranRuntime/test/Unit/lit.site.cfg.py.in   | 14 ---
 FortranRuntime/test/lit.site.cfg.py.in        | 18 ----
 clang/lib/Driver/ToolChains/CommonArgs.cpp    |  4 +-
 clang/lib/Driver/ToolChains/Flang.cpp         |  8 +-
 {FortranRuntime => flang-rt}/.clang-format    |  0
 {FortranRuntime => flang-rt}/.clang-tidy      |  0
 {FortranRuntime => flang-rt}/CMakeLists.txt   | 82 +++++++++---------
 {FortranRuntime => flang-rt}/CODE_OWNERS.TXT  |  0
 {FortranRuntime => flang-rt}/LICENSE.TXT      |  0
 {FortranRuntime => flang-rt}/README.md        | 62 ++++++-------
 .../cmake/config.h.cmake.in                   |  0
 .../cmake/modules/AddFlangRT.cmake            | 44 +++++-----
 .../cmake/modules/AddFlangRTOffload.cmake     | 24 +++---
 .../include/flang-rt/CufRuntime}/allocator.h  |  8 +-
 .../flang-rt/flang_rt}/allocator-registry.h   |  8 +-
 .../flang-rt/flang_rt}/array-constructor.h    | 10 +--
 .../include/flang-rt/flang_rt}/descriptor.h   | 12 +--
 .../include/flang-rt/flang_rt}/io-api-funcs.h |  8 +-
 .../include/flang-rt/flang_rt}/iostat-funcs.h |  8 +-
 .../include/flang-rt/flang_rt}/memory.h       |  8 +-
 .../include/flang-rt/flang_rt}/type-code.h    |  8 +-
 .../lib/CMakeLists.txt                        | 10 ++-
 .../lib/CufRuntime}/CMakeLists.txt            |  6 +-
 .../lib/CufRuntime}/allocator.cpp             | 18 ++--
 .../lib/CufRuntime}/descriptor.cpp            |  6 +-
 .../lib/FortranFloat128Math}/CMakeLists.txt   |  9 +-
 .../lib/FortranFloat128Math}/acos.cpp         |  2 +-
 .../lib/FortranFloat128Math}/acosh.cpp        |  2 +-
 .../lib/FortranFloat128Math}/asin.cpp         |  2 +-
 .../lib/FortranFloat128Math}/asinh.cpp        |  2 +-
 .../lib/FortranFloat128Math}/atan.cpp         |  2 +-
 .../lib/FortranFloat128Math}/atan2.cpp        |  2 +-
 .../lib/FortranFloat128Math}/atanh.cpp        |  2 +-
 .../lib/FortranFloat128Math}/ceil.cpp         |  2 +-
 .../lib/FortranFloat128Math}/complex-math.c   |  2 +-
 .../lib/FortranFloat128Math}/complex-math.h   |  8 +-
 .../lib/FortranFloat128Math}/cos.cpp          |  2 +-
 .../lib/FortranFloat128Math}/cosh.cpp         |  2 +-
 .../lib/FortranFloat128Math}/erf.cpp          |  2 +-
 .../lib/FortranFloat128Math}/erfc.cpp         |  2 +-
 .../lib/FortranFloat128Math}/exp.cpp          |  2 +-
 .../lib/FortranFloat128Math}/exponent.cpp     |  2 +-
 .../lib/FortranFloat128Math}/floor.cpp        |  2 +-
 .../lib/FortranFloat128Math}/fma.cpp          |  2 +-
 .../lib/FortranFloat128Math}/fraction.cpp     |  2 +-
 .../lib/FortranFloat128Math}/hypot.cpp        |  2 +-
 .../lib/FortranFloat128Math}/j0.cpp           |  2 +-
 .../lib/FortranFloat128Math}/j1.cpp           |  2 +-
 .../lib/FortranFloat128Math}/jn.cpp           |  2 +-
 .../lib/FortranFloat128Math}/lgamma.cpp       |  2 +-
 .../lib/FortranFloat128Math}/llround.cpp      |  2 +-
 .../lib/FortranFloat128Math}/log.cpp          |  2 +-
 .../lib/FortranFloat128Math}/log10.cpp        |  2 +-
 .../lib/FortranFloat128Math}/lround.cpp       |  2 +-
 .../lib/FortranFloat128Math}/math-entries.h   |  8 +-
 .../lib/FortranFloat128Math}/mod-real.cpp     |  2 +-
 .../lib/FortranFloat128Math}/modulo-real.cpp  |  2 +-
 .../lib/FortranFloat128Math}/nearest.cpp      |  2 +-
 .../lib/FortranFloat128Math}/norm2.cpp        |  2 +-
 .../numeric-template-specs.h                  |  8 +-
 .../lib/FortranFloat128Math}/pow.cpp          |  2 +-
 .../lib/FortranFloat128Math}/random.cpp       |  2 +-
 .../lib/FortranFloat128Math}/round.cpp        |  2 +-
 .../lib/FortranFloat128Math}/rrspacing.cpp    |  2 +-
 .../lib/FortranFloat128Math}/scale.cpp        |  2 +-
 .../lib/FortranFloat128Math}/set-exponent.cpp |  2 +-
 .../lib/FortranFloat128Math}/sin.cpp          |  2 +-
 .../lib/FortranFloat128Math}/sinh.cpp         |  2 +-
 .../lib/FortranFloat128Math}/spacing.cpp      |  2 +-
 .../lib/FortranFloat128Math}/sqrt.cpp         |  2 +-
 .../lib/FortranFloat128Math}/tan.cpp          |  2 +-
 .../lib/FortranFloat128Math}/tanh.cpp         |  2 +-
 .../lib/FortranFloat128Math}/tgamma.cpp       |  2 +-
 .../lib/FortranFloat128Math}/trunc.cpp        |  2 +-
 .../lib/FortranFloat128Math}/y0.cpp           |  2 +-
 .../lib/FortranFloat128Math}/y1.cpp           |  2 +-
 .../lib/FortranFloat128Math}/yn.cpp           |  2 +-
 .../lib/Testing/CMakeLists.txt                |  2 +-
 .../lib/flang_rt}/CMakeLists.txt              | 63 +++++++-------
 .../lib/flang_rt}/ISO_Fortran_binding.cpp     |  6 +-
 .../lib/flang_rt}/ISO_Fortran_util.h          | 12 +--
 .../lib/flang_rt}/allocatable.cpp             |  4 +-
 .../lib/flang_rt}/allocator-registry.cpp      |  8 +-
 .../lib/flang_rt}/array-constructor.cpp       |  6 +-
 .../lib/flang_rt}/assign-impl.h               |  0
 .../lib/flang_rt}/assign.cpp                  |  4 +-
 .../lib/flang_rt}/buffer.cpp                  |  2 +-
 .../lib/flang_rt}/buffer.h                    | 10 +--
 .../lib/flang_rt}/character.cpp               |  4 +-
 .../lib/flang_rt}/command.cpp                 |  4 +-
 .../lib/flang_rt}/complex-powi.cpp            |  2 +-
 .../lib/flang_rt}/complex-reduction.c         |  2 +-
 .../lib/flang_rt}/complex-reduction.h         |  8 +-
 .../lib/flang_rt}/connection.cpp              |  2 +-
 .../lib/flang_rt}/connection.h                |  8 +-
 .../lib/flang_rt}/copy.cpp                    |  4 +-
 .../Runtime => flang-rt/lib/flang_rt}/copy.h  | 10 +--
 .../lib/flang_rt}/derived-api.cpp             |  4 +-
 .../lib/flang_rt}/derived.cpp                 |  4 +-
 .../lib/flang_rt}/derived.h                   |  8 +-
 .../lib/flang_rt}/descriptor-io.cpp           |  2 +-
 .../lib/flang_rt}/descriptor-io.h             | 10 +--
 .../lib/flang_rt}/descriptor.cpp              |  6 +-
 .../lib/flang_rt}/dot-product.cpp             |  4 +-
 .../lib/flang_rt}/edit-input.cpp              |  2 +-
 .../lib/flang_rt}/edit-input.h                |  8 +-
 .../lib/flang_rt}/edit-output.cpp             |  2 +-
 .../lib/flang_rt}/edit-output.h               |  8 +-
 .../lib/flang_rt}/emit-encoded.h              |  8 +-
 .../lib/flang_rt}/environment-default-list.h  |  0
 .../lib/flang_rt}/environment.cpp             |  6 +-
 .../lib/flang_rt}/environment.h               |  8 +-
 .../lib/flang_rt}/exceptions.cpp              |  2 +-
 .../lib/flang_rt}/execute.cpp                 |  4 +-
 .../lib/flang_rt}/extensions.cpp              |  6 +-
 .../lib/flang_rt}/external-unit.cpp           |  2 +-
 .../lib/flang_rt}/extrema.cpp                 |  2 +-
 .../lib/flang_rt}/file.cpp                    |  4 +-
 .../Runtime => flang-rt/lib/flang_rt}/file.h  | 10 +--
 .../lib/flang_rt}/findloc.cpp                 |  2 +-
 .../lib/flang_rt}/format-implementation.h     |  8 +-
 .../lib/flang_rt}/format.cpp                  |  2 +-
 .../lib/flang_rt}/format.h                    |  8 +-
 .../lib/flang_rt}/inquiry.cpp                 |  4 +-
 .../lib/flang_rt}/internal-unit.cpp           |  4 +-
 .../lib/flang_rt}/internal-unit.h             | 10 +--
 .../lib/flang_rt}/io-api-common.h             | 10 +--
 .../lib/flang_rt}/io-api-minimal.cpp          |  4 +-
 .../lib/flang_rt}/io-api.cpp                  |  8 +-
 .../lib/flang_rt}/io-error.cpp                |  2 +-
 .../lib/flang_rt}/io-error.h                  | 12 +--
 .../lib/flang_rt}/io-stmt.cpp                 |  4 +-
 .../lib/flang_rt}/io-stmt.h                   | 12 +--
 .../lib/flang_rt}/iostat.cpp                  |  4 +-
 .../Runtime => flang-rt/lib/flang_rt}/lock.h  |  8 +-
 .../lib/flang_rt}/main.cpp                    |  2 +-
 .../lib/flang_rt}/matmul-transpose.cpp        |  4 +-
 .../lib/flang_rt}/matmul.cpp                  |  4 +-
 .../lib/flang_rt}/memory.cpp                  |  4 +-
 .../lib/flang_rt}/misc-intrinsic.cpp          |  4 +-
 .../lib/flang_rt}/namelist.cpp                |  4 +-
 .../lib/flang_rt}/namelist.h                  |  8 +-
 .../lib/flang_rt}/non-tbp-dio.cpp             |  2 +-
 .../lib/flang_rt}/non-tbp-dio.h               |  8 +-
 .../lib/flang_rt}/numeric-templates.h         |  8 +-
 .../lib/flang_rt}/numeric.cpp                 |  2 +-
 .../lib/flang_rt}/pointer.cpp                 |  2 +-
 .../lib/flang_rt}/product.cpp                 |  2 +-
 .../lib/flang_rt}/pseudo-unit.cpp             |  2 +-
 .../lib/flang_rt}/ragged.cpp                  |  2 +-
 .../lib/flang_rt}/random-templates.h          | 10 +--
 .../lib/flang_rt}/random.cpp                  |  4 +-
 .../lib/flang_rt}/reduce.cpp                  |  4 +-
 .../lib/flang_rt}/reduction-templates.h       | 10 +--
 .../lib/flang_rt}/reduction.cpp               |  4 +-
 .../Runtime => flang-rt/lib/flang_rt}/stack.h | 10 +--
 .../lib/flang_rt}/stat.cpp                    |  4 +-
 .../Runtime => flang-rt/lib/flang_rt}/stat.h  |  8 +-
 .../lib/flang_rt}/stop.cpp                    |  2 +-
 .../Runtime => flang-rt/lib/flang_rt}/sum.cpp |  2 +-
 .../lib/flang_rt}/support.cpp                 |  4 +-
 .../lib/flang_rt}/temporary-stack.cpp         |  6 +-
 .../lib/flang_rt}/terminator.cpp              |  2 +-
 .../lib/flang_rt}/terminator.h                |  8 +-
 .../lib/flang_rt}/time-intrinsic.cpp          |  6 +-
 .../lib/flang_rt}/tools.cpp                   |  2 +-
 .../Runtime => flang-rt/lib/flang_rt}/tools.h | 12 +--
 .../lib/flang_rt}/transformational.cpp        |  4 +-
 .../lib/flang_rt}/type-code.cpp               |  4 +-
 .../lib/flang_rt}/type-info.cpp               |  2 +-
 .../lib/flang_rt}/type-info.h                 | 10 +--
 .../lib/flang_rt}/unit-map.cpp                |  2 +-
 .../lib/flang_rt}/unit-map.h                  | 10 +--
 .../lib/flang_rt}/unit.cpp                    |  6 +-
 .../Runtime => flang-rt/lib/flang_rt}/unit.h  | 10 +--
 .../Runtime => flang-rt/lib/flang_rt}/utf.cpp |  6 +-
 .../Runtime => flang-rt/lib/flang_rt}/utf.h   |  8 +-
 .../test/CMakeLists.txt                       | 32 +++----
 .../test/Driver/ctofortran.f90                |  0
 .../test/Driver/exec.f90                      |  0
 .../test/NonGtestUnit/lit.cfg.py              |  6 +-
 flang-rt/test/NonGtestUnit/lit.site.cfg.py.in | 14 +++
 .../test/Runtime/no-cpp-dep.c                 |  6 +-
 .../test/Unit/lit.cfg.py                      |  6 +-
 flang-rt/test/Unit/lit.site.cfg.py.in         | 15 ++++
 {FortranRuntime => flang-rt}/test/lit.cfg.py  |  8 +-
 flang-rt/test/lit.site.cfg.py.in              | 17 ++++
 .../unittests/CMakeLists.txt                  | 26 +++---
 .../unittests/Evaluate/CMakeLists.txt         |  8 +-
 .../Evaluate/ISO-Fortran-binding.cpp          |  2 +-
 .../unittests/Evaluate/reshape.cpp            |  2 +-
 .../unittests/Runtime/AccessTest.cpp          |  0
 .../unittests/Runtime/Allocatable.cpp         |  0
 .../unittests/Runtime/ArrayConstructor.cpp    |  6 +-
 .../unittests/Runtime/BufferTest.cpp          |  2 +-
 .../unittests/Runtime/CMakeLists.txt          |  6 +-
 .../unittests/Runtime/CUDA/AllocatorCUF.cpp   | 14 +--
 .../unittests/Runtime/CUDA/CMakeLists.txt     |  4 +-
 .../unittests/Runtime/CharacterTest.cpp       |  2 +-
 .../unittests/Runtime/CommandTest.cpp         |  2 +-
 .../unittests/Runtime/Complex.cpp             |  0
 .../unittests/Runtime/CrashHandlerFixture.cpp |  2 +-
 .../unittests/Runtime/CrashHandlerFixture.h   |  0
 .../unittests/Runtime/Derived.cpp             |  2 +-
 .../unittests/Runtime/ExternalIOTest.cpp      |  4 +-
 .../unittests/Runtime/Format.cpp              |  6 +-
 .../unittests/Runtime/Inquiry.cpp             |  2 +-
 .../unittests/Runtime/ListInputTest.cpp       |  6 +-
 .../unittests/Runtime/LogicalFormatTest.cpp   |  4 +-
 .../unittests/Runtime/Matmul.cpp              |  4 +-
 .../unittests/Runtime/MatmulTranspose.cpp     |  4 +-
 .../unittests/Runtime/MiscIntrinsic.cpp       |  2 +-
 .../unittests/Runtime/Namelist.cpp            |  6 +-
 .../unittests/Runtime/Numeric.cpp             |  0
 .../unittests/Runtime/NumericalFormatTest.cpp |  4 +-
 .../unittests/Runtime/Pointer.cpp             |  2 +-
 .../unittests/Runtime/Ragged.cpp              |  0
 .../unittests/Runtime/Random.cpp              |  4 +-
 .../unittests/Runtime/Reduction.cpp           |  4 +-
 .../unittests/Runtime/RuntimeCrashTest.cpp    |  2 +-
 .../unittests/Runtime/Stop.cpp                |  2 +-
 .../unittests/Runtime/Support.cpp             |  2 +-
 .../unittests/Runtime/TemporaryStack.cpp      |  4 +-
 .../unittests/Runtime/Time.cpp                |  0
 .../unittests/Runtime/Transformational.cpp    |  2 +-
 .../unittests/Runtime/tools.h                 |  4 +-
 flang/CMakeLists.txt                          |  7 +-
 .../cmake/modules/FlangCommon.cmake           | 86 +++++++++----------
 flang/docs/FlangDriver.md                     |  8 +-
 flang/docs/GettingStarted.md                  | 34 ++++----
 flang/docs/OpenACC-descriptor-management.md   |  2 +-
 flang/docs/ReleaseNotes.md                    | 13 +--
 .../ExternalHelloWorld/CMakeLists.txt         |  2 +-
 flang/include/flang/Common/README.md          |  6 +-
 flang/include/flang/ISO_Fortran_binding.h     | 16 +++-
 flang/include/flang/Runtime/README.md         |  4 +-
 flang/include/flang/Testing/README.md         |  6 +-
 flang/lib/Common/README.md                    |  6 +-
 flang/lib/Optimizer/Builder/IntrinsicCall.cpp |  2 +-
 .../Optimizer/Transforms/CufOpConversion.cpp  |  2 +-
 flang/lib/Testing/CMakeLists.txt              | 20 -----
 flang/lib/Testing/README.md                   |  6 +-
 .../module}/iso_fortran_env_impl.f90          |  4 +-
 .../test/Driver/gcc-toolchain-install-dir.f90 |  2 +-
 flang/test/Driver/linker-flags.f90            |  8 +-
 .../test/Driver/msvc-dependent-lib-flags.f90  |  8 +-
 flang/tools/f18/CMakeLists.txt                | 24 ++----
 flang/unittests/Common/CMakeLists.txt         |  4 +-
 flang/unittests/Decimal/CMakeLists.txt        |  8 +-
 lld/COFF/MinGW.cpp                            | 10 +--
 llvm/CMakeLists.txt                           |  2 +-
 llvm/projects/CMakeLists.txt                  |  4 +-
 llvm/runtimes/CMakeLists.txt                  |  6 +-
 runtimes/CMakeLists.txt                       |  4 +-
 255 files changed, 815 insertions(+), 838 deletions(-)
 delete mode 100644 FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
 delete mode 100644 FortranRuntime/test/Unit/lit.site.cfg.py.in
 delete mode 100644 FortranRuntime/test/lit.site.cfg.py.in
 rename {FortranRuntime => flang-rt}/.clang-format (100%)
 rename {FortranRuntime => flang-rt}/.clang-tidy (100%)
 rename {FortranRuntime => flang-rt}/CMakeLists.txt (54%)
 rename {FortranRuntime => flang-rt}/CODE_OWNERS.TXT (100%)
 rename {FortranRuntime => flang-rt}/LICENSE.TXT (100%)
 rename {FortranRuntime => flang-rt}/README.md (76%)
 rename {FortranRuntime => flang-rt}/cmake/config.h.cmake.in (100%)
 rename FortranRuntime/cmake/modules/AddFortranRuntime.cmake => flang-rt/cmake/modules/AddFlangRT.cmake (72%)
 rename FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake => flang-rt/cmake/modules/AddFlangRTOffload.cmake (82%)
 rename {flang/include/flang/Runtime/CUDA => flang-rt/include/flang-rt/CufRuntime}/allocator.h (85%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/allocator-registry.h (87%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/array-constructor.h (85%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/descriptor.h (98%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/io-api-funcs.h (84%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/iostat-funcs.h (75%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/memory.h (96%)
 rename {FortranRuntime/include/FortranRuntime/Runtime => flang-rt/include/flang-rt/flang_rt}/type-code.h (93%)
 rename {FortranRuntime => flang-rt}/lib/CMakeLists.txt (71%)
 rename {FortranRuntime/lib/Runtime/CUDA => flang-rt/lib/CufRuntime}/CMakeLists.txt (87%)
 rename {FortranRuntime/lib/Runtime/CUDA => flang-rt/lib/CufRuntime}/allocator.cpp (81%)
 rename {FortranRuntime/lib/Runtime/CUDA => flang-rt/lib/CufRuntime}/descriptor.cpp (82%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/CMakeLists.txt (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/acos.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/acosh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/asin.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/asinh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/atan.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/atan2.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/atanh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/ceil.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/complex-math.c (96%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/complex-math.h (88%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/cos.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/cosh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/erf.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/erfc.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/exp.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/exponent.cpp (92%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/floor.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/fma.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/fraction.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/hypot.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/j0.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/j1.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/jn.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/lgamma.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/llround.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/log.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/log10.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/lround.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/math-entries.h (97%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/mod-real.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/modulo-real.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/nearest.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/norm2.cpp (94%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/numeric-template-specs.h (84%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/pow.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/random.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/round.cpp (92%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/rrspacing.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/scale.cpp (92%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/set-exponent.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/sin.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/sinh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/spacing.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/sqrt.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/tan.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/tanh.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/tgamma.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/trunc.cpp (91%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/y0.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/y1.cpp (90%)
 rename {FortranRuntime/lib/Runtime/Float128Math => flang-rt/lib/FortranFloat128Math}/yn.cpp (90%)
 rename {FortranRuntime => flang-rt}/lib/Testing/CMakeLists.txt (89%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/CMakeLists.txt (66%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/ISO_Fortran_binding.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/ISO_Fortran_util.h (91%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/allocatable.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/allocator-registry.cpp (85%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/array-constructor.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/assign-impl.h (100%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/assign.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/buffer.cpp (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/buffer.h (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/character.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/command.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/complex-powi.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/complex-reduction.c (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/complex-reduction.h (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/connection.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/connection.h (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/copy.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/copy.h (78%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/derived-api.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/derived.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/derived.h (88%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/descriptor-io.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/descriptor-io.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/descriptor.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/dot-product.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/edit-input.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/edit-input.h (90%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/edit-output.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/edit-output.h (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/emit-encoded.h (94%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/environment-default-list.h (100%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/environment.cpp (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/environment.h (91%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/exceptions.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/execute.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/extensions.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/external-unit.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/extrema.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/file.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/file.h (94%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/findloc.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/format-implementation.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/format.cpp (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/format.h (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/inquiry.cpp (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/internal-unit.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/internal-unit.h (89%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-api-common.h (92%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-api-minimal.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-api.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-error.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-error.h (90%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-stmt.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/io-stmt.h (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/iostat.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/lock.h (94%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/main.cpp (95%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/matmul-transpose.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/matmul.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/memory.cpp (92%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/misc-intrinsic.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/namelist.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/namelist.h (91%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/non-tbp-dio.cpp (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/non-tbp-dio.h (91%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/numeric-templates.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/numeric.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/pointer.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/product.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/pseudo-unit.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/ragged.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/random-templates.h (91%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/random.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/reduce.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/reduction-templates.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/reduction.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/stack.h (94%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/stat.cpp (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/stat.h (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/stop.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/sum.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/support.cpp (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/temporary-stack.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/terminator.cpp (97%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/terminator.h (95%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/time-intrinsic.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/tools.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/tools.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/transformational.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/type-code.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/type-info.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/type-info.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/unit-map.cpp (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/unit-map.h (93%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/unit.cpp (99%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/unit.h (98%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/utf.cpp (96%)
 rename {FortranRuntime/lib/Runtime => flang-rt/lib/flang_rt}/utf.h (94%)
 rename {FortranRuntime => flang-rt}/test/CMakeLists.txt (57%)
 rename {FortranRuntime => flang-rt}/test/Driver/ctofortran.f90 (100%)
 rename {FortranRuntime => flang-rt}/test/Driver/exec.f90 (100%)
 rename {FortranRuntime => flang-rt}/test/NonGtestUnit/lit.cfg.py (75%)
 create mode 100644 flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
 rename {FortranRuntime => flang-rt}/test/Runtime/no-cpp-dep.c (87%)
 rename {FortranRuntime => flang-rt}/test/Unit/lit.cfg.py (73%)
 create mode 100644 flang-rt/test/Unit/lit.site.cfg.py.in
 rename {FortranRuntime => flang-rt}/test/lit.cfg.py (89%)
 create mode 100644 flang-rt/test/lit.site.cfg.py.in
 rename {FortranRuntime => flang-rt}/unittests/CMakeLists.txt (72%)
 rename {FortranRuntime => flang-rt}/unittests/Evaluate/CMakeLists.txt (73%)
 rename {FortranRuntime => flang-rt}/unittests/Evaluate/ISO-Fortran-binding.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Evaluate/reshape.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/AccessTest.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Allocatable.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/ArrayConstructor.cpp (97%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/BufferTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CMakeLists.txt (90%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CUDA/AllocatorCUF.cpp (90%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CUDA/CMakeLists.txt (89%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CharacterTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CommandTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Complex.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CrashHandlerFixture.cpp (96%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/CrashHandlerFixture.h (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Derived.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/ExternalIOTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Format.cpp (97%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Inquiry.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/ListInputTest.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/LogicalFormatTest.cpp (95%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Matmul.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/MatmulTranspose.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/MiscIntrinsic.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Namelist.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Numeric.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/NumericalFormatTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Pointer.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Ragged.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Random.cpp (95%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Reduction.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/RuntimeCrashTest.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Stop.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Support.cpp (98%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/TemporaryStack.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Time.cpp (100%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/Transformational.cpp (99%)
 rename {FortranRuntime => flang-rt}/unittests/Runtime/tools.h (95%)
 rename {FortranRuntime => flang}/cmake/modules/FlangCommon.cmake (93%)
 delete mode 100644 flang/lib/Testing/CMakeLists.txt
 rename {FortranRuntime/lib/Runtime => flang/module}/iso_fortran_env_impl.f90 (97%)

diff --git a/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in b/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
deleted file mode 100644
index 3d1780a5d600a9..00000000000000
--- a/FortranRuntime/test/NonGtestUnit/lit.site.cfg.py.in
+++ /dev/null
@@ -1,13 +0,0 @@
- at LIT_SITE_CFG_IN_HEADER@
-
-import os
-
-config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
-config.fortranruntime_binary_dir = "@FORTRANRUNTIME_BINARY_DIR@"
-config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
-
-import lit.llvm
-lit.llvm.initialize(lit_config, config)
-
-# Let the main config do the real work.
-lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/NonGtestUnit/lit.cfg.py")
diff --git a/FortranRuntime/test/Unit/lit.site.cfg.py.in b/FortranRuntime/test/Unit/lit.site.cfg.py.in
deleted file mode 100644
index fa993aa897faca..00000000000000
--- a/FortranRuntime/test/Unit/lit.site.cfg.py.in
+++ /dev/null
@@ -1,14 +0,0 @@
- at LIT_SITE_CFG_IN_HEADER@
-
-import os
-
-config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
-config.llvm_build_mode = "@LLVM_BUILD_MODE@"
-config.fortranruntime_binary_dir = "@FORTRANRUNTIME_BINARY_DIR@"
-config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
-
-import lit.llvm
-lit.llvm.initialize(lit_config, config)
-
-# Let the main config do the real work.
-lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/Unit/lit.cfg.py")
diff --git a/FortranRuntime/test/lit.site.cfg.py.in b/FortranRuntime/test/lit.site.cfg.py.in
deleted file mode 100644
index a21fc128086eae..00000000000000
--- a/FortranRuntime/test/lit.site.cfg.py.in
+++ /dev/null
@@ -1,18 +0,0 @@
- at LIT_SITE_CFG_IN_HEADER@
-
-import sys
-
-config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
-config.build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
-config.flang_source_dir = "@FLANG_SOURCE_DIR@"
-config.fortranruntime_source_dir = "@FORTRANRUNTIME_SOURCE_DIR@"
-config.fortranruntime_binary_test_dir = os.path.dirname(__file__)
-config.fortranruntime_build_lib_dir = "@FORTRANRUNTIME_BUILD_LIB_DIR@"
-config.cc = "@CMAKE_C_COMPILER@"
-config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
-
-import lit.llvm
-lit.llvm.initialize(lit_config, config)
-
-# Let the main config do the real work.
-lit_config.load_config(config, "@FORTRANRUNTIME_SOURCE_DIR@/test/lit.cfg.py")
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5e4057116a97cb..ed2539cb4e3c5e 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1291,7 +1291,7 @@ void tools::addOpenMPHostOffloadingArgs(const Compilation &C,
 /// Add Fortran runtime libs
 void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
                                   llvm::opt::ArgStringList &CmdArgs) {
-  // Link FortranRuntime
+  // Link flang_rt
   // These are handled earlier on Windows by telling the frontend driver to
   // add the correct libraries to link against as dependents in the object
   // file.
@@ -1307,7 +1307,7 @@ void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
       if (AsNeeded)
         addAsNeededOption(TC, Args, CmdArgs, /*as_needed=*/false);
     }
-    CmdArgs.push_back("-lFortranRuntime");
+    CmdArgs.push_back("-lflang_rt");
   }
 }
 
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index aff656d74daa2f..072d57e8a7ff46 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -304,26 +304,26 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
   case options::OPT__SLASH_MT:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("--dependent-lib=libcmt");
-    CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
+    CmdArgs.push_back("--dependent-lib=flang_rt.static.lib");
     break;
   case options::OPT__SLASH_MTd:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("-D_DEBUG");
     CmdArgs.push_back("--dependent-lib=libcmtd");
-    CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=flang_rt.static_dbg.lib");
     break;
   case options::OPT__SLASH_MD:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("-D_DLL");
     CmdArgs.push_back("--dependent-lib=msvcrt");
-    CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
+    CmdArgs.push_back("--dependent-lib=flang_rt.dynamic.lib");
     break;
   case options::OPT__SLASH_MDd:
     CmdArgs.push_back("-D_MT");
     CmdArgs.push_back("-D_DEBUG");
     CmdArgs.push_back("-D_DLL");
     CmdArgs.push_back("--dependent-lib=msvcrtd");
-    CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=flang_rt.dynamic_dbg.lib");
     break;
   }
 }
diff --git a/FortranRuntime/.clang-format b/flang-rt/.clang-format
similarity index 100%
rename from FortranRuntime/.clang-format
rename to flang-rt/.clang-format
diff --git a/FortranRuntime/.clang-tidy b/flang-rt/.clang-tidy
similarity index 100%
rename from FortranRuntime/.clang-tidy
rename to flang-rt/.clang-tidy
diff --git a/FortranRuntime/CMakeLists.txt b/flang-rt/CMakeLists.txt
similarity index 54%
rename from FortranRuntime/CMakeLists.txt
rename to flang-rt/CMakeLists.txt
index e65cab7060cb02..bd83a51482f4af 100644
--- a/FortranRuntime/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -6,23 +6,23 @@
 #
 #===------------------------------------------------------------------------===#
 #
-# Build instructions for the FortranRuntime library and Fortran modules required
-# by programs compiled by Flang. This is file is intended to be included using
-# the LLVM_ENABLE_RUNTIMES mechanism.
+# Build instructions for the flang-rt library. This is file is intended to be
+# included using the LLVM_ENABLE_RUNTIMES mechanism.
 #
 #===------------------------------------------------------------------------===#
 
 set(LLVM_SUBPROJECT_TITLE "Fortran Runtime")
-set(FORTRANRUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
-set(FORTRANRUNTIME_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+set(FLANGRT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(FLANGRT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang")
 
 enable_language(Fortran)
 
 list(APPEND CMAKE_MODULE_PATH
-  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
+    "${FLANGRT_SOURCE_DIR}/cmake/modules"
+    "${FLANG_SOURCE_DIR}/cmake/modules"
   )
-include(AddFortranRuntime)
+include(AddFlangRT)
 include(FlangCommon)
 
 
@@ -30,7 +30,7 @@ include(FlangCommon)
 # Build Mode Introspection #
 ############################
 
-# Setting these variables from an LLVM build is sufficient that FortranRuntime can
+# Setting these variables from an LLVM build is sufficient that flang-rt can
 # construct the output paths, so it can behave as if it were in-tree here.
 set(LLVM_TREE_AVAILABLE OFF)
 if (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSION)
@@ -42,19 +42,19 @@ if (LLVM_TREE_AVAILABLE)
   # Despite Clang in the name, get_clang_resource_dir does not depend on Clang being added to the build
   # flang-new uses the same resource dir as clang.
   include(GetClangResourceDir)
-  get_clang_resource_dir(FORTRANRUNTIME_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
-  get_clang_resource_dir(FORTRANRUNTIME_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command find the install prefix itself
+  get_clang_resource_dir(FLANGRT_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
+  get_clang_resource_dir(FLANGRT_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command find the install prefix itself
 else ()
-  set(FORTRANRUNTIME_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
-  set(FORTRANRUNTIME_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
+  set(FLANGRT_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
+  set(FLANGRT_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
 endif ()
 
 if (DEFINED WIN32)
-  set(FORTRANRUNTIME_BUILD_LIB_DIR "${FORTRANRUNTIME_BUILD_LIB_DIR}/windows")
-  set(FORTRANRUNTIME_INSTALL_LIB_DIR "${FORTRANRUNTIME_INSTALL_LIB_DIR}/windows")
+  set(FLANGRT_BUILD_LIB_DIR "${FLANGRT_BUILD_LIB_DIR}/windows")
+  set(FLANGRT_INSTALL_LIB_DIR "${FLANGRT_INSTALL_LIB_DIR}/windows")
 elseif (LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
-  set(FORTRANRUNTIME_BUILD_LIB_DIR "${FORTRANRUNTIME_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
-  set(FORTRANRUNTIME_INSTALL_LIB_DIR "${FORTRANRUNTIME_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+  set(FLANGRT_BUILD_LIB_DIR "${FLANGRT_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+  set(FLANGRT_INSTALL_LIB_DIR "${FLANGRT_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
 endif ()
 
 
@@ -62,26 +62,30 @@ endif ()
 # Build Options #
 #################
 
-option(FORTRANRUNTIME_INCLUDE_TESTS "Generate build targets for the FortranRuntime unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
-
-set(FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile FortranRuntime with GPU support (CUDA or OpenMP)")
-set_property(CACHE FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
-  ""
-  CUDA
-  OpenMP)
-if (NOT FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT)
-elseif (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
-  set(FORTRANRUNTIME_LIBCUDACXX_PATH "" CACHE PATH "Path to libcu++ package installation")
-  option(FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS "Do not compile global variables' definitions when producing PTX library" OFF)
-elseif (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
-set(FORTRANRUNTIME_DEVICE_ARCHITECTURES "all" CACHE STRING
+# Important: flang-rt user options must be prefixed with "FLANG_RT_". Variables
+# with this prefix will be forwarded in bootstrap builds.
+
+option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
+
+set(FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile flang-rt with GPU support (CUDA or OpenMP)")
+set_property(CACHE FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
+    ""
+    CUDA
+    OpenMP
+  )
+if (NOT FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT)
+elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+  set(FLANG_RT_LIBCUDACXX_PATH "" CACHE PATH "Path to libcu++ package installation")
+  option(FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS "Do not compile global variables' definitions when producing PTX library" OFF)
+elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+set(FLANG_RT_DEVICE_ARCHITECTURES "all" CACHE STRING
   "List of OpenMP device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')")
 else ()
-  message(FATAL_ERROR "Invalid value '${FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
+  message(FATAL_ERROR "Invalid value '${FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
 endif ()
 
-option(FORTRANRUNTIME_ENABLE_CUF "Compile CUDA Fortran runtime sources" OFF)
-if (FORTRANRUNTIME_ENABLE_CUF)
+option(FLANG_RT_ENABLE_CUF "Compile CUDA Fortran runtime sources" OFF)
+if (FLANG_RT_ENABLE_CUF)
   find_package(CUDAToolkit REQUIRED)
 endif()
 
@@ -113,9 +117,9 @@ if (WIN32)
       ERROR_QUIET
     )
   if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
-    string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FORTRANRUNTIME_LIBCALL)
+    string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FLANGRT_LIBCALL)
   else ()
-    set(FORTRANRUNTIME_LIBCALL "")
+    set(FLANGRT_LIBCALL "")
   endif ()
 endif ()
 
@@ -124,9 +128,9 @@ endif ()
 # Build Preparation #
 #####################
 
-if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT AND FORTRANRUNTIME_INCLUDE_TESTS)
+if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT AND FLANG_RT_INCLUDE_TESTS)
   # If Fortran runtime is built as CUDA library, the linking
-  # of targets that link FortranRuntime must be done
+  # of targets that link flang-rt must be done
   # with CUDA_RESOLVE_DEVICE_SYMBOLS.
   # CUDA language must be enabled for CUDA_RESOLVE_DEVICE_SYMBOLS
   # to take effect.
@@ -134,7 +138,7 @@ if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT AND FORTRANRUNTIME_INCLUDE_TESTS
 endif()
 
 
-# C++17 required for FortranRuntime, user or other runtimes may override this.
+# C++17 is required for flang-rt; user or other runtimes may override this.
 # GTest included later also requires C++17.
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
 set(CMAKE_CXX_STANDARD_REQUIRED YES)
@@ -153,9 +157,9 @@ configure_file(cmake/config.h.cmake.in config.h)
 
 add_subdirectory(lib)
 
-if (FORTRANRUNTIME_INCLUDE_TESTS)
+if (FLANG_RT_INCLUDE_TESTS)
   add_subdirectory(unittests)
   add_subdirectory(test)
 else ()
-  add_custom_target(check-FortranRuntime)
+  add_custom_target(check-flang-rt)
 endif()
diff --git a/FortranRuntime/CODE_OWNERS.TXT b/flang-rt/CODE_OWNERS.TXT
similarity index 100%
rename from FortranRuntime/CODE_OWNERS.TXT
rename to flang-rt/CODE_OWNERS.TXT
diff --git a/FortranRuntime/LICENSE.TXT b/flang-rt/LICENSE.TXT
similarity index 100%
rename from FortranRuntime/LICENSE.TXT
rename to flang-rt/LICENSE.TXT
diff --git a/FortranRuntime/README.md b/flang-rt/README.md
similarity index 76%
rename from FortranRuntime/README.md
rename to flang-rt/README.md
index cb578507f8c96e..01836f9d8f714d 100644
--- a/FortranRuntime/README.md
+++ b/flang-rt/README.md
@@ -6,15 +6,15 @@
 
 -->
 
-# Fortran Runtime
+# Fortran Runtime (flang-rt)
 
-Fortran Runtime is the runtime library for code emitted by the Flang compiler
+Flang-rt is the runtime library for code emitted by the Flang compiler
 (https://flang.llvm.org).
 
 
 ## Getting Started
 
-There are two build modes for the FortranRuntime. The bootstrap build, also
+There are two build modes for the flang-rt. The bootstrap build, also
 called the in-tree build, and the runtime-only build, also called the
 out-of-tree build.
 Not to be confused with the terms
@@ -29,29 +29,29 @@ source directory. LLVM does not support in-source builds.
 
 Requirements:
   * [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements).
-  * While for LLVM C++14 suffices, Flang and FortranRuntime require a
+  * While for LLVM C++14 suffices, Flang and flang-rt require a
     C++17-capable C++ compiler.
 
 
 ### Bootstrap/In-Tree Build
 
 The bootstrap build will first build Clang and Flang, then use these compilers
-to compile the FortranRuntime. CMake will create a secondary build tree in
+to compile flang-rt. CMake will create a secondary build tree in
 configured with these just-built compilers. The secondary build will reuse the
 same build options (Flags, Debug/Release, ...) as the primary build. It will
-also ensure that once built, the FortranRuntime is found by Flang from either
-the build- or install-prefix. To enable, add `FortranRuntime` to
+also ensure that once built, flang-rt is found by Flang from either
+the build- or install-prefix. To enable, add `flang-rt` to
 `LLVM_ENABLE_RUNTIMES`:
 
 ```bash
 cmake -S <path-to-llvm-project>/llvm    \
   -DNinja                               \
   -DLLVM_ENABLE_PROJECTS=flang          \
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
+  -DLLVM_ENABLE_RUNTIMES=flang-rt \
   ...
 ```
 
-It is recommended to enable building OpenMP alongside Flang and FortranRuntime
+It is recommended to enable building OpenMP alongside Flang and flang-rt
 as well. This will build `omp_lib.mod` required to use OpenMP from Fortran.
 Building Compiler-RT may also be required, particularly on platforms that do
 not provide all C-ABI functionality (such as Windows).
@@ -61,7 +61,7 @@ cmake -S <path-to-llvm-project>/llvm                  \
   -DNinja                                             \
   -DCMAKE_BUILD_TYPE=Release                          \
   -DLLVM_ENABLE_PROJECTS="flang;openmp"               \
-  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime" \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;flang-rt" \
   ...
 ```
 
@@ -74,8 +74,8 @@ cross-compilation via `flang-new --target=<target-triple>`, add more triples to
 After configuration, build, test, and install the runtime(s) via
 
 ```shell
-$ ninja FortranRuntime
-$ ninja check-FortranRuntime
+$ ninja flang-rt
+$ ninja check-flang-rt
 $ ninja install
 ```
 
@@ -87,7 +87,7 @@ CMake's environment introspection to find a C, C++, and Fortran compiler. The
 compiler to be used can be controlled using CMake's standard mechanisms such as
 `CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`.
 `CMAKE_Fortran_COMPILER` must be `flang-new` built from the same Git commit as
-FortranRuntime to ensure they are using the same ABI. The C and C++ compiler
+flang-rt to ensure they are using the same ABI. The C and C++ compiler
 can be any compiler supporting the same ABI.
 
 In addition to the compiler, the build be able to find LLVM development tools
@@ -100,13 +100,13 @@ cmake -S <path-to-llvm-project>/runtimes                         \
   -GNinja                                                        \
   -DLLVM_BINARY_DIR=<path-to-llvm-builddir>                      \
   -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir>/bin/flang-new \
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime                          \
+  -DLLVM_ENABLE_RUNTIMES=flang-rt                                \
   ...
 ```
 
-Building the FortranRuntime for cross-compilation triple, the target triple can
+Building flang-rt for cross-compilation triple, the target triple can
 be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`.
-Of course, FortranRuntime can be built multiple times with different build
+Of course, flang-rt can be built multiple times with different build
 configurations, but have to be located manually when using with the Flang
 driver using the `-L` option.
 
@@ -117,7 +117,7 @@ cmake -S <path-to-llvm-project>/runtimes
   -GNinja                                                                         \
   -DCMAKE_BUILD_TYPE=Release                                                      \
   -DCMAKE_INSTALL_PREFIX="${HOME}/local"                                          \
-  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime"                             \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;flang-rt"                                   \
   -DCMAKE_C_COMPILER=gcc                                                          \
   -DCMAKE_CXX_COMPILER=g++                                                        \
   -DLLVM_BINARY_DIR=<path-to-llvm-builddir>                                       \
@@ -131,13 +131,13 @@ cmake -S <path-to-llvm-project>/runtimes
 
 ## Configuration Option Reference
 
-The FortranRuntime has the followign configuration options. This is in
+Flang-rt has the followign configuration options. This is in
 addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and
 CMake itself provide.
 
- * `FORTRANRUNTIME_INCLUDE_TESTS` (boolean; default: `ON`)
+ * `FLANG_RT_INCLUDE_TESTS` (boolean; default: `ON`)
 
-   When `OFF`, does not add any tests and unittests. The `check-FortranRuntime`
+   When `OFF`, does not add any tests and unittests. The `check-flang-rt`
    build target will do nothing.
 
  * `FLANG_RUNTIME_F128_MATH_LIB` (default: `""`)
@@ -148,20 +148,20 @@ CMake itself provide.
    the compiler for `__float128` or 128-bit `long double` support.
    [More details](docs/Real16MathSupport.md).
 
- * `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`)
+ * `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`)
 
-   When set to `CUDA`, builds a FortranRuntime with experimental support for GPU
+   When set to `CUDA`, builds flang-rt with experimental support for GPU
    accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not
    automatically detected by CMake. `nvcc` as well as `clang` are supported.
 
-   When set to `OpenMP`, builds a FortranRuntime with experimental support for
+   When set to `OpenMP`, builds flang-rt with experimental support for
    GPU accelerators using OpenMP offloading. Only Clang is supported for
    `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`.
 
- * `FORTRANRUNTIME_ENABLE_CUF` (bool, default: `OFF`)
+ * `FLANG_RT_ENABLE_CUF` (bool, default: `OFF`)
 
    Compiles the `libCufRuntime_cuda_<CUDA-version>.a/.so` library. This is
-   independent of `FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only
+   independent of `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only
    requires a
    [CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html)
    (no `CMAKE_CUDA_COMPILER`).
@@ -169,14 +169,14 @@ CMake itself provide.
 
 ### CUDA Support
 
-With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following
+With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following
 additional configuration options become available.
 
- * `FORTRANRUNTIME_LIBCUDACXX_PATH` (path, default: `""`)
+ * `FLANG_RT_LIBCUDACXX_PATH` (path, default: `""`)
 
    Path to libcu++ package installation.
 
- * `FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`)
+ * `FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`)
 
    Do not compile global variables' definitions when producing PTX library.
    Default is `OFF`, meaning global variable definitions are compiled by
@@ -185,11 +185,11 @@ additional configuration options become available.
 
 ### OpenMP Offload Support
 
-With `-DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following
+With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following
 additional configuration options become available.
 
- * `FORTRANRUNTIME_DEVICE_ARCHITECTURES` (default: `"all"`)
+ * `FLANG_RT_DEVICE_ARCHITECTURES` (default: `"all"`)
 
-   A list of device architectures that the FortranRuntime is supporting.
+   A list of device architectures that flang-rt is supporting.
    If `"all"` uses a pre-defined list of architectures. Same purpose as
    `LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload.
diff --git a/FortranRuntime/cmake/config.h.cmake.in b/flang-rt/cmake/config.h.cmake.in
similarity index 100%
rename from FortranRuntime/cmake/config.h.cmake.in
rename to flang-rt/cmake/config.h.cmake.in
diff --git a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
similarity index 72%
rename from FortranRuntime/cmake/modules/AddFortranRuntime.cmake
rename to flang-rt/cmake/modules/AddFlangRT.cmake
index e9563c6e3a60b9..797eeddae32142 100644
--- a/FortranRuntime/cmake/modules/AddFortranRuntime.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -1,4 +1,4 @@
-#===-- cmake/modules/AddFortranRuntime.cmake -------------------------------===#
+#===-- cmake/modules/AddFlangRT.cmake -------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -6,11 +6,11 @@
 #
 #===------------------------------------------------------------------------===#
 
-# Builds a library with common options for FortranRuntime.
+# Builds a library with common options for flang-rt.
 #
 # Usage:
 #
-# add_fortranruntime_library(name sources ...
+# add_flangrt_library(name sources ...
 #   SHARED
 #     Build a dynamic (.so/.dll) library
 #   STATIC
@@ -28,7 +28,7 @@
 #   ADDITIONAL_HEADERS
 #     May specify header files for IDE generators.
 # )
-function (add_fortranruntime_library name)
+function (add_flangrt_library name)
   set(options STATIC SHARED OBJECT INSTALL_WITH_TOOLCHAIN EXCLUDE_FROM_ALL LINK_TO_LLVM)
   set(multiValueArgs ADDITIONAL_HEADERS)
   cmake_parse_arguments(ARG
@@ -76,23 +76,23 @@ function (add_fortranruntime_library name)
       )
   endif ()
 
-  # FortranRuntime's public headers
-  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  # Flang-rt's public headers
+  target_include_directories(${name} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
 
   # For ISO_Fortran_binding.h to be found by the runtime itself (Accessed as #include "flang/ISO_Fortran_binding.h")
   # User applications can use #include <ISO_Fortran_binding.h>
   target_include_directories(${name} PRIVATE "${FLANG_SOURCE_DIR}/include")
 
-  # For FortranRuntime's configured config.h to be found
-  target_include_directories(${name} PRIVATE "${FORTRANRUNTIME_BINARY_DIR}")
+  # For flang-rt's configured config.h to be found
+  target_include_directories(${name} PRIVATE "${FLANGRT_BINARY_DIR}")
 
-  # Clang/Flang, targeting the MSVC ABI, including clang-cl, should only depends
-  # on msv(u)crt. LLVM still emits libgcc/compiler-rt functions for 128-bit
-  # integer math (__udivti3, __modti3, __fixsfti, __floattidf, ...) that msvc
-  # does not support. We are injecting a dependency to Compiler-RT where these
-  # are implemented.
-  if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FORTRANRUNTIME_LIBCALL)
-    target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FORTRANRUNTIME_LIBCALL}")
+  # Flang/Clang (including clang-cl) -compiled programs targeting the MSVC ABI
+  # should only depend on msv(u)crt. LLVM still emits libgcc/compiler-rt
+  # functions for 128-bit integer math (__udivti3, __modti3, __fixsfti,
+  # __floattidf, ...) that msvc does not support. We are injecting a dependency
+  # to Compiler-RT where these are implemented.
+  if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FLANGRT_LIBCALL)
+    target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FLANGRT_LIBCALL}")
   endif ()
 
   # Non-GTest unittests depend on LLVMSupport
@@ -112,15 +112,15 @@ function (add_fortranruntime_library name)
   if (ARG_INSTALL_WITH_TOOLCHAIN)
     set_target_properties(${name}
       PROPERTIES
-        LIBRARY_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
-        ARCHIVE_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
-        RUNTIME_OUTPUT_DIRECTORY "${FORTRANRUNTIME_BUILD_LIB_DIR}"
+        LIBRARY_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
+        ARCHIVE_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
+        RUNTIME_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
       )
 
     install(TARGETS ${name}
-        LIBRARY DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
-        ARCHIVE DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
-        RUNTIME DESTINATION "${FORTRANRUNTIME_INSTALL_LIB_DIR}"
+        LIBRARY DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
+        ARCHIVE DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
+        RUNTIME DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
       )
   endif ()
-endfunction (add_fortranruntime_library)
+endfunction (add_flangrt_library)
diff --git a/FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
similarity index 82%
rename from FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake
rename to flang-rt/cmake/modules/AddFlangRTOffload.cmake
index d60a26ce0f8a86..a6b94602b0456f 100644
--- a/FortranRuntime/cmake/modules/AddFortranOffloadRuntime.cmake
+++ b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
@@ -7,7 +7,7 @@
 #===------------------------------------------------------------------------===#
 
 macro(enable_cuda_compilation name files)
-  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+  if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
     if (BUILD_SHARED_LIBS)
       message(FATAL_ERROR
         "BUILD_SHARED_LIBS is not supported for CUDA build of Fortran runtime"
@@ -42,26 +42,26 @@ macro(enable_cuda_compilation name files)
       "${CUDA_COMPILE_OPTIONS}"
       )
 
-    if (EXISTS "${FORTRANRUNTIME_LIBCUDACXX_PATH}/include")
+    if (EXISTS "${FLANG_RT_LIBCUDACXX_PATH}/include")
       # When using libcudacxx headers files, we have to use them
       # for all files of F18 runtime.
-      include_directories(AFTER ${FORTRANRUNTIME_LIBCUDACXX_PATH}/include)
+      include_directories(AFTER ${FLANG_RT_LIBCUDACXX_PATH}/include)
       add_compile_definitions(RT_USE_LIBCUDACXX=1)
     endif()
 
     # Add an OBJECT library consisting of CUDA PTX.
-    add_fortranruntime_library(${name}PTX OBJECT ${files})
+    add_flangrt_library(${name}PTX OBJECT ${files})
     set_property(TARGET ${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
-    if (FORTRANRUNTIME_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
+    if (FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
       target_compile_definitions(${name}PTX
-        PRIVATE FORTRANRUNTIME_NO_GLOBAL_VAR_DEFS
+        PRIVATE FLANGRT_NO_GLOBAL_VAR_DEFS
         )
     endif()
   endif()
 endmacro()
 
 macro(enable_omp_offload_compilation files)
-  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+  if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
     # OpenMP offload build only works with Clang compiler currently.
 
     if (BUILD_SHARED_LIBS)
@@ -88,13 +88,13 @@ macro(enable_omp_offload_compilation files)
         "${all_amdgpu_architectures};${all_nvptx_architectures}"
         )
       # TODO: support auto detection on the build system.
-      if (FORTRANRUNTIME_DEVICE_ARCHITECTURES STREQUAL "all")
-        set(FORTRANRUNTIME_DEVICE_ARCHITECTURES ${all_gpu_architectures})
+      if (FLANG_RT_DEVICE_ARCHITECTURES STREQUAL "all")
+        set(FLANG_RT_DEVICE_ARCHITECTURES ${all_gpu_architectures})
       endif()
-      list(REMOVE_DUPLICATES FORTRANRUNTIME_DEVICE_ARCHITECTURES)
+      list(REMOVE_DUPLICATES FLANG_RT_DEVICE_ARCHITECTURES)
 
       string(REPLACE ";" "," compile_for_architectures
-        "${FORTRANRUNTIME_DEVICE_ARCHITECTURES}"
+        "${FLANG_RT_DEVICE_ARCHITECTURES}"
         )
 
       set(OMP_COMPILE_OPTIONS
@@ -115,7 +115,7 @@ macro(enable_omp_offload_compilation files)
         )
     else()
       message(FATAL_ERROR
-        "FortranRuntime build with OpenMP offload is not supported for these compilers:\n"
+        "Flang-rt build with OpenMP offload is not supported for these compilers:\n"
         "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}\n"
         "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
     endif()
diff --git a/flang/include/flang/Runtime/CUDA/allocator.h b/flang-rt/include/flang-rt/CufRuntime/allocator.h
similarity index 85%
rename from flang/include/flang/Runtime/CUDA/allocator.h
rename to flang-rt/include/flang-rt/CufRuntime/allocator.h
index cc88896b1f0bd6..63406e0de6d2fa 100644
--- a/flang/include/flang/Runtime/CUDA/allocator.h
+++ b/flang-rt/include/flang-rt/CufRuntime/allocator.h
@@ -1,4 +1,4 @@
-//===-- include/flang/Runtime/CUDA/allocator.h ------------------*- C++ -*-===//
+//===-- include/flang-rt/CufRuntime/allocator.h -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
-#define FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
+#ifndef FORTRAN_CUFRUNTIME_ALLOCATOR_H_
+#define FORTRAN_CUFRUNTIME_ALLOCATOR_H_
 
 #include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
@@ -43,4 +43,4 @@ void *CUFAllocUnified(std::size_t);
 void CUFFreeUnified(void *);
 
 } // namespace Fortran::runtime::cuda
-#endif // FORTRAN_RUNTIME_CUDA_ALLOCATOR_H_
+#endif /* FORTRAN_CUFRUNTIME_ALLOCATOR_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h b/flang-rt/include/flang-rt/flang_rt/allocator-registry.h
similarity index 87%
rename from FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h
rename to flang-rt/include/flang-rt/flang_rt/allocator-registry.h
index 30a583b88c083e..ecad61ab4043d7 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/allocator-registry.h
+++ b/flang-rt/include/flang-rt/flang_rt/allocator-registry.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/allocator-registry.h -----*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/allocator-registry.h ----------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_
-#define FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_
+#ifndef FORTRAN_FLANG_RT_ALLOCATOR_REGISTRY_H_
+#define FORTRAN_FLANG_RT_ALLOCATOR_REGISTRY_H_
 
 #include "flang/Common/api-attrs.h"
 #include "flang/Runtime/allocator-registry-consts.h"
@@ -55,4 +55,4 @@ RT_OFFLOAD_VAR_GROUP_END
 
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_H_ */
+#endif /* FORTRAN_FLANG_RT_ALLOCATOR_REGISTRY_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h b/flang-rt/include/flang-rt/flang_rt/array-constructor.h
similarity index 85%
rename from FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h
rename to flang-rt/include/flang-rt/flang_rt/array-constructor.h
index 314d5e56599cd3..e8fffc762b6fbe 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/array-constructor.h
+++ b/flang-rt/include/flang-rt/flang_rt/array-constructor.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/array-constructor.h ------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/array-constructor.h -----------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,10 +9,10 @@
 // External APIs to create temporary storage for array constructors when their
 // final extents or length parameters cannot be pre-computed.
 
-#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
-#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_
+#ifndef FORTRAN_FLANG_RT_ARRAY_CONSTRUCTOR_H_
+#define FORTRAN_FLANG_RT_ARRAY_CONSTRUCTOR_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "flang/Runtime/array-constructor-consts.h"
 #include "flang/Runtime/entry-names.h"
 #include <cstdint>
@@ -45,4 +45,4 @@ struct ArrayConstructorVector {
 };
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_H_ */
+#endif /* FORTRAN_FLANG_RT_ARRAY_CONSTRUCTOR_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/descriptor.h b/flang-rt/include/flang-rt/flang_rt/descriptor.h
similarity index 98%
rename from FortranRuntime/include/FortranRuntime/Runtime/descriptor.h
rename to flang-rt/include/flang-rt/flang_rt/descriptor.h
index f79ad6b9637a4a..fea5b55c1922ce 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/descriptor.h
+++ b/flang-rt/include/flang-rt/flang_rt/descriptor.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/descriptor.h -------------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/descriptor.h ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_DESCRIPTOR_H_
-#define FORTRAN_RUNTIME_DESCRIPTOR_H_
+#ifndef FORTRAN_FLANG_RT_DESCRIPTOR_H_
+#define FORTRAN_FLANG_RT_DESCRIPTOR_H_
 
 // Defines data structures used during execution of a Fortran program
 // to implement nontrivial dummy arguments, pointers, allocatables,
@@ -18,8 +18,8 @@
 // User C code is welcome to depend on that ISO_Fortran_binding.h file,
 // but should never reference this internal header.
 
-#include "FortranRuntime/Runtime/memory.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/memory.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/descriptor-consts.h"
 #include <algorithm>
@@ -482,4 +482,4 @@ class alignas(Descriptor) StaticDescriptor {
 };
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_DESCRIPTOR_H_ */
+#endif /* FORTRAN_FLANG_RT_DESCRIPTOR_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h b/flang-rt/include/flang-rt/flang_rt/io-api-funcs.h
similarity index 84%
rename from FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h
rename to flang-rt/include/flang-rt/flang_rt/io-api-funcs.h
index 516fe25784656c..00cb49ad015437 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/io-api-funcs.h
+++ b/flang-rt/include/flang-rt/flang_rt/io-api-funcs.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/io-api-funcs.h -----------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/io-api-funcs.h ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Defines API between compiled code and I/O runtime library.
 
-#ifndef FORTRAN_RUNTIME_IO_API_FUNCS_H_
-#define FORTRAN_RUNTIME_IO_API_FUNCS_H_
+#ifndef FORTRAN_FLANG_RT_IO_API_FUNCS_H_
+#define FORTRAN_FLANG_RT_IO_API_FUNCS_H_
 
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/entry-names.h"
@@ -36,4 +36,4 @@ RT_API_ATTRS const char *InquiryKeywordHashDecode(
     char *buffer, std::size_t, InquiryKeywordHash);
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IO_API_FUNCS_H_ */
+#endif /* FORTRAN_FLANG_RT_IO_API_FUNCS_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h b/flang-rt/include/flang-rt/flang_rt/iostat-funcs.h
similarity index 75%
rename from FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h
rename to flang-rt/include/flang-rt/flang_rt/iostat-funcs.h
index 10906afb01673c..dd24d41fbaad10 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/iostat-funcs.h
+++ b/flang-rt/include/flang-rt/flang_rt/iostat-funcs.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/iostat-funcs.h -----------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/iostat-funcs.h ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,8 +9,8 @@
 // Defines the values returned by the runtime for IOSTAT= specifiers
 // on I/O statements.
 
-#ifndef FORTRAN_RUNTIME_IOSTAT_FUNCS_H_
-#define FORTRAN_RUNTIME_IOSTAT_FUNCS_H_
+#ifndef FORTRAN_FLANG_RT_IOSTAT_FUNCS_H_
+#define FORTRAN_FLANG_RT_IOSTAT_FUNCS_H_
 
 #include "flang/Common/api-attrs.h"
 #include "flang/Runtime/iostat.h"
@@ -20,4 +20,4 @@ namespace Fortran::runtime::io {
 RT_API_ATTRS const char *IostatErrorString(int);
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IOSTAT_FUNCS_H_ */
+#endif /* FORTRAN_FLANG_RT_IOSTAT_FUNCS_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/memory.h b/flang-rt/include/flang-rt/flang_rt/memory.h
similarity index 96%
rename from FortranRuntime/include/FortranRuntime/Runtime/memory.h
rename to flang-rt/include/flang-rt/flang_rt/memory.h
index 3e7fd2d9ea3e3b..b97f6525d60036 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/memory.h
+++ b/flang-rt/include/flang-rt/flang_rt/memory.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/memory.h -----------------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/memory.h ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,8 +9,8 @@
 // Thin wrapper around malloc()/free() to isolate the dependency,
 // ease porting, and provide an owning pointer.
 
-#ifndef FORTRAN_RUNTIME_MEMORY_H_
-#define FORTRAN_RUNTIME_MEMORY_H_
+#ifndef FORTRAN_FLANG_RT_MEMORY_H_
+#define FORTRAN_FLANG_RT_MEMORY_H_
 
 #include "flang/Common/api-attrs.h"
 #include <cassert>
@@ -170,4 +170,4 @@ template <typename A> struct Allocator {
 };
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_MEMORY_H_ */
+#endif /* FORTRAN_FLANG_RT_MEMORY_H_ */
diff --git a/FortranRuntime/include/FortranRuntime/Runtime/type-code.h b/flang-rt/include/flang-rt/flang_rt/type-code.h
similarity index 93%
rename from FortranRuntime/include/FortranRuntime/Runtime/type-code.h
rename to flang-rt/include/flang-rt/flang_rt/type-code.h
index 92ff593410c12c..7c694a13431b13 100644
--- a/FortranRuntime/include/FortranRuntime/Runtime/type-code.h
+++ b/flang-rt/include/flang-rt/flang_rt/type-code.h
@@ -1,4 +1,4 @@
-//===-- include/FortranRuntime/Runtime/type-code.h --------------*- C++ -*-===//
+//===-- include/flang-rt/flang_rt/type-code.h -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_TYPE_CODE_H_
-#define FORTRAN_RUNTIME_TYPE_CODE_H_
+#ifndef FORTRAN_FLANG_RT_TYPE_CODE_H_
+#define FORTRAN_FLANG_RT_TYPE_CODE_H_
 
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
@@ -75,4 +75,4 @@ class TypeCode {
   ISO::CFI_type_t raw_{CFI_type_other};
 };
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_TYPE_CODE_H_ */
+#endif /* FORTRAN_FLANG_RT_TYPE_CODE_H_ */
diff --git a/FortranRuntime/lib/CMakeLists.txt b/flang-rt/lib/CMakeLists.txt
similarity index 71%
rename from FortranRuntime/lib/CMakeLists.txt
rename to flang-rt/lib/CMakeLists.txt
index 74c78b3fa3a493..f0422f5e0a58b4 100644
--- a/FortranRuntime/lib/CMakeLists.txt
+++ b/flang-rt/lib/CMakeLists.txt
@@ -6,8 +6,12 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_subdirectory(Runtime)
-if (FORTRANRUNTIME_INCLUDE_TESTS)
+add_subdirectory(FortranFloat128Math)
+add_subdirectory(flang_rt)
+if (FLANG_RT_ENABLE_CUF)
+  add_subdirectory(CufRuntime)
+endif()
+
+if (FLANG_RT_INCLUDE_TESTS)
   add_subdirectory(Testing)
 endif ()
-
diff --git a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt b/flang-rt/lib/CufRuntime/CMakeLists.txt
similarity index 87%
rename from FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
rename to flang-rt/lib/CufRuntime/CMakeLists.txt
index 78b98652d60813..1eb80d9ca1d497 100644
--- a/FortranRuntime/lib/Runtime/CUDA/CMakeLists.txt
+++ b/flang-rt/lib/CufRuntime/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- lib/Runtime/CUDA/CMakeLists.txt -------------------------------------===#
+#===-- lib/CufRuntime/CMakeLists.txt ---------------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +11,7 @@
 # added to the library name.
 set(CUFRT_LIBNAME CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR})
 
-add_fortranruntime_library(${CUFRT_LIBNAME}
+add_flangrt_library(${CUFRT_LIBNAME}
   allocator.cpp
   descriptor.cpp
 )
@@ -25,6 +25,6 @@ endif()
 
 target_link_libraries(${CUFRT_LIBNAME}
   PRIVATE
-  FortranRuntime
+  flang_rt
   ${CUDA_RT_TARGET}
 )
diff --git a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp b/flang-rt/lib/CufRuntime/allocator.cpp
similarity index 81%
rename from FortranRuntime/lib/Runtime/CUDA/allocator.cpp
rename to flang-rt/lib/CufRuntime/allocator.cpp
index c9d62f6ea8f3bf..8c16fb77f2ac46 100644
--- a/FortranRuntime/lib/Runtime/CUDA/allocator.cpp
+++ b/flang-rt/lib/CufRuntime/allocator.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/CUDA/allocator.cpp --------------------------*- C++ -*-===//
+//===-- lib/CufRuntime/allocator.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,14 +6,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/CUDA/allocator.h"
-#include "FortranRuntime/Runtime/allocator-registry.h"
-#include "../derived.h"
-#include "../stat.h"
-#include "../terminator.h"
-#include "../type-info.h"
-#include "flang/ISO_Fortran_binding_wrapper.h"
-#include "flang/Support/Fortran.h"
+#include "flang-rt/CufRuntime/allocator.h"
+#include "flang-rt/flang_rt/allocator-registry.h"
+#include "../flang_rt/derived.h"
+#include "../flang_rt/stat.h"
+#include "../flang_rt/terminator.h"
+#include "../flang_rt/type-info.h"
+#include "flang/Common/Fortran-consts.h"
+#include "flang/Common/ISO_Fortran_binding_wrapper.h"
 
 #include "cuda_runtime.h"
 
diff --git a/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp b/flang-rt/lib/CufRuntime/descriptor.cpp
similarity index 82%
rename from FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
rename to flang-rt/lib/CufRuntime/descriptor.cpp
index 94b5feca4ce4dc..b034fc76b67d4d 100644
--- a/FortranRuntime/lib/Runtime/CUDA/descriptor.cpp
+++ b/flang-rt/lib/CufRuntime/descriptor.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/CUDA/descriptor.cpp -------------------------*- C++ -*-===//
+//===-- lib/CufRuntime/descriptor.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/CUDA/descriptor.h"
-#include "FortranRuntime/Runtime/CUDA/allocator.h"
+#include "flang/Runtime/CUDA/descriptor.h"
+#include "flang-rt/CufRuntime/allocator.h"
 
 namespace Fortran::runtime::cuda {
 extern "C" {
diff --git a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
rename to flang-rt/lib/FortranFloat128Math/CMakeLists.txt
index ed65da0a5ac71c..b12dfee64af8f6 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/CMakeLists.txt
+++ b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- runtime/Float128Math/CMakeLists.txt ---------------------------------===#
+#===-- lib/FortranFloat128Math/CMakeLists.txt ------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -91,12 +91,11 @@ if (FLANG_RUNTIME_F128_MATH_LIB)
 
   if (WIN32)
     # Do not create a FortranFloat128Math library under Windows, the Flang
-    # driver never links it. Instead, add the sources to the main
-    # FortranRuntime.lib.
+    # driver never links it. Instead, add the sources to the flang_rt itself.
     target_sources(FortranFloat128MathILib INTERFACE ${sources})
     target_compile_definitions(FortranFloat128MathILib INTERFACE HAS_QUADMATHLIB)
   else ()
-    add_fortranruntime_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
+    add_flangrt_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
       ${sources})
    endif ()
 elseif (HAVE_LDBL_MANT_DIG_113)
@@ -108,7 +107,7 @@ elseif (HAVE_LDBL_MANT_DIG_113)
       )
     target_sources(FortranFloat128MathILib INTERFACE ${sources})
   else()
-    message(FATAL_ERROR "FortranRuntime cannot build without libm")
+    message(FATAL_ERROR "flang-rt cannot build without libm")
   endif()
 else()
   # We can use '__float128' version from libc, if it has them.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/acos.cpp b/flang-rt/lib/FortranFloat128Math/acos.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/acos.cpp
rename to flang-rt/lib/FortranFloat128Math/acos.cpp
index 7b15e4a0bfd3ae..e204c6c871f3fa 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/acos.cpp
+++ b/flang-rt/lib/FortranFloat128Math/acos.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/acos.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/acos.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/acosh.cpp b/flang-rt/lib/FortranFloat128Math/acosh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/acosh.cpp
rename to flang-rt/lib/FortranFloat128Math/acosh.cpp
index c873259b4545b8..90ff7886e6909d 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/acosh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/acosh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/acosh.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/acosh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/asin.cpp b/flang-rt/lib/FortranFloat128Math/asin.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/asin.cpp
rename to flang-rt/lib/FortranFloat128Math/asin.cpp
index 8866d51430197a..18368044d72b0f 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/asin.cpp
+++ b/flang-rt/lib/FortranFloat128Math/asin.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/asin.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/asin.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/asinh.cpp b/flang-rt/lib/FortranFloat128Math/asinh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/asinh.cpp
rename to flang-rt/lib/FortranFloat128Math/asinh.cpp
index 288193001ce1da..2c1f040cfc3872 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/asinh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/asinh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/asinh.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/asinh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/atan.cpp b/flang-rt/lib/FortranFloat128Math/atan.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/atan.cpp
rename to flang-rt/lib/FortranFloat128Math/atan.cpp
index 390c080b4d501b..8bd9a2626caf83 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/atan.cpp
+++ b/flang-rt/lib/FortranFloat128Math/atan.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/atan.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/atan.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/atan2.cpp b/flang-rt/lib/FortranFloat128Math/atan2.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/atan2.cpp
rename to flang-rt/lib/FortranFloat128Math/atan2.cpp
index 3c206b75704431..4994be699a0b67 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/atan2.cpp
+++ b/flang-rt/lib/FortranFloat128Math/atan2.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/atan2.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/atan2.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/atanh.cpp b/flang-rt/lib/FortranFloat128Math/atanh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/atanh.cpp
rename to flang-rt/lib/FortranFloat128Math/atanh.cpp
index 77ceb188f04e42..f5ace35ac51caa 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/atanh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/atanh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/atanh.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/atanh.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/ceil.cpp b/flang-rt/lib/FortranFloat128Math/ceil.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/ceil.cpp
rename to flang-rt/lib/FortranFloat128Math/ceil.cpp
index 46bc253bd0922d..834da9396c071d 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/ceil.cpp
+++ b/flang-rt/lib/FortranFloat128Math/ceil.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/ceil.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/ceil.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/complex-math.c b/flang-rt/lib/FortranFloat128Math/complex-math.c
similarity index 96%
rename from FortranRuntime/lib/Runtime/Float128Math/complex-math.c
rename to flang-rt/lib/FortranFloat128Math/complex-math.c
index f34ef7da76e599..493ffe942f7e31 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/complex-math.c
+++ b/flang-rt/lib/FortranFloat128Math/complex-math.c
@@ -1,4 +1,4 @@
-/*===-- lib/Runtime/Float128Math/complex-math.c ---------------------*- C -*-===
+/*===-- lib/FortranFloat128Math/complex-math.c ----------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/complex-math.h b/flang-rt/lib/FortranFloat128Math/complex-math.h
similarity index 88%
rename from FortranRuntime/lib/Runtime/Float128Math/complex-math.h
rename to flang-rt/lib/FortranFloat128Math/complex-math.h
index 6f5c7954bab035..bb67523e1bddcc 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/complex-math.h
+++ b/flang-rt/lib/FortranFloat128Math/complex-math.h
@@ -1,4 +1,4 @@
-/*===-- lib/Runtime/Float128Math/complex-math.h ---------------------*- C -*-===
+/*===-- lib/FortranFloat128Math/complex-math.h ----------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
  *
  *===----------------------------------------------------------------------===*/
 
-#ifndef FORTRAN_RUNTIME_FLOAT128MATH_COMPLEX_MATH_H_
-#define FORTRAN_RUNTIME_FLOAT128MATH_COMPLEX_MATH_H_
+#ifndef FORTRAN_FORTRANFLOAT128MATH_COMPLEX_MATH_H_
+#define FORTRAN_FORTRANFLOAT128MATH_COMPLEX_MATH_H_
 
 #include "flang/Common/float128.h"
 #include "flang/Runtime/entry-names.h"
@@ -59,4 +59,4 @@
 #error "Float128Math build with glibc>=2.26 is unsupported yet"
 #endif
 
-#endif /* FORTRAN_RUNTIME_FLOAT128MATH_COMPLEX_MATH_H_ */
+#endif /* FORTRAN_FORTRANFLOAT128MATH_COMPLEX_MATH_H_ */
diff --git a/FortranRuntime/lib/Runtime/Float128Math/cos.cpp b/flang-rt/lib/FortranFloat128Math/cos.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/cos.cpp
rename to flang-rt/lib/FortranFloat128Math/cos.cpp
index 8ce47151e2914b..2651982666118b 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/cos.cpp
+++ b/flang-rt/lib/FortranFloat128Math/cos.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/cos.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/cos.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/cosh.cpp b/flang-rt/lib/FortranFloat128Math/cosh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/cosh.cpp
rename to flang-rt/lib/FortranFloat128Math/cosh.cpp
index f1ec45bcfb479d..dda01e5abef66d 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/cosh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/cosh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/cosh.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/cosh.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/erf.cpp b/flang-rt/lib/FortranFloat128Math/erf.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/erf.cpp
rename to flang-rt/lib/FortranFloat128Math/erf.cpp
index 010088467794d1..f5e713d93cac61 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/erf.cpp
+++ b/flang-rt/lib/FortranFloat128Math/erf.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/erf.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/erf.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/erfc.cpp b/flang-rt/lib/FortranFloat128Math/erfc.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/erfc.cpp
rename to flang-rt/lib/FortranFloat128Math/erfc.cpp
index b226f8d2dc378b..3f8b78ba0e64f9 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/erfc.cpp
+++ b/flang-rt/lib/FortranFloat128Math/erfc.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/erfc.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/erfc.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/exp.cpp b/flang-rt/lib/FortranFloat128Math/exp.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/exp.cpp
rename to flang-rt/lib/FortranFloat128Math/exp.cpp
index e22f9df3579e96..0b694b159f3621 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/exp.cpp
+++ b/flang-rt/lib/FortranFloat128Math/exp.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/exp.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/exp.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/exponent.cpp b/flang-rt/lib/FortranFloat128Math/exponent.cpp
similarity index 92%
rename from FortranRuntime/lib/Runtime/Float128Math/exponent.cpp
rename to flang-rt/lib/FortranFloat128Math/exponent.cpp
index f07bf30bd1096f..a9c1b867e7ea37 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/exponent.cpp
+++ b/flang-rt/lib/FortranFloat128Math/exponent.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/exponent.cpp -------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/exponent.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/floor.cpp b/flang-rt/lib/FortranFloat128Math/floor.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/floor.cpp
rename to flang-rt/lib/FortranFloat128Math/floor.cpp
index 8744e6e2fec63c..27cfed2f1f9599 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/floor.cpp
+++ b/flang-rt/lib/FortranFloat128Math/floor.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/floor.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/floor.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/fma.cpp b/flang-rt/lib/FortranFloat128Math/fma.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/fma.cpp
rename to flang-rt/lib/FortranFloat128Math/fma.cpp
index 198fec5d4bc356..a9ac1581002cec 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/fma.cpp
+++ b/flang-rt/lib/FortranFloat128Math/fma.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/fma.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/fma.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/fraction.cpp b/flang-rt/lib/FortranFloat128Math/fraction.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/fraction.cpp
rename to flang-rt/lib/FortranFloat128Math/fraction.cpp
index d4749bf3eb7e0e..39c59a25812abb 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/fraction.cpp
+++ b/flang-rt/lib/FortranFloat128Math/fraction.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/fraction.cpp -------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/fraction.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/hypot.cpp b/flang-rt/lib/FortranFloat128Math/hypot.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/hypot.cpp
rename to flang-rt/lib/FortranFloat128Math/hypot.cpp
index 6542bf505060df..c130e204f9951e 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/hypot.cpp
+++ b/flang-rt/lib/FortranFloat128Math/hypot.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/hypot.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/hypot.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/j0.cpp b/flang-rt/lib/FortranFloat128Math/j0.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/j0.cpp
rename to flang-rt/lib/FortranFloat128Math/j0.cpp
index 27e4338cdfc2b0..d6454b56c8a86b 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/j0.cpp
+++ b/flang-rt/lib/FortranFloat128Math/j0.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/j0.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/j0.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/j1.cpp b/flang-rt/lib/FortranFloat128Math/j1.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/j1.cpp
rename to flang-rt/lib/FortranFloat128Math/j1.cpp
index d3f897827f9f67..2b7283aea0fe46 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/j1.cpp
+++ b/flang-rt/lib/FortranFloat128Math/j1.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/j1.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/j1.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/jn.cpp b/flang-rt/lib/FortranFloat128Math/jn.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/jn.cpp
rename to flang-rt/lib/FortranFloat128Math/jn.cpp
index 681bb5b1ff3ad5..cdc9af9b3dd6a5 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/jn.cpp
+++ b/flang-rt/lib/FortranFloat128Math/jn.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/jn.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/jn.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp b/flang-rt/lib/FortranFloat128Math/lgamma.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp
rename to flang-rt/lib/FortranFloat128Math/lgamma.cpp
index 0426db2e3b98d3..cecf9e90ad29ba 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/lgamma.cpp
+++ b/flang-rt/lib/FortranFloat128Math/lgamma.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/lgamma.cpp ---------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/lgamma.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/llround.cpp b/flang-rt/lib/FortranFloat128Math/llround.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/llround.cpp
rename to flang-rt/lib/FortranFloat128Math/llround.cpp
index 4c9026cce00283..7853ac10f53e88 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/llround.cpp
+++ b/flang-rt/lib/FortranFloat128Math/llround.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/llround.cpp --------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/llround.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/log.cpp b/flang-rt/lib/FortranFloat128Math/log.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/log.cpp
rename to flang-rt/lib/FortranFloat128Math/log.cpp
index a5a431ae5ffbbb..d705eaf441c31f 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/log.cpp
+++ b/flang-rt/lib/FortranFloat128Math/log.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/log.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/log.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/log10.cpp b/flang-rt/lib/FortranFloat128Math/log10.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/log10.cpp
rename to flang-rt/lib/FortranFloat128Math/log10.cpp
index 9a83f57b6c736d..af61f8762371b9 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/log10.cpp
+++ b/flang-rt/lib/FortranFloat128Math/log10.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/log10.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/log10.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/lround.cpp b/flang-rt/lib/FortranFloat128Math/lround.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/lround.cpp
rename to flang-rt/lib/FortranFloat128Math/lround.cpp
index 65546881157948..24278f1040e9e3 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/lround.cpp
+++ b/flang-rt/lib/FortranFloat128Math/lround.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/lround.cpp ---------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/lround.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h b/flang-rt/lib/FortranFloat128Math/math-entries.h
similarity index 97%
rename from FortranRuntime/lib/Runtime/Float128Math/math-entries.h
rename to flang-rt/lib/FortranFloat128Math/math-entries.h
index 1449000820f00e..9b13c10836f877 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/math-entries.h
+++ b/flang-rt/lib/FortranFloat128Math/math-entries.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/math-entries.h -----------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/math-entries.h ------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
-#define FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_
+#ifndef FORTRAN_FORTRANFLOAT128MATH_MATH_ENTRIES_H_
+#define FORTRAN_FORTRANFLOAT128MATH_MATH_ENTRIES_H_
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/float128.h"
@@ -222,4 +222,4 @@ DEFINE_SIMPLE_ALIAS(Yn, ynl)
 
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_FLOAT128MATH_MATH_ENTRIES_H_ */
+#endif /* FORTRAN_FORTRANFLOAT128MATH_MATH_ENTRIES_H_ */
diff --git a/FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp b/flang-rt/lib/FortranFloat128Math/mod-real.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp
rename to flang-rt/lib/FortranFloat128Math/mod-real.cpp
index e3b96d39e76ae6..b3c2b715b21995 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/mod-real.cpp
+++ b/flang-rt/lib/FortranFloat128Math/mod-real.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/mod-real.cpp -------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/mod-real.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp b/flang-rt/lib/FortranFloat128Math/modulo-real.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp
rename to flang-rt/lib/FortranFloat128Math/modulo-real.cpp
index 8edf59e9f59dd4..f5e3cf8a259a73 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/modulo-real.cpp
+++ b/flang-rt/lib/FortranFloat128Math/modulo-real.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/modulo-real.cpp ----------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/modulo-real.cpp -----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/nearest.cpp b/flang-rt/lib/FortranFloat128Math/nearest.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/nearest.cpp
rename to flang-rt/lib/FortranFloat128Math/nearest.cpp
index 8b9f142d79ff93..eb34c2ddb6ab48 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/nearest.cpp
+++ b/flang-rt/lib/FortranFloat128Math/nearest.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/nearest.cpp --------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/nearest.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/norm2.cpp b/flang-rt/lib/FortranFloat128Math/norm2.cpp
similarity index 94%
rename from FortranRuntime/lib/Runtime/Float128Math/norm2.cpp
rename to flang-rt/lib/FortranFloat128Math/norm2.cpp
index a0c26e40de0064..d000fde1bb0bea 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/norm2.cpp
+++ b/flang-rt/lib/FortranFloat128Math/norm2.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/norm2.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/norm2.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h b/flang-rt/lib/FortranFloat128Math/numeric-template-specs.h
similarity index 84%
rename from FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
rename to flang-rt/lib/FortranFloat128Math/numeric-template-specs.h
index 2a843df2d1d861..f34ee5f4e3a8de 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/numeric-template-specs.h
+++ b/flang-rt/lib/FortranFloat128Math/numeric-template-specs.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/numeric-template-specs.h -------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/numeric-template-specs.h --------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
-#define FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
+#ifndef FORTRAN_FORTRANFLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
+#define FORTRAN_FORTRANFLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
 
 #include "math-entries.h"
 #include "numeric-templates.h"
@@ -52,4 +52,4 @@ template <> struct SQRTTy<F128Type> {
 };
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_ */
+#endif /* FORTRAN_FORTRANFLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_ */
diff --git a/FortranRuntime/lib/Runtime/Float128Math/pow.cpp b/flang-rt/lib/FortranFloat128Math/pow.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/pow.cpp
rename to flang-rt/lib/FortranFloat128Math/pow.cpp
index c11978ca068f23..f5deb00a556f48 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/pow.cpp
+++ b/flang-rt/lib/FortranFloat128Math/pow.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/pow.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/pow.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/random.cpp b/flang-rt/lib/FortranFloat128Math/random.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/random.cpp
rename to flang-rt/lib/FortranFloat128Math/random.cpp
index a9dc3c7a82b673..3a01c2c88b1d66 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/random.cpp
+++ b/flang-rt/lib/FortranFloat128Math/random.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/random.cpp ---------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/random.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/round.cpp b/flang-rt/lib/FortranFloat128Math/round.cpp
similarity index 92%
rename from FortranRuntime/lib/Runtime/Float128Math/round.cpp
rename to flang-rt/lib/FortranFloat128Math/round.cpp
index 5a9366b3af4785..3453f4ea8a1a26 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/round.cpp
+++ b/flang-rt/lib/FortranFloat128Math/round.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/round.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/round.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp b/flang-rt/lib/FortranFloat128Math/rrspacing.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp
rename to flang-rt/lib/FortranFloat128Math/rrspacing.cpp
index 2c501b3512c215..0809815027f859 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/rrspacing.cpp
+++ b/flang-rt/lib/FortranFloat128Math/rrspacing.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/rrspacing.cpp ------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/rrspacing.cpp -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/scale.cpp b/flang-rt/lib/FortranFloat128Math/scale.cpp
similarity index 92%
rename from FortranRuntime/lib/Runtime/Float128Math/scale.cpp
rename to flang-rt/lib/FortranFloat128Math/scale.cpp
index 859c955b8114e0..37528330bfb115 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/scale.cpp
+++ b/flang-rt/lib/FortranFloat128Math/scale.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/scale.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/scale.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp b/flang-rt/lib/FortranFloat128Math/set-exponent.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp
rename to flang-rt/lib/FortranFloat128Math/set-exponent.cpp
index 52258182871a14..52f8f08f7003ef 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/set-exponent.cpp
+++ b/flang-rt/lib/FortranFloat128Math/set-exponent.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/set-exponent.cpp ---------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/set-exponent.cpp ----------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/sin.cpp b/flang-rt/lib/FortranFloat128Math/sin.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/sin.cpp
rename to flang-rt/lib/FortranFloat128Math/sin.cpp
index 99aa4095c8cf1a..1a24e7c57ba469 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/sin.cpp
+++ b/flang-rt/lib/FortranFloat128Math/sin.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/sin.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/sin.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/sinh.cpp b/flang-rt/lib/FortranFloat128Math/sinh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/sinh.cpp
rename to flang-rt/lib/FortranFloat128Math/sinh.cpp
index a7dfe36737de43..7a4127cee970cd 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/sinh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/sinh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/sinh.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/sinh.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/spacing.cpp b/flang-rt/lib/FortranFloat128Math/spacing.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/spacing.cpp
rename to flang-rt/lib/FortranFloat128Math/spacing.cpp
index 66a01851965840..d3ed077d5412dc 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/spacing.cpp
+++ b/flang-rt/lib/FortranFloat128Math/spacing.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/spacing.cpp --------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/spacing.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp b/flang-rt/lib/FortranFloat128Math/sqrt.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp
rename to flang-rt/lib/FortranFloat128Math/sqrt.cpp
index cbc1e503d50fd9..a9f5246f35388f 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/sqrt.cpp
+++ b/flang-rt/lib/FortranFloat128Math/sqrt.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/sqrt.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/sqrt.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/tan.cpp b/flang-rt/lib/FortranFloat128Math/tan.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/tan.cpp
rename to flang-rt/lib/FortranFloat128Math/tan.cpp
index dbe4627f585f14..dc386c5be6ab74 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/tan.cpp
+++ b/flang-rt/lib/FortranFloat128Math/tan.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/tan.cpp ------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/tan.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/tanh.cpp b/flang-rt/lib/FortranFloat128Math/tanh.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/tanh.cpp
rename to flang-rt/lib/FortranFloat128Math/tanh.cpp
index 37e40966ced722..5f8af3f1cd8d77 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/tanh.cpp
+++ b/flang-rt/lib/FortranFloat128Math/tanh.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/tanh.cpp -----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/tanh.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp b/flang-rt/lib/FortranFloat128Math/tgamma.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp
rename to flang-rt/lib/FortranFloat128Math/tgamma.cpp
index 07a019c6d9971f..b1a42cdc5d0f41 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/tgamma.cpp
+++ b/flang-rt/lib/FortranFloat128Math/tgamma.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/tgamma.cpp ---------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/tgamma.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/trunc.cpp b/flang-rt/lib/FortranFloat128Math/trunc.cpp
similarity index 91%
rename from FortranRuntime/lib/Runtime/Float128Math/trunc.cpp
rename to flang-rt/lib/FortranFloat128Math/trunc.cpp
index 9f38bdc18e73c4..455204ece3b2f6 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/trunc.cpp
+++ b/flang-rt/lib/FortranFloat128Math/trunc.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/trunc.cpp ----------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/trunc.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/y0.cpp b/flang-rt/lib/FortranFloat128Math/y0.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/y0.cpp
rename to flang-rt/lib/FortranFloat128Math/y0.cpp
index 6eaa3396e7ea07..58bd71105efea6 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/y0.cpp
+++ b/flang-rt/lib/FortranFloat128Math/y0.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/y0.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/y0.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/y1.cpp b/flang-rt/lib/FortranFloat128Math/y1.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/y1.cpp
rename to flang-rt/lib/FortranFloat128Math/y1.cpp
index c9f48ea0e26546..5d7b48e276b6f9 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/y1.cpp
+++ b/flang-rt/lib/FortranFloat128Math/y1.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/y1.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/y1.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/Float128Math/yn.cpp b/flang-rt/lib/FortranFloat128Math/yn.cpp
similarity index 90%
rename from FortranRuntime/lib/Runtime/Float128Math/yn.cpp
rename to flang-rt/lib/FortranFloat128Math/yn.cpp
index 6bc5f4996a88d5..9f19861931d84c 100644
--- a/FortranRuntime/lib/Runtime/Float128Math/yn.cpp
+++ b/flang-rt/lib/FortranFloat128Math/yn.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/Float128Math/yn.cpp -------------------------*- C++ -*-===//
+//===-- lib/FortranFloat128Math/yn.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Testing/CMakeLists.txt b/flang-rt/lib/Testing/CMakeLists.txt
similarity index 89%
rename from FortranRuntime/lib/Testing/CMakeLists.txt
rename to flang-rt/lib/Testing/CMakeLists.txt
index 41ad0d7314dd37..bdfca0ee9d3f23 100644
--- a/FortranRuntime/lib/Testing/CMakeLists.txt
+++ b/flang-rt/lib/Testing/CMakeLists.txt
@@ -11,7 +11,7 @@ file(GLOB_RECURSE public_headers
   "${FLANG_SOURCE_DIR}/lib/Testing/*.h"
 )
 
-add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
+add_flangrt_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
   ${FLANG_SOURCE_DIR}/lib/Testing/testing.cpp
   ${FLANG_SOURCE_DIR}/lib/Testing/fp-testing.cpp
  ADDITIONAL_HEADERS
diff --git a/FortranRuntime/lib/Runtime/CMakeLists.txt b/flang-rt/lib/flang_rt/CMakeLists.txt
similarity index 66%
rename from FortranRuntime/lib/Runtime/CMakeLists.txt
rename to flang-rt/lib/flang_rt/CMakeLists.txt
index 1db5520d5eaedf..860152c39c7204 100644
--- a/FortranRuntime/lib/Runtime/CMakeLists.txt
+++ b/flang-rt/lib/flang_rt/CMakeLists.txt
@@ -1,4 +1,4 @@
-#===-- lib/Runtime/CMakeLists.txt ------------------------------------------===#
+#===-- lib/flang_rt/CMakeLists.txt -----------------------------------------===#
 #
 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 # See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 #
 #===------------------------------------------------------------------------===#
 
-include(AddFortranOffloadRuntime)
+include(AddFlangRTOffload)
 
 # List of files that are buildable for all devices.
 set(supported_sources
@@ -73,7 +73,7 @@ set(host_sources
   exceptions.cpp
   execute.cpp
   extensions.cpp
-  iso_fortran_env_impl.f90
+  ${FLANG_SOURCE_DIR}/module/iso_fortran_env_impl.f90
   main.cpp
   random.cpp
   reduce.cpp
@@ -84,18 +84,17 @@ set(host_sources
 )
 
 file(GLOB_RECURSE public_headers
-  "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Runtime/*.h"
-  "${FLANGRUNTIME_SOURCE_DIR}/include/flang/Common/*.h"
+  "${FLANGRT_SOURCE_DIR}/include/flang/Runtime/*.h"
+  "${FLANGRT_SOURCE_DIR}/include/flang/Common/*.h"
   )
 
 file(GLOB_RECURSE private_headers
-  "${FLANGRUNTIME_SOURCE_DIR}/lib/Runtime/*.h"
-  "${FLANGRUNTIME_SOURCE_DIR}/lib/Common/*.h"
+  "${FLANGRT_SOURCE_DIR}/lib/Runtime/*.h"
+  "${FLANGRT_SOURCE_DIR}/lib/Common/*.h"
   )
 
 
-add_subdirectory(Float128Math)
-
+# Import changes from sibling FortranFloat128Math
 get_target_property(f128_sources
   FortranFloat128MathILib INTERFACE_SOURCES
   )
@@ -117,23 +116,23 @@ endif ()
 set(sources ${supported_sources} ${host_sources} ${f128_sources})
 
 if (NOT WIN32)
-  add_fortranruntime_library(FortranRuntime STATIC
+  add_flangrt_library(flang_rt STATIC
     ${sources}
     INSTALL_WITH_TOOLCHAIN
     ADDITIONAL_HEADERS ${public_headers} ${private_headers}
   )
 
-  enable_cuda_compilation(FortranRuntime "${supported_sources}")
+  enable_cuda_compilation(flang_rt "${supported_sources}")
   enable_omp_offload_compilation("${supported_sources}")
 
-  # For unittests that link to FortranRuntime. Should link to the static version
+  # For unittests that depend on flang_rt. Should link to the static version
   # of the library.
-  add_library(FortranRuntime.static ALIAS FortranRuntime)
-  add_library(FortranRuntime.unittest ALIAS FortranRuntime)
+  add_library(flang_rt.static ALIAS flang_rt)
+  add_library(flang_rt.unittest ALIAS flang_rt)
 else()
-  function (add_win_fortranruntime_library libtype suffix msvc_lib)
-    set(name "FortranRuntime.${suffix}")
-    add_fortranruntime_library(${name} ${libtype}
+  function (add_win_flangrt_library libtype suffix msvc_lib)
+    set(name "flang_rt.${suffix}")
+    add_flangrt_library(${name} ${libtype}
         ${sources}
         ${ARGN}
         INSTALL_WITH_TOOLCHAIN
@@ -148,32 +147,28 @@ else()
           Fortran_MODULE_DIRECTORY "module.${suffix}"
       )
 
-    enable_cuda_compilation(FortranRuntime "${supported_sources}")
+    enable_cuda_compilation(${name} "${supported_sources}")
     enable_omp_offload_compilation("${supported_sources}")
   endfunction ()
 
-  add_win_fortranruntime_library(STATIC static     MultiThreaded)
-  add_win_fortranruntime_library(STATIC static_dbg MultiThreadedDebug)
+  add_win_flangrt_library(STATIC static     MultiThreaded)
+  add_win_flangrt_library(STATIC static_dbg MultiThreadedDebug)
 
   # unittests link against LLVMSupport which is compiled with /MD
-  add_win_fortranruntime_library(STATIC unittest   MultiThreadedDLL EXCLUDE_FROM_ALL)
+  add_win_flangrt_library(STATIC unittest   MultiThreadedDLL EXCLUDE_FROM_ALL)
 
   # FIXME: Before DLL versions of the runtime can be used, exported definitions
   # must be annotated with __declspec(dllexport).
-  add_win_fortranruntime_library(SHARED dynamic     MultiThreadedDLL)
-  add_win_fortranruntime_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
+  add_win_flangrt_library(SHARED dynamic     MultiThreadedDLL)
+  add_win_flangrt_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
 
   # Target for building all versions of the runtime
-  add_custom_target(FortranRuntime)
-  set_target_properties(FortranRuntime PROPERTIES FOLDER "Fortran Runtime/Meta")
-  add_dependencies(FortranRuntime
-      FortranRuntime.static
-      FortranRuntime.static_dbg
-      FortranRuntime.dynamic
-      FortranRuntime.dynamic_dbg
+  add_custom_target(flang_rt)
+  set_target_properties(flang_rt PROPERTIES FOLDER "Fortran Runtime/Meta")
+  add_dependencies(flang_rt
+      flang_rt.static
+      flang_rt.static_dbg
+      flang_rt.dynamic
+      flang_rt.dynamic_dbg
     )
 endif()
-
-if (FORTRANRUNTIME_ENABLE_CUF)
-  add_subdirectory(CUDA)
-endif()
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp b/flang-rt/lib/flang_rt/ISO_Fortran_binding.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
rename to flang-rt/lib/flang_rt/ISO_Fortran_binding.cpp
index 997226b08e96a6..37bc1b9dfe426b 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_binding.cpp
+++ b/flang-rt/lib/flang_rt/ISO_Fortran_binding.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/ISO_Fortran_binding.cpp ---------------------*- C++ -*-===//
+//===-- lib/flang_rt/ISO_Fortran_binding.cpp --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,9 +9,9 @@
 // Implements the required interoperability API from ISO_Fortran_binding.h
 // as specified in section 18.5.5 of Fortran 2018.
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
 #include "ISO_Fortran_util.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/pointer.h"
diff --git a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h b/flang-rt/lib/flang_rt/ISO_Fortran_util.h
similarity index 91%
rename from FortranRuntime/lib/Runtime/ISO_Fortran_util.h
rename to flang-rt/lib/flang_rt/ISO_Fortran_util.h
index e418266dddccc7..a7bb1d21679063 100644
--- a/FortranRuntime/lib/Runtime/ISO_Fortran_util.h
+++ b/flang-rt/lib/flang_rt/ISO_Fortran_util.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/ISO_Fortran_util.h --------------------------*- C++ -*-===//
+//===-- lib/flang_rt/ISO_Fortran_util.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_ISO_FORTRAN_UTIL_H_
-#define FORTRAN_RUNTIME_ISO_FORTRAN_UTIL_H_
+#ifndef FORTRAN_FLANG_RT_ISO_FORTRAN_UTIL_H_
+#define FORTRAN_FLANG_RT_ISO_FORTRAN_UTIL_H_
 
 // Internal utils for establishing CFI_cdesc_t descriptors.
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include <cstdlib>
@@ -99,4 +99,4 @@ static inline RT_API_ATTRS void EstablishDescriptor(CFI_cdesc_t *descriptor,
   }
 }
 } // namespace Fortran::ISO
-#endif /* FORTRAN_RUNTIME_ISO_FORTRAN_UTIL_H_ */
+#endif /* FORTRAN_FLANG_RT_ISO_FORTRAN_UTIL_H_ */
diff --git a/FortranRuntime/lib/Runtime/allocatable.cpp b/flang-rt/lib/flang_rt/allocatable.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/allocatable.cpp
rename to flang-rt/lib/flang_rt/allocatable.cpp
index 4a3b89f4879c12..b9be74f8cb6f1b 100644
--- a/FortranRuntime/lib/Runtime/allocatable.cpp
+++ b/flang-rt/lib/flang_rt/allocatable.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/allocatable.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/allocatable.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/allocatable.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "assign-impl.h"
 #include "derived.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "type-info.h"
diff --git a/FortranRuntime/lib/Runtime/allocator-registry.cpp b/flang-rt/lib/flang_rt/allocator-registry.cpp
similarity index 85%
rename from FortranRuntime/lib/Runtime/allocator-registry.cpp
rename to flang-rt/lib/flang_rt/allocator-registry.cpp
index 17883e5c54870d..a0e6fd8eadc856 100644
--- a/FortranRuntime/lib/Runtime/allocator-registry.cpp
+++ b/flang-rt/lib/flang_rt/allocator-registry.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/allocator-registry.cpp ----------------------*- C++ -*-===//
+//===-- lib/flang_rt/allocator-registry.cpp ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,16 +6,16 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/allocator-registry.h"
+#include "flang-rt/flang_rt/allocator-registry.h"
 #include "terminator.h"
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS AllocatorRegistry allocatorRegistry;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 RT_API_ATTRS void AllocatorRegistry::Register(int pos, Allocator_t allocator) {
diff --git a/FortranRuntime/lib/Runtime/array-constructor.cpp b/flang-rt/lib/flang_rt/array-constructor.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/array-constructor.cpp
rename to flang-rt/lib/flang_rt/array-constructor.cpp
index 002dfba2c066f5..daaa1e3b04a3b6 100644
--- a/FortranRuntime/lib/Runtime/array-constructor.cpp
+++ b/flang-rt/lib/flang_rt/array-constructor.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/array-constructor.cpp -----------------------*- C++ -*-===//
+//===-- lib/flang_rt/array-constructor.cpp ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/array-constructor.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/array-constructor.h"
 #include "derived.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
diff --git a/FortranRuntime/lib/Runtime/assign-impl.h b/flang-rt/lib/flang_rt/assign-impl.h
similarity index 100%
rename from FortranRuntime/lib/Runtime/assign-impl.h
rename to flang-rt/lib/flang_rt/assign-impl.h
diff --git a/FortranRuntime/lib/Runtime/assign.cpp b/flang-rt/lib/flang_rt/assign.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/assign.cpp
rename to flang-rt/lib/flang_rt/assign.cpp
index 3a1486ace928a2..4916fc48888189 100644
--- a/FortranRuntime/lib/Runtime/assign.cpp
+++ b/flang-rt/lib/flang_rt/assign.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/assign.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/assign.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/assign.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "assign-impl.h"
 #include "derived.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/buffer.cpp b/flang-rt/lib/flang_rt/buffer.cpp
similarity index 93%
rename from FortranRuntime/lib/Runtime/buffer.cpp
rename to flang-rt/lib/flang_rt/buffer.cpp
index ce78fe34503c46..9913cdf2e7ec40 100644
--- a/FortranRuntime/lib/Runtime/buffer.cpp
+++ b/flang-rt/lib/flang_rt/buffer.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/buffer.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/buffer.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/buffer.h b/flang-rt/lib/flang_rt/buffer.h
similarity index 97%
rename from FortranRuntime/lib/Runtime/buffer.h
rename to flang-rt/lib/flang_rt/buffer.h
index 52df0f10813c25..eb9b0712819a6c 100644
--- a/FortranRuntime/lib/Runtime/buffer.h
+++ b/flang-rt/lib/flang_rt/buffer.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/buffer.h ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/buffer.h -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,10 +8,10 @@
 
 // External file buffering
 
-#ifndef FORTRAN_RUNTIME_BUFFER_H_
-#define FORTRAN_RUNTIME_BUFFER_H_
+#ifndef FORTRAN_FLANG_RT_BUFFER_H_
+#define FORTRAN_FLANG_RT_BUFFER_H_
 
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "io-error.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include <algorithm>
@@ -221,4 +221,4 @@ template <typename STORE, std::size_t minBuffer = 65536> class FileFrame {
   bool dirty_{false};
 };
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_BUFFER_H_ */
+#endif /* FORTRAN_FLANG_RT_BUFFER_H_ */
diff --git a/FortranRuntime/lib/Runtime/character.cpp b/flang-rt/lib/flang_rt/character.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/character.cpp
rename to flang-rt/lib/flang_rt/character.cpp
index 1f3edd6e80392e..aeb26098c399c8 100644
--- a/FortranRuntime/lib/Runtime/character.cpp
+++ b/flang-rt/lib/flang_rt/character.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/character.cpp -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/character.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/character.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/bit-population-count.h"
diff --git a/FortranRuntime/lib/Runtime/command.cpp b/flang-rt/lib/flang_rt/command.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/command.cpp
rename to flang-rt/lib/flang_rt/command.cpp
index 64b2e62461dd58..5c7497518f3da3 100644
--- a/FortranRuntime/lib/Runtime/command.cpp
+++ b/flang-rt/lib/flang_rt/command.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/command.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/command.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/command.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "environment.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/complex-powi.cpp b/flang-rt/lib/flang_rt/complex-powi.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/complex-powi.cpp
rename to flang-rt/lib/flang_rt/complex-powi.cpp
index 2eacf56386b193..90013c117aea41 100644
--- a/FortranRuntime/lib/Runtime/complex-powi.cpp
+++ b/flang-rt/lib/flang_rt/complex-powi.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/complex-powi.cpp ----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/complex-powi.cpp ---------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/complex-reduction.c b/flang-rt/lib/flang_rt/complex-reduction.c
similarity index 98%
rename from FortranRuntime/lib/Runtime/complex-reduction.c
rename to flang-rt/lib/flang_rt/complex-reduction.c
index 138174e9122b1c..23f1edb58b2d4e 100644
--- a/FortranRuntime/lib/Runtime/complex-reduction.c
+++ b/flang-rt/lib/flang_rt/complex-reduction.c
@@ -1,4 +1,4 @@
-/*===-- lib/Runtime/complex-reduction.c -----------------------------*- C -*-===
+/*===-- lib/flang_rt/complex-reduction.c ----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/complex-reduction.h b/flang-rt/lib/flang_rt/complex-reduction.h
similarity index 97%
rename from FortranRuntime/lib/Runtime/complex-reduction.h
rename to flang-rt/lib/flang_rt/complex-reduction.h
index e8e287215b7d97..b386b25cd0fff8 100644
--- a/FortranRuntime/lib/Runtime/complex-reduction.h
+++ b/flang-rt/lib/flang_rt/complex-reduction.h
@@ -1,4 +1,4 @@
-/*===-- lib/Runtime/complex-reduction.h -----------------------------*- C -*-===
+/*===-- lib/flang_rt/complex-reduction.h ----------------------------*- C -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  * See https://llvm.org/LICENSE.txt for license information.
@@ -11,8 +11,8 @@
  * with C++ build compilers that don't support C's _Complex.
  */
 
-#ifndef FORTRAN_RUNTIME_COMPLEX_REDUCTION_H_
-#define FORTRAN_RUNTIME_COMPLEX_REDUCTION_H_
+#ifndef FORTRAN_FLANG_RT_COMPLEX_REDUCTION_H_
+#define FORTRAN_FLANG_RT_COMPLEX_REDUCTION_H_
 
 #include "flang/Common/float128.h"
 #include "flang/Runtime/entry-names.h"
@@ -155,4 +155,4 @@ void RTNAME(ReduceComplex16DimValue)(
     REDUCE_DIM_ARGS(CFloat128ComplexType, CFloat128ComplexType_value_op));
 #endif
 
-#endif /* FORTRAN_RUNTIME_COMPLEX_REDUCTION_H_ */
+#endif /* FORTRAN_FLANG_RT_COMPLEX_REDUCTION_H_ */
diff --git a/FortranRuntime/lib/Runtime/connection.cpp b/flang-rt/lib/flang_rt/connection.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/connection.cpp
rename to flang-rt/lib/flang_rt/connection.cpp
index f9e91f1f193ba0..d623190f22f6f9 100644
--- a/FortranRuntime/lib/Runtime/connection.cpp
+++ b/flang-rt/lib/flang_rt/connection.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/connection.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/connection.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/connection.h b/flang-rt/lib/flang_rt/connection.h
similarity index 96%
rename from FortranRuntime/lib/Runtime/connection.h
rename to flang-rt/lib/flang_rt/connection.h
index e078bfb9f0f7e7..f8b9b3f9debcda 100644
--- a/FortranRuntime/lib/Runtime/connection.h
+++ b/flang-rt/lib/flang_rt/connection.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/connection.h --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/connection.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Fortran I/O connection state (abstracted over internal & external units)
 
-#ifndef FORTRAN_RUNTIME_CONNECTION_H_
-#define FORTRAN_RUNTIME_CONNECTION_H_
+#ifndef FORTRAN_FLANG_RT_CONNECTION_H_
+#define FORTRAN_FLANG_RT_CONNECTION_H_
 
 #include "format.h"
 #include "flang/Common/optional.h"
@@ -124,4 +124,4 @@ class SavedPosition {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_CONNECTION_H_ */
+#endif /* FORTRAN_FLANG_RT_CONNECTION_H_ */
diff --git a/FortranRuntime/lib/Runtime/copy.cpp b/flang-rt/lib/flang_rt/copy.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/copy.cpp
rename to flang-rt/lib/flang_rt/copy.cpp
index 1049b925f68e5c..fc5c0af6b95851 100644
--- a/FortranRuntime/lib/Runtime/copy.cpp
+++ b/flang-rt/lib/flang_rt/copy.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/copy.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/copy.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "copy.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stack.h"
 #include "terminator.h"
 #include "type-info.h"
diff --git a/FortranRuntime/lib/Runtime/copy.h b/flang-rt/lib/flang_rt/copy.h
similarity index 78%
rename from FortranRuntime/lib/Runtime/copy.h
rename to flang-rt/lib/flang_rt/copy.h
index 3d179d0bec91a7..8f27c3a90b7847 100644
--- a/FortranRuntime/lib/Runtime/copy.h
+++ b/flang-rt/lib/flang_rt/copy.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/copy.h --------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/copy.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,10 +9,10 @@
 // Utilities that copy data in a type-aware fashion, allocating & duplicating
 // allocatable/automatic components of derived types along the way.
 
-#ifndef FORTRAN_RUNTIME_COPY_H_
-#define FORTRAN_RUNTIME_COPY_H_
+#ifndef FORTRAN_FLANG_RT_COPY_H_
+#define FORTRAN_FLANG_RT_COPY_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 
 namespace Fortran::runtime {
 
@@ -22,4 +22,4 @@ RT_API_ATTRS void CopyElement(const Descriptor &to, const SubscriptValue toAt[],
     const Descriptor &from, const SubscriptValue fromAt[], Terminator &);
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_COPY_H_ */
+#endif /* FORTRAN_FLANG_RT_COPY_H_ */
diff --git a/FortranRuntime/lib/Runtime/derived-api.cpp b/flang-rt/lib/flang_rt/derived-api.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/derived-api.cpp
rename to flang-rt/lib/flang_rt/derived-api.cpp
index 176fc0849f25cf..faf24508981bae 100644
--- a/FortranRuntime/lib/Runtime/derived-api.cpp
+++ b/flang-rt/lib/flang_rt/derived-api.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/derived-api.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/derived-api.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/derived-api.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "derived.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "type-info.h"
diff --git a/FortranRuntime/lib/Runtime/derived.cpp b/flang-rt/lib/flang_rt/derived.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/derived.cpp
rename to flang-rt/lib/flang_rt/derived.cpp
index cb2dca24bb4758..9b17a0d437375c 100644
--- a/FortranRuntime/lib/Runtime/derived.cpp
+++ b/flang-rt/lib/flang_rt/derived.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/derived.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/derived.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "derived.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/derived.h b/flang-rt/lib/flang_rt/derived.h
similarity index 88%
rename from FortranRuntime/lib/Runtime/derived.h
rename to flang-rt/lib/flang_rt/derived.h
index e03e657f01cee9..3d6563f39c0663 100644
--- a/FortranRuntime/lib/Runtime/derived.h
+++ b/flang-rt/lib/flang_rt/derived.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/derived.h -----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/derived.h ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Internal runtime utilities for derived type operations.
 
-#ifndef FORTRAN_RUNTIME_DERIVED_H_
-#define FORTRAN_RUNTIME_DERIVED_H_
+#ifndef FORTRAN_FLANG_RT_DERIVED_H_
+#define FORTRAN_FLANG_RT_DERIVED_H_
 
 #include "flang/Common/api-attrs.h"
 
@@ -40,4 +40,4 @@ RT_API_ATTRS void Destroy(const Descriptor &, bool finalize,
 RT_API_ATTRS bool HasDynamicComponent(const Descriptor &);
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_DERIVED_H_ */
+#endif /* FORTRAN_FLANG_RT_DERIVED_H_ */
diff --git a/FortranRuntime/lib/Runtime/descriptor-io.cpp b/flang-rt/lib/flang_rt/descriptor-io.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/descriptor-io.cpp
rename to flang-rt/lib/flang_rt/descriptor-io.cpp
index 896fad16a67e8a..c5cfa4d7fc5972 100644
--- a/FortranRuntime/lib/Runtime/descriptor-io.cpp
+++ b/flang-rt/lib/flang_rt/descriptor-io.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/descriptor-io.cpp ---------------------------*- C++ -*-===//
+//===-- lib/flang_rt/descriptor-io.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/descriptor-io.h b/flang-rt/lib/flang_rt/descriptor-io.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/descriptor-io.h
rename to flang-rt/lib/flang_rt/descriptor-io.h
index 30d1bd48457728..2e48b4a0353e2a 100644
--- a/FortranRuntime/lib/Runtime/descriptor-io.h
+++ b/flang-rt/lib/flang_rt/descriptor-io.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/descriptor-io.h -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/descriptor-io.h ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,17 +6,17 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_DESCRIPTOR_IO_H_
-#define FORTRAN_RUNTIME_DESCRIPTOR_IO_H_
+#ifndef FORTRAN_FLANG_RT_DESCRIPTOR_IO_H_
+#define FORTRAN_FLANG_RT_DESCRIPTOR_IO_H_
 
 // Implementation of I/O data list item transfers based on descriptors.
 // (All I/O items come through here so that the code is exercised for test;
 // some scalar I/O data transfer APIs could be changed to bypass their use
 // of descriptors in the future for better efficiency.)
 
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "edit-input.h"
 #include "edit-output.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "io-stmt.h"
 #include "namelist.h"
 #include "terminator.h"
@@ -608,4 +608,4 @@ static RT_API_ATTRS bool DescriptorIO(IoStatementState &io,
   return false;
 }
 } // namespace Fortran::runtime::io::descr
-#endif /* FORTRAN_RUNTIME_DESCRIPTOR_IO_H_ */
+#endif /* FORTRAN_FLANG_RT_DESCRIPTOR_IO_H_ */
diff --git a/FortranRuntime/lib/Runtime/descriptor.cpp b/flang-rt/lib/flang_rt/descriptor.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/descriptor.cpp
rename to flang-rt/lib/flang_rt/descriptor.cpp
index 96fd48eb6687a9..77536e760ad1cd 100644
--- a/FortranRuntime/lib/Runtime/descriptor.cpp
+++ b/flang-rt/lib/flang_rt/descriptor.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/descriptor.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/descriptor.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/allocator-registry.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "ISO_Fortran_util.h"
 #include "derived.h"
+#include "flang-rt/flang_rt/allocator-registry.h"
 #include "memory.h"
 #include "stat.h"
 #include "terminator.h"
diff --git a/FortranRuntime/lib/Runtime/dot-product.cpp b/flang-rt/lib/flang_rt/dot-product.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/dot-product.cpp
rename to flang-rt/lib/flang_rt/dot-product.cpp
index 2992cbb1f39ad6..01e15ad331d7c4 100644
--- a/FortranRuntime/lib/Runtime/dot-product.cpp
+++ b/flang-rt/lib/flang_rt/dot-product.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/dot-product.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/dot-product.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "float.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/edit-input.cpp b/flang-rt/lib/flang_rt/edit-input.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/edit-input.cpp
rename to flang-rt/lib/flang_rt/edit-input.cpp
index 6ebb0e7aca4ade..9e3f102cf86684 100644
--- a/FortranRuntime/lib/Runtime/edit-input.cpp
+++ b/flang-rt/lib/flang_rt/edit-input.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/edit-input.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/edit-input.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/edit-input.h b/flang-rt/lib/flang_rt/edit-input.h
similarity index 90%
rename from FortranRuntime/lib/Runtime/edit-input.h
rename to flang-rt/lib/flang_rt/edit-input.h
index f88f6daa47be79..59f601afa306a3 100644
--- a/FortranRuntime/lib/Runtime/edit-input.h
+++ b/flang-rt/lib/flang_rt/edit-input.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/edit-input.h --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/edit-input.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_EDIT_INPUT_H_
-#define FORTRAN_RUNTIME_EDIT_INPUT_H_
+#ifndef FORTRAN_FLANG_RT_EDIT_INPUT_H_
+#define FORTRAN_FLANG_RT_EDIT_INPUT_H_
 
 #include "format.h"
 #include "io-stmt.h"
@@ -50,4 +50,4 @@ extern template RT_API_ATTRS bool EditCharacterInput(
     IoStatementState &, const DataEdit &, char32_t *, std::size_t);
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_EDIT_INPUT_H_ */
+#endif /* FORTRAN_FLANG_RT_EDIT_INPUT_H_ */
diff --git a/FortranRuntime/lib/Runtime/edit-output.cpp b/flang-rt/lib/flang_rt/edit-output.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/edit-output.cpp
rename to flang-rt/lib/flang_rt/edit-output.cpp
index ccaf8085f016fd..2e353f1ad80a21 100644
--- a/FortranRuntime/lib/Runtime/edit-output.cpp
+++ b/flang-rt/lib/flang_rt/edit-output.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/edit-output.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/edit-output.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/edit-output.h b/flang-rt/lib/flang_rt/edit-output.h
similarity index 96%
rename from FortranRuntime/lib/Runtime/edit-output.h
rename to flang-rt/lib/flang_rt/edit-output.h
index 7e6c6cdedde3ac..325658b4a25dc6 100644
--- a/FortranRuntime/lib/Runtime/edit-output.h
+++ b/flang-rt/lib/flang_rt/edit-output.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/edit-output.h -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/edit-output.h ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_EDIT_OUTPUT_H_
-#define FORTRAN_RUNTIME_EDIT_OUTPUT_H_
+#ifndef FORTRAN_FLANG_RT_EDIT_OUTPUT_H_
+#define FORTRAN_FLANG_RT_EDIT_OUTPUT_H_
 
 // Output data editing templates implementing the FORMAT data editing
 // descriptors E, EN, ES, EX, D, F, and G for REAL data (and COMPLEX
@@ -138,4 +138,4 @@ extern template class RealOutputEditing<10>;
 extern template class RealOutputEditing<16>;
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_EDIT_OUTPUT_H_ */
+#endif /* FORTRAN_FLANG_RT_EDIT_OUTPUT_H_ */
diff --git a/FortranRuntime/lib/Runtime/emit-encoded.h b/flang-rt/lib/flang_rt/emit-encoded.h
similarity index 94%
rename from FortranRuntime/lib/Runtime/emit-encoded.h
rename to flang-rt/lib/flang_rt/emit-encoded.h
index 11163a41720795..87216e5808a286 100644
--- a/FortranRuntime/lib/Runtime/emit-encoded.h
+++ b/flang-rt/lib/flang_rt/emit-encoded.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/emit-encoded.h ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/emit-encoded.h -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Templates for emitting CHARACTER values with conversion
 
-#ifndef FORTRAN_RUNTIME_EMIT_ENCODED_H_
-#define FORTRAN_RUNTIME_EMIT_ENCODED_H_
+#ifndef FORTRAN_FLANG_RT_EMIT_ENCODED_H_
+#define FORTRAN_FLANG_RT_EMIT_ENCODED_H_
 
 #include "connection.h"
 #include "environment.h"
@@ -114,4 +114,4 @@ RT_API_ATTRS bool EmitRepeated(CONTEXT &to, char ch, std::size_t n) {
 }
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_EMIT_ENCODED_H_ */
+#endif /* FORTRAN_FLANG_RT_EMIT_ENCODED_H_ */
diff --git a/FortranRuntime/lib/Runtime/environment-default-list.h b/flang-rt/lib/flang_rt/environment-default-list.h
similarity index 100%
rename from FortranRuntime/lib/Runtime/environment-default-list.h
rename to flang-rt/lib/flang_rt/environment-default-list.h
diff --git a/FortranRuntime/lib/Runtime/environment.cpp b/flang-rt/lib/flang_rt/environment.cpp
similarity index 96%
rename from FortranRuntime/lib/Runtime/environment.cpp
rename to flang-rt/lib/flang_rt/environment.cpp
index 272914877988a5..a9447815efeeaf 100644
--- a/FortranRuntime/lib/Runtime/environment.cpp
+++ b/flang-rt/lib/flang_rt/environment.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/environment.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/environment.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -23,11 +23,11 @@ extern char **environ;
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExecutionEnvironment executionEnvironment;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
 
 static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) {
   if (!envDefaults) {
diff --git a/FortranRuntime/lib/Runtime/environment.h b/flang-rt/lib/flang_rt/environment.h
similarity index 91%
rename from FortranRuntime/lib/Runtime/environment.h
rename to flang-rt/lib/flang_rt/environment.h
index 7d10b3a2b934bf..125c9b39528b94 100644
--- a/FortranRuntime/lib/Runtime/environment.h
+++ b/flang-rt/lib/flang_rt/environment.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/environment.h -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/environment.h ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_ENVIRONMENT_H_
-#define FORTRAN_RUNTIME_ENVIRONMENT_H_
+#ifndef FORTRAN_FLANG_RT_ENVIRONMENT_H_
+#define FORTRAN_FLANG_RT_ENVIRONMENT_H_
 
 #include "flang/Common/decimal.h"
 #include "flang/Common/optional.h"
@@ -64,4 +64,4 @@ RT_OFFLOAD_VAR_GROUP_END
 
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_ENVIRONMENT_H_ */
+#endif /* FORTRAN_FLANG_RT_ENVIRONMENT_H_ */
diff --git a/FortranRuntime/lib/Runtime/exceptions.cpp b/flang-rt/lib/flang_rt/exceptions.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/exceptions.cpp
rename to flang-rt/lib/flang_rt/exceptions.cpp
index 7739130ae2346a..9ad5fe6849b076 100644
--- a/FortranRuntime/lib/Runtime/exceptions.cpp
+++ b/flang-rt/lib/flang_rt/exceptions.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/exceptions.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/exceptions.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/execute.cpp b/flang-rt/lib/flang_rt/execute.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/execute.cpp
rename to flang-rt/lib/flang_rt/execute.cpp
index b333c61c8a59f4..d3d42a49737fed 100644
--- a/FortranRuntime/lib/Runtime/execute.cpp
+++ b/flang-rt/lib/flang_rt/execute.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/execute.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/execute.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/execute.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "environment.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "stat.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/extensions.cpp b/flang-rt/lib/flang_rt/extensions.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/extensions.cpp
rename to flang-rt/lib/flang_rt/extensions.cpp
index bb25fe6ee9d886..4cd9791cd0e5cb 100644
--- a/FortranRuntime/lib/Runtime/extensions.cpp
+++ b/flang-rt/lib/flang_rt/extensions.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/extensions.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/extensions.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
 // extensions that will eventually be implemented in Fortran.
 
 #include "flang/Runtime/extensions.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Runtime/command.h"
diff --git a/FortranRuntime/lib/Runtime/external-unit.cpp b/flang-rt/lib/flang_rt/external-unit.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/external-unit.cpp
rename to flang-rt/lib/flang_rt/external-unit.cpp
index f5fa2c31dafc4e..1942cc1ff4daec 100644
--- a/FortranRuntime/lib/Runtime/external-unit.cpp
+++ b/flang-rt/lib/flang_rt/external-unit.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/external-unit.cpp ---------------------------*- C++ -*-===//
+//===-- lib/flang_rt/external-unit.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/extrema.cpp b/flang-rt/lib/flang_rt/extrema.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/extrema.cpp
rename to flang-rt/lib/flang_rt/extrema.cpp
index be9da63d7bd6b8..7a230afc4190c6 100644
--- a/FortranRuntime/lib/Runtime/extrema.cpp
+++ b/flang-rt/lib/flang_rt/extrema.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/extrema.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/extrema.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/file.cpp b/flang-rt/lib/flang_rt/file.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/file.cpp
rename to flang-rt/lib/flang_rt/file.cpp
index de52dafd12df9a..d98c8afeca3514 100644
--- a/FortranRuntime/lib/Runtime/file.cpp
+++ b/flang-rt/lib/flang_rt/file.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/file.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/file.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "file.h"
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "tools.h"
 #include "flang/Runtime/magic-numbers.h"
 #include <algorithm>
diff --git a/FortranRuntime/lib/Runtime/file.h b/flang-rt/lib/flang_rt/file.h
similarity index 94%
rename from FortranRuntime/lib/Runtime/file.h
rename to flang-rt/lib/flang_rt/file.h
index 60ddf2a2741610..b4068e3dce0d14 100644
--- a/FortranRuntime/lib/Runtime/file.h
+++ b/flang-rt/lib/flang_rt/file.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/file.h --------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/file.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,10 +8,10 @@
 
 // Raw system I/O wrappers
 
-#ifndef FORTRAN_RUNTIME_FILE_H_
-#define FORTRAN_RUNTIME_FILE_H_
+#ifndef FORTRAN_FLANG_RT_FILE_H_
+#define FORTRAN_FLANG_RT_FILE_H_
 
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "io-error.h"
 #include "flang/Common/optional.h"
 #include <cinttypes>
@@ -113,4 +113,4 @@ RT_API_ATTRS bool MayWrite(const char *path);
 RT_API_ATTRS bool MayReadAndWrite(const char *path);
 RT_API_ATTRS std::int64_t SizeInBytes(const char *path);
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_FILE_H_ */
+#endif /* FORTRAN_FLANG_RT_FILE_H_ */
diff --git a/FortranRuntime/lib/Runtime/findloc.cpp b/flang-rt/lib/flang_rt/findloc.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/findloc.cpp
rename to flang-rt/lib/flang_rt/findloc.cpp
index da5fe0c0a0a467..8ee4c7c6cf7800 100644
--- a/FortranRuntime/lib/Runtime/findloc.cpp
+++ b/flang-rt/lib/flang_rt/findloc.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/findloc.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/findloc.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/format-implementation.h b/flang-rt/lib/flang_rt/format-implementation.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/format-implementation.h
rename to flang-rt/lib/flang_rt/format-implementation.h
index f17f0a2cb4bfd9..9b7ad6f2ce1fc6 100644
--- a/FortranRuntime/lib/Runtime/format-implementation.h
+++ b/flang-rt/lib/flang_rt/format-implementation.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/format-implementation.h ---------------------*- C++ -*-===//
+//===-- lib/flang_rt/format-implementation.h --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Implements out-of-line member functions of template class FormatControl
 
-#ifndef FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_
-#define FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_
+#ifndef FORTRAN_FLANG_RT_FORMAT_IMPLEMENTATION_H_
+#define FORTRAN_FLANG_RT_FORMAT_IMPLEMENTATION_H_
 
 #include "emit-encoded.h"
 #include "format.h"
@@ -601,4 +601,4 @@ RT_API_ATTRS void FormatControl<CONTEXT>::Finish(Context &context) {
   }
 }
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_FORMAT_IMPLEMENTATION_H_ */
+#endif /* FORTRAN_FLANG_RT_FORMAT_IMPLEMENTATION_H_ */
diff --git a/FortranRuntime/lib/Runtime/format.cpp b/flang-rt/lib/flang_rt/format.cpp
similarity index 93%
rename from FortranRuntime/lib/Runtime/format.cpp
rename to flang-rt/lib/flang_rt/format.cpp
index 73a61f785c23b8..aedf04b8a40a1b 100644
--- a/FortranRuntime/lib/Runtime/format.cpp
+++ b/flang-rt/lib/flang_rt/format.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/format.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/format.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/format.h b/flang-rt/lib/flang_rt/format.h
similarity index 97%
rename from FortranRuntime/lib/Runtime/format.h
rename to flang-rt/lib/flang_rt/format.h
index 098a251a04d568..b41eec9564baaa 100644
--- a/FortranRuntime/lib/Runtime/format.h
+++ b/flang-rt/lib/flang_rt/format.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/format.h ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/format.h -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // FORMAT string processing
 
-#ifndef FORTRAN_RUNTIME_FORMAT_H_
-#define FORTRAN_RUNTIME_FORMAT_H_
+#ifndef FORTRAN_FLANG_RT_FORMAT_H_
+#define FORTRAN_FLANG_RT_FORMAT_H_
 
 #include "environment.h"
 #include "io-error.h"
@@ -201,4 +201,4 @@ template <typename CONTEXT> class FormatControl {
   Iteration stack_[maxMaxHeight];
 };
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_FORMAT_H_ */
+#endif /* FORTRAN_FLANG_RT_FORMAT_H_ */
diff --git a/FortranRuntime/lib/Runtime/inquiry.cpp b/flang-rt/lib/flang_rt/inquiry.cpp
similarity index 96%
rename from FortranRuntime/lib/Runtime/inquiry.cpp
rename to flang-rt/lib/flang_rt/inquiry.cpp
index c24492754b4f43..b29ab4ee3c6663 100644
--- a/FortranRuntime/lib/Runtime/inquiry.cpp
+++ b/flang-rt/lib/flang_rt/inquiry.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/inquiry.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/inquiry.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
 // inquire about shape information of arrays -- LBOUND and SIZE.
 
 #include "flang/Runtime/inquiry.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "copy.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include <algorithm>
diff --git a/FortranRuntime/lib/Runtime/internal-unit.cpp b/flang-rt/lib/flang_rt/internal-unit.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/internal-unit.cpp
rename to flang-rt/lib/flang_rt/internal-unit.cpp
index 4494de9dddc1a1..7775ded1e86d57 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.cpp
+++ b/flang-rt/lib/flang_rt/internal-unit.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/internal-unit.cpp ---------------------------*- C++ -*-===//
+//===-- lib/flang_rt/internal-unit.cpp --------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "internal-unit.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "io-error.h"
 #include "flang/Runtime/freestanding-tools.h"
 #include <algorithm>
diff --git a/FortranRuntime/lib/Runtime/internal-unit.h b/flang-rt/lib/flang_rt/internal-unit.h
similarity index 89%
rename from FortranRuntime/lib/Runtime/internal-unit.h
rename to flang-rt/lib/flang_rt/internal-unit.h
index 7579016f14646d..2f7d0220b84b37 100644
--- a/FortranRuntime/lib/Runtime/internal-unit.h
+++ b/flang-rt/lib/flang_rt/internal-unit.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/internal-unit.h -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/internal-unit.h ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,11 +8,11 @@
 
 // Fortran internal I/O "units"
 
-#ifndef FORTRAN_RUNTIME_INTERNAL_UNIT_H_
-#define FORTRAN_RUNTIME_INTERNAL_UNIT_H_
+#ifndef FORTRAN_FLANG_RT_INTERNAL_UNIT_H_
+#define FORTRAN_FLANG_RT_INTERNAL_UNIT_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "connection.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include <cinttypes>
 #include <type_traits>
 
@@ -56,4 +56,4 @@ template <Direction DIR> class InternalDescriptorUnit : public ConnectionState {
 extern template class InternalDescriptorUnit<Direction::Output>;
 extern template class InternalDescriptorUnit<Direction::Input>;
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_INTERNAL_UNIT_H_ */
+#endif /* FORTRAN_FLANG_RT_INTERNAL_UNIT_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-api-common.h b/flang-rt/lib/flang_rt/io-api-common.h
similarity index 92%
rename from FortranRuntime/lib/Runtime/io-api-common.h
rename to flang-rt/lib/flang_rt/io-api-common.h
index fed1d11d6ce6a6..5ff1b57c73cda6 100644
--- a/FortranRuntime/lib/Runtime/io-api-common.h
+++ b/flang-rt/lib/flang_rt/io-api-common.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-api-common.h -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-api-common.h ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_IO_API_COMMON_H_
-#define FORTRAN_RUNTIME_IO_API_COMMON_H_
+#ifndef FORTRAN_FLANG_RT_IO_API_COMMON_H_
+#define FORTRAN_FLANG_RT_IO_API_COMMON_H_
 
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "io-stmt.h"
 #include "terminator.h"
 #include "unit.h"
@@ -94,4 +94,4 @@ RT_API_ATTRS Cookie BeginExternalListIO(
 }
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IO_API_COMMON_H_ */
+#endif /* FORTRAN_FLANG_RT_IO_API_COMMON_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-api-minimal.cpp b/flang-rt/lib/flang_rt/io-api-minimal.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/io-api-minimal.cpp
rename to flang-rt/lib/flang_rt/io-api-minimal.cpp
index 8cde2333804572..92524430650126 100644
--- a/FortranRuntime/lib/Runtime/io-api-minimal.cpp
+++ b/flang-rt/lib/flang_rt/io-api-minimal.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-api-minimal.cpp --------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-api-minimal.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,8 +9,8 @@
 // Implements the subset of the I/O statement API needed for basic
 // list-directed output (PRINT *) of intrinsic types.
 
-#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "edit-output.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
diff --git a/FortranRuntime/lib/Runtime/io-api.cpp b/flang-rt/lib/flang_rt/io-api.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/io-api.cpp
rename to flang-rt/lib/flang_rt/io-api.cpp
index fa95d68a004b51..0de1e24f71dac5 100644
--- a/FortranRuntime/lib/Runtime/io-api.cpp
+++ b/flang-rt/lib/flang_rt/io-api.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-api.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-api.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -13,13 +13,13 @@
 // OutputReal{32,64}, OutputComplex{32,64}, OutputAscii, & EndIoStatement()
 // are in runtime/io-api-minimal.cpp.
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
-#include "FortranRuntime/Runtime/memory.h"
 #include "descriptor-io.h"
 #include "edit-input.h"
 #include "edit-output.h"
 #include "environment.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "format.h"
 #include "io-api-common.h"
 #include "io-stmt.h"
diff --git a/FortranRuntime/lib/Runtime/io-error.cpp b/flang-rt/lib/flang_rt/io-error.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/io-error.cpp
rename to flang-rt/lib/flang_rt/io-error.cpp
index 053667462058de..215c839d98cc35 100644
--- a/FortranRuntime/lib/Runtime/io-error.cpp
+++ b/flang-rt/lib/flang_rt/io-error.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-error.cpp --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-error.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/io-error.h b/flang-rt/lib/flang_rt/io-error.h
similarity index 90%
rename from FortranRuntime/lib/Runtime/io-error.h
rename to flang-rt/lib/flang_rt/io-error.h
index e2018cc2ea0ab1..7798d0830a1323 100644
--- a/FortranRuntime/lib/Runtime/io-error.h
+++ b/flang-rt/lib/flang_rt/io-error.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-error.h ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-error.h ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,11 +12,11 @@
 // IOSTAT error codes are raw errno values augmented with values for
 // Fortran-specific errors.
 
-#ifndef FORTRAN_RUNTIME_IO_ERROR_H_
-#define FORTRAN_RUNTIME_IO_ERROR_H_
+#ifndef FORTRAN_FLANG_RT_IO_ERROR_H_
+#define FORTRAN_FLANG_RT_IO_ERROR_H_
 
-#include "FortranRuntime/Runtime/iostat-funcs.h"
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/iostat-funcs.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "terminator.h"
 #include <cinttypes>
 
@@ -78,4 +78,4 @@ class IoErrorHandler : public Terminator {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IO_ERROR_H_ */
+#endif /* FORTRAN_FLANG_RT_IO_ERROR_H_ */
diff --git a/FortranRuntime/lib/Runtime/io-stmt.cpp b/flang-rt/lib/flang_rt/io-stmt.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/io-stmt.cpp
rename to flang-rt/lib/flang_rt/io-stmt.cpp
index fe02e221671665..7c243a8c934a7a 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.cpp
+++ b/flang-rt/lib/flang_rt/io-stmt.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-stmt.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-stmt.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "io-stmt.h"
-#include "FortranRuntime/Runtime/memory.h"
 #include "connection.h"
 #include "emit-encoded.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "format.h"
 #include "tools.h"
 #include "unit.h"
diff --git a/FortranRuntime/lib/Runtime/io-stmt.h b/flang-rt/lib/flang_rt/io-stmt.h
similarity index 99%
rename from FortranRuntime/lib/Runtime/io-stmt.h
rename to flang-rt/lib/flang_rt/io-stmt.h
index 21746ff1966218..78bc42502be687 100644
--- a/FortranRuntime/lib/Runtime/io-stmt.h
+++ b/flang-rt/lib/flang_rt/io-stmt.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/io-stmt.h -----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/io-stmt.h ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,13 +8,13 @@
 
 // Representations of the state of an I/O statement in progress
 
-#ifndef FORTRAN_RUNTIME_IO_STMT_H_
-#define FORTRAN_RUNTIME_IO_STMT_H_
+#ifndef FORTRAN_FLANG_RT_IO_STMT_H_
+#define FORTRAN_FLANG_RT_IO_STMT_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "connection.h"
 #include "file.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "format.h"
 #include "internal-unit.h"
 #include "io-error.h"
@@ -789,4 +789,4 @@ class ErroneousIoStatementState : public IoStatementBase {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_IO_STMT_H_ */
+#endif /* FORTRAN_FLANG_RT_IO_STMT_H_ */
diff --git a/FortranRuntime/lib/Runtime/iostat.cpp b/flang-rt/lib/flang_rt/iostat.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/iostat.cpp
rename to flang-rt/lib/flang_rt/iostat.cpp
index 8d769a09252fd6..39f4474dcf7229 100644
--- a/FortranRuntime/lib/Runtime/iostat.cpp
+++ b/flang-rt/lib/flang_rt/iostat.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/iostat.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/iostat.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/iostat-funcs.h"
+#include "flang-rt/flang_rt/iostat-funcs.h"
 
 namespace Fortran::runtime::io {
 RT_OFFLOAD_API_GROUP_BEGIN
diff --git a/FortranRuntime/lib/Runtime/lock.h b/flang-rt/lib/flang_rt/lock.h
similarity index 94%
rename from FortranRuntime/lib/Runtime/lock.h
rename to flang-rt/lib/flang_rt/lock.h
index 69ff6403736dae..955059a711c47d 100644
--- a/FortranRuntime/lib/Runtime/lock.h
+++ b/flang-rt/lib/flang_rt/lock.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/lock.h --------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/lock.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Wraps a mutex
 
-#ifndef FORTRAN_RUNTIME_LOCK_H_
-#define FORTRAN_RUNTIME_LOCK_H_
+#ifndef FORTRAN_FLANG_RT_LOCK_H_
+#define FORTRAN_FLANG_RT_LOCK_H_
 
 #include "terminator.h"
 #include "tools.h"
@@ -113,4 +113,4 @@ class CriticalSection {
 };
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_LOCK_H_ */
+#endif /* FORTRAN_FLANG_RT_LOCK_H_ */
diff --git a/FortranRuntime/lib/Runtime/main.cpp b/flang-rt/lib/flang_rt/main.cpp
similarity index 95%
rename from FortranRuntime/lib/Runtime/main.cpp
rename to flang-rt/lib/flang_rt/main.cpp
index 3fe985e524548d..71ed7f8319f60f 100644
--- a/FortranRuntime/lib/Runtime/main.cpp
+++ b/flang-rt/lib/flang_rt/main.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/main.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/main.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/matmul-transpose.cpp b/flang-rt/lib/flang_rt/matmul-transpose.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/matmul-transpose.cpp
rename to flang-rt/lib/flang_rt/matmul-transpose.cpp
index ec5388e3fca793..2c7c4a89117f04 100644
--- a/FortranRuntime/lib/Runtime/matmul-transpose.cpp
+++ b/flang-rt/lib/flang_rt/matmul-transpose.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/matmul-transpose.cpp ------------------------*- C++ -*-===//
+//===-- lib/flang_rt/matmul-transpose.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -21,7 +21,7 @@
 // to use the faster BLAS routines.
 
 #include "flang/Runtime/matmul-transpose.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/optional.h"
diff --git a/FortranRuntime/lib/Runtime/matmul.cpp b/flang-rt/lib/flang_rt/matmul.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/matmul.cpp
rename to flang-rt/lib/flang_rt/matmul.cpp
index 01be7f7c75bc45..8157911f34fd38 100644
--- a/FortranRuntime/lib/Runtime/matmul.cpp
+++ b/flang-rt/lib/flang_rt/matmul.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/matmul.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/matmul.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -20,7 +20,7 @@
 // Places where BLAS routines could be called are marked as TODO items.
 
 #include "flang/Runtime/matmul.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/optional.h"
diff --git a/FortranRuntime/lib/Runtime/memory.cpp b/flang-rt/lib/flang_rt/memory.cpp
similarity index 92%
rename from FortranRuntime/lib/Runtime/memory.cpp
rename to flang-rt/lib/flang_rt/memory.cpp
index a4cebf7edc6c64..66aa5be0cddc60 100644
--- a/FortranRuntime/lib/Runtime/memory.cpp
+++ b/flang-rt/lib/flang_rt/memory.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/memory.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/memory.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Runtime/freestanding-tools.h"
diff --git a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp b/flang-rt/lib/flang_rt/misc-intrinsic.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/misc-intrinsic.cpp
rename to flang-rt/lib/flang_rt/misc-intrinsic.cpp
index 91a3b136e009a5..00098c5b4e20b0 100644
--- a/FortranRuntime/lib/Runtime/misc-intrinsic.cpp
+++ b/flang-rt/lib/flang_rt/misc-intrinsic.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/misc-intrinsic.cpp --------------------------*- C++ -*-===//
+//===-- lib/flang_rt/misc-intrinsic.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/misc-intrinsic.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/optional.h"
diff --git a/FortranRuntime/lib/Runtime/namelist.cpp b/flang-rt/lib/flang_rt/namelist.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/namelist.cpp
rename to flang-rt/lib/flang_rt/namelist.cpp
index 46036549bcd316..92dbd33b7f9609 100644
--- a/FortranRuntime/lib/Runtime/namelist.cpp
+++ b/flang-rt/lib/flang_rt/namelist.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/namelist.cpp --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/namelist.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "namelist.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
 #include "descriptor-io.h"
 #include "emit-encoded.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "io-stmt.h"
 #include <algorithm>
 #include <cstring>
diff --git a/FortranRuntime/lib/Runtime/namelist.h b/flang-rt/lib/flang_rt/namelist.h
similarity index 91%
rename from FortranRuntime/lib/Runtime/namelist.h
rename to flang-rt/lib/flang_rt/namelist.h
index 04432f8a08cb97..519ec5dd2ddbc5 100644
--- a/FortranRuntime/lib/Runtime/namelist.h
+++ b/flang-rt/lib/flang_rt/namelist.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/namelist.h ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/namelist.h ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Defines the data structure used for NAMELIST I/O
 
-#ifndef FORTRAN_RUNTIME_NAMELIST_H_
-#define FORTRAN_RUNTIME_NAMELIST_H_
+#ifndef FORTRAN_FLANG_RT_NAMELIST_H_
+#define FORTRAN_FLANG_RT_NAMELIST_H_
 
 #include "non-tbp-dio.h"
 #include "flang/Common/api-attrs.h"
@@ -51,4 +51,4 @@ class NamelistGroup {
 RT_API_ATTRS bool IsNamelistNameOrSlash(IoStatementState &);
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_NAMELIST_H_ */
+#endif /* FORTRAN_FLANG_RT_NAMELIST_H_ */
diff --git a/FortranRuntime/lib/Runtime/non-tbp-dio.cpp b/flang-rt/lib/flang_rt/non-tbp-dio.cpp
similarity index 93%
rename from FortranRuntime/lib/Runtime/non-tbp-dio.cpp
rename to flang-rt/lib/flang_rt/non-tbp-dio.cpp
index 9fa04397bc9610..3aade68cbb6d3e 100644
--- a/FortranRuntime/lib/Runtime/non-tbp-dio.cpp
+++ b/flang-rt/lib/flang_rt/non-tbp-dio.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/non-tbp-dio.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/non-tbp-dio.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/non-tbp-dio.h b/flang-rt/lib/flang_rt/non-tbp-dio.h
similarity index 91%
rename from FortranRuntime/lib/Runtime/non-tbp-dio.h
rename to flang-rt/lib/flang_rt/non-tbp-dio.h
index 426d5a92fd37d4..dfc96603a8eb1c 100644
--- a/FortranRuntime/lib/Runtime/non-tbp-dio.h
+++ b/flang-rt/lib/flang_rt/non-tbp-dio.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/non-tbp-dio.h -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/non-tbp-dio.h ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -19,8 +19,8 @@
 // a containing scope has become inaccessible in a nested scope due
 // to the use of "IMPORT, NONE" or "IMPORT, ONLY:".
 
-#ifndef FORTRAN_RUNTIME_NON_TBP_DIO_H_
-#define FORTRAN_RUNTIME_NON_TBP_DIO_H_
+#ifndef FORTRAN_FLANG_RT_NON_TBP_DIO_H_
+#define FORTRAN_FLANG_RT_NON_TBP_DIO_H_
 
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/api-attrs.h"
@@ -53,4 +53,4 @@ struct NonTbpDefinedIoTable {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_NON_TBP_DIO_H_ */
+#endif /* FORTRAN_FLANG_RT_NON_TBP_DIO_H_ */
diff --git a/FortranRuntime/lib/Runtime/numeric-templates.h b/flang-rt/lib/flang_rt/numeric-templates.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/numeric-templates.h
rename to flang-rt/lib/flang_rt/numeric-templates.h
index 159b8b0b9579ad..0471b89f9153ad 100644
--- a/FortranRuntime/lib/Runtime/numeric-templates.h
+++ b/flang-rt/lib/flang_rt/numeric-templates.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/numeric-templates.h -------------------------*- C++ -*-===//
+//===-- lib/flang_rt/numeric-templates.h ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -15,8 +15,8 @@
 // for the data type corresponding to CppTypeFor<TypeCategory::Real, 16>
 // on the target.
 
-#ifndef FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
-#define FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_
+#ifndef FORTRAN_FLANG_RT_NUMERIC_TEMPLATES_H_
+#define FORTRAN_FLANG_RT_NUMERIC_TEMPLATES_H_
 
 #include "terminator.h"
 #include "tools.h"
@@ -465,4 +465,4 @@ template <typename T> inline RT_API_ATTRS T ErfcScaled(T arg) {
 
 } // namespace Fortran::runtime
 
-#endif /* FORTRAN_RUNTIME_NUMERIC_TEMPLATES_H_ */
+#endif /* FORTRAN_FLANG_RT_NUMERIC_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/numeric.cpp b/flang-rt/lib/flang_rt/numeric.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/numeric.cpp
rename to flang-rt/lib/flang_rt/numeric.cpp
index b0f68a7fc81d29..4c2c0394ede188 100644
--- a/FortranRuntime/lib/Runtime/numeric.cpp
+++ b/flang-rt/lib/flang_rt/numeric.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/numeric.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/numeric.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/pointer.cpp b/flang-rt/lib/flang_rt/pointer.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/pointer.cpp
rename to flang-rt/lib/flang_rt/pointer.cpp
index fba9e639fa37a8..7479cd780709fa 100644
--- a/FortranRuntime/lib/Runtime/pointer.cpp
+++ b/flang-rt/lib/flang_rt/pointer.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/pointer.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/pointer.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/product.cpp b/flang-rt/lib/flang_rt/product.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/product.cpp
rename to flang-rt/lib/flang_rt/product.cpp
index e4a6e81bd0c508..cd0c4e9440ceb3 100644
--- a/FortranRuntime/lib/Runtime/product.cpp
+++ b/flang-rt/lib/flang_rt/product.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/product.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/product.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/pseudo-unit.cpp b/flang-rt/lib/flang_rt/pseudo-unit.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/pseudo-unit.cpp
rename to flang-rt/lib/flang_rt/pseudo-unit.cpp
index 62c6b1df5071c7..9ce39ca9307c9c 100644
--- a/FortranRuntime/lib/Runtime/pseudo-unit.cpp
+++ b/flang-rt/lib/flang_rt/pseudo-unit.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/pseudo-unit.cpp -----------------------------*- C++ -*-===//
+//===-- lib/flang_rt/pseudo-unit.cpp ----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/ragged.cpp b/flang-rt/lib/flang_rt/ragged.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/ragged.cpp
rename to flang-rt/lib/flang_rt/ragged.cpp
index 681a800e29dca7..df6469e9c5ba27 100644
--- a/FortranRuntime/lib/Runtime/ragged.cpp
+++ b/flang-rt/lib/flang_rt/ragged.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/ragged.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/ragged.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/random-templates.h b/flang-rt/lib/flang_rt/random-templates.h
similarity index 91%
rename from FortranRuntime/lib/Runtime/random-templates.h
rename to flang-rt/lib/flang_rt/random-templates.h
index 9faa9c7cfa7002..475c972a823226 100644
--- a/FortranRuntime/lib/Runtime/random-templates.h
+++ b/flang-rt/lib/flang_rt/random-templates.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/random-templates.h --------------------------*- C++ -*-===//
+//===-- lib/flang_rt/random-templates.h -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
-#define FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_
+#ifndef FORTRAN_FLANG_RT_RANDOM_TEMPLATES_H_
+#define FORTRAN_FLANG_RT_RANDOM_TEMPLATES_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "lock.h"
 #include "numeric-templates.h"
 #include "flang/Common/optional.h"
@@ -85,4 +85,4 @@ inline void Generate(const Descriptor &harvest) {
 
 } // namespace Fortran::runtime::random
 
-#endif /* FORTRAN_RUNTIME_RANDOM_TEMPLATES_H_ */
+#endif /* FORTRAN_FLANG_RT_RANDOM_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/random.cpp b/flang-rt/lib/flang_rt/random.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/random.cpp
rename to flang-rt/lib/flang_rt/random.cpp
index 911b59b508eb4f..9922ae87b084a8 100644
--- a/FortranRuntime/lib/Runtime/random.cpp
+++ b/flang-rt/lib/flang_rt/random.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/random.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/random.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,7 +10,7 @@
 // RANDOM_SEED.
 
 #include "flang/Runtime/random.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "lock.h"
 #include "random-templates.h"
 #include "terminator.h"
diff --git a/FortranRuntime/lib/Runtime/reduce.cpp b/flang-rt/lib/flang_rt/reduce.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/reduce.cpp
rename to flang-rt/lib/flang_rt/reduce.cpp
index a020ffef6fe6a5..6997d4c63065b9 100644
--- a/FortranRuntime/lib/Runtime/reduce.cpp
+++ b/flang-rt/lib/flang_rt/reduce.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/reduce.cpp ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/reduce.cpp ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
 // REDUCE() implementation
 
 #include "flang/Runtime/reduce.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "reduction-templates.h"
 #include "terminator.h"
 #include "tools.h"
diff --git a/FortranRuntime/lib/Runtime/reduction-templates.h b/flang-rt/lib/flang_rt/reduction-templates.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/reduction-templates.h
rename to flang-rt/lib/flang_rt/reduction-templates.h
index 714584ec613ba3..774b6f3c99850f 100644
--- a/FortranRuntime/lib/Runtime/reduction-templates.h
+++ b/flang-rt/lib/flang_rt/reduction-templates.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/reduction-templates.h -----------------------*- C++ -*-===//
+//===-- lib/flang_rt/reduction-templates.h ----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -18,10 +18,10 @@
 // * Character-valued reductions (MAXVAL & MINVAL) return arbitrary
 //   length results, dynamically allocated in a caller-supplied descriptor
 
-#ifndef FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
-#define FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_
+#ifndef FORTRAN_FLANG_RT_REDUCTION_TEMPLATES_H_
+#define FORTRAN_FLANG_RT_REDUCTION_TEMPLATES_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "numeric-templates.h"
 #include "terminator.h"
 #include "tools.h"
@@ -412,4 +412,4 @@ template <int KIND> struct Norm2Helper {
 };
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_REDUCTION_TEMPLATES_H_ */
+#endif /* FORTRAN_FLANG_RT_REDUCTION_TEMPLATES_H_ */
diff --git a/FortranRuntime/lib/Runtime/reduction.cpp b/flang-rt/lib/flang_rt/reduction.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/reduction.cpp
rename to flang-rt/lib/flang_rt/reduction.cpp
index 21930fee07ead7..f9d5f442e8928f 100644
--- a/FortranRuntime/lib/Runtime/reduction.cpp
+++ b/flang-rt/lib/flang_rt/reduction.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/reduction.cpp -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/reduction.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -14,7 +14,7 @@
 // NORM2, MAXLOC, MINLOC, MAXVAL, and MINVAL are in extrema.cpp.
 
 #include "flang/Runtime/reduction.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "reduction-templates.h"
 #include <cinttypes>
 
diff --git a/FortranRuntime/lib/Runtime/stack.h b/flang-rt/lib/flang_rt/stack.h
similarity index 94%
rename from FortranRuntime/lib/Runtime/stack.h
rename to flang-rt/lib/flang_rt/stack.h
index 36e2d0a103a887..4c1ab4e85ed71f 100644
--- a/FortranRuntime/lib/Runtime/stack.h
+++ b/flang-rt/lib/flang_rt/stack.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/stack.h -------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/stack.h ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,10 +10,10 @@
 // It is a list based stack with dynamic allocation/deallocation
 // of the list nodes.
 
-#ifndef FORTRAN_RUNTIME_STACK_H_
-#define FORTRAN_RUNTIME_STACK_H_
+#ifndef FORTRAN_FLANG_RT_STACK_H_
+#define FORTRAN_FLANG_RT_STACK_H_
 
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "terminator.h"
 
 namespace Fortran::runtime {
@@ -133,4 +133,4 @@ template <typename T, unsigned N = 0> class Stack : public StackStorage<T, N> {
   Terminator &terminator_;
 };
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_STACK_H_ */
+#endif /* FORTRAN_FLANG_RT_STACK_H_ */
diff --git a/FortranRuntime/lib/Runtime/stat.cpp b/flang-rt/lib/flang_rt/stat.cpp
similarity index 96%
rename from FortranRuntime/lib/Runtime/stat.cpp
rename to flang-rt/lib/flang_rt/stat.cpp
index 1af6c43102518b..77eefe3d1ac518 100644
--- a/FortranRuntime/lib/Runtime/stat.cpp
+++ b/flang-rt/lib/flang_rt/stat.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/stat.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/stat.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "stat.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 
diff --git a/FortranRuntime/lib/Runtime/stat.h b/flang-rt/lib/flang_rt/stat.h
similarity index 93%
rename from FortranRuntime/lib/Runtime/stat.h
rename to flang-rt/lib/flang_rt/stat.h
index eccd69024d726b..dbab381001d7d8 100644
--- a/FortranRuntime/lib/Runtime/stat.h
+++ b/flang-rt/lib/flang_rt/stat.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/stat.h --------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/stat.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,8 +9,8 @@
 // Defines the values returned by the runtime for STAT= specifiers
 // on executable statements.
 
-#ifndef FORTRAN_RUNTIME_STAT_H_
-#define FORTRAN_RUNTIME_STAT_H_
+#ifndef FORTRAN_FLANG_RT_STAT_H_
+#define FORTRAN_FLANG_RT_STAT_H_
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Common/api-attrs.h"
 #include "flang/Runtime/magic-numbers.h"
@@ -60,4 +60,4 @@ RT_API_ATTRS int ToErrmsg(const Descriptor *errmsg, int stat); // returns stat
 RT_API_ATTRS int ReturnError(Terminator &, int stat,
     const Descriptor *errmsg = nullptr, bool hasStat = false);
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_STAT_H_ */
+#endif /* FORTRAN_FLANG_RT_STAT_H_ */
diff --git a/FortranRuntime/lib/Runtime/stop.cpp b/flang-rt/lib/flang_rt/stop.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/stop.cpp
rename to flang-rt/lib/flang_rt/stop.cpp
index 8465a53168e551..ea50d1ba4747ff 100644
--- a/FortranRuntime/lib/Runtime/stop.cpp
+++ b/flang-rt/lib/flang_rt/stop.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/stop.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/stop.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/sum.cpp b/flang-rt/lib/flang_rt/sum.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/sum.cpp
rename to flang-rt/lib/flang_rt/sum.cpp
index 64982b9fd53690..3c225efe8a2788 100644
--- a/FortranRuntime/lib/Runtime/sum.cpp
+++ b/flang-rt/lib/flang_rt/sum.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/sum.cpp -------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/sum.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/support.cpp b/flang-rt/lib/flang_rt/support.cpp
similarity index 93%
rename from FortranRuntime/lib/Runtime/support.cpp
rename to flang-rt/lib/flang_rt/support.cpp
index 798d502ba248e2..436ae6f87ae692 100644
--- a/FortranRuntime/lib/Runtime/support.cpp
+++ b/flang-rt/lib/flang_rt/support.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/support.cpp ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/support.cpp --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/support.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "ISO_Fortran_util.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "type-info.h"
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/temporary-stack.cpp b/flang-rt/lib/flang_rt/temporary-stack.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/temporary-stack.cpp
rename to flang-rt/lib/flang_rt/temporary-stack.cpp
index d8ff08e51cc211..f566e6d8a086ff 100644
--- a/FortranRuntime/lib/Runtime/temporary-stack.cpp
+++ b/flang-rt/lib/flang_rt/temporary-stack.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/temporary-stack.cpp -------------------------*- C++ -*-===//
+//===-- lib/flang_rt/temporary-stack.cpp ------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
 // temporaries. For use in HLFIR lowering.
 
 #include "flang/Runtime/temporary-stack.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "terminator.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Runtime/assign.h"
diff --git a/FortranRuntime/lib/Runtime/terminator.cpp b/flang-rt/lib/flang_rt/terminator.cpp
similarity index 97%
rename from FortranRuntime/lib/Runtime/terminator.cpp
rename to flang-rt/lib/flang_rt/terminator.cpp
index 4146e28235511f..2e8d895a9025a6 100644
--- a/FortranRuntime/lib/Runtime/terminator.cpp
+++ b/flang-rt/lib/flang_rt/terminator.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/terminator.cpp ------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/terminator.cpp -----------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/terminator.h b/flang-rt/lib/flang_rt/terminator.h
similarity index 95%
rename from FortranRuntime/lib/Runtime/terminator.h
rename to flang-rt/lib/flang_rt/terminator.h
index f475658b0eab3d..61c6452a282d12 100644
--- a/FortranRuntime/lib/Runtime/terminator.h
+++ b/flang-rt/lib/flang_rt/terminator.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/terminator.h --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/terminator.h -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,8 +8,8 @@
 
 // Termination of the image
 
-#ifndef FORTRAN_RUNTIME_TERMINATOR_H_
-#define FORTRAN_RUNTIME_TERMINATOR_H_
+#ifndef FORTRAN_FLANG_RT_TERMINATOR_H_
+#define FORTRAN_FLANG_RT_TERMINATOR_H_
 
 #include "flang/Common/api-attrs.h"
 #include <cstdarg>
@@ -121,4 +121,4 @@ namespace Fortran::runtime::io {
 RT_API_ATTRS void FlushOutputOnCrash(const Terminator &);
 }
 
-#endif /* FORTRAN_RUNTIME_TERMINATOR_H_ */
+#endif /* FORTRAN_FLANG_RT_TERMINATOR_H_ */
diff --git a/FortranRuntime/lib/Runtime/time-intrinsic.cpp b/flang-rt/lib/flang_rt/time-intrinsic.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/time-intrinsic.cpp
rename to flang-rt/lib/flang_rt/time-intrinsic.cpp
index 15c42077c0afd5..6e2befbc30e9fa 100644
--- a/FortranRuntime/lib/Runtime/time-intrinsic.cpp
+++ b/flang-rt/lib/flang_rt/time-intrinsic.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/time-intrinsic.cpp --------------------------*- C++ -*-===//
+//===-- lib/flang_rt/time-intrinsic.cpp -------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
 // Implements time-related intrinsic subroutines.
 
 #include "flang/Runtime/time-intrinsic.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Runtime/cpp-type.h"
@@ -62,7 +62,7 @@ template <typename Unused = void> double GetCpuTime(fallback_implementation) {
 
 #if defined __MINGW32__
 // clock_gettime is implemented in the pthread library for MinGW.
-// Using it here would mean that all programs that link libFortranRuntime are
+// Using it here would mean that all programs that link libflang_rt are
 // required to also link to pthread. Instead, don't use the function.
 #undef CLOCKID_CPU_TIME
 #undef CLOCKID_ELAPSED_TIME
diff --git a/FortranRuntime/lib/Runtime/tools.cpp b/flang-rt/lib/flang_rt/tools.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/tools.cpp
rename to flang-rt/lib/flang_rt/tools.cpp
index d5c113a31fc501..228b781b207ddd 100644
--- a/FortranRuntime/lib/Runtime/tools.cpp
+++ b/flang-rt/lib/flang_rt/tools.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/tools.cpp -----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/tools.cpp ----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/tools.h b/flang-rt/lib/flang_rt/tools.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/tools.h
rename to flang-rt/lib/flang_rt/tools.h
index 332ffac77f2595..9880d0e93f5a82 100644
--- a/FortranRuntime/lib/Runtime/tools.h
+++ b/flang-rt/lib/flang_rt/tools.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/tools.h -------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/tools.h ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,11 +6,11 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_TOOLS_H_
-#define FORTRAN_RUNTIME_TOOLS_H_
+#ifndef FORTRAN_FLANG_RT_TOOLS_H_
+#define FORTRAN_FLANG_RT_TOOLS_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "stat.h"
 #include "terminator.h"
 #include "flang/Common/optional.h"
@@ -535,4 +535,4 @@ RT_API_ATTRS void CreatePartialReductionResult(Descriptor &result,
     const char *intrinsic, TypeCode);
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_TOOLS_H_ */
+#endif /* FORTRAN_FLANG_RT_TOOLS_H_ */
diff --git a/FortranRuntime/lib/Runtime/transformational.cpp b/flang-rt/lib/flang_rt/transformational.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/transformational.cpp
rename to flang-rt/lib/flang_rt/transformational.cpp
index 28dd02a28036de..f21c63fbfd7a1b 100644
--- a/FortranRuntime/lib/Runtime/transformational.cpp
+++ b/flang-rt/lib/flang_rt/transformational.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/transformational.cpp ------------------------*- C++ -*-===//
+//===-- lib/flang_rt/transformational.cpp -----------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -17,8 +17,8 @@
 // of the standard but it more likely to conform with its intent.
 
 #include "flang/Runtime/transformational.h"
-#include "FortranRuntime/Runtime/descriptor.h"
 #include "copy.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "tools.h"
 #include "flang/Common/float128.h"
diff --git a/FortranRuntime/lib/Runtime/type-code.cpp b/flang-rt/lib/flang_rt/type-code.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/type-code.cpp
rename to flang-rt/lib/flang_rt/type-code.cpp
index 16f5497bc7a709..96fabf7ec7698f 100644
--- a/FortranRuntime/lib/Runtime/type-code.cpp
+++ b/flang-rt/lib/flang_rt/type-code.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/type-code.cpp -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/type-code.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include <cstdint>
 
 namespace Fortran::runtime {
diff --git a/FortranRuntime/lib/Runtime/type-info.cpp b/flang-rt/lib/flang_rt/type-info.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/type-info.cpp
rename to flang-rt/lib/flang_rt/type-info.cpp
index 19e9211fc063f4..031721833ddebc 100644
--- a/FortranRuntime/lib/Runtime/type-info.cpp
+++ b/flang-rt/lib/flang_rt/type-info.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/type-info.cpp -------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/type-info.cpp ------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/type-info.h b/flang-rt/lib/flang_rt/type-info.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/type-info.h
rename to flang-rt/lib/flang_rt/type-info.h
index 150942547c2ee8..3b0b193d63379c 100644
--- a/FortranRuntime/lib/Runtime/type-info.h
+++ b/flang-rt/lib/flang_rt/type-info.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/type-info.h ---------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/type-info.h --------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,13 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FORTRAN_RUNTIME_TYPE_INFO_H_
-#define FORTRAN_RUNTIME_TYPE_INFO_H_
+#ifndef FORTRAN_FLANG_RT_TYPE_INFO_H_
+#define FORTRAN_FLANG_RT_TYPE_INFO_H_
 
 // A C++ perspective of the derived type description schemata in
 // flang/module/__fortran_type_info.f90.
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "terminator.h"
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/bit-population-count.h"
@@ -321,4 +321,4 @@ class DerivedType {
 };
 
 } // namespace Fortran::runtime::typeInfo
-#endif /* FORTRAN_RUNTIME_TYPE_INFO_H_ */
+#endif /* FORTRAN_FLANG_RT_TYPE_INFO_H_ */
diff --git a/FortranRuntime/lib/Runtime/unit-map.cpp b/flang-rt/lib/flang_rt/unit-map.cpp
similarity index 98%
rename from FortranRuntime/lib/Runtime/unit-map.cpp
rename to flang-rt/lib/flang_rt/unit-map.cpp
index 93958be8df7ea5..0fda53ac071b27 100644
--- a/FortranRuntime/lib/Runtime/unit-map.cpp
+++ b/flang-rt/lib/flang_rt/unit-map.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/unit-map.cpp --------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/unit-map.cpp -------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/FortranRuntime/lib/Runtime/unit-map.h b/flang-rt/lib/flang_rt/unit-map.h
similarity index 93%
rename from FortranRuntime/lib/Runtime/unit-map.h
rename to flang-rt/lib/flang_rt/unit-map.h
index f37e2df7f3b15a..7215a5677f006b 100644
--- a/FortranRuntime/lib/Runtime/unit-map.h
+++ b/flang-rt/lib/flang_rt/unit-map.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/unit-map.h ----------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/unit-map.h ---------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,10 +9,10 @@
 // Maps Fortran unit numbers to their ExternalFileUnit instances.
 // A simple hash table with forward-linked chains per bucket.
 
-#ifndef FORTRAN_RUNTIME_UNIT_MAP_H_
-#define FORTRAN_RUNTIME_UNIT_MAP_H_
+#ifndef FORTRAN_FLANG_RT_UNIT_MAP_H_
+#define FORTRAN_FLANG_RT_UNIT_MAP_H_
 
-#include "FortranRuntime/Runtime/memory.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "lock.h"
 #include "unit.h"
 #include "flang/Common/fast-int-set.h"
@@ -100,4 +100,4 @@ class UnitMap {
   int emergencyNewUnit_{maxNewUnits_}; // not recycled
 };
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_UNIT_MAP_H_ */
+#endif /* FORTRAN_FLANG_RT_UNIT_MAP_H_ */
diff --git a/FortranRuntime/lib/Runtime/unit.cpp b/flang-rt/lib/flang_rt/unit.cpp
similarity index 99%
rename from FortranRuntime/lib/Runtime/unit.cpp
rename to flang-rt/lib/flang_rt/unit.cpp
index 496679ee8ce5f4..b5a4282faf22e5 100644
--- a/FortranRuntime/lib/Runtime/unit.cpp
+++ b/flang-rt/lib/flang_rt/unit.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/unit.cpp ------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/unit.cpp -----------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -19,13 +19,13 @@
 
 namespace Fortran::runtime::io {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExternalFileUnit *defaultInput{nullptr}; // unit 5
 RT_VAR_ATTRS ExternalFileUnit *defaultOutput{nullptr}; // unit 6
 RT_VAR_ATTRS ExternalFileUnit *errorOutput{nullptr}; // unit 0 extension
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/lib/Runtime/unit.h b/flang-rt/lib/flang_rt/unit.h
similarity index 98%
rename from FortranRuntime/lib/Runtime/unit.h
rename to flang-rt/lib/flang_rt/unit.h
index 4a7444aedbe5b6..077a34833734ac 100644
--- a/FortranRuntime/lib/Runtime/unit.h
+++ b/flang-rt/lib/flang_rt/unit.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/unit.h --------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/unit.h -------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -8,14 +8,14 @@
 
 // Fortran external I/O units
 
-#ifndef FORTRAN_RUNTIME_UNIT_H_
-#define FORTRAN_RUNTIME_UNIT_H_
+#ifndef FORTRAN_FLANG_RT_UNIT_H_
+#define FORTRAN_FLANG_RT_UNIT_H_
 
-#include "FortranRuntime/Runtime/memory.h"
 #include "buffer.h"
 #include "connection.h"
 #include "environment.h"
 #include "file.h"
+#include "flang-rt/flang_rt/memory.h"
 #include "format.h"
 #include "io-error.h"
 #include "io-stmt.h"
@@ -291,4 +291,4 @@ class ChildIo {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FORTRAN_RUNTIME_UNIT_H_ */
+#endif /* FORTRAN_FLANG_RT_UNIT_H_ */
diff --git a/FortranRuntime/lib/Runtime/utf.cpp b/flang-rt/lib/flang_rt/utf.cpp
similarity index 96%
rename from FortranRuntime/lib/Runtime/utf.cpp
rename to flang-rt/lib/flang_rt/utf.cpp
index 635451153d39a6..860db5f2367d38 100644
--- a/FortranRuntime/lib/Runtime/utf.cpp
+++ b/flang-rt/lib/flang_rt/utf.cpp
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/utf.cpp -------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/utf.cpp ------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,7 +10,7 @@
 
 namespace Fortran::runtime {
 
-#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
 // clang-format off
 RT_OFFLOAD_VAR_GROUP_BEGIN
 const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
@@ -41,7 +41,7 @@ const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
 };
 RT_OFFLOAD_VAR_GROUP_END
 // clang-format on
-#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
+#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/FortranRuntime/lib/Runtime/utf.h b/flang-rt/lib/flang_rt/utf.h
similarity index 94%
rename from FortranRuntime/lib/Runtime/utf.h
rename to flang-rt/lib/flang_rt/utf.h
index 35c03fd4cdded5..71dc7b05a77513 100644
--- a/FortranRuntime/lib/Runtime/utf.h
+++ b/flang-rt/lib/flang_rt/utf.h
@@ -1,4 +1,4 @@
-//===-- lib/Runtime/utf.h ---------------------------------------*- C++ -*-===//
+//===-- lib/flang_rt/utf.h --------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -38,8 +38,8 @@
 // standard maximum.  However, we support extended forms up to 32 bits so that
 // CHARACTER(KIND=4) can be abused to hold arbitrary 32-bit data.
 
-#ifndef FORTRAN_RUNTIME_UTF_H_
-#define FORTRAN_RUNTIME_UTF_H_
+#ifndef FORTRAN_FLANG_RT_UTF_H_
+#define FORTRAN_FLANG_RT_UTF_H_
 
 #include "flang/Common/optional.h"
 #include <cstddef>
@@ -70,4 +70,4 @@ RT_API_ATTRS Fortran::common::optional<char32_t> DecodeUTF8(const char *);
 RT_API_ATTRS std::size_t EncodeUTF8(char *, char32_t);
 
 } // namespace Fortran::runtime
-#endif /* FORTRAN_RUNTIME_UTF_H_ */
+#endif /* FORTRAN_FLANG_RT_UTF_H_ */
diff --git a/FortranRuntime/test/CMakeLists.txt b/flang-rt/test/CMakeLists.txt
similarity index 57%
rename from FortranRuntime/test/CMakeLists.txt
rename to flang-rt/test/CMakeLists.txt
index c10c487d48c410..be42717b2834f3 100644
--- a/FortranRuntime/test/CMakeLists.txt
+++ b/flang-rt/test/CMakeLists.txt
@@ -25,7 +25,7 @@ configure_lit_site_cfg(
   ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
 )
 
-if (TARGET FortranRuntimeUnitTests)
+if (TARGET FlangRTUnitTests)
   configure_lit_site_cfg(
     ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in
     ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py
@@ -41,29 +41,21 @@ if (TARGET FortranRuntimeUnitTests)
   )
 endif ()
 
-set(FORTRANRUNTIME_TEST_DEPENDS
-    FortranRuntimeUnitTests
-    FortranRuntime.static
+set(FLANGRT_TEST_DEPENDS
+    FlangRTUnitTests
+    flang_rt.unittest
   )
 
-add_custom_target(FortranRuntime-test-depends)
-set_target_properties(FortranRuntime-test-depends PROPERTIES FOLDER "Fortran Runtime/Meta")
-add_dependencies(FortranRuntime-test-depends ${FORTRANRUNTIME_TEST_DEPENDS})
+add_custom_target(flang-rt-test-depends)
+set_target_properties(flang-rt-test-depends PROPERTIES FOLDER "Fortran Runtime/Meta")
+add_dependencies(flang-rt-test-depends ${FLANGRT_TEST_DEPENDS})
 
-add_lit_testsuite(check-FortranRuntime "Running the FortranRuntime regression tests"
+add_lit_testsuite(check-flang-rt "Running the flang-rt regression tests"
   ${CMAKE_CURRENT_BINARY_DIR}
-  DEPENDS ${FORTRANRUNTIME_TEST_DEPENDS}
+  DEPENDS ${FLANGRT_TEST_DEPENDS}
 )
-set_target_properties(check-FortranRuntime PROPERTIES FOLDER "Fortran Runtime/Meta")
+set_target_properties(check-flang-rt PROPERTIES FOLDER "Fortran Runtime/Meta")
 
 
-add_lit_testsuites(FORTRANRUNTIME ${CMAKE_CURRENT_SOURCE_DIR}
-  DEPENDS ${FORTRANRUNTIME_TEST_DEPENDS})
-
-# To modify the default target triple for flang tests.
-if (DEFINED FLANG_TEST_TARGET_TRIPLE)
-  if (NOT DEFINED LLVM_TARGET_TRIPLE_ENV OR LLVM_TARGET_TRIPLE_ENV STREQUAL "")
-    message(FATAL_ERROR "LLVM_TARGET_TRIPLE_ENV must also be defined in order "
-                        "to use FLANG_TEST_TARGET_TRIPLE.")
-  endif()
-endif()
+add_lit_testsuites(flang-rt ${CMAKE_CURRENT_SOURCE_DIR}
+  DEPENDS ${FLANGRT_TEST_DEPENDS})
diff --git a/FortranRuntime/test/Driver/ctofortran.f90 b/flang-rt/test/Driver/ctofortran.f90
similarity index 100%
rename from FortranRuntime/test/Driver/ctofortran.f90
rename to flang-rt/test/Driver/ctofortran.f90
diff --git a/FortranRuntime/test/Driver/exec.f90 b/flang-rt/test/Driver/exec.f90
similarity index 100%
rename from FortranRuntime/test/Driver/exec.f90
rename to flang-rt/test/Driver/exec.f90
diff --git a/FortranRuntime/test/NonGtestUnit/lit.cfg.py b/flang-rt/test/NonGtestUnit/lit.cfg.py
similarity index 75%
rename from FortranRuntime/test/NonGtestUnit/lit.cfg.py
rename to flang-rt/test/NonGtestUnit/lit.cfg.py
index f807f2825a1bc7..20e28b0d3b55fd 100644
--- a/FortranRuntime/test/NonGtestUnit/lit.cfg.py
+++ b/flang-rt/test/NonGtestUnit/lit.cfg.py
@@ -5,18 +5,18 @@
 import lit.formats
 
 # name: The name of this test suite.
-config.name = "FortranRuntime-OldUnit"
+config.name = "flang-rt-OldUnit"
 
 # suffixes: A list of file extensions to treat as test files.
 # On Windows, ".exe" also matches the GTests and will execited redundantly.
 config.suffixes = [".test", ".exe"]
 
 # test_source_root: The root path where unit test binaries are located.
-config.test_source_root = os.path.join(config.fortranruntime_binary_dir, "unittests")
+config.test_source_root = os.path.join(config.flangrt_binary_dir, "unittests")
 
 # test_exec_root: The root path where tests should be run.
 # lit writes a '.lit_test_times.txt' file into this directory.
-config.test_exec_root = config.fortranruntime_binary_test_dir
+config.test_exec_root = config.flangrt_binary_test_dir
 
 # testFormat: The test format to use to interpret tests.
 config.test_format = lit.formats.ExecutableTest()
diff --git a/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in b/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..9dc4d2d5a1513f
--- /dev/null
+++ b/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
@@ -0,0 +1,14 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import os
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
+config.flangrt_binary_dir = "@FLANGRT_BINARY_DIR@"
+config.flangrt_binary_test_dir = os.path.dirname(__file__)
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, os.path.join(config.flangrt_source_dir, 'test', 'NonGtestUnit', 'lit.cfg.py'))
diff --git a/FortranRuntime/test/Runtime/no-cpp-dep.c b/flang-rt/test/Runtime/no-cpp-dep.c
similarity index 87%
rename from FortranRuntime/test/Runtime/no-cpp-dep.c
rename to flang-rt/test/Runtime/no-cpp-dep.c
index 2cc5669a60d3a2..510816a07967ab 100644
--- a/FortranRuntime/test/Runtime/no-cpp-dep.c
+++ b/flang-rt/test/Runtime/no-cpp-dep.c
@@ -1,12 +1,12 @@
 /*
 This test makes sure that flang's runtime does not depend on the C++ runtime
-library. It tries to link this simple file against libFortranRuntime.a with
+library. It tries to link this simple file against libflang_rt.a with
 a C compiler.
 
 UNSUPPORTED: system-windows
 
-FIXME: This currently fails with CUDA-enabled FortranRuntime because it needs
-       to link libcuda_rt.
+FIXME: This currently fails with CUDA-enabled flang-rt because it needs
+       to link libcudart.
 
 RUN: %if system-aix %{ export OBJECT_MODE=64 %}
 RUN: %cc -std=c99 %s -I%include %libruntime -lm \
diff --git a/FortranRuntime/test/Unit/lit.cfg.py b/flang-rt/test/Unit/lit.cfg.py
similarity index 73%
rename from FortranRuntime/test/Unit/lit.cfg.py
rename to flang-rt/test/Unit/lit.cfg.py
index 888fb3981916c8..e46a78584c0425 100644
--- a/FortranRuntime/test/Unit/lit.cfg.py
+++ b/flang-rt/test/Unit/lit.cfg.py
@@ -5,17 +5,17 @@
 import lit.formats
 
 # name: The name of this test suite.
-config.name = "FortranRuntime-Unit"
+config.name = "flang-rt-Unit"
 
 # suffixes: A list of file extensions to treat as test files.
 config.suffixes = []
 
 # test_source_root: The root path where unit test binaries are located.
-config.test_source_root = os.path.join(config.fortranruntime_binary_dir, "unittests")
+config.test_source_root = os.path.join(config.flangrt_binary_dir, "unittests")
 
 # test_exec_root: The root path where tests should be run.
 # lit writes a '.lit_test_times.txt' file into this directory.
-config.test_exec_root = config.fortranruntime_binary_test_dir
+config.test_exec_root = config.flangrt_binary_test_dir
 
 # testFormat: The test format to use to interpret tests.
 config.test_format = lit.formats.GoogleTest(config.llvm_build_mode, "Tests")
diff --git a/flang-rt/test/Unit/lit.site.cfg.py.in b/flang-rt/test/Unit/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..f6ed1e758d9374
--- /dev/null
+++ b/flang-rt/test/Unit/lit.site.cfg.py.in
@@ -0,0 +1,15 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import os
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.llvm_build_mode = "@LLVM_BUILD_MODE@"
+config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
+config.flangrt_binary_dir = "@FLANGRT_BINARY_DIR@"
+config.flangrt_binary_test_dir = os.path.dirname(__file__)
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, os.path.join(config.flangrt_source_dir, 'test', 'Unit', 'lit.cfg.py'))
diff --git a/FortranRuntime/test/lit.cfg.py b/flang-rt/test/lit.cfg.py
similarity index 89%
rename from FortranRuntime/test/lit.cfg.py
rename to flang-rt/test/lit.cfg.py
index 1b9041111b72e8..1c3a08b3ae75b7 100644
--- a/FortranRuntime/test/lit.cfg.py
+++ b/flang-rt/test/lit.cfg.py
@@ -8,7 +8,7 @@
 # Configuration file for the 'lit' test runner.
 
 # name: The name of this test suite.
-config.name = "FortranRuntime"
+config.name = "flang-rt"
 
 # testFormat: The test format to use to interpret tests.
 #
@@ -54,7 +54,7 @@
 
 # test_exec_root: The root path where tests should be run.
 # lit writes a '.lit_test_times.txt' file into this directory.
-config.test_exec_root = config.fortranruntime_binary_test_dir
+config.test_exec_root = config.flangrt_binary_test_dir
 
 # On MacOS, -isysroot is needed to build binaries.
 isysroot_flag = []
@@ -72,7 +72,7 @@
 
 # Define some variables to help us test that the flang runtime doesn't depend on
 # the C++ runtime libraries. For this we need a C compiler.
-libruntime = os.path.join(config.fortranruntime_build_lib_dir, "libFortranRuntime.a")
+libruntime = os.path.join(config.flangrt_build_lib_dir, "libflang_rt.a")
 include = os.path.join(config.flang_source_dir, "include")
 tools.append(
     ToolSubst("%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal")
@@ -80,7 +80,7 @@
 tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
 tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
 
-# Lwt tests find LLVM's standard tools (FileCheck, split-file, not, ...)
+# Let tests find LLVM's standard tools (FileCheck, split-file, not, ...)
 llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True)
 
 llvm_config.add_tool_substitutions(tools)
diff --git a/flang-rt/test/lit.site.cfg.py.in b/flang-rt/test/lit.site.cfg.py.in
new file mode 100644
index 00000000000000..630f7dfcd508c7
--- /dev/null
+++ b/flang-rt/test/lit.site.cfg.py.in
@@ -0,0 +1,17 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import sys
+
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.flang_source_dir = "@FLANG_SOURCE_DIR@"
+config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
+config.flangrt_binary_test_dir = os.path.dirname(__file__)
+config.flangrt_build_lib_dir = "@FLANGRT_BUILD_LIB_DIR@"
+config.cc = "@CMAKE_C_COMPILER@"
+config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, os.path.join(config.flangrt_source_dir, 'test', 'lit.cfg.py'))
diff --git a/FortranRuntime/unittests/CMakeLists.txt b/flang-rt/unittests/CMakeLists.txt
similarity index 72%
rename from FortranRuntime/unittests/CMakeLists.txt
rename to flang-rt/unittests/CMakeLists.txt
index 592f2ef7ce42ab..d6ed84c9f72bf0 100644
--- a/FortranRuntime/unittests/CMakeLists.txt
+++ b/flang-rt/unittests/CMakeLists.txt
@@ -26,13 +26,13 @@ endif()
 
 
 # Target that depends on all unittests
-add_custom_target(FortranRuntimeUnitTests)
-set_target_properties(FortranRuntimeUnitTests PROPERTIES FOLDER "Fortran Runtime/Meta")
+add_custom_target(FlangRTUnitTests)
+set_target_properties(FlangRTUnitTests PROPERTIES FOLDER "Fortran Runtime/Meta")
 
 
-function(add_fortranruntime_unittest_offload_properties target)
+function(add_flangrt_unittest_offload_properties target)
   # Set CUDA_RESOLVE_DEVICE_SYMBOLS.
-  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+  if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
     set_target_properties(${target}
       PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
       )
@@ -43,7 +43,7 @@ function(add_fortranruntime_unittest_offload_properties target)
   #
   # FIXME: replace 'native' in --offload-arch option with the list
   #        of targets that Fortran Runtime was built for.
-  if (FORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
+  if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
     set_target_properties(${target}
       PROPERTIES LINK_OPTIONS
       "-fopenmp;--offload-arch=native"
@@ -52,22 +52,22 @@ function(add_fortranruntime_unittest_offload_properties target)
 endfunction()
 
 
-function(add_fortranruntime_unittest test_dirname)
+function(add_flangrt_unittest test_dirname)
   cmake_parse_arguments(ARG
     ""
     ""
     "LINK_LIBS"
     ${ARGN})
 
-  add_unittest(FortranRuntimeUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
+  add_unittest(FlangRTUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
 
-  target_include_directories(${test_dirname} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  target_include_directories(${test_dirname} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
   target_include_directories(${test_dirname} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
-  add_fortranruntime_unittest_offload_properties(${test_dirname})
+  add_flangrt_unittest_offload_properties(${test_dirname})
 endfunction()
 
-function(add_fortranruntime_nongtest_unittest test_name)
+function(add_flangrt_nongtest_unittest test_name)
   cmake_parse_arguments(ARG
     "SLOW_TEST"
     ""
@@ -83,15 +83,15 @@ function(add_fortranruntime_nongtest_unittest test_name)
   add_executable(${test_name}${suffix} ${ARG_UNPARSED_ARGUMENTS})
   set_target_properties(${test_name}${suffix} PROPERTIES FOLDER "Fortran Runtime/Tests/Unit")
 
-  target_include_directories(${test_name}${suffix} PRIVATE "${FORTRANRUNTIME_SOURCE_DIR}/include")
+  target_include_directories(${test_name}${suffix} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
   target_include_directories(${test_name}${suffix} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
 
   if(NOT ARG_SLOW_TEST)
-    add_dependencies(FortranRuntimeUnitTests ${test_name}${suffix})
+    add_dependencies(FlangRTUnitTests ${test_name}${suffix})
   endif()
 
-  add_fortranruntime_unittest_offload_properties(${test_name}${suffix})
+  add_flangrt_unittest_offload_properties(${test_name}${suffix})
 endfunction()
 
 add_subdirectory(Evaluate)
diff --git a/FortranRuntime/unittests/Evaluate/CMakeLists.txt b/flang-rt/unittests/Evaluate/CMakeLists.txt
similarity index 73%
rename from FortranRuntime/unittests/Evaluate/CMakeLists.txt
rename to flang-rt/unittests/Evaluate/CMakeLists.txt
index fd3a5755dd1227..dd4b729f698cf6 100644
--- a/FortranRuntime/unittests/Evaluate/CMakeLists.txt
+++ b/flang-rt/unittests/Evaluate/CMakeLists.txt
@@ -6,14 +6,14 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_fortranruntime_nongtest_unittest(reshape
+add_flangrt_nongtest_unittest(reshape
   reshape.cpp
 LINK_LIBS
-  FortranRuntime.unittest
+  flang_rt.unittest
 )
 
-add_fortranruntime_nongtest_unittest(ISO-Fortran-binding
+add_flangrt_nongtest_unittest(ISO-Fortran-binding
   ISO-Fortran-binding.cpp
 LINK_LIBS
-  FortranRuntime.unittest
+  flang_rt.unittest
 )
diff --git a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp b/flang-rt/unittests/Evaluate/ISO-Fortran-binding.cpp
similarity index 99%
rename from FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
rename to flang-rt/unittests/Evaluate/ISO-Fortran-binding.cpp
index b68dfbcbd5b335..03cc59291787aa 100644
--- a/FortranRuntime/unittests/Evaluate/ISO-Fortran-binding.cpp
+++ b/flang-rt/unittests/Evaluate/ISO-Fortran-binding.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
 #include "flang/Testing/testing.h"
 #include "llvm/Support/raw_ostream.h"
diff --git a/FortranRuntime/unittests/Evaluate/reshape.cpp b/flang-rt/unittests/Evaluate/reshape.cpp
similarity index 98%
rename from FortranRuntime/unittests/Evaluate/reshape.cpp
rename to flang-rt/unittests/Evaluate/reshape.cpp
index 0233ab37e25c6e..c9ead4fe744f91 100644
--- a/FortranRuntime/unittests/Evaluate/reshape.cpp
+++ b/flang-rt/unittests/Evaluate/reshape.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "flang/Runtime/transformational.h"
 #include "flang/Testing/testing.h"
 #include <cinttypes>
diff --git a/FortranRuntime/unittests/Runtime/AccessTest.cpp b/flang-rt/unittests/Runtime/AccessTest.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/AccessTest.cpp
rename to flang-rt/unittests/Runtime/AccessTest.cpp
diff --git a/FortranRuntime/unittests/Runtime/Allocatable.cpp b/flang-rt/unittests/Runtime/Allocatable.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/Allocatable.cpp
rename to flang-rt/unittests/Runtime/Allocatable.cpp
diff --git a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp b/flang-rt/unittests/Runtime/ArrayConstructor.cpp
similarity index 97%
rename from FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
rename to flang-rt/unittests/Runtime/ArrayConstructor.cpp
index 9d9a4ddae8689f..c52ce8e4ea54fd 100644
--- a/FortranRuntime/unittests/Runtime/ArrayConstructor.cpp
+++ b/flang-rt/unittests/Runtime/ArrayConstructor.cpp
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/array-constructor.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/array-constructor.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/FortranRuntime/unittests/Runtime/BufferTest.cpp b/flang-rt/unittests/Runtime/BufferTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/BufferTest.cpp
rename to flang-rt/unittests/Runtime/BufferTest.cpp
index 9a7dd86d0c1dc6..41c660e638e712 100644
--- a/FortranRuntime/unittests/Runtime/BufferTest.cpp
+++ b/flang-rt/unittests/Runtime/BufferTest.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../lib/Runtime/buffer.h"
+#include "../../lib/flang_rt/buffer.h"
 #include "CrashHandlerFixture.h"
 #include "gtest/gtest.h"
 #include <algorithm>
diff --git a/FortranRuntime/unittests/Runtime/CMakeLists.txt b/flang-rt/unittests/Runtime/CMakeLists.txt
similarity index 90%
rename from FortranRuntime/unittests/Runtime/CMakeLists.txt
rename to flang-rt/unittests/Runtime/CMakeLists.txt
index e4439dcc8b3c7e..ce15fe5ef74f96 100644
--- a/FortranRuntime/unittests/Runtime/CMakeLists.txt
+++ b/flang-rt/unittests/Runtime/CMakeLists.txt
@@ -6,7 +6,7 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_fortranruntime_unittest(FlangRuntimeTests
+add_flangrt_unittest(RuntimeTests
   AccessTest.cpp
   Allocatable.cpp
   ArrayConstructor.cpp
@@ -38,9 +38,9 @@ add_fortranruntime_unittest(FlangRuntimeTests
   TemporaryStack.cpp
   Transformational.cpp
 LINK_LIBS
-  FortranRuntime.unittest
+  flang_rt.unittest
 )
 
-if (FORTRANRUNTIME_ENABLE_CUF)
+if (FLANG_RT_ENABLE_CUF)
   add_subdirectory(CUDA)
 endif ()
diff --git a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp b/flang-rt/unittests/Runtime/CUDA/AllocatorCUF.cpp
similarity index 90%
rename from FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
rename to flang-rt/unittests/Runtime/CUDA/AllocatorCUF.cpp
index d2a2e5a11abf80..46461a863c0696 100644
--- a/FortranRuntime/unittests/Runtime/CUDA/AllocatorCUF.cpp
+++ b/flang-rt/unittests/Runtime/CUDA/AllocatorCUF.cpp
@@ -6,16 +6,16 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/CUDA/allocator.h"
-#include "FortranRuntime/Runtime/CUDA/descriptor.h"
-#include "FortranRuntime/Runtime/allocatable.h"
-#include "FortranRuntime/Runtime/allocator-registry.h"
+#include "cuda_runtime.h"
+#include "flang-rt/flang_rt/allocator-registry.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
-#include "../../../runtime/terminator.h"
+#include "../../../lib/flang_rt/terminator.h"
+#include "flang-rt/CufRuntime/allocator.h"
+#include "flang/Runtime/CUDA/descriptor.h"
+#include "flang/Runtime/allocatable.h"
 #include "flang/Support/Fortran.h"
 
-#include "cuda_runtime.h"
-
 using namespace Fortran::runtime;
 using namespace Fortran::runtime::cuda;
 
diff --git a/FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt b/flang-rt/unittests/Runtime/CUDA/CMakeLists.txt
similarity index 89%
rename from FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt
rename to flang-rt/unittests/Runtime/CUDA/CMakeLists.txt
index 04321e65d733ad..829ae9250f345e 100644
--- a/FortranRuntime/unittests/Runtime/CUDA/CMakeLists.txt
+++ b/flang-rt/unittests/Runtime/CUDA/CMakeLists.txt
@@ -6,14 +6,14 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_fortranruntime_unittest(FlangCufRuntimeTests
+add_flangrt_unittest(FlangCufRuntimeTests
   AllocatorCUF.cpp
 )
 
 target_link_libraries(FlangCufRuntimeTests
   PRIVATE
   CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR}
-  FortranRuntime
+  flang_rt
 )
 
 target_include_directories(FlangCufRuntimeTests PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
diff --git a/FortranRuntime/unittests/Runtime/CharacterTest.cpp b/flang-rt/unittests/Runtime/CharacterTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/CharacterTest.cpp
rename to flang-rt/unittests/Runtime/CharacterTest.cpp
index 610061e2122cd5..3a4b5706e53849 100644
--- a/FortranRuntime/unittests/Runtime/CharacterTest.cpp
+++ b/flang-rt/unittests/Runtime/CharacterTest.cpp
@@ -10,7 +10,7 @@
 // in Fortran.
 
 #include "flang/Runtime/character.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
 #include <cstring>
 #include <functional>
diff --git a/FortranRuntime/unittests/Runtime/CommandTest.cpp b/flang-rt/unittests/Runtime/CommandTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/CommandTest.cpp
rename to flang-rt/unittests/Runtime/CommandTest.cpp
index a7d68508c5abca..15b2ed2e42bba1 100644
--- a/FortranRuntime/unittests/Runtime/CommandTest.cpp
+++ b/flang-rt/unittests/Runtime/CommandTest.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/command.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "flang/Runtime/execute.h"
diff --git a/FortranRuntime/unittests/Runtime/Complex.cpp b/flang-rt/unittests/Runtime/Complex.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/Complex.cpp
rename to flang-rt/unittests/Runtime/Complex.cpp
diff --git a/FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp b/flang-rt/unittests/Runtime/CrashHandlerFixture.cpp
similarity index 96%
rename from FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp
rename to flang-rt/unittests/Runtime/CrashHandlerFixture.cpp
index 5e0b746c7e974a..3959b0d4b78809 100644
--- a/FortranRuntime/unittests/Runtime/CrashHandlerFixture.cpp
+++ b/flang-rt/unittests/Runtime/CrashHandlerFixture.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 #include "CrashHandlerFixture.h"
-#include "../../lib/Runtime/terminator.h"
+#include "../../lib/flang_rt/terminator.h"
 #include <cstdarg>
 #include <cstdlib>
 
diff --git a/FortranRuntime/unittests/Runtime/CrashHandlerFixture.h b/flang-rt/unittests/Runtime/CrashHandlerFixture.h
similarity index 100%
rename from FortranRuntime/unittests/Runtime/CrashHandlerFixture.h
rename to flang-rt/unittests/Runtime/CrashHandlerFixture.h
diff --git a/FortranRuntime/unittests/Runtime/Derived.cpp b/flang-rt/unittests/Runtime/Derived.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/Derived.cpp
rename to flang-rt/unittests/Runtime/Derived.cpp
index 22361352fdf5d9..055174a3b5a907 100644
--- a/FortranRuntime/unittests/Runtime/Derived.cpp
+++ b/flang-rt/unittests/Runtime/Derived.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Runtime/derived-api.h"
diff --git a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp b/flang-rt/unittests/Runtime/ExternalIOTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
rename to flang-rt/unittests/Runtime/ExternalIOTest.cpp
index 7ff4aa3c14bdc5..a93ee97da8f5f7 100644
--- a/FortranRuntime/unittests/Runtime/ExternalIOTest.cpp
+++ b/flang-rt/unittests/Runtime/ExternalIOTest.cpp
@@ -11,8 +11,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "gtest/gtest.h"
 #include "flang/Runtime/main.h"
 #include "flang/Runtime/stop.h"
diff --git a/FortranRuntime/unittests/Runtime/Format.cpp b/flang-rt/unittests/Runtime/Format.cpp
similarity index 97%
rename from FortranRuntime/unittests/Runtime/Format.cpp
rename to flang-rt/unittests/Runtime/Format.cpp
index f1447608917f2d..3012806a8eacc1 100644
--- a/FortranRuntime/unittests/Runtime/Format.cpp
+++ b/flang-rt/unittests/Runtime/Format.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "../../lib/Runtime/connection.h"
-#include "../../lib/Runtime/format-implementation.h"
-#include "../../lib/Runtime/io-error.h"
+#include "../../lib/flang_rt/connection.h"
+#include "../../lib/flang_rt/format-implementation.h"
+#include "../../lib/flang_rt/io-error.h"
 #include <optional>
 #include <string>
 #include <tuple>
diff --git a/FortranRuntime/unittests/Runtime/Inquiry.cpp b/flang-rt/unittests/Runtime/Inquiry.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/Inquiry.cpp
rename to flang-rt/unittests/Runtime/Inquiry.cpp
index 3e5f0037177f1c..0bda07aaef295c 100644
--- a/FortranRuntime/unittests/Runtime/Inquiry.cpp
+++ b/flang-rt/unittests/Runtime/Inquiry.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/inquiry.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 
diff --git a/FortranRuntime/unittests/Runtime/ListInputTest.cpp b/flang-rt/unittests/Runtime/ListInputTest.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/ListInputTest.cpp
rename to flang-rt/unittests/Runtime/ListInputTest.cpp
index e0fe4dfeac3949..7e04ab834eb247 100644
--- a/FortranRuntime/unittests/Runtime/ListInputTest.cpp
+++ b/flang-rt/unittests/Runtime/ListInputTest.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
-#include "../../lib/Runtime/io-error.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
+#include "../../lib/flang_rt/io-error.h"
 
 using namespace Fortran::runtime;
 using namespace Fortran::runtime::io;
diff --git a/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp b/flang-rt/unittests/Runtime/LogicalFormatTest.cpp
similarity index 95%
rename from FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
rename to flang-rt/unittests/Runtime/LogicalFormatTest.cpp
index 9fa0c2f4260edb..b5a9e2d317841f 100644
--- a/FortranRuntime/unittests/Runtime/LogicalFormatTest.cpp
+++ b/flang-rt/unittests/Runtime/LogicalFormatTest.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include <algorithm>
 #include <array>
 #include <cstring>
diff --git a/FortranRuntime/unittests/Runtime/Matmul.cpp b/flang-rt/unittests/Runtime/Matmul.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/Matmul.cpp
rename to flang-rt/unittests/Runtime/Matmul.cpp
index 6eb4012e785ff1..e833b3861badac 100644
--- a/FortranRuntime/unittests/Runtime/Matmul.cpp
+++ b/flang-rt/unittests/Runtime/Matmul.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/matmul.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp b/flang-rt/unittests/Runtime/MatmulTranspose.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
rename to flang-rt/unittests/Runtime/MatmulTranspose.cpp
index 199062f820c303..560f62935e35bc 100644
--- a/FortranRuntime/unittests/Runtime/MatmulTranspose.cpp
+++ b/flang-rt/unittests/Runtime/MatmulTranspose.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp b/flang-rt/unittests/Runtime/MiscIntrinsic.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
rename to flang-rt/unittests/Runtime/MiscIntrinsic.cpp
index 1033dda9d636f7..ca3a3e4fd3b839 100644
--- a/FortranRuntime/unittests/Runtime/MiscIntrinsic.cpp
+++ b/flang-rt/unittests/Runtime/MiscIntrinsic.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Runtime/allocatable.h"
diff --git a/FortranRuntime/unittests/Runtime/Namelist.cpp b/flang-rt/unittests/Runtime/Namelist.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/Namelist.cpp
rename to flang-rt/unittests/Runtime/Namelist.cpp
index 544ab85234fd65..d30625f23bfc1c 100644
--- a/FortranRuntime/unittests/Runtime/Namelist.cpp
+++ b/flang-rt/unittests/Runtime/Namelist.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../../lib/Runtime/namelist.h"
+#include "../../lib/flang_rt/namelist.h"
 #include "CrashHandlerFixture.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include "tools.h"
 #include <algorithm>
 #include <cinttypes>
diff --git a/FortranRuntime/unittests/Runtime/Numeric.cpp b/flang-rt/unittests/Runtime/Numeric.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/Numeric.cpp
rename to flang-rt/unittests/Runtime/Numeric.cpp
diff --git a/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp b/flang-rt/unittests/Runtime/NumericalFormatTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
rename to flang-rt/unittests/Runtime/NumericalFormatTest.cpp
index c588c739686bed..6c11bb0d4a49d6 100644
--- a/FortranRuntime/unittests/Runtime/NumericalFormatTest.cpp
+++ b/flang-rt/unittests/Runtime/NumericalFormatTest.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "CrashHandlerFixture.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/io-api-funcs.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/io-api-funcs.h"
 #include <algorithm>
 #include <array>
 #include <cstring>
diff --git a/FortranRuntime/unittests/Runtime/Pointer.cpp b/flang-rt/unittests/Runtime/Pointer.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/Pointer.cpp
rename to flang-rt/unittests/Runtime/Pointer.cpp
index 733cd42232875f..c787ed9e71eee9 100644
--- a/FortranRuntime/unittests/Runtime/Pointer.cpp
+++ b/flang-rt/unittests/Runtime/Pointer.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/pointer.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 
diff --git a/FortranRuntime/unittests/Runtime/Ragged.cpp b/flang-rt/unittests/Runtime/Ragged.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/Ragged.cpp
rename to flang-rt/unittests/Runtime/Ragged.cpp
diff --git a/FortranRuntime/unittests/Runtime/Random.cpp b/flang-rt/unittests/Runtime/Random.cpp
similarity index 95%
rename from FortranRuntime/unittests/Runtime/Random.cpp
rename to flang-rt/unittests/Runtime/Random.cpp
index 81497a682660a8..bd4fcfd5e87975 100644
--- a/FortranRuntime/unittests/Runtime/Random.cpp
+++ b/flang-rt/unittests/Runtime/Random.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/random.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include <cmath>
 
diff --git a/FortranRuntime/unittests/Runtime/Reduction.cpp b/flang-rt/unittests/Runtime/Reduction.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/Reduction.cpp
rename to flang-rt/unittests/Runtime/Reduction.cpp
index a382f4b7a71770..0f3789b017c6f6 100644
--- a/FortranRuntime/unittests/Runtime/Reduction.cpp
+++ b/flang-rt/unittests/Runtime/Reduction.cpp
@@ -7,8 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/reduction.h"
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Common/float128.h"
diff --git a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp b/flang-rt/unittests/Runtime/RuntimeCrashTest.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
rename to flang-rt/unittests/Runtime/RuntimeCrashTest.cpp
index 7ce1ee796d739b..f1ea6c897d515e 100644
--- a/FortranRuntime/unittests/Runtime/RuntimeCrashTest.cpp
+++ b/flang-rt/unittests/Runtime/RuntimeCrashTest.cpp
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 #include "CrashHandlerFixture.h"
 #include "tools.h"
-#include "../../lib/Runtime/terminator.h"
+#include "../../lib/flang_rt/terminator.h"
 #include "flang/Runtime/io-api.h"
 #include "flang/Runtime/transformational.h"
 #include <gtest/gtest.h>
diff --git a/FortranRuntime/unittests/Runtime/Stop.cpp b/flang-rt/unittests/Runtime/Stop.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/Stop.cpp
rename to flang-rt/unittests/Runtime/Stop.cpp
index c12ec097068438..9aaabc2e6c6384 100644
--- a/FortranRuntime/unittests/Runtime/Stop.cpp
+++ b/flang-rt/unittests/Runtime/Stop.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 #include "flang/Runtime/stop.h"
 #include "CrashHandlerFixture.h"
-#include "../../lib/Runtime/environment.h"
+#include "../../lib/flang_rt/environment.h"
 #include <cstdlib>
 #include <gtest/gtest.h>
 
diff --git a/FortranRuntime/unittests/Runtime/Support.cpp b/flang-rt/unittests/Runtime/Support.cpp
similarity index 98%
rename from FortranRuntime/unittests/Runtime/Support.cpp
rename to flang-rt/unittests/Runtime/Support.cpp
index 05328e6baa411c..d37369df025f45 100644
--- a/FortranRuntime/unittests/Runtime/Support.cpp
+++ b/flang-rt/unittests/Runtime/Support.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/support.h"
-#include "FortranRuntime/Runtime/descriptor.h"
+#include "flang-rt/flang_rt/descriptor.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 
diff --git a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp b/flang-rt/unittests/Runtime/TemporaryStack.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/TemporaryStack.cpp
rename to flang-rt/unittests/Runtime/TemporaryStack.cpp
index b0b1041f0f09e7..8a9f2dfe6d22f1 100644
--- a/FortranRuntime/unittests/Runtime/TemporaryStack.cpp
+++ b/flang-rt/unittests/Runtime/TemporaryStack.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
diff --git a/FortranRuntime/unittests/Runtime/Time.cpp b/flang-rt/unittests/Runtime/Time.cpp
similarity index 100%
rename from FortranRuntime/unittests/Runtime/Time.cpp
rename to flang-rt/unittests/Runtime/Time.cpp
diff --git a/FortranRuntime/unittests/Runtime/Transformational.cpp b/flang-rt/unittests/Runtime/Transformational.cpp
similarity index 99%
rename from FortranRuntime/unittests/Runtime/Transformational.cpp
rename to flang-rt/unittests/Runtime/Transformational.cpp
index 6b8903750d0aec..e8981e9b122eb7 100644
--- a/FortranRuntime/unittests/Runtime/Transformational.cpp
+++ b/flang-rt/unittests/Runtime/Transformational.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Runtime/transformational.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "tools.h"
 #include "flang/Common/float128.h"
diff --git a/FortranRuntime/unittests/Runtime/tools.h b/flang-rt/unittests/Runtime/tools.h
similarity index 95%
rename from FortranRuntime/unittests/Runtime/tools.h
rename to flang-rt/unittests/Runtime/tools.h
index 8000d83fc0c394..7edeff7f7eb579 100644
--- a/FortranRuntime/unittests/Runtime/tools.h
+++ b/flang-rt/unittests/Runtime/tools.h
@@ -9,8 +9,8 @@
 #ifndef FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 #define FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_
 
-#include "FortranRuntime/Runtime/descriptor.h"
-#include "FortranRuntime/Runtime/type-code.h"
+#include "flang-rt/flang_rt/descriptor.h"
+#include "flang-rt/flang_rt/type-code.h"
 #include "gtest/gtest.h"
 #include "flang/Runtime/allocatable.h"
 #include "flang/Runtime/cpp-type.h"
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index ac189de2386b16..34c5661c963a80 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -23,7 +23,6 @@ if (LLVM_ENABLE_EH)
 endif()
 
 set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-set(FORTRANRUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../FortranRuntime")
 
 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
   message(FATAL_ERROR "In-source builds are not allowed. \
@@ -247,13 +246,11 @@ set(LLVM_BUILD_TOOLS ON)
 
 include_directories(BEFORE
   ${FLANG_BINARY_DIR}/include
-  ${FLANG_SOURCE_DIR}/include
-  ${FORTRANRUNTIME_SOURCE_DIR}/include)
+  ${FLANG_SOURCE_DIR}/include)
 
 # Add Flang-centric modules to cmake path.
 list(INSERT CMAKE_MODULE_PATH 0
   "${FLANG_SOURCE_DIR}/cmake/modules"
-  "${FORTRANRUNTIME_SOURCE_DIR}/cmake/modules"
   "${LLVM_COMMON_CMAKE_UTILS}/Modules"
   )
 include(AddFlang)
@@ -271,7 +268,7 @@ set(FLANG_DEFAULT_LINKER "" CACHE STRING
   "Default linker to use (linker name or absolute path, empty for platform default)")
 
 set(FLANG_DEFAULT_RTLIB "" CACHE STRING
-   "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.")
+   "Default Fortran runtime library to use (\"libflang_rt\"), leave empty for platform default.")
 
 if (NOT(FLANG_DEFAULT_RTLIB STREQUAL ""))
   message(WARNING "Resetting Flang's default runtime library to use platform default.")
diff --git a/FortranRuntime/cmake/modules/FlangCommon.cmake b/flang/cmake/modules/FlangCommon.cmake
similarity index 93%
rename from FortranRuntime/cmake/modules/FlangCommon.cmake
rename to flang/cmake/modules/FlangCommon.cmake
index d7194ad4d7ef56..1b8606843b2240 100644
--- a/FortranRuntime/cmake/modules/FlangCommon.cmake
+++ b/flang/cmake/modules/FlangCommon.cmake
@@ -1,43 +1,43 @@
-#===-- cmake/modules/FlangCommon.txt ----------------------------===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-#
-# CMake definitions shared betwween Flang and FortranRuntime
-#
-#===------------------------------------------------------------------------===#
-
-# The out of tree builds of the compiler and the Fortran runtime
-# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
-# to be composable. Failure to synchronize this setting may result
-# in linking errors or fatal failures in F128 runtime functions.
-set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
-  "Specifies the target library used for implementing IEEE-754 128-bit float \
-  math in F18 runtime, e.g. it might be libquadmath for targets where \
-  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
-  is mapped to long double, etc."
-  )
-if (FLANG_RUNTIME_F128_MATH_LIB)
-  add_compile_definitions(FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}")
-endif()
-
-# Check if 128-bit float computations can be done via long double
-check_cxx_source_compiles(
-  "#include <cfloat>
-   #if LDBL_MANT_DIG != 113
-   #error LDBL_MANT_DIG != 113
-   #endif
-   int main() { return 0; }
-  "
-  HAVE_LDBL_MANT_DIG_113)
-
-include(TestBigEndian)
-test_big_endian(IS_BIGENDIAN)
-if (IS_BIGENDIAN)
-  add_compile_definitions(FLANG_BIG_ENDIAN=1)
-else ()
-  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
-endif ()
+#===-- cmake/modules/FlangCommon.txt ----------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+#
+# CMake definitions shared between Flang and Flang-RT
+#
+#===------------------------------------------------------------------------===#
+
+# The out of tree builds of the compiler and the Fortran runtime
+# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
+# to be composable. Failure to synchronize this setting may result
+# in linking errors or fatal failures in F128 runtime functions.
+set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
+  "Specifies the target library used for implementing IEEE-754 128-bit float \
+  math in F18 runtime, e.g. it might be libquadmath for targets where \
+  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
+  is mapped to long double, etc."
+  )
+if (FLANG_RUNTIME_F128_MATH_LIB)
+  add_compile_definitions(FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}")
+endif()
+
+# Check if 128-bit float computations can be done via long double
+check_cxx_source_compiles(
+  "#include <cfloat>
+   #if LDBL_MANT_DIG != 113
+   #error LDBL_MANT_DIG != 113
+   #endif
+   int main() { return 0; }
+  "
+  HAVE_LDBL_MANT_DIG_113)
+
+include(TestBigEndian)
+test_big_endian(IS_BIGENDIAN)
+if (IS_BIGENDIAN)
+  add_compile_definitions(FLANG_BIG_ENDIAN=1)
+else ()
+  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
+endif ()
diff --git a/flang/docs/FlangDriver.md b/flang/docs/FlangDriver.md
index 98611ee338e706..5165ac6c323ac2 100644
--- a/flang/docs/FlangDriver.md
+++ b/flang/docs/FlangDriver.md
@@ -179,18 +179,18 @@ like this:
 
 ```
 $ flang -v -o example example.o
-"/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" [...]
+"/usr/bin/ld" [...] example.o [...] "-lflang_rt" [...]
 ```
 
 The automatically added libraries are:
 
-* `FortranRuntime`: Provides most of the Flang runtime library.
+* `flang_rt`: Provides most of the Flang runtime library.
 
 If the code is C/C++ based and invokes Fortran routines, one can either use Clang
 or Flang as the linker driver.  If Clang is used, it will automatically all
 required runtime libraries needed by C++ (e.g., for STL) to the linker invocation.
-In this case, one has to explicitly provide the Fortran runtime libraries
-`FortranRuntime`.  An alternative is to use Flang to link.
+In this case, one has to explicitly provide the Fortran runtime library
+`flang_ty`.  An alternative is to use Flang to link.
 In this case, it may be required to explicitly supply C++ runtime libraries.
 
 On Darwin, the logical root where the system libraries are located (sysroot)
diff --git a/flang/docs/GettingStarted.md b/flang/docs/GettingStarted.md
index eb9049ad607570..9061a00c2de250 100644
--- a/flang/docs/GettingStarted.md
+++ b/flang/docs/GettingStarted.md
@@ -32,8 +32,8 @@ tool.
 
 ### Building flang in tree (bootstrap build)
 Building flang in tree means building flang along with all of the projects on
-which it depends.  These projects include mlir, clang, flang, openmp,
-compiler-rt, and FortranRuntime.  Note that compiler-rt is only needed to access libraries that
+which it depends.  These projects include mlir, clang, flang, openmp, and
+compiler-rt.  Note that compiler-rt is only needed to access libraries that
 support 16 bit floating point numbers.  It's not needed to run the automated
 tests.  You can use several different C++ compilers for most of the build,
 includig GNU and clang.  But building compiler-rt requres using the clang
@@ -82,7 +82,7 @@ cmake \
   -DLLVM_TARGETS_TO_BUILD=host \
   -DLLVM_LIT_ARGS=-v \
   -DLLVM_ENABLE_PROJECTS="clang;mlir;flang;openmp" \
-  -DLLVM_ENABLE_RUNTIMES="compiler-rt;FortranRuntime" \
+  -DLLVM_ENABLE_RUNTIMES="compiler-rt;flang_rt" \
   ../llvm-project/llvm
 
 ninja
@@ -209,15 +209,15 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
-  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
+  -DLLVM_ENABLE_RUNTIMES=flang_rt \
+  -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
   -DCMAKE_CUDA_COMPILER=clang \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
   ../runtimes/
-make -j`nprocs` FortranRuntime
+make -j`nprocs` flang_rt
 ```
 
 Note that the used version of `clang` must [support](https://releases.llvm.org/16.0.0/tools/clang/docs/ReleaseNotes.html#cuda-support)
@@ -232,8 +232,8 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
-  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
+  -DLLVM_ENABLE_RUNTIMES=flang_rt \
+  -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
@@ -241,7 +241,7 @@ cmake \
   -DCMAKE_CUDA_HOST_COMPILER=clang++ \
   ../runtimes/
 
-make -j`nprocs` FortranRuntime
+make -j`nprocs` flang_rt
 ```
 
 Note that `nvcc` might limit support to certain
@@ -260,8 +260,8 @@ build config:
 
 For example:
 ```bash
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
-  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
+  -DLLVM_ENABLE_RUNTIMES=flang_rt \
+  -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
@@ -272,8 +272,8 @@ For example:
 
 Or:
 ```bash
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
-  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
+  -DLLVM_ENABLE_RUNTIMES=flang_rt \
+  -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
   -DCMAKE_CUDA_ARCHITECTURES=80 \
   -DCMAKE_C_COMPILER=gcc \
   -DCMAKE_CXX_COMPILER=g++ \
@@ -295,14 +295,14 @@ mkdir build_flang_runtime
 cd build_flang_runtime
 
 cmake \
-  -DLLVM_ENABLE_RUNTIMES=FortranRuntime \
-  -DFORTRANRUNTIME_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
+  -DLLVM_ENABLE_RUNTIMES=flang_rt \
+  -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
-  -DFORTRANRUNTIME_DEVICE_ARCHITECTURES="all" \
+  -DFLANG_RT_DEVICE_ARCHITECTURES="all" \
   ../runtimes/
 
-make -j`nprocs` FortranRuntime
+make -j`nprocs` flang_rt
 ```
 
 The result of the build is a "device-only" library, i.e. the host
diff --git a/flang/docs/OpenACC-descriptor-management.md b/flang/docs/OpenACC-descriptor-management.md
index 0b5103000d8e7c..215643086fb7d1 100644
--- a/flang/docs/OpenACC-descriptor-management.md
+++ b/flang/docs/OpenACC-descriptor-management.md
@@ -427,7 +427,7 @@ The implementation's behavior may be described as (OpenACC 2.7.2):
 
 All the "is-present" checks and the data actions for the auxiliary pointers must be performed atomically with regards to the present counters bookkeeping.
 
-The API relies on the primitives provided by `liboffload`, so it is provided by a new F18 runtime library, e.g. `FortranOffloadRuntime`, that depends on `FortranRuntime` and `liboffload`.  The F18 driver adds `FortranOffloadRuntime` for linking under `-fopenacc`/`-fopenmp` (and maybe additional switches like `-fopenmp-targets`).
+The API relies on the primitives provided by `liboffload`, so it is provided by a new F18 runtime library, e.g. `FortranOffloadRuntime`, that depends on `flang_rt` and `liboffload`.  The F18 driver adds `FortranOffloadRuntime` for linking under `-fopenacc`/`-fopenmp` (and maybe additional switches like `-fopenmp-targets`).
 
 ## TODOs:
 
diff --git a/flang/docs/ReleaseNotes.md b/flang/docs/ReleaseNotes.md
index 80ebbb5481ba50..347f470452b247 100644
--- a/flang/docs/ReleaseNotes.md
+++ b/flang/docs/ReleaseNotes.md
@@ -36,12 +36,13 @@ page](https://llvm.org/releases/).
 
 ## Build System Changes
 
- * The Fortran Runtime library (libFortranRuntime) has been move to a new
-   top-level directory named "FortranRuntime". It now supports the
-   LLVM_ENABLE_RUNTIMES mechanism to build libFortranRuntime for multiple target
-   triples. libFortranRuntime.a will now be emitted into Clang's per-target
-   resource directory (next to libclang_rt) where it is also found by Flang's
-   driver.
+ * The Fortran Runtime library has been move to a new top-level directory
+   named "flang-rt". The library was also renamed from `libFortranRuntime.a` to
+   `libflang_rt.a`. It now supports the
+   LLVM_ENABLE_RUNTIMES mechanism to build flang-rt for multiple target
+   triples. libflang_rt.a will now be emitted into Clang's per-target
+   resource directory (next to libclang_rt.*.*) where it is also found by
+   Flang's driver.
 
 ## New Issues Found
 
diff --git a/flang/examples/ExternalHelloWorld/CMakeLists.txt b/flang/examples/ExternalHelloWorld/CMakeLists.txt
index 042d4b6238ba45..213fc462ac2b1a 100644
--- a/flang/examples/ExternalHelloWorld/CMakeLists.txt
+++ b/flang/examples/ExternalHelloWorld/CMakeLists.txt
@@ -5,5 +5,5 @@ add_llvm_example(external-hello-world
 
 target_link_libraries(external-hello-world
   PRIVATE
-  FortranRuntime
+  flang_rt
   )
diff --git a/flang/include/flang/Common/README.md b/flang/include/flang/Common/README.md
index a722732fb76407..5203465f7f2fa9 100644
--- a/flang/include/flang/Common/README.md
+++ b/flang/include/flang/Common/README.md
@@ -1,8 +1,8 @@
-Files in this directory are used by Flang (the compiler) and FortranRuntime
+Files in this directory are used by Flang (the compiler) and flang-rt
 (the runtime library for Flang-compiled programs). They must be compatible by
 both. For definitions used only by Flang, consider
 `flang/{lib,include/flang}/Support` instead. For definitions used only by
-FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+the runtime, consider `flang-rt/{lib,include/flang-rt}/flang_rt`.
 
 The requirements for common code include:
 
@@ -23,3 +23,5 @@ The requirements for common code include:
 
  * Global declarations may need to be annotated using definitions from
    `api-attrs.h`.
+
+ * The `Runtime` component is header-only.
diff --git a/flang/include/flang/ISO_Fortran_binding.h b/flang/include/flang/ISO_Fortran_binding.h
index 89a10ce69a2ba2..b211bcd98af868 100644
--- a/flang/include/flang/ISO_Fortran_binding.h
+++ b/flang/include/flang/ISO_Fortran_binding.h
@@ -1,3 +1,11 @@
+//===-- include/flang/ISO_Fortran_binding.h ---------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
 /*===-- include/flang/ISO_Fortran_binding.h -----------------------*- C++ -*-===
  *
  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
@@ -7,14 +15,14 @@
  * ===-----------------------------------------------------------------------===
  */
 
-#ifndef CFI_ISO_FORTRAN_BINDING_H_
-#define CFI_ISO_FORTRAN_BINDING_H_
+#ifndef FORTRAN_ISO_FORTRAN_BINDING_H_
+#define FORTRAN_ISO_FORTRAN_BINDING_H_
 
 /* When this header is included into the compiler and runtime implementations,
  * it does so by means of a wrapper header that establishes namespaces and
  * a macro for extra function attributes (RT_API_ATTRS).
  */
-#ifndef FORTRAN_ISO_FORTRAN_BINDING_WRAPPER_H_
+#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_
 #include <stddef.h>
 #define FORTRAN_ISO_NAMESPACE_
 #endif
@@ -207,4 +215,4 @@ RT_API_ATTRS int CFI_setpointer(
 } // extern "C"
 #endif
 
-#endif /* CFI_ISO_FORTRAN_BINDING_H_ */
+#endif /* FORTRAN_ISO_FORTRAN_BINDING_H_ */
diff --git a/flang/include/flang/Runtime/README.md b/flang/include/flang/Runtime/README.md
index a13a7e23162e98..5203465f7f2fa9 100644
--- a/flang/include/flang/Runtime/README.md
+++ b/flang/include/flang/Runtime/README.md
@@ -1,8 +1,8 @@
-Files in this directory are used by Flang (the compiler) and FortranRuntime
+Files in this directory are used by Flang (the compiler) and flang-rt
 (the runtime library for Flang-compiled programs). They must be compatible by
 both. For definitions used only by Flang, consider
 `flang/{lib,include/flang}/Support` instead. For definitions used only by
-FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+the runtime, consider `flang-rt/{lib,include/flang-rt}/flang_rt`.
 
 The requirements for common code include:
 
diff --git a/flang/include/flang/Testing/README.md b/flang/include/flang/Testing/README.md
index a722732fb76407..5203465f7f2fa9 100644
--- a/flang/include/flang/Testing/README.md
+++ b/flang/include/flang/Testing/README.md
@@ -1,8 +1,8 @@
-Files in this directory are used by Flang (the compiler) and FortranRuntime
+Files in this directory are used by Flang (the compiler) and flang-rt
 (the runtime library for Flang-compiled programs). They must be compatible by
 both. For definitions used only by Flang, consider
 `flang/{lib,include/flang}/Support` instead. For definitions used only by
-FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+the runtime, consider `flang-rt/{lib,include/flang-rt}/flang_rt`.
 
 The requirements for common code include:
 
@@ -23,3 +23,5 @@ The requirements for common code include:
 
  * Global declarations may need to be annotated using definitions from
    `api-attrs.h`.
+
+ * The `Runtime` component is header-only.
diff --git a/flang/lib/Common/README.md b/flang/lib/Common/README.md
index a722732fb76407..5203465f7f2fa9 100644
--- a/flang/lib/Common/README.md
+++ b/flang/lib/Common/README.md
@@ -1,8 +1,8 @@
-Files in this directory are used by Flang (the compiler) and FortranRuntime
+Files in this directory are used by Flang (the compiler) and flang-rt
 (the runtime library for Flang-compiled programs). They must be compatible by
 both. For definitions used only by Flang, consider
 `flang/{lib,include/flang}/Support` instead. For definitions used only by
-FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+the runtime, consider `flang-rt/{lib,include/flang-rt}/flang_rt`.
 
 The requirements for common code include:
 
@@ -23,3 +23,5 @@ The requirements for common code include:
 
  * Global declarations may need to be annotated using definitions from
    `api-attrs.h`.
+
+ * The `Runtime` component is header-only.
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index b98ab3e6999655..44c8fba5ee3c66 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -751,7 +751,7 @@ prettyPrintIntrinsicName(fir::FirOpBuilder &builder, mlir::Location loc,
 // Generate a call to the Fortran runtime library providing
 // support for 128-bit float math.
 // On 'LDBL_MANT_DIG == 113' targets the implementation
-// is provided by FortranRuntime, otherwise, it is done via
+// is provided by flang-rt, otherwise, it is done via
 // FortranFloat128Math library. In the latter case the compiler
 // has to be built with FLANG_RUNTIME_F128_MATH_LIB to guarantee
 // proper linking actions in the driver.
diff --git a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
index d7d321c6b9af3f..68ce3ab7045505 100644
--- a/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/CufOpConversion.cpp
@@ -1,4 +1,4 @@
-//===-- CufOpConversion.cpp -----------------------------------------------===//
+//===-- lib/Optimizer/Transforms/CufOpConversion.cpp ------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/flang/lib/Testing/CMakeLists.txt b/flang/lib/Testing/CMakeLists.txt
deleted file mode 100644
index d5caada3fb68e8..00000000000000
--- a/flang/lib/Testing/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-#===-- lib/Testing/CMakeLists.txt ------------------------------------------===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-
-set(public_headers "")
-file(GLOB_RECURSE public_headers
-  "${FLANGRUNTIME_SOURCE_DIR}/lib/Testing/*.h"
-)
-
-add_fortranruntime_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
-  testing.cpp
-  fp-testing.cpp
- ADDITIONAL_HEADERS
-   ${public_headers}
-)
-
diff --git a/flang/lib/Testing/README.md b/flang/lib/Testing/README.md
index a722732fb76407..5203465f7f2fa9 100644
--- a/flang/lib/Testing/README.md
+++ b/flang/lib/Testing/README.md
@@ -1,8 +1,8 @@
-Files in this directory are used by Flang (the compiler) and FortranRuntime
+Files in this directory are used by Flang (the compiler) and flang-rt
 (the runtime library for Flang-compiled programs). They must be compatible by
 both. For definitions used only by Flang, consider
 `flang/{lib,include/flang}/Support` instead. For definitions used only by
-FortranRuntime, consider `FortranRuntime/{lib,include/FortranRuntime}/Runtime`.
+the runtime, consider `flang-rt/{lib,include/flang-rt}/flang_rt`.
 
 The requirements for common code include:
 
@@ -23,3 +23,5 @@ The requirements for common code include:
 
  * Global declarations may need to be annotated using definitions from
    `api-attrs.h`.
+
+ * The `Runtime` component is header-only.
diff --git a/FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90 b/flang/module/iso_fortran_env_impl.f90
similarity index 97%
rename from FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90
rename to flang/module/iso_fortran_env_impl.f90
index 1a4da69266c55b..782be81791af2e 100644
--- a/FortranRuntime/lib/Runtime/iso_fortran_env_impl.f90
+++ b/flang/module/iso_fortran_env_impl.f90
@@ -1,4 +1,4 @@
-!===-- lib/Runtime/iso_fortran_env_impl.f90 --------------------------------===!
+!===-- module/iso_fortran_env_impl.f90 --=--------------------------------===!
 !
 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 ! See https://llvm.org/LICENSE.txt for license information.
@@ -8,7 +8,7 @@
 
 ! This MODULE implements part of the ISO_FORTRAN_ENV module file, which
 ! partially requires linkable symbols for some entities defined
-! (e.g., real_kinds).
+! (e.g., real_kinds). Hence, this file is also used by Flang-RT.
 
 module iso_fortran_env_impl
   implicit none
diff --git a/flang/test/Driver/gcc-toolchain-install-dir.f90 b/flang/test/Driver/gcc-toolchain-install-dir.f90
index 5a073b0c517122..d9160e1971250f 100644
--- a/flang/test/Driver/gcc-toolchain-install-dir.f90
+++ b/flang/test/Driver/gcc-toolchain-install-dir.f90
@@ -1,5 +1,5 @@
 !! Test that --gcc-toolchain and --gcc-install-dir options are working as expected.
-!! It does not test cross-compiling (--sysroot), so crtbegin.o, libgcc/compiler-rt, libc, libFortranRuntime, etc. are not supposed to be affected.
+!! It does not test cross-compiling (--sysroot), so crtbegin.o, libgcc/compiler-rt, libc, libflang_rt, etc. are not supposed to be affected.
 !! PREFIX is captured twice because the driver escapes backslashes (occuring in Windows paths) in the -### output, but not on the "Selected GCC installation:" line.
 
 ! RUN: %flang 2>&1 -### -v -o %t %s -no-integrated-as -fuse-ld=ld --target=i386-unknown-linux-gnu --gcc-install-dir=%S/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0 | FileCheck %s --check-prefix=CHECK-I386
diff --git a/flang/test/Driver/linker-flags.f90 b/flang/test/Driver/linker-flags.f90
index fdeb95e4dd97c6..5dc89fe45c8cc0 100644
--- a/flang/test/Driver/linker-flags.f90
+++ b/flang/test/Driver/linker-flags.f90
@@ -33,26 +33,26 @@
 ! SOLARIS-F128NONE-NOT: FortranFloat128Math
 ! UNIX-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
 ! SOLARIS-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "-z" "ignore" "-lquadmath" "-z" "record"
-! UNIX-SAME: "-lFortranRuntime" "-lm"
+! UNIX-SAME: "-lflang_rt" "-lm"
 ! COMPILER-RT: "{{.*}}{{\\|/}}libclang_rt.builtins.a"
 
 ! DARWIN-LABEL:  "{{.*}}ld{{(\.exe)?}}"
 ! DARWIN-SAME: "[[object_file]]"
 ! DARWIN-F128NONE-NOT: FortranFloat128Math
 ! DARWIN-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
-! DARWIN-SAME: -lFortranRuntime
+! DARWIN-SAME: -lflang_rt
 
 ! HAIKU-LABEL:  "{{.*}}ld{{(\.exe)?}}"
 ! HAIKU-SAME: "[[object_file]]"
 ! HAIKU-F128NONE-NOT: FortranFloat128Math
 ! HAIKU-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
-! HAIKU-SAME: "-lFortranRuntime"
+! HAIKU-SAME: "-lflang_rt"
 
 ! MINGW-LABEL:  "{{.*}}ld{{(\.exe)?}}"
 ! MINGW-SAME: "[[object_file]]"
 ! MINGW-F128NONE-NOT: FortranFloat128Math
 ! MINGW-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
-! MINGW-SAME: -lFortranRuntime
+! MINGW-SAME: -lflang_rt
 
 ! NOTE: This also matches lld-link (when CLANG_DEFAULT_LINKER=lld) and
 !       any .exe suffix that is added when resolving to the full path of
diff --git a/flang/test/Driver/msvc-dependent-lib-flags.f90 b/flang/test/Driver/msvc-dependent-lib-flags.f90
index e7fa63548fa840..5e4e6d5952efda 100644
--- a/flang/test/Driver/msvc-dependent-lib-flags.f90
+++ b/flang/test/Driver/msvc-dependent-lib-flags.f90
@@ -6,23 +6,23 @@
 ! MSVC: -fc1
 ! MSVC-SAME: -D_MT
 ! MSVC-SAME: --dependent-lib=libcmt
-! MSVC-SAME: --dependent-lib=FortranRuntime.static.lib
+! MSVC-SAME: --dependent-lib=flang_rt.static.lib
 
 ! MSVC-DEBUG: -fc1
 ! MSVC-DEBUG-SAME: -D_MT
 ! MSVC-DEBUG-SAME: -D_DEBUG
 ! MSVC-DEBUG-SAME: --dependent-lib=libcmtd
-! MSVC-DEBUG-SAME: --dependent-lib=FortranRuntime.static_dbg.lib
+! MSVC-DEBUG-SAME: --dependent-lib=flang_rt.static_dbg.lib
 
 ! MSVC-DLL: -fc1
 ! MSVC-DLL-SAME: -D_MT
 ! MSVC-DLL-SAME: -D_DLL
 ! MSVC-DLL-SAME: --dependent-lib=msvcrt
-! MSVC-DLL-SAME: --dependent-lib=FortranRuntime.dynamic.lib
+! MSVC-DLL-SAME: --dependent-lib=flang_rt.dynamic.lib
 
 ! MSVC-DLL-DEBUG: -fc1
 ! MSVC-DLL-DEBUG-SAME: -D_MT
 ! MSVC-DLL-DEBUG-SAME: -D_DEBUG
 ! MSVC-DLL-DEBUG-SAME: -D_DLL
 ! MSVC-DLL-DEBUG-SAME: --dependent-lib=msvcrtd
-! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranRuntime.dynamic_dbg.lib
+! MSVC-DLL-DEBUG-SAME: --dependent-lib=flang_rt.dynamic_dbg.lib
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
index 401c7cc2bdef79..ada258fae8f7a2 100644
--- a/flang/tools/f18/CMakeLists.txt
+++ b/flang/tools/f18/CMakeLists.txt
@@ -54,8 +54,6 @@ if (NOT CMAKE_CROSSCOMPILING)
   foreach(filename ${MODULES})
     set(depends "")
     set(opts "")
-    set(sourcepath "${FLANG_SOURCE_DIR}/module/${filename}.f90")
-    set(modpath "${FLANG_INTRINSIC_MODULES_DIR}/${filename}.mod")
     if(${filename} STREQUAL "__fortran_builtins" OR
        ${filename} STREQUAL "__ppc_types")
     elseif(${filename} STREQUAL "__ppc_intrinsics" OR
@@ -66,9 +64,6 @@ if (NOT CMAKE_CROSSCOMPILING)
       set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__cuda_builtins.mod)
     else()
       set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
-      if(${filename} STREQUAL "iso_fortran_env_impl")
-        set(sourcepath "${FORTRANRUNTIME_SOURCE_DIR}/lib/Runtime/${filename}.f90")
-      endif()
       if(${filename} STREQUAL "iso_fortran_env")
         set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/iso_fortran_env_impl.mod)
       endif()
@@ -97,27 +92,20 @@ if (NOT CMAKE_CROSSCOMPILING)
       set(decls "-DFLANG_SUPPORT_R16")
     endif()
 
-    # Some modules have an implementation part that needs to be added to the
-    # FortranRuntime library.
     set(compile_with "-fsyntax-only")
     set(object_output "")
     set(include_in_link FALSE)
 
+    set(base ${FLANG_INTRINSIC_MODULES_DIR}/${filename})
     # TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
-    add_custom_command(OUTPUT ${modpath} ${object_output}
+    add_custom_command(OUTPUT ${base}.mod ${object_output}
       COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
       COMMAND flang-new ${opts} ${decls} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
-        ${sourcepath}
-      DEPENDS flang-new ${sourcepath} ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
+        ${FLANG_SOURCE_DIR}/module/${filename}.f90
+      DEPENDS flang-new ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
     )
-    list(APPEND MODULE_FILES "${modpath}")
-    install(FILES "${modpath}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
-
-    # If a module has been compiled into an object file, add the file to
-    # the link line for the FortranRuntime library.
-    if(include_in_link)
-      list(APPEND module_objects ${object_output})
-    endif()
+    list(APPEND MODULE_FILES ${base}.mod)
+    install(FILES ${base}.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
   endforeach()
 
   # Special case for omp_lib.mod, because its source comes from openmp/runtime/src/include.
diff --git a/flang/unittests/Common/CMakeLists.txt b/flang/unittests/Common/CMakeLists.txt
index 5b3aebaf5f654a..709a02f5c789c7 100644
--- a/flang/unittests/Common/CMakeLists.txt
+++ b/flang/unittests/Common/CMakeLists.txt
@@ -6,8 +6,8 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_fortranruntime_unittest(FlangCommonTests
+add_flangrt_unittest(FlangCommonTests
   FastIntSetTest.cpp
   LINK_LIBS
-    FortranRuntime.unittest
+    flang_rt.unittest
 )
diff --git a/flang/unittests/Decimal/CMakeLists.txt b/flang/unittests/Decimal/CMakeLists.txt
index 033773049680f6..aaa3210aade7e3 100644
--- a/flang/unittests/Decimal/CMakeLists.txt
+++ b/flang/unittests/Decimal/CMakeLists.txt
@@ -6,15 +6,15 @@
 #
 #===------------------------------------------------------------------------===#
 
-add_fortranruntime_nongtest_unittest(quick-sanity-test
+add_flangrt_nongtest_unittest(quick-sanity-test
 quick-sanity-test.cpp
 LINK_LIBS
-  FortranRuntime.unittest
+  flang_rt.unittest
 )
 
 # This test is not run by default as it takes a long time to execute.
-add_fortranruntime_nongtest_unittest(thorough-test SLOW_TEST
+add_flangrt_nongtest_unittest(thorough-test SLOW_TEST
 thorough-test.cpp
 LINK_LIBS
-  FortranRuntime.unittest
+  flang_rt.unittest
 )
diff --git a/lld/COFF/MinGW.cpp b/lld/COFF/MinGW.cpp
index 74d1ae0615fa6a..ae51bd5fcae62e 100644
--- a/lld/COFF/MinGW.cpp
+++ b/lld/COFF/MinGW.cpp
@@ -50,11 +50,11 @@ AutoExporter::AutoExporter(
       "libclang_rt.profile-x86_64",
       "libc++",
       "libc++abi",
-      "libFortranRuntime",
-      "libFortranRuntime.static",
-      "libFortranRuntime.dynamic",
-      "libFortranRuntime.static_dbg",
-      "libFortranRuntime.dynamic_dbg",
+      "libflang_rt",
+      "libflang_rt.static",
+      "libflang_rt.dynamic",
+      "libflang_rtstatic_dbg",
+      "libflang_rt.dynamic_dbg",
       "libunwind",
       "libmsvcrt",
       "libucrtbase",
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 70f6f50ee5e11a..60daeaae6613e9 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -149,7 +149,7 @@ endif()
 # As we migrate runtimes to using the bootstrapping build, the set of default runtimes
 # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
 set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
-set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload;FortranRuntime")
+set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload;flang-rt")
 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
 if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
diff --git a/llvm/projects/CMakeLists.txt b/llvm/projects/CMakeLists.txt
index d8808bc79f0129..f254cf10806d75 100644
--- a/llvm/projects/CMakeLists.txt
+++ b/llvm/projects/CMakeLists.txt
@@ -12,7 +12,7 @@ foreach(entry ${entries})
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/test-suite) AND
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/openmp) AND
        (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/cross-project-tests) AND
-       (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/FortranRuntime))
+       (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/flang-rt))
       get_filename_component(entry_name "${entry}" NAME)
       add_llvm_external_project(${entry_name})
     endif()
@@ -38,7 +38,7 @@ if(${LLVM_BUILD_RUNTIME})
   if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
     add_llvm_external_project(compiler-rt)
   endif()
-  add_llvm_external_project(FortranRuntime)
+  add_llvm_external_project(flang-rt)
 endif()
 
 add_llvm_external_project(dragonegg)
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 80f1cf5d6b6ea6..79abe65b4c17d6 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -280,8 +280,8 @@ function(runtime_default_target)
                                       ${ARG_CMAKE_ARGS}
                            PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES
                                                 LLVM_USE_LINKER
-                                                CUDA # For runtimes that may look for the CUDA SDK (libc, offload)
-                                                FLANG_RUNTIME # Shared between Flang and FortranRuntime
+                                                CUDA # For runtimes that may look for the CUDA SDK (libc, offload, flang-rt)
+                                                FLANG_RUNTIME # Shared between Flang and Flang-RT
                                                 ${ARG_PREFIXES}
                            EXTRA_TARGETS ${extra_targets}
                                          ${test_targets}
@@ -573,7 +573,7 @@ if(build_runtimes)
   if(LLVM_LIBC_FULL_BUILD)
     list(APPEND extra_cmake_args "-DLLVM_LIBC_FULL_BUILD=ON")
   endif()
-  if("FortranRuntime" IN_LIST LLVM_ENABLE_RUNTIMES)
+  if("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
     set(enable_fortran ENABLE_FORTRAN)
   endif ()
 
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 2a7798fd60af42..1dc42ddc27d2d0 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -23,8 +23,8 @@ list(INSERT CMAKE_MODULE_PATH 0
 
 # We order libraries to mirror roughly how they are layered, except that compiler-rt can depend
 # on libc++, so we put it after.
-set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload;FortranRuntime")
-set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc")
+set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload")
+set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc;flang-rt")
 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
 if(LLVM_ENABLE_RUNTIMES STREQUAL "all" )

>From cf35e503c8642f4f378f910faf51de5da75607b2 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 16 Oct 2024 12:46:47 +0200
Subject: [PATCH 20/32] Update MinGW.cpp

---
 lld/COFF/MinGW.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lld/COFF/MinGW.cpp b/lld/COFF/MinGW.cpp
index ae51bd5fcae62e..d5614996e490c2 100644
--- a/lld/COFF/MinGW.cpp
+++ b/lld/COFF/MinGW.cpp
@@ -53,7 +53,7 @@ AutoExporter::AutoExporter(
       "libflang_rt",
       "libflang_rt.static",
       "libflang_rt.dynamic",
-      "libflang_rtstatic_dbg",
+      "libflang_rt.static_dbg",
       "libflang_rt.dynamic_dbg",
       "libunwind",
       "libmsvcrt",

>From 193d23da25f4f76a466262198e90bb02c93d4046 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 17 Oct 2024 17:25:26 +0200
Subject: [PATCH 21/32] Undo whitespace changes in common.cpp

---
 flang/lib/Evaluate/common.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/flang/lib/Evaluate/common.cpp b/flang/lib/Evaluate/common.cpp
index ed040b0728c4db..c633bff57b1ecd 100644
--- a/flang/lib/Evaluate/common.cpp
+++ b/flang/lib/Evaluate/common.cpp
@@ -11,11 +11,8 @@
 
 using namespace Fortran::parser::literals;
 
-
-
 namespace Fortran::evaluate {
 
-
 void RealFlagWarnings(
     FoldingContext &context, const RealFlags &flags, const char *operation) {
   if (context.languageFeatures().ShouldWarn(

>From 035afc6b79f353ea580ced166d4880b8b65bd2de Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 17 Oct 2024 21:52:53 +0200
Subject: [PATCH 22/32] use ARG_EXTRA_ARGS

---
 llvm/runtimes/CMakeLists.txt | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 79abe65b4c17d6..6e2a4a10522e38 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -137,7 +137,6 @@ function(builtin_register_target compiler_rt_path name)
                                       -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
                                       -DLLVM_CMAKE_DIR=${CMAKE_BINARY_DIR}
                                       -DCMAKE_C_COMPILER_WORKS=ON
-                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
                                       -DCMAKE_ASM_COMPILER_WORKS=ON
                                       -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
                                       ${COMMON_CMAKE_ARGS}
@@ -232,7 +231,7 @@ foreach(entry ${runtimes})
 endforeach()
 
 function(runtime_default_target)
-  cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;PREFIXES" ${ARGN})
+  cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;PREFIXES;EXTRA_ARGS" ${ARGN})
 
   include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL)
   set(SUB_CHECK_TARGETS ${SUB_CHECK_TARGETS} PARENT_SCOPE)
@@ -263,7 +262,6 @@ function(runtime_default_target)
   llvm_ExternalProject_Add(runtimes
                            ${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes
                            DEPENDS ${ARG_DEPENDS}
-                           ${enable_fortran}
                            # Builtins were built separately above
                            CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off
                                       -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
@@ -291,7 +289,7 @@ function(runtime_default_target)
                            USE_TOOLCHAIN
                            TARGET_TRIPLE ${LLVM_TARGET_TRIPLE}
                            FOLDER "Runtimes"
-                           ${EXTRA_ARGS})
+                           ${EXTRA_ARGS} ${ARG_EXTRA_ARGS})
 endfunction()
 
 # runtime_register_target(name)
@@ -401,7 +399,6 @@ function(runtime_register_target name)
   llvm_ExternalProject_Add(runtimes-${name}
                            ${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes
                            DEPENDS ${ARG_DEPENDS}
-                           ${enable_fortran}
                            # Builtins were built separately above
                            CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=OFF
                                       -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
@@ -469,7 +466,7 @@ if(build_runtimes)
   # together in a single CMake invocation.
   set(extra_deps "")
   set(extra_cmake_args "")
-  set(enable_fortran "")
+  set(extra_args "")
 
   if(LLVM_INCLUDE_TESTS)
     foreach(dep FileCheck
@@ -574,21 +571,23 @@ if(build_runtimes)
     list(APPEND extra_cmake_args "-DLLVM_LIBC_FULL_BUILD=ON")
   endif()
   if("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
-    set(enable_fortran ENABLE_FORTRAN)
+    list(APPEND extra_args ENABLE_FORTRAN)
   endif ()
 
   if(NOT LLVM_RUNTIME_TARGETS)
     runtime_default_target(
       DEPENDS ${builtins_dep} ${extra_deps}
       CMAKE_ARGS ${extra_cmake_args}
-      PREFIXES ${prefixes})
+      PREFIXES ${prefixes}
+      EXTRA_ARGS ${extra_args})
     set(test_targets check-runtimes)
   else()
     if("default" IN_LIST LLVM_RUNTIME_TARGETS)
       runtime_default_target(
         DEPENDS ${builtins_dep} ${extra_deps}
         CMAKE_ARGS ${extra_cmake_args}
-        PREFIXES ${prefixes})
+        PREFIXES ${prefixes}
+        EXTRA_ARGS ${extra_args})
       list(REMOVE_ITEM LLVM_RUNTIME_TARGETS "default")
     else()
       add_custom_target(runtimes)
@@ -635,7 +634,7 @@ if(build_runtimes)
       runtime_register_target(${name}
         DEPENDS ${builtins_dep_name} ${extra_deps}
         CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name} ${extra_cmake_args}
-        EXTRA_ARGS TARGET_TRIPLE ${name})
+        EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
     endforeach()
 
     foreach(multilib ${LLVM_RUNTIME_MULTILIBS})
@@ -646,7 +645,7 @@ if(build_runtimes)
                      -DLLVM_RUNTIMES_PREFIX=${name}/
                      -DLLVM_RUNTIMES_LIBDIR_SUBDIR=${multilib}
           BASE_NAME ${name}
-          EXTRA_ARGS TARGET_TRIPLE ${name})
+          EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
       endforeach()
     endforeach()
   endif()

>From 08c1be224e69e1d3113984fb7cca5503d65f5d25 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 17 Oct 2024 22:55:26 +0200
Subject: [PATCH 23/32] Re-insert flang-rt dependency check

---
 llvm/CMakeLists.txt | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 60daeaae6613e9..71ce7593b6f395 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -144,6 +144,12 @@ if ("flang" IN_LIST LLVM_ENABLE_PROJECTS)
   endif()
 endif()
 
+if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
+  if (NOT "flang" IN_LIST LLVM_ENABLE_PROJECTS)
+    message(FATAL_ERROR "Flang is not enabled, but is required for the Flang-RT runtime")
+  endif ()
+endif ()
+
 # Select the runtimes to build
 #
 # As we migrate runtimes to using the bootstrapping build, the set of default runtimes

>From 2f36f41cd1de57c1ba30ef33b866963e3853c286 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 21 Oct 2024 18:02:37 +0200
Subject: [PATCH 24/32] Fix GTest include search path with other runtimes

---
 flang-rt/CMakeLists.txt                 | 2 +-
 flang-rt/cmake/modules/AddFlangRT.cmake | 4 ++--
 flang-rt/unittests/CMakeLists.txt       | 7 +++++--
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index bd83a51482f4af..2114792d7cc998 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -43,7 +43,7 @@ if (LLVM_TREE_AVAILABLE)
   # flang-new uses the same resource dir as clang.
   include(GetClangResourceDir)
   get_clang_resource_dir(FLANGRT_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
-  get_clang_resource_dir(FLANGRT_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command find the install prefix itself
+  get_clang_resource_dir(FLANGRT_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command finds the install prefix itself
 else ()
   set(FLANGRT_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
   set(FLANGRT_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 797eeddae32142..244aada5092887 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -102,8 +102,8 @@ function (add_flangrt_library name)
     else()
       llvm_map_components_to_libnames(llvm_libs Support)
     endif()
-    target_link_libraries(${name} PUBLIC  ${llvm_libs})
-    target_include_directories(${name} PRIVATE  ${LLVM_INCLUDE_DIRS})
+    target_link_libraries(${name} PUBLIC ${llvm_libs})
+    target_include_directories(${name} PUBLIC ${LLVM_INCLUDE_DIRS})
   endif ()
 
   # If this is part of the toolchain, put it into the compiler's resource
diff --git a/flang-rt/unittests/CMakeLists.txt b/flang-rt/unittests/CMakeLists.txt
index d6ed84c9f72bf0..43dc2b5a4ac48b 100644
--- a/flang-rt/unittests/CMakeLists.txt
+++ b/flang-rt/unittests/CMakeLists.txt
@@ -7,9 +7,8 @@
 #===------------------------------------------------------------------------===#
 
 # Add GTest if not already present.
-# Using a function so include_directories/LLVM_SUBPROJECT_TITLE does not propagate
+# Using a function so LLVM_SUBPROJECT_TITLE does not propagate.
 function (build_gtest)
-  include_directories("${LLVM_INCLUDE_DIR}" "${LLVM_MAIN_INCLUDE_DIR}")
   set(LLVM_SUBPROJECT_TITLE "Third-Party/Google Test")
   add_subdirectory("${LLVM_THIRD_PARTY_DIR}/unittest" "${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest")
 endfunction ()
@@ -17,6 +16,10 @@ if (NOT TARGET llvm_gtest)
   build_gtest()
 endif ()
 
+# LLVM's modified GTest depends on LLVM, but not all runtime projects using
+# GTest also add the include search path.
+target_include_directories(llvm_gtest PUBLIC "${LLVM_INCLUDE_DIR}" "${LLVM_MAIN_INCLUDE_DIR}")
+
 # Required because LLVMSupport is compiled with this option (by default).
 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
 

>From 3cf5f3fc31b024370fd8ddbb994362742e35d2a0 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 21 Oct 2024 20:04:57 +0200
Subject: [PATCH 25/32] Avoid global add_definitions

---
 flang-rt/CMakeLists.txt                 | 4 ----
 flang-rt/cmake/modules/AddFlangRT.cmake | 7 +++++++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 2114792d7cc998..942bc7274e42ee 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -143,10 +143,6 @@ endif()
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
 set(CMAKE_CXX_STANDARD_REQUIRED YES)
 
-# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
-# to avoid an unwanted dependency on libstdc++/libc++.so.
-add_definitions(-U_GLIBCXX_ASSERTIONS)
-add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
 
 configure_file(cmake/config.h.cmake.in config.h)
 
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 244aada5092887..ae867f3fe4e8eb 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -86,6 +86,13 @@ function (add_flangrt_library name)
   # For flang-rt's configured config.h to be found
   target_include_directories(${name} PRIVATE "${FLANGRT_BINARY_DIR}")
 
+  # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS
+  # build, to avoid an unwanted dependency on libstdc++/libc++.so.
+  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
+    target_compile_options(${name} PUBLIC -U_GLIBCXX_ASSERTIONS)
+    target_compile_options(${name} PUBLIC -U_LIBCPP_ENABLE_ASSERTIONS)
+  endif ()
+
   # Flang/Clang (including clang-cl) -compiled programs targeting the MSVC ABI
   # should only depend on msv(u)crt. LLVM still emits libgcc/compiler-rt
   # functions for 128-bit integer math (__udivti3, __modti3, __fixsfti,

>From 94725384ae691275abbb65e4f667a1f267a09b96 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 22 Oct 2024 11:34:11 +0200
Subject: [PATCH 26/32] Fix FortranFloat128Math include path

---
 flang-rt/README.md                              | 5 +++++
 flang-rt/lib/FortranFloat128Math/CMakeLists.txt | 9 +++++++++
 2 files changed, 14 insertions(+)

diff --git a/flang-rt/README.md b/flang-rt/README.md
index 01836f9d8f714d..b398ecdba82818 100644
--- a/flang-rt/README.md
+++ b/flang-rt/README.md
@@ -100,10 +100,15 @@ cmake -S <path-to-llvm-project>/runtimes                         \
   -GNinja                                                        \
   -DLLVM_BINARY_DIR=<path-to-llvm-builddir>                      \
   -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir>/bin/flang-new \
+  -DCMAKE_Fortran_COMPILER_WORKS=yes                             \
   -DLLVM_ENABLE_RUNTIMES=flang-rt                                \
   ...
 ```
 
+The `CMAKE_Fortran_COMPILER_WORKS` parameter must be set because otherwise CMake
+will test whether the Fortran compiler can compile and link programs which will
+obviously fail without a runtime library available yet.
+
 Building flang-rt for cross-compilation triple, the target triple can
 be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`.
 Of course, flang-rt can be built multiple times with different build
diff --git a/flang-rt/lib/FortranFloat128Math/CMakeLists.txt b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
index b12dfee64af8f6..0d8ef07d404029 100644
--- a/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
+++ b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
@@ -98,6 +98,9 @@ if (FLANG_RUNTIME_F128_MATH_LIB)
     add_flangrt_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
       ${sources})
    endif ()
+   target_include_directories(FortranFloat128Math PRIVATE
+     "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+     )
 elseif (HAVE_LDBL_MANT_DIG_113)
   # We can use 'long double' versions from libc.
   check_library_exists(m sinl "" FOUND_LIBM)
@@ -105,6 +108,9 @@ elseif (HAVE_LDBL_MANT_DIG_113)
     target_compile_definitions(FortranFloat128MathILib INTERFACE
       HAS_LIBM
       )
+    target_include_directories(FortranFloat128MathILib INTERFACE
+      "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+      )
     target_sources(FortranFloat128MathILib INTERFACE ${sources})
   else()
     message(FATAL_ERROR "flang-rt cannot build without libm")
@@ -116,6 +122,9 @@ else()
     target_compile_definitions(FortranFloat128MathILib INTERFACE
       HAS_LIBMF128
       )
+    target_include_directories(FortranFloat128MathILib INTERFACE
+      "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+      )
     # Enable this, when math-entries.h and complex-math.h is ready.
     # target_sources(FortranFloat128MathILib INTERFACE ${sources})
   endif()

>From 2c5be300fd692dbbd3dc948949d22322601995ae Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 22 Oct 2024 12:16:35 +0200
Subject: [PATCH 27/32] Fix OpenMP linking

---
 flang-rt/cmake/modules/AddFlangRTOffload.cmake | 3 ++-
 flang-rt/lib/flang_rt/CMakeLists.txt           | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/flang-rt/cmake/modules/AddFlangRTOffload.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
index a6b94602b0456f..dc1d778156cabe 100644
--- a/flang-rt/cmake/modules/AddFlangRTOffload.cmake
+++ b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
@@ -60,7 +60,7 @@ macro(enable_cuda_compilation name files)
   endif()
 endmacro()
 
-macro(enable_omp_offload_compilation files)
+macro(enable_omp_offload_compilation name files)
   if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
     # OpenMP offload build only works with Clang compiler currently.
 
@@ -108,6 +108,7 @@ macro(enable_omp_offload_compilation files)
       set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS
         "${OMP_COMPILE_OPTIONS}"
         )
+      target_link_options(${name} PUBLIC ${OMP_COMPILE_OPTIONS})
 
       # Enable "declare target" in the source code.
       set_source_files_properties(${files}
diff --git a/flang-rt/lib/flang_rt/CMakeLists.txt b/flang-rt/lib/flang_rt/CMakeLists.txt
index 860152c39c7204..059fcb45bd5380 100644
--- a/flang-rt/lib/flang_rt/CMakeLists.txt
+++ b/flang-rt/lib/flang_rt/CMakeLists.txt
@@ -123,7 +123,7 @@ if (NOT WIN32)
   )
 
   enable_cuda_compilation(flang_rt "${supported_sources}")
-  enable_omp_offload_compilation("${supported_sources}")
+  enable_omp_offload_compilation(flang_rt "${supported_sources}")
 
   # For unittests that depend on flang_rt. Should link to the static version
   # of the library.
@@ -148,7 +148,7 @@ else()
       )
 
     enable_cuda_compilation(${name} "${supported_sources}")
-    enable_omp_offload_compilation("${supported_sources}")
+    enable_omp_offload_compilation(${name} "${supported_sources}")
   endfunction ()
 
   add_win_flangrt_library(STATIC static     MultiThreaded)

>From c829f91cec578db587b44675554bc01e0aa77b32 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 22 Oct 2024 12:26:43 +0200
Subject: [PATCH 28/32] Re-apply: use Fortran::common::optional for CUDA build

---
 flang/include/flang/Common/fast-int-set.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/flang/include/flang/Common/fast-int-set.h b/flang/include/flang/Common/fast-int-set.h
index d1c9c756a44a65..1214bac75a4bf1 100644
--- a/flang/include/flang/Common/fast-int-set.h
+++ b/flang/include/flang/Common/fast-int-set.h
@@ -24,7 +24,7 @@
 #ifndef FORTRAN_COMMON_FAST_INT_SET_H_
 #define FORTRAN_COMMON_FAST_INT_SET_H_
 
-#include <optional>
+#include "optional.h"
 
 namespace Fortran::common {
 
@@ -83,9 +83,9 @@ template <int N> class FastIntSet {
     }
   }
 
-  std::optional<int> PopValue() {
+  optional<int> PopValue() {
     if (IsEmpty()) {
-      return std::nullopt;
+      return nullopt;
     } else {
       return value_[--size_];
     }

>From a3f3a7bcec2c893960cda59b0ce398dd3a982a69 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 31 Oct 2024 10:56:00 +0100
Subject: [PATCH 29/32] Support for CMake 3.20-3.23

---
 flang-rt/CMakeLists.txt                 | 43 +++++++++++++++++++++++++
 flang-rt/cmake/modules/AddFlangRT.cmake |  2 +-
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 942bc7274e42ee..4156f0a11ca522 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -16,8 +16,42 @@ set(FLANGRT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 set(FLANGRT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang")
 
+
+# CMake 3.24 is the first version of CMake that directly recognizes Flang.
+# LLVM's requirement is only CMake 3.20, teach CMake 3.20-3.23 how to use Flang.
+if (CMAKE_VERSION VERSION_LESS "3.24")
+  cmake_path(GET CMAKE_Fortran_COMPILER STEM _Fortran_COMPILER_STEM)
+  if (_Fortran_COMPILER_STEM STREQUAL "flang-new" OR _Fortran_COMPILER_STEM STREQUAL "flang")
+    include(CMakeForceCompiler)
+    CMAKE_FORCE_Fortran_COMPILER("${CMAKE_Fortran_COMPILER}" "LLVMFlang")
+
+    set(CMAKE_Fortran_COMPILER_ID "LLVMFlang")
+    set(CMAKE_Fortran_COMPILER_VERSION "20.0")
+
+    set(CMAKE_Fortran_SUBMODULE_SEP "-")
+    set(CMAKE_Fortran_SUBMODULE_EXT ".mod")
+
+    set(CMAKE_Fortran_PREPROCESS_SOURCE
+      "<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
+
+    set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-ffixed-form")
+    set(CMAKE_Fortran_FORMAT_FREE_FLAG "-ffree-form")
+
+    set(CMAKE_Fortran_MODDIR_FLAG "-module-dir")
+
+    set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-cpp")
+    set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_OFF "-nocpp")
+    set(CMAKE_Fortran_POSTPROCESS_FLAG "-ffixed-line-length-72")
+
+    set(CMAKE_Fortran_COMPILE_OPTIONS_TARGET "--target=")
+
+    set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
+    set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
+  endif ()
+endif ()
 enable_language(Fortran)
 
+
 list(APPEND CMAKE_MODULE_PATH
     "${FLANGRT_SOURCE_DIR}/cmake/modules"
     "${FLANG_SOURCE_DIR}/cmake/modules"
@@ -67,6 +101,7 @@ endif ()
 
 option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
 
+
 set(FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile flang-rt with GPU support (CUDA or OpenMP)")
 set_property(CACHE FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
     ""
@@ -84,6 +119,7 @@ else ()
   message(FATAL_ERROR "Invalid value '${FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
 endif ()
 
+
 option(FLANG_RT_ENABLE_CUF "Compile CUDA Fortran runtime sources" OFF)
 if (FLANG_RT_ENABLE_CUF)
   find_package(CUDAToolkit REQUIRED)
@@ -124,6 +160,13 @@ if (WIN32)
 endif ()
 
 
+# Check whether the compiler can undefine a macro using the "-U" flag.
+# Aternatively, we could use
+#   CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU"
+# but some older versions of CMake don't define it for GCC itself.
+check_cxx_compiler_flag("-UTESTFLAG" FLANG_RT_SUPPORTS_UNDEFINE_FLAG)
+
+
 #####################
 # Build Preparation #
 #####################
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index ae867f3fe4e8eb..360a9cf22bbc4c 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -88,7 +88,7 @@ function (add_flangrt_library name)
 
   # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS
   # build, to avoid an unwanted dependency on libstdc++/libc++.so.
-  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
+  if (FLANG_RT_SUPPORTS_UNDEFINE_FLAG)
     target_compile_options(${name} PUBLIC -U_GLIBCXX_ASSERTIONS)
     target_compile_options(${name} PUBLIC -U_LIBCPP_ENABLE_ASSERTIONS)
   endif ()

>From 16e33efe5ee44c078a127971426072e9cd9ba713 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 31 Oct 2024 14:11:33 +0100
Subject: [PATCH 30/32] Windows shared library currently not supported

---
 flang-rt/CMakeLists.txt                 |  6 +++++
 flang-rt/cmake/modules/AddFlangRT.cmake |  8 +++++-
 flang-rt/lib/flang_rt/CMakeLists.txt    | 34 +++++++++++++++----------
 flang-rt/test/CMakeLists.txt            | 10 +++++---
 4 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 4156f0a11ca522..fa99fa0121de4c 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -190,6 +190,12 @@ set(CMAKE_CXX_STANDARD_REQUIRED YES)
 configure_file(cmake/config.h.cmake.in config.h)
 
 
+# The bootstrap build will create a phony target with the same as the top-level
+# directory ("flang-rt") and delegate it to the runtimes build dir.
+# AddFlangRT will add all non-EXCLUDE_FROM_ALL targets to it.
+add_custom_target(flang-rt)
+
+
 ###################
 # Build Artifacts #
 ###################
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 360a9cf22bbc4c..79a0cf39796d83 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -51,7 +51,7 @@ function (add_flangrt_library name)
   if (ARG_OBJECT)
     list(APPEND extra_args OBJECT)
   endif ()
-  if (EXCLUDE_FROM_ALL)
+  if (ARG_EXCLUDE_FROM_ALL)
     list(APPEND extra_args EXCLUDE_FROM_ALL)
   endif ()
 
@@ -130,4 +130,10 @@ function (add_flangrt_library name)
         RUNTIME DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
       )
   endif ()
+
+  # flang-rt should build all the flang-rt targets that are built in an
+  # 'all' build.
+  if (NOT ARG_EXCLUDE_FROM_ALL)
+    add_dependencies(flang-rt ${name})
+  endif ()
 endfunction (add_flangrt_library)
diff --git a/flang-rt/lib/flang_rt/CMakeLists.txt b/flang-rt/lib/flang_rt/CMakeLists.txt
index 059fcb45bd5380..e8bdb1cccdaf63 100644
--- a/flang-rt/lib/flang_rt/CMakeLists.txt
+++ b/flang-rt/lib/flang_rt/CMakeLists.txt
@@ -130,6 +130,10 @@ if (NOT WIN32)
   add_library(flang_rt.static ALIAS flang_rt)
   add_library(flang_rt.unittest ALIAS flang_rt)
 else()
+  # Target for building all versions of the runtime
+  add_custom_target(flang_rt)
+  set_target_properties(flang_rt PROPERTIES FOLDER "Fortran Runtime/Meta")
+
   function (add_win_flangrt_library libtype suffix msvc_lib)
     set(name "flang_rt.${suffix}")
     add_flangrt_library(${name} ${libtype}
@@ -149,6 +153,7 @@ else()
 
     enable_cuda_compilation(${name} "${supported_sources}")
     enable_omp_offload_compilation(${name} "${supported_sources}")
+    add_dependencies(flang_rt ${name})
   endfunction ()
 
   add_win_flangrt_library(STATIC static     MultiThreaded)
@@ -157,18 +162,19 @@ else()
   # unittests link against LLVMSupport which is compiled with /MD
   add_win_flangrt_library(STATIC unittest   MultiThreadedDLL EXCLUDE_FROM_ALL)
 
-  # FIXME: Before DLL versions of the runtime can be used, exported definitions
-  # must be annotated with __declspec(dllexport).
-  add_win_flangrt_library(SHARED dynamic     MultiThreadedDLL)
-  add_win_flangrt_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
-
-  # Target for building all versions of the runtime
-  add_custom_target(flang_rt)
-  set_target_properties(flang_rt PROPERTIES FOLDER "Fortran Runtime/Meta")
-  add_dependencies(flang_rt
-      flang_rt.static
-      flang_rt.static_dbg
-      flang_rt.dynamic
-      flang_rt.dynamic_dbg
-    )
+  # FIXME: Generating runtime DLLs is currently not possible. There are two
+  # roadblocks:
+  #
+  #  * Flang emits /DEFAULTLIB:flang_rt.dynamic.lib into
+  #    iso_fortran_env_impl.f90.obj. Since that file is itself part of
+  #    flang_rt.dynamic, this results in a recursive dependency when invoking
+  #    the linker.
+  #
+  #  * The externally-visible functions must either by annotated with
+  #    __declspec(dllexport), or listed in a exports file. A possible workaround
+  #    is CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS which would also export the internal
+  #    C++ symbols.
+  #
+  #add_win_flangrt_library(SHARED dynamic     MultiThreadedDLL)
+  #add_win_flangrt_library(SHARED dynamic_dbg MultiThreadedDebugDLL)
 endif()
diff --git a/flang-rt/test/CMakeLists.txt b/flang-rt/test/CMakeLists.txt
index be42717b2834f3..6c542d522f4762 100644
--- a/flang-rt/test/CMakeLists.txt
+++ b/flang-rt/test/CMakeLists.txt
@@ -44,6 +44,7 @@ endif ()
 set(FLANGRT_TEST_DEPENDS
     FlangRTUnitTests
     flang_rt.unittest
+    flang_rt.static
   )
 
 add_custom_target(flang-rt-test-depends)
@@ -51,11 +52,12 @@ set_target_properties(flang-rt-test-depends PROPERTIES FOLDER "Fortran Runtime/M
 add_dependencies(flang-rt-test-depends ${FLANGRT_TEST_DEPENDS})
 
 add_lit_testsuite(check-flang-rt "Running the flang-rt regression tests"
-  ${CMAKE_CURRENT_BINARY_DIR}
-  DEPENDS ${FLANGRT_TEST_DEPENDS}
-)
+    ${CMAKE_CURRENT_BINARY_DIR}
+    DEPENDS flang-rt-test-depends
+  )
 set_target_properties(check-flang-rt PROPERTIES FOLDER "Fortran Runtime/Meta")
 
 
 add_lit_testsuites(flang-rt ${CMAKE_CURRENT_SOURCE_DIR}
-  DEPENDS ${FLANGRT_TEST_DEPENDS})
+    DEPENDS flang-rt-test-depends
+  )

>From 472893a5a897219252b9d47e749465b119741e96 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 31 Oct 2024 15:14:29 +0100
Subject: [PATCH 31/32] LLVM also requires C++17

---
 flang-rt/README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/flang-rt/README.md b/flang-rt/README.md
index b398ecdba82818..54e23f7e07926b 100644
--- a/flang-rt/README.md
+++ b/flang-rt/README.md
@@ -29,8 +29,6 @@ source directory. LLVM does not support in-source builds.
 
 Requirements:
   * [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements).
-  * While for LLVM C++14 suffices, Flang and flang-rt require a
-    C++17-capable C++ compiler.
 
 
 ### Bootstrap/In-Tree Build

>From 39d6d9694b65012cda0b88dbf1865f29ddbe83f6 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Mon, 11 Nov 2024 15:38:50 +0100
Subject: [PATCH 32/32] FLANGRT -> FLANG_RT

---
 flang-rt/CMakeLists.txt                       | 26 +++++++++----------
 flang-rt/cmake/modules/AddFlangRT.cmake       | 20 +++++++-------
 .../cmake/modules/AddFlangRTOffload.cmake     |  2 +-
 flang-rt/include/flang-rt/CUDA/allocator.h    |  6 ++---
 .../include/flang-rt/allocator-registry.h     |  6 ++---
 flang-rt/include/flang-rt/array-constructor.h |  6 ++---
 flang-rt/include/flang-rt/descriptor.h        |  6 ++---
 flang-rt/include/flang-rt/io-api-funcs.h      |  6 ++---
 flang-rt/include/flang-rt/iostat-funcs.h      |  6 ++---
 flang-rt/include/flang-rt/memory.h            |  6 ++---
 flang-rt/include/flang-rt/type-code.h         |  6 ++---
 .../lib/FortranFloat128Math/CMakeLists.txt    |  6 ++---
 flang-rt/lib/flang_rt/CMakeLists.txt          |  8 +++---
 flang-rt/lib/flang_rt/ISO_Fortran_util.h      |  6 ++---
 flang-rt/lib/flang_rt/allocator-registry.cpp  |  4 +--
 flang-rt/lib/flang_rt/buffer.h                |  6 ++---
 flang-rt/lib/flang_rt/copy.h                  |  6 ++---
 flang-rt/lib/flang_rt/descriptor-io.h         |  6 ++---
 flang-rt/lib/flang_rt/environment.cpp         |  4 +--
 flang-rt/lib/flang_rt/file.h                  |  6 ++---
 flang-rt/lib/flang_rt/internal-unit.h         |  6 ++---
 flang-rt/lib/flang_rt/io-api-common.h         |  6 ++---
 flang-rt/lib/flang_rt/io-error.h              |  6 ++---
 flang-rt/lib/flang_rt/io-stmt.h               |  6 ++---
 flang-rt/lib/flang_rt/random-templates.h      |  6 ++---
 flang-rt/lib/flang_rt/reduction-templates.h   |  6 ++---
 flang-rt/lib/flang_rt/stack.h                 |  6 ++---
 flang-rt/lib/flang_rt/tools.h                 |  6 ++---
 flang-rt/lib/flang_rt/type-info.h             |  6 ++---
 flang-rt/lib/flang_rt/unit-map.h              |  6 ++---
 flang-rt/lib/flang_rt/unit.cpp                |  4 +--
 flang-rt/lib/flang_rt/unit.h                  |  6 ++---
 flang-rt/lib/flang_rt/utf.cpp                 |  4 +--
 flang-rt/test/CMakeLists.txt                  |  4 +--
 flang-rt/test/NonGtestUnit/lit.site.cfg.py.in |  4 +--
 flang-rt/test/Unit/lit.site.cfg.py.in         |  4 +--
 flang-rt/test/lit.site.cfg.py.in              |  4 +--
 flang-rt/unittests/CMakeLists.txt             |  4 +--
 flang-rt/unittests/Runtime/tools.h            |  6 ++---
 39 files changed, 124 insertions(+), 124 deletions(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index fa99fa0121de4c..696ebf73c08090 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -12,8 +12,8 @@
 #===------------------------------------------------------------------------===#
 
 set(LLVM_SUBPROJECT_TITLE "Fortran Runtime")
-set(FLANGRT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
-set(FLANGRT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+set(FLANG_RT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(FLANG_RT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang")
 
 
@@ -53,7 +53,7 @@ enable_language(Fortran)
 
 
 list(APPEND CMAKE_MODULE_PATH
-    "${FLANGRT_SOURCE_DIR}/cmake/modules"
+    "${FLANG_RT_SOURCE_DIR}/cmake/modules"
     "${FLANG_SOURCE_DIR}/cmake/modules"
   )
 include(AddFlangRT)
@@ -76,19 +76,19 @@ if (LLVM_TREE_AVAILABLE)
   # Despite Clang in the name, get_clang_resource_dir does not depend on Clang being added to the build
   # flang-new uses the same resource dir as clang.
   include(GetClangResourceDir)
-  get_clang_resource_dir(FLANGRT_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
-  get_clang_resource_dir(FLANGRT_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command finds the install prefix itself
+  get_clang_resource_dir(FLANG_RT_BUILD_LIB_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/.." SUBDIR "lib${LLVM_LIBDIR_SUFFIX}")
+  get_clang_resource_dir(FLANG_RT_INSTALL_LIB_DIR SUBDIR "lib${LLVM_LIBDIR_SUFFIX}") # No prefix, CMake's install command finds the install prefix itself
 else ()
-  set(FLANGRT_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
-  set(FLANGRT_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
+  set(FLANG_RT_BUILD_LIB_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
+  set(FLANG_RT_INSTALL_LIB_DIR "lib${LLVM_LIBDIR_SUFFIX}")
 endif ()
 
 if (DEFINED WIN32)
-  set(FLANGRT_BUILD_LIB_DIR "${FLANGRT_BUILD_LIB_DIR}/windows")
-  set(FLANGRT_INSTALL_LIB_DIR "${FLANGRT_INSTALL_LIB_DIR}/windows")
+  set(FLANG_RT_BUILD_LIB_DIR "${FLANG_RT_BUILD_LIB_DIR}/windows")
+  set(FLANG_RT_INSTALL_LIB_DIR "${FLANG_RT_INSTALL_LIB_DIR}/windows")
 elseif (LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
-  set(FLANGRT_BUILD_LIB_DIR "${FLANGRT_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
-  set(FLANGRT_INSTALL_LIB_DIR "${FLANGRT_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+  set(FLANG_RT_BUILD_LIB_DIR "${FLANG_RT_BUILD_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
+  set(FLANG_RT_INSTALL_LIB_DIR "${FLANG_RT_INSTALL_LIB_DIR}/${LLVM_TARGET_TRIPLE}")
 endif ()
 
 
@@ -153,9 +153,9 @@ if (WIN32)
       ERROR_QUIET
     )
   if (NOT CXX_COMPILER_PRINT_LIBGCC_PATH_FAILURE AND CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT)
-    string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FLANGRT_LIBCALL)
+    string(STRIP "${CXX_COMPILER_PRINT_LIBGCC_PATH_RESULT}" FLANG_RT_LIBCALL)
   else ()
-    set(FLANGRT_LIBCALL "")
+    set(FLANG_RT_LIBCALL "")
   endif ()
 endif ()
 
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 79a0cf39796d83..33c980273152af 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -77,14 +77,14 @@ function (add_flangrt_library name)
   endif ()
 
   # Flang-rt's public headers
-  target_include_directories(${name} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
+  target_include_directories(${name} PRIVATE "${FLANG_RT_SOURCE_DIR}/include")
 
   # For ISO_Fortran_binding.h to be found by the runtime itself (Accessed as #include "flang/ISO_Fortran_binding.h")
   # User applications can use #include <ISO_Fortran_binding.h>
   target_include_directories(${name} PRIVATE "${FLANG_SOURCE_DIR}/include")
 
   # For flang-rt's configured config.h to be found
-  target_include_directories(${name} PRIVATE "${FLANGRT_BINARY_DIR}")
+  target_include_directories(${name} PRIVATE "${FLANG_RT_BINARY_DIR}")
 
   # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS
   # build, to avoid an unwanted dependency on libstdc++/libc++.so.
@@ -98,8 +98,8 @@ function (add_flangrt_library name)
   # functions for 128-bit integer math (__udivti3, __modti3, __fixsfti,
   # __floattidf, ...) that msvc does not support. We are injecting a dependency
   # to Compiler-RT where these are implemented.
-  if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FLANGRT_LIBCALL)
-    target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FLANGRT_LIBCALL}")
+  if (MSVC AND (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") AND FLANG_RT_LIBCALL)
+    target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "--dependent-lib=${FLANG_RT_LIBCALL}")
   endif ()
 
   # Non-GTest unittests depend on LLVMSupport
@@ -119,15 +119,15 @@ function (add_flangrt_library name)
   if (ARG_INSTALL_WITH_TOOLCHAIN)
     set_target_properties(${name}
       PROPERTIES
-        LIBRARY_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
-        ARCHIVE_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
-        RUNTIME_OUTPUT_DIRECTORY "${FLANGRT_BUILD_LIB_DIR}"
+        LIBRARY_OUTPUT_DIRECTORY "${FLANG_RT_BUILD_LIB_DIR}"
+        ARCHIVE_OUTPUT_DIRECTORY "${FLANG_RT_BUILD_LIB_DIR}"
+        RUNTIME_OUTPUT_DIRECTORY "${FLANG_RT_BUILD_LIB_DIR}"
       )
 
     install(TARGETS ${name}
-        LIBRARY DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
-        ARCHIVE DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
-        RUNTIME DESTINATION "${FLANGRT_INSTALL_LIB_DIR}"
+        LIBRARY DESTINATION "${FLANG_RT_INSTALL_LIB_DIR}"
+        ARCHIVE DESTINATION "${FLANG_RT_INSTALL_LIB_DIR}"
+        RUNTIME DESTINATION "${FLANG_RT_INSTALL_LIB_DIR}"
       )
   endif ()
 
diff --git a/flang-rt/cmake/modules/AddFlangRTOffload.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
index dc1d778156cabe..2a02b52e143f4c 100644
--- a/flang-rt/cmake/modules/AddFlangRTOffload.cmake
+++ b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
@@ -54,7 +54,7 @@ macro(enable_cuda_compilation name files)
     set_property(TARGET ${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
     if (FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
       target_compile_definitions(${name}PTX
-        PRIVATE FLANGRT_NO_GLOBAL_VAR_DEFS
+        PRIVATE FLANG_RT_NO_GLOBAL_VAR_DEFS
         )
     endif()
   endif()
diff --git a/flang-rt/include/flang-rt/CUDA/allocator.h b/flang-rt/include/flang-rt/CUDA/allocator.h
index 2899931a9cb545..31ca99c646ca77 100644
--- a/flang-rt/include/flang-rt/CUDA/allocator.h
+++ b/flang-rt/include/flang-rt/CUDA/allocator.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_CUDA_ALLOCATOR_H_
-#define FLANGRT_CUDA_ALLOCATOR_H_
+#ifndef FLANG_RT_CUDA_ALLOCATOR_H_
+#define FLANG_RT_CUDA_ALLOCATOR_H_
 
 #include "flang/Runtime/descriptor-consts.h"
 #include "flang/Runtime/entry-names.h"
@@ -43,4 +43,4 @@ void *CUFAllocUnified(std::size_t);
 void CUFFreeUnified(void *);
 
 } // namespace Fortran::runtime::cuda
-#endif /* FLANGRT_CUDA_ALLOCATOR_H_ */
+#endif /* FLANG_RT_CUDA_ALLOCATOR_H_ */
diff --git a/flang-rt/include/flang-rt/allocator-registry.h b/flang-rt/include/flang-rt/allocator-registry.h
index 33e30523acaa48..1f004462ca6241 100644
--- a/flang-rt/include/flang-rt/allocator-registry.h
+++ b/flang-rt/include/flang-rt/allocator-registry.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_ALLOCATOR_REGISTRY_H_
-#define FLANGRT_ALLOCATOR_REGISTRY_H_
+#ifndef FLANG_RT_ALLOCATOR_REGISTRY_H_
+#define FLANG_RT_ALLOCATOR_REGISTRY_H_
 
 #include "flang/Common/api-attrs.h"
 #include "flang/Runtime/allocator-registry-consts.h"
@@ -55,4 +55,4 @@ RT_OFFLOAD_VAR_GROUP_END
 
 } // namespace Fortran::runtime
 
-#endif /* FLANGRT_ALLOCATOR_REGISTRY_H_ */
+#endif /* FLANG_RT_ALLOCATOR_REGISTRY_H_ */
diff --git a/flang-rt/include/flang-rt/array-constructor.h b/flang-rt/include/flang-rt/array-constructor.h
index e39c6fe9d050c7..a0aee59beac744 100644
--- a/flang-rt/include/flang-rt/array-constructor.h
+++ b/flang-rt/include/flang-rt/array-constructor.h
@@ -9,8 +9,8 @@
 // External APIs to create temporary storage for array constructors when their
 // final extents or length parameters cannot be pre-computed.
 
-#ifndef FLANGRT_ARRAY_CONSTRUCTOR_H_
-#define FLANGRT_ARRAY_CONSTRUCTOR_H_
+#ifndef FLANG_RT_ARRAY_CONSTRUCTOR_H_
+#define FLANG_RT_ARRAY_CONSTRUCTOR_H_
 
 #include "flang-rt/descriptor.h"
 #include "flang/Runtime/array-constructor-consts.h"
@@ -45,4 +45,4 @@ struct ArrayConstructorVector {
 };
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_ARRAY_CONSTRUCTOR_H_ */
+#endif /* FLANG_RT_ARRAY_CONSTRUCTOR_H_ */
diff --git a/flang-rt/include/flang-rt/descriptor.h b/flang-rt/include/flang-rt/descriptor.h
index adb69440be987c..4e129468e4fe6e 100644
--- a/flang-rt/include/flang-rt/descriptor.h
+++ b/flang-rt/include/flang-rt/descriptor.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_DESCRIPTOR_H_
-#define FLANGRT_DESCRIPTOR_H_
+#ifndef FLANG_RT_DESCRIPTOR_H_
+#define FLANG_RT_DESCRIPTOR_H_
 
 // Defines data structures used during execution of a Fortran program
 // to implement nontrivial dummy arguments, pointers, allocatables,
@@ -482,4 +482,4 @@ class alignas(Descriptor) StaticDescriptor {
 };
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_DESCRIPTOR_H_ */
+#endif /* FLANG_RT_DESCRIPTOR_H_ */
diff --git a/flang-rt/include/flang-rt/io-api-funcs.h b/flang-rt/include/flang-rt/io-api-funcs.h
index 356f2d684d2f2d..dda2f5dc96184b 100644
--- a/flang-rt/include/flang-rt/io-api-funcs.h
+++ b/flang-rt/include/flang-rt/io-api-funcs.h
@@ -8,8 +8,8 @@
 
 // Defines API between compiled code and I/O runtime library.
 
-#ifndef FLANGRT_IO_API_FUNCS_H_
-#define FLANGRT_IO_API_FUNCS_H_
+#ifndef FLANG_RT_IO_API_FUNCS_H_
+#define FLANG_RT_IO_API_FUNCS_H_
 
 #include "flang/Common/uint128.h"
 #include "flang/Runtime/entry-names.h"
@@ -36,4 +36,4 @@ RT_API_ATTRS const char *InquiryKeywordHashDecode(
     char *buffer, std::size_t, InquiryKeywordHash);
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_IO_API_FUNCS_H_ */
+#endif /* FLANG_RT_IO_API_FUNCS_H_ */
diff --git a/flang-rt/include/flang-rt/iostat-funcs.h b/flang-rt/include/flang-rt/iostat-funcs.h
index 101256103cbf29..0edb8f402c4fe8 100644
--- a/flang-rt/include/flang-rt/iostat-funcs.h
+++ b/flang-rt/include/flang-rt/iostat-funcs.h
@@ -9,8 +9,8 @@
 // Defines the values returned by the runtime for IOSTAT= specifiers
 // on I/O statements.
 
-#ifndef FLANGRT_IOSTAT_FUNCS_H_
-#define FLANGRT_IOSTAT_FUNCS_H_
+#ifndef FLANG_RT_IOSTAT_FUNCS_H_
+#define FLANG_RT_IOSTAT_FUNCS_H_
 
 #include "flang/Common/api-attrs.h"
 #include "flang/Runtime/iostat.h"
@@ -20,4 +20,4 @@ namespace Fortran::runtime::io {
 RT_API_ATTRS const char *IostatErrorString(int);
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_IOSTAT_FUNCS_H_ */
+#endif /* FLANG_RT_IOSTAT_FUNCS_H_ */
diff --git a/flang-rt/include/flang-rt/memory.h b/flang-rt/include/flang-rt/memory.h
index 84cc6c5266a8ea..afbb1b34c1d2c0 100644
--- a/flang-rt/include/flang-rt/memory.h
+++ b/flang-rt/include/flang-rt/memory.h
@@ -9,8 +9,8 @@
 // Thin wrapper around malloc()/free() to isolate the dependency,
 // ease porting, and provide an owning pointer.
 
-#ifndef FLANGRT_MEMORY_H_
-#define FLANGRT_MEMORY_H_
+#ifndef FLANG_RT_MEMORY_H_
+#define FLANG_RT_MEMORY_H_
 
 #include "flang/Common/api-attrs.h"
 #include <cassert>
@@ -170,4 +170,4 @@ template <typename A> struct Allocator {
 };
 } // namespace Fortran::runtime
 
-#endif /* FLANGRT_MEMORY_H_ */
+#endif /* FLANG_RT_MEMORY_H_ */
diff --git a/flang-rt/include/flang-rt/type-code.h b/flang-rt/include/flang-rt/type-code.h
index 409d47b82c17d8..1d057481261a1d 100644
--- a/flang-rt/include/flang-rt/type-code.h
+++ b/flang-rt/include/flang-rt/type-code.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_TYPE_CODE_H_
-#define FLANGRT_TYPE_CODE_H_
+#ifndef FLANG_RT_TYPE_CODE_H_
+#define FLANG_RT_TYPE_CODE_H_
 
 #include "flang/Common/Fortran-consts.h"
 #include "flang/Common/ISO_Fortran_binding_wrapper.h"
@@ -75,4 +75,4 @@ class TypeCode {
   ISO::CFI_type_t raw_{CFI_type_other};
 };
 } // namespace Fortran::runtime
-#endif /* FLANGRT_TYPE_CODE_H_ */
+#endif /* FLANG_RT_TYPE_CODE_H_ */
diff --git a/flang-rt/lib/FortranFloat128Math/CMakeLists.txt b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
index 0d8ef07d404029..9f9f94127dda6f 100644
--- a/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
+++ b/flang-rt/lib/FortranFloat128Math/CMakeLists.txt
@@ -99,7 +99,7 @@ if (FLANG_RUNTIME_F128_MATH_LIB)
       ${sources})
    endif ()
    target_include_directories(FortranFloat128Math PRIVATE
-     "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+     "${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
      )
 elseif (HAVE_LDBL_MANT_DIG_113)
   # We can use 'long double' versions from libc.
@@ -109,7 +109,7 @@ elseif (HAVE_LDBL_MANT_DIG_113)
       HAS_LIBM
       )
     target_include_directories(FortranFloat128MathILib INTERFACE
-      "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+      "${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
       )
     target_sources(FortranFloat128MathILib INTERFACE ${sources})
   else()
@@ -123,7 +123,7 @@ else()
       HAS_LIBMF128
       )
     target_include_directories(FortranFloat128MathILib INTERFACE
-      "${FLANGRT_SOURCE_DIR}/lib/flang_rt"
+      "${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
       )
     # Enable this, when math-entries.h and complex-math.h is ready.
     # target_sources(FortranFloat128MathILib INTERFACE ${sources})
diff --git a/flang-rt/lib/flang_rt/CMakeLists.txt b/flang-rt/lib/flang_rt/CMakeLists.txt
index e8bdb1cccdaf63..6068b75c17ae90 100644
--- a/flang-rt/lib/flang_rt/CMakeLists.txt
+++ b/flang-rt/lib/flang_rt/CMakeLists.txt
@@ -84,13 +84,13 @@ set(host_sources
 )
 
 file(GLOB_RECURSE public_headers
-  "${FLANGRT_SOURCE_DIR}/include/flang/Runtime/*.h"
-  "${FLANGRT_SOURCE_DIR}/include/flang/Common/*.h"
+  "${FLANG_RT_SOURCE_DIR}/include/flang/Runtime/*.h"
+  "${FLANG_RT_SOURCE_DIR}/include/flang/Common/*.h"
   )
 
 file(GLOB_RECURSE private_headers
-  "${FLANGRT_SOURCE_DIR}/lib/Runtime/*.h"
-  "${FLANGRT_SOURCE_DIR}/lib/Common/*.h"
+  "${FLANG_RT_SOURCE_DIR}/lib/Runtime/*.h"
+  "${FLANG_RT_SOURCE_DIR}/lib/Common/*.h"
   )
 
 
diff --git a/flang-rt/lib/flang_rt/ISO_Fortran_util.h b/flang-rt/lib/flang_rt/ISO_Fortran_util.h
index 3c1163851bee6b..dcbd76cc6bce24 100644
--- a/flang-rt/lib/flang_rt/ISO_Fortran_util.h
+++ b/flang-rt/lib/flang_rt/ISO_Fortran_util.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_ISO_FORTRAN_UTIL_H_
-#define FLANGRT_ISO_FORTRAN_UTIL_H_
+#ifndef FLANG_RT_ISO_FORTRAN_UTIL_H_
+#define FLANG_RT_ISO_FORTRAN_UTIL_H_
 
 // Internal utils for establishing CFI_cdesc_t descriptors.
 
@@ -99,4 +99,4 @@ static inline RT_API_ATTRS void EstablishDescriptor(CFI_cdesc_t *descriptor,
   }
 }
 } // namespace Fortran::ISO
-#endif /* FLANGRT_ISO_FORTRAN_UTIL_H_ */
+#endif /* FLANG_RT_ISO_FORTRAN_UTIL_H_ */
diff --git a/flang-rt/lib/flang_rt/allocator-registry.cpp b/flang-rt/lib/flang_rt/allocator-registry.cpp
index 0f2fae7950b1b3..c6e799d7cba0dc 100644
--- a/flang-rt/lib/flang_rt/allocator-registry.cpp
+++ b/flang-rt/lib/flang_rt/allocator-registry.cpp
@@ -11,11 +11,11 @@
 
 namespace Fortran::runtime {
 
-#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS AllocatorRegistry allocatorRegistry;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 RT_API_ATTRS void AllocatorRegistry::Register(int pos, Allocator_t allocator) {
diff --git a/flang-rt/lib/flang_rt/buffer.h b/flang-rt/lib/flang_rt/buffer.h
index 01a6aa28c4ac94..84fe4c34cea0e3 100644
--- a/flang-rt/lib/flang_rt/buffer.h
+++ b/flang-rt/lib/flang_rt/buffer.h
@@ -8,8 +8,8 @@
 
 // External file buffering
 
-#ifndef FLANGRT_BUFFER_H_
-#define FLANGRT_BUFFER_H_
+#ifndef FLANG_RT_BUFFER_H_
+#define FLANG_RT_BUFFER_H_
 
 #include "flang-rt/memory.h"
 #include "io-error.h"
@@ -221,4 +221,4 @@ template <typename STORE, std::size_t minBuffer = 65536> class FileFrame {
   bool dirty_{false};
 };
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_BUFFER_H_ */
+#endif /* FLANG_RT_BUFFER_H_ */
diff --git a/flang-rt/lib/flang_rt/copy.h b/flang-rt/lib/flang_rt/copy.h
index f0520c23e4a471..468c2439baf618 100644
--- a/flang-rt/lib/flang_rt/copy.h
+++ b/flang-rt/lib/flang_rt/copy.h
@@ -9,8 +9,8 @@
 // Utilities that copy data in a type-aware fashion, allocating & duplicating
 // allocatable/automatic components of derived types along the way.
 
-#ifndef FLANGRT_COPY_H_
-#define FLANGRT_COPY_H_
+#ifndef FLANG_RT_COPY_H_
+#define FLANG_RT_COPY_H_
 
 #include "flang-rt/descriptor.h"
 
@@ -22,4 +22,4 @@ RT_API_ATTRS void CopyElement(const Descriptor &to, const SubscriptValue toAt[],
     const Descriptor &from, const SubscriptValue fromAt[], Terminator &);
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_COPY_H_ */
+#endif /* FLANG_RT_COPY_H_ */
diff --git a/flang-rt/lib/flang_rt/descriptor-io.h b/flang-rt/lib/flang_rt/descriptor-io.h
index 3c5abd6f97993a..2276dfe13230ed 100644
--- a/flang-rt/lib/flang_rt/descriptor-io.h
+++ b/flang-rt/lib/flang_rt/descriptor-io.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_DESCRIPTOR_IO_H_
-#define FLANGRT_DESCRIPTOR_IO_H_
+#ifndef FLANG_RT_DESCRIPTOR_IO_H_
+#define FLANG_RT_DESCRIPTOR_IO_H_
 
 // Implementation of I/O data list item transfers based on descriptors.
 // (All I/O items come through here so that the code is exercised for test;
@@ -608,4 +608,4 @@ static RT_API_ATTRS bool DescriptorIO(IoStatementState &io,
   return false;
 }
 } // namespace Fortran::runtime::io::descr
-#endif /* FLANGRT_DESCRIPTOR_IO_H_ */
+#endif /* FLANG_RT_DESCRIPTOR_IO_H_ */
diff --git a/flang-rt/lib/flang_rt/environment.cpp b/flang-rt/lib/flang_rt/environment.cpp
index a9447815efeeaf..3360b5d92f2aeb 100644
--- a/flang-rt/lib/flang_rt/environment.cpp
+++ b/flang-rt/lib/flang_rt/environment.cpp
@@ -23,11 +23,11 @@ extern char **environ;
 
 namespace Fortran::runtime {
 
-#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExecutionEnvironment executionEnvironment;
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RT_NO_GLOBAL_VAR_DEFS
 
 static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) {
   if (!envDefaults) {
diff --git a/flang-rt/lib/flang_rt/file.h b/flang-rt/lib/flang_rt/file.h
index 6975bccb987583..13a7133677c6ce 100644
--- a/flang-rt/lib/flang_rt/file.h
+++ b/flang-rt/lib/flang_rt/file.h
@@ -8,8 +8,8 @@
 
 // Raw system I/O wrappers
 
-#ifndef FLANGRT_FILE_H_
-#define FLANGRT_FILE_H_
+#ifndef FLANG_RT_FILE_H_
+#define FLANG_RT_FILE_H_
 
 #include "flang-rt/memory.h"
 #include "io-error.h"
@@ -113,4 +113,4 @@ RT_API_ATTRS bool MayWrite(const char *path);
 RT_API_ATTRS bool MayReadAndWrite(const char *path);
 RT_API_ATTRS std::int64_t SizeInBytes(const char *path);
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_FILE_H_ */
+#endif /* FLANG_RT_FILE_H_ */
diff --git a/flang-rt/lib/flang_rt/internal-unit.h b/flang-rt/lib/flang_rt/internal-unit.h
index a825e09cdd203e..cae95855a895df 100644
--- a/flang-rt/lib/flang_rt/internal-unit.h
+++ b/flang-rt/lib/flang_rt/internal-unit.h
@@ -8,8 +8,8 @@
 
 // Fortran internal I/O "units"
 
-#ifndef FLANGRT_INTERNAL_UNIT_H_
-#define FLANGRT_INTERNAL_UNIT_H_
+#ifndef FLANG_RT_INTERNAL_UNIT_H_
+#define FLANG_RT_INTERNAL_UNIT_H_
 
 #include "connection.h"
 #include "flang-rt/descriptor.h"
@@ -56,4 +56,4 @@ template <Direction DIR> class InternalDescriptorUnit : public ConnectionState {
 extern template class InternalDescriptorUnit<Direction::Output>;
 extern template class InternalDescriptorUnit<Direction::Input>;
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_INTERNAL_UNIT_H_ */
+#endif /* FLANG_RT_INTERNAL_UNIT_H_ */
diff --git a/flang-rt/lib/flang_rt/io-api-common.h b/flang-rt/lib/flang_rt/io-api-common.h
index 39c87ba326bea4..22de04b3d5b077 100644
--- a/flang-rt/lib/flang_rt/io-api-common.h
+++ b/flang-rt/lib/flang_rt/io-api-common.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_IO_API_COMMON_H_
-#define FLANGRT_IO_API_COMMON_H_
+#ifndef FLANG_RT_IO_API_COMMON_H_
+#define FLANG_RT_IO_API_COMMON_H_
 
 #include "flang-rt/io-api-funcs.h"
 #include "io-stmt.h"
@@ -94,4 +94,4 @@ RT_API_ATTRS Cookie BeginExternalListIO(
 }
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_IO_API_COMMON_H_ */
+#endif /* FLANG_RT_IO_API_COMMON_H_ */
diff --git a/flang-rt/lib/flang_rt/io-error.h b/flang-rt/lib/flang_rt/io-error.h
index 775c5d66d83530..958ce2e3fc42b8 100644
--- a/flang-rt/lib/flang_rt/io-error.h
+++ b/flang-rt/lib/flang_rt/io-error.h
@@ -12,8 +12,8 @@
 // IOSTAT error codes are raw errno values augmented with values for
 // Fortran-specific errors.
 
-#ifndef FLANGRT_IO_ERROR_H_
-#define FLANGRT_IO_ERROR_H_
+#ifndef FLANG_RT_IO_ERROR_H_
+#define FLANG_RT_IO_ERROR_H_
 
 #include "flang-rt/iostat-funcs.h"
 #include "flang-rt/memory.h"
@@ -78,4 +78,4 @@ class IoErrorHandler : public Terminator {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_IO_ERROR_H_ */
+#endif /* FLANG_RT_IO_ERROR_H_ */
diff --git a/flang-rt/lib/flang_rt/io-stmt.h b/flang-rt/lib/flang_rt/io-stmt.h
index c7bde114457f0e..b4089ea67e1f7c 100644
--- a/flang-rt/lib/flang_rt/io-stmt.h
+++ b/flang-rt/lib/flang_rt/io-stmt.h
@@ -8,8 +8,8 @@
 
 // Representations of the state of an I/O statement in progress
 
-#ifndef FLANGRT_IO_STMT_H_
-#define FLANGRT_IO_STMT_H_
+#ifndef FLANG_RT_IO_STMT_H_
+#define FLANG_RT_IO_STMT_H_
 
 #include "connection.h"
 #include "file.h"
@@ -789,4 +789,4 @@ class ErroneousIoStatementState : public IoStatementBase {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_IO_STMT_H_ */
+#endif /* FLANG_RT_IO_STMT_H_ */
diff --git a/flang-rt/lib/flang_rt/random-templates.h b/flang-rt/lib/flang_rt/random-templates.h
index 8ed5757ec76a76..36701501b94ef5 100644
--- a/flang-rt/lib/flang_rt/random-templates.h
+++ b/flang-rt/lib/flang_rt/random-templates.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_RANDOM_TEMPLATES_H_
-#define FLANGRT_RANDOM_TEMPLATES_H_
+#ifndef FLANG_RT_RANDOM_TEMPLATES_H_
+#define FLANG_RT_RANDOM_TEMPLATES_H_
 
 #include "flang-rt/descriptor.h"
 #include "lock.h"
@@ -85,4 +85,4 @@ inline void Generate(const Descriptor &harvest) {
 
 } // namespace Fortran::runtime::random
 
-#endif /* FLANGRT_RANDOM_TEMPLATES_H_ */
+#endif /* FLANG_RT_RANDOM_TEMPLATES_H_ */
diff --git a/flang-rt/lib/flang_rt/reduction-templates.h b/flang-rt/lib/flang_rt/reduction-templates.h
index 6764706c3fa951..496372de1752a4 100644
--- a/flang-rt/lib/flang_rt/reduction-templates.h
+++ b/flang-rt/lib/flang_rt/reduction-templates.h
@@ -18,8 +18,8 @@
 // * Character-valued reductions (MAXVAL & MINVAL) return arbitrary
 //   length results, dynamically allocated in a caller-supplied descriptor
 
-#ifndef FLANGRT_REDUCTION_TEMPLATES_H_
-#define FLANGRT_REDUCTION_TEMPLATES_H_
+#ifndef FLANG_RT_REDUCTION_TEMPLATES_H_
+#define FLANG_RT_REDUCTION_TEMPLATES_H_
 
 #include "flang-rt/descriptor.h"
 #include "numeric-templates.h"
@@ -412,4 +412,4 @@ template <int KIND> struct Norm2Helper {
 };
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_REDUCTION_TEMPLATES_H_ */
+#endif /* FLANG_RT_REDUCTION_TEMPLATES_H_ */
diff --git a/flang-rt/lib/flang_rt/stack.h b/flang-rt/lib/flang_rt/stack.h
index 4b0de1e59e4596..07b34f3eef2c3d 100644
--- a/flang-rt/lib/flang_rt/stack.h
+++ b/flang-rt/lib/flang_rt/stack.h
@@ -10,8 +10,8 @@
 // It is a list based stack with dynamic allocation/deallocation
 // of the list nodes.
 
-#ifndef FLANGRT_STACK_H_
-#define FLANGRT_STACK_H_
+#ifndef FLANG_RT_STACK_H_
+#define FLANG_RT_STACK_H_
 
 #include "flang-rt/memory.h"
 #include "terminator.h"
@@ -133,4 +133,4 @@ template <typename T, unsigned N = 0> class Stack : public StackStorage<T, N> {
   Terminator &terminator_;
 };
 } // namespace Fortran::runtime
-#endif /* FLANGRT_STACK_H_ */
+#endif /* FLANG_RT_STACK_H_ */
diff --git a/flang-rt/lib/flang_rt/tools.h b/flang-rt/lib/flang_rt/tools.h
index bc2f4ff034cb13..9892ef0fc28393 100644
--- a/flang-rt/lib/flang_rt/tools.h
+++ b/flang-rt/lib/flang_rt/tools.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_TOOLS_H_
-#define FLANGRT_TOOLS_H_
+#ifndef FLANG_RT_TOOLS_H_
+#define FLANG_RT_TOOLS_H_
 
 #include "flang-rt/descriptor.h"
 #include "flang-rt/memory.h"
@@ -535,4 +535,4 @@ RT_API_ATTRS void CreatePartialReductionResult(Descriptor &result,
     const char *intrinsic, TypeCode);
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_TOOLS_H_ */
+#endif /* FLANG_RT_TOOLS_H_ */
diff --git a/flang-rt/lib/flang_rt/type-info.h b/flang-rt/lib/flang_rt/type-info.h
index 891a6a0d032127..69ad4e4a341a3d 100644
--- a/flang-rt/lib/flang_rt/type-info.h
+++ b/flang-rt/lib/flang_rt/type-info.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_TYPE_INFO_H_
-#define FLANGRT_TYPE_INFO_H_
+#ifndef FLANG_RT_TYPE_INFO_H_
+#define FLANG_RT_TYPE_INFO_H_
 
 // A C++ perspective of the derived type description schemata in
 // flang/module/__fortran_type_info.f90.
@@ -321,4 +321,4 @@ class DerivedType {
 };
 
 } // namespace Fortran::runtime::typeInfo
-#endif /* FLANGRT_TYPE_INFO_H_ */
+#endif /* FLANG_RT_TYPE_INFO_H_ */
diff --git a/flang-rt/lib/flang_rt/unit-map.h b/flang-rt/lib/flang_rt/unit-map.h
index 50aa74aeed05bf..e37438c58a2968 100644
--- a/flang-rt/lib/flang_rt/unit-map.h
+++ b/flang-rt/lib/flang_rt/unit-map.h
@@ -9,8 +9,8 @@
 // Maps Fortran unit numbers to their ExternalFileUnit instances.
 // A simple hash table with forward-linked chains per bucket.
 
-#ifndef FLANGRT_UNIT_MAP_H_
-#define FLANGRT_UNIT_MAP_H_
+#ifndef FLANG_RT_UNIT_MAP_H_
+#define FLANG_RT_UNIT_MAP_H_
 
 #include "flang-rt/memory.h"
 #include "lock.h"
@@ -100,4 +100,4 @@ class UnitMap {
   int emergencyNewUnit_{maxNewUnits_}; // not recycled
 };
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_UNIT_MAP_H_ */
+#endif /* FLANG_RT_UNIT_MAP_H_ */
diff --git a/flang-rt/lib/flang_rt/unit.cpp b/flang-rt/lib/flang_rt/unit.cpp
index b5a4282faf22e5..06faf60d6d6222 100644
--- a/flang-rt/lib/flang_rt/unit.cpp
+++ b/flang-rt/lib/flang_rt/unit.cpp
@@ -19,13 +19,13 @@
 
 namespace Fortran::runtime::io {
 
-#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RT_NO_GLOBAL_VAR_DEFS
 RT_OFFLOAD_VAR_GROUP_BEGIN
 RT_VAR_ATTRS ExternalFileUnit *defaultInput{nullptr}; // unit 5
 RT_VAR_ATTRS ExternalFileUnit *defaultOutput{nullptr}; // unit 6
 RT_VAR_ATTRS ExternalFileUnit *errorOutput{nullptr}; // unit 0 extension
 RT_OFFLOAD_VAR_GROUP_END
-#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/flang-rt/lib/flang_rt/unit.h b/flang-rt/lib/flang_rt/unit.h
index 5049f3c5db80f7..0a31de632136d2 100644
--- a/flang-rt/lib/flang_rt/unit.h
+++ b/flang-rt/lib/flang_rt/unit.h
@@ -8,8 +8,8 @@
 
 // Fortran external I/O units
 
-#ifndef FLANGRT_UNIT_H_
-#define FLANGRT_UNIT_H_
+#ifndef FLANG_RT_UNIT_H_
+#define FLANG_RT_UNIT_H_
 
 #include "buffer.h"
 #include "connection.h"
@@ -291,4 +291,4 @@ class ChildIo {
 };
 
 } // namespace Fortran::runtime::io
-#endif /* FLANGRT_UNIT_H_ */
+#endif /* FLANG_RT_UNIT_H_ */
diff --git a/flang-rt/lib/flang_rt/utf.cpp b/flang-rt/lib/flang_rt/utf.cpp
index 860db5f2367d38..e4e4926ea3124d 100644
--- a/flang-rt/lib/flang_rt/utf.cpp
+++ b/flang-rt/lib/flang_rt/utf.cpp
@@ -10,7 +10,7 @@
 
 namespace Fortran::runtime {
 
-#ifndef FLANGRT_NO_GLOBAL_VAR_DEFS
+#ifndef FLANG_RT_NO_GLOBAL_VAR_DEFS
 // clang-format off
 RT_OFFLOAD_VAR_GROUP_BEGIN
 const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
@@ -41,7 +41,7 @@ const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{
 };
 RT_OFFLOAD_VAR_GROUP_END
 // clang-format on
-#endif // FLANGRT_NO_GLOBAL_VAR_DEFS
+#endif // FLANG_RT_NO_GLOBAL_VAR_DEFS
 
 RT_OFFLOAD_API_GROUP_BEGIN
 
diff --git a/flang-rt/test/CMakeLists.txt b/flang-rt/test/CMakeLists.txt
index 6c542d522f4762..5dfd6ac35248c3 100644
--- a/flang-rt/test/CMakeLists.txt
+++ b/flang-rt/test/CMakeLists.txt
@@ -41,7 +41,7 @@ if (TARGET FlangRTUnitTests)
   )
 endif ()
 
-set(FLANGRT_TEST_DEPENDS
+set(FLANG_RT_TEST_DEPENDS
     FlangRTUnitTests
     flang_rt.unittest
     flang_rt.static
@@ -49,7 +49,7 @@ set(FLANGRT_TEST_DEPENDS
 
 add_custom_target(flang-rt-test-depends)
 set_target_properties(flang-rt-test-depends PROPERTIES FOLDER "Fortran Runtime/Meta")
-add_dependencies(flang-rt-test-depends ${FLANGRT_TEST_DEPENDS})
+add_dependencies(flang-rt-test-depends ${FLANG_RT_TEST_DEPENDS})
 
 add_lit_testsuite(check-flang-rt "Running the flang-rt regression tests"
     ${CMAKE_CURRENT_BINARY_DIR}
diff --git a/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in b/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
index 9dc4d2d5a1513f..f68c87afdef812 100644
--- a/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
+++ b/flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
@@ -3,8 +3,8 @@
 import os
 
 config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
-config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
-config.flangrt_binary_dir = "@FLANGRT_BINARY_DIR@"
+config.flangrt_source_dir = "@FLANG_RT_SOURCE_DIR@"
+config.flangrt_binary_dir = "@FLANG_RT_BINARY_DIR@"
 config.flangrt_binary_test_dir = os.path.dirname(__file__)
 
 import lit.llvm
diff --git a/flang-rt/test/Unit/lit.site.cfg.py.in b/flang-rt/test/Unit/lit.site.cfg.py.in
index f6ed1e758d9374..1441aac0d0e45b 100644
--- a/flang-rt/test/Unit/lit.site.cfg.py.in
+++ b/flang-rt/test/Unit/lit.site.cfg.py.in
@@ -4,8 +4,8 @@ import os
 
 config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
 config.llvm_build_mode = "@LLVM_BUILD_MODE@"
-config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
-config.flangrt_binary_dir = "@FLANGRT_BINARY_DIR@"
+config.flangrt_source_dir = "@FLANG_RT_SOURCE_DIR@"
+config.flangrt_binary_dir = "@FLANG_RT_BINARY_DIR@"
 config.flangrt_binary_test_dir = os.path.dirname(__file__)
 
 import lit.llvm
diff --git a/flang-rt/test/lit.site.cfg.py.in b/flang-rt/test/lit.site.cfg.py.in
index 630f7dfcd508c7..664a75bdc7b9e6 100644
--- a/flang-rt/test/lit.site.cfg.py.in
+++ b/flang-rt/test/lit.site.cfg.py.in
@@ -4,9 +4,9 @@ import sys
 
 config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
 config.flang_source_dir = "@FLANG_SOURCE_DIR@"
-config.flangrt_source_dir = "@FLANGRT_SOURCE_DIR@"
+config.flangrt_source_dir = "@FLANG_RT_SOURCE_DIR@"
 config.flangrt_binary_test_dir = os.path.dirname(__file__)
-config.flangrt_build_lib_dir = "@FLANGRT_BUILD_LIB_DIR@"
+config.flangrt_build_lib_dir = "@FLANG_RT_BUILD_LIB_DIR@"
 config.cc = "@CMAKE_C_COMPILER@"
 config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
 
diff --git a/flang-rt/unittests/CMakeLists.txt b/flang-rt/unittests/CMakeLists.txt
index 43dc2b5a4ac48b..a15675e80473fa 100644
--- a/flang-rt/unittests/CMakeLists.txt
+++ b/flang-rt/unittests/CMakeLists.txt
@@ -64,7 +64,7 @@ function(add_flangrt_unittest test_dirname)
 
   add_unittest(FlangRTUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
 
-  target_include_directories(${test_dirname} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
+  target_include_directories(${test_dirname} PRIVATE "${FLANG_RT_SOURCE_DIR}/include")
   target_include_directories(${test_dirname} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
   add_flangrt_unittest_offload_properties(${test_dirname})
@@ -86,7 +86,7 @@ function(add_flangrt_nongtest_unittest test_name)
   add_executable(${test_name}${suffix} ${ARG_UNPARSED_ARGUMENTS})
   set_target_properties(${test_name}${suffix} PROPERTIES FOLDER "Fortran Runtime/Tests/Unit")
 
-  target_include_directories(${test_name}${suffix} PRIVATE "${FLANGRT_SOURCE_DIR}/include")
+  target_include_directories(${test_name}${suffix} PRIVATE "${FLANG_RT_SOURCE_DIR}/include")
   target_include_directories(${test_name}${suffix} PRIVATE "${FLANG_SOURCE_DIR}/include")
   target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
 
diff --git a/flang-rt/unittests/Runtime/tools.h b/flang-rt/unittests/Runtime/tools.h
index 414175bde07d04..0db44c7ad0189c 100644
--- a/flang-rt/unittests/Runtime/tools.h
+++ b/flang-rt/unittests/Runtime/tools.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef FLANGRT_UNITTESTS_RUNTIME_TOOLS_H_
-#define FLANGRT_UNITTESTS_RUNTIME_TOOLS_H_
+#ifndef FLANG_RT_UNITTESTS_RUNTIME_TOOLS_H_
+#define FLANG_RT_UNITTESTS_RUNTIME_TOOLS_H_
 
 #include "flang-rt/descriptor.h"
 #include "flang-rt/type-code.h"
@@ -54,4 +54,4 @@ static OwningPtr<Descriptor> MakeArray(const std::vector<int> &shape,
 }
 
 } // namespace Fortran::runtime
-#endif /* FLANGRT_UNITTESTS_RUNTIME_TOOLS_H_ */
+#endif /* FLANG_RT_UNITTESTS_RUNTIME_TOOLS_H_ */



More information about the llvm-branch-commits mailing list