diff options
| author | Adrian Prantl <aprantl@apple.com> | 2019-04-08 19:13:55 +0000 | 
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2019-04-08 19:13:55 +0000 | 
| commit | 6ed5706a2beab0bcde2a24e36751ea30cd5b4009 (patch) | |
| tree | 195ed1cd96bbf559da9b94807b61b4a6094fb258 /llvm/lib/AsmParser | |
| parent | 6cf7b715a0e5c8a6a5eab621fe490d5330d049fd (diff) | |
| download | bcm5719-llvm-6ed5706a2beab0bcde2a24e36751ea30cd5b4009.tar.gz bcm5719-llvm-6ed5706a2beab0bcde2a24e36751ea30cd5b4009.zip  | |
Add LLVM IR debug info support for Fortran COMMON blocks
    COMMON blocks are a feature of Fortran that has no direct analog in C languages, but they are similar to data sections in assembly language programming. A COMMON block is a named area of memory that holds a collection of variables. Fortran subprograms may map the COMMON block memory area to their own, possibly distinct, non-empty list of variables. A Fortran COMMON block might look like the following example.
    COMMON /ALPHA/ I, J
    For this construct, the compiler generates a new scope-like DI construct (!DICommonBlock) into which variables (see I, J above) can be placed. As the common block implies a range of storage with global lifetime, the !DICommonBlock refers to a !DIGlobalVariable. The Fortran variable that comprise the COMMON block are also linked via metadata to offsets within the global variable that stands for the entire common block.
    @alpha_ = common global %alphabytes_ zeroinitializer, align 64, !dbg !27, !dbg !30, !dbg !33
    !14 = distinct !DISubprogram(…)
    !20 = distinct !DICommonBlock(scope: !14, declaration: !25, name: "alpha")
    !25 = distinct !DIGlobalVariable(scope: !20, name: "common alpha", type: !24)
    !27 = !DIGlobalVariableExpression(var: !25, expr: !DIExpression())
    !29 = distinct !DIGlobalVariable(scope: !20, name: "i", file: !3, type: !28)
    !30 = !DIGlobalVariableExpression(var: !29, expr: !DIExpression())
    !31 = distinct !DIGlobalVariable(scope: !20, name: "j", file: !3, type: !28)
    !32 = !DIExpression(DW_OP_plus_uconst, 4)
    !33 = !DIGlobalVariableExpression(var: !31, expr: !32)
    The DWARF generated for this is as follows.
    DW_TAG_common_block:
    DW_AT_name: alpha
    DW_AT_location: @alpha_+0
    DW_TAG_variable:
    DW_AT_name: common alpha
    DW_AT_type: array of 8 bytes
    DW_AT_location: @alpha_+0
    DW_TAG_variable:
    DW_AT_name: i
    DW_AT_type: integer*4
    DW_AT_location: @Alpha+0
    DW_TAG_variable:
    DW_AT_name: j
    DW_AT_type: integer*4
    DW_AT_location: @Alpha+4
Patch by Eric Schweitz!
Differential Revision: https://reviews.llvm.org/D54327
llvm-svn: 357934
Diffstat (limited to 'llvm/lib/AsmParser')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 1ab2702941d..f14ef36afb0 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -4664,6 +4664,24 @@ bool LLParser::ParseDILexicalBlockFile(MDNode *&Result, bool IsDistinct) {    return false;  } +/// ParseDICommonBlock: +///   ::= !DICommonBlock(scope: !0, file: !2, name: "COMMON name", line: 9) +bool LLParser::ParseDICommonBlock(MDNode *&Result, bool IsDistinct) { +#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \ +  REQUIRED(scope, MDField, );                                                  \ +  OPTIONAL(declaration, MDField, );                                            \ +  OPTIONAL(name, MDStringField, );                                             \ +  OPTIONAL(file, MDField, );                                                   \ +  OPTIONAL(line, LineField, );						        +  PARSE_MD_FIELDS(); +#undef VISIT_MD_FIELDS + +  Result = GET_OR_DISTINCT(DICommonBlock, +                           (Context, scope.Val, declaration.Val, name.Val, +                            file.Val, line.Val)); +  return false; +} +  /// ParseDINamespace:  ///   ::= !DINamespace(scope: !0, file: !2, name: "SomeNamespace", line: 9)  bool LLParser::ParseDINamespace(MDNode *&Result, bool IsDistinct) {  | 

