Skip to content

[Clang] Respect MS layout attributes during CUDA/HIP device compilation #146620

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions clang/include/clang/Basic/Attr.td
Original file line number Diff line number Diff line change
Expand Up @@ -492,9 +492,22 @@ def TargetHasDLLImportExport : TargetSpec {
def TargetItaniumCXXABI : TargetSpec {
let CustomCode = [{ Target.getCXXABI().isItaniumFamily() }];
}

def TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb", "aarch64"]> {
let CustomCode = [{ Target.getCXXABI().isMicrosoft() }];
}

// The target follows Microsoft record layout. Usually this happens in two
// cases: 1. the target itself has Microsoft C++ ABI, e.g. x86_64 in MSVC
// environment on Windows 2. an offloading target e.g. amdgcn or nvptx with
// a host target in MSVC environment on Windows.
def TargetMicrosoftRecordLayout : TargetArch<["x86", "x86_64", "arm", "thumb",
"aarch64", "amdgcn", "nvptx",
"nvptx64", "spirv", "spirv32",
"spirv64"]> {
let CustomCode = [{ Target.hasMicrosoftRecordLayout() }];
}

def TargetELF : TargetSpec {
let ObjectFormats = ["ELF"];
}
Expand Down Expand Up @@ -1789,7 +1802,7 @@ def Destructor : InheritableAttr {
let Documentation = [CtorDtorDocs];
}

def EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
def EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftRecordLayout> {
let Spellings = [Declspec<"empty_bases">];
let Subjects = SubjectList<[CXXRecord]>;
let Documentation = [EmptyBasesDocs];
Expand Down Expand Up @@ -2021,7 +2034,7 @@ def Restrict : InheritableAttr {
let Documentation = [RestrictDocs];
}

def LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
def LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftRecordLayout> {
let Spellings = [Declspec<"layout_version">];
let Args = [UnsignedArgument<"Version">];
let Subjects = SubjectList<[CXXRecord]>;
Expand Down Expand Up @@ -2239,7 +2252,7 @@ def NoUniqueAddress : InheritableAttr {
let Spellings = [CXX11<"", "no_unique_address", 201803>, CXX11<"msvc", "no_unique_address", 201803>];
let TargetSpecificSpellings = [
TargetSpecificSpelling<TargetItaniumCXXABI, [CXX11<"", "no_unique_address", 201803>]>,
TargetSpecificSpelling<TargetMicrosoftCXXABI, [CXX11<"msvc", "no_unique_address", 201803>]>,
TargetSpecificSpelling<TargetMicrosoftRecordLayout, [CXX11<"msvc", "no_unique_address", 201803>]>,
];
let Documentation = [NoUniqueAddressDocs];
}
Expand Down
7 changes: 6 additions & 1 deletion clang/include/clang/Basic/TargetInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ class TargetInfo : public TransferrableTargetInfo,

std::optional<llvm::Triple> DarwinTargetVariantTriple;

bool HasMicrosoftRecordLayout = false;

// TargetInfo Constructor. Default initializes all fields.
TargetInfo(const llvm::Triple &T);

Expand Down Expand Up @@ -1325,7 +1327,8 @@ class TargetInfo : public TransferrableTargetInfo,
/// Apply changes to the target information with respect to certain
/// language options which change the target configuration and adjust
/// the language based on the target options where applicable.
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts);
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux);

/// Initialize the map with the default set of target features for the
/// CPU this should include all legal feature strings on the target.
Expand Down Expand Up @@ -1840,6 +1843,8 @@ class TargetInfo : public TransferrableTargetInfo,

virtual void setAuxTarget(const TargetInfo *Aux) {}

bool hasMicrosoftRecordLayout() const { return HasMicrosoftRecordLayout; }

/// Whether target allows debuginfo types for decl only variables/functions.
virtual bool allowDebugInfoForExternalRef() const { return false; }

Expand Down
18 changes: 5 additions & 13 deletions clang/lib/AST/RecordLayoutBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2458,15 +2458,6 @@ static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {
llvm_unreachable("bad tail-padding use kind");
}

static bool isMsLayout(const ASTContext &Context) {
// Check if it's CUDA device compilation; ensure layout consistency with host.
if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
return Context.getAuxTargetInfo()->getCXXABI().isMicrosoft();

return Context.getTargetInfo().getCXXABI().isMicrosoft();
}

// This section contains an implementation of struct layout that is, up to the
// included tests, compatible with cl.exe (2013). The layout produced is
// significantly different than those produced by the Itanium ABI. Here we note
Expand Down Expand Up @@ -3399,7 +3390,7 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {

const ASTRecordLayout *NewEntry = nullptr;

if (isMsLayout(*this)) {
if (getTargetInfo().hasMicrosoftRecordLayout()) {
if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
EmptySubobjectMap EmptySubobjects(*this, RD);
MicrosoftRecordLayoutBuilder Builder(*this, &EmptySubobjects);
Expand Down Expand Up @@ -3656,7 +3647,8 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
bool HasOwnVBPtr = Layout.hasOwnVBPtr();

// Vtable pointer.
if (CXXRD->isDynamicClass() && !PrimaryBase && !isMsLayout(C)) {
if (CXXRD->isDynamicClass() && !PrimaryBase &&
!C.getTargetInfo().hasMicrosoftRecordLayout()) {
PrintOffset(OS, Offset, IndentLevel);
OS << '(' << *RD << " vtable pointer)\n";
} else if (HasOwnVFPtr) {
Expand Down Expand Up @@ -3754,7 +3746,7 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,

PrintIndentNoOffset(OS, IndentLevel - 1);
OS << "[sizeof=" << Layout.getSize().getQuantity();
if (CXXRD && !isMsLayout(C))
if (CXXRD && !C.getTargetInfo().hasMicrosoftRecordLayout())
OS << ", dsize=" << Layout.getDataSize().getQuantity();
OS << ", align=" << Layout.getAlignment().getQuantity();
if (C.getTargetInfo().defaultsToAIXPowerAlignment())
Expand Down Expand Up @@ -3793,7 +3785,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
OS << "\nLayout: ";
OS << "<ASTRecordLayout\n";
OS << " Size:" << toBits(Info.getSize()) << "\n";
if (!isMsLayout(*this))
if (!getTargetInfo().hasMicrosoftRecordLayout())
OS << " DataSize:" << toBits(Info.getDataSize()) << "\n";
OS << " Alignment:" << toBits(Info.getAlignment()) << "\n";
if (Target->defaultsToAIXPowerAlignment())
Expand Down
9 changes: 8 additions & 1 deletion clang/lib/Basic/TargetInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
? TargetCXXABI::Microsoft
: TargetCXXABI::GenericItanium);

HasMicrosoftRecordLayout = TheCXXABI.isMicrosoft();

// Default to an empty address space map.
AddrSpaceMap = &DefaultAddrSpaceMap;
UseAddrSpaceMapMangling = false;
Expand Down Expand Up @@ -410,7 +412,8 @@ bool TargetInfo::isTypeSigned(IntType T) {
/// Apply changes to the target information with respect to certain
/// language options which change the target configuration and adjust
/// the language based on the target options where applicable.
void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) {
if (Opts.NoBitFieldTypeAlign)
UseBitFieldTypeAlignment = false;

Expand Down Expand Up @@ -550,6 +553,10 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {

if (Opts.FakeAddressSpaceMap)
AddrSpaceMap = &FakeAddrSpaceMap;

// Check if it's CUDA device compilation; ensure layout consistency with host.
if (Opts.CUDA && Opts.CUDAIsDevice && Aux && !HasMicrosoftRecordLayout)
HasMicrosoftRecordLayout = Aux->getCXXABI().isMicrosoft();
}

bool TargetInfo::initFeatureMap(
Expand Down
5 changes: 3 additions & 2 deletions clang/lib/Basic/Targets/AMDGPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,9 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
HalfArgsAndReturns = true;
}

void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
TargetInfo::adjust(Diags, Opts);
void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) {
TargetInfo::adjust(Diags, Opts, Aux);
// ToDo: There are still a few places using default address space as private
// address space in OpenCL, which needs to be cleaned up, then the references
// to OpenCL can be removed from the following line.
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Basic/Targets/AMDGPU.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {

void setAddressSpaceMap(bool DefaultIsPrivate);

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override;
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override;

uint64_t getPointerWidthV(LangAS AS) const override {
if (isR600(getTriple()))
Expand Down
5 changes: 3 additions & 2 deletions clang/lib/Basic/Targets/DirectX.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,9 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
return TargetInfo::VoidPtrBuiltinVaList;
}

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
TargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
TargetInfo::adjust(Diags, Opts, Aux);
// The static values this addresses do not apply outside of the same thread
// This protection is neither available nor needed
Opts.ThreadsafeStatics = false;
Expand Down
5 changes: 3 additions & 2 deletions clang/lib/Basic/Targets/PPC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -758,10 +758,11 @@ void PPCTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
llvm::PPC::fillValidCPUList(Values);
}

void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) {
if (HasAltivec)
Opts.AltiVec = 1;
TargetInfo::adjust(Diags, Opts);
TargetInfo::adjust(Diags, Opts, Aux);
if (LongDoubleFormat != &llvm::APFloat::IEEEdouble())
LongDoubleFormat = Opts.PPCIEEELongDouble
? &llvm::APFloat::IEEEquad()
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Basic/Targets/PPC.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
}

// Set the language option for altivec based on our value.
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override;
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override;

// Note: GCC recognizes the following additional cpus:
// 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
Expand Down
15 changes: 9 additions & 6 deletions clang/lib/Basic/Targets/SPIR.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,9 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo {
AddrSpaceMap = DefaultIsGeneric ? &SPIRDefIsGenMap : &SPIRDefIsPrivMap;
}

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
TargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
TargetInfo::adjust(Diags, Opts, Aux);
// FIXME: SYCL specification considers unannotated pointers and references
// to be pointing to the generic address space. See section 5.9.3 of
// SYCL 2020 specification.
Expand Down Expand Up @@ -383,8 +384,9 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
std::optional<LangAS> getConstantAddressSpace() const override {
return ConstantAS;
}
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
BaseSPIRVTargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
BaseSPIRVTargetInfo::adjust(Diags, Opts, Aux);
// opencl_constant will map to UniformConstant in SPIR-V
if (Opts.OpenCL)
ConstantAS = LangAS::opencl_constant;
Expand Down Expand Up @@ -446,8 +448,9 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64AMDGCNTargetInfo final

void setAuxTarget(const TargetInfo *Aux) override;

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
TargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
TargetInfo::adjust(Diags, Opts, Aux);
}

bool hasInt128Type() const override { return TargetInfo::hasInt128Type(); }
Expand Down
6 changes: 3 additions & 3 deletions clang/lib/Basic/Targets/WebAssembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,9 +372,9 @@ WebAssemblyTargetInfo::getTargetBuiltins() const {
return {{&BuiltinStrings, BuiltinInfos}};
}

void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags,
LangOptions &Opts) {
TargetInfo::adjust(Diags, Opts);
void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) {
TargetInfo::adjust(Diags, Opts, Aux);
// Turn off POSIXThreads and ThreadModel so that we don't predefine _REENTRANT
// or __STDCPP_THREADS__ if we will eventually end up stripping atomics
// because they are unsupported.
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Basic/Targets/WebAssembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {

bool hasProtectedVisibility() const override { return false; }

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override;
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override;
};

class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
Expand Down
10 changes: 6 additions & 4 deletions clang/lib/Basic/Targets/X86.h
Original file line number Diff line number Diff line change
Expand Up @@ -441,8 +441,9 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
uint64_t getPointerAlignV(LangAS AddrSpace) const override {
return getPointerWidthV(AddrSpace);
}
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
TargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
TargetInfo::adjust(Diags, Opts, Aux);
IsOpenCL = Opts.OpenCL;
}

Expand Down Expand Up @@ -839,8 +840,9 @@ class LLVM_LIBRARY_VISIBILITY X86_64TargetInfo : public X86TargetInfo {
return llvm::IntegerType::MAX_INT_BITS;
}

void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
TargetInfo::adjust(Diags, Opts);
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
const TargetInfo *Aux) override {
TargetInfo::adjust(Diags, Opts, Aux);
IsOpenCL = Opts.OpenCL;
}

Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Frontend/ASTUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ class ASTInfoCollector : public ASTReaderListener {
//
// FIXME: We shouldn't need to do this, the target should be immutable once
// created. This complexity should be lifted elsewhere.
Target->adjust(PP.getDiagnostics(), LangOpt);
Target->adjust(PP.getDiagnostics(), LangOpt, /*AuxTarget=*/nullptr);

// Initialize the preprocessor.
PP.Initialize(*Target);
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/Frontend/CompilerInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ bool CompilerInstance::createTarget() {
// Inform the target of the language options.
// FIXME: We shouldn't need to do this, the target should be immutable once
// created. This complexity should be lifted elsewhere.
getTarget().adjust(getDiagnostics(), getLangOpts());
getTarget().adjust(getDiagnostics(), getLangOpts(), getAuxTarget());

if (auto *Aux = getAuxTarget())
getTarget().setAuxTarget(Aux);
Expand Down Expand Up @@ -454,7 +454,7 @@ void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
getSourceManager(), *HeaderInfo, *this,
/*IdentifierInfoLookup=*/nullptr,
/*OwnsHeaderSearch=*/true, TUKind);
getTarget().adjust(getDiagnostics(), getLangOpts());
getTarget().adjust(getDiagnostics(), getLangOpts(), getAuxTarget());
PP->Initialize(getTarget(), getAuxTarget());

if (PPOpts.DetailedRecord)
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Interpreter/Interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ CreateCI(const llvm::opt::ArgStringList &Argv) {
"Initialization failed. "
"Target is missing");

Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts());
Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts(),
Clang->getAuxTarget());

// Don't clear the AST before backend codegen since we do codegen multiple
// times, reusing the same AST.
Expand Down
11 changes: 11 additions & 0 deletions clang/test/Layout/ms-x86-declspec-empty_bases.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@
// RUN: | FileCheck %s
// RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
// RUN: | FileCheck %s
// RUN: %clang_cc1 -fno-rtti -triple amdgcn-amd-amdhsa -fms-extensions \
// RUN: -target-cpu gfx1200 -aux-triple x86_64-pc-win32 -fcuda-is-device \
// RUN: -fdump-record-layouts -fsyntax-only -xhip %s 2>/dev/null \
// RUN: | FileCheck %s
// RUN: %clang_cc1 -fno-rtti -triple spirv64-amd-amdhsa -fms-extensions \
// RUN: -aux-triple x86_64-pc-win32 -fcuda-is-device \
// RUN: -fdump-record-layouts -fsyntax-only -xhip %s 2>/dev/null \
// RUN: | FileCheck %s
// RUN: %clang_cc1 -fno-rtti -triple nvptx64 -fms-extensions \
// RUN: -aux-triple x86_64-pc-win32 -fcuda-is-device -fdump-record-layouts \
// RUN: -fsyntax-only -xcuda %s 2>/dev/null | FileCheck %s

namespace test1 {

Expand Down
9 changes: 9 additions & 0 deletions clang/test/SemaCXX/ms-layout_version.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
// RUN: %clang_cc1 -triple i386-pc-win32 %s -fsyntax-only -verify -fms-extensions -Wno-microsoft -std=c++11
// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions -Wno-microsoft \
// RUN: -std=c++11 -aux-triple x86_64-pc-win32 -fcuda-is-device -xhip \
// RUN: -triple amdgcn-amd-amdhsa -target-cpu gfx1200
// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions -Wno-microsoft \
// RUN: -std=c++11 -aux-triple x86_64-pc-win32 -fcuda-is-device -xhip \
// RUN: -triple spirv64-amd-amdhsa
// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions -Wno-microsoft \
// RUN: -std=c++11 -aux-triple x86_64-pc-win32 -fcuda-is-device -xcuda \
// RUN: -triple nvptx64

struct __declspec(layout_version(19)) S {};
enum __declspec(layout_version(19)) E {}; // expected-warning{{'layout_version' attribute only applies to classes}}
Expand Down
3 changes: 2 additions & 1 deletion clang/tools/clang-import-test/clang-import-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ std::unique_ptr<CompilerInstance> BuildCompilerInstance() {
TargetInfo *TI = TargetInfo::CreateTargetInfo(
Ins->getDiagnostics(), Ins->getInvocation().getTargetOpts());
Ins->setTarget(TI);
Ins->getTarget().adjust(Ins->getDiagnostics(), Ins->getLangOpts());
Ins->getTarget().adjust(Ins->getDiagnostics(), Ins->getLangOpts(),
/*AuxTarget=*/nullptr);
Ins->createFileManager();
Ins->createSourceManager(Ins->getFileManager());
Ins->createPreprocessor(TU_Complete);
Expand Down
Loading