Skip to content

Commit 80c4577

Browse files
authored
Fix memory bug (#293)
* Fix memory bug * Add SmallString
1 parent 7f0476c commit 80c4577

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

tools/cgeist/ArgumentList.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,23 @@
1010
#define MLIR_TOOLS_CGEIST_ARGUMENTLIST_H
1111

1212
#include <llvm/ADT/ArrayRef.h>
13+
#include <llvm/ADT/SmallString.h>
1314
#include <llvm/Support/raw_ostream.h>
1415

1516
namespace mlirclang {
1617
/// Class to pass options to a compilation tool.
1718
class ArgumentList {
19+
private:
20+
/// Helper storage.
21+
llvm::SmallVector<llvm::SmallString<0>> Storage;
22+
/// List of arguments
23+
llvm::SmallVector<const char *> Args;
24+
1825
public:
1926
/// Add argument.
2027
///
2128
/// The element stored will not be owned by this.
22-
void push_back(llvm::StringRef Arg) { Args.push_back(Arg.data()); }
29+
void push_back(const char *Arg) { Args.push_back(Arg); }
2330

2431
/// Add argument and ensure it will be valid before this passer's destruction.
2532
///
@@ -29,21 +36,18 @@ class ArgumentList {
2936
std::string Buffer;
3037
llvm::raw_string_ostream Stream(Buffer);
3138
(Stream << ... << Args);
32-
Storage.push_back(Stream.str());
33-
push_back(Storage.back());
39+
emplace_back(llvm::StringRef(Stream.str()));
40+
}
41+
42+
void emplace_back(llvm::StringRef &&Arg) {
43+
push_back(Storage.emplace_back(Arg).c_str());
3444
}
3545

3646
/// Return the underling argument list.
3747
///
3848
/// The return value of this operation could be invalidated by subsequent
3949
/// calls to push_back() or emplace_back().
4050
llvm::ArrayRef<const char *> getArguments() const { return Args; }
41-
42-
private:
43-
/// Helper storage.
44-
llvm::SmallVector<std::string> Storage;
45-
/// List of arguments
46-
llvm::SmallVector<const char *> Args;
4751
};
4852
} // end namespace mlirclang
4953

tools/cgeist/Lib/clang-mlir.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5514,13 +5514,13 @@ static bool parseMLIR(const char *Argv0, std::vector<std::string> filenames,
55145514
mlirclang::ArgumentList Argv;
55155515
Argv.push_back(binary);
55165516
for (const auto &filename : filenames) {
5517-
Argv.push_back(filename);
5517+
Argv.emplace_back(filename);
55185518
}
55195519
if (FOpenMP)
55205520
Argv.push_back("-fopenmp");
55215521
if (TargetTripleOpt != "") {
55225522
Argv.push_back("-target");
5523-
Argv.push_back(TargetTripleOpt);
5523+
Argv.emplace_back(TargetTripleOpt);
55245524
}
55255525
if (McpuOpt != "") {
55265526
Argv.emplace_back("-mcpu=", McpuOpt);
@@ -5530,11 +5530,11 @@ static bool parseMLIR(const char *Argv0, std::vector<std::string> filenames,
55305530
}
55315531
if (ResourceDir != "") {
55325532
Argv.push_back("-resource-dir");
5533-
Argv.push_back(ResourceDir);
5533+
Argv.emplace_back(ResourceDir);
55345534
}
55355535
if (SysRoot != "") {
55365536
Argv.push_back("--sysroot");
5537-
Argv.push_back(SysRoot);
5537+
Argv.emplace_back(SysRoot);
55385538
}
55395539
if (Verbose) {
55405540
Argv.push_back("-v");
@@ -5556,14 +5556,14 @@ static bool parseMLIR(const char *Argv0, std::vector<std::string> filenames,
55565556
}
55575557
for (const auto &dir : includeDirs) {
55585558
Argv.push_back("-I");
5559-
Argv.push_back(dir);
5559+
Argv.emplace_back(dir);
55605560
}
55615561
for (const auto &define : defines) {
55625562
Argv.emplace_back("-D", define);
55635563
}
55645564
for (const auto &Include : Includes) {
55655565
Argv.push_back("-include");
5566-
Argv.push_back(Include);
5566+
Argv.emplace_back(Include);
55675567
}
55685568

55695569
Argv.push_back("-emit-ast");
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: cgeist -DOUTPUT -DTEST -c %s -S | FileCheck %s
2+
3+
int main(int argc, char **argv)
4+
{
5+
#ifdef OUTPUT
6+
return 1;
7+
#else
8+
return 2;
9+
#endif
10+
}
11+
12+
// CHECK: func.func @main(%arg0: i32, %arg1: memref<?xmemref<?xi8>>) -> i32
13+
// CHECK-NEXT: %c1_i32 = arith.constant 1 : i32
14+
// CHECK-NEXT: return %c1_i32 : i32
15+
// CHECK-NEXT: }

tools/cgeist/driver.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ int emitBinary(char *Argv0, const char *filename,
274274
Argv.push_back("-fopenmp");
275275
if (ResourceDir != "") {
276276
Argv.push_back("-resource-dir");
277-
Argv.push_back(ResourceDir);
277+
Argv.emplace_back(ResourceDir);
278278
}
279279
if (Verbose) {
280280
Argv.push_back("-v");
@@ -299,7 +299,7 @@ int emitBinary(char *Argv0, const char *filename,
299299
}
300300
if (Output != "") {
301301
Argv.push_back("-o");
302-
Argv.push_back(Output);
302+
Argv.emplace_back(Output);
303303
}
304304
for (const auto *arg : LinkArgs)
305305
Argv.push_back(arg);

0 commit comments

Comments
 (0)