Skip to content

Commit

Permalink
Fixed the bugs in Atomic directive
Browse files Browse the repository at this point in the history
But there is one reduce/shift conflict if we want to handle all commas
correctly
  • Loading branch information
XinyaoYI committed Mar 31, 2020
1 parent 6b224d1 commit 4a4b718
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 546 deletions.
2 changes: 1 addition & 1 deletion main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ int main( int argc, const char* argv[] ) {

// example of calling ompparser without test file or producing DOT file.
// setLang(Lang_C);
const char* input = "omp declare mapper(default:double a)";
const char* input = "omp atomic hint(abc),seq_cst,read";
OpenMPDirective* openMPAST = parseOpenMP(input, NULL);
output(openMPAST);

Expand Down
395 changes: 46 additions & 349 deletions src/OpenMPIR.cpp

Large diffs are not rendered by default.

83 changes: 0 additions & 83 deletions src/OpenMPIR.h
Original file line number Diff line number Diff line change
Expand Up @@ -656,89 +656,6 @@ class OpenMPIfClause : public OpenMPClause {

void generateDOT(std::ofstream&, int, int, std::string);
};
// hint Clause
class OpenMPHintClause : public OpenMPClause {
public:
OpenMPHintClause() :
OpenMPClause(OMPC_hint) { };

static OpenMPClause* addHintClause(OpenMPDirective *directive, int before_or_after);
};
// acq_rel Clause
class OpenMPAcqRelClause : public OpenMPClause {
public:
OpenMPAcqRelClause() :
OpenMPClause(OMPC_acq_rel) { };

static OpenMPClause* addAcqRelClause(OpenMPDirective *directive, int before_or_after);
};
// seq_cst Clause
class OpenMPSeqCstClause : public OpenMPClause {
public:
OpenMPSeqCstClause() :
OpenMPClause(OMPC_seq_cst) { };

static OpenMPClause* addSeqCstClause(OpenMPDirective *directive, int before_or_after);
};
// release Clause
class OpenMPReleaseClause : public OpenMPClause {
public:
OpenMPReleaseClause() :
OpenMPClause(OMPC_release) { };

static OpenMPClause* addReleaseClause(OpenMPDirective *directive, int before_or_after);
};
// acquire Clause
class OpenMPAcquireClause : public OpenMPClause {
public:
OpenMPAcquireClause() :
OpenMPClause(OMPC_acquire) { };

static OpenMPClause* addAcquireClause(OpenMPDirective *directive, int before_or_after);
};
// relaxed Clause
class OpenMPRelaxedClause : public OpenMPClause {
public:
OpenMPRelaxedClause() :
OpenMPClause(OMPC_relaxed) { };

static OpenMPClause* addRelaxedClause(OpenMPDirective *directive, int before_or_after);
};
// read Clause
class OpenMPReadClause : public OpenMPClause {
public:
OpenMPReadClause() :
OpenMPClause(OMPC_read) { };

static OpenMPClause* addReadClause(OpenMPDirective *directive);
};

// capture Clause
class OpenMPCaptureClause : public OpenMPClause {
public:
OpenMPCaptureClause() :
OpenMPClause(OMPC_capture) { };

static OpenMPClause* addCaptureClause(OpenMPDirective *directive);
};

// update Clause
class OpenMPUpdateClause : public OpenMPClause {
public:
OpenMPUpdateClause() :
OpenMPClause(OMPC_update) { };

static OpenMPClause* addUpdateClause(OpenMPDirective *directive);
};

// write Clause
class OpenMPWriteClause : public OpenMPClause {
public:
OpenMPWriteClause() :
OpenMPClause(OMPC_write) { };

static OpenMPClause* addWriteClause(OpenMPDirective *directive);
};
//in_reduction clause
class OpenMPInReductionClause : public OpenMPClause {

Expand Down
31 changes: 0 additions & 31 deletions src/OpenMPIRToString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,37 +158,6 @@ std::string OpenMPDirective::generatePragmaString(std::string prefix, std::strin
}
result = result.substr(0, result.size()-1);
}

if(this->getKind() == OMPD_atomic){
std::map<OpenMPClauseKind, std::vector<OpenMPClause*>* >* clauses_atomic_clauses = ((OpenMPAtomicDirective*)this)->getAllAtomicClauses();
if (clauses_atomic_clauses->size() != 0) {
result += " ";
std::map<OpenMPClauseKind, std::vector<OpenMPClause*>* >::iterator it;
for (it = clauses_atomic_clauses->begin(); it != clauses_atomic_clauses->end(); it++) {
std::vector<OpenMPClause*>* current_clauses = it->second;
std::vector<OpenMPClause*>::iterator clauseIter;
for (clauseIter = current_clauses->begin(); clauseIter != current_clauses->end(); clauseIter++) {
result += (*clauseIter)->toString();
}
}
result = result.substr(0, result.size()-1);
}

std::map<OpenMPClauseKind, std::vector<OpenMPClause*>* >* clauses_atomic_after = ((OpenMPAtomicDirective*)this)->getAllClausesAtomicAfter();

if (clauses_atomic_after->size() != 0) {
result += " ";
std::map<OpenMPClauseKind, std::vector<OpenMPClause*>* >::iterator it;
for (it = clauses_atomic_after->begin(); it != clauses_atomic_after->end(); it++) {
std::vector<OpenMPClause*>* current_clauses = it->second;
std::vector<OpenMPClause*>::iterator clauseIter;
for (clauseIter = current_clauses->begin(); clauseIter != current_clauses->end(); clauseIter++) {
result += (*clauseIter)->toString();
}
}
result = result.substr(0, result.size()-1);
}
}
result += ending_symbol;

return result;
Expand Down
97 changes: 35 additions & 62 deletions src/ompparser.yy
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ static const char* orig_str;
void * (*exprParse)(const char*) = NULL;

bool b_within_variable_list = false; // a flag to indicate if the program is now processing a list of variables
int atomic_before_or_after = 0;

/* used for language setting and detecting*/
OpenMPBaseLang user_set_lang = Lang_unknown;
Expand Down Expand Up @@ -629,62 +628,45 @@ flush_memory_order_clause : acq_rel_clause
| release_clause
| acquire_clause
;

atomic_directive : ATOMIC {
current_directive = new OpenMPAtomicDirective ();
}
atomic_clause_optseq
;
/*Do we need to care about the expression-stmt and the structure-stmt? Page235*/
atomic_clause_optseq : memory_order_clause_seq
| memory_order_clause_seq atomic_clause_seq
| memory_order_clause_seq ',' atomic_clause_seq
;

atomic_clause_optseq: /* empty */
| atomic_clause_seq_before
| atomic_clause_class
| atomic_clause_seq_before ',' atomic_clause_class
| atomic_clause_seq_before atomic_clause_class
;
atomic_clause_class : atomic_clause
| atomic_clause atomic_clause_seq_after
| atomic_clause ',' atomic_clause_seq_after
;
atomic_clause_seq_before : atomic_clause_seq_general_before
| atomic_clause_seq_before atomic_clause_seq_general_before
| atomic_clause_seq_before ',' atomic_clause_seq_general_before
;
atomic_clause_seq_after : atomic_clause_seq_general_after
| atomic_clause_seq_after atomic_clause_seq_general_after
| atomic_clause_seq_after ',' atomic_clause_seq_general_after
atomic_clause_seq : atomic_clause memory_order_clause_seq
| atomic_clause ',' memory_order_clause_seq
;

memory_order_clause_seq :
| memory_order_clause hint_clause
| hint_clause memory_order_clause
| hint_clause ',' memory_order_clause
| memory_order_clause ',' hint_clause
| memory_order_clause
| hint_clause
;
atomic_clause_seq_general_before : memory_order_clause_before
| hint_clause
;
atomic_clause_seq_general_after : memory_order_clause_after
| hint_clause_after
;
atomic_clause : read_clause
| write_clause
| update_clause
| capture_clause
;
memory_order_clause_before : seq_cst_clause
| acq_rel_clause
| release_clause
| acquire_clause
| relaxed_clause
;
memory_order_clause_after : seq_cst_clause_after
| acq_rel_clause_after
| release_clause_after
| acquire_clause_after
| relaxed_clause_after
;

hint_clause : HINT{ atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_hint, atomic_before_or_after);
} '(' expression ')'
;
hint_clause_after : HINT{ atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_hint, atomic_before_or_after);
} '(' expression ')'
;
memory_order_clause : seq_cst_clause
| acq_rel_clause
| release_clause
| acquire_clause
| relaxed_clause
;

hint_clause : HINT{ current_clause = current_directive->addOpenMPClause(OMPC_hint);
} '(' expression ')'
;
read_clause : READ { current_clause = current_directive->addOpenMPClause(OMPC_read);
}
;
Expand All @@ -694,32 +676,21 @@ write_clause : WRITE { current_clause = current_directive->addOpenMPClause(OMPC_
update_clause : UPDATE { current_clause = current_directive->addOpenMPClause(OMPC_update);
}
;
capture_clause : CAPTURE { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_capture);
capture_clause : CAPTURE { current_clause = current_directive->addOpenMPClause(OMPC_capture);
}
;

seq_cst_clause : SEQ_CST { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_seq_cst, atomic_before_or_after); }
seq_cst_clause : SEQ_CST { current_clause = current_directive->addOpenMPClause(OMPC_seq_cst); }
;
acq_rel_clause : ACQ_REL { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_acq_rel, atomic_before_or_after); }
acq_rel_clause : ACQ_REL { current_clause = current_directive->addOpenMPClause(OMPC_acq_rel); }
;
release_clause : RELEASE { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_release, atomic_before_or_after); }
release_clause : RELEASE { current_clause = current_directive->addOpenMPClause(OMPC_release); }
;
acquire_clause : ACQUIRE { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_acquire, atomic_before_or_after); }
acquire_clause : ACQUIRE { current_clause = current_directive->addOpenMPClause(OMPC_acquire); }
;
relaxed_clause : RELAXED { atomic_before_or_after = 0; current_clause = current_directive->addOpenMPClause(OMPC_relaxed, atomic_before_or_after); }
relaxed_clause : RELAXED { current_clause = current_directive->addOpenMPClause(OMPC_relaxed); }
;

seq_cst_clause_after : SEQ_CST { atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_seq_cst, atomic_before_or_after); }
;
acq_rel_clause_after : ACQ_REL { atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_acq_rel, atomic_before_or_after); }
;
release_clause_after : RELEASE { atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_release, atomic_before_or_after); }
;
acquire_clause_after : ACQUIRE { atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_acquire, atomic_before_or_after); }
;
relaxed_clause_after : RELAXED { atomic_before_or_after = 1; current_clause = current_directive->addOpenMPClause(OMPC_relaxed, atomic_before_or_after); }
;

taskwait_clause_optseq : /* empty */
| taskwait_clause_seq
;
Expand Down Expand Up @@ -2385,12 +2356,14 @@ single_paired_clause_optseq : /*empty*/
workshare_paired_clause_optseq : /*empty*/
| nowait_clause
;
cancel_clause_optseq : cancel_clause_seq
cancel_clause_optseq : /*empty*/
| cancel_clause_seq
;
//cancel_clause_fortran_optseq : /*empty*/
// | cancel_clause_fortran_seq
// ;
cancellation_point_clause_optseq : cancellation_point_clause_seq
cancellation_point_clause_optseq : /*empty*/
| cancellation_point_clause_seq
;
//cancellation_point_clause_fortran_optseq : /*empty*/
// | cancellation_point_clause_fortran_seq
Expand Down
29 changes: 18 additions & 11 deletions tests/atomic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
//One is starting with "omp", which is the input.
//The other one is starting with "PASS: ", which is the result for validation.

#pragma omp atomic hint(abc) seq_cst seq_cst read seq_cst
PASS: #pragma omp atomic seq_cst hint (abc) read seq_cst

#pragma omp atomic
PASS: #pragma omp atomic
Expand All @@ -17,21 +15,30 @@ PASS: #pragma omp atomic hint (abc)
#pragma omp atomic read
PASS: #pragma omp atomic read

#pragma omp atomic hint(abc) read
#pragma omp atomic seq_cst hint(abc) read
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic write hint(abc)
PASS: #pragma omp atomic write hint (abc)
#pragma omp atomic hint(abc) seq_cst read
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic write seq_cst
PASS: #pragma omp atomic write seq_cst
#pragma omp atomic hint(abc) read seq_cst
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic seq_cst read hint(abc)
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic read hint(abc) seq_cst
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic release hint(abc)
PASS: #pragma omp atomic release hint (abc)
#pragma omp atomic read seq_cst hint(abc)
PASS: #pragma omp atomic hint (abc) read

#pragma omp atomic write hint(abc)
PASS: #pragma omp atomic write hint (abc)

#pragma omp atomic release hint(abc) read acq_rel
PASS: #pragma omp atomic release hint (abc) read acq_rel
#pragma omp atomic write seq_cst
PASS: #pragma omp atomic write seq_cst


#pragma omp atomic release
PASS: #pragma omp atomic release
11 changes: 2 additions & 9 deletions tests/atomic_fortran.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
//One is starting with "omp", which is the input.
//The other one is starting with "PASS: ", which is the result for validation.

!$omp atomic hint(abc) seq_cst seq_cst read seq_cst
PASS: !$omp atomic seq_cst hint (abc) read seq_cst

!$omp atomic
PASS: !$omp atomic

Expand All @@ -27,12 +24,8 @@ PASS: !$omp atomic write hint (abc)
PASS: !$omp atomic write seq_cst


!$omp atomic release hint(abc)
PASS: !$omp atomic release hint (abc)


!$omp atomic release hint(abc) read acq_rel
PASS: !$omp atomic release hint (abc) read acq_rel
!$omp atomic release
PASS: !$omp atomic release

!$omp end atomic
PASS: !$omp end atomic
Expand Down

0 comments on commit 4a4b718

Please sign in to comment.