[LLVMdev] [cfe-dev] OpenMP support in CLANG: A proposal

Mahesha HS mahesha.llvm at gmail.com
Wed Oct 10 06:15:26 PDT 2012


Hi Eli and Others

In response to your feedback, I have taken care of all your review comments
- I removed clangOMP.a
and moved the implementation of "class OmpPragmaHandler" to "clangLex.a".

The attached zipped file - namely - 'OpenMP_support_in_Clang.tar.gz'
contains all the implemented
"patches" along with *newly* added source files.

Another attached text file - namely - 'OpenMP_support_in_Clang_Read_Me.txt'
briefly describes the
implementation.

You can also refer to the initial proposal document - namely -
'OpenMP_Support_in_Clang.pdf'.

Looking forward for your review comments.

--
mahesha






On Wed, Oct 10, 2012 at 10:30 AM, Mahesha HS <mahesha.llvm at gmail.com> wrote:

>
>
> On Wed, Oct 10, 2012 at 5:40 AM, Eli Friedman <eli.friedman at gmail.com>wrote:
>
>> On Tue, Oct 9, 2012 at 4:37 AM, Mahesha HS <mahesha.llvm at gmail.com>
>> wrote:
>> > Hello All,
>> >
>> > We would like to make a proposal to support OpenMP in CLANG. The goal of
>> > this effort is to provide support for syntax
>> >
>> > analysis (parsing), semantic analysis and AST implementation for OpenMP
>> > constructs in CLANG.
>> >
>> >
>> >
>> > We would like to defer the design for *lowering* based on the outcome
>> of the
>> > discussion happening in the LLVM dev list.
>> >
>> > Our design is aimed at implementing the necessary support in CLANG
>> > irrespective of how it is finally *lowered*.
>> >
>> >
>> >
>> > Please find the details of the proposal and the current status in the
>> > document attached.
>>
>> Please don't add a separate clangOMP.a; you're implementing new
>> parsing and semantic analysis, but it isn't conceptually separate from
>> the existing parsing/semantic analysis.
>>
>
> First, I would like to clarify that clangOMP.a implements only, *and only*
> the "class OmpPragmaHandler" and nothing else. Parsing and Semantic
> Analysis is as usual will be done by clangParse.a and clangSema.a
> components
> respectively.
>
> Second, the reason for adding a separate clangOMP.a. is as follows. I
> looked into the
> Clang code base, where few *pragmas* already being supported. I noticed
> that
> few pragmas like "\#pragma once" are implemented in "clangLex.a", and some
> other
> pragmas like "\#pragma align" are implemented in "clangParse.a". Also, I
> thought,
> OpenMP includes many pragma directives and clauses, so better to separate
> it out in
> clangOMP.a.
>
> However, your feedback is well considered. I will remove clangOMP.a and
> move the
> implementation of "class OmpPragmaHandler" to "clangLex.a".
>
>
>>
>> I'm not entirely sure what sort of feedback you're expecting; ignoring
>> the lowering, the part of implementing OpenMP that's likely to attract
>> discussion is the AST representation, and you haven't described that
>> in any detail.
>>
>
> As we mentioned in the previous mail, we are currently, deferred the
> design for
> *lowering* for the time being based on the outcome of the discussion
> happening
> in LLVM dev list on the topic of supporting OpenMP in LLVM.
>
> However, AST representation and implementation is completed for all OpenMP
> directives
> and clauses, except for "critical" directive statement.
>
> In the document, that we attached in our previous mail, we gave an idea of
> how the AST looks
> for an OpenMP directive statement as we did not want to bloat-up the
> proposal document
> with too many details. However, we are ready to share code base, which
> will give more
> information to provide comments.
>
> In summary, we have completed all the required *basic* infrastructure
> design and implementation
> to implement OpenMP in Clang. We would like to get feedback on it before
> proceeding for
> further support.
>
>
>
>> If you have patches that implement useful functionality; please submit
>> sooner rather than later.  Doing a bunch of work in a private branch
>> will mean more work for you in the long run because you won't get any
>> feedback.
>>
>
> We have all the functionality implemented to provide the basic
> infrastructure along with the
> implementation of AST classes to represent different OpenMP directives and
> clauses,
> and the implementation of the "class OmpPrgamaHandler" as described in the
> doc.
>
> We can share this code very soon, probably by tomorrow.
>
> --
> mahesha
>
>
>>
>> -Eli\
>>
>
>
>
> --
> mahesha
>
>


-- 
mahesha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121010/7ded735e/attachment.html>
-------------- next part --------------
===================================================
OpenMP Support in Clang:  A proposal implementation
===================================================

==========================
1. Implementation Details:
==========================


-. We extended the existing Clang classes like Parser, Sema,  etc in order to handle OpenMP
   in Clang.

-. We added a new class called "class OmpPragmaHandler" to Clang. The main job of 
   OmpPragmaHandler is to assist other Clang components like Parser, Sema, etc while 
   handling OpenMP constructs.

-. Tokens are introduced to represent only OpenMP pragma directives, and these tokens are 
   inserted by OmpPragmaHandler to token streams, upon seeing the OpenMP pragma directive
   statements. Lexer is completely not aware of these tokens. Additionally, OpenMP pragma 
   clause names are parsed based on the context with string comparison approach. This 
   strategy avoids conflicts with ?Identifier? tokens that would happen when we introduce 
   separate tokens for each and every OpenMP construct names.
 
-. As in the case of parsing any other C/C++ constructs, Parser starts parsing the OpenMP 
   directive statements when it encounters with OpenMP directive tokens, which are inserted 
   by OmpPragmaHandler. Once the parsing is done, Parser calls Semantic Analyzer to perform 
   semantic analysis, and to build AST tree which represents parsed OpenMP directive 
   statement. Finally, CodeGen component of Clang is called to lower OpenMP ASTs.

-. Clang Preprocessor is responsible for registering all the OpenMP pragma 
   directives, and further processing them when OpenMP pragma directives statements
   are encountered. Clang Parser is responsible for all syntax analysis and syntax
   errors checking and reporting (if any). Clang Semantic Analyzer is responsible 
   for all semantic analysis and semantic errors checking and reporting (if any). 
   All the ASTs classes are defined and implemented within Clang AST manager component 
   (clangAST.a) with all the additional supporting implementation for AST visiting, 
   AST writing, AST reading, etc. Finally, CodeGen component of Clang (clangCodeGen.a) 
   implements all the AST lowering routines.

-. During the initialization of Clang compiler proper before processing a 
   translation unit, a PragmaOmpHandler object is constructed before both Parser 
   and Sema objects are constructed. Upon creation of PragmaOmpHandler, it is made 
   to initialize all its members, and asked to call Preprocessor to get register all 
   the OpenMP pragma directive?s names. Later, both Parser and Sema objects are made to 
   reference PragmaOmpHandler object when they are constructed.
  
-. During the parsing of a translation unit, Clang Lexer, upon lexing the token ?#?, 
   calls Preprocessor to handle possibly encountered pragma statement. Clang Preprocessor, 
   after realizing that the encountered pragma is an OpenMP pragma statement, it calls 
   PragmaOmpHandler to handle it. The PragmaOmpHandler, upon called to handle OpenMP pragma 
   statement, does one of the following two tasks depending on whether the ?-fopenmp? 
   option is enabled or not.

    #. When the ?-fopenmp? option is enabled, it inserts a token which represents the 
       encountered OpenMP pragma statement into token stream so that parser can recognize 
       it and can parse the respective OpenMP pragma directive statement. Parser will later
       take care of parsing the encountered OpenMP pragma directive statement.

    #. When the ?-fopenmp? option is not enabled, it simply eats-up (ignores) the OpenMP 
       pragma directive statement line, so that, Parser can proceed with the sequential 
       compilation as usual. However, in this case, a warning message is emitted saying 
       that the current OpenMP directive statement will be ignored. Note that Clang emits 
       only one warning message per translation unit irrespective of the number of OpenMP 
       constructs encountered within the translation unit being parsed. This avoids message 
       bloating on the output device.

-. OpenMP ASTs are implemented as below:

    #. A separate AST is introduced for every OpenMP directive and clause.  More than *thirty* 
       AST classes are introduced for OpenMP.

    #. All the AST classes which represent OpenMP directives or clauses publicly derive from 
       the statement AST base class namely ?class Stmt?.

    #. There will be a separate AST class implementation for each OpenMP directive and clause.

    #. There will be an additional AST class node implementation, called ?class OmpClause?. 
       OmpClause AST node holds other AST clause nodes as its children. However, note that the 
       same clauses which appear more than once in an OpenMP directive statement are represented 
       as a linked list. This representation makes tree traversal easier for few particular 
       semantic checks.

    #. Variables in the list clauses like ?private? clause are represented as ?DeclRefExpr? node. 

    #. ASTs are designed and implemented in such a way that *no* OpenMP information is lost 
       including source location information.

-. Skeleton routines (with few partially implemented) for parsing, semantic analysis are 
   introduced.

-. The option ?-fopenmp? is implemented. Clang driver now understands the above option, and pass 
   it onto the Clang compiler proper.



===========================
1. Source File Information:
===========================


-. The option ?-fopenmp? support

    #. clang/include/clang/Driver/Options.td
    #. clang/include/clang/Basic/LangOptions.def
    #. clang/include/clang/Basic/DiagnosticLexKinds.td
    #. clang/lib/Driver/Tools.cpp
    #. clang/lib/Frontend/CompilerInvocation.cpp


-. class OmpPragmaHandler implementation
  
    #. clang/include/clang/Lex/PragmaOmpHandler.h  -----> newly added
    #. clang/lib/Lex/PragmaOmpHandler.cpp  -----> newly added


-. OmpPragmaHandler 'object' creation
    
    #. clang/include/clang/Frontend/CompilerInstance.h
    #. clang/include/clang/Frontend/ASTUnit.h
    #. clang/include/clang/Parse/ParseAST.h
    #. clang/lib/Frontend/ChainedIncludesSource.cpp
    #. clang/lib/Frontend/FrontendAction.cpp
    #. clang/lib/Frontend/ASTUnit.cpp
    #. clang/lib/Frontend/CompilerInstance.cpp
    #. clang/lib/Parse/ParseAST.cpp
    #. clang/lib/Sema/Sema.cpp
    #. clang/lib/Parse/Parser.cpp
    

-. OpenMP tokens
  
    #. clang/include/clang/Basic/TokenKinds.def


-. OpenMP parsing

    #. clang/include/clang/Parse/Parser.h
    #. clang/lib/Parse/ParseStmtOpenMP.cpp  ------> newly added
    #. clang/lib/Parse/ParseStmt.cpp


-. OpenMP semantic analyis

    #. clang/include/clang/Sema/Sema.h
    #. clang/lib/Sema/SemaStmtOpenMP.cpp  -----> newly added


-. OpenMP AST implementation

    #. clang/include/clang/AST/StmtOpenMP.h  -----> newly added 
    #  clang/include/clang/AST/Stmt.h  
    #. clang/include/clang/Basic/StmtNodes.td
    #. clang/include/clang/AST/RecursiveASTVisitor.h
    #. clang/include/clang/AST/StmtVisitor.h
    #. clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
    #. clang/lib/Serialization/ASTReaderStmt.cpp
    #. clang/lib/Serialization/ASTWriterStmt.cpp
    #. clang/lib/Sema/TreeTransform.h
    #. clang/lib/CodeGen/CGStmt.cpp
    #. clang/lib/AST/StmtOpenMP.cpp  ------> newly added
    #. clang/lib/AST/StmtProfile.cpp
    #. clang/lib/AST/StmtPrinter.cpp
    #. clang/lib/AST/Stmt.cpp
    #. clang/tools/libclang/RecursiveASTVisitor.h
    #. clang/tools/libclang/CXCursor.cpp


-. Makefile changes

    #. clang/lib/AST/CMakeLists.txt
    #. clang/lib/Sema/CMakeLists.txt
    #. clang/lib/Parse/CMakeLists.txt
    #. clang/lib/Lex/CMakeLists.txt


================================
1. New Source File Information:
================================

-.  PragmaOmpHandler.h and PragmaOmpHandler.cpp:  Implements OmpPragmahandler class
-.  ParseStmtOpenMP.cpp: Implements all the OpenMP parsing routines
-.  SemaStmtOpenMP.cpp: Implements all the OpenMP semantics routines
-.  StmtOpenMP.h and StmtOpenMP.cpp: Implements all OpenMP AST classes
    
  
	
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenMP_support_in_Clang.tar.gz
Type: application/x-gzip
Size: 35089 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121010/7ded735e/attachment.bin>


More information about the llvm-dev mailing list