Skip to content
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

Initial support for compiler attribute statements #729

Merged
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
10 changes: 5 additions & 5 deletions src/occa/internal/lang/builtins/types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ namespace occa {
const qualifier_t volatile_ ("volatile" , qualifierType::volatile_);
const qualifier_t long_ ("long" , qualifierType::long_);
const qualifier_t longlong_ ("long long" , qualifierType::longlong_);
const qualifier_t attribute_ ("__attribute__" , qualifierType::attribute_);

// Windows types
const qualifier_t declspec_ ("__declspec" , qualifierType::declspec_);

const qualifier_t extern_ ("extern" , qualifierType::extern_);
const qualifier_t externC ("extern \"C\"" , qualifierType::externC);
Expand All @@ -29,10 +33,6 @@ namespace occa {
const qualifier_t struct_ ("struct" , qualifierType::struct_);
const qualifier_t union_ ("union" , qualifierType::union_);

// Windows types
// TODO: Properly handle compiler extension attributes
const qualifier_t dllexport_ ("__declspec(dllexport)", qualifierType::dllexport_);

const primitive_t bool_ ("bool");
const primitive_t char_ ("char");
const primitive_t char16_t_ ("char16_t");
Expand Down Expand Up @@ -89,6 +89,6 @@ namespace occa {
const primitive_t double2 ("double2");
const primitive_t double3 ("double3");
const primitive_t double4 ("double4");

} // namespace lang
}
11 changes: 6 additions & 5 deletions src/occa/internal/lang/builtins/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ namespace occa {
extern const qualifier_t volatile_;
extern const qualifier_t long_;
extern const qualifier_t longlong_;
extern const qualifier_t attribute_;

// Windows types
// TODO: Properly handle compiler extension attributes
extern const qualifier_t declspec_;

extern const qualifier_t extern_;
extern const qualifier_t externC;
Expand All @@ -32,10 +37,6 @@ namespace occa {
extern const qualifier_t struct_;
extern const qualifier_t union_;

// Windows types
// TODO: Properly handle compiler extension attributes
extern const qualifier_t dllexport_;

extern const primitive_t bool_;
extern const primitive_t char_;
extern const primitive_t char16_t_;
Expand Down Expand Up @@ -92,7 +93,7 @@ namespace occa {
extern const primitive_t double2;
extern const primitive_t double3;
extern const primitive_t double4;

// DPCPP Primitives
extern const primitive_t syclQueue;
extern const primitive_t syclNdRange;
Expand Down
2 changes: 2 additions & 0 deletions src/occa/internal/lang/keyword.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,8 @@ namespace occa {
keywords.add(*(new qualifierKeyword(volatile_)));
keywords.add(*(new qualifierKeyword(long_)));
keywords.add(*(new qualifierKeyword(longlong_)));
keywords.add(*(new qualifierKeyword(attribute_)));
keywords.add(*(new qualifierKeyword(declspec_)));

keywords.add(*(new qualifierKeyword(extern_)));
keywords.add(*(new qualifierKeyword(externC)));
Expand Down
89 changes: 64 additions & 25 deletions src/occa/internal/lang/loaders/typeLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,18 @@
return true;
}

const int tokenCount = tokenContext.size();
int tokenPos;

for (tokenPos = 0; tokenPos < tokenCount; ++tokenPos) {
token_t *token = tokenContext[tokenPos];
if (!tokenContext.size()) {
tokenContext.printError("Unable to load type");
return false;

Check warning on line 53 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L52-L53

Added lines #L52 - L53 were not covered by tests
}

if (token->type() & tokenType::comment) {
while (tokenContext.size()) {
if (tokenContext[0]->type() & tokenType::comment) {
++tokenContext;

Check warning on line 58 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L58

Added line #L58 was not covered by tests
continue;
}

keyword_t &keyword = parser.keywords.get(smntContext, token);
keyword_t &keyword = parser.keywords.get(smntContext, tokenContext[0]);
const int kType = keyword.type();
if (kType & keywordType::none) {
break;
Expand All @@ -69,39 +70,35 @@
type_t *type = NULL;
if (qualifier == class_) {
// TODO: type = loadClass();
token->printError("Classes are not supported yet");
tokenContext[0]->printError("Classes are not supported yet");

Check warning on line 73 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L73

Added line #L73 was not covered by tests
success = false;
}
if (!success) {
return false;
}

if (!type) {
loadVartypeQualifier(token,
keyword.to<qualifierKeyword>().qualifier,
vartype);
loadVartypeQualifier(qualifier, vartype);
} else {
vartype.type = type;
vartype.typeToken = (identifierToken*) type->source->clone();
}
if (!success) {
return false;
}
continue;
}
if ((kType & keywordType::type) &&
!vartype.isValid()) {
vartype.type = &(keyword.to<typeKeyword>().type_);
vartype.typeToken = (identifierToken*) token->clone();
vartype.typeToken = (identifierToken*) tokenContext[0]->clone();
++tokenContext;
continue;
}

break;
}

if (tokenPos) {
tokenContext += tokenPos;
} else {
tokenContext.printError("Unable to load type");
return false;
}

if (vartype.isValid()) {
return true;
}
Expand All @@ -127,9 +124,11 @@
return false;
}

void typeLoader_t::loadVartypeQualifier(token_t *token,
const qualifier_t &qualifier,
void typeLoader_t::loadVartypeQualifier(const qualifier_t &qualifier,
vartype_t &vartype) {
token_t *token = tokenContext[0];
++tokenContext;

// Handle long/long long case
if (&qualifier == &long_) {
if (vartype.has(long_)) {
Expand All @@ -148,13 +147,53 @@
return;
}

// Non-long qualifiers
if (!vartype.has(qualifier)) {
// qualifier takes arguments
if (token_t::safeOperatorType(tokenContext[0]) & operatorType::parenthesesStart) {
tokenContext.pushPairRange();

Check warning on line 152 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L152

Added line #L152 was not covered by tests

exprNodeVector args;
tokenRangeVector argRanges;
getArgumentRanges(tokenContext, argRanges);

Check warning on line 156 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L156

Added line #L156 was not covered by tests

const int argCount = (int) argRanges.size();

Check warning on line 158 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L158

Added line #L158 was not covered by tests

for (int i = 0; i < argCount; ++i) {
tokenContext.push(argRanges[i].start,
argRanges[i].end);

Check warning on line 162 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L160-L162

Added lines #L160 - L162 were not covered by tests

if (!tokenContext.size()) {
args.push_back(new emptyNode());
tokenContext.popAndSkip();
continue;

Check warning on line 167 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L164-L167

Added lines #L164 - L167 were not covered by tests
}

args.push_back(tokenContext.parseExpression(smntContext, parser));

Check warning on line 170 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L170

Added line #L170 was not covered by tests

if (!success) {
freeExprNodeVector(args);

Check warning on line 173 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L172-L173

Added lines #L172 - L173 were not covered by tests
return;
}

tokenContext.popAndSkip();

Check warning on line 177 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L177

Added line #L177 was not covered by tests
}

vartype.add(token->origin,
qualifier);
qualifier,
args);

freeExprNodeVector(args);
tokenContext.popAndSkip();

Check warning on line 185 in src/occa/internal/lang/loaders/typeLoader.cpp

View check run for this annotation

Codecov / codecov/patch

src/occa/internal/lang/loaders/typeLoader.cpp#L184-L185

Added lines #L184 - L185 were not covered by tests

} else {
token->printWarning("Ignoring duplicate qualifier");
// Non-long qualifiers
if (!vartype.has(qualifier)) {
vartype.add(token->origin,
qualifier);
} else {
token->printWarning("Ignoring duplicate qualifier");
}
}

}

void typeLoader_t::setVartypePointers(vartype_t &vartype) {
Expand Down
3 changes: 1 addition & 2 deletions src/occa/internal/lang/loaders/typeLoader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ namespace occa {

bool loadType(vartype_t &vartype);

void loadVartypeQualifier(token_t *token,
const qualifier_t &qualifier,
void loadVartypeQualifier(const qualifier_t &qualifier,
vartype_t &vartype);

void setVartypePointers(vartype_t &vartype);
Expand Down
2 changes: 1 addition & 1 deletion src/occa/internal/lang/modes/okl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ namespace occa {
bool kernelHasValidReturnType(functionDeclStatement &kernelSmnt) {
vartype_t &returnType = kernelSmnt.function().returnType;

if (returnType.qualifiers.size() || (*returnType.type != void_)) {
if (*returnType.type != void_) {
returnType.printError(
"[@kernel] functions must have a [void] return type"
);
Expand Down
Loading