Skip to content

Commit 1c35c1a

Browse files
committed
[flang] Allow runtime build with AVOID_NATIVE_INT128_T=1
This patch enables the Fortran runtime support library to be built without native 128-bit integer support in the C++ compiler. Experimental: do not merge yet. Differential Revision: https://reviews.llvm.org/D154660
1 parent f41223e commit 1c35c1a

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed

flang/runtime/command.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,13 @@ static void StoreLengthToDescriptor(
107107
}
108108

109109
template <int KIND> struct FitsInIntegerKind {
110-
bool operator()(std::int64_t value) {
111-
return value <= std::numeric_limits<Fortran::runtime::CppTypeFor<
112-
Fortran::common::TypeCategory::Integer, KIND>>::max();
110+
bool operator()([[maybe_unused]] std::int64_t value) {
111+
if constexpr (KIND >= 8) {
112+
return true;
113+
} else {
114+
return value <= std::numeric_limits<Fortran::runtime::CppTypeFor<
115+
Fortran::common::TypeCategory::Integer, KIND>>::max();
116+
}
113117
}
114118
};
115119

flang/runtime/io-api.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1484,7 +1484,9 @@ static enum Iostat CheckUnitNumberInRangeImpl(INT unit, bool handleError,
14841484
// Only provide the bad unit number in the message if SignalError can print
14851485
// it accurately. Otherwise, the generic IostatUnitOverflow message will be
14861486
// used.
1487-
if (static_cast<std::intmax_t>(unit) == unit) {
1487+
if constexpr (sizeof(INT) > sizeof(std::intmax_t)) {
1488+
errorHandler.SignalError(IostatUnitOverflow);
1489+
} else if (static_cast<std::intmax_t>(unit) == unit) {
14881490
errorHandler.SignalError(IostatUnitOverflow,
14891491
"UNIT number %jd is out of range", static_cast<std::intmax_t>(unit));
14901492
} else {

flang/runtime/numeric.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling4_8)(
306306
CppTypeFor<TypeCategory::Real, 4> x) {
307307
return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
308308
}
309-
#ifdef __SIZEOF_INT128__
309+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
310310
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling4_16)(
311311
CppTypeFor<TypeCategory::Real, 4> x) {
312312
return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -328,7 +328,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling8_8)(
328328
CppTypeFor<TypeCategory::Real, 8> x) {
329329
return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
330330
}
331-
#ifdef __SIZEOF_INT128__
331+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
332332
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling8_16)(
333333
CppTypeFor<TypeCategory::Real, 8> x) {
334334
return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -351,7 +351,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling10_8)(
351351
CppTypeFor<TypeCategory::Real, 10> x) {
352352
return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
353353
}
354-
#ifdef __SIZEOF_INT128__
354+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
355355
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling10_16)(
356356
CppTypeFor<TypeCategory::Real, 10> x) {
357357
return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -374,7 +374,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling16_8)(
374374
CppTypeFor<TypeCategory::Real, 16> x) {
375375
return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
376376
}
377-
#ifdef __SIZEOF_INT128__
377+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
378378
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling16_16)(
379379
CppTypeFor<TypeCategory::Real, 16> x) {
380380
return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -434,7 +434,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor4_8)(
434434
CppTypeFor<TypeCategory::Real, 4> x) {
435435
return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
436436
}
437-
#ifdef __SIZEOF_INT128__
437+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
438438
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor4_16)(
439439
CppTypeFor<TypeCategory::Real, 4> x) {
440440
return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -456,7 +456,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor8_8)(
456456
CppTypeFor<TypeCategory::Real, 8> x) {
457457
return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
458458
}
459-
#ifdef __SIZEOF_INT128__
459+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
460460
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor8_16)(
461461
CppTypeFor<TypeCategory::Real, 8> x) {
462462
return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -479,7 +479,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor10_8)(
479479
CppTypeFor<TypeCategory::Real, 10> x) {
480480
return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
481481
}
482-
#ifdef __SIZEOF_INT128__
482+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
483483
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor10_16)(
484484
CppTypeFor<TypeCategory::Real, 10> x) {
485485
return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -502,7 +502,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor16_8)(
502502
CppTypeFor<TypeCategory::Real, 16> x) {
503503
return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
504504
}
505-
#ifdef __SIZEOF_INT128__
505+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
506506
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor16_16)(
507507
CppTypeFor<TypeCategory::Real, 16> x) {
508508
return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -710,7 +710,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint4_8)(
710710
CppTypeFor<TypeCategory::Real, 4> x) {
711711
return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
712712
}
713-
#ifdef __SIZEOF_INT128__
713+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
714714
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint4_16)(
715715
CppTypeFor<TypeCategory::Real, 4> x) {
716716
return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -732,7 +732,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint8_8)(
732732
CppTypeFor<TypeCategory::Real, 8> x) {
733733
return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
734734
}
735-
#ifdef __SIZEOF_INT128__
735+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
736736
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint8_16)(
737737
CppTypeFor<TypeCategory::Real, 8> x) {
738738
return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -755,7 +755,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint10_8)(
755755
CppTypeFor<TypeCategory::Real, 10> x) {
756756
return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
757757
}
758-
#ifdef __SIZEOF_INT128__
758+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
759759
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint10_16)(
760760
CppTypeFor<TypeCategory::Real, 10> x) {
761761
return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
@@ -778,7 +778,7 @@ CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint16_8)(
778778
CppTypeFor<TypeCategory::Real, 16> x) {
779779
return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
780780
}
781-
#ifdef __SIZEOF_INT128__
781+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
782782
CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint16_16)(
783783
CppTypeFor<TypeCategory::Real, 16> x) {
784784
return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);

flang/runtime/tools.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ inline RT_API_ATTRS RESULT ApplyType(
131131
return FUNC<TypeCategory::Integer, 4>{}(std::forward<A>(x)...);
132132
case 8:
133133
return FUNC<TypeCategory::Integer, 8>{}(std::forward<A>(x)...);
134-
#ifdef __SIZEOF_INT128__
134+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
135135
case 16:
136136
return FUNC<TypeCategory::Integer, 16>{}(std::forward<A>(x)...);
137137
#endif
@@ -230,7 +230,7 @@ inline RT_API_ATTRS RESULT ApplyIntegerKind(
230230
return FUNC<4>{}(std::forward<A>(x)...);
231231
case 8:
232232
return FUNC<8>{}(std::forward<A>(x)...);
233-
#ifdef __SIZEOF_INT128__
233+
#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
234234
case 16:
235235
return FUNC<16>{}(std::forward<A>(x)...);
236236
#endif
@@ -310,6 +310,11 @@ std::optional<std::pair<TypeCategory, int>> inline constexpr GetResultType(
310310
return std::make_pair(TypeCategory::Integer, maxKind);
311311
case TypeCategory::Real:
312312
case TypeCategory::Complex:
313+
#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T)
314+
if (xKind == 16) {
315+
break;
316+
}
317+
#endif
313318
return std::make_pair(yCat, yKind);
314319
default:
315320
break;
@@ -318,6 +323,11 @@ std::optional<std::pair<TypeCategory, int>> inline constexpr GetResultType(
318323
case TypeCategory::Real:
319324
switch (yCat) {
320325
case TypeCategory::Integer:
326+
#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T)
327+
if (yKind == 16) {
328+
break;
329+
}
330+
#endif
321331
return std::make_pair(TypeCategory::Real, xKind);
322332
case TypeCategory::Real:
323333
case TypeCategory::Complex:
@@ -329,6 +339,11 @@ std::optional<std::pair<TypeCategory, int>> inline constexpr GetResultType(
329339
case TypeCategory::Complex:
330340
switch (yCat) {
331341
case TypeCategory::Integer:
342+
#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T)
343+
if (yKind == 16) {
344+
break;
345+
}
346+
#endif
332347
return std::make_pair(TypeCategory::Complex, xKind);
333348
case TypeCategory::Real:
334349
case TypeCategory::Complex:

0 commit comments

Comments
 (0)