mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 09:23:52 -05:00
* Fix #3275 : move from compiler-opt-info to compiler-opt-info2 * Add OfekShilon to contributors * Migrate llvm opt-info processing from a lib inside CE * Add MIT license text to new file
This commit is contained in:
@@ -117,3 +117,4 @@ From oldest to newest contributor, we would like to thank:
|
||||
- [m8mble](https://github.com/m8mble)
|
||||
- [Anders-T](https://github.com/anders-torbjornsen)
|
||||
- [Adam Sandberg Eriksson](https://github.com/adamse)
|
||||
- [Ofek Shilon](https://github.com/ofekshilon)
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import * as compilerOptInfo from 'compiler-opt-info';
|
||||
import fs from 'fs-extra';
|
||||
import temp from 'temp';
|
||||
import _ from 'underscore';
|
||||
@@ -41,6 +40,7 @@ import {InstructionSets} from './instructionsets';
|
||||
import {languages} from './languages';
|
||||
import {LlvmAstParser} from './llvm-ast';
|
||||
import {LlvmIrParser} from './llvm-ir';
|
||||
import * as compilerOptInfo from './llvm-opt-transformer';
|
||||
import {logger} from './logger';
|
||||
import {getObjdumperTypeByKey} from './objdumper';
|
||||
import {Packager} from './packager';
|
||||
|
||||
103
lib/llvm-opt-transformer.ts
Normal file
103
lib/llvm-opt-transformer.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2017 Jared Wyles, fixes by Aviv Polak and Ofek Shilon
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
import {Transform, TransformCallback} from 'stream';
|
||||
|
||||
import * as R from 'ramda';
|
||||
import * as YAML from 'yamljs';
|
||||
|
||||
type Path = string;
|
||||
type OptType = 'Missed' | 'Passed' | 'Analysis';
|
||||
|
||||
interface OptInfo {
|
||||
optType: OptType;
|
||||
displayString: string;
|
||||
}
|
||||
|
||||
interface LLVMOptInfo extends OptInfo {
|
||||
Pass: string;
|
||||
Name: string;
|
||||
DebugLoc: DebugLoc;
|
||||
Function: string;
|
||||
Args: Array<object>;
|
||||
}
|
||||
|
||||
interface DebugLoc {
|
||||
File: Path;
|
||||
Line: number;
|
||||
Column: number;
|
||||
}
|
||||
|
||||
function DisplayOptInfo(optInfo: LLVMOptInfo) {
|
||||
return optInfo.Args.reduce((acc, x) => {
|
||||
return (
|
||||
acc + R.pipe(R.partial(R.pickBy, [(v: any, k: string) => k !== 'DebugLoc']), R.toPairs, R.head, R.last)(x)
|
||||
);
|
||||
}, '');
|
||||
}
|
||||
|
||||
const optTypeMatcher = /---\s(.*)\r?\n/;
|
||||
const docStart = '---';
|
||||
const docEnd = '\n...';
|
||||
const IsDocumentStart = (x: string) => x.substring(0, 3) === docStart;
|
||||
const FindDocumentEnd = (x: string) => {
|
||||
const index = x.indexOf(docEnd);
|
||||
return {found: index > -1, endpos: index + docEnd.length};
|
||||
};
|
||||
|
||||
export class LLVMOptTransformer extends Transform {
|
||||
_buffer: string;
|
||||
constructor(options: object) {
|
||||
super(R.merge(options || {}, {objectMode: true}));
|
||||
this._buffer = '';
|
||||
}
|
||||
override _flush(done: TransformCallback) {
|
||||
this.processBuffer();
|
||||
done();
|
||||
}
|
||||
override _transform(chunk: any, encoding: string, done: TransformCallback) {
|
||||
this._buffer += chunk.toString();
|
||||
//buffer until we have a start and and end
|
||||
//if at any time i care about improving performance stash the offset
|
||||
this.processBuffer();
|
||||
done();
|
||||
}
|
||||
processBuffer() {
|
||||
while (IsDocumentStart(this._buffer)) {
|
||||
const {found, endpos} = FindDocumentEnd(this._buffer);
|
||||
if (found) {
|
||||
const [head, tail] = R.splitAt(endpos, this._buffer);
|
||||
const optTypeMatch = head.match(optTypeMatcher);
|
||||
const opt = YAML.parse(head);
|
||||
if (!optTypeMatch) {
|
||||
console.warn('missing optimization type');
|
||||
} else {
|
||||
opt.optType = optTypeMatch[1].replace('!', '');
|
||||
}
|
||||
opt.displayString = DisplayOptInfo(opt);
|
||||
this.push(opt as LLVMOptInfo);
|
||||
this._buffer = tail.replace(/^\n/, '');
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
23
package-lock.json
generated
23
package-lock.json
generated
@@ -18,7 +18,6 @@
|
||||
"bootstrap": "^4.6.1",
|
||||
"chart.js": "^3.6.2",
|
||||
"clipboard": "^2.0.8",
|
||||
"compiler-opt-info": "0.0.4",
|
||||
"compression": "^1.7.1",
|
||||
"copy-webpack-plugin": "^9.1.0",
|
||||
"cross-env": "^7.0.3",
|
||||
@@ -51,6 +50,7 @@
|
||||
"profanities": "^2.14.0",
|
||||
"prom-client": "^14.0.1",
|
||||
"pug": "^3.0.2",
|
||||
"ramda": "^0.23.0",
|
||||
"request": "^2.88.2",
|
||||
"response-time": "^2.3.2",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
@@ -74,7 +74,8 @@
|
||||
"winston-loki": "^6.0.3",
|
||||
"winston-papertrail": "^1.0.5",
|
||||
"winston-transport": "^4.4.1",
|
||||
"yaml": "^1.10.2"
|
||||
"yaml": "^1.10.2",
|
||||
"yamljs": "^0.2.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/preset-typescript": "^7.16.5",
|
||||
@@ -3879,15 +3880,6 @@
|
||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/compiler-opt-info": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/compiler-opt-info/-/compiler-opt-info-0.0.4.tgz",
|
||||
"integrity": "sha1-YgqkuBFqA6Q5PMties8Qe9sz4pQ=",
|
||||
"dependencies": {
|
||||
"ramda": "^0.23.0",
|
||||
"yamljs": "^0.2.9"
|
||||
}
|
||||
},
|
||||
"node_modules/component-emitter": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
||||
@@ -18200,15 +18192,6 @@
|
||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
|
||||
"dev": true
|
||||
},
|
||||
"compiler-opt-info": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/compiler-opt-info/-/compiler-opt-info-0.0.4.tgz",
|
||||
"integrity": "sha1-YgqkuBFqA6Q5PMties8Qe9sz4pQ=",
|
||||
"requires": {
|
||||
"ramda": "^0.23.0",
|
||||
"yamljs": "^0.2.9"
|
||||
}
|
||||
},
|
||||
"component-emitter": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
"bootstrap": "^4.6.1",
|
||||
"chart.js": "^3.6.2",
|
||||
"clipboard": "^2.0.8",
|
||||
"compiler-opt-info": "0.0.4",
|
||||
"compression": "^1.7.1",
|
||||
"copy-webpack-plugin": "^9.1.0",
|
||||
"cross-env": "^7.0.3",
|
||||
@@ -62,6 +61,7 @@
|
||||
"profanities": "^2.14.0",
|
||||
"prom-client": "^14.0.1",
|
||||
"pug": "^3.0.2",
|
||||
"ramda": "^0.23.0",
|
||||
"request": "^2.88.2",
|
||||
"response-time": "^2.3.2",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
@@ -85,7 +85,8 @@
|
||||
"winston-loki": "^6.0.3",
|
||||
"winston-papertrail": "^1.0.5",
|
||||
"winston-transport": "^4.4.1",
|
||||
"yaml": "^1.10.2"
|
||||
"yaml": "^1.10.2",
|
||||
"yamljs": "^0.2.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/preset-typescript": "^7.16.5",
|
||||
|
||||
Reference in New Issue
Block a user