Import clang 3.7.1 release (r255217).
This commit is contained in:
parent
36c5ade2f4
commit
7e86edd64b
@ -3968,7 +3968,13 @@ public:
|
||||
class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
|
||||
public:
|
||||
MinGWX86_64TargetInfo(const llvm::Triple &Triple)
|
||||
: WindowsX86_64TargetInfo(Triple) {}
|
||||
: WindowsX86_64TargetInfo(Triple) {
|
||||
// Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
|
||||
// with x86 FP ops. Weird.
|
||||
LongDoubleWidth = LongDoubleAlign = 128;
|
||||
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
|
||||
}
|
||||
|
||||
void getTargetDefines(const LangOptions &Opts,
|
||||
MacroBuilder &Builder) const override {
|
||||
WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
|
||||
|
@ -36,7 +36,7 @@ std::string getClangRepositoryPath() {
|
||||
|
||||
// If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us
|
||||
// pick up a tag in an SVN export, for example.
|
||||
StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_370/final/lib/Basic/Version.cpp $");
|
||||
StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_371/final/lib/Basic/Version.cpp $");
|
||||
if (URL.empty()) {
|
||||
URL = SVNRepository.slice(SVNRepository.find(':'),
|
||||
SVNRepository.find("/lib/Basic"));
|
||||
|
@ -1279,12 +1279,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
|
||||
}
|
||||
break;
|
||||
|
||||
case ABIArgInfo::Indirect: {
|
||||
assert(!retAI.getIndirectAlign() && "Align unused on indirect return.");
|
||||
resultType = llvm::Type::getVoidTy(getLLVMContext());
|
||||
break;
|
||||
}
|
||||
|
||||
case ABIArgInfo::Indirect:
|
||||
case ABIArgInfo::Ignore:
|
||||
resultType = llvm::Type::getVoidTy(getLLVMContext());
|
||||
break;
|
||||
|
@ -2493,6 +2493,11 @@ void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
|
||||
|
||||
StringRef MangledName = getMangledName(GD);
|
||||
|
||||
if (AA->getAliasee() == MangledName) {
|
||||
Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
|
||||
return;
|
||||
}
|
||||
|
||||
// If there is a definition in the module, then it wins over the alias.
|
||||
// This is dubious, but allow it to be safe. Just ignore the alias.
|
||||
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
|
||||
|
@ -1552,12 +1552,10 @@ public:
|
||||
|
||||
/// WinX86_64ABIInfo - The Windows X86_64 ABI information.
|
||||
class WinX86_64ABIInfo : public ABIInfo {
|
||||
|
||||
ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs,
|
||||
bool IsReturnType) const;
|
||||
|
||||
public:
|
||||
WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
|
||||
WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT)
|
||||
: ABIInfo(CGT),
|
||||
IsMingw64(getTarget().getTriple().isWindowsGNUEnvironment()) {}
|
||||
|
||||
void computeInfo(CGFunctionInfo &FI) const override;
|
||||
|
||||
@ -1574,6 +1572,12 @@ public:
|
||||
// FIXME: Assumes vectorcall is in use.
|
||||
return isX86VectorCallAggregateSmallEnough(NumMembers);
|
||||
}
|
||||
|
||||
private:
|
||||
ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs,
|
||||
bool IsReturnType) const;
|
||||
|
||||
bool IsMingw64;
|
||||
};
|
||||
|
||||
class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
|
||||
@ -3070,11 +3074,6 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs,
|
||||
|
||||
if (RT->getDecl()->hasFlexibleArrayMember())
|
||||
return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
|
||||
|
||||
// FIXME: mingw-w64-gcc emits 128-bit struct as i128
|
||||
if (Width == 128 && getTarget().getTriple().isWindowsGNUEnvironment())
|
||||
return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
|
||||
Width));
|
||||
}
|
||||
|
||||
// vectorcall adds the concept of a homogenous vector aggregate, similar to
|
||||
@ -3116,6 +3115,14 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs,
|
||||
if (BT && BT->getKind() == BuiltinType::Bool)
|
||||
return ABIArgInfo::getExtend();
|
||||
|
||||
// Mingw64 GCC uses the old 80 bit extended precision floating point unit. It
|
||||
// passes them indirectly through memory.
|
||||
if (IsMingw64 && BT && BT->getKind() == BuiltinType::LongDouble) {
|
||||
const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
|
||||
if (LDF == &llvm::APFloat::x87DoubleExtended)
|
||||
return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
|
||||
}
|
||||
|
||||
return ABIArgInfo::getDirect();
|
||||
}
|
||||
|
||||
|
@ -2460,6 +2460,28 @@ static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
|
||||
return RT;
|
||||
}
|
||||
|
||||
static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
|
||||
const ArgList &Args) {
|
||||
if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
|
||||
options::OPT_fno_openmp, false))
|
||||
return;
|
||||
|
||||
switch (getOpenMPRuntime(TC, Args)) {
|
||||
case OMPRT_OMP:
|
||||
CmdArgs.push_back("-lomp");
|
||||
break;
|
||||
case OMPRT_GOMP:
|
||||
CmdArgs.push_back("-lgomp");
|
||||
break;
|
||||
case OMPRT_IOMP5:
|
||||
CmdArgs.push_back("-liomp5");
|
||||
break;
|
||||
case OMPRT_Unknown:
|
||||
// Already diagnosed.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
|
||||
ArgStringList &CmdArgs, StringRef Sanitizer,
|
||||
bool IsShared) {
|
||||
@ -6527,24 +6549,6 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_L);
|
||||
|
||||
if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
|
||||
options::OPT_fno_openmp, false)) {
|
||||
switch (getOpenMPRuntime(getToolChain(), Args)) {
|
||||
case OMPRT_OMP:
|
||||
CmdArgs.push_back("-lomp");
|
||||
break;
|
||||
case OMPRT_GOMP:
|
||||
CmdArgs.push_back("-lgomp");
|
||||
break;
|
||||
case OMPRT_IOMP5:
|
||||
CmdArgs.push_back("-liomp5");
|
||||
break;
|
||||
case OMPRT_Unknown:
|
||||
// Already diagnosed.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
|
||||
// Build the input file for -filelist (list of linker input files) in case we
|
||||
// need it later
|
||||
@ -6563,6 +6567,10 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
InputFileList.push_back(II.getFilename());
|
||||
}
|
||||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nodefaultlibs))
|
||||
addOpenMPRuntime(CmdArgs, getToolChain(), Args);
|
||||
|
||||
if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nodefaultlibs)) {
|
||||
// We use arclite library for both ARC and subscripting support.
|
||||
@ -7347,6 +7355,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nodefaultlibs)) {
|
||||
addOpenMPRuntime(CmdArgs, ToolChain, Args);
|
||||
if (D.CCCIsCXX()) {
|
||||
ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
|
||||
if (Args.hasArg(options::OPT_pg))
|
||||
@ -7662,6 +7671,7 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nodefaultlibs)) {
|
||||
addOpenMPRuntime(CmdArgs, getToolChain(), Args);
|
||||
if (D.CCCIsCXX()) {
|
||||
getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
|
||||
CmdArgs.push_back("-lm");
|
||||
|
@ -2485,8 +2485,10 @@ bool MismatchingNewDeleteDetector::hasMatchingNewInCtor(
|
||||
MismatchingNewDeleteDetector::MismatchResult
|
||||
MismatchingNewDeleteDetector::analyzeInClassInitializer() {
|
||||
assert(Field != nullptr && "This should be called only for members");
|
||||
if (const CXXNewExpr *NE =
|
||||
getNewExprFromInitListOrExpr(Field->getInClassInitializer())) {
|
||||
const Expr *InitExpr = Field->getInClassInitializer();
|
||||
if (!InitExpr)
|
||||
return EndOfTU ? NoMismatch : AnalyzeLater;
|
||||
if (const CXXNewExpr *NE = getNewExprFromInitListOrExpr(InitExpr)) {
|
||||
if (NE->isArray() != IsArrayForm) {
|
||||
NewExprs.push_back(NE);
|
||||
return MemberInitMismatches;
|
||||
|
@ -1,4 +1,5 @@
|
||||
// RUN: %clang_cc1 -S -O3 -fno-builtin -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-w64-mingw32 -S -O3 -fno-builtin -o - %s | FileCheck %s
|
||||
// rdar://10551066
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
@ -1,6 +1,15 @@
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-NO-OPENMP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-apple-darwin -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-apple-darwin -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-NO-OPENMP
|
||||
// RUN: %clang -target x86_64-apple-darwin -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-freebsd -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-freebsd -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-NO-OPENMP
|
||||
// RUN: %clang -target x86_64-freebsd -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-NO-OPENMP
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CC1-OPENMP
|
||||
//
|
||||
// CHECK-CC1-OPENMP: "-cc1"
|
||||
// CHECK-CC1-OPENMP: "-fopenmp"
|
||||
@ -12,6 +21,30 @@
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5
|
||||
//
|
||||
// RUN: %clang -nostdlib -target x86_64-linux-gnu -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-OMP
|
||||
// RUN: %clang -nostdlib -target x86_64-linux-gnu -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-GOMP
|
||||
// RUN: %clang -nostdlib -target x86_64-linux-gnu -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-IOMP5
|
||||
//
|
||||
// RUN: %clang -target x86_64-darwin -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP
|
||||
// RUN: %clang -target x86_64-darwin -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP
|
||||
// RUN: %clang -target x86_64-darwin -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5
|
||||
//
|
||||
// RUN: %clang -nostdlib -target x86_64-darwin -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-OMP
|
||||
// RUN: %clang -nostdlib -target x86_64-darwin -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-GOMP
|
||||
// RUN: %clang -nostdlib -target x86_64-darwin -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-IOMP5
|
||||
//
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5
|
||||
//
|
||||
// RUN: %clang -nostdlib -target x86_64-freebsd -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-OMP
|
||||
// RUN: %clang -nostdlib -target x86_64-freebsd -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-GOMP
|
||||
// RUN: %clang -nostdlib -target x86_64-freebsd -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-IOMP5
|
||||
//
|
||||
// RUN: %clang -nostdlib -target x86_64-netbsd -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-OMP
|
||||
// RUN: %clang -nostdlib -target x86_64-netbsd -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-GOMP
|
||||
// RUN: %clang -nostdlib -target x86_64-netbsd -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-IOMP5
|
||||
//
|
||||
// CHECK-LD-OMP: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-LD-OMP: "-lomp"
|
||||
//
|
||||
@ -21,6 +54,15 @@
|
||||
// CHECK-LD-IOMP5: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-LD-IOMP5: "-liomp5"
|
||||
//
|
||||
// CHECK-NO-OMP: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-NO-OMP-NOT: "-lomp"
|
||||
//
|
||||
// CHECK-NO-GOMP: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-NO-GOMP-NOT: "-lgomp"
|
||||
//
|
||||
// CHECK-NO-IOMP5: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-NO-IOMP5-NOT: "-liomp5"
|
||||
//
|
||||
// We'd like to check that the default is sane, but until we have the ability
|
||||
// to *always* semantically analyze OpenMP without always generating runtime
|
||||
// calls (in the event of an unsupported runtime), we don't have a good way to
|
||||
@ -28,6 +70,9 @@
|
||||
// OpenMP runtime.
|
||||
//
|
||||
// RUN: %clang -target x86_64-linux-gnu -fopenmp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-ANY
|
||||
// RUN: %clang -target x86_64-darwin -fopenmp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-ANY
|
||||
// RUN: %clang -target x86_64-freebsd -fopenmp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-ANY
|
||||
// RUN: %clang -target x86_64-netbsd -fopenmp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-ANY
|
||||
//
|
||||
// CHECK-LD-ANY: "{{.*}}ld{{(.exe)?}}"
|
||||
// CHECK-LD-ANY: "-l{{(omp|gomp|iomp5)}}"
|
||||
|
4
test/Sema/attr-self-alias.c
Normal file
4
test/Sema/attr-self-alias.c
Normal file
@ -0,0 +1,4 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-pc-linux -fsyntax-only -verify -emit-llvm-only %s
|
||||
|
||||
int self_alias(void) __attribute__((weak, alias("self_alias"))); // expected-error {{alias definition is part of a cycle}}
|
||||
|
@ -120,6 +120,22 @@ void f() {
|
||||
DELETE(d); // expected-warning {{'delete' applied to a pointer that was allocated with 'new[]'; did you mean 'delete[]'?}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace MissingInitializer {
|
||||
template<typename T>
|
||||
struct Base {
|
||||
struct S {
|
||||
const T *p1 = nullptr;
|
||||
const T *p2 = new T[3];
|
||||
};
|
||||
};
|
||||
|
||||
void null_init(Base<double>::S s) {
|
||||
delete s.p1;
|
||||
delete s.p2;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef WITH_PCH
|
||||
pch_test::X::X()
|
||||
: a(new int[1]) // expected-note{{allocated with 'new[]' here}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user