Index: llvm/tools/opt-viewer/CMakeLists.txt =================================================================== --- llvm/tools/opt-viewer/CMakeLists.txt +++ llvm/tools/opt-viewer/CMakeLists.txt @@ -4,7 +4,11 @@ "opt-viewer.py" "optpmap.py" "optrecord.py" - "style.css") + "style.css" + "requirements.txt" + "cpp_optimization_example/main.cc" + "cpp_optimization_example/Makefile" + "cpp_optimization_example/run_optview.sh") foreach (file ${files}) install(PROGRAMS ${file} Index: llvm/tools/opt-viewer/cpp_optimization_example/.gitignore =================================================================== --- /dev/null +++ llvm/tools/opt-viewer/cpp_optimization_example/.gitignore @@ -0,0 +1,6 @@ +example +*.o +yaml_optimization_remarks +.depend +.vscode +html_output Index: llvm/tools/opt-viewer/cpp_optimization_example/Makefile =================================================================== --- /dev/null +++ llvm/tools/opt-viewer/cpp_optimization_example/Makefile @@ -0,0 +1,43 @@ +CC=clang++ +CXX=clang++ +RM=rm -f +MKDIR_P=mkdir -p +OBJS_DIR=objs +DEPENDS_FILE=${OBJS_DIR}/.depend +YAML_OUTPUT_DIR=yaml_optimization_remarks +OPTIMIZATION_RECORD_FLAGS=-fsave-optimization-record -foptimization-record-file=./${YAML_OUTPUT_DIR}/$(patsubst %.o,%.opt.yaml,$(notdir $@)) +CPPFLAGS=-O3 -std=c++17 +LDFLAGS= +LDLIBS= +BINARY_NAME=example + +SRCS=$(wildcard *.cpp) +OBJS=$(addprefix $(OBJS_DIR)/,$(subst .cpp,.o,$(SRCS))) + +.PHONY: output_folder + +all: output_folder ${BINARY_NAME} + +directories: ${YAML_OUTPUT_DIR} ${OBJS_DIR} + +${YAML_OUTPUT_DIR} ${OBJS_DIR}: + ${MKDIR_P} $@ + +${BINARY_NAME}: $(OBJS) + $(CXX) $(LDFLAGS) -o $(BINARY_NAME) $(OBJS) $(LDLIBS) + +${OBJS_DIR}/%.o : %.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $(OPTIMIZATION_RECORD_FLAGS) $< -o $@ + +depend: $(DEPENDS_FILE) + +$(DEPENDS_FILE): $(SRCS) + $(RM) $(DEPENDS_FILE) + $(MKDIR_P) ${YAML_OUTPUT_DIR} ${OBJS_DIR} + $(CXX) $(CPPFLAGS) -MM $^ >> $(DEPENDS_FILE) + +include $(DEPENDS_FILE) + +clean: + $(RM) -r ${YAML_OUTPUT_DIR} ${OBJS_DIR} + Index: llvm/tools/opt-viewer/cpp_optimization_example/main.cpp =================================================================== --- /dev/null +++ llvm/tools/opt-viewer/cpp_optimization_example/main.cpp @@ -0,0 +1,32 @@ +//===-- main.cpp ------------------------------------------------*- C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// +// +// Source for a toy cpp project, demonstrating opt-viewer usage. +// +//===---------------------------------------------------------------------===// + +#include +#include + +// Based on Roi Barkan - "Argument passing, core guidelines and concepts" - +// https://www.youtube.com/watch?v=uylFACqcWYI +void scale_down(std::vector &v, const double &a) { + for (auto &item : v) { + item /= a; + } +} + +void scale_down_example() { + std::vector v{2, 1, 2, 3, 4}; + scale_down(v, v[0]); +} + +int main() { + scale_down_example(); + return 0; +} Index: llvm/tools/opt-viewer/cpp_optimization_example/run_optview.sh =================================================================== --- /dev/null +++ llvm/tools/opt-viewer/cpp_optimization_example/run_optview.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")" || exit 1 + +echo "Running make..." +make + +echo "Running opt-viewer..." +../opt-viewer.py --open-browser --output-dir ./html_output --source-dir ./ ./yaml_optimization_remarks