Skip to content

Commit 30fca0a

Browse files
committed
Fix problems with some complex macros
When two decls get generated by the same macro, TargetCode compared the spelling location of their generated source fragments and not their expanded location. This resulted in TargetCode not adding more than once function generated from a macro.
1 parent 887b013 commit 30fca0a

File tree

6 files changed

+31
-6
lines changed

6 files changed

+31
-6
lines changed

clang/tools/sotoc/src/Debug.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extern int SotocDebugLevel;
2323
#define DEBUGP(...) \
2424
do { \
2525
if (SotocDebugLevel > 0) { \
26-
llvm::errs() << "Sotoc: " << llvm::formatv(__VA_ARGS__); \
26+
llvm::errs() << "Sotoc: " << __VA_ARGS__; \
2727
llvm::errs() << "\n"; \
2828
} \
2929
} while (false)

clang/tools/sotoc/src/DeclResolver.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ void DeclResolver::addDecl(clang::Decl *D) {
6565
return;
6666
}
6767

68+
DEBUGPDECL(D, "Add declaration to resolver: ");
69+
6870
std::unordered_set<clang::Decl *> UnresolvedDecls;
6971
UnresolvedDecls.insert(D);
7072

@@ -161,9 +163,11 @@ void DeclResolver::orderAndAddFragments(TargetCode &TC) {
161163
if (!AllDecls.at(orderStack.top()).IsFromSystemHeader) {
162164
auto codeDecl = std::make_shared<TargetCodeDecl>(orderStack.top());
163165

166+
DEBUGPDECL(orderStack.top(), "Generating Fragment for Decl: ");
164167
// TODO: this wont hurt but is not always necessary
165168
codeDecl->NeedsSemicolon = true;
166-
TC.addCodeFragmentFront(codeDecl);
169+
bool added = TC.addCodeFragmentFront(codeDecl);
170+
DEBUGP("Decl was a duplicate: " << !added);
167171
}
168172
orderStack.pop();
169173
}

clang/tools/sotoc/src/TargetCode.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void TargetCode::generateCode(llvm::raw_ostream &Out) {
7575

7676
// This is a workaround, since "Decl::print" includes "pragma omp declare".
7777
if (PrettyCode != "")
78-
TargetCodeRewriter.ReplaceText(Frag->getInnerRange(), PrettyCode);
78+
TargetCodeRewriter.ReplaceText(Frag->getSpellingRange(), PrettyCode);
7979

8080
if (TCR) {
8181
generateFunctionPrologue(TCR);
@@ -85,7 +85,7 @@ void TargetCode::generateCode(llvm::raw_ostream &Out) {
8585
generateFunctionEpilogue(TCR);
8686
}
8787
Out << "\n";
88-
Out << TargetCodeRewriter.getRewrittenText(Frag->getInnerRange());
88+
Out << TargetCodeRewriter.getRewrittenText(Frag->getSpellingRange());
8989

9090
if (Frag->NeedsSemicolon) {
9191
Out << ";";

clang/tools/sotoc/src/TargetCodeFragment.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,13 @@ clang::SourceRange TargetCodeRegion::getRealRange() {
156156
return CapturedStmtNode->getSourceRange();
157157
}
158158

159+
clang::SourceRange TargetCodeRegion::getSpellingRange() {
160+
auto &SM = CapturedStmtNode->getCapturedDecl()->getASTContext().getSourceManager();
161+
auto InnerRange = getInnerRange();
162+
return clang::SourceRange(SM.getSpellingLoc(InnerRange.getBegin()),
163+
SM.getSpellingLoc(InnerRange.getEnd()));
164+
}
165+
159166
clang::SourceRange TargetCodeRegion::getInnerRange() {
160167
auto InnerLocStart = getStartLoc();
161168
auto InnerLocEnd = getEndLoc();
@@ -428,9 +435,17 @@ std::string TargetCodeRegion::PrintPretty() {
428435
clang::SourceRange TargetCodeDecl::getRealRange() {
429436
// return DeclNode->getSourceRange();
430437
// return DeclNode->getSourceRange();
438+
//auto &SM = DeclNode->getASTContext().getSourceManager();
439+
//return clang::SourceRange(SM.getSpellingLoc(DeclNode->getBeginLoc()),
440+
// SM.getSpellingLoc(DeclNode->getEndLoc()));
441+
return DeclNode->getSourceRange();
442+
}
443+
444+
clang::SourceRange TargetCodeDecl::getSpellingRange() {
431445
auto &SM = DeclNode->getASTContext().getSourceManager();
432-
return clang::SourceRange(SM.getSpellingLoc(DeclNode->getBeginLoc()),
433-
SM.getSpellingLoc(DeclNode->getEndLoc()));
446+
auto InnerRange = getInnerRange();
447+
return clang::SourceRange(SM.getSpellingLoc(InnerRange.getBegin()),
448+
SM.getSpellingLoc(InnerRange.getEnd()));
434449
}
435450

436451
std::string TargetCodeDecl::PrintPretty() {

clang/tools/sotoc/src/TargetCodeFragment.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class TargetCodeFragment {
8383
/// Gets the 'inner' source range. This can differ for target regions from the
8484
/// source range.
8585
virtual clang::SourceRange getInnerRange() { return getRealRange(); };
86+
/// Get the spelling source range. That is the range without macro
87+
/// expansions.
88+
virtual clang::SourceRange getSpellingRange() = 0;
8689
/// Accessor to TargetCodeKind
8790
clang::OpenMPDirectiveKind getTargetCodeKind() { return TargetCodeKind; };
8891
};
@@ -140,6 +143,7 @@ class TargetCodeRegion : public TargetCodeFragment {
140143
virtual std::string PrintPretty() override;
141144
clang::SourceRange getRealRange() override;
142145
clang::SourceRange getInnerRange() override;
146+
clang::SourceRange getSpellingRange() override;
143147
/// Returns a source location at the start of a pragma in the captured
144148
/// statment.
145149
clang::SourceLocation getStartLoc();
@@ -174,4 +178,5 @@ class TargetCodeDecl : public TargetCodeFragment {
174178

175179
virtual std::string PrintPretty() override;
176180
clang::SourceRange getRealRange() override;
181+
clang::SourceRange getSpellingRange() override;
177182
};

clang/tools/sotoc/src/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class SourceTransformAction : public clang::ASTFrontendAction {
7272
// std::error_code error_code;
7373
// llvm::raw_fd_ostream outFile("output.txt", error_code,
7474
// llvm::sys::fs::F_Append);
75+
DEBUGP("Generating Code§");
7576
Code->generateCode(llvm::outs());
7677
// outFile.close();
7778
delete Code;

0 commit comments

Comments
 (0)