Skip to content

Commit 33a6c74

Browse files
committed
[llvm][clang] Move long double layout logic from clang to LLVM
Information about the size and alignment of `long double` is currently part of clang. Move this logic to LLVM so it can be used to control lowering of intrinsics.
1 parent 590f492 commit 33a6c74

File tree

20 files changed

+184
-90
lines changed

20 files changed

+184
-90
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,12 @@ class TargetInfo : public TransferrableTargetInfo,
12181218
return Triple;
12191219
}
12201220

1221+
/// Returns information about C layouts that come from LLVM. This is used
1222+
/// to control lowering to libcalls.
1223+
llvm::Triple::CLayouts getTripleLayouts() const {
1224+
return Triple.getCLayouts();
1225+
}
1226+
12211227
/// Returns the target ID if supported.
12221228
virtual std::optional<std::string> getTargetID() const {
12231229
return std::nullopt;

clang/lib/Basic/TargetInfo.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ static const LangASMap FakeAddrSpaceMap = {
5454
TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
5555
// Set defaults. Defaults are set for a 32-bit RISC platform, like PPC or
5656
// SPARC. These should be overridden by concrete targets as needed.
57+
58+
// Load some defaults from LLVM
59+
llvm::Triple::CLayouts TripleLayouts = getTripleLayouts();
60+
5761
BigEndian = !T.isLittleEndian();
5862
TLSSupported = true;
5963
VLASupported = true;
@@ -113,8 +117,8 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
113117
FloatAlign = 32;
114118
DoubleWidth = 64;
115119
DoubleAlign = 64;
116-
LongDoubleWidth = 64;
117-
LongDoubleAlign = 64;
120+
LongDoubleWidth = TripleLayouts.LongDoubleWidth;
121+
LongDoubleAlign = TripleLayouts.LongDoubleAlign;
118122
Float128Align = 128;
119123
Ibm128Align = 128;
120124
LargeArrayMinWidth = 0;
@@ -144,7 +148,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
144148
HalfFormat = &llvm::APFloat::IEEEhalf();
145149
FloatFormat = &llvm::APFloat::IEEEsingle();
146150
DoubleFormat = &llvm::APFloat::IEEEdouble();
147-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
151+
LongDoubleFormat = TripleLayouts.LongDoubleFormat;
148152
Float128Format = &llvm::APFloat::IEEEquad();
149153
Ibm128Format = &llvm::APFloat::PPCDoubleDouble();
150154
MCountName = "mcount";

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,7 @@ AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
156156
MaxAtomicInlineWidth = 128;
157157
MaxAtomicPromoteWidth = 128;
158158

159-
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
160-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
159+
SuitableAlign = LongDoubleAlign;
161160

162161
BFloat16Width = BFloat16Align = 16;
163162
BFloat16Format = &llvm::APFloat::BFloat();
@@ -1452,8 +1451,6 @@ WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
14521451
IntWidth = IntAlign = 32;
14531452
LongWidth = LongAlign = 32;
14541453
DoubleAlign = LongLongAlign = 64;
1455-
LongDoubleWidth = LongDoubleAlign = 64;
1456-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
14571454
IntMaxType = SignedLongLong;
14581455
Int64Type = SignedLongLong;
14591456
SizeType = UnsignedLongLong;
@@ -1550,8 +1547,7 @@ DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
15501547
WCharType = SignedInt;
15511548
UseSignedCharForObjCBool = false;
15521549

1553-
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
1554-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1550+
SuitableAlign = LongDoubleAlign;
15551551

15561552
UseZeroLengthBitfieldAlignment = false;
15571553

clang/lib/Basic/Targets/ARC.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class LLVM_LIBRARY_VISIBILITY ARCTargetInfo : public TargetInfo {
2828
NoAsmVariants = true;
2929
LongLongAlign = 32;
3030
SuitableAlign = 32;
31-
DoubleAlign = LongDoubleAlign = 32;
31+
DoubleAlign = 32;
3232
SizeType = UnsignedInt;
3333
PtrDiffType = SignedInt;
3434
IntPtrType = SignedInt;

clang/lib/Basic/Targets/AVR.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
4444
DoubleWidth = 32;
4545
DoubleAlign = 8;
4646
DoubleFormat = &llvm::APFloat::IEEEsingle();
47-
LongDoubleWidth = 32;
48-
LongDoubleAlign = 8;
49-
LongDoubleFormat = &llvm::APFloat::IEEEsingle();
5047
SizeType = UnsignedInt;
5148
PtrDiffType = SignedInt;
5249
IntPtrType = SignedInt;

clang/lib/Basic/Targets/CSKY.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo {
4343
NoAsmVariants = true;
4444
LongLongAlign = 32;
4545
SuitableAlign = 32;
46-
DoubleAlign = LongDoubleAlign = 32;
46+
DoubleAlign = 32;
4747
SizeType = UnsignedInt;
4848
PtrDiffType = SignedInt;
4949
IntPtrType = SignedInt;

clang/lib/Basic/Targets/LoongArch.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
3737
HasFeatureF = false;
3838
HasFeatureLSX = false;
3939
HasFeatureLASX = false;
40-
LongDoubleWidth = 128;
41-
LongDoubleAlign = 128;
42-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
4340
MCountName = "_mcount";
4441
SuitableAlign = 128;
4542
WCharType = SignedInt;

clang/lib/Basic/Targets/MSP430.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ class LLVM_LIBRARY_VISIBILITY MSP430TargetInfo : public TargetInfo {
3535
LongAlign = LongLongAlign = 16;
3636
FloatWidth = 32;
3737
FloatAlign = 16;
38-
DoubleWidth = LongDoubleWidth = 64;
39-
DoubleAlign = LongDoubleAlign = 16;
38+
DoubleWidth = 64;
39+
DoubleAlign = 16;
4040
PointerWidth = 16;
4141
PointerAlign = 16;
4242
SuitableAlign = 16;

clang/lib/Basic/Targets/Mips.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
118118
void setO32ABITypes() {
119119
Int64Type = SignedLongLong;
120120
IntMaxType = Int64Type;
121-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
122-
LongDoubleWidth = LongDoubleAlign = 64;
123121
LongWidth = LongAlign = 32;
124122
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
125123
PointerWidth = PointerAlign = 32;
@@ -129,12 +127,6 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
129127
}
130128

131129
void setN32N64ABITypes() {
132-
LongDoubleWidth = LongDoubleAlign = 128;
133-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
134-
if (getTriple().isOSFreeBSD()) {
135-
LongDoubleWidth = LongDoubleAlign = 64;
136-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
137-
}
138130
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
139131
SuitableAlign = 128;
140132
}

clang/lib/Basic/Targets/PPC.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
8888
PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8989
: TargetInfo(Triple) {
9090
SuitableAlign = 128;
91-
LongDoubleWidth = LongDoubleAlign = 128;
92-
LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
9391
HasStrictFP = true;
9492
HasIbm128 = true;
9593
}
@@ -384,20 +382,11 @@ class LLVM_LIBRARY_VISIBILITY PPC32TargetInfo : public PPCTargetInfo {
384382
SizeType = UnsignedLong;
385383
PtrDiffType = SignedLong;
386384
IntPtrType = SignedLong;
387-
LongDoubleWidth = 64;
388-
LongDoubleAlign = DoubleAlign = 32;
389-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
390385
break;
391386
default:
392387
break;
393388
}
394389

395-
if (Triple.isOSFreeBSD() || Triple.isOSNetBSD() || Triple.isOSOpenBSD() ||
396-
Triple.isMusl()) {
397-
LongDoubleWidth = LongDoubleAlign = 64;
398-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
399-
}
400-
401390
// PPC32 supports atomics up to 4 bytes.
402391
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
403392
}
@@ -422,9 +411,6 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo {
422411
if (Triple.isOSAIX()) {
423412
// TODO: Set appropriate ABI for AIX platform.
424413
DataLayout = "E-m:a-Fi64-i64:64-n32:64";
425-
LongDoubleWidth = 64;
426-
LongDoubleAlign = DoubleAlign = 32;
427-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
428414
} else if ((Triple.getArch() == llvm::Triple::ppc64le)) {
429415
DataLayout = "e-m:e-Fn32-i64:64-n32:64";
430416
ABI = "elfv2";
@@ -440,11 +426,6 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo {
440426
DataLayout += "-i64:64-n32:64";
441427
}
442428

443-
if (Triple.isOSFreeBSD() || Triple.isOSOpenBSD() || Triple.isMusl()) {
444-
LongDoubleWidth = LongDoubleAlign = 64;
445-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
446-
}
447-
448429
if (Triple.isOSAIX() || Triple.isOSLinux())
449430
DataLayout += "-S128-v256:256:256-v512:512:512";
450431
resetDataLayout(DataLayout);

clang/lib/Basic/Targets/RISCV.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ class RISCVTargetInfo : public TargetInfo {
3939
BFloat16Width = 16;
4040
BFloat16Align = 16;
4141
BFloat16Format = &llvm::APFloat::BFloat();
42-
LongDoubleWidth = 128;
43-
LongDoubleAlign = 128;
44-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
4542
SuitableAlign = 128;
4643
WCharType = SignedInt;
4744
WIntType = UnsignedInt;

clang/lib/Basic/Targets/Sparc.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,8 @@ class LLVM_LIBRARY_VISIBILITY SparcV9TargetInfo : public SparcTargetInfo {
205205
IntMaxType = SignedLong;
206206
Int64Type = IntMaxType;
207207

208-
// The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
209-
// aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
210-
LongDoubleWidth = 128;
211-
LongDoubleAlign = 128;
212208
SuitableAlign = 128;
213-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
209+
214210
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
215211
}
216212

clang/lib/Basic/Targets/SystemZ.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo {
4040
LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4141
Int128Align = 64;
4242
PointerWidth = PointerAlign = 64;
43-
LongDoubleWidth = 128;
44-
LongDoubleAlign = 64;
45-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
4643
DefaultAlignForAttributeAligned = 64;
4744
MinGlobalAlign = 16;
4845
if (Triple.isOSzOS()) {

clang/lib/Basic/Targets/TCE.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,8 @@ class LLVM_LIBRARY_VISIBILITY TCETargetInfo : public TargetInfo {
7676
FloatAlign = 32;
7777
DoubleWidth = 32;
7878
DoubleAlign = 32;
79-
LongDoubleWidth = 32;
80-
LongDoubleAlign = 32;
8179
FloatFormat = &llvm::APFloat::IEEEsingle();
8280
DoubleFormat = &llvm::APFloat::IEEEsingle();
83-
LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8481
resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
8582
"i16:16:32-i32:32:32-i64:32:32-"
8683
"f32:32:32-f64:32:32-v64:32:32-"

clang/lib/Basic/Targets/VE.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo {
2727
VETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2828
: TargetInfo(Triple) {
2929
NoAsmVariants = true;
30-
LongDoubleWidth = 128;
31-
LongDoubleAlign = 128;
32-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
3330
DoubleAlign = LongLongAlign = 64;
3431
SuitableAlign = 64;
3532
LongWidth = LongAlign = PointerWidth = PointerAlign = 64;

clang/lib/Basic/Targets/WebAssembly.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
7676
LargeArrayMinWidth = 128;
7777
LargeArrayAlign = 128;
7878
SigAtomicType = SignedLong;
79-
LongDoubleWidth = LongDoubleAlign = 128;
80-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
8179
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
8280
// size_t being unsigned long for both wasm32 and wasm64 makes mangled names
8381
// more consistent between the two.

clang/lib/Basic/Targets/X86.h

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
185185
: TargetInfo(Triple) {
186186
BFloat16Width = BFloat16Align = 16;
187187
BFloat16Format = &llvm::APFloat::BFloat();
188-
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
189188
AddrSpaceMap = &X86AddrSpaceMap;
190189
HasStrictFP = true;
191190

@@ -437,8 +436,6 @@ class LLVM_LIBRARY_VISIBILITY X86_32TargetInfo : public X86TargetInfo {
437436
X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
438437
: X86TargetInfo(Triple, Opts) {
439438
DoubleAlign = LongLongAlign = 32;
440-
LongDoubleWidth = 96;
441-
LongDoubleAlign = 32;
442439
SuitableAlign = 128;
443440
resetDataLayout(Triple.isOSBinFormatMachO()
444441
? "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:"
@@ -540,8 +537,6 @@ class LLVM_LIBRARY_VISIBILITY DarwinI386TargetInfo
540537
public:
541538
DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
542539
: DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
543-
LongDoubleWidth = 128;
544-
LongDoubleAlign = 128;
545540
SuitableAlign = 128;
546541
MaxVectorAlign = 256;
547542
// The watchOS simulator uses the builtin bool type for Objective-C.
@@ -593,7 +588,6 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_32TargetInfo
593588
MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
594589
const TargetOptions &Opts)
595590
: WindowsX86_32TargetInfo(Triple, Opts) {
596-
LongDoubleWidth = LongDoubleAlign = 64;
597591
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
598592
}
599593

@@ -716,8 +710,6 @@ class LLVM_LIBRARY_VISIBILITY X86_64TargetInfo : public X86TargetInfo {
716710
bool IsWinCOFF =
717711
getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
718712
LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
719-
LongDoubleWidth = 128;
720-
LongDoubleAlign = 128;
721713
LargeArrayMinWidth = 128;
722714
LargeArrayAlign = 128;
723715
SuitableAlign = 128;
@@ -867,10 +859,7 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_64TargetInfo
867859
public:
868860
MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
869861
const TargetOptions &Opts)
870-
: WindowsX86_64TargetInfo(Triple, Opts) {
871-
LongDoubleWidth = LongDoubleAlign = 64;
872-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
873-
}
862+
: WindowsX86_64TargetInfo(Triple, Opts) {}
874863

875864
void getTargetDefines(const LangOptions &Opts,
876865
MacroBuilder &Builder) const override {
@@ -890,13 +879,7 @@ class LLVM_LIBRARY_VISIBILITY MinGWX86_64TargetInfo
890879
: public WindowsX86_64TargetInfo {
891880
public:
892881
MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
893-
: WindowsX86_64TargetInfo(Triple, Opts) {
894-
// Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
895-
// with x86 FP ops. Weird.
896-
LongDoubleWidth = LongDoubleAlign = 128;
897-
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
898-
HasFloat128 = true;
899-
}
882+
: WindowsX86_64TargetInfo(Triple, Opts) {}
900883
};
901884

902885
// x86-64 Cygwin target
@@ -987,8 +970,6 @@ class LLVM_LIBRARY_VISIBILITY OHOSX86_32TargetInfo
987970
OHOSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
988971
: OHOSTargetInfo<X86_32TargetInfo>(Triple, Opts) {
989972
SuitableAlign = 32;
990-
LongDoubleWidth = 64;
991-
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
992973
}
993974
};
994975

@@ -997,9 +978,7 @@ class LLVM_LIBRARY_VISIBILITY OHOSX86_64TargetInfo
997978
: public OHOSTargetInfo<X86_64TargetInfo> {
998979
public:
999980
OHOSX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1000-
: OHOSTargetInfo<X86_64TargetInfo>(Triple, Opts) {
1001-
LongDoubleFormat = &llvm::APFloat::IEEEquad();
1002-
}
981+
: OHOSTargetInfo<X86_64TargetInfo>(Triple, Opts) {}
1003982
};
1004983
} // namespace targets
1005984
} // namespace clang

clang/lib/Basic/Targets/XCore.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class LLVM_LIBRARY_VISIBILITY XCoreTargetInfo : public TargetInfo {
2929
NoAsmVariants = true;
3030
LongLongAlign = 32;
3131
SuitableAlign = 32;
32-
DoubleAlign = LongDoubleAlign = 32;
32+
DoubleAlign = 32;
3333
SizeType = UnsignedInt;
3434
PtrDiffType = SignedInt;
3535
IntPtrType = SignedInt;

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_TARGETPARSER_TRIPLE_H
1010
#define LLVM_TARGETPARSER_TRIPLE_H
1111

12+
#include "llvm/ADT/APFloat.h"
1213
#include "llvm/ADT/Twine.h"
1314
#include "llvm/Support/VersionTuple.h"
1415

@@ -1155,6 +1156,23 @@ class Triple {
11551156
/// Returns a canonicalized OS version number for the specified OS.
11561157
static VersionTuple getCanonicalVersionForOS(OSType OSKind,
11571158
const VersionTuple &Version);
1159+
1160+
/// Layouts for C types that are relevant to libc calls generated by LLVM
1161+
struct CLayouts {
1162+
unsigned char LongDoubleWidth;
1163+
unsigned char LongDoubleAlign;
1164+
const fltSemantics *LongDoubleFormat;
1165+
};
1166+
1167+
/// Provide default layouts relevant to C. Frontends may override these
1168+
/// values.
1169+
CLayouts getCLayouts() const;
1170+
1171+
/// Return true if `long double` and `__float128` have the same layout.
1172+
bool isLongDoubleF128() const {
1173+
// TODO: do we also need to check alignment?
1174+
return getCLayouts().LongDoubleWidth == 128;
1175+
}
11581176
};
11591177

11601178
} // End llvm namespace

0 commit comments

Comments
 (0)