diff options
author | Matt Godbolt <matt@godbolt.org> | 2022-09-20 07:42:41 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-20 07:42:41 -0500 |
commit | a8a666aeacde683a8ef1e027f26a5cdd08bade8f (patch) | |
tree | 73c7039fd4aa4c0a0060aaec31eb315e3626f2a4 /lib/parsers/asm-parser-cpp.ts | |
parent | 377c907af44348fd6859f2def84a4971ccc1e2c2 (diff) | |
download | compiler-explorer-a8a666aeacde683a8ef1e027f26a5cdd08bade8f.tar.gz compiler-explorer-a8a666aeacde683a8ef1e027f26a5cdd08bade8f.zip |
Fixes for cppfront (#4076)gh-4280
* Rename cppx_cppfront to cpp2_cppfront
* Add some blurb about the compiler
* Some syntax highlighting
* Better output highlighting
* Some form of line tracking and filtering
Diffstat (limited to 'lib/parsers/asm-parser-cpp.ts')
-rw-r--r-- | lib/parsers/asm-parser-cpp.ts | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/parsers/asm-parser-cpp.ts b/lib/parsers/asm-parser-cpp.ts new file mode 100644 index 000000000..dc28a8c27 --- /dev/null +++ b/lib/parsers/asm-parser-cpp.ts @@ -0,0 +1,77 @@ +// Copyright (c) 2022, Compiler Explorer Authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import {ParseFilters} from '../../types/features/filters.interfaces'; +import * as utils from '../utils'; + +import {IAsmParser} from './asm-parser.interfaces'; + +type InlineLabel = {name: string; range: {startCol: number; endCol: number}}; +type Source = {file: string | null; line: number}; + +const lineRe = /^\s*#line\s+(?<line>\d+)\s+"(?<file>[^"]+)"/; + +export class AsmParserCpp implements IAsmParser { + process(asmResult: string, filters: ParseFilters) { + const startTime = process.hrtime.bigint(); + + const asm: { + text: string; + source: Source | null; + labels: InlineLabel[]; + }[] = []; + + let source: Source | null = null; + for (const line of utils.splitLines(asmResult)) { + let advance = true; + const match = line.match(lineRe); + if (match && match.groups) { + // TODO perhaps we'll need to check the file here at some point in the future. + // TODO I've temporarily disabled this as the result is visually too noisy + // was: source = {file: null, line: parseInt(match.groups.line)}; + source = {file: match.groups.file, line: parseInt(match.groups.line)}; + if (filters.directives) { + continue; + } + advance = false; + } + asm.push({ + text: line, + source: source, + labels: [], + }); + if (source && advance) { + source = {...source, line: source.line + 1}; + } + } + + const endTime = process.hrtime.bigint(); + return { + asm: asm, + labelDefinitions: [], + parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + filteredCount: 0, + }; + } +} |