[clang-tools-extra] [llvm] [clang-tools-extra] Add clang-omp-pr-desc wrapper for OpenMP PR summarization (PR #144935)

2025-06-19 Thread Aviral Singh via cfe-commits

https://github.com/aviralsingh2004 created 
https://github.com/llvm/llvm-project/pull/144935

This patch introduces a new Clang-compatible wrapper tool `clang-omp-pr-desc`, 
which forwards arguments to `omp-pr-summary describe`. This tool simplifies 
generation of structured OpenMP pull request summaries.

It is intended to be used as part of Clang tooling for OpenMP-related 
development workflows.

Usage:
  clang-omp-pr-desc  [--spec-path ]
![output2](https://github.com/user-attachments/assets/91f18357-bf50-421a-a677-8d65dc6bc48d)
![output1](https://github.com/user-attachments/assets/398fafca-657b-45e1-ab19-b342da3fb7b3)


>From 5ea5be4751e2c8a0650f91205983cb1891d5888e Mon Sep 17 00:00:00 2001
From: Aviral Singh 
Date: Thu, 19 Jun 2025 23:25:04 +0530
Subject: [PATCH] [clang-tools-extra] Add clang-omp-pr-desc wrapper for OpenMP
 PR summarization

---
 CLI_CLANG_TOOL3.py| 153 ++
 .../clang-omp-pr-desc/CMakeLists.txt  |   3 +
 .../clang-omp-pr-desc/ClangOMPPRDesc.cpp  |  21 +++
 setup.py  |  21 +++
 4 files changed, 198 insertions(+)
 create mode 100644 CLI_CLANG_TOOL3.py
 create mode 100644 clang-tools-extra/clang-omp-pr-desc/CMakeLists.txt
 create mode 100644 clang-tools-extra/clang-omp-pr-desc/ClangOMPPRDesc.cpp
 create mode 100644 setup.py

diff --git a/CLI_CLANG_TOOL3.py b/CLI_CLANG_TOOL3.py
new file mode 100644
index 0..1e3833f9fdf2c
--- /dev/null
+++ b/CLI_CLANG_TOOL3.py
@@ -0,0 +1,153 @@
+# CLI_CLANG_TOOL2.py
+
+import typer
+import requests
+import os
+import torch
+import numpy as np
+from sentence_transformers import SentenceTransformer
+import faiss
+from pathlib import Path
+from typing import List
+
+app = typer.Typer()
+
+# -- CONFIG --
+GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") 
+GROQ_API_KEY = os.getenv("GROQ_API_KEY") 
+HEADERS = {"Authorization": f"token {GITHUB_TOKEN}"}
+REPO = "llvm/llvm-project"
+MODEL = SentenceTransformer("all-MiniLM-L6-v2")
+
+# -- UTILS --
+def fetch_pr_diff(pr_number: int) -> str:
+url = f"https://api.github.com/repos/{REPO}/pulls/{pr_number}";
+diff_url = requests.get(url, headers=HEADERS).json().get("diff_url")
+diff = requests.get(diff_url, headers=HEADERS).text
+return diff
+
+def fetch_pr_title(pr_number: int) -> str:
+url = f"https://api.github.com/repos/{REPO}/pulls/{pr_number}";
+return requests.get(url, headers=HEADERS).json().get("title", "")
+
+def load_spec_sections(path: str) -> List[str]:
+return Path(path).read_text(encoding="utf-8").split("\n\n")
+
+def index_spec(sections: List[str]):
+embeddings = MODEL.encode(sections)
+index = faiss.IndexFlatL2(embeddings.shape[1])
+index.add(np.array(embeddings))
+return index, embeddings, sections
+
+def retrieve_spec(query: str, index, sections, embeddings, k=3):
+q_emb = MODEL.encode([query])
+D, I = index.search(np.array(q_emb), k)
+return [sections[i] for i in I[0]]
+
+def extract_openmp_pragmas_from_diff(diff: str) -> List[str]:
+return [line.strip() for line in diff.splitlines() if "#pragma omp" in 
line]
+
+def build_prompt(diff: str, spec_snippets: List[str], pragmas: List[str] = []):
+prompt = f"""
+You are an assistant summarizing OpenMP Pull Requests. Given the code diff and 
relevant sections of the OpenMP specification, write a structured summary for 
the PR.
+
+## Diff:
+{diff}
+
+## Relevant Spec Sections:
+{''.join(spec_snippets)}
+
+## OpenMP Directives Detected:
+{''.join(pragmas)}
+
+## Summary:
+"""
+return prompt
+
+def generate_summary(prompt):
+response = requests.post(
+"https://api.groq.com/openai/v1/chat/completions";,
+headers={
+"Authorization": f"Bearer {GROQ_API_KEY}",
+"Content-Type": "application/json"
+},
+json={
+"model": "llama3-70b-8192",
+"messages": [
+{"role": "system", "content": "You are a helpful assistant for 
code reviewers."},
+{"role": "user", "content": prompt},
+]
+}
+)
+response.raise_for_status()
+return response.json()['choices'][0]['message']['content'].strip()
+
+SECTION_LINKS = {
+"parallel": "https://www.openmp.org/spec-html/6.0/openmpsu35.html";,
+"worksharing": "https://www.openmp.org/spec-html/6.0/openmpsu46.html";,
+}
+
+def build_markdown_output(summary_text: str, spec_snippets: List[str]) -> str:
+linked_snippets = []
+for snippet in spec_snippets:
+for title, url in SECTION_LINKS.items():
+if title.lower() in snippet.lower():
+snippet += f"\n\nšŸ”— [Spec Link]({url})"
+break
+linked_snippets.append(snippet)
+
+return f"""## šŸ“ Pull Request Summary
+
+{summary_text}
+
+---
+
+## šŸ“š Related OpenMP Spec Sections
+{''.join(f"```text\n{snippet}\n```\n\n" for snippet in linked_snippets)}"""
+
+# -

[clang-tools-extra] [llvm] [clang-tools-extra] Add clang-omp-pr-desc wrapper for OpenMP PR summarization (PR #144935)

2025-06-19 Thread Aviral Singh via cfe-commits

https://github.com/aviralsingh2004 reopened 
https://github.com/llvm/llvm-project/pull/144935
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [llvm] [clang-tools-extra] Add clang-omp-pr-desc wrapper for OpenMP PR summarization (PR #144935)

2025-06-19 Thread Aviral Singh via cfe-commits

https://github.com/aviralsingh2004 closed 
https://github.com/llvm/llvm-project/pull/144935
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits