blob: d2d32bbd9403c44003cb278df7fea3fd50a3bbc7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include "TargetInfo.h"
#include "ABIInfo.h"
using namespace clang;
using namespace clang::CIRGen;
bool clang::CIRGen::isEmptyRecordForLayout(const ASTContext &context,
QualType t) {
const RecordType *rt = t->getAs<RecordType>();
if (!rt)
return false;
const RecordDecl *rd = rt->getDecl();
// If this is a C++ record, check the bases first.
if (const CXXRecordDecl *cxxrd = dyn_cast<CXXRecordDecl>(rd)) {
if (cxxrd->isDynamicClass())
return false;
for (const auto &I : cxxrd->bases())
if (!isEmptyRecordForLayout(context, I.getType()))
return false;
}
for (const auto *I : rd->fields())
if (!isEmptyFieldForLayout(context, I))
return false;
return true;
}
bool clang::CIRGen::isEmptyFieldForLayout(const ASTContext &context,
const FieldDecl *fd) {
if (fd->isZeroLengthBitField())
return true;
if (fd->isUnnamedBitField())
return false;
return isEmptyRecordForLayout(context, fd->getType());
}
namespace {
class X8664ABIInfo : public ABIInfo {
public:
X8664ABIInfo(CIRGenTypes &cgt) : ABIInfo(cgt) {}
};
class X8664TargetCIRGenInfo : public TargetCIRGenInfo {
public:
X8664TargetCIRGenInfo(CIRGenTypes &cgt)
: TargetCIRGenInfo(std::make_unique<X8664ABIInfo>(cgt)) {}
};
} // namespace
std::unique_ptr<TargetCIRGenInfo>
clang::CIRGen::createX8664TargetCIRGenInfo(CIRGenTypes &cgt) {
return std::make_unique<X8664TargetCIRGenInfo>(cgt);
}
ABIInfo::~ABIInfo() noexcept = default;
bool TargetCIRGenInfo::isNoProtoCallVariadic(
const FunctionNoProtoType *fnType) const {
// The following conventions are known to require this to be false:
// x86_stdcall
// MIPS
// For everything else, we just prefer false unless we opt out.
return false;
}
|