[HIPIFY] Pointer to typedef declaration is not hipified
Fix for https://github.com/GPUOpen-ProfessionalCompute-Tools/HIP/issues/60
Этот коммит содержится в:
1 родитель
f6aa3ddb0e
Коммит
3cd1adcb24
1 file changed
+50
-9
@@ -2018,6 +2018,34 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cudaTypedefVarPtr(const MatchFinder::MatchResult &Result) {
|
||||||
|
if (const VarDecl *typedefVarPtr = Result.Nodes.getNodeAs<VarDecl>("cudaTypedefVarPtr")) {
|
||||||
|
const Type *t = typedefVarPtr->getType().getTypePtrOrNull();
|
||||||
|
if (t) {
|
||||||
|
QualType QT = t->getPointeeType();
|
||||||
|
QT = QT.getUnqualifiedType();
|
||||||
|
StringRef name = QT.getAsString();
|
||||||
|
const auto found = N.cuda2hipRename.find(name);
|
||||||
|
if (found != N.cuda2hipRename.end()) {
|
||||||
|
updateCounters(found->second, name.str());
|
||||||
|
if (!found->second.unsupported) {
|
||||||
|
StringRef repName = found->second.hipName;
|
||||||
|
TypeLoc TL = typedefVarPtr->getTypeSourceInfo()->getTypeLoc();
|
||||||
|
SourceLocation sl = TL.getUnqualifiedLoc().getLocStart();
|
||||||
|
SourceManager *SM = Result.SourceManager;
|
||||||
|
Replacement Rep(*SM, sl, name.size(), repName);
|
||||||
|
Replace->insert(Rep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
llvm::outs() << "[HIPIFY] warning: the following reference is not handled: '" << name << "' [typedef var ptr].\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool cudaStructVar(const MatchFinder::MatchResult &Result) {
|
bool cudaStructVar(const MatchFinder::MatchResult &Result) {
|
||||||
if (const VarDecl *structVar = Result.Nodes.getNodeAs<VarDecl>("cudaStructVar")) {
|
if (const VarDecl *structVar = Result.Nodes.getNodeAs<VarDecl>("cudaStructVar")) {
|
||||||
StringRef name = structVar->getType()
|
StringRef name = structVar->getType()
|
||||||
@@ -2221,17 +2249,18 @@ public:
|
|||||||
void run(const MatchFinder::MatchResult &Result) override {
|
void run(const MatchFinder::MatchResult &Result) override {
|
||||||
do {
|
do {
|
||||||
if (cudaCall(Result)) break;
|
if (cudaCall(Result)) break;
|
||||||
if (cudaLaunchKernel(Result)) break;
|
|
||||||
if (cudaBuiltin(Result)) break;
|
if (cudaBuiltin(Result)) break;
|
||||||
if (cudaEnumConstantRef(Result)) break;
|
if (cudaEnumConstantRef(Result)) break;
|
||||||
if (cudaEnumConstantDecl(Result)) break;
|
if (cudaEnumConstantDecl(Result)) break;
|
||||||
if (cudaTypedefVar(Result)) break;
|
if (cudaTypedefVar(Result)) break;
|
||||||
|
if (cudaTypedefVarPtr(Result)) break;
|
||||||
if (cudaStructVar(Result)) break;
|
if (cudaStructVar(Result)) break;
|
||||||
if (cudaStructVarPtr(Result)) break;
|
if (cudaStructVarPtr(Result)) break;
|
||||||
if (cudaStructSizeOf(Result)) break;
|
if (cudaStructSizeOf(Result)) break;
|
||||||
if (cudaSharedIncompleteArrayVar(Result)) break;
|
|
||||||
if (cudaParamDecl(Result)) break;
|
if (cudaParamDecl(Result)) break;
|
||||||
if (cudaParamDeclPtr(Result)) break;
|
if (cudaParamDeclPtr(Result)) break;
|
||||||
|
if (cudaLaunchKernel(Result)) break;
|
||||||
|
if (cudaSharedIncompleteArrayVar(Result)) break;
|
||||||
if (stringLiteral(Result)) break;
|
if (stringLiteral(Result)) break;
|
||||||
if (unresolvedTemplateName(Result)) break;
|
if (unresolvedTemplateName(Result)) break;
|
||||||
break;
|
break;
|
||||||
@@ -2289,19 +2318,32 @@ void addAllMatchers(ast_matchers::MatchFinder &Finder, Cuda2HipCallback *Callbac
|
|||||||
hasType(typedefDecl(matchesName("cu.*|CU.*"))))
|
hasType(typedefDecl(matchesName("cu.*|CU.*"))))
|
||||||
.bind("cudaTypedefVar"),
|
.bind("cudaTypedefVar"),
|
||||||
Callback);
|
Callback);
|
||||||
// Array of elements of typedef type, Example: cudaStream_t streams[2];
|
// Array of elements of typedef type. Example:
|
||||||
|
// cudaStream_t streams[2];
|
||||||
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
||||||
hasType(arrayType(hasElementType(typedefType(
|
hasType(arrayType(hasElementType(typedefType(
|
||||||
hasDeclaration(typedefDecl(matchesName("cu.*|CU.*"))))))))
|
hasDeclaration(typedefDecl(matchesName("cu.*|CU.*"))))))))
|
||||||
.bind("cudaTypedefVar"),
|
.bind("cudaTypedefVar"),
|
||||||
Callback);
|
Callback);
|
||||||
|
// Pointer to typedef type. Examples:
|
||||||
|
// 1.
|
||||||
|
// cudaEvent_t *event = NULL;
|
||||||
|
// typedef __device_builtin__ struct CUevent_st *cudaEvent_t;
|
||||||
|
// 2.
|
||||||
|
// CUevent *event = NULL;
|
||||||
|
// typedef struct CUevent_st *CUevent;
|
||||||
|
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
||||||
|
hasType(pointsTo(typedefDecl(
|
||||||
|
matchesName("cu.*|CU.*")))))
|
||||||
|
.bind("cudaTypedefVarPtr"),
|
||||||
|
Callback);
|
||||||
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
||||||
hasType(cxxRecordDecl(matchesName("cu.*|CU.*"))))
|
hasType(cxxRecordDecl(matchesName("cu.*|CU.*"))))
|
||||||
.bind("cudaStructVar"),
|
.bind("cudaStructVar"),
|
||||||
Callback);
|
Callback);
|
||||||
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
Finder.addMatcher(varDecl(isExpansionInMainFile(),
|
||||||
hasType(pointsTo(cxxRecordDecl(
|
hasType(pointsTo(cxxRecordDecl(
|
||||||
matchesName("cu.*|CU.*")))))
|
matchesName("cu.*|CU.*")))))
|
||||||
.bind("cudaStructVarPtr"),
|
.bind("cudaStructVarPtr"),
|
||||||
Callback);
|
Callback);
|
||||||
Finder.addMatcher(parmVarDecl(isExpansionInMainFile(),
|
Finder.addMatcher(parmVarDecl(isExpansionInMainFile(),
|
||||||
@@ -2310,12 +2352,12 @@ void addAllMatchers(ast_matchers::MatchFinder &Finder, Cuda2HipCallback *Callbac
|
|||||||
Callback);
|
Callback);
|
||||||
Finder.addMatcher(parmVarDecl(isExpansionInMainFile(),
|
Finder.addMatcher(parmVarDecl(isExpansionInMainFile(),
|
||||||
hasType(pointsTo(namedDecl(
|
hasType(pointsTo(namedDecl(
|
||||||
matchesName("cu.*|CU.*")))))
|
matchesName("cu.*|CU.*")))))
|
||||||
.bind("cudaParamDeclPtr"),
|
.bind("cudaParamDeclPtr"),
|
||||||
Callback);
|
Callback);
|
||||||
Finder.addMatcher(expr(isExpansionInMainFile(),
|
Finder.addMatcher(expr(isExpansionInMainFile(),
|
||||||
sizeOfExpr(hasArgumentOfType(recordType(hasDeclaration(
|
sizeOfExpr(hasArgumentOfType(
|
||||||
cxxRecordDecl(matchesName("cu.*|CU.*")))))))
|
recordType(hasDeclaration(cxxRecordDecl(matchesName("cu.*|CU.*")))))))
|
||||||
.bind("cudaStructSizeOf"),
|
.bind("cudaStructSizeOf"),
|
||||||
Callback);
|
Callback);
|
||||||
Finder.addMatcher(stringLiteral(isExpansionInMainFile()).bind("stringLiteral"),
|
Finder.addMatcher(stringLiteral(isExpansionInMainFile()).bind("stringLiteral"),
|
||||||
@@ -2615,8 +2657,7 @@ int main(int argc, const char **argv) {
|
|||||||
LangOptions DefaultLangOptions;
|
LangOptions DefaultLangOptions;
|
||||||
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
|
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
|
||||||
TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts);
|
TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts);
|
||||||
DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
|
DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts, &DiagnosticPrinter, false);
|
||||||
&DiagnosticPrinter, false);
|
|
||||||
|
|
||||||
uint64_t repBytes = 0;
|
uint64_t repBytes = 0;
|
||||||
uint64_t bytes = 0;
|
uint64_t bytes = 0;
|
||||||
|
|||||||
Reference in new issue
Block a user