Fix #3275 : move from compiler-opt-info to compiler-opt-info2 (#3615)

* 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:
Ofek
2022-05-04 19:16:34 +03:00
committed by GitHub
parent 9b1ecf67ba
commit 29b6e4a462
5 changed files with 111 additions and 23 deletions

View File

@@ -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)

View File

@@ -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
View 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
View File

@@ -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",

View File

@@ -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",