void check_for_OMP_pragma(expr x) { if(OMP_do_required){ if (EXPR_CODE(x) == XMP_PRAGMA && EXPR_INT(EXPR_ARG1(x)) == XMP_LOOP) return; if(EXPR_CODE(x) != F_DO_STATEMENT) error("OpenMP DO directives must be followed by do statement"); OMP_do_required = FALSE; return; } if(OMP_st_required != OMP_ST_NONE){ if(EXPR_CODE(x) != F_LET_STATEMENT) error("OpenMP ATOMIC directives must be followed by assignment"); return; } /* check DO directive, close it */ if(CTL_TYPE(ctl_top) == CTL_OMP && (CTL_OMP_ARG_DIR(ctl_top) == OMP_F_DO || CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL_DO)){ if(CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL_DO){ CTL_BLOCK(ctl_top) = OMP_pragma_list(OMP_PARALLEL,CTL_OMP_ARG_PCLAUSE(ctl_top), OMP_FOR_pragma_list( CTL_OMP_ARG_DCLAUSE(ctl_top), CURRENT_STATEMENTS)); } else { CTL_BLOCK(ctl_top) = OMP_FOR_pragma_list(CTL_OMP_ARG_DCLAUSE(ctl_top), CURRENT_STATEMENTS); } EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); pop_ctl(); } }
static int do_sysctl_op(int fd, struct sysctl_req *req, int op) { int ret = -1, nr = 1; switch (CTL_TYPE(req->type)) { case __CTL_U32A: nr = CTL_LEN(req->type); /* fallthrough */ case CTL_U32: __SYSCTL_OP(ret, fd, req, u32, nr, op); break; case CTL_32: __SYSCTL_OP(ret, fd, req, s32, nr, op); break; case __CTL_U64A: nr = CTL_LEN(req->type); /* fallthrough */ case CTL_U64: __SYSCTL_OP(ret, fd, req, u64, nr, op); break; case __CTL_STR: nr = CTL_LEN(req->type); __SYSCTL_OP(ret, fd, req, char, nr, op); break; } return ret; }
static int __sysctl_op(int dir, struct sysctl_req *req, int op) { int fd = -1; int ret = -1; int nr = 1; if (dir >= 0) { int flags; if (op == CTL_READ) flags = O_RDONLY; else flags = O_WRONLY; fd = openat(dir, req->name, flags); if (fd < 0) { pr_perror("Can't open sysctl %s", req->name); return -1; } } switch (CTL_TYPE(req->type)) { case __CTL_U32A: nr = CTL_LEN(req->type); case CTL_U32: __SYSCTL_OP(ret, fd, req, u32, nr, op); break; case __CTL_U64A: nr = CTL_LEN(req->type); case CTL_U64: __SYSCTL_OP(ret, fd, req, u64, nr, op); break; case __CTL_STR: nr = CTL_LEN(req->type); __SYSCTL_OP(ret, fd, req, char, nr, op); break; } close_safe(&fd); return ret; }
static int sysctl_userns_arg_size(int type) { switch(CTL_TYPE(type)) { case __CTL_U32A: return sizeof(u32) * CTL_LEN(type); case CTL_U32: return sizeof(u32); case CTL_32: return sizeof(s32); case __CTL_U64A: return sizeof(u64) * CTL_LEN(type); case CTL_U64: return sizeof(u64); case __CTL_STR: return sizeof(char) * CTL_LEN(type) + 1; default: pr_err("unknown arg type %d\n", type); /* Ensure overflow to cause an error */ return MAX_UNSFD_MSG_SIZE; } }
void compile_OMP_directive(expr x) { expr dir; expr c = NULL; expv pclause,dclause; if(x == NULL) return; /* error */ if (debug_flag) { fprintf(stderr, "OMP_directive:\n"); expv_output(x, stderr); fprintf(stderr, "\n"); } check_for_OMP_pragma(x); check_for_XMP_pragma(-1, x); if(OMP_do_required){ error("OpenMP DO directived must be followed by do statement"); OMP_do_required = FALSE; return; } if(OMP_st_required != OMP_ST_NONE){ error("OpenMP ATOMIC directives must be followed by assignment"); return; } dir = EXPR_ARG1(x); if (EXPR_INT(dir) == OMP_F_THREADPRIVATE) { check_INDCL(); } else { check_INEXEC(); } if (EXPR_INT(dir) != OMP_F_END_DO && EXPR_INT(dir) != OMP_F_END_PARALLEL_DO && EXPR_INT(dir) != OMP_F_ATOMIC) { check_for_OMP_pragma(NULL); /* close DO directives if any */ } switch(EXPR_INT(dir)){ case OMP_F_PARALLEL: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_PARALLEL,TRUE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; return; case OMP_F_END_PARALLEL: if(CTL_TYPE(ctl_top) == CTL_OMP && CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL){ CTL_BLOCK(ctl_top) = OMP_pragma_list(OMP_PARALLEL,CTL_OMP_ARG_PCLAUSE(ctl_top), CURRENT_STATEMENTS); EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); pop_ctl(); } else error("OpenMP PARALLEL block is not closed"); return; case OMP_F_PARALLEL_DO: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_FOR,TRUE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; OMP_do_required = TRUE; return; case OMP_F_END_PARALLEL_DO: /* if(CTL_TYPE(ctl_top) == CTL_OMP && */ /* CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL_DO){ */ /* CTL_BLOCK(ctl_top) = */ /* OMP_pragma_list(OMP_PARALLEL,CTL_OMP_ARG_PCLAUSE(ctl_top), */ /* OMP_FOR_pragma_list( */ /* CTL_OMP_ARG_DCLAUSE(ctl_top), */ /* CURRENT_STATEMENTS)); */ /* EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); */ /* pop_ctl(); */ /* } else error("OpenMP PARALLEL DO block is not closed"); */ return; case OMP_F_DO: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_FOR,FALSE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; OMP_do_required = TRUE; return; case OMP_F_END_DO: /* OMP_F_DO has been already closed at F_ENDDO */ /* Here, only the nowait clause is handled. */ if (ctl_top_saved){ dclause = CTL_OMP_ARG_DCLAUSE(ctl_top_saved); if (EXPR_ARG2(x) != NULL) list_put_last(dclause, EXPR_ARG2(x)); CTL_BLOCK(ctl_top_saved) = OMP_FOR_pragma_list(dclause, CURRENT_STATEMENTS_saved); EXPR_LINE(CTL_BLOCK(ctl_top_saved)) = EXPR_LINE(CTL_OMP_ARG(ctl_top_saved)); ctl_top_saved = NULL; } /* if(CTL_TYPE(ctl_top) == CTL_OMP && */ /* CTL_OMP_ARG_DIR(ctl_top) == OMP_F_DO){ */ /* dclause = CTL_OMP_ARG_DCLAUSE(ctl_top); */ /* if(EXPR_ARG2(x) != NULL) list_put_last(dclause,EXPR_ARG2(x)); */ /* CTL_BLOCK(ctl_top) = */ /* OMP_FOR_pragma_list(dclause,CURRENT_STATEMENTS); */ /* EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); */ /* pop_ctl(); */ /* } else error("OpenMP DO block is not closed"); */ return; case OMP_F_PARALLEL_SECTIONS: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_SECTIONS,TRUE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; return; case OMP_F_END_PARALLEL_SECTIONS: if(CTL_TYPE(ctl_top) == CTL_OMP && CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL_SECTIONS){ CURRENT_STATEMENTS = OMP_check_SECTION(CURRENT_STATEMENTS); CTL_BLOCK(ctl_top) = OMP_pragma_list(OMP_PARALLEL,CTL_OMP_ARG_PCLAUSE(ctl_top), OMP_pragma_list(OMP_SECTIONS, CTL_OMP_ARG_DCLAUSE(ctl_top), CURRENT_STATEMENTS)); EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); pop_ctl(); } else error("OpenMP PARALLEL SECTIONS block is not closed"); return; case OMP_F_SECTIONS: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_SECTIONS,FALSE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; return; case OMP_F_END_SECTIONS: if(CTL_TYPE(ctl_top) == CTL_OMP && CTL_OMP_ARG_DIR(ctl_top) == OMP_F_SECTIONS){ CURRENT_STATEMENTS = OMP_check_SECTION(CURRENT_STATEMENTS); dclause = CTL_OMP_ARG_DCLAUSE(ctl_top); if(EXPR_ARG2(x) != NULL) list_put_last(dclause,EXPR_ARG2(x)); CTL_BLOCK(ctl_top) = OMP_pragma_list(OMP_SECTIONS,dclause,CURRENT_STATEMENTS); EXPR_LINE(CTL_BLOCK(ctl_top)) = EXPR_LINE(CTL_OMP_ARG(ctl_top)); pop_ctl(); } else error("OpenMP SECTIONS block is not closed"); return; case OMP_F_SECTION: if(CTL_TYPE(ctl_top) == CTL_OMP && (CTL_OMP_ARG_DIR(ctl_top) == OMP_F_SECTIONS || CTL_OMP_ARG_DIR(ctl_top) == OMP_F_PARALLEL_SECTIONS)){ output_statement(OMP_pragma_list(OMP_SECTION,NULL,NULL)); } else error("OpenMP SECTION appears outside SECTOINS"); return; case OMP_F_SINGLE: push_ctl(CTL_OMP); compile_OMP_pragma_clause(EXPR_ARG2(x),OMP_SINGLE,FALSE, &pclause,&dclause); CTL_OMP_ARG(ctl_top) = list3(LIST,dir,pclause,dclause); EXPR_LINE(CTL_OMP_ARG(ctl_top)) = current_line; return; case OMP_F_END_SINGLE: if(CTL_TYPE(ctl_top) == CTL_OMP && CTL_OMP_ARG_DIR(ctl_top) == OMP_F_SINGLE){ dclause = CTL_OMP_ARG_DCLAUSE(ctl_top); //if(EXPR_ARG2(x) != NULL) list_put_last(dclause,EXPR_ARG2(x)); if (EXPR_ARG2(x) != NULL){ list lp; FOR_ITEMS_IN_LIST(lp, EXPR_ARG2(x)){ list_put_last(dclause, LIST_ITEM(lp)); } }